spice-space-commit Mailing List for Spice Space (Page 5)
Brought to you by:
ykamay
You can subscribe to this list here.
2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(25) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2010 |
Jan
(81) |
Feb
(6) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Yaniv K. <yk...@re...> - 2009-12-28 10:35:01
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: master commit ff2e0dbdb7fd2cc93588f83bfc531c4834ef5cff Author: Yaniv Kamay <yk...@re...> Date: Mon Dec 28 00:07:23 2009 +0200 use spaces instead of tabs in bitmap_to_c and icon_to_c output diff --git a/tools/bitmap_to_c.c b/tools/bitmap_to_c.c index 3329d5e..e9cd4db 100644 --- a/tools/bitmap_to_c.c +++ b/tools/bitmap_to_c.c @@ -30,6 +30,8 @@ #define TRUE 1 #define FALSE 0 +#define TAB " " + #define ERROR(str) printf("%s: error: %s\n", prog_name, str); exit(-1); static char *prog_name = NULL; @@ -185,8 +187,8 @@ static void do_dump_with_alpha_conversion(const Pixmap *pixmap, FILE *f) for (i = 0; i < pixmap->height; i++) { uint8_t *now = line; for (j = 0; j < pixmap->width; j++, now += 4) { - if ((line_size++ % 6) == 0) { - fprintf(f, "\n\t\t"); + if ((line_size++ % 4) == 0) { + fprintf(f, "\n" TAB); } double alpha = (double)now[3] / 0xff; put_char(f, alpha * now[0]); @@ -207,8 +209,8 @@ static void do_dump_32bpp(const Pixmap *pixmap, FILE *f) for (i = 0; i < pixmap->height; i++) { uint8_t *now = line; for (j = 0; j < pixmap->width; j++, now += 4) { - if ((line_size++ % 6) == 0) { - fprintf(f, "\n\t\t"); + if ((line_size++ % 4) == 0) { + fprintf(f, "\n" TAB); } put_char(f, now[0]); put_char(f, now[1]); @@ -228,8 +230,8 @@ static void do_dump_24bpp(const Pixmap *pixmap, FILE *f) for (i = 0; i < pixmap->height; i++) { uint8_t *now = line; for (j = 0; j < pixmap->width; j++, now += 3) { - if ((line_size++ % 6) == 0) { - fprintf(f, "\n\t\t"); + if ((line_size++ % 4) == 0) { + fprintf(f, "\n" TAB); } put_char(f, now[0]); put_char(f, now[1]); @@ -259,9 +261,9 @@ static int pixmap_to_c_struct(const Pixmap *pixmap, const char *dest_file, const uint32_t data_size = pixmap->width * sizeof(uint32_t) * pixmap->height; fprintf(f, "static const struct {\n" - "\tuint32_t width;\n" - "\tuint32_t height;\n" - "\tuint8_t pixel_data[%u];\n" + TAB "uint32_t width;\n" + TAB "uint32_t height;\n" + TAB "uint8_t pixel_data[%u];\n" "} %s = { %u, %u, {", data_size, image_name, pixmap->width, pixmap->height); diff --git a/tools/icon_to_c.c b/tools/icon_to_c.c index 79ae5fa..0d37ca9 100644 --- a/tools/icon_to_c.c +++ b/tools/icon_to_c.c @@ -29,6 +29,8 @@ #define TRUE 1 #define FALSE 0 +#define TAB " " + #define ERROR(str) printf("%s: error: %s\n", prog_name, str); exit(-1); static char *prog_name = NULL; @@ -213,10 +215,10 @@ static int icon_to_c_struct(const Icon *icon, const char *dest_file, const char uint32_t mask_stride = ALIGN(icon->width, 8) / 8; uint32_t mask_size = mask_stride * icon->height; fprintf(f, "static const struct {\n" - "\tuint32_t width;\n" - "\tuint32_t height;\n" - "\tuint8_t pixmap[%u];\n" - "\tuint8_t mask[%u];\n" + TAB "uint32_t width;\n" + TAB "uint32_t height;\n" + TAB "uint8_t pixmap[%u];\n" + TAB "uint8_t mask[%u];\n" "} %s = { %u, %u, {", pixmap_size, mask_size, image_name, icon->width, icon->height); @@ -226,8 +228,8 @@ static int icon_to_c_struct(const Icon *icon, const char *dest_file, const char for (i = 0; i < icon->height; i++) { uint8_t *now = line; for (j = 0; j < icon->width; j++, now += 4) { - if ((line_size++ % 6) == 0) { - fprintf(f, "\n\t\t"); + if ((line_size++ % 4) == 0) { + fprintf(f, "\n" TAB); } put_char(f, now[0]); put_char(f, now[1]); @@ -239,14 +241,14 @@ static int icon_to_c_struct(const Icon *icon, const char *dest_file, const char fseek(f, -1, SEEK_CUR); - fprintf(f, "},\n\n\t\t{"); + fprintf(f, "},\n\n" TAB TAB "{"); line = (uint8_t *)(icon->mask + ((icon->height - 1) * mask_stride)); line_size = 0; for (i = 0; i < icon->height; i++) { for (j = 0; j < mask_stride; j++) { if (line_size && (line_size % 12) == 0) { - fprintf(f, "\n\t\t "); + fprintf(f, "\n" TAB); } line_size++; put_char(f, line[j]); |
From: Yaniv K. <yk...@re...> - 2009-12-23 22:45:35
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: master commit 321d375b5e5078bd297215963f923f54306d736e Author: Yaniv Kamay <yk...@re...> Date: Thu Dec 24 00:45:20 2009 +0200 win client: change avcodec version to 51 diff --git a/client/windows/redc.vcproj b/client/windows/redc.vcproj index 4ea807d..302d391 100644 --- a/client/windows/redc.vcproj +++ b/client/windows/redc.vcproj @@ -64,7 +64,7 @@ /> <Tool Name="VCLinkerTool" - AdditionalDependencies="log4cppD.lib libqcairo-2.dll.lib libeay32MTd.lib ssleay32MTd.lib ws2_32.lib msimg32.lib winmm.lib avcodec-52.lib avutil-49.lib libcelt_0_5_1D.lib pthreadsD.lib version.lib" + AdditionalDependencies="log4cppD.lib libqcairo-2.dll.lib libeay32MTd.lib ssleay32MTd.lib ws2_32.lib msimg32.lib winmm.lib avcodec-51.lib avutil-49.lib libcelt_0_5_1D.lib pthreadsD.lib version.lib" OutputFile="$(OutDir)\spicec.exe" LinkIncremental="2" AdditionalLibraryDirectories=""$(SPICE_LIBS)\lib"" @@ -144,7 +144,7 @@ /> <Tool Name="VCLinkerTool" - AdditionalDependencies="log4cpp.lib libqcairo-2.dll.lib libeay32MT.lib ssleay32MT.lib ws2_32.lib msimg32.lib winmm.lib avcodec-52.lib avutil-49.lib libcelt_0_5_1.lib pthreads.lib version.lib" + AdditionalDependencies="log4cpp.lib libqcairo-2.dll.lib libeay32MT.lib ssleay32MT.lib ws2_32.lib msimg32.lib winmm.lib avcodec-51.lib avutil-49.lib libcelt_0_5_1.lib pthreads.lib version.lib" OutputFile="$(OutDir)\spicec.exe" LinkIncremental="1" AdditionalLibraryDirectories=""$(SPICE_LIBS)\lib"" |
From: Yaniv K. <yk...@re...> - 2009-12-23 22:27:05
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: master commit 3e1d328e37693761b7d58f55a80612acf89243d3 Author: Izik Eidus <ie...@re...> Date: Wed Dec 23 23:04:25 2009 +0200 spice: fix server crush in case connecting without qxl device Signed-off-by: Izik Eidus <ie...@re...> diff --git a/server/red_dispatcher.c b/server/red_dispatcher.c index dae33d8..439d534 100644 --- a/server/red_dispatcher.c +++ b/server/red_dispatcher.c @@ -405,6 +405,9 @@ int red_dispatcher_count() uint32_t red_dispatcher_qxl_ram_size() { QXLDevInfo qxl_info; + if (!dispatchers) { + return 0; + } dispatchers->qxl_interface->get_info(dispatchers->qxl_interface, &qxl_info); return qxl_info.ram_size; } |
From: Yaniv K. <yk...@re...> - 2009-12-23 22:12:21
|
repository: /home/tlv/ykamay/open_spice_upload/vdesktop branch: 0.4 commit fc589875868ceefad8cac57018296ab23a68fbcd Author: Izik Eidus <ie...@re...> Date: Wed Dec 23 21:55:59 2009 +0200 vdesktop: add shadow rom. This is needed in order not to let the guesst changes of the rom effect the qxl device. Signed-off-by: Izik Eidus <ie...@re...> diff --git a/qemu/hw/qxl.c b/qemu/hw/qxl.c index c3322b5..bd11725 100644 --- a/qemu/hw/qxl.c +++ b/qemu/hw/qxl.c @@ -22,7 +22,7 @@ #define QXL_VRAM_SIZE 4096 #define QXL_DEFAULT_COMPRESSION_LEVEL 0 #define QXL_SHARED_VGA_MODE FALSE -#define QXL_SAVE_VERSION 3 +#define QXL_SAVE_VERSION 4 #define VDI_PORT_SAVE_VERSION 1 #define ASSERT(x) if (!(x)) { \ @@ -89,6 +89,7 @@ enum { typedef struct QXLState { uint32_t io_base; QXLRom *rom; + QXLRom shadow_rom; QXLModes *modes; uint64_t rom_offset; uint32_t rom_size; @@ -272,6 +273,7 @@ void qxl_do_set_log_level(int log_level) PCIQXLDevice *d = dev_list; while (d) { d->state.rom->log_level = log_level; + d->state.shadow_rom.log_level = log_level; d = d->dev_next; } } @@ -315,7 +317,7 @@ static void qxl_send_events(PCIQXLDevice *d, uint32_t events) static void set_dreaw_area(PCIQXLDevice *d, QXLDevInfo *info) { int stride = info->x_res * sizeof(uint32_t); - info->draw_area.buf = (uint8_t *)d->state.ram_start + d->state.rom->draw_area_offset; + info->draw_area.buf = (uint8_t *)d->state.ram_start + d->state.shadow_rom.draw_area_offset; info->draw_area.size = stride * info->y_res; info->draw_area.line_0 = info->draw_area.buf + info->draw_area.size - stride; info->draw_area.stride = -stride; @@ -328,7 +330,7 @@ static void _qxl_get_info(PCIQXLDevice *d, QXLDevInfo *info) QXLState *state = &d->state; QXLMode *mode; - info->ram_size = state->rom->num_io_pages << TARGET_PAGE_BITS; + info->ram_size = state->shadow_rom.num_io_pages << TARGET_PAGE_BITS; if (state->mode == QXL_MODE_VGA) { info->x_res = qxl_vga.ds->width; @@ -343,14 +345,14 @@ static void _qxl_get_info(PCIQXLDevice *d, QXLDevInfo *info) return; } - mode = &qxl_modes[d->state.rom->mode]; + mode = &qxl_modes[d->state.shadow_rom.mode]; info->x_res = mode->x_res; info->y_res = mode->y_res; info->bits = mode->bits; info->use_hardware_cursor = TRUE; - info->phys_start = (unsigned long)state->ram_start + state->rom->pages_offset; + info->phys_start = (unsigned long)state->ram_start + state->shadow_rom.pages_offset; info->phys_end = (unsigned long)state->ram_start + state->ram_size; info->phys_delta = (long)state->ram_start - state->ram_phys_addr; set_dreaw_area(d, info); @@ -513,6 +515,7 @@ static void _qxl_notify_update(PCIQXLDevice *d, uint32_t update_id) return; } d->state.rom->update_id = update_id; + d->state.shadow_rom.update_id = update_id; qxl_send_events(d, QXL_INTERRUPT_DISPLAY); } @@ -597,6 +600,7 @@ static void qxl_set_mode(PCIQXLDevice *d, uint32_t mode) ASSERT(RING_IS_EMPTY(&d->state.vga_ring)); qxl_reset_state(d); qxl_exit_vga_mode(d); + d->state.shadow_rom.mode = mode; d->state.rom->mode = mode; memset(d->state.vram, 0, d->state.vram_size); d->state.mode = QXL_MODE_NATIVE; @@ -623,6 +627,7 @@ static void qxl_enter_vga_mode(PCIQXLDevice *d) } printf("%u: %s\n", d->id, __FUNCTION__); d->state.rom->mode = ~0; + d->state.shadow_rom.mode = ~0; d->state.mode = QXL_MODE_VGA; qxl_notify_mode_change(d); qxl_add_vga_client(); @@ -640,7 +645,8 @@ static void qxl_reset_state(PCIQXLDevice *d) ram->magic = QXL_RAM_MAGIC; ram->int_pending = 0; ram->int_mask = 0; - rom->update_id = 0; + d->state.shadow_rom.update_id = 0; + *rom = d->state.shadow_rom; RING_INIT(&ram->cmd_ring); RING_INIT(&ram->cursor_ring); RING_INIT(&d->state.vga_ring); @@ -1093,6 +1099,7 @@ static uint32_t init_qxl_rom(PCIQXLDevice *d, uint8_t *buf, uint32_t vram_size, *max_fb = MAX(qxl_modes[i].y_res * qxl_modes[i].stride, *max_fb); modes->modes[i] = qxl_modes[i]; } + s->shadow_rom = *rom; s->rom = rom; s->modes = modes; return (uint32_t)((uint8_t *)&modes->modes[i] - buf); @@ -1105,22 +1112,26 @@ static void init_qxl_ram(QXLState *s, uint8_t *buf, uint32_t actual_ram_size) s->ram_start = buf; - draw_area_size = s->rom->draw_area_size; + draw_area_size = s->shadow_rom.draw_area_size; ram_header_size = ALIGN(sizeof(*s->ram), 8); ASSERT(ram_header_size + draw_area_size < actual_ram_size); - s->rom->ram_header_offset = actual_ram_size - ram_header_size; - s->ram = (QXLRam *)(buf + s->rom->ram_header_offset); + s->shadow_rom.ram_header_offset = actual_ram_size - ram_header_size; + s->ram = (QXLRam *)(buf + s->shadow_rom.ram_header_offset); s->ram->magic = QXL_RAM_MAGIC; RING_INIT(&s->ram->cmd_ring); RING_INIT(&s->ram->cursor_ring); RING_INIT(&s->ram->release_ring); *RING_PROD_ITEM(&s->ram->release_ring) = 0; - s->rom->draw_area_offset = s->rom->ram_header_offset - draw_area_size; - s->rom->pages_offset = 0; - s->rom->num_io_pages = (actual_ram_size - (draw_area_size + ram_header_size)) >> TARGET_PAGE_BITS; - printf("%s: npages %u\n", __FUNCTION__, s->rom->num_io_pages); + s->shadow_rom.draw_area_offset = s->shadow_rom.ram_header_offset - draw_area_size; + s->shadow_rom.pages_offset = 0; + s->shadow_rom.num_io_pages = + (actual_ram_size -(draw_area_size + ram_header_size)) >> TARGET_PAGE_BITS; + + *s->rom = s->shadow_rom; + + printf("%s: npages %u\n", __FUNCTION__, s->shadow_rom.num_io_pages); } inline uint32_t msb_mask(uint32_t val) @@ -1301,6 +1312,7 @@ static void qxl_save(QEMUFile* f, void* opaque) pci_device_save(&d->pci_dev, f); qemu_put_be32(f, s->rom->mode); + qemu_put_be32(f, s->shadow_rom.mode); qemu_put_be32(f, s->num_free_res); if (s->last_release == NULL) @@ -1329,8 +1341,9 @@ static int qxl_load(QEMUFile* f,void* opaque,int version_id) uint32_t last_release_offset; int ret; - if (version_id != QXL_SAVE_VERSION) + if (version_id < 3 || version_id > QXL_SAVE_VERSION) { return -EINVAL; + } ret = pci_device_load(&d->pci_dev, f); if (ret) { @@ -1346,7 +1359,12 @@ static int qxl_load(QEMUFile* f,void* opaque,int version_id) qxl_remove_vga_client(); } - s->rom->mode = qemu_get_be32(f); + s->rom->mode = qemu_get_be32(f); + if (version_id == 3) { + s->shadow_rom.mode = s->rom->mode; + } else { + s->shadow_rom.mode = qemu_get_be32(f); + } s->num_free_res = qemu_get_be32(f); last_release_offset = qemu_get_be32(f); @@ -1375,10 +1393,6 @@ static int qxl_load(QEMUFile* f,void* opaque,int version_id) qemu_get_buffer(f, s->worker_data, s->worker_data_size); } - if (version_id == 2) { - qemu_get_byte(f); - } - if (s->mode == QXL_MODE_VGA) { qxl_add_vga_client(); } @@ -1533,12 +1547,14 @@ static void interface_attache_worker(QXLInterface *qxl, QXLWorker *qxl_worker) static void interface_set_compression_level(QXLInterface *qxl, int level) { PCIQXLDevice *d = ((Interface *)qxl)->d; + d->state.shadow_rom.compression_level = level; d->state.rom->compression_level = level; } static void interface_set_mm_time(QXLInterface *qxl, uint32_t mm_time) { PCIQXLDevice *d = ((Interface *)qxl)->d; + d->state.shadow_rom.mm_clock = mm_time; d->state.rom->mm_clock = mm_time; } |
From: Yaniv K. <yk...@re...> - 2009-12-23 21:15:20
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: master commit 240723a45d513ac5a9cf4770b457d988717977f4 Author: Izik Eidus <ie...@re...> Date: Wed Dec 23 17:43:12 2009 +0200 spice client: fix wrong gdi-canvas handling of blend_alpha Signed-off-by: Izik Eidus <ie...@re...> diff --git a/common/gdi_canvas.c b/common/gdi_canvas.c index 7120d88..9c7e669 100644 --- a/common/gdi_canvas.c +++ b/common/gdi_canvas.c @@ -1157,14 +1157,19 @@ void gdi_canvas_draw_transparent(GdiCanvas *canvas, Rect *bbox, Clip *clip, } static void gdi_draw_bitmap_alpha(HDC dest_dc, const Rect *src, const Rect *dest, - HDC src_dc, uint8_t alpha) + HDC src_dc, uint8_t alpha, int use_bitmap_alpha) { BLENDFUNCTION bf; bf.BlendOp = AC_SRC_OVER; bf.BlendFlags = 0; bf.SourceConstantAlpha = alpha; - bf.AlphaFormat = AC_SRC_ALPHA; + + if (use_bitmap_alpha) { + bf.AlphaFormat = AC_SRC_ALPHA; + } else { + bf.AlphaFormat = 0; + } if (!AlphaBlend(dest_dc, dest->left, dest->top, dest->right - dest->left, dest->bottom - dest->top, src_dc, src->left, src->top, @@ -1176,7 +1181,7 @@ static void gdi_draw_bitmap_alpha(HDC dest_dc, const Rect *src, const Rect *dest static void gdi_draw_image_alpha(HDC dest_dc, const Rect *src, const Rect *dest, const uint8_t *bitmap_data, int bit_stride, int bit_width, int bit_height, uint8_t alpha, - int rotate) + int rotate, int use_bitmap_alpha) { HDC dc; HBITMAP bitmap; @@ -1185,7 +1190,7 @@ static void gdi_draw_image_alpha(HDC dest_dc, const Rect *src, const Rect *dest, create_bitmap(&bitmap, &prev_bitmap, &dc, bitmap_data, bit_width, bit_height, bit_stride, 32, rotate); - gdi_draw_bitmap_alpha(dest_dc, src, dest, dc, alpha); + gdi_draw_bitmap_alpha(dest_dc, src, dest, dc, alpha, use_bitmap_alpha); release_bitmap(dc, bitmap, prev_bitmap, 0); } @@ -1195,8 +1200,10 @@ void gdi_canvas_draw_alpha_blend(GdiCanvas *canvas, Rect *bbox, Clip *clip, Alph cairo_surface_t *surface; GdiImage image; BitmapCache *bitmap_cache; + int use_bitmap_alpha; surface = canvas_get_image(&canvas->base, alpha_blend->src_bitmap); + use_bitmap_alpha = cairo_image_surface_get_format(surface) == CAIRO_FORMAT_ARGB32; bitmap_cache = (BitmapCache *)cairo_surface_get_user_data(surface, &bitmap_data_type); Lock lock(*canvas->lock); @@ -1207,7 +1214,8 @@ void gdi_canvas_draw_alpha_blend(GdiCanvas *canvas, Rect *bbox, Clip *clip, Alph dc = create_compatible_dc(); prev_bitmap = (HBITMAP)SelectObject(dc, bitmap_cache->bitmap); - gdi_draw_bitmap_alpha(canvas->dc, &alpha_blend->src_area, bbox, dc, alpha_blend->alpha); + gdi_draw_bitmap_alpha(canvas->dc, &alpha_blend->src_area, bbox, dc, alpha_blend->alpha, + use_bitmap_alpha); SelectObject(dc, prev_bitmap); DeleteObject(dc); ReleaseMutex(bitmap_cache->mutex); @@ -1215,7 +1223,7 @@ void gdi_canvas_draw_alpha_blend(GdiCanvas *canvas, Rect *bbox, Clip *clip, Alph surface_to_image(surface, &image); gdi_draw_image_alpha(canvas->dc, &alpha_blend->src_area, bbox, image.pixels, image.stride, image.width, image.height, - alpha_blend->alpha, 0); + alpha_blend->alpha, 0, use_bitmap_alpha); } cairo_surface_destroy(surface); |
From: Yaniv K. <yk...@re...> - 2009-12-23 20:29:34
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: master commit a0a1a973d8d721359487b8cda055e1150acddd7f Author: Yaniv Kamay <yk...@re...> Date: Wed Dec 23 22:25:56 2009 +0200 client: new static title image diff --git a/client/windows/static_title.bmp b/client/windows/static_title.bmp index da575ae..e184f62 100644 Binary files a/client/windows/static_title.bmp and b/client/windows/static_title.bmp differ diff --git a/client/x11/images/info_image.c b/client/x11/images/info_image.c index 4750b13..966d0dc 100644 --- a/client/x11/images/info_image.c +++ b/client/x11/images/info_image.c @@ -1,8 +1,8 @@ static const struct { uint32_t width; uint32_t height; - uint8_t pixel_data[29700]; -} _info_image = { 275, 27, { + uint8_t pixel_data[24408]; +} _info_image = { 226, 27, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x12,0x12,0x16,0x4a,0x4a,0x4a,0x53, 0x5e,0x5e,0x5e,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, @@ -39,31 +39,15 @@ static const struct { 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, + 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x5e,0x5e,0x5e,0x69,0x4a,0x4a,0x4a,0x53,0x12,0x12,0x12,0x16, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x16,0x4a,0x4a,0x4a,0x53,0x5e,0x5e,0x5e,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x5e,0x5e,0x5e,0x69,0x4a,0x4a,0x4a,0x53, - 0x12,0x12,0x12,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x16,0x4a,0x4a,0x4a,0x53,0x5e,0x5e,0x5e,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x28,0x28,0x28,0x69,0x2a,0x2a,0x2a,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x29,0x29,0x29,0x69, - 0x28,0x28,0x28,0x69,0x23,0x23,0x24,0x69,0x27,0x27,0x27,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, + 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x29,0x29,0x29,0x6a,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, + 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x29,0x29,0x29,0x6b, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, @@ -93,19 +77,15 @@ static const struct { 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x5e,0x5e,0x5e,0x69,0x4a,0x4a,0x4a,0x53,0x10,0x10,0x10,0x16, + 0x2a,0x2a,0x2a,0x69,0x5e,0x5e,0x5e,0x69,0x4a,0x4a,0x4a,0x53,0x10,0x10,0x10,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x16,0x4a,0x4a,0x4a,0x53,0x5e,0x5e,0x5e,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x29,0x29,0x29,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x16,0x16,0x25,0x69,0x0e,0x0f,0x4d,0x69,0x0b,0x0c,0x49,0x69,0x0a,0x0b,0x41,0x69,0x0a,0x0b,0x43,0x69, - 0x07,0x07,0x2d,0x69,0x12,0x12,0x2b,0x69,0x1f,0x1f,0x23,0x69,0x2a,0x2a,0x2a,0x69,0x29,0x29,0x29,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, + 0x10,0x10,0x10,0x16,0x4a,0x4a,0x4a,0x53,0x5e,0x5e,0x5e,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, + 0x2e,0x2e,0x31,0x7f,0x2c,0x2c,0x2e,0x7a,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, + 0x2a,0x2a,0x2a,0x69,0x2b,0x2e,0x2b,0x7b,0x2b,0x2b,0x2b,0x76,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, + 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x29,0x29,0x29,0x6d,0x37,0x33,0x33,0x86,0x2c,0x2a,0x2a,0x75,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, @@ -134,29 +114,16 @@ static const struct { 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x5e,0x5e,0x5e,0x69,0x4a,0x4a,0x4a,0x53,0x10,0x10,0x10,0x16,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53,0x5e,0x5e,0x5e,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x28,0x28,0x28,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x25,0x25,0x26,0x69, - 0x0f,0x0f,0x3c,0x69,0x0a,0x0b,0x42,0x69,0x0b,0x0c,0x4a,0x69,0x0c,0x0d,0x4d,0x69,0x0d,0x0e,0x53,0x69,0x0a,0x0a,0x3f,0x69, - 0x0b,0x0c,0x46,0x69,0x10,0x10,0x33,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x28,0x28,0x28,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, + 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x5e,0x5e,0x5e,0x69, + 0x4a,0x4a,0x4a,0x53,0x10,0x10,0x10,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53, + 0x5e,0x5e,0x5e,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, + 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x2a,0x2a,0x2c,0x76,0x4e,0x4e,0x5f,0xa2,0x4c,0x4c,0x59,0x9a, + 0x2a,0x2a,0x2b,0x72,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x2b,0x29,0x74,0x48,0x5a,0x48,0x9f, + 0x49,0x55,0x49,0x99,0x2a,0x2a,0x2a,0x71,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, + 0x3a,0x33,0x33,0x83,0x6e,0x5b,0x5b,0xac,0x4d,0x44,0x44,0x93,0x29,0x29,0x29,0x6d,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, @@ -185,19 +152,16 @@ static const struct { 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x5e,0x5e,0x5e,0x69,0x4a,0x4a,0x4a,0x53,0x0f,0x0f,0x0f,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x5e,0x5e,0x5e,0x69,0x4a,0x4a,0x4a,0x53,0x0f,0x0f,0x0f,0x16, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53,0x5e,0x5e,0x5e,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x1e,0x1e,0x22,0x69,0x0b,0x0b,0x45,0x69, - 0x02,0x03,0x12,0x69,0x05,0x05,0x23,0x69,0x09,0x0a,0x3d,0x69,0x0d,0x0e,0x51,0x69,0x0d,0x0e,0x51,0x69,0x0d,0x0e,0x52,0x69, - 0x0e,0x0f,0x4a,0x69,0x22,0x22,0x23,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53,0x5e,0x5e,0x5e,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, + 0x28,0x28,0x28,0x6b,0x3a,0x3a,0x4b,0x90,0x65,0x65,0x88,0xb2,0x6b,0x6b,0x85,0xb1,0x41,0x41,0x4a,0x8f,0x28,0x28,0x29,0x6c, + 0x29,0x29,0x29,0x69,0x28,0x28,0x28,0x6a,0x32,0x45,0x32,0x8d,0x5a,0x84,0x5a,0xb1,0x64,0x81,0x64,0xb0,0x3e,0x46,0x3e,0x8d, + 0x28,0x29,0x28,0x6b,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x2b,0x29,0x29,0x74,0x60,0x48,0x48,0x9f,0x91,0x6f,0x6f,0xb4, + 0x7a,0x63,0x63,0xae,0x3e,0x38,0x38,0x88,0x28,0x28,0x28,0x6a,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, @@ -222,53 +186,40 @@ static const struct { 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x60,0x60,0x60,0x69, - 0x46,0x46,0x46,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x5e,0x5e,0x5e,0x69,0x4a,0x4a,0x4a,0x53,0x0f,0x0f,0x0f,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x16, - 0x4a,0x4a,0x4a,0x53,0x5e,0x5e,0x5e,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x27,0x27,0x27,0x69, - 0x26,0x26,0x26,0x69,0x19,0x19,0x21,0x69,0x15,0x15,0x25,0x69,0x19,0x19,0x21,0x69,0x0b,0x0c,0x4a,0x69,0x0d,0x0e,0x54,0x69, - 0x0d,0x0e,0x54,0x69,0x0d,0x0e,0x51,0x69,0x0c,0x0d,0x4f,0x69,0x0c,0x0d,0x4f,0x69,0x0c,0x0d,0x4f,0x69,0x0d,0x0e,0x54,0x69, - 0x13,0x14,0x27,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, + 0x29,0x29,0x29,0x69,0x5e,0x5e,0x5e,0x69,0x4a,0x4a,0x4a,0x53,0x0f,0x0f,0x0f,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53,0x5e,0x5e,0x5e,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, + 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, + 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, + 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x2a,0x2a,0x32,0x7f,0x4a,0x4a,0x72,0xaa, + 0x64,0x64,0x92,0xb4,0x6e,0x6e,0x92,0xb4,0x61,0x61,0x75,0xab,0x35,0x35,0x3a,0x83,0x28,0x28,0x28,0x69,0x26,0x30,0x26,0x7c, + 0x3b,0x6e,0x3b,0xa8,0x58,0x92,0x58,0xb4,0x68,0x92,0x68,0xb4,0x5d,0x72,0x5d,0xab,0x32,0x36,0x32,0x82,0x28,0x28,0x28,0x69, + 0x28,0x27,0x27,0x6b,0x45,0x33,0x33,0x8e,0x84,0x58,0x58,0xb1,0x92,0x69,0x69,0xb4,0x92,0x70,0x70,0xb4,0x6a,0x57,0x57,0xa6, + 0x30,0x2d,0x2d,0x7c,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, + 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, - 0x28,0x28,0x28,0x69,0x35,0x35,0x35,0x69,0x5c,0x5c,0x5c,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, - 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x39,0x39,0x39,0x69, - 0x57,0x57,0x57,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, - 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x31,0x31,0x31,0x69,0x5c,0x5c,0x5c,0x69,0x31,0x31,0x31,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, - 0x28,0x28,0x28,0x69,0x4a,0x4a,0x4a,0x69,0x69,0x69,0x69,0x69,0x35,0x35,0x35,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, - 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x2c,0x2c,0x2c,0x69,0x69,0x69,0x69,0x69, - 0x53,0x53,0x53,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, - 0x28,0x28,0x28,0x69,0x31,0x31,0x31,0x69,0x5c,0x5c,0x5c,0x69,0x31,0x31,0x31,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, - 0x28,0x28,0x28,0x69,0x35,0x35,0x35,0x69,0x5c,0x5c,0x5c,0x69,0x28,0x28,0x28,0x69,0x4a,0x4a,0x4a,0x69,0x69,0x69,0x69,0x69, - 0x35,0x35,0x35,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, - 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x46,0x46,0x46,0x69,0x4f,0x4f,0x4f,0x69,0x28,0x28,0x28,0x69, - 0x28,0x28,0x28,0x69,0x4a,0x4a,0x4a,0x69,0x69,0x69,0x69,0x69,0x35,0x35,0x35,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, - 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x60,0x60,0x60,0x69,0x46,0x46,0x46,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, @@ -279,21 +230,13 @@ static const struct { 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x5e,0x5e,0x5e,0x69, 0x4a,0x4a,0x4a,0x53,0x0f,0x0f,0x0f,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53, - 0x5d,0x5d,0x5d,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x10,0x10,0x31,0x69, - 0x0e,0x0e,0x56,0x69,0x0e,0x0f,0x58,0x69,0x05,0x05,0x23,0x69,0x00,0x00,0x05,0x69,0x13,0x13,0x27,0x69,0x0f,0x0f,0x3b,0x69, - 0x0e,0x0f,0x4c,0x69,0x0c,0x0d,0x50,0x69,0x0c,0x0d,0x4f,0x69,0x0c,0x0d,0x4f,0x69,0x0d,0x0e,0x54,0x69,0x10,0x10,0x30,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x53,0x53,0x53,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x41,0x41,0x41,0x69,0x69,0x69,0x69,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x69,0x69,0x69,0x69,0x46,0x46,0x46,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x60,0x60,0x60,0x69,0x4f,0x4f,0x4f,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x4f,0x4f,0x4f,0x69,0x60,0x60,0x60,0x69, + 0x5d,0x5d,0x5d,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x57,0x57,0x57,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x41,0x41,0x41,0x69,0x69,0x69,0x69,0x69,0x30,0x30,0x30,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x26,0x26,0x28,0x70,0x35,0x35,0x57,0x9b,0x52,0x52,0x8d,0xb3,0x5d,0x5d,0x92,0xb4,0x67,0x67,0x92,0xb4, + 0x70,0x70,0x90,0xb4,0x55,0x55,0x64,0xa3,0x2a,0x2b,0x2c,0x7e,0x26,0x52,0x26,0x98,0x3b,0x8c,0x3b,0xb3,0x4d,0x92,0x4d,0xb4, + 0x5d,0x92,0x5d,0xb4,0x6c,0x90,0x6c,0xb4,0x52,0x61,0x52,0xa1,0x2a,0x2b,0x2a,0x77,0x30,0x28,0x28,0x7c,0x6c,0x40,0x40,0xa8, + 0x92,0x58,0x58,0xb4,0x92,0x61,0x61,0xb4,0x92,0x69,0x69,0xb4,0x8d,0x6e,0x6e,0xb3,0x59,0x4a,0x4a,0x9b,0x29,0x28,0x28,0x72, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, @@ -301,45 +244,16 @@ static const struct { 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x46,0x46,0x46,0x69,0x69,0x69,0x69,0x69,0x39,0x39,0x39,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x64,0x64,0x64,0x69,0x53,0x53,0x53,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x41,0x41,0x41,0x69,0x69,0x69,0x69,0x69,0x30,0x30,0x30,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x41,0x41,0x41,0x69,0x69,0x69,0x69,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x60,0x60,0x60,0x69,0x4f,0x4f,0x4f,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x60,0x60,0x60,0x69,0x46,0x46,0x46,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x46,0x46,0x46,0x69,0x60,0x60,0x60,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69,0x46,0x46,0x46,0x69,0x27,0x27,0x27,0x69,0x46,0x46,0x46,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x46,0x46,0x46,0x69, - 0x27,0x27,0x27,0x69,0x35,0x35,0x35,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x3d,0x3d,0x3d,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x46,0x46,0x46,0x69,0x64,0x64,0x64,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x53,0x53,0x53,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x53,0x53,0x53,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x5b,0x5b,0x5b,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x5d,0x5d,0x5d,0x69,0x4a,0x4a,0x4a,0x53, - 0x0f,0x0f,0x0f,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53,0x5d,0x5d,0x5d,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x12,0x12,0x29,0x69,0x0d,0x0e,0x55,0x69, - 0x0d,0x0e,0x51,0x69,0x0b,0x0c,0x4c,0x69,0x06,0x06,0x25,0x69,0x25,0x25,0x25,0x69,0x27,0x27,0x27,0x69,0x1e,0x1e,0x20,0x69, - 0x0b,0x0c,0x49,0x69,0x0d,0x0e,0x50,0x69,0x0c,0x0d,0x4f,0x69,0x0d,0x0e,0x52,0x69,0x0f,0x10,0x33,0x69,0x10,0x10,0x32,0x69, - 0x17,0x17,0x21,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x69,0x69,0x69,0x69, - 0x41,0x41,0x41,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x38,0x38,0x38,0x69,0x69,0x69,0x69,0x69,0x46,0x46,0x46,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x41,0x41,0x41,0x69, - 0x69,0x69,0x69,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x69,0x69,0x69,0x69,0x46,0x46,0x46,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x60,0x60,0x60,0x69, - 0x4e,0x4e,0x4e,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x4e,0x4e,0x4e,0x69,0x60,0x60,0x60,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x57,0x57,0x57,0x69, - 0x57,0x57,0x57,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x41,0x41,0x41,0x69,0x69,0x69,0x69,0x69,0x2f,0x2f,0x2f,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, @@ -347,355 +261,323 @@ static const struct { 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x2b,0x2b,0x2b,0x69,0x64,0x64,0x64,0x69,0x4a,0x4a,0x4a,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x3c,0x3c,0x3c,0x69, - 0x69,0x69,0x69,0x69,0x38,0x38,0x38,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x41,0x41,0x41,0x69, - 0x69,0x69,0x69,0x69,0x2f,0x2f,0x2f,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x41,0x41,0x41,0x69, - 0x69,0x69,0x69,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x60,0x60,0x60,0x69,0x4e,0x4e,0x4e,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x60,0x60,0x60,0x69,0x46,0x46,0x46,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x3c,0x3c,0x3c,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69,0x2b,0x2b,0x2b,0x69,0x46,0x46,0x46,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x41,0x41,0x41,0x69, - 0x34,0x34,0x34,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x3c,0x3c,0x3c,0x69,0x27,0x27,0x27,0x69,0x4e,0x4e,0x4e,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x53,0x53,0x53,0x69, - 0x27,0x27,0x27,0x69,0x53,0x53,0x53,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x5b,0x5b,0x5b,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x5d,0x5d,0x5d,0x69,0x4a,0x4a,0x4a,0x53,0x0f,0x0f,0x0f,0x16, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53,0x5d,0x5d,0x5d,0x69,0x26,0x26,0x26,0x69, - 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x25,0x25,0x25,0x69,0x10,0x11,0x2c,0x69,0x0e,0x0f,0x52,0x69, - 0x0d,0x0e,0x51,0x69,0x0d,0x0e,0x54,0x69,0x0e,0x0e,0x45,0x69,0x11,0x11,0x2a,0x69,0x1c,0x1c,0x20,0x69,0x08,0x09,0x36,0x69, - 0x0d,0x0e,0x52,0x69,0x0c,0x0d,0x4f,0x69,0x0c,0x0d,0x4f,0x69,0x0c,0x0d,0x4e,0x69,0x0d,0x0e,0x53,0x69,0x0e,0x0f,0x52,0x69, - 0x17,0x17,0x20,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x69,0x69,0x69,0x69,0x41,0x41,0x41,0x69, - 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x60,0x60,0x60,0x69,0x4a,0x4a,0x4a,0x69,0x26,0x26,0x26,0x69, - 0x38,0x38,0x38,0x69,0x60,0x60,0x60,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x45,0x45,0x45,0x69,0x26,0x26,0x26,0x69, - 0x26,0x26,0x26,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x5b,0x5b,0x5b,0x69,0x69,0x69,0x69,0x69, - 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x69,0x69,0x69,0x69, - 0x45,0x45,0x45,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x60,0x60,0x60,0x69,0x4e,0x4e,0x4e,0x69, - 0x26,0x26,0x26,0x69,0x33,0x33,0x33,0x69,0x64,0x64,0x64,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x52,0x52,0x52,0x69, - 0x26,0x26,0x26,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x41,0x41,0x41,0x69, - 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x57,0x57,0x57,0x69,0x57,0x57,0x57,0x69, - 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x45,0x45,0x45,0x69, - 0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69,0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69,0x33,0x33,0x33,0x69,0x38,0x38,0x38,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x4e,0x4e,0x4e,0x69,0x26,0x26,0x26,0x69,0x38,0x38,0x38,0x69, - 0x60,0x60,0x60,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x45,0x45,0x45,0x69,0x26,0x26,0x26,0x69,0x38,0x38,0x38,0x69, - 0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69,0x69,0x69,0x69,0x69,0x52,0x52,0x52,0x69,0x38,0x38,0x38,0x69,0x69,0x69,0x69,0x69, - 0x5b,0x5b,0x5b,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x41,0x41,0x41,0x69,0x26,0x26,0x26,0x69,0x45,0x45,0x45,0x69, - 0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69,0x69,0x69,0x69,0x69,0x45,0x45,0x45,0x69,0x41,0x41,0x41,0x69,0x69,0x69,0x69,0x69, - 0x2f,0x2f,0x2f,0x69,0x2b,0x2b,0x2b,0x69,0x5b,0x5b,0x5b,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x5b,0x5b,0x5b,0x69, - 0x2f,0x2f,0x2f,0x69,0x26,0x26,0x26,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69, - 0x38,0x38,0x38,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, - 0x4e,0x4e,0x4e,0x69,0x64,0x64,0x64,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x4e,0x4e,0x4e,0x69,0x64,0x64,0x64,0x69, - 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x60,0x60,0x60,0x69,0x4e,0x4e,0x4e,0x69,0x26,0x26,0x26,0x69,0x69,0x69,0x69,0x69, - 0x60,0x60,0x60,0x69,0x69,0x69,0x69,0x69,0x64,0x64,0x64,0x69,0x38,0x38,0x38,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x4e,0x4e,0x4e,0x69,0x26,0x26,0x26,0x69,0x69,0x69,0x69,0x69,0x45,0x45,0x45,0x69,0x26,0x26,0x26,0x69, - 0x38,0x38,0x38,0x69,0x69,0x69,0x69,0x69,0x38,0x38,0x38,0x69,0x26,0x26,0x26,0x69,0x4e,0x4e,0x4e,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69,0x38,0x38,0x38,0x69,0x26,0x26,0x26,0x69,0x41,0x41,0x41,0x69,0x69,0x69,0x69,0x69, - 0x26,0x26,0x26,0x69,0x41,0x41,0x41,0x69,0x69,0x69,0x69,0x69,0x2f,0x2f,0x2f,0x69,0x2f,0x2f,0x2f,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x4e,0x4e,0x4e,0x69,0x26,0x26,0x26,0x69,0x41,0x41,0x41,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x45,0x45,0x45,0x69,0x26,0x26,0x26,0x69,0x57,0x57,0x57,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x2f,0x2f,0x2f,0x69,0x41,0x41,0x41,0x69,0x69,0x69,0x69,0x69, - 0x2f,0x2f,0x2f,0x69,0x26,0x26,0x26,0x69,0x41,0x41,0x41,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69, - 0x38,0x38,0x38,0x69,0x26,0x26,0x26,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69,0x69,0x69,0x69,0x69, - 0x60,0x60,0x60,0x69,0x33,0x33,0x33,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, - 0x26,0x26,0x26,0x69,0x60,0x60,0x60,0x69,0x45,0x45,0x45,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, - 0x26,0x26,0x26,0x69,0x4a,0x4a,0x4a,0x69,0x69,0x69,0x69,0x69,0x64,0x64,0x64,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, - 0x4a,0x4a,0x4a,0x69,0x3c,0x3c,0x3c,0x69,0x26,0x26,0x26,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69,0x64,0x64,0x64,0x69, - 0x26,0x26,0x26,0x69,0x2b,0x2b,0x2b,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x4a,0x4a,0x4a,0x69,0x33,0x33,0x33,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x3c,0x3c,0x3c,0x69,0x2f,0x2f,0x2f,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, - 0x4e,0x4e,0x4e,0x69,0x26,0x26,0x26,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69,0x52,0x52,0x52,0x69,0x26,0x26,0x26,0x69, - 0x52,0x52,0x52,0x69,0x69,0x69,0x69,0x69,0x52,0x52,0x52,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53,0x5d,0x5d,0x5d,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x6a,0x28,0x28,0x3e,0x88, + 0x3d,0x3d,0x7f,0xb0,0x4c,0x4c,0x92,0xb4,0x56,0x56,0x92,0xb4,0x60,0x60,0x92,0xb4,0x69,0x69,0x92,0xb4,0x6e,0x6e,0x8a,0xb3, + 0x46,0x53,0x51,0xa6,0x23,0x76,0x23,0xb0,0x32,0x92,0x32,0xb4,0x43,0x92,0x43,0xb4,0x52,0x92,0x52,0xb4,0x62,0x92,0x62,0xb4, + 0x6c,0x8a,0x6c,0xb3,0x48,0x50,0x46,0x99,0x52,0x30,0x30,0x9b,0x8d,0x46,0x46,0xb3,0x92,0x51,0x51,0xb4,0x92,0x58,0x58,0xb4, + 0x92,0x61,0x61,0xb4,0x92,0x69,0x69,0xb4,0x83,0x66,0x66,0xb1,0x47,0x3e,0x3e,0x8f,0x26,0x26,0x26,0x6c,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x37,0x37,0x37,0x75,0x6c,0x6c,0x6c,0x99,0x7e,0x7e,0x7e,0xa6,0x7c,0x7c,0x7c,0xa4,0x71,0x71,0x71,0x9d,0x44,0x44,0x44,0x7e, + 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x78,0x78,0x78,0xa2,0x60,0x60,0x60,0x91,0x2e,0x2e,0x2e,0x6e,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x35,0x35,0x35,0x73,0x61,0x61,0x61,0x92, + 0x77,0x77,0x77,0xa1,0x7e,0x7e,0x7e,0xa6,0x77,0x77,0x77,0xa1,0x60,0x60,0x60,0x91,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x53,0x53,0x53,0x88, + 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7c,0x7c,0x7c,0xa5,0x6d,0x6d,0x6d,0x9a, + 0x3a,0x3a,0x3a,0x77,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x53,0x53,0x53,0x88,0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x74,0x74,0x74,0x9f,0x27,0x27,0x27,0x6a,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x6a,0x74,0x74,0x74,0x9f,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x3e,0x3e,0x3e,0x79,0x6a,0x6a,0x6a,0x98, + 0x7c,0x7c,0x7c,0xa4,0x7c,0x7c,0x7c,0xa4,0x6a,0x6a,0x6a,0x98,0x3f,0x3f,0x3f,0x7a,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x53,0x53,0x53,0x88,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x35,0x35,0x35,0x73,0x61,0x61,0x61,0x92, + 0x77,0x77,0x77,0xa1,0x7e,0x7e,0x7e,0xa6,0x77,0x77,0x77,0xa1,0x60,0x60,0x60,0x91,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x53,0x53,0x53,0x88,0x27,0x27,0x27,0x69, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x59,0x59,0x59,0x8c,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x5d,0x5d,0x5d,0x69,0x4a,0x4a,0x4a,0x53,0x0f,0x0f,0x0f,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53,0x5d,0x5d,0x5d,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, - 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x5d,0x5d,0x5d,0x69,0x4a,0x4a,0x4a,0x53,0x0f,0x0f,0x0f,0x16,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53,0x5d,0x5d,0x5d,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, - 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x12,0x12,0x25,0x69,0x0c,0x0d,0x4e,0x69, - 0x0d,0x0e,0x54,0x69,0x0d,0x0e,0x51,0x69,0x0d,0x0e,0x54,0x69,0x0d,0x0e,0x50,0x69,0x0c,0x0d,0x4d,0x69,0x0c,0x0d,0x4f,0x69, - 0x0c,0x0d,0x4f,0x69,0x0c,0x0d,0x4f,0x69,0x0c,0x0d,0x4f,0x69,0x0c,0x0d,0x4f,0x69,0x0e,0x0e,0x56,0x69,0x12,0x13,0x25,0x69, - 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x69,0x69,0x69,0x69,0x40,0x40,0x40,0x69,0x25,0x25,0x25,0x69, - 0x25,0x25,0x25,0x69,0x37,0x37,0x37,0x69,0x69,0x69,0x69,0x69,0x40,0x40,0x40,0x69,0x2a,0x2a,0x2a,0x69,0x64,0x64,0x64,0x69, - 0x45,0x45,0x45,0x69,0x25,0x25,0x25,0x69,0x3c,0x3c,0x3c,0x69,0x69,0x69,0x69,0x69,0x33,0x33,0x33,0x69,0x37,0x37,0x37,0x69, - 0x69,0x69,0x69,0x69,0x3c,0x3c,0x3c,0x69,0x25,0x25,0x25,0x69,0x57,0x57,0x57,0x69,0x69,0x69,0x69,0x69,0x25,0x25,0x25,0x69, - 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x4e,0x4e,0x4e,0x69,0x25,0x25,0x25,0x69, - 0x25,0x25,0x25,0x69,0x3c,0x3c,0x3c,0x69,0x25,0x25,0x25,0x69,0x37,0x37,0x37,0x69,0x69,0x69,0x69,0x69,0x3c,0x3c,0x3c,0x69, - 0x25,0x25,0x25,0x69,0x4e,0x4e,0x4e,0x69,0x5f,0x5f,0x5f,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, - 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x57,0x57,0x57,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x2e,0x2e,0x2e,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69, - 0x3c,0x3c,0x3c,0x69,0x2a,0x2a,0x2a,0x69,0x5f,0x5f,0x5f,0x69,0x52,0x52,0x52,0x69,0x25,0x25,0x25,0x69,0x40,0x40,0x40,0x69, - 0x69,0x69,0x69,0x69,0x2e,0x2e,0x2e,0x69,0x25,0x25,0x25,0x69,0x2a,0x2a,0x2a,0x69,0x64,0x64,0x64,0x69,0x45,0x45,0x45,0x69, - 0x25,0x25,0x25,0x69,0x3c,0x3c,0x3c,0x69,0x69,0x69,0x69,0x69,0x33,0x33,0x33,0x69,0x37,0x37,0x37,0x69,0x69,0x69,0x69,0x69, - 0x49,0x49,0x49,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x37,0x37,0x37,0x69,0x69,0x69,0x69,0x69,0x4e,0x4e,0x4e,0x69, - 0x25,0x25,0x25,0x69,0x49,0x49,0x49,0x69,0x69,0x69,0x69,0x69,0x2a,0x2a,0x2a,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69, - 0x3c,0x3c,0x3c,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x40,0x40,0x40,0x69,0x69,0x69,0x69,0x69,0x2e,0x2e,0x2e,0x69, - 0x3c,0x3c,0x3c,0x69,0x69,0x69,0x69,0x69,0x37,0x37,0x37,0x69,0x2a,0x2a,0x2a,0x69,0x45,0x45,0x45,0x69,0x25,0x25,0x25,0x69, - 0x37,0x37,0x37,0x69,0x69,0x69,0x69,0x69,0x33,0x33,0x33,0x69,0x25,0x25,0x25,0x69,0x49,0x49,0x49,0x69,0x64,0x64,0x64,0x69, - 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x3c,0x3c,0x3c,0x69, - 0x69,0x69,0x69,0x69,0x37,0x37,0x37,0x69,0x25,0x25,0x25,0x69,0x64,0x64,0x64,0x69,0x49,0x49,0x49,0x69,0x25,0x25,0x25,0x69, - 0x25,0x25,0x25,0x69,0x5f,0x5f,0x5f,0x69,0x4e,0x4e,0x4e,0x69,0x25,0x25,0x25,0x69,0x69,0x69,0x69,0x69,0x5b,0x5b,0x5b,0x69, - 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x40,0x40,0x40,0x69,0x69,0x69,0x69,0x69,0x2e,0x2e,0x2e,0x69, - 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x69,0x69,0x69,0x69,0x45,0x45,0x45,0x69,0x25,0x25,0x25,0x69,0x37,0x37,0x37,0x69, - 0x69,0x69,0x69,0x69,0x37,0x37,0x37,0x69,0x25,0x25,0x25,0x69,0x37,0x37,0x37,0x69,0x2a,0x2a,0x2a,0x69,0x25,0x25,0x25,0x69, - 0x57,0x57,0x57,0x69,0x5b,0x5b,0x5b,0x69,0x25,0x25,0x25,0x69,0x40,0x40,0x40,0x69,0x69,0x69,0x69,0x69,0x25,0x25,0x25,0x69, - 0x40,0x40,0x40,0x69,0x69,0x69,0x69,0x69,0x2e,0x2e,0x2e,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, - 0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69,0x37,0x37,0x37,0x69,0x25,0x25,0x25,0x69,0x2e,0x2e,0x2e,0x69,0x33,0x33,0x33,0x69, - 0x25,0x25,0x25,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69,0x2a,0x2a,0x2a,0x69,0x25,0x25,0x25,0x69,0x5f,0x5f,0x5f,0x69, - 0x4e,0x4e,0x4e,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x40,0x40,0x40,0x69,0x69,0x69,0x69,0x69,0x2e,0x2e,0x2e,0x69, - 0x37,0x37,0x37,0x69,0x69,0x69,0x69,0x69,0x45,0x45,0x45,0x69,0x25,0x25,0x25,0x69,0x52,0x52,0x52,0x69,0x64,0x64,0x64,0x69, - 0x2a,0x2a,0x2a,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69,0x3c,0x3c,0x3c,0x69,0x2a,0x2a,0x2a,0x69,0x5f,0x5f,0x5f,0x69, - 0x52,0x52,0x52,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, - 0x5f,0x5f,0x5f,0x69,0x45,0x45,0x45,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, - 0x37,0x37,0x37,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x64,0x64,0x64,0x69,0x49,0x49,0x49,0x69, - 0x2e,0x2e,0x2e,0x69,0x25,0x25,0x25,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x3c,0x3c,0x3c,0x69,0x33,0x33,0x33,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x3c,0x3c,0x3c,0x69,0x3c,0x3c,0x3c,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x3c,0x3c,0x3c,0x69, - 0x25,0x25,0x25,0x69,0x2a,0x2a,0x2a,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x52,0x52,0x52,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x33,0x33,0x33,0x69,0x25,0x25,0x25,0x69, + 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x24,0x24,0x2b,0x78,0x2b,0x2b,0x65,0xa4,0x3c,0x3c,0x91,0xb4,0x45,0x45,0x92,0xb4, + 0x4f,0x4f,0x92,0xb4,0x59,0x59,0x92,0xb4,0x63,0x63,0x92,0xb4,0x6c,0x6c,0x92,0xb4,0x66,0x6b,0x7f,0xb4,0x37,0x74,0x3e,0xb4, + 0x28,0x8f,0x28,0xb4,0x37,0x92,0x37,0xb4,0x48,0x92,0x48,0xb4,0x58,0x92,0x58,0xb4,0x68,0x92,0x68,0xb4,0x68,0x7c,0x65,0xb2, + 0x6e,0x4a,0x44,0xb3,0x8f,0x40,0x40,0xb4,0x92,0x49,0x49,0xb4,0x92,0x51,0x51,0xb4,0x92,0x59,0x59,0xb4,0x92,0x62,0x62,0xb4, + 0x92,0x6a,0x6a,0xb4,0x74,0x5b,0x5b,0xac,0x36,0x31,0x31,0x84,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x6f,0x6f,0x6f,0x9c,0x7f,0x7f,0x7f,0xa7, + 0x56,0x56,0x56,0x8a,0x47,0x47,0x47,0x80,0x58,0x58,0x58,0x8c,0x4a,0x4a,0x4a,0x82,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x45,0x45,0x45,0x7e,0x46,0x46,0x46,0x7f,0x62,0x62,0x62,0x93,0x7f,0x7f,0x7f,0xa7, + 0x67,0x67,0x67,0x96,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x37,0x37,0x37,0x75,0x7b,0x7b,0x7b,0xa4,0x7c,0x7c,0x7c,0xa5,0x57,0x57,0x57,0x8b,0x46,0x46,0x46,0x7f, + 0x4f,0x4f,0x4f,0x86,0x6f,0x6f,0x6f,0x9c,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e,0x35,0x35,0x35,0x74,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x45,0x45,0x45,0x7e,0x5a,0x5a,0x5a,0x8d,0x7f,0x7f,0x7f,0xa7,0x72,0x72,0x72,0x9e,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e, + 0x35,0x35,0x35,0x74,0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x42,0x42,0x42,0x7c, + 0x26,0x26,0x26,0x69,0x42,0x42,0x42,0x7c,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x3f,0x3f,0x3f,0x7a,0x7e,0x7e,0x7e,0xa6,0x77,0x77,0x77,0xa1,0x4c,0x4c,0x4c,0x83,0x4d,0x4d,0x4d,0x84, + 0x77,0x77,0x77,0xa1,0x7e,0x7e,0x7e,0xa6,0x3f,0x3f,0x3f,0x7a,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x45,0x45,0x45,0x7e, + 0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e, + 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e, + 0x45,0x45,0x45,0x7e,0x35,0x35,0x35,0x74,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x37,0x37,0x37,0x75,0x7b,0x7b,0x7b,0xa4,0x7c,0x7c,0x7c,0xa5,0x57,0x57,0x57,0x8b,0x46,0x46,0x46,0x7f, + 0x4f,0x4f,0x4f,0x86,0x6f,0x6f,0x6f,0x9c,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x45,0x45,0x45,0x7e, + 0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e,0x35,0x35,0x35,0x74,0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x7c,0x7c,0x7c,0xa4,0x2e,0x2e,0x2e,0x6e,0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x5d,0x5d,0x5d,0x69, + 0x4a,0x4a,0x4a,0x53,0x0f,0x0f,0x0f,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53, + 0x5d,0x5d,0x5d,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x24,0x24,0x25,0x6c, + 0x20,0x20,0x49,0x93,0x29,0x29,0x88,0xb3,0x34,0x34,0x92,0xb4,0x3e,0x3e,0x92,0xb4,0x48,0x48,0x92,0xb4,0x51,0x51,0x92,0xb4, + 0x5b,0x5b,0x92,0xb4,0x65,0x65,0x92,0xb4,0x6f,0x6f,0x91,0xb4,0x5b,0x6b,0x6e,0xb4,0x2d,0x7a,0x31,0xb4,0x2d,0x91,0x2d,0xb4, + 0x3d,0x92,0x3d,0xb4,0x4d,0x92,0x4d,0xb4,0x5d,0x92,0x5d,0xb4,0x6d,0x90,0x6d,0xb4,0x6c,0x6f,0x5e,0xb4,0x7a,0x40,0x3e,0xb4, + 0x91,0x41,0x41,0xb4,0x92,0x4a,0x4a,0xb4,0x92,0x52,0x52,0xb4,0x92,0x5b,0x5b,0xb4,0x92,0x62,0x62,0xb4,0x90,0x6a,0x6a,0xb4, + 0x63,0x4f,0x4f,0xa3,0x2c,0x29,0x29,0x79,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x7d,0x7d,0x7d,0xa6,0x7f,0x7f,0x7f,0xa7,0x3a,0x3a,0x3a,0x78,0x25,0x25,0x25,0x69, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x29,0x29,0x29,0x6c,0x7f,0x7f,0x7f,0xa7,0x7d,0x7d,0x7d,0xa6,0x25,0x25,0x25,0x69, + 0x25,0x25,0x25,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x66,0x66,0x66,0x96, + 0x7f,0x7f,0x7f,0xa7,0x47,0x47,0x47,0x81,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x26,0x26,0x26,0x6a, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x2c,0x2c,0x2c,0x6e,0x2c,0x2c,0x2c,0x6e, + 0x2c,0x2c,0x2c,0x6e,0x29,0x29,0x29,0x6b,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x25,0x25,0x25,0x69, + 0x28,0x28,0x28,0x6b,0x7f,0x7f,0x7f,0xa7,0x7c,0x7c,0x7c,0xa5,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x2c,0x2c,0x2c,0x6e,0x2c,0x2c,0x2c,0x6e,0x2c,0x2c,0x2c,0x6e,0x29,0x29,0x29,0x6b,0x25,0x25,0x25,0x69, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x71,0x71,0x71,0x9d,0x66,0x66,0x66,0x96,0x25,0x25,0x25,0x69,0x68,0x68,0x68,0x97, + 0x71,0x71,0x71,0x9d,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x6a,0x6a,0x6a,0x99, + 0x7f,0x7f,0x7f,0xa7,0x3f,0x3f,0x3f,0x7b,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x40,0x40,0x40,0x7b,0x7f,0x7f,0x7f,0xa7, + 0x69,0x69,0x69,0x98,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x2c,0x2c,0x2c,0x6e,0x2c,0x2c,0x2c,0x6e,0x2c,0x2c,0x2c,0x6e,0x29,0x29,0x29,0x6b, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x66,0x66,0x66,0x96, + 0x7f,0x7f,0x7f,0xa7,0x47,0x47,0x47,0x81,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x26,0x26,0x26,0x6a, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x25,0x25,0x25,0x69, + 0x25,0x25,0x25,0x69,0x7f,0x7f,0x7f,0xa... [truncated message content] |
From: Yaniv K. <yk...@re...> - 2009-12-23 13:46:35
|
repository: /home/tlv/ykamay/open_spice_upload/vdagent branch: master commit f915fa4a72c17e39f750a9154d1a7b4f4eea634e Author: Arnon Gilboa <ag...@re...> Date: Wed Dec 23 15:17:33 2009 +0200 vdagent: add win7 support to service for launching agent diff --git a/common/vdlog.cpp b/common/vdlog.cpp index 19f7a7c..1001de3 100644 --- a/common/vdlog.cpp +++ b/common/vdlog.cpp @@ -84,6 +84,7 @@ void log_version() DWORD handle; TCHAR module_fname[MAX_PATH]; TCHAR* info_buf = NULL; + try { if (!GetModuleFileName(NULL, module_fname, MAX_PATH)) { throw; @@ -110,5 +111,5 @@ void log_version() } catch (...) { vd_printf("get version info failed"); } - delete[] info_buf; + delete[] info_buf; } diff --git a/vdagent/vdagent.rc b/vdagent/vdagent.rc index 0d67f82..0973068 100644 --- a/vdagent/vdagent.rc +++ b/vdagent/vdagent.rc @@ -53,8 +53,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,5,0,0 - PRODUCTVERSION 0,5,0,0 + FILEVERSION 0,5,1,0 + PRODUCTVERSION 0,5,1,0 FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L @@ -71,12 +71,12 @@ BEGIN BEGIN VALUE "CompanyName", "Red Hat Inc." VALUE "FileDescription", "Spice agent" - VALUE "FileVersion", "0, 5, 0, 0" + VALUE "FileVersion", "0, 5, 1, 0" VALUE "InternalName", "vdagent" VALUE "LegalCopyright", "Copyright (c) 2009 Red Hat Inc. and/or its affiliates" VALUE "OriginalFilename", "vdagent.exe" VALUE "ProductName", "Red Hat Spice" - VALUE "ProductVersion", "0, 5, 0, 0" + VALUE "ProductVersion", "0, 5, 1, 0" END END BLOCK "VarFileInfo" diff --git a/vdservice/vdservice.cpp b/vdservice/vdservice.cpp index d3b9502..e8a773c 100644 --- a/vdservice/vdservice.cpp +++ b/vdservice/vdservice.cpp @@ -20,6 +20,7 @@ #include <wtsapi32.h> #include <userenv.h> #include <stdio.h> +#include <tlhelp32.h> #include "vdcommon.h" #include "vdi_port.h" #include "mutex.h" @@ -35,6 +36,9 @@ #define VD_AGENT_RESTART_INTERVAL 3000 #define VD_AGENT_RESTART_COUNT_RESET_INTERVAL 60000 #define VD_EVENTS_COUNT 4 +#define WINLOGON_FILENAME TEXT("winlogon.exe") +#define CREATE_PROC_MAX_RETRIES 10 +#define CREATE_PROC_INTERVAL_MS 500 class VDService { public: @@ -78,6 +82,7 @@ private: DWORD _chunk_size; DWORD _last_agent_restart_time; int _agent_restarts; + int _system_version; bool _pipe_connected; bool _pending_reset; bool _pending_write; @@ -97,6 +102,31 @@ VDService* VDService::get() return (VDService*)_singleton; } +enum SystemVersion { + SYS_VER_UNSUPPORTED, + SYS_VER_WIN_XP, + SYS_VER_WIN_7, +}; + +int supported_system_version() +{ + OSVERSIONINFOEX osvi; + + ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); + if (!GetVersionEx((OSVERSIONINFO*)&osvi)) { + vd_printf("GetVersionEx() failed: %u", GetLastError()); + return 0; + } + if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) { + return SYS_VER_WIN_XP; + } else if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1 && + osvi.wProductType == VER_NT_WORKSTATION) { + return SYS_VER_WIN_7; + } + return 0; +} + VDService::VDService() : _status_handle (0) , _vdi_port (NULL) @@ -117,6 +147,7 @@ VDService::VDService() ZeroMemory(&_agent_proc_info, sizeof(_agent_proc_info)); ZeroMemory(&_pipe_state, sizeof(_pipe_state)); ZeroMemory(_events, sizeof(_events)); + _system_version = supported_system_version(); _control_event = CreateEvent(NULL, FALSE, FALSE, NULL); _pipe_state.read.overlap.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); _agent_path[0] = wchar_t('\0'); @@ -237,7 +268,7 @@ DWORD WINAPI VDService::control_handler(DWORD control, DWORD event_type, LPVOID DWORD session_id = ((WTSSESSION_NOTIFICATION*)event_data)->dwSessionId; vd_printf("Session %u %s", session_id, session_events[event_type]); SetServiceStatus(s->_status_handle, &s->_status); - if (event_type == WTS_CONSOLE_CONNECT) { + if (s->_system_version != SYS_VER_UNSUPPORTED && event_type == WTS_CONSOLE_CONNECT) { s->_session_id = session_id; if (!s->restart_agent(true)) { s->stop(); @@ -412,7 +443,11 @@ bool VDService::execute() break; case WAIT_OBJECT_0 + 3: vd_printf("Agent killed"); - restart_agent(false); + if (_system_version == SYS_VER_WIN_XP) { + restart_agent(false); + } else if (_system_version == SYS_VER_WIN_7) { + kill_agent(); + } break; case WAIT_IO_COMPLETION: case WAIT_TIMEOUT: @@ -600,20 +635,70 @@ BOOL create_session_process_as_user(IN DWORD session_id, IN BOOL use_default_tok return ret; } -bool supported_system_version() +BOOL create_process_as_user(IN DWORD session_id, IN LPCWSTR application_name, + IN LPWSTR command_line, IN LPSECURITY_ATTRIBUTES process_attributes, + IN LPSECURITY_ATTRIBUTES thread_attributes, IN BOOL inherit_handles, + IN DWORD creation_flags, IN LPVOID environment, + IN LPCWSTR current_directory, IN LPSTARTUPINFOW startup_info, + OUT LPPROCESS_INFORMATION process_information) { - OSVERSIONINFOEX osvi; + PROCESSENTRY32 proc_entry; + DWORD winlogon_pid = 0; + HANDLE winlogon_proc; + HANDLE token = NULL; + HANDLE token_dup; + BOOL ret = FALSE; - ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - if (!GetVersionEx((OSVERSIONINFO*)&osvi)) { - vd_printf("GetVersionEx() failed: %u", GetLastError()); + HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (snap == INVALID_HANDLE_VALUE) { + vd_printf("CreateToolhelp32Snapshot() failed %u", GetLastError()); return false; } - if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) { - return true; + ZeroMemory(&proc_entry, sizeof(proc_entry)); + proc_entry.dwSize = sizeof(PROCESSENTRY32); + if (!Process32First(snap, &proc_entry)) { + vd_printf("Process32First() failed %u", GetLastError()); + CloseHandle(snap); + return false; } - return false; + do { + if (_tcsicmp(proc_entry.szExeFile, WINLOGON_FILENAME) == 0) { + DWORD winlogon_session_id = 0; + if (ProcessIdToSessionId(proc_entry.th32ProcessID, &winlogon_session_id) && + winlogon_session_id == session_id) { + winlogon_pid = proc_entry.th32ProcessID; + break; + } + } + } while (Process32Next(snap, &proc_entry)); + CloseHandle(snap); + if (winlogon_pid == 0) { + vd_printf("Winlogon not found"); + return false; + } + winlogon_proc = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, winlogon_pid); + if (!winlogon_proc) { + vd_printf("OpenProcess() failed %u", GetLastError()); + return false; + } + ret = OpenProcessToken(winlogon_proc, TOKEN_DUPLICATE, &token); + CloseHandle(winlogon_proc); + if (!ret) { + vd_printf("OpenProcessToken() failed %u", GetLastError()); + return false; + } + ret = DuplicateTokenEx(token, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, + &token_dup); + CloseHandle(token); + if (!ret) { + vd_printf("DuplicateTokenEx() failed %u", GetLastError()); + return false; + } + ret = CreateProcessAsUser(token_dup, application_name, command_line, process_attributes, + thread_attributes, inherit_handles, creation_flags, environment, + current_directory, startup_info, process_information); + CloseHandle(token_dup); + return ret; } bool VDService::launch_agent() @@ -625,24 +710,29 @@ bool VDService::launch_agent() startup_info.cb = sizeof(startup_info); startup_info.lpDesktop = TEXT("Winsta0\\winlogon"); ZeroMemory(&_agent_proc_info, sizeof(_agent_proc_info)); - if (_session_id == 0) { - ret = CreateProcess(_agent_path, _agent_path, NULL, NULL, FALSE, 0, NULL, NULL, - &startup_info, &_agent_proc_info); - } else { - if (!supported_system_version()) { - vd_printf("create_session_process_as_user is not supported by this system version"); - return false; - } - for (int i = 0; i < 20; i++) { - ret = create_session_process_as_user(_session_id, TRUE, NULL, NULL, _agent_path, NULL, - NULL, FALSE, 0, NULL, NULL, &startup_info, - &_agent_proc_info); - if (ret) { - vd_printf("create_session_process_as_user #%d", i); - break; + if (_system_version == SYS_VER_WIN_XP) { + if (_session_id == 0) { + ret = CreateProcess(_agent_path, _agent_path, NULL, NULL, FALSE, 0, NULL, NULL, + &startup_info, &_agent_proc_info); + } else { + for (int i = 0; i < CREATE_PROC_MAX_RETRIES; i++) { + ret = create_session_process_as_user(_session_id, TRUE, NULL, NULL, _agent_path, + NULL, NULL, FALSE, 0, NULL, NULL, + &startup_info, &_agent_proc_info); + if (ret) { + vd_printf("create_session_process_as_user #%d", i); + break; + } + Sleep(CREATE_PROC_INTERVAL_MS); } - Sleep(500); } + } else if (_system_version == SYS_VER_WIN_7) { + startup_info.lpDesktop = TEXT("Winsta0\\default"); + ret = create_process_as_user(_session_id, _agent_path, _agent_path, NULL, NULL, FALSE, 0, + NULL, NULL, &startup_info, &_agent_proc_info); + } else { + vd_printf("Not supported in this system version"); + return false; } if (!ret) { vd_printf("CreateProcess() failed: %u", GetLastError()); @@ -654,7 +744,7 @@ bool VDService::launch_agent() return false; } vd_printf("Wait for vdagent to connect"); - if (ConnectNamedPipe(_pipe_state.pipe, NULL)) { + if (ConnectNamedPipe(_pipe_state.pipe, NULL) || GetLastError() == ERROR_PIPE_CONNECTED) { _pipe_connected = true; _pending_reset = false; vd_printf("Pipe connected by vdagent"); @@ -929,6 +1019,10 @@ void VDService::write_agent_control(uint32_t type, uint32_t opaque) int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { + if (!supported_system_version()) { + printf("vdservice is not supported in this system version\n"); + return 0; + } VDService* vdservice = VDService::get(); if (argc > 1) { if (lstrcmpi(argv[1], TEXT("install")) == 0) { diff --git a/vdservice/vdservice.rc b/vdservice/vdservice.rc index 6215732..f0bf88f 100644 --- a/vdservice/vdservice.rc +++ b/vdservice/vdservice.rc @@ -53,8 +53,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,5,0,0 - PRODUCTVERSION 0,5,0,0 + FILEVERSION 0,5,1,0 + PRODUCTVERSION 0,5,1,0 FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L @@ -71,12 +71,12 @@ BEGIN BEGIN VALUE "CompanyName", "Red Hat Inc." VALUE "FileDescription", "Spice service" - VALUE "FileVersion", "0, 5, 0, 0" + VALUE "FileVersion", "0, 5, 1, 0" VALUE "InternalName", "vdservice" VALUE "LegalCopyright", "Copyright (c) 2009 Red Hat Inc. and/or its affiliates" VALUE "OriginalFilename", "vdservice.exe" VALUE "ProductName", "Red Hat Spice" - VALUE "ProductVersion", "0, 5, 0, 0" + VALUE "ProductVersion", "0, 5, 1, 0" END END BLOCK "VarFileInfo" |
From: Yaniv K. <yk...@re...> - 2009-12-22 23:48:34
|
repository: /home/tlv/ykamay/open_spice_upload/vdesktop branch: master commit 75b614a407938beff2dcbc796f1acbd3cf0f585f Author: Yaniv Kamay <yk...@re...> Date: Wed Dec 23 01:37:57 2009 +0200 qxl: deffer vga updates in case commands ring is full diff --git a/qemu/hw/qxl.c b/qemu/hw/qxl.c index e869c81..60210ef 100644 --- a/qemu/hw/qxl.c +++ b/qemu/hw/qxl.c @@ -41,10 +41,6 @@ #define TRUE 1 #define FALSE 0 -#define WAIT_CMD_DELAY_MS 10 -#define WAIT_CMD_MESSAGE_THRESHOLD 2 -#define WAIT_CMD_MESSAGE_INTERVAL_MS 5000 - #define QXL_DEV_NAME "qxl" #define VDI_PORT_DEV_NAME "vdi_port" @@ -155,6 +151,7 @@ struct PCIQXLDevice { QXLState state; int id; DisplayState ds; + Rect dirty_rect; struct PCIQXLDevice *dev_next; struct PCIQXLDevice *vga_next; int pipe_fd[2]; @@ -235,6 +232,7 @@ typedef struct QXLVga { PCIQXLDevice *clients; int active_clients; QEMUTimer *timer; + int need_update; } QXLVga; static void qxl_exit_vga_mode(PCIQXLDevice *d); @@ -691,6 +689,7 @@ static void qxl_enter_vga_mode(PCIQXLDevice *d) printf("%u: %s\n", d->id, __FUNCTION__); d->state.rom->mode = ~0; d->state.mode = QXL_MODE_VGA; + memset(&d->dirty_rect, 0, sizeof(d->dirty_rect)); qxl_notify_mode_change(d); qxl_add_vga_client(); } @@ -1364,12 +1363,54 @@ inline uint32_t msb_mask(uint32_t val) return mask; } +static int rect_is_empty(const Rect* r) +{ + return r->top == r->bottom || r->left == r->right; +} + +static void rect_union(Rect *dest, const Rect *r) +{ + if (rect_is_empty(r)) { + return; + } + + if (rect_is_empty(dest)) { + *dest = *r; + return; + } + + dest->top = MIN(dest->top, r->top); + dest->left = MIN(dest->left, r->left); + dest->bottom = MAX(dest->bottom, r->bottom); + dest->right = MAX(dest->right, r->right); +} + static void qxl_display_update(struct DisplayState *ds, int x, int y, int w, int h) { PCIQXLDevice *client; + Rect update_area; - client = qxl_vga.clients; - while (client) { + qxl_vga.need_update = TRUE; + + update_area.left = x, + update_area.right = x + w; + update_area.top = y; + update_area.bottom = y + h; + + for (client = qxl_vga.clients; client; client = client->vga_next) { + if (client->state.mode == QXL_MODE_VGA && client->state.running) { + rect_union(&client->dirty_rect, &update_area); + } + } +} + +static void qxl_vga_update(void) +{ + PCIQXLDevice *client; + + qxl_vga.need_update = FALSE; + + for (client = qxl_vga.clients; client; client = client->vga_next) { if (client->state.mode == QXL_MODE_VGA && client->state.running) { QXLDrawable *drawable; QXLImage *image; @@ -1377,15 +1418,27 @@ static void qxl_display_update(struct DisplayState *ds, int x, int y, int w, int QXLCommand *cmd; int wait; int notify; - int wait_count; + Rect *dirty_rect = &client->dirty_rect; + + if (rect_is_empty(dirty_rect)) { + continue; + } + + ring = &client->state.vga_ring; + RING_PROD_WAIT(ring, wait); + if (wait) { + qxl_vga.need_update = TRUE; + continue; + } drawable = (QXLDrawable *)malloc(sizeof(*drawable) + sizeof(*image)); - ASSERT(drawable); + if (!drawable) { + printf("%s: alloc drawable failed\n", __FUNCTION__); + abort(); + } + image = (QXLImage *)(drawable + 1); - drawable->bbox.left = x; - drawable->bbox.right = x + w; - drawable->bbox.top = y; - drawable->bbox.bottom = y + h; + drawable->bbox = *dirty_rect; drawable->clip.type = CLIP_TYPE_NONE; drawable->clip.data = 0; drawable->effect = QXL_EFFECT_OPAQUE; @@ -1396,8 +1449,8 @@ static void qxl_display_update(struct DisplayState *ds, int x, int y, int w, int drawable->u.copy.rop_decriptor = ROPD_OP_PUT; drawable->u.copy.src_bitmap = (PHYSICAL)image; drawable->u.copy.src_area.left = drawable->u.copy.src_area.top = 0; - drawable->u.copy.src_area.right = w; - drawable->u.copy.src_area.bottom = h; + drawable->u.copy.src_area.right = dirty_rect->right - dirty_rect->left; + drawable->u.copy.src_area.bottom = dirty_rect->bottom - dirty_rect->top; drawable->u.copy.scale_mode = 0; memset(&drawable->u.copy.mask, 0, sizeof(QMask)); @@ -1406,26 +1459,12 @@ static void qxl_display_update(struct DisplayState *ds, int x, int y, int w, int QXL_SET_IMAGE_ID(image, QXL_IMAGE_GROUP_DEVICE, ++client->state.bits_unique); image->bitmap.flags = QXL_BITMAP_DIRECT | QXL_BITMAP_TOP_DOWN | QXL_BITMAP_UNSTABLE; image->bitmap.format = BITMAP_FMT_32BIT; - image->bitmap.stride = ds->linesize; - image->descriptor.width = image->bitmap.x = w; - image->descriptor.height = image->bitmap.y = h; - image->bitmap.data = (PHYSICAL)(ds->data + y * ds->linesize + x * 4); + image->bitmap.stride = qxl_vga.ds->linesize; + image->descriptor.width = image->bitmap.x = drawable->u.copy.src_area.right; + image->descriptor.height = image->bitmap.y = drawable->u.copy.src_area.bottom; + image->bitmap.data = (PHYSICAL)(qxl_vga.ds->data + dirty_rect->top * qxl_vga.ds->linesize + dirty_rect->left * 4); image->bitmap.palette = 0; - ring = &client->state.vga_ring; - wait_count = -WAIT_CMD_MESSAGE_THRESHOLD; - for (;;) { - RING_PROD_WAIT(ring, wait); - if (wait) { - usleep(WAIT_CMD_DELAY_MS * 1000); - if (!(wait_count++ % (WAIT_CMD_MESSAGE_INTERVAL_MS / WAIT_CMD_DELAY_MS))) { - printf("%s: waiting for command\n", __FUNCTION__); - } - continue; - } - break; - } - cmd = RING_PROD_ITEM(ring); cmd->type = QXL_CMD_DRAW; cmd->data = (PHYSICAL)drawable; @@ -1433,8 +1472,8 @@ static void qxl_display_update(struct DisplayState *ds, int x, int y, int w, int if (notify) { client->worker->wakeup(client->worker); } + memset(dirty_rect, 0, sizeof(*dirty_rect)); } - client = client->vga_next; } } @@ -1467,6 +1506,9 @@ static void qxl_display_refresh(struct DisplayState *ds) { if (qxl_vga.active_clients) { vga_hw_update(); + if (qxl_vga.need_update) { + qxl_vga_update(); + } } } @@ -2210,7 +2252,7 @@ void qxl_init(PCIBus *bus, uint8_t *vram, unsigned long vram_offset, } d->state.num_ranges = num_ranges + 1; - printf("%s: rom(%p, 0x%x, 0x%x) ram(%p, 0x%x, 0x%x) vram(%p, 0x%lx, 0x%x)\n", + printf("%s: rom(%p, 0x%lx, 0x%x) ram(%p, 0x%lx, 0x%x) vram(%p, 0x%lx, 0x%x)\n", __FUNCTION__, d->state.rom, d->state.rom_offset, |
From: Yaniv K. <yk...@re...> - 2009-12-22 19:39:31
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: master commit cb0cd69933829cd5d346e4b466c11c35c6fe8efb Author: Izik Eidus <ie...@re...> Date: Tue Dec 22 06:52:14 2009 +0200 spice: fix ssl compiling errors (openssl api was changed, so lets have ifdef to compile in all cases) Signed-off-by: Izik Eidus <ie...@re...> diff --git a/client/red_peer.cpp b/client/red_peer.cpp index dad035d..79409ed 100644 --- a/client/red_peer.cpp +++ b/client/red_peer.cpp @@ -132,7 +132,11 @@ void RedPeer::connect_secure(const ConnectionOptions& options, uint32_t ip) ASSERT(_ctx == NULL && _ssl == NULL && _peer != INVALID_SOCKET); try { +#if OPENSSL_VERSION_NUMBER >= 0x10000000L + const SSL_METHOD *ssl_method = TLSv1_method(); +#else SSL_METHOD *ssl_method = TLSv1_method(); +#endif _ctx = SSL_CTX_new(ssl_method); if (_ctx == NULL) { diff --git a/server/reds.c b/server/reds.c index c10f0ca..2bb707b 100644 --- a/server/reds.c +++ b/server/reds.c @@ -3165,7 +3165,11 @@ static void openssl_thread_setup() static void reds_init_ssl() { +#if OPENSSL_VERSION_NUMBER >= 0x10000000L + const SSL_METHOD *ssl_method; +#else SSL_METHOD *ssl_method; +#endif int return_code; long ssl_options = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3; |
From: Yaniv K. <yk...@re...> - 2009-12-22 19:35:05
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: master commit e93ef13b8f2d2880b02271306cd3b6889e51373c Author: Izik Eidus <ie...@re...> Date: Thu Dec 17 20:45:09 2009 +0200 spice: client: add checks to see if it is safe to use XShem. Beacuse that XShem internal checks wont fail when using the spice client from remote, we are adding check on the socket family to see if it is unix domain socket and fail in case it is not. Signed-off-by: Izik Eidus <ie...@re...> diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp index 1ac45ef..d13c9fe 100644 --- a/client/x11/platform.cpp +++ b/client/x11/platform.cpp @@ -26,7 +26,9 @@ #include <X11/extensions/render.h> #include <X11/extensions/XKB.h> #include <X11/extensions/Xrender.h> +#include <X11/extensions/XShm.h> #include <unistd.h> +#include <sys/socket.h> #include <sys/epoll.h> #include <sys/resource.h> #include <sys/types.h> @@ -63,6 +65,7 @@ #endif static Display* x_display = NULL; +static bool x_shm_avail = false; static XVisualInfo **vinfo = NULL; static GLXFBConfig **fb_config = NULL; static XIM x_input_method = NULL; @@ -185,6 +188,11 @@ Display* XPlatform::get_display() return x_display; } +bool XPlatform::is_x_shm_avail() +{ + return x_shm_avail; +} + XVisualInfo** XPlatform::get_vinfo() { return vinfo; @@ -2095,6 +2103,9 @@ void Platform::init() { int err, ev; int threads_enable; + int connection_fd; + socklen_t sock_len; + struct sockaddr sock_addr; DBG(0, ""); @@ -2107,6 +2118,12 @@ void Platform::init() THROW("open X display failed"); } + connection_fd = ConnectionNumber(x_display); + if (!getsockname(connection_fd, &sock_addr, &sock_len) && + XShmQueryExtension(x_display) && sock_addr.sa_family == AF_UNIX ) { + x_shm_avail = true; + } + vinfo = new XVisualInfo *[ScreenCount(x_display)]; memset(vinfo, 0, sizeof(XVisualInfo *) * ScreenCount(x_display)); fb_config = new GLXFBConfig *[ScreenCount(x_display)]; diff --git a/client/x11/red_pixmap_cairo.cpp b/client/x11/red_pixmap_cairo.cpp index d15c35c..795c8a0 100644 --- a/client/x11/red_pixmap_cairo.cpp +++ b/client/x11/red_pixmap_cairo.cpp @@ -36,6 +36,7 @@ RedPixmapCairo::RedPixmapCairo(int width, int height, RedPixmap::Format format, XShmSegmentInfo *shminfo = NULL; _data = NULL; XVisualInfo *vinfo = NULL; + bool using_shm = false; try { @@ -45,7 +46,9 @@ RedPixmapCairo::RedPixmapCairo(int width, int height, RedPixmap::Format format, vinfo = XPlatform::get_vinfo()[win->get_screen_num()]; } - if (vinfo && XShmQueryExtension(XPlatform::get_display())) { + using_shm = vinfo && XPlatform::is_x_shm_avail(); + + if (using_shm) { int depth; switch (format) { @@ -146,14 +149,14 @@ RedPixmapCairo::RedPixmapCairo(int width, int height, RedPixmap::Format format, if (cairo_status(cairo) != CAIRO_STATUS_SUCCESS) { THROW("cairo create failed failed"); } - if (!(vinfo && XShmQueryExtension(XPlatform::get_display()))) { + if (!using_shm) { ((PixelsSource_p*)get_opaque())->pixmap.cairo_surf = cairo_surf; } else { ((PixelsSource_p*)get_opaque())->x_shm_drawable.cairo_surf = cairo_surf; } ((RedDrawable_p*)get_opaque())->cairo = cairo; } catch (...) { - if (vinfo && XShmQueryExtension(XPlatform::get_display())) { + if (using_shm) { if (image) { XDestroyImage(image); } diff --git a/client/x11/x_platform.h b/client/x11/x_platform.h index 3d3fd8f..8423e66 100644 --- a/client/x11/x_platform.h +++ b/client/x11/x_platform.h @@ -31,6 +31,8 @@ public: static void on_focus_in(); static void on_focus_out(); + + static bool is_x_shm_avail(); }; #endif |
From: Yaniv K. <yk...@re...> - 2009-12-21 17:25:05
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: master commit aa1481378f5fec8ea8d68f55909eea8cbae5b143 Author: Yaniv Kamay <yk...@re...> Date: Mon Dec 21 19:06:11 2009 +0200 spice: sever: increase client timeout Increase client timeout in order to prevent unnecessary disconnecting of client while the connection is over WAN. Tested by changing WinXP resolution (with desktop background) while connecting over WAN (1.5Mbit 150Kbit) diff --git a/server/red_worker.c b/server/red_worker.c index 11d3ce6..575605c 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -62,10 +62,10 @@ #define CMD_RING_POLL_TIMEOUT 10 //milli #define CMD_RING_POLL_RETRIES 200 -#define DETACH_TIMEOUT 4000000000 //nano +#define DETACH_TIMEOUT 15000000000ULL //nano #define DETACH_SLEEP_DURATION 10000 //micro -#define DISPLAY_CLIENT_TIMEOUT 4000000000 //nano +#define DISPLAY_CLIENT_TIMEOUT 15000000000ULL //nano #define DISPLAY_CLIENT_RETRY_INTERVAL 10000 //micro #define DISPLAY_MAX_SUB_MESSAGES 10 |
From: Yaniv K. <yk...@re...> - 2009-12-21 11:28:28
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: master commit 31dff987ecb7090306621d1be0f7493868348c8d Author: Yaniv Kamay <yk...@re...> Date: Mon Dec 21 00:29:39 2009 +0200 spice: sever: remove assert on nop copy bits diff --git a/server/red_worker.c b/server/red_worker.c index 436bfa2..11d3ce6 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -3297,7 +3297,9 @@ static void add_clip_rects(RedWorker *worker, QRegion *rgn, PHYSICAL data) static inline Shadow *__new_shadow(RedWorker *worker, Drawable *item, Point *delta) { - ASSERT(delta->x || delta->y); + if (!delta->x && !delta->y) { + return NULL; + } Shadow *shadow = malloc(sizeof(Shadow)); if (!shadow) { |