From 8b797180eef47af9997e7658a0d0e30baa42d2aa Mon Sep 17 00:00:00 2001 From: Uri Lublin Date: Thu, 22 Dec 2011 11:19:14 +0200 Subject: [PATCH 01/47] client: screen: fix typo _forec_update_timer sed -i 's/_forec_update_timer/_force_update_timer/' screen.cpp screen.h --- client/screen.cpp | 10 +++++----- client/screen.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/client/screen.cpp b/client/screen.cpp index a0dc0dfa..dc334559 100644 --- a/client/screen.cpp +++ b/client/screen.cpp @@ -88,7 +88,7 @@ RedScreen::RedScreen(Application& owner, int id, const std::string& name, int wi , _update_by_timer (true) , _size_locked (false) , _menu_needs_update (false) - , _forec_update_timer (0) + , _force_update_timer (0) , _update_timer (new UpdateTimer(this)) , _composit_area (NULL) , _update_mark (1) @@ -402,7 +402,7 @@ void RedScreen::periodic_update() if (is_dirty()) { need_update = true; } else { - if (!_forec_update_timer) { + if (!_force_update_timer) { _owner.deactivate_interval_timer(*_update_timer); _periodic_update = false; } @@ -742,14 +742,14 @@ void RedScreen::on_stop_key_interception() void RedScreen::enter_modal_loop() { - _forec_update_timer++; + _force_update_timer++; activate_timer(); } void RedScreen::exit_modal_loop() { - ASSERT(_forec_update_timer > 0) - _forec_update_timer--; + ASSERT(_force_update_timer > 0) + _force_update_timer--; } void RedScreen::pre_migrate() diff --git a/client/screen.h b/client/screen.h index 6c470ca1..19efffb8 100644 --- a/client/screen.h +++ b/client/screen.h @@ -179,7 +179,7 @@ private: bool _update_by_timer; bool _size_locked; bool _menu_needs_update; - int _forec_update_timer; + int _force_update_timer; AutoRef _update_timer; RedDrawable* _composit_area; uint64_t _update_mark; From fe001ca19df448104b9cd29d19edb7ebd32fe9bf Mon Sep 17 00:00:00 2001 From: Yonit Halperin Date: Thu, 22 Dec 2011 12:51:41 +0200 Subject: [PATCH 02/47] server: don't reset the display channel when disconnecting all its clients ,FDBZ #43977 The display channel was unnecessarily set to NULL when we disconnect all the clients (on flush display commands timeout). As a result, we recreated the display channel when a new client was connected. The display channel was created with default red_channel.client_cbs, while its correct client_cbs are the ones that are set by the red_dispatcher when it creates the first display_channel. This fix enforces a single creation of the display channel (per qxl), via the red_dispatcher. --- server/red_worker.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/server/red_worker.c b/server/red_worker.c index cb48f09e..0d873ed3 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -8660,18 +8660,13 @@ static void display_channel_client_on_disconnect(RedChannelClient *rcc) void red_disconnect_all_display_TODO_remove_me(RedChannel *channel) { - DisplayChannel *display_channel; - RedWorker *worker; // TODO: we need to record the client that actually causes the timeout. So // we need to check the locations of the various pipe heads when counting, // and disconnect only those/that. if (!channel) { return; } - display_channel = SPICE_CONTAINEROF(channel, DisplayChannel, common.base); - worker = display_channel->common.worker; red_channel_apply_clients(channel, display_channel_client_disconnect); - worker->display_channel = NULL; } static void red_migrate_display(RedWorker *worker, RedChannelClient *rcc) @@ -9707,7 +9702,7 @@ static void display_channel_release_item(RedChannelClient *rcc, PipeItem *item, } } -static void ensure_display_channel_created(RedWorker *worker, int migrate) +static void display_channel_create(RedWorker *worker, int migrate) { DisplayChannel *display_channel; @@ -9761,8 +9756,8 @@ static void handle_new_display_channel(RedWorker *worker, RedClient *client, Red size_t stream_buf_size; int is_low_bandwidth = main_channel_client_is_low_bandwidth(red_client_get_main(client)); - ensure_display_channel_created(worker, migrate); if (!worker->display_channel) { + red_printf("Warning: Display channel was not created"); return; } display_channel = worker->display_channel; @@ -9925,7 +9920,7 @@ static void cursor_channel_release_item(RedChannelClient *rcc, PipeItem *item, i } } -static void ensure_cursor_channel_created(RedWorker *worker, int migrate) +static void cursor_channel_create(RedWorker *worker, int migrate) { if (worker->cursor_channel != NULL) { return; @@ -9951,9 +9946,8 @@ static void red_connect_cursor(RedWorker *worker, RedClient *client, RedsStream CursorChannel *channel; CursorChannelClient *ccc; - ensure_cursor_channel_created(worker, migrate); if (worker->cursor_channel == NULL) { - red_printf("failed to create cursor channel"); + red_printf("Warning: cursor channel was not created"); return; } channel = worker->cursor_channel; @@ -10514,7 +10508,7 @@ void handle_dev_display_channel_create(void *opaque, void *payload) RedChannel *red_channel; // TODO: handle seemless migration. Temp, setting migrate to FALSE - ensure_display_channel_created(worker, FALSE); + display_channel_create(worker, FALSE); red_channel = &worker->display_channel->common.base; send_data(worker->channel, &red_channel, sizeof(RedChannel *)); } @@ -10559,7 +10553,7 @@ void handle_dev_cursor_channel_create(void *opaque, void *payload) RedChannel *red_channel; // TODO: handle seemless migration. Temp, setting migrate to FALSE - ensure_cursor_channel_created(worker, FALSE); + cursor_channel_create(worker, FALSE); red_channel = &worker->cursor_channel->common.base; send_data(worker->channel, &red_channel, sizeof(RedChannel *)); } From 3435df1234a8bd3cca25ffd7e4b48f2142267a1c Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Thu, 22 Dec 2011 12:13:19 +0100 Subject: [PATCH 03/47] spicevmc: Set sockopt nodelay for usbredir channels We want as little latency as possible with usb channels. Signed-off-by: Hans de goede --- server/spicevmc.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/server/spicevmc.c b/server/spicevmc.c index b1a7d8dc..bed84887 100644 --- a/server/spicevmc.c +++ b/server/spicevmc.c @@ -23,6 +23,10 @@ #endif #include +#include +#include +#include // IPPROTO_TCP +#include // TCP_NODELAY #include "server/char_device.h" #include "server/red_channel.h" @@ -82,6 +86,17 @@ static void spicevmc_chardev_wakeup(SpiceCharDeviceInstance *sin) static int spicevmc_red_channel_client_config_socket(RedChannelClient *rcc) { + int delay_val = 1; + RedsStream *stream = red_channel_client_get_stream(rcc); + + if (rcc->channel->type == SPICE_CHANNEL_USBREDIR) { + if (setsockopt(stream->socket, IPPROTO_TCP, TCP_NODELAY, + &delay_val, sizeof(delay_val)) != 0) { + red_printf("setsockopt failed, %s", strerror(errno)); + return FALSE; + } + } + return TRUE; } From 4eb78d39c5acd33e419a6d9203557d309e3d7873 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Mon, 12 Dec 2011 16:52:28 +0000 Subject: [PATCH 04/47] Merge reds_accept_connection into reds_accept Neither reds_accept_connection or reds_accept are very long, so the split is pointless & increases code size for no gain. Merge them together to reduce code size * server/reds.c: Merge reds_accept_connection into reds_accept Signed-off-by: Daniel P. Berrange --- server/reds.c | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/server/reds.c b/server/reds.c index acd8495f..10ebf193 100644 --- a/server/reds.c +++ b/server/reds.c @@ -2736,22 +2736,6 @@ error: return NULL; } -static RedLinkInfo *reds_accept_connection(int listen_socket) -{ - RedLinkInfo *link; - RedsStream *stream; - - if (!(link = __reds_accept_connection(listen_socket))) { - return NULL; - } - - stream = link->stream; - stream->read = stream_read_cb; - stream->write = stream_write_cb; - stream->writev = stream_writev_cb; - - return link; -} static void reds_accept_ssl_connection(int fd, int event, void *data) { @@ -2814,12 +2798,18 @@ error: static void reds_accept(int fd, int event, void *data) { RedLinkInfo *link; + RedsStream *stream; - link = reds_accept_connection(reds->listen_socket); - if (link == NULL) { + if (!(link = __reds_accept_connection(reds->listen_socket))) { red_printf("accept failed"); return; } + + stream = link->stream; + stream->read = stream_read_cb; + stream->write = stream_write_cb; + stream->writev = stream_writev_cb; + reds_handle_new_link(link); } From 3a3a32ebbc3dbb644bdf53394ce5f925a7398f3a Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Mon, 12 Dec 2011 16:52:29 +0000 Subject: [PATCH 05/47] Rename __reds_accept_connection into reds_init_client_connection Remove the accept() call from __reds_accept_connection and rename it to reds_init_client_connection. The caller is now responsible for accepting the new socket. The method reds_init_client_connection merely initializes it for usage. * server/reds.c: Add reds_init_client_connection Signed-off-by: Daniel P. Berrange --- server/reds.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/server/reds.c b/server/reds.c index 10ebf193..fea09ad6 100644 --- a/server/reds.c +++ b/server/reds.c @@ -2687,18 +2687,12 @@ static void reds_handle_ssl_accept(int fd, int event, void *data) reds_handle_new_link(link); } -static RedLinkInfo *__reds_accept_connection(int listen_socket) +static RedLinkInfo *reds_init_client_connection(int socket) { RedLinkInfo *link; RedsStream *stream; int delay_val = 1; int flags; - int socket; - - if ((socket = accept(listen_socket, NULL, 0)) == -1) { - red_printf("accept failed, %s", strerror(errno)); - return NULL; - } if ((flags = fcntl(socket, F_GETFL)) == -1) { red_printf("accept failed, %s", strerror(errno)); @@ -2731,8 +2725,6 @@ static RedLinkInfo *__reds_accept_connection(int listen_socket) return link; error: - close(socket); - return NULL; } @@ -2743,12 +2735,17 @@ static void reds_accept_ssl_connection(int fd, int event, void *data) int return_code; int ssl_error; BIO *sbio; + int socket; - link = __reds_accept_connection(reds->secure_listen_socket); - if (link == NULL) { + if ((socket = accept(reds->secure_listen_socket, NULL, 0)) == -1) { + red_printf("accept failed, %s", strerror(errno)); return; } + link = reds_init_client_connection(socket); + if (link == NULL) + goto error; + // Handle SSL handshaking if (!(sbio = BIO_new_socket(link->stream->socket, BIO_NOCLOSE))) { red_printf("could not allocate ssl bio socket"); @@ -2789,7 +2786,7 @@ static void reds_accept_ssl_connection(int fd, int event, void *data) SSL_free(link->stream->ssl); error: - close(link->stream->socket); + close(socket); free(link->stream); BN_free(link->tiTicketing.bn); free(link); @@ -2799,9 +2796,17 @@ static void reds_accept(int fd, int event, void *data) { RedLinkInfo *link; RedsStream *stream; + int socket; - if (!(link = __reds_accept_connection(reds->listen_socket))) { + if ((socket = accept(reds->listen_socket, NULL, 0)) == -1) { + red_printf("accept failed, %s", strerror(errno)); + return; + } + + + if (!(link = reds_init_client_connection(socket))) { red_printf("accept failed"); + close(socket); return; } From 803be1bea790381e30ef0eb0752992736441b4ff Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Mon, 12 Dec 2011 16:52:30 +0000 Subject: [PATCH 06/47] Move SSL setup out of reds_accept_ssl_connection To allow setup of an SSL client, from a passed in client socket, move all the SSL client initialization code out of reds_accept_ssl_connection and into a new method called reds_init_client_ssl_connection * server/reds.c: Introduce reds_init_client_ssl_connection Signed-off-by: Daniel P. Berrange --- server/reds.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/server/reds.c b/server/reds.c index fea09ad6..3ba55c1b 100644 --- a/server/reds.c +++ b/server/reds.c @@ -2729,18 +2729,12 @@ error: } -static void reds_accept_ssl_connection(int fd, int event, void *data) +static RedLinkInfo *reds_init_client_ssl_connection(int socket) { RedLinkInfo *link; int return_code; int ssl_error; BIO *sbio; - int socket; - - if ((socket = accept(reds->secure_listen_socket, NULL, 0)) == -1) { - red_printf("accept failed, %s", strerror(errno)); - return; - } link = reds_init_client_connection(socket); if (link == NULL) @@ -2768,7 +2762,7 @@ static void reds_accept_ssl_connection(int fd, int event, void *data) return_code = SSL_accept(link->stream->ssl); if (return_code == 1) { reds_handle_new_link(link); - return; + return link; } ssl_error = SSL_get_error(link->stream->ssl, return_code); @@ -2778,7 +2772,7 @@ static void reds_accept_ssl_connection(int fd, int event, void *data) SPICE_WATCH_EVENT_READ : SPICE_WATCH_EVENT_WRITE; link->stream->watch = core->watch_add(link->stream->socket, eventmask, reds_handle_ssl_accept, link); - return; + return link; } ERR_print_errors_fp(stderr); @@ -2786,12 +2780,29 @@ static void reds_accept_ssl_connection(int fd, int event, void *data) SSL_free(link->stream->ssl); error: - close(socket); free(link->stream); BN_free(link->tiTicketing.bn); free(link); + return NULL; } +static void reds_accept_ssl_connection(int fd, int event, void *data) +{ + RedLinkInfo *link; + int socket; + + if ((socket = accept(reds->secure_listen_socket, NULL, 0)) == -1) { + red_printf("accept failed, %s", strerror(errno)); + return; + } + + if (!(link = reds_init_client_ssl_connection(socket))) { + close(socket); + return; + } +} + + static void reds_accept(int fd, int event, void *data) { RedLinkInfo *link; From d55b68b6b44f2499278fa860fb47ff22f5011faa Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Mon, 12 Dec 2011 16:52:31 +0000 Subject: [PATCH 07/47] Add APIs for injecting a client connection socket Allow applications to pass a pre-accepted client socket file descriptor in. The new APIs are spice_server_add_ssl_client and spice_server_add_client * server/reds.c: Implement new APIs * server/spice.h: Define new APIs Signed-off-by: Daniel P. Berrange --- server/reds.c | 29 +++++++++++++++++++++++++---- server/spice-server.syms | 5 +++++ server/spice.h | 3 +++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/server/reds.c b/server/reds.c index 3ba55c1b..a8c23d3c 100644 --- a/server/reds.c +++ b/server/reds.c @@ -2805,8 +2805,6 @@ static void reds_accept_ssl_connection(int fd, int event, void *data) static void reds_accept(int fd, int event, void *data) { - RedLinkInfo *link; - RedsStream *stream; int socket; if ((socket = accept(reds->listen_socket, NULL, 0)) == -1) { @@ -2814,11 +2812,20 @@ static void reds_accept(int fd, int event, void *data) return; } + if (spice_server_add_client(reds, socket) < 0) + close(socket); +} + +SPICE_GNUC_VISIBLE int spice_server_add_client(SpiceServer *s, int socket) +{ + RedLinkInfo *link; + RedsStream *stream; + + ASSERT(reds == s); if (!(link = reds_init_client_connection(socket))) { red_printf("accept failed"); - close(socket); - return; + return -1; } stream = link->stream; @@ -2827,8 +2834,22 @@ static void reds_accept(int fd, int event, void *data) stream->writev = stream_writev_cb; reds_handle_new_link(link); + return 0; } + +SPICE_GNUC_VISIBLE int spice_server_add_ssl_client(SpiceServer *s, int socket) +{ + RedLinkInfo *link; + + ASSERT(reds == s); + if (!(link = reds_init_client_ssl_connection(socket))) { + return -1; + } + return 0; +} + + static int reds_init_socket(const char *addr, int portnr, int family) { static const int on=1, off=0; diff --git a/server/spice-server.syms b/server/spice-server.syms index 3f93888a..d9beec35 100644 --- a/server/spice-server.syms +++ b/server/spice-server.syms @@ -96,3 +96,8 @@ global: spice_server_get_num_clients; } SPICE_SERVER_0.8.3; +SPICE_SERVER_0.10.1 { +global: + spice_server_add_client; + spice_server_add_ssl_client; +} SPICE_SERVER_0.10.0; diff --git a/server/spice.h b/server/spice.h index 974975a7..fbd409a9 100644 --- a/server/spice.h +++ b/server/spice.h @@ -425,6 +425,9 @@ int spice_server_set_tls(SpiceServer *s, int port, const char *private_key_file, const char *key_passwd, const char *dh_key_file, const char *ciphersuite); +int spice_server_add_client(SpiceServer *s, int socket); +int spice_server_add_ssl_client(SpiceServer *s, int socket); + int spice_server_add_interface(SpiceServer *s, SpiceBaseInstance *sin); int spice_server_remove_interface(SpiceBaseInstance *sin); From bd07dde530d9504e1cfe7ed5837fc00c26f36716 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Mon, 12 Dec 2011 16:52:32 +0000 Subject: [PATCH 08/47] Allow auth to be skipped when attaching to pre-accepted clients When an applications passes in a pre-accepted socket for a client, they may well have already performed suitable authentication out of band. They should thus have the option to request that any spice authentication is skipped. * server/reds.c, spice.h: Add flag for skipping auth Signed-off-by: Daniel P. Berrange --- server/reds.c | 21 +++++++++++++-------- server/spice.h | 4 ++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/server/reds.c b/server/reds.c index a8c23d3c..b97a061e 100644 --- a/server/reds.c +++ b/server/reds.c @@ -263,6 +263,7 @@ typedef struct RedLinkInfo { int mess_pos; TicketInfo tiTicketing; SpiceLinkAuthMechanism auth_mechanism; + int skip_auth; } RedLinkInfo; typedef struct VDIPortBuf VDIPortBuf; @@ -1387,9 +1388,9 @@ static int sync_write(RedsStream *stream, const void *in_buf, size_t n) return TRUE; } -static void reds_channel_init_auth_caps(RedChannel *channel) +static void reds_channel_init_auth_caps(RedLinkInfo *link, RedChannel *channel) { - if (sasl_enabled) { + if (sasl_enabled && !link->skip_auth) { red_channel_set_common_cap(channel, SPICE_COMMON_CAP_AUTH_SASL); } else { red_channel_set_common_cap(channel, SPICE_COMMON_CAP_AUTH_SPICE); @@ -1421,7 +1422,7 @@ static int reds_send_link_ack(RedLinkInfo *link) channel = &reds->main_channel->base; } - reds_channel_init_auth_caps(channel); /* make sure common caps are set */ + reds_channel_init_auth_caps(link, channel); /* make sure common caps are set */ channel_caps = &channel->local_caps; ack.num_common_caps = channel_caps->num_common_caps; @@ -1822,7 +1823,7 @@ static void reds_handle_ticket(void *opaque) link->tiTicketing.encrypted_ticket.encrypted_data, (unsigned char *)password, link->tiTicketing.rsa, RSA_PKCS1_OAEP_PADDING); - if (ticketing_enabled) { + if (ticketing_enabled && !link->skip_auth) { int expired = taTicket.expiration_time < ltime; if (strlen(taTicket.password) == 0) { @@ -2584,7 +2585,7 @@ static void reds_handle_read_link_done(void *opaque) } if (!auth_selection) { - if (sasl_enabled) { + if (sasl_enabled && !link->skip_auth) { red_printf("SASL enabled, but peer supports only spice authentication"); reds_send_link_error(link, SPICE_LINK_ERR_VERSION_MISMATCH); return; @@ -2812,12 +2813,12 @@ static void reds_accept(int fd, int event, void *data) return; } - if (spice_server_add_client(reds, socket) < 0) + if (spice_server_add_client(reds, socket, 0) < 0) close(socket); } -SPICE_GNUC_VISIBLE int spice_server_add_client(SpiceServer *s, int socket) +SPICE_GNUC_VISIBLE int spice_server_add_client(SpiceServer *s, int socket, int skip_auth) { RedLinkInfo *link; RedsStream *stream; @@ -2828,6 +2829,8 @@ SPICE_GNUC_VISIBLE int spice_server_add_client(SpiceServer *s, int socket) return -1; } + link->skip_auth = skip_auth; + stream = link->stream; stream->read = stream_read_cb; stream->write = stream_write_cb; @@ -2838,7 +2841,7 @@ SPICE_GNUC_VISIBLE int spice_server_add_client(SpiceServer *s, int socket) } -SPICE_GNUC_VISIBLE int spice_server_add_ssl_client(SpiceServer *s, int socket) +SPICE_GNUC_VISIBLE int spice_server_add_ssl_client(SpiceServer *s, int socket, int skip_auth) { RedLinkInfo *link; @@ -2846,6 +2849,8 @@ SPICE_GNUC_VISIBLE int spice_server_add_ssl_client(SpiceServer *s, int socket) if (!(link = reds_init_client_ssl_connection(socket))) { return -1; } + + link->skip_auth = skip_auth; return 0; } diff --git a/server/spice.h b/server/spice.h index fbd409a9..6233a6ca 100644 --- a/server/spice.h +++ b/server/spice.h @@ -425,8 +425,8 @@ int spice_server_set_tls(SpiceServer *s, int port, const char *private_key_file, const char *key_passwd, const char *dh_key_file, const char *ciphersuite); -int spice_server_add_client(SpiceServer *s, int socket); -int spice_server_add_ssl_client(SpiceServer *s, int socket); +int spice_server_add_client(SpiceServer *s, int socket, int skip_auth); +int spice_server_add_ssl_client(SpiceServer *s, int socket, int skip_auth); int spice_server_add_interface(SpiceServer *s, SpiceBaseInstance *sin); From 492ddb5d1d595e2d12208f4602b18e4432f4e6b4 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Mon, 12 Dec 2011 16:52:33 +0000 Subject: [PATCH 09/47] Do not assume that SPICE is using a TCP socket If setting the TCP_NODELAY socket option fails with ENOTSUP, then don't treat this is a fatal error. SPICE is likely just running over a UNIX socket instead. * server/inputs_channel.c: Ignore TCP_NODELAY socket opt fails Signed-off-by: Daniel P. Berrange --- server/inputs_channel.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/server/inputs_channel.c b/server/inputs_channel.c index c8b42e3e..0fa41629 100644 --- a/server/inputs_channel.c +++ b/server/inputs_channel.c @@ -466,8 +466,10 @@ static int inputs_channel_config_socket(RedChannelClient *rcc) if (setsockopt(stream->socket, IPPROTO_TCP, TCP_NODELAY, &delay_val, sizeof(delay_val)) == -1) { - red_printf("setsockopt failed, %s", strerror(errno)); - return FALSE; + if (errno != ENOTSUP) { + red_printf("setsockopt failed, %s", strerror(errno)); + return FALSE; + } } if ((flags = fcntl(stream->socket, F_GETFL)) == -1 || From 5ea8687843dd3493c3c31f52ba23393c6c9d3fcf Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Thu, 12 Jan 2012 13:24:52 +0100 Subject: [PATCH 10/47] codegen: Fix enums.h generation With the new usbredir code we have the new concept of the abstract / generic spicevmc channel type (which just tunnels data from a qemu chardev), and we've the usbredir channel, which is the only current user of this. This was reflected in the protocols enum in spice-protocol.h by a manual edit done by me, my bad. This patch teaches spice.proto about the relation between the abstract spicevmc channel and the usbredir channel and modifies codegen to deal with this. Signed-off-by: Hans de Goede --- python_modules/ptypes.py | 4 +++- spice.proto | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/python_modules/ptypes.py b/python_modules/ptypes.py index f12a2f36..45859498 100644 --- a/python_modules/ptypes.py +++ b/python_modules/ptypes.py @@ -947,6 +947,9 @@ class ChannelType(Type): server_messages_byname = self.base.server_messages_byname.copy() client_messages = self.base.client_messages[:] client_messages_byname = self.base.client_messages_byname.copy() + + # Set default member_name, FooChannel -> foo + self.member_name = self.name[:-7].lower() else: server_messages = [] server_messages_byname = {} @@ -998,7 +1001,6 @@ class ProtocolMember: def resolve(self, protocol): self.channel_type = self.channel_type.resolve() - assert(self.channel_type.member_name == None) self.channel_type.member_name = self.name return self diff --git a/spice.proto b/spice.proto index 266e03a9..4d0731bd 100644 --- a/spice.proto +++ b/spice.proto @@ -1112,13 +1112,16 @@ client: Data data = 101; }; -channel UsbredirChannel : BaseChannel { +channel SpicevmcChannel : BaseChannel { server: Data data = 101; client: Data data = 101; }; +channel UsbredirChannel : SpicevmcChannel { +}; + protocol Spice { MainChannel main = 1; DisplayChannel display; From 33feaf75d67584beae7c548b948dbb34b7cf6171 Mon Sep 17 00:00:00 2001 From: Yonit Halperin Date: Tue, 10 Jan 2012 09:29:27 +0200 Subject: [PATCH 11/47] spice.proto: add SPICE_MSG_LIST to base channel --- spice.proto | 1 + 1 file changed, 1 insertion(+) diff --git a/spice.proto b/spice.proto index 4d0731bd..0e15fe72 100644 --- a/spice.proto +++ b/spice.proto @@ -133,6 +133,7 @@ channel BaseChannel { uint8 message[message_len] @end @nomarshal; } notify; + Data list; /* the msg body is SpiceSubMessageList */ client: message { uint32 generation; From b689abe576c382ab1107e50f7b24de116a622dab Mon Sep 17 00:00:00 2001 From: Yonit Halperin Date: Wed, 28 Dec 2011 13:31:20 +0200 Subject: [PATCH 12/47] server/red_channel: introduce urgent marshaller When red_channel::red_channel_client_begin_send_message is called, the message that is pending in the urgent marshaller will be sent before the one in the main channel. The urgent marshaller should be used if in the middle of marshalling one message, you find out you need to send another message before. This functionality is equivalent to the sub_list messages. It will replace them in the following patches, when sub_list is removed from Spice data header. --- server/red_channel.c | 64 ++++++++++++++++++++++++++++++++++++++++---- server/red_channel.h | 27 ++++++++++++++++++- 2 files changed, 85 insertions(+), 6 deletions(-) diff --git a/server/red_channel.c b/server/red_channel.c index 2ce0094c..671bcf58 100644 --- a/server/red_channel.c +++ b/server/red_channel.c @@ -38,6 +38,7 @@ static void red_channel_client_event(int fd, int event, void *data); static void red_client_add_channel(RedClient *client, RedChannelClient *rcc); static void red_client_remove_channel(RedChannelClient *rcc); +static void red_channel_client_restore_main_sender(RedChannelClient *rcc); /* return the number of bytes read. -1 in case of error */ static int red_peer_receive(RedsStream *stream, uint8_t *buf, uint32_t size) @@ -204,10 +205,13 @@ static void red_peer_handle_outgoing(RedsStream *stream, OutgoingHandler *handle handler->pos += n; handler->cb->on_output(handler->opaque, n); if (handler->pos == handler->size) { // finished writing data - handler->cb->on_msg_done(handler->opaque); + /* reset handler before calling on_msg_done, since it + * can trigger another call to red_peer_handle_outgoing (when + * switching from the urgent marshaller to the main one */ handler->vec = handler->vec_buf; handler->pos = 0; handler->size = 0; + handler->cb->on_msg_done(handler->opaque); return; } } @@ -252,6 +256,11 @@ static void red_channel_client_peer_on_out_block(void *opaque) SPICE_WATCH_EVENT_WRITE); } +static inline int red_channel_client_urgent_marshaller_is_active(RedChannelClient *rcc) +{ + return (rcc->send_data.marshaller == rcc->send_data.urgent.marshaller); +} + static void red_channel_client_reset_send_data(RedChannelClient *rcc) { spice_marshaller_reset(rcc->send_data.marshaller); @@ -261,7 +270,16 @@ static void red_channel_client_reset_send_data(RedChannelClient *rcc) rcc->send_data.header->type = 0; rcc->send_data.header->size = 0; rcc->send_data.header->sub_list = 0; - rcc->send_data.header->serial = ++rcc->send_data.serial; + + if (!red_channel_client_urgent_marshaller_is_active(rcc)) { + rcc->send_data.header->serial = ++rcc->send_data.serial; + } else { + /* The serial was incremented by the call to reset_send_data + * that was done for the main marshaller. The urgent msg should + * receive this serial, and the main msg serial should be + * the following one. */ + rcc->send_data.header->serial = rcc->send_data.serial++; + } } void red_channel_client_push_set_ack(RedChannelClient *rcc) @@ -343,6 +361,12 @@ static void red_channel_peer_on_out_msg_done(void *opaque) rcc->channel->core->watch_update_mask(rcc->stream->watch, SPICE_WATCH_EVENT_READ); } + + if (red_channel_client_urgent_marshaller_is_active(rcc)) { + red_channel_client_restore_main_sender(rcc); + ASSERT(rcc->send_data.header != NULL); + red_channel_client_begin_send_message(rcc); + } } static void red_channel_client_pipe_remove(RedChannelClient *rcc, PipeItem *item) @@ -407,7 +431,10 @@ RedChannelClient *red_channel_client_create(int size, RedChannel *channel, RedCl // block flags) rcc->ack_data.client_generation = ~0; rcc->ack_data.client_window = CLIENT_ACK_WINDOW; - rcc->send_data.marshaller = spice_marshaller_new(); + rcc->send_data.main.marshaller = spice_marshaller_new(); + rcc->send_data.urgent.marshaller = spice_marshaller_new(); + + rcc->send_data.marshaller = rcc->send_data.main.marshaller; rcc->incoming.opaque = rcc; rcc->incoming.cb = &channel->incoming_cb; @@ -643,9 +670,14 @@ void red_channel_client_destroy(RedChannelClient *rcc) red_channel_client_disconnect(rcc); } red_client_remove_channel(rcc); - if (rcc->send_data.marshaller) { - spice_marshaller_destroy(rcc->send_data.marshaller); + if (rcc->send_data.main.marshaller) { + spice_marshaller_destroy(rcc->send_data.main.marshaller); } + + if (rcc->send_data.urgent.marshaller) { + spice_marshaller_destroy(rcc->send_data.urgent.marshaller); + } + red_channel_client_destroy_remote_caps(rcc); free(rcc); } @@ -874,6 +906,28 @@ void red_channel_client_begin_send_message(RedChannelClient *rcc) red_channel_client_send(rcc); } +SpiceMarshaller *red_channel_client_switch_to_urgent_sender(RedChannelClient *rcc) +{ + ASSERT(red_channel_client_no_item_being_sent(rcc)); + ASSERT(rcc->send_data.header != NULL); + rcc->send_data.main.header = rcc->send_data.header; + rcc->send_data.main.item = rcc->send_data.item; + + rcc->send_data.marshaller = rcc->send_data.urgent.marshaller; + rcc->send_data.item = NULL; + red_channel_client_reset_send_data(rcc); + return rcc->send_data.marshaller; +} + +static void red_channel_client_restore_main_sender(RedChannelClient *rcc) +{ + spice_marshaller_reset(rcc->send_data.urgent.marshaller); + rcc->send_data.marshaller = rcc->send_data.main.marshaller; + rcc->send_data.header = rcc->send_data.main.header; + rcc->send_data.header->serial = rcc->send_data.serial; + rcc->send_data.item = rcc->send_data.main.item; +} + uint64_t red_channel_client_get_message_serial(RedChannelClient *rcc) { return rcc->send_data.serial; diff --git a/server/red_channel.h b/server/red_channel.h index cce69658..cb80100e 100644 --- a/server/red_channel.h +++ b/server/red_channel.h @@ -207,6 +207,17 @@ struct RedChannelClient { PipeItem *item; int blocked; uint64_t serial; + + struct { + SpiceMarshaller *marshaller; + SpiceDataHeader *header; + PipeItem *item; + } main; + + struct { + SpiceMarshaller *marshaller; + SpiceDataHeader *header; + } urgent; } send_data; OutgoingHandler outgoing; @@ -331,9 +342,23 @@ void red_channel_client_init_send_data(RedChannelClient *rcc, uint16_t msg_type, uint64_t red_channel_client_get_message_serial(RedChannelClient *channel); void red_channel_client_set_message_serial(RedChannelClient *channel, uint64_t); -/* when sending a msg. should first call red_channel_client_begin_send_message */ +/* When sending a msg. Should first call red_channel_client_begin_send_message. + * It will first send the pending urgent data, if there is any, and then + * the rest of the data. + */ void red_channel_client_begin_send_message(RedChannelClient *rcc); +/* + * Stores the current send data, and switches to urgent send data. + * When it begins the actual send, it will send first the urgent data + * and afterward the rest of the data. + * Should be called only if during the marshalling of on message, + * the need to send another message, before, rises. + * Important: the serial of the non-urgent sent data, will be succeeded. + * return: the urgent send data marshaller + */ +SpiceMarshaller *red_channel_client_switch_to_urgent_sender(RedChannelClient *rcc); + void red_channel_pipe_item_init(RedChannel *channel, PipeItem *item, int type); // TODO: add back the channel_pipe_add functionality - by adding reference counting From a54f26d04e9a391977a8030d609b52e50243ba52 Mon Sep 17 00:00:00 2001 From: Yonit Halperin Date: Wed, 28 Dec 2011 14:10:27 +0200 Subject: [PATCH 13/47] server/red_worker: pass remote caps to display/cursor red_channel_client's --- server/red_dispatcher.c | 16 ++++++++++++ server/red_dispatcher.h | 8 ++++++ server/red_worker.c | 56 ++++++++++++++++++++++++++++++++--------- 3 files changed, 68 insertions(+), 12 deletions(-) diff --git a/server/red_dispatcher.c b/server/red_dispatcher.c index 17b469e1..321232b2 100644 --- a/server/red_dispatcher.c +++ b/server/red_dispatcher.c @@ -102,6 +102,14 @@ static void red_dispatcher_set_display_peer(RedChannel *channel, RedClient *clie payload.client = client; payload.stream = stream; payload.migration = migration; + payload.num_common_caps = num_common_caps; + payload.common_caps = spice_malloc(sizeof(uint32_t)*num_common_caps); + payload.num_caps = num_caps; + payload.caps = spice_malloc(sizeof(uint32_t)*num_caps); + + memcpy(payload.common_caps, common_caps, sizeof(uint32_t)*num_common_caps); + memcpy(payload.caps, caps, sizeof(uint32_t)*num_caps); + dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_DISPLAY_CONNECT, &payload); @@ -154,6 +162,14 @@ static void red_dispatcher_set_cursor_peer(RedChannel *channel, RedClient *clien payload.client = client; payload.stream = stream; payload.migration = migration; + payload.num_common_caps = num_common_caps; + payload.common_caps = spice_malloc(sizeof(uint32_t)*num_common_caps); + payload.num_caps = num_caps; + payload.caps = spice_malloc(sizeof(uint32_t)*num_caps); + + memcpy(payload.common_caps, common_caps, sizeof(uint32_t)*num_common_caps); + memcpy(payload.caps, caps, sizeof(uint32_t)*num_caps); + dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_CURSOR_CONNECT, &payload); diff --git a/server/red_dispatcher.h b/server/red_dispatcher.h index 7417aac1..36db4e34 100644 --- a/server/red_dispatcher.h +++ b/server/red_dispatcher.h @@ -38,6 +38,10 @@ typedef struct RedWorkerMessageDisplayConnect { RedClient * client; RedsStream * stream; int migration; + uint32_t *common_caps; // red_worker should free + int num_common_caps; + uint32_t *caps; // red_worker should free + int num_caps; } RedWorkerMessageDisplayConnect; typedef struct RedWorkerMessageDisplayDisconnect { @@ -52,6 +56,10 @@ typedef struct RedWorkerMessageCursorConnect { RedClient *client; RedsStream *stream; int migration; + uint32_t *common_caps; // red_worker should free + int num_common_caps; + uint32_t *caps; // red_worker should free + int num_caps; } RedWorkerMessageCursorConnect; typedef struct RedWorkerMessageCursorDisconnect { diff --git a/server/red_worker.c b/server/red_worker.c index 0d873ed3..d82c84ef 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -9442,12 +9442,18 @@ SpiceCoreInterface worker_core = { }; static CommonChannelClient *common_channel_client_create(int size, - CommonChannel *common, RedClient *client, RedsStream *stream) + CommonChannel *common, + RedClient *client, + RedsStream *stream, + uint32_t *common_caps, + int num_common_caps, + uint32_t *caps, + int num_caps) { MainChannelClient *mcc = red_client_get_main(client); RedChannelClient *rcc = red_channel_client_create(size, &common->base, client, stream, - 0, NULL, 0, NULL); + num_common_caps, common_caps, num_caps, caps); CommonChannelClient *common_cc = (CommonChannelClient*)rcc; common_cc->worker = common->worker; @@ -9460,11 +9466,15 @@ static CommonChannelClient *common_channel_client_create(int size, DisplayChannelClient *display_channel_client_create(CommonChannel *common, - RedClient *client, RedsStream *stream) + RedClient *client, RedsStream *stream, + uint32_t *common_caps, int num_common_caps, + uint32_t *caps, int num_caps) { DisplayChannelClient *dcc = (DisplayChannelClient*)common_channel_client_create( - sizeof(DisplayChannelClient), common, client, stream); + sizeof(DisplayChannelClient), common, client, stream, + common_caps, num_common_caps, + caps, num_caps); if (!dcc) { return NULL; @@ -9475,11 +9485,17 @@ DisplayChannelClient *display_channel_client_create(CommonChannel *common, } CursorChannelClient *cursor_channel_create_rcc(CommonChannel *common, - RedClient *client, RedsStream *stream) + RedClient *client, RedsStream *stream, + uint32_t *common_caps, int num_common_caps, + uint32_t *caps, int num_caps) { CursorChannelClient *ccc = (CursorChannelClient*)common_channel_client_create( - sizeof(CursorChannelClient), common, client, stream); + sizeof(CursorChannelClient), common, client, stream, + common_caps, + num_common_caps, + caps, + num_caps); if (!ccc) { return NULL; @@ -9749,7 +9765,9 @@ static void display_channel_create(RedWorker *worker, int migrate) static void handle_new_display_channel(RedWorker *worker, RedClient *client, RedsStream *stream, - int migrate) + int migrate, + uint32_t *common_caps, int num_common_caps, + uint32_t *caps, int num_caps) { DisplayChannel *display_channel; DisplayChannelClient *dcc; @@ -9762,7 +9780,9 @@ static void handle_new_display_channel(RedWorker *worker, RedClient *client, Red } display_channel = worker->display_channel; red_printf("add display channel client"); - dcc = display_channel_client_create(&display_channel->common, client, stream); + dcc = display_channel_client_create(&display_channel->common, client, stream, + common_caps, num_common_caps, + caps, num_caps); if (!dcc) { return; } @@ -9941,7 +9961,9 @@ static void cursor_channel_create(RedWorker *worker, int migrate) } static void red_connect_cursor(RedWorker *worker, RedClient *client, RedsStream *stream, - int migrate) + int migrate, + uint32_t *common_caps, int num_common_caps, + uint32_t *caps, int num_caps) { CursorChannel *channel; CursorChannelClient *ccc; @@ -9952,7 +9974,9 @@ static void red_connect_cursor(RedWorker *worker, RedClient *client, RedsStream } channel = worker->cursor_channel; red_printf("add cursor channel client"); - ccc = cursor_channel_create_rcc(&channel->common, client, stream); + ccc = cursor_channel_create_rcc(&channel->common, client, stream, + common_caps, num_common_caps, + caps, num_caps); if (!ccc) { return; } @@ -10522,7 +10546,11 @@ void handle_dev_display_connect(void *opaque, void *payload) int migration = msg->migration; red_printf("connect"); - handle_new_display_channel(worker, client, stream, migration); + handle_new_display_channel(worker, client, stream, migration, + msg->common_caps, msg->num_common_caps, + msg->caps, msg->num_caps); + free(msg->caps); + free(msg->common_caps); } void handle_dev_display_disconnect(void *opaque, void *payload) @@ -10567,7 +10595,11 @@ void handle_dev_cursor_connect(void *opaque, void *payload) int migration = msg->migration; red_printf("cursor connect"); - red_connect_cursor(worker, client, stream, migration); + red_connect_cursor(worker, client, stream, migration, + msg->common_caps, msg->num_common_caps, + msg->caps, msg->num_caps); + free(msg->caps); + free(msg->common_caps); } void handle_dev_cursor_disconnect(void *opaque, void *payload) From 8b64b95c4339c145867e42f71b3206378bc7c83b Mon Sep 17 00:00:00 2001 From: Yonit Halperin Date: Thu, 5 Jan 2012 17:31:34 +0200 Subject: [PATCH 14/47] server: Limit the access to SpiceDataHeader of messages - only via red_channel. --- server/inputs_channel.c | 10 ++++++--- server/main_channel.c | 8 +++++-- server/red_channel.c | 34 ++++++++++++++++++++++-------- server/red_channel.h | 24 +++++++++------------ server/red_tunnel_worker.c | 43 +++++++++++++++++++------------------- server/red_worker.c | 9 ++++---- server/smartcard.c | 18 +++++++++------- server/spicevmc.c | 24 ++++++++++++--------- 8 files changed, 99 insertions(+), 71 deletions(-) diff --git a/server/inputs_channel.c b/server/inputs_channel.c index 0fa41629..4fe36b8e 100644 --- a/server/inputs_channel.c +++ b/server/inputs_channel.c @@ -168,18 +168,22 @@ const VDAgentMouseState *inputs_get_mouse_state(void) return &g_inputs_channel->mouse_state; } -static uint8_t *inputs_channel_alloc_msg_rcv_buf(RedChannelClient *rcc, SpiceDataHeader *msg_header) +static uint8_t *inputs_channel_alloc_msg_rcv_buf(RedChannelClient *rcc, + uint16_t type, + uint32_t size) { InputsChannel *inputs_channel = SPICE_CONTAINEROF(rcc->channel, InputsChannel, base); - if (msg_header->size > RECEIVE_BUF_SIZE) { + if (size > RECEIVE_BUF_SIZE) { red_printf("error: too large incoming message"); return NULL; } return inputs_channel->recv_buf; } -static void inputs_channel_release_msg_rcv_buf(RedChannelClient *rcc, SpiceDataHeader *msg_header, +static void inputs_channel_release_msg_rcv_buf(RedChannelClient *rcc, + uint16_t type, + uint32_t size, uint8_t *msg) { } diff --git a/server/main_channel.c b/server/main_channel.c index 4b5b6698..b55bf002 100644 --- a/server/main_channel.c +++ b/server/main_channel.c @@ -852,14 +852,18 @@ static int main_channel_handle_parsed(RedChannelClient *rcc, uint32_t size, uint return TRUE; } -static uint8_t *main_channel_alloc_msg_rcv_buf(RedChannelClient *rcc, SpiceDataHeader *msg_header) +static uint8_t *main_channel_alloc_msg_rcv_buf(RedChannelClient *rcc, + uint16_t type, + uint32_t size) { MainChannel *main_chan = SPICE_CONTAINEROF(rcc->channel, MainChannel, base); return main_chan->recv_buf; } -static void main_channel_release_msg_rcv_buf(RedChannelClient *rcc, SpiceDataHeader *msg_header, +static void main_channel_release_msg_rcv_buf(RedChannelClient *rcc, + uint16_t type, + uint32_t size, uint8_t *msg) { } diff --git a/server/red_channel.c b/server/red_channel.c index 671bcf58..06b4ef0f 100644 --- a/server/red_channel.c +++ b/server/red_channel.c @@ -103,7 +103,9 @@ static void red_peer_handle_incoming(RedsStream *stream, IncomingHandler *handle if (handler->msg_pos < handler->header.size) { if (!handler->msg) { - handler->msg = handler->cb->alloc_msg_buf(handler->opaque, &handler->header); + handler->msg = handler->cb->alloc_msg_buf(handler->opaque, + handler->header.type, + handler->header.size); if (handler->msg == NULL) { red_printf("ERROR: channel refused to allocate buffer."); handler->cb->on_error(handler->opaque); @@ -115,7 +117,10 @@ static void red_peer_handle_incoming(RedsStream *stream, IncomingHandler *handle handler->msg + handler->msg_pos, handler->header.size - handler->msg_pos); if (bytes_read == -1) { - handler->cb->release_msg_buf(handler->opaque, &handler->header, handler->msg); + handler->cb->release_msg_buf(handler->opaque, + handler->header.type, + handler->header.size, + handler->msg); handler->cb->on_error(handler->opaque); return; } @@ -131,7 +136,9 @@ static void red_peer_handle_incoming(RedsStream *stream, IncomingHandler *handle SPICE_VERSION_MINOR, &parsed_size, &parsed_free); if (parsed == NULL) { red_printf("failed to parse message type %d", handler->header.type); - handler->cb->release_msg_buf(handler->opaque, &handler->header, handler->msg); + handler->cb->release_msg_buf(handler->opaque, handler->header.type, + handler->header.size, + handler->msg); handler->cb->on_error(handler->opaque); return; } @@ -139,11 +146,16 @@ static void red_peer_handle_incoming(RedsStream *stream, IncomingHandler *handle handler->header.type, parsed); parsed_free(parsed); } else { - ret_handle = handler->cb->handle_message(handler->opaque, &handler->header, - handler->msg); + ret_handle = handler->cb->handle_message(handler->opaque, + handler->header.type, + handler->header.size, + handler->msg); } handler->msg_pos = 0; - handler->cb->release_msg_buf(handler->opaque, &handler->header, handler->msg); + handler->cb->release_msg_buf(handler->opaque, + handler->header.type, + handler->header.size, + handler->msg); handler->msg = NULL; handler->header_pos = 0; @@ -586,7 +598,10 @@ RedChannel *red_channel_create_dummy(int size, uint32_t type, uint32_t id) return channel; } -static int do_nothing_handle_message(RedChannelClient *rcc, SpiceDataHeader *header, uint8_t *msg) +static int do_nothing_handle_message(RedChannelClient *rcc, + uint16_t type, + uint32_t size, + uint8_t *msg) { return TRUE; } @@ -1204,10 +1219,11 @@ RedClient *red_channel_client_get_client(RedChannelClient *rcc) return rcc->client; } -SpiceDataHeader *red_channel_client_get_header(RedChannelClient *rcc) +void red_channel_client_set_header_sub_list(RedChannelClient *rcc, uint32_t sub_list) { - return rcc->send_data.header; + rcc->send_data.header->sub_list = sub_list; } + /* end of accessors */ int red_channel_get_first_socket(RedChannel *channel) diff --git a/server/red_channel.h b/server/red_channel.h index cb80100e..40792c1b 100644 --- a/server/red_channel.h +++ b/server/red_channel.h @@ -38,11 +38,11 @@ At the final stage, this interface shouldn't be exposed. Only RedChannel will use it. */ typedef int (*handle_message_proc)(void *opaque, - SpiceDataHeader *header, uint8_t *msg); + uint16_t type, uint32_t size, uint8_t *msg); typedef int (*handle_parsed_proc)(void *opaque, uint32_t size, uint16_t type, void *message); -typedef uint8_t *(*alloc_msg_recv_buf_proc)(void *opaque, SpiceDataHeader *msg_header); +typedef uint8_t *(*alloc_msg_recv_buf_proc)(void *opaque, uint16_t type, uint32_t size); typedef void (*release_msg_recv_buf_proc)(void *opaque, - SpiceDataHeader *msg_header, uint8_t *msg); + uint16_t type, uint32_t size, uint8_t *msg); typedef void (*on_incoming_error_proc)(void *opaque); typedef struct IncomingHandlerInterface { @@ -119,13 +119,13 @@ typedef struct PipeItem { } PipeItem; typedef uint8_t *(*channel_alloc_msg_recv_buf_proc)(RedChannelClient *channel, - SpiceDataHeader *msg_header); + uint16_t type, uint32_t size); typedef int (*channel_handle_parsed_proc)(RedChannelClient *rcc, uint32_t size, uint16_t type, void *message); typedef int (*channel_handle_message_proc)(RedChannelClient *rcc, - SpiceDataHeader *header, uint8_t *msg); + uint16_t type, uint32_t size, uint8_t *msg); typedef void (*channel_release_msg_recv_buf_proc)(RedChannelClient *channel, - SpiceDataHeader *msg_header, uint8_t *msg); + uint16_t type, uint32_t size, uint8_t *msg); typedef void (*channel_disconnect_proc)(RedChannelClient *rcc); typedef int (*channel_configure_socket_proc)(RedChannelClient *rcc); typedef void (*channel_send_pipe_item_proc)(RedChannelClient *rcc, PipeItem *item); @@ -334,7 +334,7 @@ void red_channel_init_outgoing_messages_window(RedChannel *channel); /* handles general channel msgs from the client */ int red_channel_client_handle_message(RedChannelClient *rcc, uint32_t size, - uint16_t type, void *message); + uint16_t type, void *message); /* when preparing send_data: should call init and then use marshaller */ void red_channel_client_init_send_data(RedChannelClient *rcc, uint16_t msg_type, PipeItem *item); @@ -444,13 +444,9 @@ SpiceMarshaller *red_channel_client_get_marshaller(RedChannelClient *rcc); RedsStream *red_channel_client_get_stream(RedChannelClient *rcc); RedClient *red_channel_client_get_client(RedChannelClient *rcc); -/* this is a convenience function for sending messages, sometimes (migration only?) - * the serial from the header needs to be available for sending. Note that the header - * pointer retrieved is not valid except between red_channel_reset_send_data and - * red_channel_begin_send_message. red_channel_init_send_data changes the header (sets - * the type in it) as a convenience function. It is preffered to do that through it and - * not via the below accessor and direct header manipulation. */ -SpiceDataHeader *red_channel_client_get_header(RedChannelClient *rcc); +/* Note that the header is valid only between red_channel_reset_send_data and + * red_channel_begin_send_message.*/ +void red_channel_client_set_header_sub_list(RedChannelClient *rcc, uint32_t sub_list); /* return the sum of all the rcc pipe size */ uint32_t red_channel_max_pipe_size(RedChannel *channel); diff --git a/server/red_tunnel_worker.c b/server/red_tunnel_worker.c index 1e8267e8..250e8b3e 100644 --- a/server/red_tunnel_worker.c +++ b/server/red_tunnel_worker.c @@ -1644,27 +1644,27 @@ static int tunnel_channel_handle_socket_token(TunnelChannelClient *channel, RedS } static uint8_t *tunnel_channel_alloc_msg_rcv_buf(RedChannelClient *rcc, - SpiceDataHeader *msg_header) + uint16_t type, uint32_t size) { TunnelChannelClient *tunnel_channel = (TunnelChannelClient *)rcc->channel; - if (msg_header->type == SPICE_MSGC_TUNNEL_SOCKET_DATA) { + if (type == SPICE_MSGC_TUNNEL_SOCKET_DATA) { return (__tunnel_worker_alloc_socket_rcv_buf(tunnel_channel->worker)->buf); - } else if ((msg_header->type == SPICE_MSGC_MIGRATE_DATA) || - (msg_header->type == SPICE_MSGC_TUNNEL_SERVICE_ADD)) { - return spice_malloc(msg_header->size); + } else if ((type == SPICE_MSGC_MIGRATE_DATA) || + (type == SPICE_MSGC_TUNNEL_SERVICE_ADD)) { + return spice_malloc(size); } else { return (tunnel_channel->control_rcv_buf); } } // called by the receive routine of the channel, before the buffer was assigned to a socket -static void tunnel_channel_release_msg_rcv_buf(RedChannelClient *rcc, SpiceDataHeader *msg_header, +static void tunnel_channel_release_msg_rcv_buf(RedChannelClient *rcc, uint16_t type, uint32_t size, uint8_t *msg) { TunnelChannelClient *tunnel_channel = (TunnelChannelClient *)rcc->channel; - if (msg_header->type == SPICE_MSGC_TUNNEL_SOCKET_DATA) { + if (type == SPICE_MSGC_TUNNEL_SOCKET_DATA) { ASSERT(!(SPICE_CONTAINEROF(msg, RedSocketRawRcvBuf, buf)->base.usr_opaque)); __tunnel_worker_free_socket_rcv_buf(tunnel_channel->worker, SPICE_CONTAINEROF(msg, RedSocketRawRcvBuf, buf)); @@ -2243,12 +2243,13 @@ error: } // msg was allocated by tunnel_channel_alloc_msg_rcv_buf -static int tunnel_channel_handle_message(RedChannelClient *rcc, SpiceDataHeader *header, uint8_t *msg) +static int tunnel_channel_handle_message(RedChannelClient *rcc, uint16_t type, + uint32_t size, uint8_t *msg) { TunnelChannelClient *tunnel_channel = (TunnelChannelClient *)rcc->channel; RedSocket *sckt = NULL; // retrieve the sckt - switch (header->type) { + switch (type) { case SPICE_MSGC_MIGRATE_FLUSH_MARK: case SPICE_MSGC_MIGRATE_DATA: case SPICE_MSGC_TUNNEL_SERVICE_ADD: @@ -2269,12 +2270,12 @@ static int tunnel_channel_handle_message(RedChannelClient *rcc, SpiceDataHeader } break; default: - return red_channel_client_handle_message(rcc, header->size, header->type, msg); + return red_channel_client_handle_message(rcc, size, type, msg); } - switch (header->type) { + switch (type) { case SPICE_MSGC_TUNNEL_SERVICE_ADD: - if (header->size < sizeof(SpiceMsgcTunnelAddGenericService)) { + if (size < sizeof(SpiceMsgcTunnelAddGenericService)) { red_printf("bad message size"); free(msg); return FALSE; @@ -2285,7 +2286,7 @@ static int tunnel_channel_handle_message(RedChannelClient *rcc, SpiceDataHeader red_printf("REDC_TUNNEL_REMOVE_SERVICE not supported yet"); return FALSE; case SPICE_MSGC_TUNNEL_SOCKET_OPEN_ACK: - if (header->size != sizeof(SpiceMsgcTunnelSocketOpenAck)) { + if (size != sizeof(SpiceMsgcTunnelSocketOpenAck)) { red_printf("bad message size"); return FALSE; } @@ -2294,7 +2295,7 @@ static int tunnel_channel_handle_message(RedChannelClient *rcc, SpiceDataHeader ((SpiceMsgcTunnelSocketOpenAck *)msg)->tokens); case SPICE_MSGC_TUNNEL_SOCKET_OPEN_NACK: - if (header->size != sizeof(SpiceMsgcTunnelSocketOpenNack)) { + if (size != sizeof(SpiceMsgcTunnelSocketOpenNack)) { red_printf("bad message size"); return FALSE; } @@ -2302,35 +2303,35 @@ static int tunnel_channel_handle_message(RedChannelClient *rcc, SpiceDataHeader return tunnel_channel_handle_socket_connect_nack(tunnel_channel, sckt); case SPICE_MSGC_TUNNEL_SOCKET_DATA: { - if (header->size < sizeof(SpiceMsgcTunnelSocketData)) { + if (size < sizeof(SpiceMsgcTunnelSocketData)) { red_printf("bad message size"); return FALSE; } return tunnel_channel_handle_socket_receive_data(tunnel_channel, sckt, SPICE_CONTAINEROF(msg, RedSocketRawRcvBuf, buf), - header->size - sizeof(SpiceMsgcTunnelSocketData)); + size - sizeof(SpiceMsgcTunnelSocketData)); } case SPICE_MSGC_TUNNEL_SOCKET_FIN: - if (header->size != sizeof(SpiceMsgcTunnelSocketFin)) { + if (size != sizeof(SpiceMsgcTunnelSocketFin)) { red_printf("bad message size"); return FALSE; } return tunnel_channel_handle_socket_fin(tunnel_channel, sckt); case SPICE_MSGC_TUNNEL_SOCKET_CLOSED: - if (header->size != sizeof(SpiceMsgcTunnelSocketClosed)) { + if (size != sizeof(SpiceMsgcTunnelSocketClosed)) { red_printf("bad message size"); return FALSE; } return tunnel_channel_handle_socket_closed(tunnel_channel, sckt); case SPICE_MSGC_TUNNEL_SOCKET_CLOSED_ACK: - if (header->size != sizeof(SpiceMsgcTunnelSocketClosedAck)) { + if (size != sizeof(SpiceMsgcTunnelSocketClosedAck)) { red_printf("bad message size"); return FALSE; } return tunnel_channel_handle_socket_closed_ack(tunnel_channel, sckt); case SPICE_MSGC_TUNNEL_SOCKET_TOKEN: - if (header->size != sizeof(SpiceMsgcTunnelSocketTokens)) { + if (size != sizeof(SpiceMsgcTunnelSocketTokens)) { red_printf("bad message size"); return FALSE; } @@ -2338,7 +2339,7 @@ static int tunnel_channel_handle_message(RedChannelClient *rcc, SpiceDataHeader return tunnel_channel_handle_socket_token(tunnel_channel, sckt, (SpiceMsgcTunnelSocketTokens *)msg); default: - return red_channel_client_handle_message(rcc, header->size, header->type, msg); + return red_channel_client_handle_message(rcc, size, type, msg); } return TRUE; } diff --git a/server/red_worker.c b/server/red_worker.c index d82c84ef..f454302a 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -1517,15 +1517,15 @@ static void release_upgrade_item(RedWorker* worker, UpgradeItem *item) } } -static uint8_t *common_alloc_recv_buf(RedChannelClient *rcc, SpiceDataHeader *msg_header) +static uint8_t *common_alloc_recv_buf(RedChannelClient *rcc, uint16_t type, uint32_t size) { CommonChannel *common = SPICE_CONTAINEROF(rcc->channel, CommonChannel, base); return common->recv_buf; } -static void common_release_recv_buf(RedChannelClient *rcc, - SpiceDataHeader *msg_header, uint8_t* msg) +static void common_release_recv_buf(RedChannelClient *rcc, uint16_t type, uint32_t size, + uint8_t* msg) { } @@ -7785,7 +7785,6 @@ static inline void display_begin_send_message(RedChannelClient *rcc, { DisplayChannelClient *dcc = RCC_TO_DCC(rcc); FreeList *free_list = &dcc->send_data.free_list; - SpiceDataHeader *header = red_channel_client_get_header(rcc); if (free_list->res->count) { int sub_list_len = 1; @@ -7828,7 +7827,7 @@ static inline void display_begin_send_message(RedChannelClient *rcc, spice_marshaller_add_uint32(sub_list_m, spice_marshaller_get_offset(wait_m)); } spice_marshaller_add_uint32(sub_list_m, spice_marshaller_get_offset(inval_m)); - header->sub_list = spice_marshaller_get_offset(sub_list_m); + red_channel_client_set_header_sub_list(rcc, spice_marshaller_get_offset(sub_list_m)); } red_channel_client_begin_send_message(rcc); } diff --git a/server/smartcard.c b/server/smartcard.c index f9cafdfa..08ba3da8 100644 --- a/server/smartcard.c +++ b/server/smartcard.c @@ -273,15 +273,18 @@ static int smartcard_channel_client_config_socket(RedChannelClient *rcc) } static uint8_t *smartcard_channel_alloc_msg_rcv_buf(RedChannelClient *rcc, - SpiceDataHeader *msg_header) + uint16_t type, + uint32_t size) { - return spice_malloc(msg_header->size); + return spice_malloc(size); } static void smartcard_channel_release_msg_rcv_buf(RedChannelClient *rcc, - SpiceDataHeader *msg_header, uint8_t *msg) + uint16_t type, + uint32_t size, + uint8_t *msg) { - red_printf("freeing %d bytes", msg_header->size); + red_printf("freeing %d bytes", size); free(msg); } @@ -439,14 +442,15 @@ static void smartcard_channel_write_to_reader(VSCMsgHeader *vheader) } static int smartcard_channel_handle_message(RedChannelClient *rcc, - SpiceDataHeader *header, + uint16_t type, + uint32_t size, uint8_t *msg) { VSCMsgHeader* vheader = (VSCMsgHeader*)msg; - if (header->type != SPICE_MSGC_SMARTCARD_DATA) { + if (type != SPICE_MSGC_SMARTCARD_DATA) { /* handle ack's, spicy sends them while spicec does not */ - return red_channel_client_handle_message(rcc, header->size, header->type, msg); + return red_channel_client_handle_message(rcc, size, type, msg); } ASSERT(header->size == vheader->length + sizeof(VSCMsgHeader)); diff --git a/server/spicevmc.c b/server/spicevmc.c index bed84887..c2e249c1 100644 --- a/server/spicevmc.c +++ b/server/spicevmc.c @@ -126,7 +126,9 @@ static void spicevmc_red_channel_client_on_disconnect(RedChannelClient *rcc) } static int spicevmc_red_channel_client_handle_message(RedChannelClient *rcc, - SpiceDataHeader *header, uint8_t *msg) + uint16_t type, + uint32_t size, + uint8_t *msg) { SpiceVmcState *state; SpiceCharDeviceInstance *sin; @@ -136,22 +138,22 @@ static int spicevmc_red_channel_client_handle_message(RedChannelClient *rcc, sin = state->chardev_sin; sif = SPICE_CONTAINEROF(sin->base.sif, SpiceCharDeviceInterface, base); - if (header->type != SPICE_MSGC_SPICEVMC_DATA) { - return red_channel_client_handle_message(rcc, header->size, - header->type, msg); + if (type != SPICE_MSGC_SPICEVMC_DATA) { + return red_channel_client_handle_message(rcc, size, type, msg); } /* * qemu spicevmc will consume everything we give it, no need for * flow control checks (or to use a pipe). */ - sif->write(sin, msg, header->size); + sif->write(sin, msg, size); return TRUE; } static uint8_t *spicevmc_red_channel_alloc_msg_rcv_buf(RedChannelClient *rcc, - SpiceDataHeader *msg_header) + uint16_t type, + uint32_t size) { SpiceVmcState *state; @@ -159,9 +161,9 @@ static uint8_t *spicevmc_red_channel_alloc_msg_rcv_buf(RedChannelClient *rcc, assert(!state->rcv_buf_in_use); - if (msg_header->size > state->rcv_buf_size) { - state->rcv_buf = spice_realloc(state->rcv_buf, msg_header->size); - state->rcv_buf_size = msg_header->size; + if (size > state->rcv_buf_size) { + state->rcv_buf = spice_realloc(state->rcv_buf, size); + state->rcv_buf_size = size; } state->rcv_buf_in_use = 1; @@ -170,7 +172,9 @@ static uint8_t *spicevmc_red_channel_alloc_msg_rcv_buf(RedChannelClient *rcc, } static void spicevmc_red_channel_release_msg_rcv_buf(RedChannelClient *rcc, - SpiceDataHeader *msg_header, uint8_t *msg) + uint16_t type, + uint32_t size, + uint8_t *msg) { SpiceVmcState *state; From ec0bf2488f2ac0b7fb5102fd3d8822fd2883bd0a Mon Sep 17 00:00:00 2001 From: Yonit Halperin Date: Sun, 8 Jan 2012 09:26:31 +0200 Subject: [PATCH 15/47] configure: spice-protocol >= 0.10.1 (mini header support) --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 861e9396..cf3eda69 100644 --- a/configure.ac +++ b/configure.ac @@ -132,7 +132,7 @@ AM_CONDITIONAL(SUPPORT_CLIENT, test "x$enable_client" = "xyes") dnl ========================================================================= dnl Check deps -PKG_CHECK_MODULES(PROTOCOL, spice-protocol >= 0.9.1) +PKG_CHECK_MODULES(PROTOCOL, spice-protocol >= 0.10.1) AC_SUBST(PROTOCOL_CFLAGS) AC_CHECK_LIBM From 65c859ba819fdc70ebc3ba5208bb994d06174873 Mon Sep 17 00:00:00 2001 From: Yonit Halperin Date: Sun, 8 Jan 2012 09:20:55 +0200 Subject: [PATCH 16/47] server: add support for SPICE_COMMON_CAP_MINI_HEADER Support for a header without a serial and without sub list. red_channel: Support the two types of headers. Keep a consistent consecutive messages serial. red_worker: use urgent marshaller instead of sub list. snd_worker: Sound channels need special support since they still don't use red_channel for sending & receiving. --- server/red_channel.c | 217 ++++++++++++++++++++++++++++++++----------- server/red_channel.h | 35 ++++++- server/red_worker.c | 158 ++++++++++++++++++++++++------- server/snd_worker.c | 93 ++++++++++++------- 4 files changed, 377 insertions(+), 126 deletions(-) diff --git a/server/red_channel.c b/server/red_channel.c index 06b4ef0f..e526179e 100644 --- a/server/red_channel.c +++ b/server/red_channel.c @@ -40,6 +40,82 @@ static void red_client_add_channel(RedClient *client, RedChannelClient *rcc); static void red_client_remove_channel(RedChannelClient *rcc); static void red_channel_client_restore_main_sender(RedChannelClient *rcc); +static uint32_t full_header_get_msg_size(SpiceDataHeaderOpaque *header) +{ + return ((SpiceDataHeader *)header->data)->size; +} + +static uint32_t mini_header_get_msg_size(SpiceDataHeaderOpaque *header) +{ + return ((SpiceMiniDataHeader *)header->data)->size; +} + +static uint16_t full_header_get_msg_type(SpiceDataHeaderOpaque *header) +{ + return ((SpiceDataHeader *)header->data)->type; +} + +static uint16_t mini_header_get_msg_type(SpiceDataHeaderOpaque *header) +{ + return ((SpiceMiniDataHeader *)header->data)->type; +} + +static void full_header_set_msg_type(SpiceDataHeaderOpaque *header, uint16_t type) +{ + ((SpiceDataHeader *)header->data)->type = type; +} + +static void mini_header_set_msg_type(SpiceDataHeaderOpaque *header, uint16_t type) +{ + ((SpiceMiniDataHeader *)header->data)->type = type; +} + +static void full_header_set_msg_size(SpiceDataHeaderOpaque *header, uint32_t size) +{ + ((SpiceDataHeader *)header->data)->size = size; +} + +static void mini_header_set_msg_size(SpiceDataHeaderOpaque *header, uint32_t size) +{ + ((SpiceMiniDataHeader *)header->data)->size = size; +} + +static void full_header_set_msg_serial(SpiceDataHeaderOpaque *header, uint64_t serial) +{ + ((SpiceDataHeader *)header->data)->serial = serial; +} + +static void mini_header_set_msg_serial(SpiceDataHeaderOpaque *header, uint64_t serial) +{ + red_error("attempt to set header serial on mini header"); +} + +static void full_header_set_msg_sub_list(SpiceDataHeaderOpaque *header, uint32_t sub_list) +{ + ((SpiceDataHeader *)header->data)->sub_list = sub_list; +} + +static void mini_header_set_msg_sub_list(SpiceDataHeaderOpaque *header, uint32_t sub_list) +{ + red_error("attempt to set header sub list on mini header"); +} + +static SpiceDataHeaderOpaque full_header_wrapper = {NULL, sizeof(SpiceDataHeader), + full_header_set_msg_type, + full_header_set_msg_size, + full_header_set_msg_serial, + full_header_set_msg_sub_list, + full_header_get_msg_type, + full_header_get_msg_size}; + +static SpiceDataHeaderOpaque mini_header_wrapper = {NULL, sizeof(SpiceMiniDataHeader), + mini_header_set_msg_type, + mini_header_set_msg_size, + mini_header_set_msg_serial, + mini_header_set_msg_sub_list, + mini_header_get_msg_type, + mini_header_get_msg_size}; + /* return the number of bytes read. -1 in case of error */ static int red_peer_receive(RedsStream *stream, uint8_t *buf, uint32_t size) { @@ -83,29 +159,31 @@ static void red_peer_handle_incoming(RedsStream *stream, IncomingHandler *handle uint8_t *parsed; size_t parsed_size; message_destructor_t parsed_free; + uint16_t msg_type; + uint32_t msg_size; for (;;) { int ret_handle; - if (handler->header_pos < sizeof(SpiceDataHeader)) { + if (handler->header_pos < handler->header.header_size) { bytes_read = red_peer_receive(stream, - ((uint8_t *)&handler->header) + handler->header_pos, - sizeof(SpiceDataHeader) - handler->header_pos); + handler->header.data + handler->header_pos, + handler->header.header_size - handler->header_pos); if (bytes_read == -1) { handler->cb->on_error(handler->opaque); return; } handler->header_pos += bytes_read; - if (handler->header_pos != sizeof(SpiceDataHeader)) { + if (handler->header_pos != handler->header.header_size) { return; } } - if (handler->msg_pos < handler->header.size) { + msg_size = handler->header.get_msg_size(&handler->header); + msg_type = handler->header.get_msg_type(&handler->header); + if (handler->msg_pos < msg_size) { if (!handler->msg) { - handler->msg = handler->cb->alloc_msg_buf(handler->opaque, - handler->header.type, - handler->header.size); + handler->msg = handler->cb->alloc_msg_buf(handler->opaque, msg_type, msg_size); if (handler->msg == NULL) { red_printf("ERROR: channel refused to allocate buffer."); handler->cb->on_error(handler->opaque); @@ -115,47 +193,37 @@ static void red_peer_handle_incoming(RedsStream *stream, IncomingHandler *handle bytes_read = red_peer_receive(stream, handler->msg + handler->msg_pos, - handler->header.size - handler->msg_pos); + msg_size - handler->msg_pos); if (bytes_read == -1) { - handler->cb->release_msg_buf(handler->opaque, - handler->header.type, - handler->header.size, - handler->msg); + handler->cb->release_msg_buf(handler->opaque, msg_type, msg_size, handler->msg); handler->cb->on_error(handler->opaque); return; } handler->msg_pos += bytes_read; - if (handler->msg_pos != handler->header.size) { + if (handler->msg_pos != msg_size) { return; } } if (handler->cb->parser) { parsed = handler->cb->parser(handler->msg, - handler->msg + handler->header.size, handler->header.type, + handler->msg + msg_size, msg_type, SPICE_VERSION_MINOR, &parsed_size, &parsed_free); if (parsed == NULL) { - red_printf("failed to parse message type %d", handler->header.type); - handler->cb->release_msg_buf(handler->opaque, handler->header.type, - handler->header.size, - handler->msg); + red_printf("failed to parse message type %d", msg_type); + handler->cb->release_msg_buf(handler->opaque, msg_type, msg_size, handler->msg); handler->cb->on_error(handler->opaque); return; } ret_handle = handler->cb->handle_parsed(handler->opaque, parsed_size, - handler->header.type, parsed); + msg_type, parsed); parsed_free(parsed); } else { - ret_handle = handler->cb->handle_message(handler->opaque, - handler->header.type, - handler->header.size, + ret_handle = handler->cb->handle_message(handler->opaque, msg_type, msg_size, handler->msg); } handler->msg_pos = 0; - handler->cb->release_msg_buf(handler->opaque, - handler->header.type, - handler->header.size, - handler->msg); + handler->cb->release_msg_buf(handler->opaque, msg_type, msg_size, handler->msg); handler->msg = NULL; handler->header_pos = 0; @@ -276,21 +344,32 @@ static inline int red_channel_client_urgent_marshaller_is_active(RedChannelClien static void red_channel_client_reset_send_data(RedChannelClient *rcc) { spice_marshaller_reset(rcc->send_data.marshaller); - rcc->send_data.header = (SpiceDataHeader *) - spice_marshaller_reserve_space(rcc->send_data.marshaller, sizeof(SpiceDataHeader)); - spice_marshaller_set_base(rcc->send_data.marshaller, sizeof(SpiceDataHeader)); - rcc->send_data.header->type = 0; - rcc->send_data.header->size = 0; - rcc->send_data.header->sub_list = 0; + rcc->send_data.header.data = spice_marshaller_reserve_space(rcc->send_data.marshaller, + rcc->send_data.header.header_size); + spice_marshaller_set_base(rcc->send_data.marshaller, rcc->send_data.header.header_size); + rcc->send_data.header.set_msg_type(&rcc->send_data.header, 0); + rcc->send_data.header.set_msg_size(&rcc->send_data.header, 0); - if (!red_channel_client_urgent_marshaller_is_active(rcc)) { - rcc->send_data.header->serial = ++rcc->send_data.serial; - } else { - /* The serial was incremented by the call to reset_send_data - * that was done for the main marshaller. The urgent msg should - * receive this serial, and the main msg serial should be - * the following one. */ - rcc->send_data.header->serial = rcc->send_data.serial++; + /* Keeping the serial consecutive: reseting it if reset_send_data + * has been called before, but no message has been sent since then. + */ + if (rcc->send_data.last_sent_serial != rcc->send_data.serial) { + ASSERT(rcc->send_data.serial - rcc->send_data.last_sent_serial == 1); + /* When the urgent marshaller is active, the serial was incremented by + * the call to reset_send_data that was made for the main marshaller. + * The urgent msg receives this serial, and the main msg serial is + * the following one. Thus, (rcc->send_data.serial - rcc->send_data.last_sent_serial) + * should be 1 in this case*/ + if (!red_channel_client_urgent_marshaller_is_active(rcc)) { + rcc->send_data.serial = rcc->send_data.last_sent_serial; + } + } + rcc->send_data.serial++; + + if (!rcc->is_mini_header) { + ASSERT(rcc->send_data.marshaller != rcc->send_data.urgent.marshaller); + rcc->send_data.header.set_msg_sub_list(&rcc->send_data.header, 0); + rcc->send_data.header.set_msg_serial(&rcc->send_data.header, rcc->send_data.serial); } } @@ -376,7 +455,7 @@ static void red_channel_peer_on_out_msg_done(void *opaque) if (red_channel_client_urgent_marshaller_is_active(rcc)) { red_channel_client_restore_main_sender(rcc); - ASSERT(rcc->send_data.header != NULL); + ASSERT(rcc->send_data.header.data != NULL); red_channel_client_begin_send_message(rcc); } } @@ -457,6 +536,18 @@ RedChannelClient *red_channel_client_create(int size, RedChannel *channel, RedCl rcc->outgoing.size = 0; red_channel_client_set_remote_caps(rcc, num_common_caps, common_caps, num_caps, caps); + if (red_channel_client_test_remote_common_cap(rcc, SPICE_COMMON_CAP_MINI_HEADER)) { + rcc->incoming.header = mini_header_wrapper; + rcc->send_data.header = mini_header_wrapper; + rcc->is_mini_header = TRUE; + } else { + rcc->incoming.header = full_header_wrapper; + rcc->send_data.header = full_header_wrapper; + rcc->is_mini_header = FALSE; + } + + rcc->incoming.header.data = rcc->incoming.header_buf; + rcc->incoming.serial = 1; if (!channel->channel_cbs.config_socket(rcc)) { goto error; @@ -545,6 +636,7 @@ RedChannel *red_channel_create(int size, client_cbs.migrate = red_channel_client_default_migrate; red_channel_register_client_cbs(channel, &client_cbs); + red_channel_set_common_cap(channel, SPICE_COMMON_CAP_MINI_HEADER); channel->thread_id = pthread_self(); @@ -590,6 +682,7 @@ RedChannel *red_channel_create_dummy(int size, uint32_t type, uint32_t id) client_cbs.migrate = red_channel_client_default_migrate; red_channel_register_client_cbs(channel, &client_cbs); + red_channel_set_common_cap(channel, SPICE_COMMON_CAP_MINI_HEADER); channel->thread_id = pthread_self(); @@ -850,7 +943,7 @@ static void red_channel_handle_migrate_data(RedChannelClient *rcc, uint32_t size } int red_channel_client_handle_message(RedChannelClient *rcc, uint32_t size, - uint16_t type, void *message) + uint16_t type, void *message) { switch (type) { case SPICE_MSGC_ACK_SYNC: @@ -897,7 +990,7 @@ void red_channel_client_init_send_data(RedChannelClient *rcc, uint16_t msg_type, { ASSERT(red_channel_client_no_item_being_sent(rcc)); ASSERT(msg_type != 0); - rcc->send_data.header->type = msg_type; + rcc->send_data.header.set_msg_type(&rcc->send_data.header, msg_type); rcc->send_data.item = item; if (item) { rcc->channel->channel_cbs.hold_item(rcc, item); @@ -909,23 +1002,25 @@ void red_channel_client_begin_send_message(RedChannelClient *rcc) SpiceMarshaller *m = rcc->send_data.marshaller; // TODO - better check: type in channel_allowed_types. Better: type in channel_allowed_types(channel_state) - if (rcc->send_data.header->type == 0) { + if (rcc->send_data.header.get_msg_type(&rcc->send_data.header) == 0) { red_printf("BUG: header->type == 0"); return; } spice_marshaller_flush(m); rcc->send_data.size = spice_marshaller_get_total_size(m); - rcc->send_data.header->size = rcc->send_data.size - sizeof(SpiceDataHeader); + rcc->send_data.header.set_msg_size(&rcc->send_data.header, + rcc->send_data.size - rcc->send_data.header.header_size); rcc->ack_data.messages_window++; - rcc->send_data.header = NULL; /* avoid writing to this until we have a new message */ + rcc->send_data.last_sent_serial = rcc->send_data.serial; + rcc->send_data.header.data = NULL; /* avoid writing to this until we have a new message */ red_channel_client_send(rcc); } SpiceMarshaller *red_channel_client_switch_to_urgent_sender(RedChannelClient *rcc) { ASSERT(red_channel_client_no_item_being_sent(rcc)); - ASSERT(rcc->send_data.header != NULL); - rcc->send_data.main.header = rcc->send_data.header; + ASSERT(rcc->send_data.header.data != NULL); + rcc->send_data.main.header_data = rcc->send_data.header.data; rcc->send_data.main.item = rcc->send_data.item; rcc->send_data.marshaller = rcc->send_data.urgent.marshaller; @@ -938,8 +1033,10 @@ static void red_channel_client_restore_main_sender(RedChannelClient *rcc) { spice_marshaller_reset(rcc->send_data.urgent.marshaller); rcc->send_data.marshaller = rcc->send_data.main.marshaller; - rcc->send_data.header = rcc->send_data.main.header; - rcc->send_data.header->serial = rcc->send_data.serial; + rcc->send_data.header.data = rcc->send_data.main.header_data; + if (!rcc->is_mini_header) { + rcc->send_data.header.set_msg_serial(&rcc->send_data.header, rcc->send_data.serial); + } rcc->send_data.item = rcc->send_data.main.item; } @@ -1069,7 +1166,6 @@ void red_channel_client_ack_set_client_window(RedChannelClient *rcc, int client_ rcc->ack_data.client_window = client_window; } - static void red_channel_remove_client(RedChannelClient *rcc) { ASSERT(pthread_equal(pthread_self(), rcc->channel->thread_id)); @@ -1127,6 +1223,19 @@ RedChannelClient *red_channel_client_create_dummy(int size, rcc->client = client; rcc->channel = channel; red_channel_client_set_remote_caps(rcc, num_common_caps, common_caps, num_caps, caps); + if (red_channel_client_test_remote_common_cap(rcc, SPICE_COMMON_CAP_MINI_HEADER)) { + rcc->incoming.header = mini_header_wrapper; + rcc->send_data.header = mini_header_wrapper; + rcc->is_mini_header = TRUE; + } else { + rcc->incoming.header = full_header_wrapper; + rcc->send_data.header = full_header_wrapper; + rcc->is_mini_header = FALSE; + } + + rcc->incoming.header.data = rcc->incoming.header_buf; + rcc->incoming.serial = 1; + red_channel_add_client(channel, rcc); return rcc; } @@ -1200,7 +1309,7 @@ int red_channel_client_blocked(RedChannelClient *rcc) int red_channel_client_send_message_pending(RedChannelClient *rcc) { - return rcc->send_data.header->type != 0; + return rcc->send_data.header.get_msg_type(&rcc->send_data.header) != 0; } /* accessors for RedChannelClient */ @@ -1221,7 +1330,7 @@ RedClient *red_channel_client_get_client(RedChannelClient *rcc) void red_channel_client_set_header_sub_list(RedChannelClient *rcc, uint32_t sub_list) { - rcc->send_data.header->sub_list = sub_list; + rcc->send_data.header.set_msg_sub_list(&rcc->send_data.header, sub_list); } /* end of accessors */ diff --git a/server/red_channel.h b/server/red_channel.h index 40792c1b..045bfd43 100644 --- a/server/red_channel.h +++ b/server/red_channel.h @@ -33,10 +33,34 @@ #define MAX_SEND_VEC 100 #define CLIENT_ACK_WINDOW 20 +#define MAX_HEADER_SIZE sizeof(SpiceDataHeader) + /* Basic interface for channels, without using the RedChannel interface. The intention is to move towards one channel interface gradually. At the final stage, this interface shouldn't be exposed. Only RedChannel will use it. */ +typedef struct SpiceDataHeaderOpaque SpiceDataHeaderOpaque; + +typedef uint16_t (*get_msg_type_proc)(SpiceDataHeaderOpaque *header); +typedef uint32_t (*get_msg_size_proc)(SpiceDataHeaderOpaque *header); +typedef void (*set_msg_type_proc)(SpiceDataHeaderOpaque *header, uint16_t type); +typedef void (*set_msg_size_proc)(SpiceDataHeaderOpaque *header, uint32_t size); +typedef void (*set_msg_serial_proc)(SpiceDataHeaderOpaque *header, uint64_t serial); +typedef void (*set_msg_sub_list_proc)(SpiceDataHeaderOpaque *header, uint32_t sub_list); + +struct SpiceDataHeaderOpaque { + uint8_t *data; + uint16_t header_size; + + set_msg_type_proc set_msg_type; + set_msg_size_proc set_msg_size; + set_msg_serial_proc set_msg_serial; + set_msg_sub_list_proc set_msg_sub_list; + + get_msg_type_proc get_msg_type; + get_msg_size_proc get_msg_size; +}; + typedef int (*handle_message_proc)(void *opaque, uint16_t type, uint32_t size, uint8_t *msg); typedef int (*handle_parsed_proc)(void *opaque, uint32_t size, uint16_t type, void *message); @@ -58,10 +82,12 @@ typedef struct IncomingHandlerInterface { typedef struct IncomingHandler { IncomingHandlerInterface *cb; void *opaque; - SpiceDataHeader header; + uint8_t header_buf[MAX_HEADER_SIZE]; + SpiceDataHeaderOpaque header; uint32_t header_pos; uint8_t *msg; // data of the msg following the header. allocated by alloc_msg_buf. uint32_t msg_pos; + uint64_t serial; } IncomingHandler; typedef int (*get_outgoing_msg_size_proc)(void *opaque); @@ -202,21 +228,21 @@ struct RedChannelClient { struct { SpiceMarshaller *marshaller; - SpiceDataHeader *header; + SpiceDataHeaderOpaque header; uint32_t size; PipeItem *item; int blocked; uint64_t serial; + uint64_t last_sent_serial; struct { SpiceMarshaller *marshaller; - SpiceDataHeader *header; + uint8_t *header_data; PipeItem *item; } main; struct { SpiceMarshaller *marshaller; - SpiceDataHeader *header; } urgent; } send_data; @@ -228,6 +254,7 @@ struct RedChannelClient { uint32_t pipe_size; RedChannelCapabilities remote_caps; + int is_mini_header; }; struct RedChannel { diff --git a/server/red_worker.c b/server/red_worker.c index f454302a..d096ee44 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -593,6 +593,9 @@ typedef struct CommonChannelClient { struct RedWorker *worker; } CommonChannelClient; +/* Each drawable can refer to at most 3 images: src, brush and mask */ +#define MAX_DRAWABLE_PIXMAP_CACHE_ITEMS 3 + struct DisplayChannelClient { CommonChannelClient common; @@ -616,6 +619,8 @@ struct DisplayChannelClient { RedCompressBuf *used_compress_bufs; FreeList free_list; + uint64_t pixmap_cache_items[MAX_DRAWABLE_PIXMAP_CACHE_ITEMS]; + int num_pixmap_cache_items; } send_data; /* global lz encoding entities */ @@ -986,8 +991,7 @@ static void red_display_release_stream(RedWorker *worker, StreamAgent *agent); static inline void red_detach_stream(RedWorker *worker, Stream *stream); static void red_stop_stream(RedWorker *worker, Stream *stream); static inline void red_stream_maintenance(RedWorker *worker, Drawable *candidate, Drawable *sect); -static inline void display_begin_send_message(RedChannelClient *rcc, - SpiceMarshaller *base_marshaller); +static inline void display_begin_send_message(RedChannelClient *rcc); static void red_release_pixmap_cache(DisplayChannelClient *dcc); static void red_release_glz(DisplayChannelClient *dcc); static void red_freeze_glz(DisplayChannelClient *dcc); @@ -6248,6 +6252,8 @@ static inline void red_display_add_image_to_pixmap_cache(RedChannelClient *rcc, image->descriptor.width * image->descriptor.height, is_lossy, dcc)) { io_image->descriptor.flags |= SPICE_IMAGE_FLAGS_CACHE_ME; + dcc->send_data.pixmap_cache_items[dcc->send_data.num_pixmap_cache_items++] = + image->descriptor.id; stat_inc_counter(display_channel->add_to_cache_counter, 1); } } @@ -6290,6 +6296,8 @@ static FillBitsType fill_bits(DisplayChannelClient *dcc, SpiceMarshaller *m, int lossy_cache_item; if (pixmap_cache_hit(dcc->pixmap_cache, image.descriptor.id, &lossy_cache_item, dcc)) { + dcc->send_data.pixmap_cache_items[dcc->send_data.num_pixmap_cache_items++] = + image.descriptor.id; if (can_lossy || !lossy_cache_item) { if (!display_channel->enable_jpeg || lossy_cache_item) { image.descriptor.type = SPICE_IMAGE_TYPE_FROM_CACHE; @@ -6463,6 +6471,7 @@ static inline void red_display_reset_send_data(DisplayChannelClient *dcc) { red_display_reset_compress_buf(dcc); dcc->send_data.free_list.res->count = 0; + dcc->send_data.num_pixmap_cache_items = 0; memset(dcc->send_data.free_list.sync, 0, sizeof(dcc->send_data.free_list.sync)); } @@ -7780,27 +7789,123 @@ static void display_channel_push_release(DisplayChannelClient *dcc, uint8_t type free_list->res->resources[free_list->res->count++].id = id; } -static inline void display_begin_send_message(RedChannelClient *rcc, - SpiceMarshaller *base_marshaller) +static inline void display_marshal_sub_msg_inval_list(SpiceMarshaller *m, + FreeList *free_list) +{ + /* type + size + submessage */ + spice_marshaller_add_uint16(m, SPICE_MSG_DISPLAY_INVAL_LIST); + spice_marshaller_add_uint32(m, sizeof(*free_list->res) + + free_list->res->count * sizeof(free_list->res->resources[0])); + spice_marshall_msg_display_inval_list(m, free_list->res); +} + +static inline void display_marshal_sub_msg_inval_list_wait(SpiceMarshaller *m, + FreeList *free_list) + +{ + /* type + size + submessage */ + spice_marshaller_add_uint16(m, SPICE_MSG_WAIT_FOR_CHANNELS); + spice_marshaller_add_uint32(m, sizeof(free_list->wait.header) + + free_list->wait.header.wait_count * sizeof(free_list->wait.buf[0])); + spice_marshall_msg_wait_for_channels(m, &free_list->wait.header); +} + +/* use legacy SpiceDataHeader (with sub_list) */ +static inline void display_channel_send_free_list_legacy(RedChannelClient *rcc) +{ + DisplayChannelClient *dcc = RCC_TO_DCC(rcc); + FreeList *free_list = &dcc->send_data.free_list; + SpiceMarshaller *marshaller; + int sub_list_len = 1; + SpiceMarshaller *wait_m = NULL; + SpiceMarshaller *inval_m; + SpiceMarshaller *sub_list_m; + + marshaller = red_channel_client_get_marshaller(rcc); + inval_m = spice_marshaller_get_submarshaller(marshaller); + + display_marshal_sub_msg_inval_list(inval_m, free_list); + + if (free_list->wait.header.wait_count) { + wait_m = spice_marshaller_get_submarshaller(marshaller); + display_marshal_sub_msg_inval_list_wait(wait_m, free_list); + sub_list_len++; + } + + sub_list_m = spice_marshaller_get_submarshaller(marshaller); + spice_marshaller_add_uint16(sub_list_m, sub_list_len); + if (wait_m) { + spice_marshaller_add_uint32(sub_list_m, spice_marshaller_get_offset(wait_m)); + } + spice_marshaller_add_uint32(sub_list_m, spice_marshaller_get_offset(inval_m)); + red_channel_client_set_header_sub_list(rcc, spice_marshaller_get_offset(sub_list_m)); +} + +/* use mini header and SPICE_MSG_LIST */ +static inline void display_channel_send_free_list(RedChannelClient *rcc) +{ + DisplayChannelClient *dcc = RCC_TO_DCC(rcc); + FreeList *free_list = &dcc->send_data.free_list; + int sub_list_len = 1; + SpiceMarshaller *urgent_marshaller; + SpiceMarshaller *wait_m = NULL; + SpiceMarshaller *inval_m; + uint32_t sub_arr_offset; + uint32_t wait_offset = 0; + uint32_t inval_offset = 0; + int i; + + urgent_marshaller = red_channel_client_switch_to_urgent_sender(rcc); + for (i = 0; i < dcc->send_data.num_pixmap_cache_items; i++) { + int dummy; + /* When using the urgent marshaller, the serial number of the message that is + * going to be sent right after the SPICE_MSG_LIST, is increased by one. + * But all this message pixmaps cache references used its old serial. + * we use pixmap_cache_items to collect these pixmaps, and we update their serial by calling pixmap_cache_hit.*/ + pixmap_cache_hit(dcc->pixmap_cache, dcc->send_data.pixmap_cache_items[i], + &dummy, dcc); + } + + if (free_list->wait.header.wait_count) { + red_channel_client_init_send_data(rcc, SPICE_MSG_LIST, NULL); + } else { /* only one message, no need for a list */ + red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_INVAL_LIST, NULL); + spice_marshall_msg_display_inval_list(urgent_marshaller, free_list->res); + return; + } + + inval_m = spice_marshaller_get_submarshaller(urgent_marshaller); + display_marshal_sub_msg_inval_list(inval_m, free_list); + + if (free_list->wait.header.wait_count) { + wait_m = spice_marshaller_get_submarshaller(urgent_marshaller); + display_marshal_sub_msg_inval_list_wait(wait_m, free_list); + sub_list_len++; + } + + sub_arr_offset = sub_list_len * sizeof(uint32_t); + + spice_marshaller_add_uint16(urgent_marshaller, sub_list_len); + inval_offset = spice_marshaller_get_offset(inval_m); // calc the offset before + // adding the sub list + // offsets array to the marshaller + /* adding the array of offsets */ + if (wait_m) { + wait_offset = spice_marshaller_get_offset(wait_m); + spice_marshaller_add_uint32(urgent_marshaller, wait_offset + sub_arr_offset); + } + spice_marshaller_add_uint32(urgent_marshaller, inval_offset + sub_arr_offset); +} + +static inline void display_begin_send_message(RedChannelClient *rcc) { DisplayChannelClient *dcc = RCC_TO_DCC(rcc); FreeList *free_list = &dcc->send_data.free_list; if (free_list->res->count) { - int sub_list_len = 1; - SpiceMarshaller *wait_m = NULL; - SpiceMarshaller *inval_m; int sync_count = 0; int i; - inval_m = spice_marshaller_get_submarshaller(base_marshaller); - - /* type + size + submessage */ - spice_marshaller_add_uint16(inval_m, SPICE_MSG_DISPLAY_INVAL_LIST); - spice_marshaller_add_uint32(inval_m, sizeof(*free_list->res) + - free_list->res->count * sizeof(free_list->res->resources[0])); - spice_marshall_msg_display_inval_list(inval_m, free_list->res); - for (i = 0; i < MAX_CACHE_CLIENTS; i++) { if (i != dcc->common.id && free_list->sync[i] != 0) { free_list->wait.header.wait_list[sync_count].channel_type = SPICE_CHANNEL_DISPLAY; @@ -7810,24 +7915,11 @@ static inline void display_begin_send_message(RedChannelClient *rcc, } free_list->wait.header.wait_count = sync_count; - if (sync_count) { - wait_m = spice_marshaller_get_submarshaller(base_marshaller); - - /* type + size + submessage */ - spice_marshaller_add_uint16(wait_m, SPICE_MSG_WAIT_FOR_CHANNELS); - spice_marshaller_add_uint32(wait_m, sizeof(free_list->wait.header) + - sync_count * sizeof(free_list->wait.buf[0])); - spice_marshall_msg_wait_for_channels(wait_m, &free_list->wait.header); - sub_list_len++; + if (rcc->is_mini_header) { + display_channel_send_free_list(rcc); + } else { + display_channel_send_free_list_legacy(rcc); } - - SpiceMarshaller *sub_list_m = spice_marshaller_get_submarshaller(base_marshaller); - spice_marshaller_add_uint16(sub_list_m, sub_list_len); - if (wait_m) { - spice_marshaller_add_uint32(sub_list_m, spice_marshaller_get_offset(wait_m)); - } - spice_marshaller_add_uint32(sub_list_m, spice_marshaller_get_offset(inval_m)); - red_channel_client_set_header_sub_list(rcc, spice_marshaller_get_offset(sub_list_m)); } red_channel_client_begin_send_message(rcc); } @@ -8495,7 +8587,7 @@ static void display_channel_send_item(RedChannelClient *rcc, PipeItem *pipe_item // a message is pending if (red_channel_client_send_message_pending(rcc)) { - display_begin_send_message(rcc, m); + display_begin_send_message(rcc); } } diff --git a/server/snd_worker.c b/server/snd_worker.c index 048da349..5d580778 100644 --- a/server/snd_worker.c +++ b/server/snd_worker.c @@ -101,7 +101,6 @@ struct SndChannel { struct { uint64_t serial; - SpiceDataHeader *header; SpiceMarshaller *marshaller; uint32_t size; uint32_t pos; @@ -109,7 +108,7 @@ struct SndChannel { struct { uint8_t buf[RECIVE_BUF_SIZE]; - SpiceDataHeader *message; + uint8_t *message_start; uint8_t *now; uint8_t *end; } recive_data; @@ -417,10 +416,14 @@ static int snd_record_handle_message(SndChannel *channel, size_t size, uint32_t static void snd_receive(void* data) { SndChannel *channel = (SndChannel*)data; + SpiceDataHeaderOpaque *header; + if (!channel) { return; } + header = &channel->channel_client->incoming.header; + for (;;) { ssize_t n; n = channel->recive_data.end - channel->recive_data.now; @@ -448,40 +451,44 @@ static void snd_receive(void* data) } else { channel->recive_data.now += n; for (;;) { - SpiceDataHeader *header = channel->recive_data.message; - uint8_t *data = (uint8_t *)(header+1); + uint8_t *msg_start = channel->recive_data.message_start; + uint8_t *data = msg_start + header->header_size; size_t parsed_size; uint8_t *parsed; message_destructor_t parsed_free; - n = channel->recive_data.now - (uint8_t *)header; - if (n < sizeof(SpiceDataHeader) || n < sizeof(SpiceDataHeader) + header->size) { + header->data = msg_start; + n = channel->recive_data.now - msg_start; + + if (n < header->header_size || + n < header->header_size + header->get_msg_size(header)) { break; } - parsed = channel->parser((void *)data, data + header->size, header->type, + parsed = channel->parser((void *)data, data + header->get_msg_size(header), + header->get_msg_type(header), SPICE_VERSION_MINOR, &parsed_size, &parsed_free); if (parsed == NULL) { - red_printf("failed to parse message type %d", header->type); + red_printf("failed to parse message type %d", header->get_msg_type(header)); snd_disconnect_channel(channel); return; } - if (!channel->handle_message(channel, parsed_size, header->type, parsed)) { + if (!channel->handle_message(channel, parsed_size, + header->get_msg_type(header), parsed)) { free(parsed); snd_disconnect_channel(channel); return; } parsed_free(parsed); - channel->recive_data.message = (SpiceDataHeader *)((uint8_t *)header + - sizeof(SpiceDataHeader) + - header->size); + channel->recive_data.message_start = msg_start + header->header_size + + header->get_msg_size(header); } - if (channel->recive_data.now == (uint8_t *)channel->recive_data.message) { + if (channel->recive_data.now == channel->recive_data.message_start) { channel->recive_data.now = channel->recive_data.buf; - channel->recive_data.message = (SpiceDataHeader *)channel->recive_data.buf; + channel->recive_data.message_start = channel->recive_data.buf; } else if (channel->recive_data.now == channel->recive_data.end) { - memcpy(channel->recive_data.buf, channel->recive_data.message, n); + memcpy(channel->recive_data.buf, channel->recive_data.message_start, n); channel->recive_data.now = channel->recive_data.buf + n; - channel->recive_data.message = (SpiceDataHeader *)channel->recive_data.buf; + channel->recive_data.message_start = channel->recive_data.buf; } } } @@ -501,28 +508,37 @@ static void snd_event(int fd, int event, void *data) static inline int snd_reset_send_data(SndChannel *channel, uint16_t verb) { + SpiceDataHeaderOpaque *header; + if (!channel) { return FALSE; } + header = &channel->channel_client->send_data.header; spice_marshaller_reset(channel->send_data.marshaller); - channel->send_data.header = (SpiceDataHeader *) - spice_marshaller_reserve_space(channel->send_data.marshaller, sizeof(SpiceDataHeader)); - spice_marshaller_set_base(channel->send_data.marshaller, sizeof(SpiceDataHeader)); + header->data = spice_marshaller_reserve_space(channel->send_data.marshaller, + header->header_size); + spice_marshaller_set_base(channel->send_data.marshaller, + header->header_size); channel->send_data.pos = 0; - channel->send_data.header->sub_list = 0; - channel->send_data.header->size = 0; - channel->send_data.header->type = verb; - channel->send_data.header->serial = ++channel->send_data.serial; + header->set_msg_size(header, 0); + header->set_msg_type(header, verb); + channel->send_data.serial++; + if (!channel->channel_client->is_mini_header) { + header->set_msg_serial(header, channel->send_data.serial); + header->set_msg_sub_list(header, 0); + } + return TRUE; } static int snd_begin_send_message(SndChannel *channel) { + SpiceDataHeaderOpaque *header = &channel->channel_client->send_data.header; + spice_marshaller_flush(channel->send_data.marshaller); channel->send_data.size = spice_marshaller_get_total_size(channel->send_data.marshaller); - channel->send_data.header->size = channel->send_data.size - sizeof(SpiceDataHeader); - channel->send_data.header = NULL; /* avoid writing to this until we have a new message */ + header->set_msg_size(header, channel->send_data.size - header->header_size); return snd_send_data(channel); } @@ -709,22 +725,25 @@ static int snd_record_send_migrate(RecordChannel *record_channel) { SndChannel *channel = (SndChannel *)record_channel; SpiceMsgMigrate migrate; - SpiceDataHeader *header; + SpiceDataHeaderOpaque *header; RecordMigrateData *data; if (!snd_reset_send_data(channel, SPICE_MSG_MIGRATE)) { return FALSE; } + header = &channel->channel_client->send_data.header; migrate.flags = SPICE_MIGRATE_NEED_DATA_TRANSFER; spice_marshall_msg_migrate(channel->send_data.marshaller, &migrate); - header = (SpiceDataHeader *)spice_marshaller_reserve_space(channel->send_data.marshaller, - sizeof(SpiceDataHeader)); - header->type = SPICE_MSG_MIGRATE_DATA; - header->size = sizeof(RecordMigrateData); - header->serial = ++channel->send_data.serial; - header->sub_list = 0; + header->data = spice_marshaller_reserve_space(channel->send_data.marshaller, header->header_size); + header->set_msg_size(header, sizeof(RecordMigrateData)); + header->set_msg_type(header, SPICE_MSG_MIGRATE_DATA); + ++channel->send_data.serial; + if (!channel->channel_client->is_mini_header) { + header->set_msg_serial(header, channel->send_data.serial); + header->set_msg_sub_list(header, 0); + } data = (RecordMigrateData *)spice_marshaller_reserve_space(channel->send_data.marshaller, sizeof(RecordMigrateData)); @@ -735,7 +754,8 @@ static int snd_record_send_migrate(RecordChannel *record_channel) data->mode_time = record_channel->mode_time; channel->send_data.size = spice_marshaller_get_total_size(channel->send_data.marshaller); - channel->send_data.header->size = channel->send_data.size - sizeof(SpiceDataHeader) - sizeof(SpiceDataHeader) - sizeof(*data); + header->set_msg_size(header, channel->send_data.size - header->header_size - + header->header_size - sizeof(*data)); return snd_send_data(channel); } @@ -876,6 +896,7 @@ static SndChannel *__new_channel(SndWorker *worker, int size, uint32_t channel_i snd_channel_handle_message_proc handle_message, snd_channel_on_message_done_proc on_message_done, snd_channel_cleanup_channel_proc cleanup, + uint32_t *common_caps, int num_common_caps, uint32_t *caps, int num_caps) { SndChannel *channel; @@ -917,7 +938,7 @@ static SndChannel *__new_channel(SndWorker *worker, int size, uint32_t channel_i channel->parser = spice_get_client_channel_parser(channel_id, NULL); channel->stream = stream; channel->worker = worker; - channel->recive_data.message = (SpiceDataHeader *)channel->recive_data.buf; + channel->recive_data.message_start = channel->recive_data.buf; channel->recive_data.now = channel->recive_data.buf; channel->recive_data.end = channel->recive_data.buf + sizeof(channel->recive_data.buf); channel->send_data.marshaller = spice_marshaller_new(); @@ -938,7 +959,7 @@ static SndChannel *__new_channel(SndWorker *worker, int size, uint32_t channel_i channel->channel_client = red_channel_client_create_dummy(sizeof(RedChannelClient), worker->base_channel, client, - 0, NULL, + num_common_caps, common_caps, num_caps, caps); return channel; @@ -1159,6 +1180,7 @@ static void snd_set_playback_peer(RedChannel *channel, RedClient *client, RedsSt snd_playback_handle_message, snd_playback_on_message_done, snd_playback_cleanup, + common_caps, num_common_caps, caps, num_caps))) { goto error_2; } @@ -1367,6 +1389,7 @@ static void snd_set_record_peer(RedChannel *channel, RedClient *client, RedsStre snd_record_handle_message, snd_record_on_message_done, snd_record_cleanup, + common_caps, num_common_caps, caps, num_caps))) { goto error_2; } From c6800dacf01e8d06b1fde3ca5893bf83d7fa270e Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Fri, 13 Jan 2012 15:14:37 +0100 Subject: [PATCH 17/47] smartcard handling: Fix compilation when ASSERT-s are turned on Signed-off-by: Hans de Goede --- server/smartcard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/smartcard.c b/server/smartcard.c index 08ba3da8..43ca1ac4 100644 --- a/server/smartcard.c +++ b/server/smartcard.c @@ -453,7 +453,7 @@ static int smartcard_channel_handle_message(RedChannelClient *rcc, return red_channel_client_handle_message(rcc, size, type, msg); } - ASSERT(header->size == vheader->length + sizeof(VSCMsgHeader)); + ASSERT(size == vheader->length + sizeof(VSCMsgHeader)); switch (vheader->type) { case VSC_ReaderAdd: smartcard_add_reader(rcc, msg + sizeof(VSCMsgHeader)); From 0ac13ecbc4c20d322b1c49935678c25e621a0a99 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Fri, 13 Jan 2012 15:26:57 +0100 Subject: [PATCH 18/47] client-x11: Fix building with gcc-4.7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without this change gcc says: x11/res.cpp:31:1: error: narrowing conversion of ‘(((unsigned int)_alt_image.::width) * 4u)’ from ‘unsigned int’ to ‘int’ inside { } is ill-formed in C++11 [-Werror=narrowing] x11/res.cpp:61:1: error: narrowing conversion of ‘_red_icon.::width’ from ‘const uint32_t {aka const unsigned int}’ to ‘int’ inside { } is ill-formed in C++11 [-Werror=narrowing] x11/res.cpp:61:1: error: narrowing conversion of ‘_red_icon.::height’ from ‘const uint32_t {aka const unsigned int}’ to ‘int’ inside { } is ill-formed in C++11 [-Werror=narrowing] cc1plus: all warnings being treated as errors Signed-off-by: Hans de Goede --- client/x11/images/alt_image.c | 4 ++-- client/x11/images/red_icon.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/x11/images/alt_image.c b/client/x11/images/alt_image.c index 79683395..e11cf1f1 100644 --- a/client/x11/images/alt_image.c +++ b/client/x11/images/alt_image.c @@ -1,6 +1,6 @@ static const struct { - uint32_t width; - uint32_t height; + int width; + int height; uint8_t pixel_data[17496]; } _alt_image = { 81, 54, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, diff --git a/client/x11/images/red_icon.c b/client/x11/images/red_icon.c index ce1a7d45..143d4e2d 100644 --- a/client/x11/images/red_icon.c +++ b/client/x11/images/red_icon.c @@ -1,6 +1,6 @@ static const struct { - uint32_t width; - uint32_t height; + int width; + int height; uint8_t pixmap[4096]; uint8_t mask[128]; } _red_icon = { 32, 32, { From 9d2768d7de0d17fea15b5bfaff5b73eee5f57891 Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Mon, 19 Dec 2011 15:33:45 +0200 Subject: [PATCH 19/47] client: log command line (rhbz 767581) --- client/application.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/client/application.cpp b/client/application.cpp index e120dfe7..b92b6484 100644 --- a/client/application.cpp +++ b/client/application.cpp @@ -2645,6 +2645,13 @@ int Application::main(int argc, char** argv, const char* version_str) init_globals(); LOG_INFO("starting %s", version_str); + std::string command_line = argv[0]; + for (int i = 1 ; i < argc ; ++i) { + command_line += " "; + command_line += argv[i]; + } + LOG_INFO("command line: %s", command_line.c_str()); + std::auto_ptr app(new Application()); AutoAbort auto_abort(*app.get()); if (app->process_cmd_line(argc, argv, full_screen)) { From 01102ff62b96ac67089f75bc5dc404f3d49f1d88 Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Fri, 13 Jan 2012 12:35:38 +0200 Subject: [PATCH 20/47] client/Makefile.am: mingw32 fixes * build resource file with windres * include client/windows and not client/x11 * use CXIMAGE_CFLAGS (it's already set to -DDISABLE_CXIMAGE correctly) --- client/Makefile.am | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/client/Makefile.am b/client/Makefile.am index f7c9c56a..c4b5fe1f 100644 --- a/client/Makefile.am +++ b/client/Makefile.am @@ -136,6 +136,11 @@ spicec_SOURCES += \ windows/stdint.h \ windows/win_platform.h \ $(NULL) + +spicec_resource_LDADD = windows/redc.o + +windows/redc.o: windows/redc.rc + $(WINDRES) $< -o $@ else spicec_SOURCES += \ x11/atomic_count.h \ @@ -167,6 +172,12 @@ spicec_SOURCES += \ $(NULL) endif +if OS_WIN32 +PLATFORM_INCLUDES=-I$(top_srcdir)/client/windows +else +PLATFORM_INCLUDES=-I$(top_srcdir)/client/x11 +endif + if SUPPORT_TUNNEL spicec_SOURCES += \ tunnel_channel.cpp \ @@ -210,7 +221,7 @@ endif INCLUDES = \ -D__STDC_LIMIT_MACROS \ - -I$(top_srcdir)/client/x11 \ + $(PLATFORM_INCLUDES) \ -I$(top_srcdir)/common \ $(ALSA_CFLAGS) \ $(CEGUI_CFLAGS) \ @@ -227,6 +238,7 @@ INCLUDES = \ $(XFIXES_CFLAGS) \ $(WARN_CFLAGS) \ $(XINERAMA_CFLAGS) \ + $(CXIMAGE_CFLAGS) \ $(NULL) spicec_LDFLAGS = $(SPICEC_STATIC_LINKAGE_BSTATIC) @@ -248,6 +260,7 @@ spicec_LDADD = \ $(XRANDR_LIBS) \ $(Z_LIBS) \ $(XINERAMA_LIBS) \ + $(spicec_resource_LDADD) \ $(NULL) EXTRA_DIST = \ From 5430f3a61f63b75fef1785de411fe0c0b82002bf Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Fri, 13 Jan 2012 12:37:42 +0200 Subject: [PATCH 21/47] client/common.h: mingw32 fix define PACKAGE_VERSION only ifndef __GNUC__ Since it is defined by autoconf and so it kinda comes with using the GNU compilers. --- client/common.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/common.h b/client/common.h index 8b4e39de..e9572bd7 100644 --- a/client/common.h +++ b/client/common.h @@ -58,12 +58,12 @@ #pragma warning(disable:4355) #pragma warning(disable:4996) #pragma warning(disable:4200) + +extern const char* PACKAGE_VERSION; #endif #define strcasecmp stricmp -extern const char* PACKAGE_VERSION; - #else #include #include From be3711f8b476c4da9b32676757e57c63596f9890 Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Fri, 13 Jan 2012 12:39:49 +0200 Subject: [PATCH 22/47] client: mingw32 build needs the jpeg_boolean define --- client/jpeg_decoder.cpp | 2 +- client/jpeg_decoder.h | 2 +- client/mjpeg_decoder.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/jpeg_decoder.cpp b/client/jpeg_decoder.cpp index 4bc4f188..19d22e34 100644 --- a/client/jpeg_decoder.cpp +++ b/client/jpeg_decoder.cpp @@ -23,7 +23,7 @@ #include "debug.h" #include "utils.h" -#if !defined(jpeg_boolean) && !defined(__MINGW32__) +#if !defined(jpeg_boolean) #define jpeg_boolean boolean #endif diff --git a/client/jpeg_decoder.h b/client/jpeg_decoder.h index 34aa3362..45d75d7c 100644 --- a/client/jpeg_decoder.h +++ b/client/jpeg_decoder.h @@ -22,7 +22,7 @@ #include "common.h" #include "red_canvas_base.h" -#ifdef WIN32 +#if defined(WIN32) && !defined(__MINGW32__) /* We need some hacks to avoid warnings from the jpeg headers */ #define XMD_H #undef FAR diff --git a/client/mjpeg_decoder.cpp b/client/mjpeg_decoder.cpp index 0ac6eaee..28d4f082 100644 --- a/client/mjpeg_decoder.cpp +++ b/client/mjpeg_decoder.cpp @@ -24,7 +24,7 @@ #include "utils.h" #include "mjpeg_decoder.h" -#if !defined(jpeg_boolean) && !defined(__MINGW32__) +#if !defined(jpeg_boolean) #define jpeg_boolean boolean #endif From 4236d1440b328223fec50a0367647740f38abcd6 Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Fri, 13 Jan 2012 12:41:18 +0200 Subject: [PATCH 23/47] client/common: mingw32: workaround HAVE_STDLIB_H redefined in jconfig.h --- client/red_gdi_canvas.cpp | 3 +++ common/gdi_canvas.c | 3 +++ common/sw_canvas.c | 3 +++ 3 files changed, 9 insertions(+) diff --git a/client/red_gdi_canvas.cpp b/client/red_gdi_canvas.cpp index ed091af1..6ac2e8a6 100644 --- a/client/red_gdi_canvas.cpp +++ b/client/red_gdi_canvas.cpp @@ -15,6 +15,9 @@ License along with this library; if not, see . */ #ifdef HAVE_CONFIG_H +#ifdef __MINGW32__ +#undef HAVE_STDLIB_H +#endif #include #endif diff --git a/common/gdi_canvas.c b/common/gdi_canvas.c index f67aadf5..64fbbf5c 100644 --- a/common/gdi_canvas.c +++ b/common/gdi_canvas.c @@ -16,6 +16,9 @@ License along with this library; if not, see . */ #ifdef HAVE_CONFIG_H +#ifdef __MINGW32__ +#undef HAVE_STDLIB_H +#endif #include #endif diff --git a/common/sw_canvas.c b/common/sw_canvas.c index 651c52bc..0f67c808 100644 --- a/common/sw_canvas.c +++ b/common/sw_canvas.c @@ -16,6 +16,9 @@ License along with this library; if not, see . */ #ifdef HAVE_CONFIG_H +#ifdef __MINGW32__ +#undef HAVE_STDLIB_H +#endif #include #endif From 54a7b36a57618b7c43d64c6b063fe367d700be48 Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Fri, 13 Jan 2012 12:42:09 +0200 Subject: [PATCH 24/47] client/windows/main: mingw32 provides PACKAGE_VERSION --- client/windows/main.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/client/windows/main.cpp b/client/windows/main.cpp index 62044980..46af699b 100644 --- a/client/windows/main.cpp +++ b/client/windows/main.cpp @@ -41,6 +41,13 @@ static void init_winsock() } } +#ifdef __MINGW32__ +// XXX: for mingw32 we can do both actually, but it seems easier +// to just use the autoconf provided PACKAGE_VERSION. +static void init_version_string() +{ +} +#else const char* PACKAGE_VERSION = "???"; static char _version_string[40]; @@ -68,6 +75,7 @@ static void init_version_string() (int)(file_info->dwFileVersionLS & 0x0ffff)); PACKAGE_VERSION = _version_string; } +#endif int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, From fe6119764379e20336989585fb13ab1a3ba945bc Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Fri, 13 Jan 2012 12:54:50 +0200 Subject: [PATCH 25/47] client/windows: fix typo, make error messages unique --- client/windows/platform_utils.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/windows/platform_utils.cpp b/client/windows/platform_utils.cpp index b57e921a..a4405c1e 100644 --- a/client/windows/platform_utils.cpp +++ b/client/windows/platform_utils.cpp @@ -51,7 +51,7 @@ HBITMAP get_bitmap_res(int id) { HBITMAP bitmap = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(id)); if (!bitmap) { - THROW("get bitmpa #%d failed", id); + THROW("get bitmap #%d failed", id); } return bitmap; } @@ -61,7 +61,7 @@ HBITMAP get_alpha_bitmap_res(int id) AutoGDIObject bitmap(LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(id), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_SHARED)); if (!bitmap.valid()) { - THROW("get bitmpa #%d failed", id); + THROW("get alpha bitmap #%d failed", id); } BITMAP src_info; From 96c292a0b491ac1ed8d352b4ee0bb099a6ec7332 Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Fri, 13 Jan 2012 12:55:30 +0200 Subject: [PATCH 26/47] client/windows: arraysize(inf.bmiColors) == 1 in mingw32 --- client/windows/red_pixmap_gdi.cpp | 3 +++ client/windows/red_pixmap_sw.cpp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/client/windows/red_pixmap_gdi.cpp b/client/windows/red_pixmap_gdi.cpp index 4336f461..2d93113d 100644 --- a/client/windows/red_pixmap_gdi.cpp +++ b/client/windows/red_pixmap_gdi.cpp @@ -64,9 +64,12 @@ RedPixmapGdi::RedPixmapGdi(int width, int height, RedDrawable::Format format, bo bitmap_info.inf.bmiColors[0].rgbRed = 0; bitmap_info.inf.bmiColors[0].rgbGreen = 0; bitmap_info.inf.bmiColors[0].rgbBlue = 0; +#ifndef __MINGW32__ + // inf.bmiColors is [1] in mingw/include/wingdi.h bitmap_info.inf.bmiColors[1].rgbRed = 0xff; bitmap_info.inf.bmiColors[1].rgbGreen = 0xff; bitmap_info.inf.bmiColors[1].rgbBlue = 0xff; +#endif break; case RedDrawable::RGB16_565: pixel_format = (DWORD *)bitmap_info.inf.bmiColors; diff --git a/client/windows/red_pixmap_sw.cpp b/client/windows/red_pixmap_sw.cpp index 991b6735..9ed1460d 100644 --- a/client/windows/red_pixmap_sw.cpp +++ b/client/windows/red_pixmap_sw.cpp @@ -77,9 +77,12 @@ RedPixmapSw::RedPixmapSw(int width, int height, RedDrawable::Format format, bitmap_info.inf.bmiColors[0].rgbRed = 0; bitmap_info.inf.bmiColors[0].rgbGreen = 0; bitmap_info.inf.bmiColors[0].rgbBlue = 0; +#ifndef __MINGW32__ + // inf.bmiColors is [1] in mingw/include/wingdi.h bitmap_info.inf.bmiColors[1].rgbRed = 0xff; bitmap_info.inf.bmiColors[1].rgbGreen = 0xff; bitmap_info.inf.bmiColors[1].rgbBlue = 0xff; +#endif break; case RedDrawable::RGB16_565: pixel_format = (DWORD *)bitmap_info.inf.bmiColors; From a9bf7497797ca24ae23e0c5e7f7e0a4a6096c309 Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Fri, 13 Jan 2012 12:56:07 +0200 Subject: [PATCH 27/47] client/windows: fix several assigned but not used errors --- client/windows/red_window.cpp | 3 +-- common/gdi_canvas.c | 24 +++++++++--------------- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/client/windows/red_window.cpp b/client/windows/red_window.cpp index 981fe9a5..89a33c9a 100644 --- a/client/windows/red_window.cpp +++ b/client/windows/red_window.cpp @@ -179,9 +179,8 @@ LRESULT CALLBACK RedWindow_p::WindowProc(HWND hWnd, UINT message, WPARAM wParam, switch (message) { case WM_PAINT: { PAINTSTRUCT ps; - HDC hdc; - hdc = BeginPaint(hWnd, &ps); + BeginPaint(hWnd, &ps); SpicePoint origin = window->get_origin(); SpiceRect r; r.left = ps.rcPaint.left - origin.x; diff --git a/common/gdi_canvas.c b/common/gdi_canvas.c index 64fbbf5c..5db3e831 100644 --- a/common/gdi_canvas.c +++ b/common/gdi_canvas.c @@ -461,9 +461,6 @@ static void copy_bitmap_alpha(const uint8_t *src_alpha, int height, int width, i uint8_t i_offset; int i_count = 0; int i = 0; - int width_div_stride; - - width_div_stride = width / src_stride; if (alpha_bits_size == 1) { i_offset = 1; @@ -1602,7 +1599,6 @@ static void gdi_canvas_draw_text(SpiceCanvas *spice_canvas, SpiceRect *bbox, Spi static uint32_t *gdi_get_userstyle(GdiCanvas *canvas, uint8_t nseg, SPICE_FIXED28_4* style, int start_is_gap) { - double offset = 0; uint32_t *local_style; int i; @@ -1612,7 +1608,6 @@ static uint32_t *gdi_get_userstyle(GdiCanvas *canvas, uint8_t nseg, SPICE_FIXED2 local_style = spice_new(uint32_t , nseg); if (start_is_gap) { - offset = (uint32_t)fix_to_double(*style); local_style[nseg - 1] = (uint32_t)fix_to_double(*style); style++; @@ -1815,24 +1810,23 @@ SpiceCanvas *gdi_canvas_create(int width, int height, ) { GdiCanvas *canvas; - int init_ok; if (need_init) { return NULL; } canvas = spice_new0(GdiCanvas, 1); - init_ok = canvas_base_init(&canvas->base, &gdi_canvas_ops, - width, height, format + canvas_base_init(&canvas->base, &gdi_canvas_ops, + width, height, format, #ifdef SW_CANVAS_CACHE - ,bits_cache - ,palette_cache + bits_cache, + palette_cache, #elif defined(SW_CANVAS_IMAGE_CACHE) - , bits_cache + bits_cache, #endif - , surfaces - , glz_decoder - , jpeg_decoder - , zlib_decoder); + surfaces, + glz_decoder, + jpeg_decoder, + zlib_decoder); canvas->dc = dc; canvas->lock = lock; return (SpiceCanvas *)canvas; From c7f4e52000bfdd7a0f502abecd5da444c3709c38 Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Fri, 13 Jan 2012 12:56:59 +0200 Subject: [PATCH 28/47] common/backtrace: for mingw32 no pipe/wait_pid, just disable --- common/backtrace.c | 25 ++++++++++++++++++++++--- common/backtrace.h | 2 +- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/common/backtrace.c b/common/backtrace.c index 650dc1d7..6fabdf02 100644 --- a/common/backtrace.c +++ b/common/backtrace.c @@ -26,8 +26,12 @@ #include #include #include +#include #include +#ifndef __MINGW32__ #include +#endif + #include "spice_common.h" #define GSTACK_PATH "/usr/bin/gstack" @@ -49,6 +53,10 @@ static void spice_backtrace_backtrace(void) } #endif +/* XXX perhaps gstack can be available in windows but pipe/waitpid isn't, + * so until it is ported properly just compile it out, we lose the + * backtrace only. */ +#ifndef __MINGW32__ static int spice_backtrace_gstack(void) { pid_t kidpid; @@ -104,11 +112,22 @@ static int spice_backtrace_gstack(void) } return 0; } +#else +static int spice_backtrace_gstack(void) +{ + /* empty failing implementation */ + return -1; +} +#endif + +void spice_backtrace(void) +{ + int ret = -1; -void spice_backtrace() { if (!access(GSTACK_PATH, X_OK)) { - spice_backtrace_gstack(); - } else { + ret = spice_backtrace_gstack(); + } + if (ret != 0) { spice_backtrace_backtrace(); } } diff --git a/common/backtrace.h b/common/backtrace.h index 8fcbb782..894c0277 100644 --- a/common/backtrace.h +++ b/common/backtrace.h @@ -23,7 +23,7 @@ SPICE_BEGIN_DECLS -#ifdef WIN32 +#if defined(WIN32) && !defined(__MINGW32__) #define spice_backtrace() #else void spice_backtrace(void); From 7a63185b9bf063fe23a470be4ecac6082cbb1a91 Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Fri, 13 Jan 2012 12:57:35 +0200 Subject: [PATCH 29/47] common/bitops: mingw32: reorder so __GNUC__ define is checked first --- common/bitops.h | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/common/bitops.h b/common/bitops.h index 449409bd..bdd862a3 100644 --- a/common/bitops.h +++ b/common/bitops.h @@ -27,7 +27,20 @@ extern "C" { #endif -#if defined(WIN32) && !defined(_WIN64) +#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) +static inline int spice_bit_find_msb(unsigned int val) +{ + int ret; + + asm ("bsrl %1,%0\n\t" + "jnz 1f\n\t" + "movl $-1,%0\n" + "1:" + : "=r"(ret) : "r"(val)); + return ret + 1; +} + +#elif defined(WIN32) && !defined(_WIN64) static INLINE int spice_bit_find_msb(uint32_t val) { uint32_t r; @@ -42,19 +55,6 @@ found: return r + 1; } -#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) -static inline int spice_bit_find_msb(unsigned int val) -{ - int ret; - - asm ("bsrl %1,%0\n\t" - "jnz 1f\n\t" - "movl $-1,%0\n" - "1:" - : "=r"(ret) : "r"(val)); - return ret + 1; -} - #else static INLINE int spice_bit_find_msb(unsigned int val) { From 8a36c625a64dee573c157256fe2a681a93a6aefe Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Fri, 13 Jan 2012 12:58:08 +0200 Subject: [PATCH 30/47] common/ssl_verify: special case to WIN32 that isn't MINGW32 --- common/ssl_verify.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/ssl_verify.h b/common/ssl_verify.h index 8235c136..b8306f31 100644 --- a/common/ssl_verify.h +++ b/common/ssl_verify.h @@ -19,7 +19,7 @@ #ifndef SSL_VERIFY_H #define SSL_VERIFY_H -#ifdef WIN32 +#if defined(WIN32) && !defined(__MINGW32__) #include #include #endif From 64f4826b6d6918b81d336f8c4296dc6094067f64 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Mon, 12 Dec 2011 17:48:51 +0000 Subject: [PATCH 31/47] Death to all TABs Source files should all use spaces instead of tabs for indentation. Update the few files not already in compliance --- autogen.sh | 42 +- client/demarshallers.h | 2 +- client/glz_decoder_config.h | 12 +- client/red_channel.h | 14 +- client/red_gdi_canvas.h | 2 +- client/red_peer.h | 2 +- client/windows/stdint.h | 16 +- client/x11/images/alt_image.c | 1464 ++++++++++++++++----------------- client/x11/x_platform.h | 14 +- common/canvas_base.h | 112 +-- common/gdi_canvas.c | 42 +- common/gdi_canvas.h | 2 +- common/gl_canvas.h | 2 +- common/pixman_utils.c | 2 +- common/sw_canvas.c | 16 +- common/sw_canvas.h | 4 +- server/demarshallers.h | 2 +- server/jpeg_encoder.c | 2 +- server/red_worker.c | 2 +- 19 files changed, 877 insertions(+), 877 deletions(-) diff --git a/autogen.sh b/autogen.sh index 2619803e..217cc22e 100755 --- a/autogen.sh +++ b/autogen.sh @@ -93,35 +93,35 @@ version_check() { vc_checkprog=`eval echo "\\$$vc_variable"` if [ -n "$vc_checkprog" ]; then - printbold "using $vc_checkprog for $vc_package" - return 0 + printbold "using $vc_checkprog for $vc_package" + return 0 fi printbold "checking for $vc_package >= $vc_min_version..." for vc_checkprog in $vc_checkprogs; do - echo $ECHO_N " testing $vc_checkprog... " - if $vc_checkprog --version < /dev/null > /dev/null 2>&1; then - vc_actual_version=`$vc_checkprog --version | head -n 1 | \ + echo $ECHO_N " testing $vc_checkprog... " + if $vc_checkprog --version < /dev/null > /dev/null 2>&1; then + vc_actual_version=`$vc_checkprog --version | head -n 1 | \ sed 's/^.*[ ]\([0-9.]*[a-z]*\).*$/\1/'` - if compare_versions $vc_min_version $vc_actual_version; then - echo "found $vc_actual_version" - # set variable - eval "$vc_variable=$vc_checkprog" - vc_status=0 - break - else - echo "too old (found version $vc_actual_version)" - fi - else - echo "not found." - fi + if compare_versions $vc_min_version $vc_actual_version; then + echo "found $vc_actual_version" + # set variable + eval "$vc_variable=$vc_checkprog" + vc_status=0 + break + else + echo "too old (found version $vc_actual_version)" + fi + else + echo "not found." + fi done if [ "$vc_status" != 0 ]; then - printerr "***Error***: You must have $vc_package >= $vc_min_version installed" - printerr " to build $PROJECT. Download the appropriate package for" - printerr " from your distribution or get the source tarball at" + printerr "***Error***: You must have $vc_package >= $vc_min_version installed" + printerr " to build $PROJECT. Download the appropriate package for" + printerr " from your distribution or get the source tarball at" printerr " $vc_source" - printerr + printerr fi return $vc_status } diff --git a/client/demarshallers.h b/client/demarshallers.h index fc2f75ae..6d54ecea 100644 --- a/client/demarshallers.h +++ b/client/demarshallers.h @@ -19,7 +19,7 @@ typedef void (*message_destructor_t)(uint8_t *message); typedef uint8_t * (*spice_parse_channel_func_t)(uint8_t *message_start, uint8_t *message_end, uint16_t message_type, int minor, - size_t *size_out, message_destructor_t *free_message); + size_t *size_out, message_destructor_t *free_message); spice_parse_channel_func_t spice_get_server_channel_parser(uint32_t channel, unsigned int *max_message_type); spice_parse_channel_func_t spice_get_server_channel_parser1(uint32_t channel, unsigned int *max_message_type); diff --git a/client/glz_decoder_config.h b/client/glz_decoder_config.h index 24c95ba9..835e2a70 100644 --- a/client/glz_decoder_config.h +++ b/client/glz_decoder_config.h @@ -48,12 +48,12 @@ public: #ifdef RED_DEBUG -#define GLZ_ASSERT(debug, x) { \ - if (!(x)) { \ - std::ostringstream os; \ - os << __FUNCTION__ << ": ASSERT " << #x << " failed\n"; \ - (debug).error(os.str()); \ - } \ +#define GLZ_ASSERT(debug, x) { \ + if (!(x)) { \ + std::ostringstream os; \ + os << __FUNCTION__ << ": ASSERT " << #x << " failed\n"; \ + (debug).error(os.str()); \ + } \ } #else diff --git a/client/red_channel.h b/client/red_channel.h index ee5b1851..8128626f 100644 --- a/client/red_channel.h +++ b/client/red_channel.h @@ -296,13 +296,13 @@ void MessageHandlerImp::handle_message(RedPeer::Compou message_destructor_t parsed_free; if (_parser == NULL) { - /* We need to do this lazily rather than at constuction because we - don't know the major until we've connected */ - if (_obj.get_peer_major() == 1) { - _parser = spice_get_server_channel_parser1(channel_id, NULL); - } else { - _parser = spice_get_server_channel_parser(channel_id, NULL); - } + /* We need to do this lazily rather than at constuction because we + don't know the major until we've connected */ + if (_obj.get_peer_major() == 1) { + _parser = spice_get_server_channel_parser1(channel_id, NULL); + } else { + _parser = spice_get_server_channel_parser(channel_id, NULL); + } } if (message.sub_list()) { diff --git a/client/red_gdi_canvas.h b/client/red_gdi_canvas.h index 02b08b04..67a2dbab 100644 --- a/client/red_gdi_canvas.h +++ b/client/red_gdi_canvas.h @@ -32,7 +32,7 @@ class RedPixmap; class GDICanvas: public Canvas { public: GDICanvas(int width, int height, uint32_t format, - PixmapCache& pixmap_cache, PaletteCache& palette_cache, + PixmapCache& pixmap_cache, PaletteCache& palette_cache, GlzDecoderWindow &glz_decoder_window, SurfacesCache &csurfaces); virtual ~GDICanvas(); diff --git a/client/red_peer.h b/client/red_peer.h index 89323570..ce06143c 100644 --- a/client/red_peer.h +++ b/client/red_peer.h @@ -69,7 +69,7 @@ public: }; ConnectionOptions(Type in_type, int in_port, int in_sport, - int in_protocol, + int in_protocol, const HostAuthOptions& in_host_auth, const std::string& in_ciphers) : type (in_type) diff --git a/client/windows/stdint.h b/client/windows/stdint.h index 768ca033..eaeb1996 100644 --- a/client/windows/stdint.h +++ b/client/windows/stdint.h @@ -338,21 +338,21 @@ typedef unsigned long long uintmax_t; Accoding to Douglas Gwyn : - "This spec was changed in ISO/IEC 9899:1999 TC1; in ISO/IEC + "This spec was changed in ISO/IEC 9899:1999 TC1; in ISO/IEC - 9899:1999 as initially published, the expansion was required + 9899:1999 as initially published, the expansion was required - to be an integer constant of precisely matching type, which + to be an integer constant of precisely matching type, which - is impossible to accomplish for the shorter types on most + is impossible to accomplish for the shorter types on most - platforms, because C99 provides no standard way to designate + platforms, because C99 provides no standard way to designate - an integer constant with width less than that of type int. + an integer constant with width less than that of type int. - TC1 changed this to require just an integer constant + TC1 changed this to require just an integer constant - *expression* with *promoted* type." + *expression* with *promoted* type." */ diff --git a/client/x11/images/alt_image.c b/client/x11/images/alt_image.c index e11cf1f1..cf5d6cb8 100644 --- a/client/x11/images/alt_image.c +++ b/client/x11/images/alt_image.c @@ -1,735 +1,735 @@ static const struct { - int width; - int height; - uint8_t pixel_data[17496]; + int width; + int height; + uint8_t pixel_data[17496]; } _alt_image = { 81, 54, { - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x16,0x16,0x16,0x2d,0x39,0x39,0x39,0x70,0x48,0x48,0x48,0x8e,0x58,0x58,0x58,0xae,0x68,0x68,0x68,0xcd, - 0x78,0x78,0x78,0xec,0x82,0x82,0x82,0xff,0x81,0x81,0x81,0xfe,0x80,0x80,0x80,0xfd,0x80,0x80,0x80,0xfc,0x7f,0x7f,0x7f,0xfb, - 0x7f,0x7f,0x7f,0xfa,0x7e,0x7e,0x7e,0xf9,0x7e,0x7e,0x7e,0xf8,0x7e,0x7e,0x7e,0xf8,0x7d,0x7d,0x7d,0xf7,0x7d,0x7d,0x7d,0xf6, - 0x7c,0x7c,0x7c,0xf5,0x7c,0x7c,0x7c,0xf4,0x7b,0x7b,0x7b,0xf3,0x7b,0x7b,0x7b,0xf2,0x7a,0x7a,0x7a,0xf1,0x7a,0x7a,0x7a,0xf0, - 0x79,0x79,0x79,0xef,0x79,0x79,0x79,0xee,0x78,0x78,0x78,0xed,0x78,0x78,0x78,0xec,0x77,0x77,0x77,0xeb,0x77,0x77,0x77,0xea, - 0x76,0x76,0x76,0xe9,0x76,0x76,0x76,0xe8,0x75,0x75,0x75,0xe7,0x75,0x75,0x75,0xe6,0x74,0x74,0x74,0xe5,0x74,0x74,0x74,0xe4, - 0x74,0x74,0x74,0xe4,0x73,0x73,0x73,0xe3,0x73,0x73,0x73,0xe2,0x72,0x72,0x72,0xe1,0x72,0x72,0x72,0xe0,0x71,0x71,0x71,0xdf, - 0x71,0x71,0x71,0xde,0x70,0x70,0x70,0xdd,0x70,0x70,0x70,0xdc,0x6f,0x6f,0x6f,0xdb,0x6f,0x6f,0x6f,0xda,0x6e,0x6e,0x6e,0xd9, - 0x6e,0x6e,0x6e,0xd8,0x6d,0x6d,0x6d,0xd7,0x6d,0x6d,0x6d,0xd6,0x6c,0x6c,0x6c,0xd5,0x6c,0x6c,0x6c,0xd4,0x6b,0x6b,0x6b,0xd3, - 0x6b,0x6b,0x6b,0xd2,0x6a,0x6a,0x6a,0xd1,0x6a,0x6a,0x6a,0xd1,0x69,0x69,0x69,0xcf,0x61,0x61,0x61,0xc0,0x60,0x60,0x60,0xca, - 0x64,0x64,0x64,0xe2,0x5b,0x5b,0x5b,0xd3,0x52,0x52,0x52,0xc2,0x47,0x47,0x47,0xad,0x33,0x33,0x33,0x87,0x19,0x19,0x19,0x55, - 0x0b,0x0b,0x0b,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x11,0x11,0x23,0x53,0x53,0x53,0xa4,0x80,0x80,0x80,0xfd,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x79,0x79,0x79,0xff,0x64,0x64,0x64,0xff,0x3f,0x3f,0x3f,0xc4,0x1c,0x1c,0x1c,0x5d, - 0x02,0x02,0x02,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x0a,0x15,0x4c,0x4c,0x4c,0x96,0x7f,0x7f,0x7f,0xfa, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x81,0x81,0x81,0xff,0x70,0x70,0x70,0xff,0x4d,0x4d,0x4d,0xf1,0x2c,0x2c,0x2c,0x95,0x03,0x03,0x03,0x0a, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x02, - 0x62,0x62,0x62,0xc2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x7b,0x7b,0x7b,0xff,0x54,0x54,0x54,0xff,0x3b,0x3b,0x3b,0xc5,0x04,0x04,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x3e,0x3e,0x7b,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x83,0x7f,0x80,0xee,0x88,0x7d,0x7e,0xce,0x88,0x7c,0x7c,0xc2,0x8a,0x7a,0x7c,0xb7, - 0x8c,0x7a,0x7b,0xac,0x8d,0x79,0x7a,0xa5,0x8c,0x79,0x7a,0xa5,0x8d,0x79,0x7b,0xa6,0x8c,0x79,0x7b,0xa6,0x8c,0x79,0x7b,0xa6, - 0x8c,0x79,0x7b,0xa7,0x8c,0x79,0x7b,0xa7,0x8c,0x79,0x7a,0xa7,0x8c,0x79,0x7a,0xa7,0x8c,0x79,0x7b,0xa8,0x8c,0x79,0x7b,0xa8, - 0x8d,0x79,0x7b,0xa9,0x8c,0x79,0x7b,0xa9,0x8c,0x79,0x7b,0xa9,0x8c,0x7a,0x7b,0xaa,0x8c,0x79,0x7b,0xaa,0x8c,0x79,0x7b,0xaa, - 0x8c,0x7a,0x7b,0xab,0x8c,0x79,0x7b,0xab,0x8c,0x79,0x7b,0xab,0x8c,0x7a,0x7b,0xac,0x8c,0x79,0x7b,0xac,0x8b,0x79,0x7b,0xac, - 0x8c,0x7a,0x7b,0xad,0x8b,0x79,0x7b,0xad,0x8b,0x79,0x7b,0xad,0x8b,0x7a,0x7b,0xae,0x8b,0x79,0x7b,0xae,0x8c,0x7a,0x7c,0xaf, - 0x8c,0x7a,0x7b,0xaf,0x8c,0x7a,0x7b,0xaf,0x8b,0x7a,0x7b,0xaf,0x8c,0x7a,0x7c,0xb0,0x8b,0x7a,0x7b,0xb0,0x8b,0x7a,0x7b,0xb0, - 0x8c,0x7a,0x7c,0xb1,0x8b,0x7a,0x7b,0xb1,0x8b,0x7a,0x7b,0xb1,0x8b,0x7a,0x7c,0xb2,0x8b,0x7a,0x7c,0xb2,0x8a,0x7a,0x7b,0xb2, - 0x8b,0x7a,0x7c,0xb3,0x8a,0x7a,0x7c,0xb3,0x8a,0x7a,0x7b,0xb3,0x8b,0x7a,0x7c,0xb4,0x8b,0x7a,0x7c,0xb4,0x8b,0x7a,0x7c,0xb5, - 0x8b,0x7a,0x7c,0xb5,0x8b,0x7a,0x7c,0xb5,0x8b,0x7a,0x7c,0xb6,0x8a,0x7a,0x7c,0xb6,0x8a,0x7b,0x7c,0xbc,0x8c,0x7e,0x80,0xcc, - 0x8d,0x80,0x82,0xd8,0x8c,0x82,0x83,0xe0,0x8c,0x83,0x84,0xe7,0x89,0x83,0x84,0xf1,0x82,0x82,0x82,0xfe,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x7b,0x7b,0x7b,0xff,0x4f,0x4f,0x4f,0xff, - 0x3a,0x3a,0x3a,0xc3,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x1b,0x1b,0x36,0x7f,0x7f,0x7f,0xfb, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x83,0x80,0x80,0xf3,0x89,0x7c,0x7d,0xc5,0x8c,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8c,0x79,0x7b,0xac,0x87,0x7d,0x7e,0xcd,0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x69,0x69,0x69,0xff,0x4d,0x4d,0x4d,0xff,0x1c,0x1c,0x1c,0x5f,0x00,0x00,0x00,0x00, - 0x02,0x02,0x02,0x04,0x6f,0x6f,0x6f,0xdb,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x83,0x81,0x81,0xf7, - 0x8c,0x7a,0x7b,0xad,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8c,0x79,0x7b,0xa7,0x86,0x7f,0x7f,0xe1,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x81,0x81,0x81,0xff, - 0x50,0x50,0x50,0xff,0x44,0x44,0x44,0xe4,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x81,0x81,0x81,0xfe,0x89,0x7b,0x7c,0xbc,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8c,0x79,0x7b,0xa9,0x83,0x81,0x81,0xf6, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x5c,0x5c,0x5c,0xff,0x4d,0x4d,0x4d,0xff,0x0b,0x0b,0x0b,0x26, - 0x33,0x33,0x33,0x65,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x85,0x7f,0x7f,0xe2,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x86,0x7e,0x7f,0xda,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x68,0x68,0x68,0xff,0x4d,0x4d,0x4d,0xff,0x1d,0x1d,0x1d,0x61,0x4f,0x4f,0x4f,0x9b,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x87,0x7d,0x7e,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x7a,0x69,0x6b,0xb0,0x4c,0x40,0x42,0xcf,0x4c,0x40,0x42,0xcf,0x4c,0x40,0x42,0xcf, - 0x4c,0x40,0x42,0xcf,0x4c,0x40,0x42,0xcf,0x4c,0x40,0x42,0xcf,0x82,0x6f,0x71,0xac,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x88,0x7b,0x7d,0xc4, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x75,0x75,0x75,0xff,0x4d,0x4d,0x4d,0xff,0x2f,0x2f,0x2f,0x9d, - 0x6a,0x6a,0x6a,0xd0,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8a,0x7b,0x7d,0xbc,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x75,0x64,0x67,0xb4,0x6f,0x5f,0x60,0xb8,0x6f,0x5f,0x60,0xb8,0x6f,0x5f,0x60,0xb8, - 0x6f,0x5f,0x60,0xb8,0x6f,0x5f,0x60,0xb8,0x6f,0x5f,0x60,0xb8,0x6f,0x5f,0x60,0xb8,0x7c,0x6a,0x6c,0xb0,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, - 0x2e,0x28,0x28,0xe2,0x95,0x92,0x95,0xf4,0x95,0x92,0x95,0xf4,0x95,0x92,0x95,0xf4,0x95,0x92,0x95,0xf4,0x95,0x92,0x95,0xf4, - 0xb2,0xab,0xad,0xe1,0x9f,0x90,0x92,0xbd,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8c,0x7a,0x7b,0xaf,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x80,0x80,0x80,0xff,0x4e,0x4e,0x4e,0xff,0x41,0x41,0x41,0xd9,0x7f,0x7f,0x7f,0xfb,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x8c,0x7a,0x7b,0xaa,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x89,0x75,0x77,0xa7,0x32,0x2a,0x2b,0xdf, - 0x51,0x4c,0x4e,0xe8,0x6b,0x68,0x69,0xed,0x6b,0x68,0x69,0xed,0x6b,0x68,0x69,0xed,0x6b,0x68,0x69,0xed,0x6b,0x68,0x69,0xed, - 0x6b,0x68,0x69,0xed,0x78,0x73,0x74,0xe4,0xa3,0x96,0x98,0xc3,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x80,0x6e,0x70,0xac,0x80,0x6e,0x70,0xac, - 0x80,0x6e,0x70,0xac,0x80,0x6e,0x70,0xac,0x80,0x6e,0x70,0xac,0x80,0x6e,0x70,0xac,0x87,0x74,0x76,0xa8,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x83,0x80,0x80,0xf5,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x53,0x53,0x53,0xff,0x4d,0x4d,0x4d,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x6f,0x60,0x61,0xb7,0x2e,0x27,0x28,0xe1,0x87,0x83,0x86,0xf2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb7,0xb1,0xb3,0xe3, - 0x93,0x80,0x82,0xac,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, - 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x4d,0x48,0x48,0xe7,0x57,0x53,0x54,0xe9,0x57,0x53,0x54,0xe9,0x57,0x53,0x54,0xe9, - 0x57,0x53,0x54,0xe9,0x81,0x76,0x78,0xcf,0x99,0x88,0x8a,0xb5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x80,0xf1,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4d,0x4d,0x4d,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x53,0x48,0x48,0xca,0x3b,0x35,0x36,0xe4, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xae,0xa9,0xab,0xe9,0xa0,0x91,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x83,0x80,0x80,0xf1,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4d,0x4d,0x4d,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8c,0x78,0x7a,0xa5,0x37,0x2f,0x30,0xdc,0x5d,0x58,0x59,0xea,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa4,0xa1,0xa4,0xef, - 0xae,0xa4,0xa6,0xd1,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, - 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x80,0xf1,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4d,0x4d,0x4d,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x78,0x67,0x69,0xb2,0x2e,0x27,0x28,0xe1,0x7e,0x7a,0x7d,0xf0, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x9a,0x9b,0xf4,0xb9,0xb2,0xb4,0xe1,0x8e,0x7b,0x7e,0xa8,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4d,0x4d,0x4d,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x5b,0x4e,0x4f,0xc4,0x33,0x2d,0x2e,0xe2,0x98,0x96,0x98,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xb0,0xab,0xad,0xe7,0x9b,0x8c,0x8e,0xb9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, - 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfe,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x3e,0x35,0x36,0xd7,0x52,0x4e,0x4f,0xe8,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa7,0xa3,0xa6,0xee,0xaa,0x9f,0xa0,0xcc,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfe, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x80,0x6d,0x6f,0xad, - 0x2e,0x27,0x28,0xe1,0x75,0x71,0x72,0xee,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9f,0x9d,0x9f,0xf3,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9e,0x9b,0x9d,0xf3,0xb6,0xaf,0xb2,0xdd,0x8d,0x79,0x7b,0xa6,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, - 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x89,0x75,0x77,0xa7,0x7a,0x69,0x6b,0xb0,0x7a,0x69,0x6b,0xb0, - 0x7a,0x68,0x6a,0xb1,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0xaa,0xa5,0xa8,0xec,0xa2,0x98,0x9b,0xd5,0x7a,0x69,0x6b,0xb0,0x7a,0x69,0x6b,0xb0,0x7a,0x69,0x6b,0xb0, - 0x7a,0x69,0x6b,0xb0,0x7a,0x69,0x6b,0xb0,0x8b,0x78,0x7a,0xa6,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfe,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x63,0x55,0x56,0xbf,0x2f,0x29,0x29,0xe2,0x94,0x91,0x94,0xf4,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaf,0xab,0xac,0xe8,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb3,0xae,0xaf,0xe6,0x98,0x87,0x8a,0xb4, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, - 0x7a,0x68,0x6a,0xb1,0x2e,0x27,0x28,0xe1,0x5b,0x56,0x56,0xe9,0x5e,0x59,0x59,0xea,0x5e,0x59,0x59,0xea,0x8d,0x8a,0x8c,0xf3, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x88,0x84,0x87,0xf2, - 0x5e,0x59,0x59,0xea,0x5e,0x59,0x59,0xea,0x5e,0x59,0x59,0xea,0x5e,0x59,0x59,0xea,0x5e,0x59,0x59,0xea,0x9c,0x8f,0x90,0xc3, - 0x94,0x82,0x83,0xae,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfe, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x46,0x3c,0x3d,0xd2, - 0x4a,0x45,0x45,0xe6,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa2,0x9e,0xa1,0xf1, - 0xba,0xb3,0xb6,0xe2,0x4f,0x4a,0x4a,0xe4,0x93,0x90,0x92,0xf4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0xaa,0xa5,0xa8,0xec,0xa7,0x9a,0x9c,0xc7,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, - 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x7a,0x68,0x6a,0xb1,0x2e,0x27,0x28,0xe1,0x95,0x92,0x95,0xf4, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb8,0xb2,0xb4,0xe3,0x9c,0x8d,0x8e,0xb9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfd,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x87,0x73,0x75,0xa9,0x30,0x29,0x2a,0xe0,0x6a,0x67,0x69,0xed,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xeb,0xb8,0xb0,0xb4,0xdf,0x4d,0x42,0x43,0xd0,0x75,0x71,0x72,0xee, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa0,0x9d,0x9f,0xf2,0xb4,0xab,0xae,0xd9, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, - 0x7a,0x68,0x6a,0xb1,0x2e,0x27,0x28,0xe1,0x95,0x92,0x95,0xf4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb8,0xb2,0xb4,0xe3, - 0x9c,0x8d,0x8e,0xb9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfd, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x6b,0x5c,0x5e,0xba,0x2e,0x27,0x28,0xe1, - 0x8d,0x8a,0x8c,0xf3,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb4,0xae,0xb0,0xe6, - 0xac,0xa2,0xa3,0xcf,0x66,0x57,0x59,0xbe,0x55,0x51,0x52,0xe9,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb5,0xb0,0xb2,0xe4,0x93,0x82,0x84,0xaf,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, - 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x7a,0x68,0x6a,0xb1,0x2e,0x27,0x28,0xe1,0x95,0x92,0x95,0xf4, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb8,0xb2,0xb4,0xe3,0x9c,0x8d,0x8e,0xb9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfd,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x4e,0x43,0x44,0xcd,0x40,0x3a,0x3c,0xe5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9d,0x9b,0x9d,0xf4,0xba,0xb4,0xb6,0xe1,0x9e,0x8f,0x93,0xbd,0x80,0x6e,0x70,0xad,0x38,0x31,0x31,0xe3, - 0x9a,0x97,0x9a,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xac,0xa7,0xaa,0xea, - 0xa2,0x95,0x98,0xc2,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, - 0x7a,0x68,0x6a,0xb1,0x2e,0x27,0x28,0xe1,0x95,0x92,0x95,0xf4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb8,0xb2,0xb4,0xe3, - 0x9c,0x8d,0x8e,0xb9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x82,0x80,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfd, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x77,0x79,0xa6,0x33,0x2c,0x2c,0xde,0x61,0x5d,0x5f,0xeb, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa6,0xa2,0xa4,0xee,0xba,0xb4,0xb6,0xe1, - 0x92,0x7f,0x81,0xac,0x8d,0x79,0x7a,0xa5,0x3c,0x33,0x34,0xd9,0x85,0x82,0x84,0xf1,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa2,0xa0,0xa1,0xf0,0xb0,0xa7,0xa9,0xd4,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, - 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x86,0x73,0x74,0xaa,0x66,0x57,0x59,0xbe,0xa9,0xa3,0xa6,0xe7, - 0xad,0xa9,0xaa,0xe9,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0xa6,0xa2,0xa4,0xee,0xad,0xa9,0xaa,0xe9,0xad,0xa9,0xaa,0xe9,0xad,0xa9,0xaa,0xe9,0xad,0xa9,0xaa,0xe9, - 0xad,0xa9,0xaa,0xe9,0xad,0xa9,0xaa,0xe9,0xb9,0xb3,0xb5,0xe2,0x9c,0x8d,0x8e,0xb9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x82,0x80,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfc,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x73,0x63,0x64,0xb5,0x2e,0x27,0x28,0xe1,0x83,0x7f,0x82,0xf1,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0xae,0xaa,0xac,0xe8,0xb2,0xa9,0xac,0xd8,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x57,0x4a,0x4b,0xc7, - 0x66,0x62,0x64,0xec,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9c,0x99,0x9c,0xf5, - 0xb8,0xb2,0xb4,0xe2,0x91,0x7e,0x80,0xaa,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x93,0x80,0x83,0xae,0x92,0x81,0x83,0xaf,0x3f,0x39,0x3a,0xe5,0x84,0x81,0x83,0xf1, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xae,0xa4,0xa6,0xd1, - 0x94,0x82,0x84,0xaf,0x94,0x82,0x84,0xaf,0x94,0x82,0x84,0xaf,0x94,0x82,0x84,0xaf,0x94,0x82,0x84,0xaf,0x94,0x82,0x84,0xaf, - 0x8e,0x7b,0x7d,0xa8,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x82,0x80,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfc, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x56,0x49,0x4b,0xc8,0x38,0x32,0x32,0xe3,0x9a,0x97,0x9a,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb7,0xb1,0xb3,0xe3,0xa7,0x9a,0x9b,0xc7, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x72,0x62,0x63,0xb6,0x48,0x42,0x44,0xe6,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xae,0xaa,0xac,0xe8,0x9e,0x8f,0x91,0xbc,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, - 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x82,0x80,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfc,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x3a,0x31,0x32,0xda,0x59,0x54,0x55,0xe9,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xa1,0x9e,0xa0,0xf1,0xba,0xb4,0xb6,0xe1,0x99,0x88,0x8a,0xb5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x89,0x75,0x77,0xa7, - 0x32,0x2b,0x2c,0xe0,0x95,0x92,0x95,0xf4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xa6,0xa2,0xa4,0xee,0xac,0xa1,0xa4,0xcf,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x83,0x80,0x81,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfc, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x7a,0x69,0x6b,0xb0,0x2e,0x27,0x28,0xe1,0x7a,0x77,0x78,0xef,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xec,0xb8,0xb1,0xb4,0xdf,0x8e,0x7b,0x7c,0xa7, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x48,0x3e,0x3f,0xd0,0x78,0x75,0x76,0xef,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9c,0x9b,0x9c,0xf4,0xb8,0xb1,0xb4,0xe0,0x8e,0x7b,0x7d,0xa7, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, - 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x81,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfb,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x5e,0x51,0x52,0xc3, - 0x32,0x2c,0x2c,0xe2,0x97,0x95,0x97,0xf4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xb3,0xae,0xaf,0xe6,0xac,0xa2,0xa4,0xcf,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x63,0x55,0x56,0xbf,0x58,0x53,0x54,0xe9,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0xb2,0xad,0xaf,0xe7,0x9a,0x89,0x8c,0xb7,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x83,0x80,0x81,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfb, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x41,0x38,0x39,0xd5,0x4f,0x4a,0x4c,0xe7,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9d,0x9b,0x9d,0xf4,0xba,0xb3,0xb6,0xe2,0x9f,0x91,0x93,0xbe,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x7e,0x6c,0x6e,0xaf,0x39,0x33,0x34,0xe3,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa8,0xa4,0xa6,0xed,0xa8,0x9c,0x9f,0xca, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, - 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x81,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfb,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x70,0x72,0xab,0x2e,0x28,0x28,0xe1, - 0x71,0x6d,0x6e,0xed,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9c,0x9b,0x9c,0xf4, - 0xa3,0xa0,0xa2,0xf0,0x54,0x4b,0x4c,0xd4,0x48,0x3e,0x3f,0xd0,0x48,0x3e,0x3f,0xd0,0x48,0x3e,0x3f,0xd0,0x48,0x3e,0x3f,0xd0, - 0x48,0x3e,0x3f,0xd0,0x2e,0x28,0x28,0xe1,0x88,0x85,0x86,0xf2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9f,0x9c,0x9e,0xf3,0xb6,0xae,0xb0,0xdc,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfb, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x67,0x58,0x59,0xbd,0x2f,0x28,0x29,0xe1,0x90,0x8d,0x90,0xf3,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x97,0x95,0x97,0xf5,0x97,0x95,0x97,0xf5, - 0x97,0x95,0x97,0xf5,0x97,0x95,0x97,0xf5,0x97,0x95,0x97,0xf5,0x97,0x95,0x97,0xf5,0x97,0x95,0x97,0xf5,0x9a,0x97,0x9a,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb4,0xae,0xb0,0xe5, - 0x96,0x85,0x88,0xb2,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, - 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfa,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x49,0x3e,0x40,0xd0,0x47,0x40,0x42,0xe6, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xeb,0xa5,0x98,0x99,0xc5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfa, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x88,0x75,0x77,0xa7,0x31,0x2a,0x2b,0xe0,0x67,0x63,0x64,0xec,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa1,0x9e,0xa0,0xf1, - 0xb3,0xaa,0xac,0xd7,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, - 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8c,0x78,0x7a,0xa5,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfa,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x6e,0x5e,0x5f,0xb8,0x2e,0x27,0x28,0xe1,0x89,0x86,0x88,0xf2, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe3,0x93,0x80,0x82,0xad,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x34,0x2d,0x2d,0xdd,0x7f,0x7c,0x7d,0xf0, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa7,0xa3,0xa5,0xed,0xad,0xa3,0xa5,0xd0, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfa, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x51,0x46,0x47,0xcb,0x3c,0x37,0x37,0xe4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xad,0xa9,0xaa,0xe9,0xa1,0x92,0x94,0xbf,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, - 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x3d,0x35,0x35,0xd7,0x74,0x70,0x73,0xee,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9f,0x9c,0x9f,0xf2,0xb6,0xaf,0xb1,0xdd,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfa,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8c,0x78,0x7a,0xa5,0x35,0x2d,0x2e,0xdd,0x5e,0x59,0x5b,0xea,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9e,0x9b,0x9d,0xf3,0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8, - 0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8, - 0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8,0xaf,0xa9,0xac,0xe9,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa4,0xa0,0xa3,0xef,0xb0,0xa5,0xa8,0xd2,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x48,0x3d,0x3e,0xd1,0x6a,0x65,0x67,0xec, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa1,0x9e,0xa0,0xf1, - 0x6d,0x61,0x64,0xce,0x6b,0x5c,0x5e,0xba,0x6c,0x5d,0x5e,0xba,0x6c,0x5d,0x5e,0xba,0x7c,0x6a,0x6d,0xb0,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xf9, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x76,0x65,0x67,0xb3, - 0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xa6,0xa2,0xa5,0xee,0xba,0xb4,0xb6,0xe1,0x93,0x81,0x83,0xae,0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9, - 0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9, - 0x42,0x3a,0x3a,0xda,0x85,0x82,0x85,0xf2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9c,0x99,0x9c,0xf5,0xb8,0xb1,0xb4,0xe1,0x8f,0x7c,0x7e,0xa9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, - 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x53,0x47,0x48,0xca,0x5e,0x59,0x5c,0xea,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x8b,0x88,0x8a,0xf2,0x71,0x6e,0x70,0xee, - 0x6f,0x6b,0x6b,0xed,0x8b,0x84,0x84,0xdc,0xa2,0x94,0x96,0xc1,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xf9,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x5a,0x4c,0x4e,0xc6,0x35,0x2f,0x2f,0xe3,0x99,0x97,0x99,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xae,0xaa,0xac,0xe8,0xb1,0xa9,0xac,0xd7,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x57,0x4a,0x4b,0xc7,0x66,0x62,0x64,0xec,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb0,0xab,0xad,0xe8,0x9d,0x8e,0x91,0xbb, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x75,0x64,0x66,0xb4,0x4d,0x48,0x4a,0xe7, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xec,0xb0,0xa7,0xa9,0xd4, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x83,0x81,0x81,0xf4,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xf9, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x3c,0x34,0x35,0xd8, - 0x55,0x50,0x51,0xe8,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xb8,0xb2,0xb4,0xe3,0xa4,0x98,0x9a,0xc5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x72,0x62,0x63,0xb6,0x47,0x41,0x43,0xe6,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0xa6,0xa2,0xa5,0xee,0xac,0xa0,0xa3,0xcd,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, - 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x41,0x38,0x39,0xd6,0x8d,0x8b,0x8d,0xf3,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xec,0xb0,0xa7,0xa9,0xd4,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x81,0x81,0xf4,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xf9,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x7e,0x6c,0x6e,0xae,0x2e,0x27,0x28,0xe1,0x76,0x72,0x75,0xee,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa2,0x9e,0xa1,0xf1,0xba,0xb4,0xb6,0xe1,0x98,0x87,0x8a,0xb4,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8a,0x76,0x78,0xa7,0x32,0x2b,0x2b,0xe0,0x94,0x91,0x94,0xf4, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9d,0x9b,0x9d,0xf4,0xb8,0xb0,0xb2,0xde, - 0x8e,0x7a,0x7c,0xa6,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x77,0x66,0x68,0xb3, - 0x64,0x5e,0x60,0xe5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xec,0xb0,0xa7,0xa9,0xd4, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x83,0x81,0x81,0xf4,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4a,0x4a,0x4a,0xf8, - 0x7e,0x7e,0x7e,0xf9,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8c,0x7a,0x7b,0xaa,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x62,0x54,0x55,0xc1,0x30,0x2a,0x2b,0xe2, - 0x96,0x93,0x95,0xf4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xeb, - 0xb8,0xb0,0xb3,0xde,0x8e,0x7a,0x7c,0xa6,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x49,0x3e,0x40,0xd0,0x76,0x73,0x75,0xef,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb2,0xad,0xaf,0xe6,0x99,0x88,0x8a,0xb5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, - 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x87,0x74,0x76,0xaa,0x7f,0x77,0x7b,0xdc,0x9e,0x9b,0x9d,0xf3, - 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, - 0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xec,0xb0,0xa7,0xa9,0xd4,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x81,0x81,0xf6,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x53,0x53,0x53,0xff,0x4a,0x4a,0x4a,0xf8,0x66,0x66,0x66,0xc9,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x89,0x7b,0x7c,0xbb,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x7e,0x6c,0x6e,0xaf,0x85,0x78,0x7a,0xc2,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6, - 0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb8,0xb2,0xb4,0xe3,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x80,0x6d,0x6f,0xad,0x8d,0x80,0x82,0xc7, - 0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb6,0xb0,0xb2,0xe3, - 0xa6,0x99,0x9d,0xc8,0x8d,0x79,0x7a,0xa5,0x87,0x73,0x75,0xa9,0x75,0x64,0x66,0xb5,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6, - 0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb9,0xb3,0xb5,0xe2,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x97,0x86,0x88,0xb2,0xa6,0x9a,0x9d,0xcb,0xa6,0x9d,0xa1,0xd7,0xac,0xa5,0xa7,0xe1, - 0xb1,0xac,0xae,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb6,0xb1,0xb2,0xe4,0xb0,0xa7,0xa9,0xd4, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8c,0x79,0x7b,0xa9, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x81,0x81,0x81,0xff,0x4e,0x4e,0x4e,0xff,0x4a,0x4a,0x4a,0xf8, - 0x4b,0x4b,0x4b,0x94,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8a,0x7f,0x80,0xd8,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8a,0x7a,0x7c,0xb7,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x79,0x79,0x79,0xff,0x4d,0x4d,0x4d,0xff,0x4a,0x4a,0x4a,0xf8,0x48,0x48,0x48,0xae,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x83,0x82,0x82,0xfb,0x8c,0x79,0x7b,0xab,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x86,0x7f,0x7f,0xde, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x71,0x71,0x71,0xff,0x4d,0x4d,0x4d,0xff,0x46,0x46,0x46,0xe8, - 0x25,0x25,0x25,0x6a,0x80,0x80,0x80,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x84,0x7f,0x7f,0xe7, - 0x8b,0x7a,0x7b,0xb0,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, - 0x8b,0x7a,0x7b,0xaf,0x85,0x7e,0x7f,0xdb,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x68,0x68,0x68,0xff,0x4d,0x4d,0x4d,0xff,0x39,0x39,0x39,0xc0,0x0a,0x0a,0x0a,0x23,0x66,0x66,0x66,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x81,0x80,0x81,0xfb,0x85,0x7f,0x80,0xe5,0x86,0x7d,0x7e,0xd7, - 0x88,0x7c,0x7d,0xca,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7, - 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7, - 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7, - 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7, - 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7, - 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7, - 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7, - 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7, - 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7, - 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x88,0x7c,0x7d,0xc6,0x88,0x7c,0x7d,0xc8, - 0x87,0x7d,0x7e,0xce,0x86,0x7d,0x7e,0xd4,0x85,0x7f,0x80,0xe6,0x81,0x81,0x81,0xfe,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x7b,0x7b,0x7b,0xff,0x51,0x51,0x51,0xff,0x4d,0x4d,0x4d,0xff,0x2d,0x2d,0x2d,0x98, - 0x00,0x00,0x00,0x00,0x46,0x46,0x46,0xe7,0x79,0x79,0x79,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x7d,0x7d,0x7d,0xff,0x54,0x54,0x54,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x21,0x21,0x21,0x70,0x00,0x00,0x00,0x00,0x1c,0x1c,0x1c,0x5e,0x55,0x55,0x55,0xff, - 0x75,0x75,0x75,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x7f,0x7f,0x7f,0xff,0x57,0x57,0x57,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x48,0x48,0x48,0xf1,0x0c,0x0c,0x0c,0x28, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x39,0x39,0xbd,0x4d,0x4d,0x4d,0xff,0x60,0x60,0x60,0xff,0x7d,0x7d,0x7d,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, - 0x82,0x82,0x82,0xff,0x76,0x76,0x76,0xff,0x62,0x62,0x62,0xff,0x50,0x50,0x50,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4a,0x4a,0x4a,0xf8,0x13,0x13,0x13,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x0b,0x27, - 0x45,0x45,0x45,0xe6,0x4d,0x4d,0x4d,0xff,0x4e,0x4e,0x4e,0xff,0x57,0x57,0x57,0xff,0x5e,0x5e,0x5e,0xff,0x66,0x66,0x66,0xff, - 0x6d,0x6d,0x6d,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff, - 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff, - 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff, - 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff, - 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff, - 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff, - 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff, - 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff, - 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff, - 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6c,0x6c,0x6c,0xff, - 0x68,0x68,0x68,0xff,0x65,0x65,0x65,0xff,0x61,0x61,0x61,0xff,0x54,0x54,0x54,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4c,0x4c,0x4c,0xfc,0x18,0x18,0x18,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x0c,0x29,0x29,0x29,0x89,0x4b,0x4b,0x4b,0xf9, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4c,0x4c,0x4c,0xfc,0x36,0x36,0x36,0xb4,0x15,0x15,0x15,0x46, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x0b,0x25,0x25,0x25,0x25,0x7b,0x30,0x30,0x30,0xa1,0x3c,0x3c,0x3c,0xc8, - 0x47,0x47,0x47,0xee,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, - 0x4c,0x4c,0x4c,0xfd,0x47,0x47,0x47,0xec,0x42,0x42,0x42,0xdd,0x3e,0x3e,0x3e,0xce,0x38,0x38,0x38,0xbc,0x23,0x23,0x23,0x75, - 0x07,0x07,0x07,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x16,0x16,0x16,0x2d,0x39,0x39,0x39,0x70,0x48,0x48,0x48,0x8e,0x58,0x58,0x58,0xae,0x68,0x68,0x68,0xcd, + 0x78,0x78,0x78,0xec,0x82,0x82,0x82,0xff,0x81,0x81,0x81,0xfe,0x80,0x80,0x80,0xfd,0x80,0x80,0x80,0xfc,0x7f,0x7f,0x7f,0xfb, + 0x7f,0x7f,0x7f,0xfa,0x7e,0x7e,0x7e,0xf9,0x7e,0x7e,0x7e,0xf8,0x7e,0x7e,0x7e,0xf8,0x7d,0x7d,0x7d,0xf7,0x7d,0x7d,0x7d,0xf6, + 0x7c,0x7c,0x7c,0xf5,0x7c,0x7c,0x7c,0xf4,0x7b,0x7b,0x7b,0xf3,0x7b,0x7b,0x7b,0xf2,0x7a,0x7a,0x7a,0xf1,0x7a,0x7a,0x7a,0xf0, + 0x79,0x79,0x79,0xef,0x79,0x79,0x79,0xee,0x78,0x78,0x78,0xed,0x78,0x78,0x78,0xec,0x77,0x77,0x77,0xeb,0x77,0x77,0x77,0xea, + 0x76,0x76,0x76,0xe9,0x76,0x76,0x76,0xe8,0x75,0x75,0x75,0xe7,0x75,0x75,0x75,0xe6,0x74,0x74,0x74,0xe5,0x74,0x74,0x74,0xe4, + 0x74,0x74,0x74,0xe4,0x73,0x73,0x73,0xe3,0x73,0x73,0x73,0xe2,0x72,0x72,0x72,0xe1,0x72,0x72,0x72,0xe0,0x71,0x71,0x71,0xdf, + 0x71,0x71,0x71,0xde,0x70,0x70,0x70,0xdd,0x70,0x70,0x70,0xdc,0x6f,0x6f,0x6f,0xdb,0x6f,0x6f,0x6f,0xda,0x6e,0x6e,0x6e,0xd9, + 0x6e,0x6e,0x6e,0xd8,0x6d,0x6d,0x6d,0xd7,0x6d,0x6d,0x6d,0xd6,0x6c,0x6c,0x6c,0xd5,0x6c,0x6c,0x6c,0xd4,0x6b,0x6b,0x6b,0xd3, + 0x6b,0x6b,0x6b,0xd2,0x6a,0x6a,0x6a,0xd1,0x6a,0x6a,0x6a,0xd1,0x69,0x69,0x69,0xcf,0x61,0x61,0x61,0xc0,0x60,0x60,0x60,0xca, + 0x64,0x64,0x64,0xe2,0x5b,0x5b,0x5b,0xd3,0x52,0x52,0x52,0xc2,0x47,0x47,0x47,0xad,0x33,0x33,0x33,0x87,0x19,0x19,0x19,0x55, + 0x0b,0x0b,0x0b,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x11,0x11,0x23,0x53,0x53,0x53,0xa4,0x80,0x80,0x80,0xfd,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x79,0x79,0x79,0xff,0x64,0x64,0x64,0xff,0x3f,0x3f,0x3f,0xc4,0x1c,0x1c,0x1c,0x5d, + 0x02,0x02,0x02,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x0a,0x15,0x4c,0x4c,0x4c,0x96,0x7f,0x7f,0x7f,0xfa, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x81,0x81,0x81,0xff,0x70,0x70,0x70,0xff,0x4d,0x4d,0x4d,0xf1,0x2c,0x2c,0x2c,0x95,0x03,0x03,0x03,0x0a, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x02, + 0x62,0x62,0x62,0xc2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x7b,0x7b,0x7b,0xff,0x54,0x54,0x54,0xff,0x3b,0x3b,0x3b,0xc5,0x04,0x04,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x3e,0x3e,0x7b,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x83,0x7f,0x80,0xee,0x88,0x7d,0x7e,0xce,0x88,0x7c,0x7c,0xc2,0x8a,0x7a,0x7c,0xb7, + 0x8c,0x7a,0x7b,0xac,0x8d,0x79,0x7a,0xa5,0x8c,0x79,0x7a,0xa5,0x8d,0x79,0x7b,0xa6,0x8c,0x79,0x7b,0xa6,0x8c,0x79,0x7b,0xa6, + 0x8c,0x79,0x7b,0xa7,0x8c,0x79,0x7b,0xa7,0x8c,0x79,0x7a,0xa7,0x8c,0x79,0x7a,0xa7,0x8c,0x79,0x7b,0xa8,0x8c,0x79,0x7b,0xa8, + 0x8d,0x79,0x7b,0xa9,0x8c,0x79,0x7b,0xa9,0x8c,0x79,0x7b,0xa9,0x8c,0x7a,0x7b,0xaa,0x8c,0x79,0x7b,0xaa,0x8c,0x79,0x7b,0xaa, + 0x8c,0x7a,0x7b,0xab,0x8c,0x79,0x7b,0xab,0x8c,0x79,0x7b,0xab,0x8c,0x7a,0x7b,0xac,0x8c,0x79,0x7b,0xac,0x8b,0x79,0x7b,0xac, + 0x8c,0x7a,0x7b,0xad,0x8b,0x79,0x7b,0xad,0x8b,0x79,0x7b,0xad,0x8b,0x7a,0x7b,0xae,0x8b,0x79,0x7b,0xae,0x8c,0x7a,0x7c,0xaf, + 0x8c,0x7a,0x7b,0xaf,0x8c,0x7a,0x7b,0xaf,0x8b,0x7a,0x7b,0xaf,0x8c,0x7a,0x7c,0xb0,0x8b,0x7a,0x7b,0xb0,0x8b,0x7a,0x7b,0xb0, + 0x8c,0x7a,0x7c,0xb1,0x8b,0x7a,0x7b,0xb1,0x8b,0x7a,0x7b,0xb1,0x8b,0x7a,0x7c,0xb2,0x8b,0x7a,0x7c,0xb2,0x8a,0x7a,0x7b,0xb2, + 0x8b,0x7a,0x7c,0xb3,0x8a,0x7a,0x7c,0xb3,0x8a,0x7a,0x7b,0xb3,0x8b,0x7a,0x7c,0xb4,0x8b,0x7a,0x7c,0xb4,0x8b,0x7a,0x7c,0xb5, + 0x8b,0x7a,0x7c,0xb5,0x8b,0x7a,0x7c,0xb5,0x8b,0x7a,0x7c,0xb6,0x8a,0x7a,0x7c,0xb6,0x8a,0x7b,0x7c,0xbc,0x8c,0x7e,0x80,0xcc, + 0x8d,0x80,0x82,0xd8,0x8c,0x82,0x83,0xe0,0x8c,0x83,0x84,0xe7,0x89,0x83,0x84,0xf1,0x82,0x82,0x82,0xfe,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x7b,0x7b,0x7b,0xff,0x4f,0x4f,0x4f,0xff, + 0x3a,0x3a,0x3a,0xc3,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x1b,0x1b,0x36,0x7f,0x7f,0x7f,0xfb, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x83,0x80,0x80,0xf3,0x89,0x7c,0x7d,0xc5,0x8c,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8c,0x79,0x7b,0xac,0x87,0x7d,0x7e,0xcd,0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x69,0x69,0x69,0xff,0x4d,0x4d,0x4d,0xff,0x1c,0x1c,0x1c,0x5f,0x00,0x00,0x00,0x00, + 0x02,0x02,0x02,0x04,0x6f,0x6f,0x6f,0xdb,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x83,0x81,0x81,0xf7, + 0x8c,0x7a,0x7b,0xad,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8c,0x79,0x7b,0xa7,0x86,0x7f,0x7f,0xe1,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x81,0x81,0x81,0xff, + 0x50,0x50,0x50,0xff,0x44,0x44,0x44,0xe4,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x81,0x81,0x81,0xfe,0x89,0x7b,0x7c,0xbc,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8c,0x79,0x7b,0xa9,0x83,0x81,0x81,0xf6, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x5c,0x5c,0x5c,0xff,0x4d,0x4d,0x4d,0xff,0x0b,0x0b,0x0b,0x26, + 0x33,0x33,0x33,0x65,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x85,0x7f,0x7f,0xe2,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x86,0x7e,0x7f,0xda,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x68,0x68,0x68,0xff,0x4d,0x4d,0x4d,0xff,0x1d,0x1d,0x1d,0x61,0x4f,0x4f,0x4f,0x9b,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x87,0x7d,0x7e,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x7a,0x69,0x6b,0xb0,0x4c,0x40,0x42,0xcf,0x4c,0x40,0x42,0xcf,0x4c,0x40,0x42,0xcf, + 0x4c,0x40,0x42,0xcf,0x4c,0x40,0x42,0xcf,0x4c,0x40,0x42,0xcf,0x82,0x6f,0x71,0xac,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x88,0x7b,0x7d,0xc4, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x75,0x75,0x75,0xff,0x4d,0x4d,0x4d,0xff,0x2f,0x2f,0x2f,0x9d, + 0x6a,0x6a,0x6a,0xd0,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8a,0x7b,0x7d,0xbc,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x75,0x64,0x67,0xb4,0x6f,0x5f,0x60,0xb8,0x6f,0x5f,0x60,0xb8,0x6f,0x5f,0x60,0xb8, + 0x6f,0x5f,0x60,0xb8,0x6f,0x5f,0x60,0xb8,0x6f,0x5f,0x60,0xb8,0x6f,0x5f,0x60,0xb8,0x7c,0x6a,0x6c,0xb0,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, + 0x2e,0x28,0x28,0xe2,0x95,0x92,0x95,0xf4,0x95,0x92,0x95,0xf4,0x95,0x92,0x95,0xf4,0x95,0x92,0x95,0xf4,0x95,0x92,0x95,0xf4, + 0xb2,0xab,0xad,0xe1,0x9f,0x90,0x92,0xbd,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8c,0x7a,0x7b,0xaf,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x80,0x80,0x80,0xff,0x4e,0x4e,0x4e,0xff,0x41,0x41,0x41,0xd9,0x7f,0x7f,0x7f,0xfb,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x8c,0x7a,0x7b,0xaa,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x89,0x75,0x77,0xa7,0x32,0x2a,0x2b,0xdf, + 0x51,0x4c,0x4e,0xe8,0x6b,0x68,0x69,0xed,0x6b,0x68,0x69,0xed,0x6b,0x68,0x69,0xed,0x6b,0x68,0x69,0xed,0x6b,0x68,0x69,0xed, + 0x6b,0x68,0x69,0xed,0x78,0x73,0x74,0xe4,0xa3,0x96,0x98,0xc3,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x80,0x6e,0x70,0xac,0x80,0x6e,0x70,0xac, + 0x80,0x6e,0x70,0xac,0x80,0x6e,0x70,0xac,0x80,0x6e,0x70,0xac,0x80,0x6e,0x70,0xac,0x87,0x74,0x76,0xa8,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x83,0x80,0x80,0xf5,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x53,0x53,0x53,0xff,0x4d,0x4d,0x4d,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x6f,0x60,0x61,0xb7,0x2e,0x27,0x28,0xe1,0x87,0x83,0x86,0xf2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb7,0xb1,0xb3,0xe3, + 0x93,0x80,0x82,0xac,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, + 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x4d,0x48,0x48,0xe7,0x57,0x53,0x54,0xe9,0x57,0x53,0x54,0xe9,0x57,0x53,0x54,0xe9, + 0x57,0x53,0x54,0xe9,0x81,0x76,0x78,0xcf,0x99,0x88,0x8a,0xb5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x80,0xf1,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4d,0x4d,0x4d,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x53,0x48,0x48,0xca,0x3b,0x35,0x36,0xe4, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xae,0xa9,0xab,0xe9,0xa0,0x91,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x83,0x80,0x80,0xf1,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4d,0x4d,0x4d,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8c,0x78,0x7a,0xa5,0x37,0x2f,0x30,0xdc,0x5d,0x58,0x59,0xea,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa4,0xa1,0xa4,0xef, + 0xae,0xa4,0xa6,0xd1,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, + 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x80,0xf1,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4d,0x4d,0x4d,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x78,0x67,0x69,0xb2,0x2e,0x27,0x28,0xe1,0x7e,0x7a,0x7d,0xf0, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x9a,0x9b,0xf4,0xb9,0xb2,0xb4,0xe1,0x8e,0x7b,0x7e,0xa8,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4d,0x4d,0x4d,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x5b,0x4e,0x4f,0xc4,0x33,0x2d,0x2e,0xe2,0x98,0x96,0x98,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xb0,0xab,0xad,0xe7,0x9b,0x8c,0x8e,0xb9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, + 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfe,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x3e,0x35,0x36,0xd7,0x52,0x4e,0x4f,0xe8,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa7,0xa3,0xa6,0xee,0xaa,0x9f,0xa0,0xcc,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfe, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x80,0x6d,0x6f,0xad, + 0x2e,0x27,0x28,0xe1,0x75,0x71,0x72,0xee,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9f,0x9d,0x9f,0xf3,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9e,0x9b,0x9d,0xf3,0xb6,0xaf,0xb2,0xdd,0x8d,0x79,0x7b,0xa6,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, + 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x89,0x75,0x77,0xa7,0x7a,0x69,0x6b,0xb0,0x7a,0x69,0x6b,0xb0, + 0x7a,0x68,0x6a,0xb1,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0xaa,0xa5,0xa8,0xec,0xa2,0x98,0x9b,0xd5,0x7a,0x69,0x6b,0xb0,0x7a,0x69,0x6b,0xb0,0x7a,0x69,0x6b,0xb0, + 0x7a,0x69,0x6b,0xb0,0x7a,0x69,0x6b,0xb0,0x8b,0x78,0x7a,0xa6,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfe,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x63,0x55,0x56,0xbf,0x2f,0x29,0x29,0xe2,0x94,0x91,0x94,0xf4,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaf,0xab,0xac,0xe8,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb3,0xae,0xaf,0xe6,0x98,0x87,0x8a,0xb4, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, + 0x7a,0x68,0x6a,0xb1,0x2e,0x27,0x28,0xe1,0x5b,0x56,0x56,0xe9,0x5e,0x59,0x59,0xea,0x5e,0x59,0x59,0xea,0x8d,0x8a,0x8c,0xf3, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x88,0x84,0x87,0xf2, + 0x5e,0x59,0x59,0xea,0x5e,0x59,0x59,0xea,0x5e,0x59,0x59,0xea,0x5e,0x59,0x59,0xea,0x5e,0x59,0x59,0xea,0x9c,0x8f,0x90,0xc3, + 0x94,0x82,0x83,0xae,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfe, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x46,0x3c,0x3d,0xd2, + 0x4a,0x45,0x45,0xe6,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa2,0x9e,0xa1,0xf1, + 0xba,0xb3,0xb6,0xe2,0x4f,0x4a,0x4a,0xe4,0x93,0x90,0x92,0xf4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0xaa,0xa5,0xa8,0xec,0xa7,0x9a,0x9c,0xc7,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, + 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x7a,0x68,0x6a,0xb1,0x2e,0x27,0x28,0xe1,0x95,0x92,0x95,0xf4, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb8,0xb2,0xb4,0xe3,0x9c,0x8d,0x8e,0xb9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfd,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x87,0x73,0x75,0xa9,0x30,0x29,0x2a,0xe0,0x6a,0x67,0x69,0xed,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xeb,0xb8,0xb0,0xb4,0xdf,0x4d,0x42,0x43,0xd0,0x75,0x71,0x72,0xee, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa0,0x9d,0x9f,0xf2,0xb4,0xab,0xae,0xd9, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, + 0x7a,0x68,0x6a,0xb1,0x2e,0x27,0x28,0xe1,0x95,0x92,0x95,0xf4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb8,0xb2,0xb4,0xe3, + 0x9c,0x8d,0x8e,0xb9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfd, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x6b,0x5c,0x5e,0xba,0x2e,0x27,0x28,0xe1, + 0x8d,0x8a,0x8c,0xf3,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb4,0xae,0xb0,0xe6, + 0xac,0xa2,0xa3,0xcf,0x66,0x57,0x59,0xbe,0x55,0x51,0x52,0xe9,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb5,0xb0,0xb2,0xe4,0x93,0x82,0x84,0xaf,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, + 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x7a,0x68,0x6a,0xb1,0x2e,0x27,0x28,0xe1,0x95,0x92,0x95,0xf4, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb8,0xb2,0xb4,0xe3,0x9c,0x8d,0x8e,0xb9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfd,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x4e,0x43,0x44,0xcd,0x40,0x3a,0x3c,0xe5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9d,0x9b,0x9d,0xf4,0xba,0xb4,0xb6,0xe1,0x9e,0x8f,0x93,0xbd,0x80,0x6e,0x70,0xad,0x38,0x31,0x31,0xe3, + 0x9a,0x97,0x9a,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xac,0xa7,0xaa,0xea, + 0xa2,0x95,0x98,0xc2,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, + 0x7a,0x68,0x6a,0xb1,0x2e,0x27,0x28,0xe1,0x95,0x92,0x95,0xf4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb8,0xb2,0xb4,0xe3, + 0x9c,0x8d,0x8e,0xb9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x82,0x80,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfd, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x77,0x79,0xa6,0x33,0x2c,0x2c,0xde,0x61,0x5d,0x5f,0xeb, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa6,0xa2,0xa4,0xee,0xba,0xb4,0xb6,0xe1, + 0x92,0x7f,0x81,0xac,0x8d,0x79,0x7a,0xa5,0x3c,0x33,0x34,0xd9,0x85,0x82,0x84,0xf1,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa2,0xa0,0xa1,0xf0,0xb0,0xa7,0xa9,0xd4,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, + 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x86,0x73,0x74,0xaa,0x66,0x57,0x59,0xbe,0xa9,0xa3,0xa6,0xe7, + 0xad,0xa9,0xaa,0xe9,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0xa6,0xa2,0xa4,0xee,0xad,0xa9,0xaa,0xe9,0xad,0xa9,0xaa,0xe9,0xad,0xa9,0xaa,0xe9,0xad,0xa9,0xaa,0xe9, + 0xad,0xa9,0xaa,0xe9,0xad,0xa9,0xaa,0xe9,0xb9,0xb3,0xb5,0xe2,0x9c,0x8d,0x8e,0xb9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x82,0x80,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfc,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x73,0x63,0x64,0xb5,0x2e,0x27,0x28,0xe1,0x83,0x7f,0x82,0xf1,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0xae,0xaa,0xac,0xe8,0xb2,0xa9,0xac,0xd8,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x57,0x4a,0x4b,0xc7, + 0x66,0x62,0x64,0xec,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9c,0x99,0x9c,0xf5, + 0xb8,0xb2,0xb4,0xe2,0x91,0x7e,0x80,0xaa,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x93,0x80,0x83,0xae,0x92,0x81,0x83,0xaf,0x3f,0x39,0x3a,0xe5,0x84,0x81,0x83,0xf1, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xae,0xa4,0xa6,0xd1, + 0x94,0x82,0x84,0xaf,0x94,0x82,0x84,0xaf,0x94,0x82,0x84,0xaf,0x94,0x82,0x84,0xaf,0x94,0x82,0x84,0xaf,0x94,0x82,0x84,0xaf, + 0x8e,0x7b,0x7d,0xa8,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x82,0x80,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfc, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x56,0x49,0x4b,0xc8,0x38,0x32,0x32,0xe3,0x9a,0x97,0x9a,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb7,0xb1,0xb3,0xe3,0xa7,0x9a,0x9b,0xc7, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x72,0x62,0x63,0xb6,0x48,0x42,0x44,0xe6,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xae,0xaa,0xac,0xe8,0x9e,0x8f,0x91,0xbc,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, + 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x82,0x80,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfc,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x3a,0x31,0x32,0xda,0x59,0x54,0x55,0xe9,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xa1,0x9e,0xa0,0xf1,0xba,0xb4,0xb6,0xe1,0x99,0x88,0x8a,0xb5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x89,0x75,0x77,0xa7, + 0x32,0x2b,0x2c,0xe0,0x95,0x92,0x95,0xf4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xa6,0xa2,0xa4,0xee,0xac,0xa1,0xa4,0xcf,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x83,0x80,0x81,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfc, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x7a,0x69,0x6b,0xb0,0x2e,0x27,0x28,0xe1,0x7a,0x77,0x78,0xef,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xec,0xb8,0xb1,0xb4,0xdf,0x8e,0x7b,0x7c,0xa7, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x48,0x3e,0x3f,0xd0,0x78,0x75,0x76,0xef,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9c,0x9b,0x9c,0xf4,0xb8,0xb1,0xb4,0xe0,0x8e,0x7b,0x7d,0xa7, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, + 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x81,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfb,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x5e,0x51,0x52,0xc3, + 0x32,0x2c,0x2c,0xe2,0x97,0x95,0x97,0xf4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xb3,0xae,0xaf,0xe6,0xac,0xa2,0xa4,0xcf,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x63,0x55,0x56,0xbf,0x58,0x53,0x54,0xe9,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0xb2,0xad,0xaf,0xe7,0x9a,0x89,0x8c,0xb7,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x83,0x80,0x81,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfb, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x41,0x38,0x39,0xd5,0x4f,0x4a,0x4c,0xe7,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9d,0x9b,0x9d,0xf4,0xba,0xb3,0xb6,0xe2,0x9f,0x91,0x93,0xbe,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x7e,0x6c,0x6e,0xaf,0x39,0x33,0x34,0xe3,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa8,0xa4,0xa6,0xed,0xa8,0x9c,0x9f,0xca, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, + 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x81,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfb,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x70,0x72,0xab,0x2e,0x28,0x28,0xe1, + 0x71,0x6d,0x6e,0xed,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9c,0x9b,0x9c,0xf4, + 0xa3,0xa0,0xa2,0xf0,0x54,0x4b,0x4c,0xd4,0x48,0x3e,0x3f,0xd0,0x48,0x3e,0x3f,0xd0,0x48,0x3e,0x3f,0xd0,0x48,0x3e,0x3f,0xd0, + 0x48,0x3e,0x3f,0xd0,0x2e,0x28,0x28,0xe1,0x88,0x85,0x86,0xf2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9f,0x9c,0x9e,0xf3,0xb6,0xae,0xb0,0xdc,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfb, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x67,0x58,0x59,0xbd,0x2f,0x28,0x29,0xe1,0x90,0x8d,0x90,0xf3,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x97,0x95,0x97,0xf5,0x97,0x95,0x97,0xf5, + 0x97,0x95,0x97,0xf5,0x97,0x95,0x97,0xf5,0x97,0x95,0x97,0xf5,0x97,0x95,0x97,0xf5,0x97,0x95,0x97,0xf5,0x9a,0x97,0x9a,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb4,0xae,0xb0,0xe5, + 0x96,0x85,0x88,0xb2,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, + 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfa,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x49,0x3e,0x40,0xd0,0x47,0x40,0x42,0xe6, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xeb,0xa5,0x98,0x99,0xc5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfa, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x88,0x75,0x77,0xa7,0x31,0x2a,0x2b,0xe0,0x67,0x63,0x64,0xec,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa1,0x9e,0xa0,0xf1, + 0xb3,0xaa,0xac,0xd7,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, + 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8c,0x78,0x7a,0xa5,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfa,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x6e,0x5e,0x5f,0xb8,0x2e,0x27,0x28,0xe1,0x89,0x86,0x88,0xf2, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe3,0x93,0x80,0x82,0xad,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x34,0x2d,0x2d,0xdd,0x7f,0x7c,0x7d,0xf0, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa7,0xa3,0xa5,0xed,0xad,0xa3,0xa5,0xd0, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfa, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x51,0x46,0x47,0xcb,0x3c,0x37,0x37,0xe4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xad,0xa9,0xaa,0xe9,0xa1,0x92,0x94,0xbf,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, + 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x3d,0x35,0x35,0xd7,0x74,0x70,0x73,0xee,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9f,0x9c,0x9f,0xf2,0xb6,0xaf,0xb1,0xdd,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfa,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8c,0x78,0x7a,0xa5,0x35,0x2d,0x2e,0xdd,0x5e,0x59,0x5b,0xea,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9e,0x9b,0x9d,0xf3,0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8, + 0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8, + 0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8,0xaf,0xa9,0xac,0xe9,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa4,0xa0,0xa3,0xef,0xb0,0xa5,0xa8,0xd2,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x48,0x3d,0x3e,0xd1,0x6a,0x65,0x67,0xec, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa1,0x9e,0xa0,0xf1, + 0x6d,0x61,0x64,0xce,0x6b,0x5c,0x5e,0xba,0x6c,0x5d,0x5e,0xba,0x6c,0x5d,0x5e,0xba,0x7c,0x6a,0x6d,0xb0,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xf9, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x76,0x65,0x67,0xb3, + 0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xa6,0xa2,0xa5,0xee,0xba,0xb4,0xb6,0xe1,0x93,0x81,0x83,0xae,0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9, + 0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9, + 0x42,0x3a,0x3a,0xda,0x85,0x82,0x85,0xf2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9c,0x99,0x9c,0xf5,0xb8,0xb1,0xb4,0xe1,0x8f,0x7c,0x7e,0xa9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, + 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x53,0x47,0x48,0xca,0x5e,0x59,0x5c,0xea,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x8b,0x88,0x8a,0xf2,0x71,0x6e,0x70,0xee, + 0x6f,0x6b,0x6b,0xed,0x8b,0x84,0x84,0xdc,0xa2,0x94,0x96,0xc1,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xf9,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x5a,0x4c,0x4e,0xc6,0x35,0x2f,0x2f,0xe3,0x99,0x97,0x99,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xae,0xaa,0xac,0xe8,0xb1,0xa9,0xac,0xd7,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x57,0x4a,0x4b,0xc7,0x66,0x62,0x64,0xec,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb0,0xab,0xad,0xe8,0x9d,0x8e,0x91,0xbb, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x75,0x64,0x66,0xb4,0x4d,0x48,0x4a,0xe7, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xec,0xb0,0xa7,0xa9,0xd4, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x83,0x81,0x81,0xf4,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xf9, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x3c,0x34,0x35,0xd8, + 0x55,0x50,0x51,0xe8,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xb8,0xb2,0xb4,0xe3,0xa4,0x98,0x9a,0xc5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x72,0x62,0x63,0xb6,0x47,0x41,0x43,0xe6,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0xa6,0xa2,0xa5,0xee,0xac,0xa0,0xa3,0xcd,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, + 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x41,0x38,0x39,0xd6,0x8d,0x8b,0x8d,0xf3,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xec,0xb0,0xa7,0xa9,0xd4,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x81,0x81,0xf4,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xf9,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x7e,0x6c,0x6e,0xae,0x2e,0x27,0x28,0xe1,0x76,0x72,0x75,0xee,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa2,0x9e,0xa1,0xf1,0xba,0xb4,0xb6,0xe1,0x98,0x87,0x8a,0xb4,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8a,0x76,0x78,0xa7,0x32,0x2b,0x2b,0xe0,0x94,0x91,0x94,0xf4, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9d,0x9b,0x9d,0xf4,0xb8,0xb0,0xb2,0xde, + 0x8e,0x7a,0x7c,0xa6,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x77,0x66,0x68,0xb3, + 0x64,0x5e,0x60,0xe5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xec,0xb0,0xa7,0xa9,0xd4, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x83,0x81,0x81,0xf4,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4a,0x4a,0x4a,0xf8, + 0x7e,0x7e,0x7e,0xf9,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8c,0x7a,0x7b,0xaa,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x62,0x54,0x55,0xc1,0x30,0x2a,0x2b,0xe2, + 0x96,0x93,0x95,0xf4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xeb, + 0xb8,0xb0,0xb3,0xde,0x8e,0x7a,0x7c,0xa6,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x49,0x3e,0x40,0xd0,0x76,0x73,0x75,0xef,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb2,0xad,0xaf,0xe6,0x99,0x88,0x8a,0xb5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6, + 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x87,0x74,0x76,0xaa,0x7f,0x77,0x7b,0xdc,0x9e,0x9b,0x9d,0xf3, + 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5, + 0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xec,0xb0,0xa7,0xa9,0xd4,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x81,0x81,0xf6,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x53,0x53,0x53,0xff,0x4a,0x4a,0x4a,0xf8,0x66,0x66,0x66,0xc9,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x89,0x7b,0x7c,0xbb,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x7e,0x6c,0x6e,0xaf,0x85,0x78,0x7a,0xc2,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6, + 0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb8,0xb2,0xb4,0xe3,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x80,0x6d,0x6f,0xad,0x8d,0x80,0x82,0xc7, + 0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb6,0xb0,0xb2,0xe3, + 0xa6,0x99,0x9d,0xc8,0x8d,0x79,0x7a,0xa5,0x87,0x73,0x75,0xa9,0x75,0x64,0x66,0xb5,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6, + 0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb9,0xb3,0xb5,0xe2,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x97,0x86,0x88,0xb2,0xa6,0x9a,0x9d,0xcb,0xa6,0x9d,0xa1,0xd7,0xac,0xa5,0xa7,0xe1, + 0xb1,0xac,0xae,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb6,0xb1,0xb2,0xe4,0xb0,0xa7,0xa9,0xd4, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8c,0x79,0x7b,0xa9, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x81,0x81,0x81,0xff,0x4e,0x4e,0x4e,0xff,0x4a,0x4a,0x4a,0xf8, + 0x4b,0x4b,0x4b,0x94,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8a,0x7f,0x80,0xd8,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8a,0x7a,0x7c,0xb7,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x79,0x79,0x79,0xff,0x4d,0x4d,0x4d,0xff,0x4a,0x4a,0x4a,0xf8,0x48,0x48,0x48,0xae,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x83,0x82,0x82,0xfb,0x8c,0x79,0x7b,0xab,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x86,0x7f,0x7f,0xde, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x71,0x71,0x71,0xff,0x4d,0x4d,0x4d,0xff,0x46,0x46,0x46,0xe8, + 0x25,0x25,0x25,0x6a,0x80,0x80,0x80,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x84,0x7f,0x7f,0xe7, + 0x8b,0x7a,0x7b,0xb0,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5, + 0x8b,0x7a,0x7b,0xaf,0x85,0x7e,0x7f,0xdb,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x68,0x68,0x68,0xff,0x4d,0x4d,0x4d,0xff,0x39,0x39,0x39,0xc0,0x0a,0x0a,0x0a,0x23,0x66,0x66,0x66,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x81,0x80,0x81,0xfb,0x85,0x7f,0x80,0xe5,0x86,0x7d,0x7e,0xd7, + 0x88,0x7c,0x7d,0xca,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7, + 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7, + 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7, + 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7, + 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7, + 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7, + 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7, + 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7, + 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7, + 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x88,0x7c,0x7d,0xc6,0x88,0x7c,0x7d,0xc8, + 0x87,0x7d,0x7e,0xce,0x86,0x7d,0x7e,0xd4,0x85,0x7f,0x80,0xe6,0x81,0x81,0x81,0xfe,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x7b,0x7b,0x7b,0xff,0x51,0x51,0x51,0xff,0x4d,0x4d,0x4d,0xff,0x2d,0x2d,0x2d,0x98, + 0x00,0x00,0x00,0x00,0x46,0x46,0x46,0xe7,0x79,0x79,0x79,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x7d,0x7d,0x7d,0xff,0x54,0x54,0x54,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x21,0x21,0x21,0x70,0x00,0x00,0x00,0x00,0x1c,0x1c,0x1c,0x5e,0x55,0x55,0x55,0xff, + 0x75,0x75,0x75,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x7f,0x7f,0x7f,0xff,0x57,0x57,0x57,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x48,0x48,0x48,0xf1,0x0c,0x0c,0x0c,0x28, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x39,0x39,0xbd,0x4d,0x4d,0x4d,0xff,0x60,0x60,0x60,0xff,0x7d,0x7d,0x7d,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff, + 0x82,0x82,0x82,0xff,0x76,0x76,0x76,0xff,0x62,0x62,0x62,0xff,0x50,0x50,0x50,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4a,0x4a,0x4a,0xf8,0x13,0x13,0x13,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x0b,0x27, + 0x45,0x45,0x45,0xe6,0x4d,0x4d,0x4d,0xff,0x4e,0x4e,0x4e,0xff,0x57,0x57,0x57,0xff,0x5e,0x5e,0x5e,0xff,0x66,0x66,0x66,0xff, + 0x6d,0x6d,0x6d,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff, + 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff, + 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff, + 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff, + 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff, + 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff, + 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff, + 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff, + 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff, + 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6c,0x6c,0x6c,0xff, + 0x68,0x68,0x68,0xff,0x65,0x65,0x65,0xff,0x61,0x61,0x61,0xff,0x54,0x54,0x54,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4c,0x4c,0x4c,0xfc,0x18,0x18,0x18,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x0c,0x29,0x29,0x29,0x89,0x4b,0x4b,0x4b,0xf9, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4c,0x4c,0x4c,0xfc,0x36,0x36,0x36,0xb4,0x15,0x15,0x15,0x46, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x0b,0x25,0x25,0x25,0x25,0x7b,0x30,0x30,0x30,0xa1,0x3c,0x3c,0x3c,0xc8, + 0x47,0x47,0x47,0xee,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff, + 0x4c,0x4c,0x4c,0xfd,0x47,0x47,0x47,0xec,0x42,0x42,0x42,0xdd,0x3e,0x3e,0x3e,0xce,0x38,0x38,0x38,0xbc,0x23,0x23,0x23,0x75, + 0x07,0x07,0x07,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} }; diff --git a/client/x11/x_platform.h b/client/x11/x_platform.h index 93debdcc..24f73ac4 100644 --- a/client/x11/x_platform.h +++ b/client/x11/x_platform.h @@ -42,15 +42,15 @@ public: static bool is_x_shm_avail(); static XImage *create_x_shm_image(RedDrawable::Format format, - int width, int height, int depth, - Visual *visual, - XShmSegmentInfo **shminfo_out); + int width, int height, int depth, + Visual *visual, + XShmSegmentInfo **shminfo_out); static XImage *create_x_image(RedDrawable::Format format, - int width, int height, int depth, - Visual *visual, - XShmSegmentInfo **shminfo_out); + int width, int height, int depth, + Visual *visual, + XShmSegmentInfo **shminfo_out); static void free_x_image(XImage *image, - XShmSegmentInfo *shminfo); + XShmSegmentInfo *shminfo); }; #endif diff --git a/common/canvas_base.h b/common/canvas_base.h index 7a69def2..861171ec 100644 --- a/common/canvas_base.h +++ b/common/canvas_base.h @@ -69,7 +69,7 @@ struct _SpiceImageCache { typedef struct { SpiceCanvas *(*get)(SpiceImageSurfaces *surfaces, - uint32_t surface_id); + uint32_t surface_id); } SpiceImageSurfacesOps; struct _SpiceImageSurfaces { @@ -177,10 +177,10 @@ typedef struct { pixman_image_t *tile, int offset_x, int offset_y); void (*fill_tiled_rects_from_surface)(SpiceCanvas *canvas, - pixman_box32_t *rects, - int n_rects, - SpiceCanvas *tile, - int offset_x, int offset_y); + pixman_box32_t *rects, + int n_rects, + SpiceCanvas *tile, + int offset_x, int offset_y); void (*fill_tiled_rects_rop)(SpiceCanvas *canvas, pixman_box32_t *rects, int n_rects, @@ -188,29 +188,29 @@ typedef struct { int offset_x, int offset_y, SpiceROP rop); void (*fill_tiled_rects_rop_from_surface)(SpiceCanvas *canvas, - pixman_box32_t *rects, - int n_rects, - SpiceCanvas *tile, - int offset_x, int offset_y, - SpiceROP rop); + pixman_box32_t *rects, + int n_rects, + SpiceCanvas *tile, + int offset_x, int offset_y, + SpiceROP rop); void (*blit_image)(SpiceCanvas *canvas, pixman_region32_t *region, pixman_image_t *src_image, int offset_x, int offset_y); void (*blit_image_from_surface)(SpiceCanvas *canvas, - pixman_region32_t *region, - SpiceCanvas *src_image, - int offset_x, int offset_y); + pixman_region32_t *region, + SpiceCanvas *src_image, + int offset_x, int offset_y); void (*blit_image_rop)(SpiceCanvas *canvas, pixman_region32_t *region, pixman_image_t *src_image, int offset_x, int offset_y, SpiceROP rop); void (*blit_image_rop_from_surface)(SpiceCanvas *canvas, - pixman_region32_t *region, - SpiceCanvas *src_image, - int offset_x, int offset_y, - SpiceROP rop); + pixman_region32_t *region, + SpiceCanvas *src_image, + int offset_x, int offset_y, + SpiceROP rop); void (*scale_image)(SpiceCanvas *canvas, pixman_region32_t *region, pixman_image_t *src_image, @@ -220,13 +220,13 @@ typedef struct { int dest_width, int dest_height, int scale_mode); void (*scale_image_from_surface)(SpiceCanvas *canvas, - pixman_region32_t *region, - SpiceCanvas *src_image, - int src_x, int src_y, - int src_width, int src_height, - int dest_x, int dest_y, - int dest_width, int dest_height, - int scale_mode); + pixman_region32_t *region, + SpiceCanvas *src_image, + int src_x, int src_y, + int src_width, int src_height, + int dest_x, int dest_y, + int dest_width, int dest_height, + int scale_mode); void (*scale_image_rop)(SpiceCanvas *canvas, pixman_region32_t *region, pixman_image_t *src_image, @@ -236,13 +236,13 @@ typedef struct { int dest_width, int dest_height, int scale_mode, SpiceROP rop); void (*scale_image_rop_from_surface)(SpiceCanvas *canvas, - pixman_region32_t *region, - SpiceCanvas *src_image, - int src_x, int src_y, - int src_width, int src_height, - int dest_x, int dest_y, - int dest_width, int dest_height, - int scale_mode, SpiceROP rop); + pixman_region32_t *region, + SpiceCanvas *src_image, + int src_x, int src_y, + int src_width, int src_height, + int dest_x, int dest_y, + int dest_width, int dest_height, + int scale_mode, SpiceROP rop); void (*blend_image)(SpiceCanvas *canvas, pixman_region32_t *region, int dest_has_alpha, @@ -252,14 +252,14 @@ typedef struct { int width, int height, int overall_alpha); void (*blend_image_from_surface)(SpiceCanvas *canvas, - pixman_region32_t *region, + pixman_region32_t *region, int dest_has_alpha, - SpiceCanvas *src_image, + SpiceCanvas *src_image, int src_has_alpha, - int src_x, int src_y, - int dest_x, int dest_y, - int width, int height, - int overall_alpha); + int src_x, int src_y, + int dest_x, int dest_y, + int width, int height, + int overall_alpha); void (*blend_scale_image)(SpiceCanvas *canvas, pixman_region32_t *region, int dest_has_alpha, @@ -271,26 +271,26 @@ typedef struct { int scale_mode, int overall_alpha); void (*blend_scale_image_from_surface)(SpiceCanvas *canvas, - pixman_region32_t *region, + pixman_region32_t *region, int dest_has_alpha, - SpiceCanvas *src_image, + SpiceCanvas *src_image, int src_has_alpha, - int src_x, int src_y, - int src_width, int src_height, - int dest_x, int dest_y, - int dest_width, int dest_height, - int scale_mode, - int overall_alpha); + int src_x, int src_y, + int src_width, int src_height, + int dest_x, int dest_y, + int dest_width, int dest_height, + int scale_mode, + int overall_alpha); void (*colorkey_image)(SpiceCanvas *canvas, pixman_region32_t *region, pixman_image_t *src_image, int offset_x, int offset_y, uint32_t transparent_color); void (*colorkey_image_from_surface)(SpiceCanvas *canvas, - pixman_region32_t *region, - SpiceCanvas *src_image, - int offset_x, int offset_y, - uint32_t transparent_color); + pixman_region32_t *region, + SpiceCanvas *src_image, + int offset_x, int offset_y, + uint32_t transparent_color); void (*colorkey_scale_image)(SpiceCanvas *canvas, pixman_region32_t *region, pixman_image_t *src_image, @@ -300,13 +300,13 @@ typedef struct { int dest_width, int dest_height, uint32_t transparent_color); void (*colorkey_scale_image_from_surface)(SpiceCanvas *canvas, - pixman_region32_t *region, - SpiceCanvas *src_image, - int src_x, int src_y, - int src_width, int src_height, - int dest_x, int dest_y, - int dest_width, int dest_height, - uint32_t transparent_color); + pixman_region32_t *region, + SpiceCanvas *src_image, + int src_x, int src_y, + int src_width, int src_height, + int dest_x, int dest_y, + int dest_width, int dest_height, + uint32_t transparent_color); void (*copy_region)(SpiceCanvas *canvas, pixman_region32_t *dest_region, int dx, int dy); diff --git a/common/gdi_canvas.c b/common/gdi_canvas.c index 5db3e831..1a46ac1a 100644 --- a/common/gdi_canvas.c +++ b/common/gdi_canvas.c @@ -580,15 +580,15 @@ static uint8_t *create_bitmap(HBITMAP *bitmap, HBITMAP *prev_bitmap, HDC *dc, } static uint8_t *create_bitmap_from_pixman(HBITMAP *bitmap, HBITMAP *prev_bitmap, HDC *dc, - pixman_image_t *surface, int rotate) + pixman_image_t *surface, int rotate) { return create_bitmap(bitmap, prev_bitmap, dc, (uint8_t*)pixman_image_get_data(surface), - pixman_image_get_width(surface), - pixman_image_get_height(surface), - pixman_image_get_stride(surface), - spice_pixman_image_get_bpp(surface), - rotate); + pixman_image_get_width(surface), + pixman_image_get_height(surface), + pixman_image_get_stride(surface), + spice_pixman_image_get_bpp(surface), + rotate); } @@ -798,17 +798,17 @@ static struct BitmapData get_mask_bitmap(struct GdiCanvas *canvas, struct SpiceQ gdi_surface = (GdiCanvas *)canvas_get_surface_mask(&canvas->base, mask->bitmap); if (gdi_surface) { - HBITMAP _bitmap; + HBITMAP _bitmap; - _bitmap = (HBITMAP)GetCurrentObject(gdi_surface->dc, OBJ_BITMAP); - if (!_bitmap) { - CANVAS_ERROR ("GetCurrentObject failed"); - } - bitmap.dc = gdi_surface->dc; - bitmap.hbitmap = _bitmap; - bitmap.prev_hbitmap = (HBITMAP)0; - bitmap.cache = 0; - bitmap.from_surface = 1; + _bitmap = (HBITMAP)GetCurrentObject(gdi_surface->dc, OBJ_BITMAP); + if (!_bitmap) { + CANVAS_ERROR ("GetCurrentObject failed"); + } + bitmap.dc = gdi_surface->dc; + bitmap.hbitmap = _bitmap; + bitmap.prev_hbitmap = (HBITMAP)0; + bitmap.cache = 0; + bitmap.from_surface = 1; } else { if (!(surface = canvas_get_mask(&canvas->base, mask, NULL))) { @@ -1149,10 +1149,10 @@ static void gdi_canvas_put_image(SpiceCanvas *spice_canvas, HDC dc, const SpiceR gdi_draw_bitmap_redrop(canvas->dc, &src, dest, dc, NULL, SPICE_ROPD_OP_PUT, 0); } else { - pixman_image_t *image = pixman_image_create_bits(PIXMAN_a8r8g8b8, src_width, src_height, - (uint32_t *)src_data, src_stride); + pixman_image_t *image = pixman_image_create_bits(PIXMAN_a8r8g8b8, src_width, src_height, + (uint32_t *)src_data, src_stride); gdi_draw_image(canvas->dc, &src, dest, image, NULL, SPICE_ROPD_OP_PUT, 0); - pixman_image_unref(image); + pixman_image_unref(image); } } @@ -1244,7 +1244,7 @@ static void gdi_draw_bitmap_alpha(HDC dest_dc, const SpiceRect *src, const Spice } static void gdi_draw_image_alpha(HDC dest_dc, const SpiceRect *src, const SpiceRect *dest, - pixman_image_t *image, uint8_t alpha, + pixman_image_t *image, uint8_t alpha, int rotate, int use_bitmap_alpha) { HDC dc; @@ -1411,7 +1411,7 @@ static void gdi_canvas_draw_blend(SpiceCanvas *spice_canvas, SpiceRect *bbox, Sp ReleaseMutex(pixman_data->mutex); } else { gdi_draw_image(canvas->dc, &blend->src_area, bbox, surface, - &bitmapmask, blend->rop_descriptor, 0); + &bitmapmask, blend->rop_descriptor, 0); } pixman_image_unref(surface); diff --git a/common/gdi_canvas.h b/common/gdi_canvas.h index af5b2296..f92c042b 100644 --- a/common/gdi_canvas.h +++ b/common/gdi_canvas.h @@ -37,7 +37,7 @@ SpiceCanvas *gdi_canvas_create(int width, int height, HDC dc, class RecurciveMutex *lock, uint32_t format, SpiceImageCache *bits_cache, SpicePaletteCache *palette_cache, - SpiceImageSurfaces *surfaces, + SpiceImageSurfaces *surfaces, SpiceGlzDecoder *glz_decoder, SpiceJpegDecoder *jpeg_decoder, SpiceZlibDecoder *zlib_decoder); diff --git a/common/gl_canvas.h b/common/gl_canvas.h index 40b67139..400bedb2 100644 --- a/common/gl_canvas.h +++ b/common/gl_canvas.h @@ -38,7 +38,7 @@ SpiceCanvas *gl_canvas_create(int width, int height, uint32_t format #elif defined(SW_CANVAS_IMAGE_CACHE) , SpiceImageCache *bits_cache #endif - , SpiceImageSurfaces *surfaces + , SpiceImageSurfaces *surfaces , SpiceGlzDecoder *glz_decoder , SpiceJpegDecoder *jpeg_decoder , SpiceZlibDecoder *zlib_decoder diff --git a/common/pixman_utils.c b/common/pixman_utils.c index 612ddd8c..c04b01f3 100644 --- a/common/pixman_utils.c +++ b/common/pixman_utils.c @@ -928,7 +928,7 @@ pixman_format_code_t spice_surface_format_to_pixman(uint32_t surface_format) abort(); break; } - return (pixman_format_code_t)0; /* Not reached */ + return (pixman_format_code_t)0; /* Not reached */ } /* Returns the "spice native" pixman version of a specific bitmap format. diff --git a/common/sw_canvas.c b/common/sw_canvas.c index 0f67c808..02934174 100644 --- a/common/sw_canvas.c +++ b/common/sw_canvas.c @@ -472,8 +472,8 @@ static void __scale_image(SpiceCanvas *spice_canvas, pixman_transform_init_scale(&transform, fsx, fsy); pixman_transform_translate(&transform, NULL, - pixman_int_to_fixed (src_x), - pixman_int_to_fixed (src_y)); + pixman_int_to_fixed (src_x), + pixman_int_to_fixed (src_y)); pixman_image_set_transform(src, &transform); pixman_image_set_repeat(src, PIXMAN_REPEAT_NONE); @@ -553,8 +553,8 @@ static void __scale_image_rop(SpiceCanvas *spice_canvas, pixman_transform_init_scale(&transform, fsx, fsy); pixman_transform_translate(&transform, NULL, - pixman_int_to_fixed (src_x), - pixman_int_to_fixed (src_y)); + pixman_int_to_fixed (src_x), + pixman_int_to_fixed (src_y)); pixman_image_set_transform(src, &transform); pixman_image_set_repeat(src, PIXMAN_REPEAT_NONE); @@ -747,8 +747,8 @@ static void __blend_scale_image(SpiceCanvas *spice_canvas, pixman_transform_init_scale(&transform, fsx, fsy); pixman_transform_translate(&transform, NULL, - pixman_int_to_fixed (src_x), - pixman_int_to_fixed (src_y)); + pixman_int_to_fixed (src_x), + pixman_int_to_fixed (src_y)); mask = NULL; if (overall_alpha != 0xff) { @@ -909,8 +909,8 @@ static void __colorkey_scale_image(SpiceCanvas *spice_canvas, pixman_transform_init_scale(&transform, fsx, fsy); pixman_transform_translate(&transform, NULL, - pixman_int_to_fixed (src_x), - pixman_int_to_fixed (src_y)); + pixman_int_to_fixed (src_x), + pixman_int_to_fixed (src_y)); pixman_image_set_transform(src, &transform); pixman_image_set_repeat(src, PIXMAN_REPEAT_NONE); diff --git a/common/sw_canvas.h b/common/sw_canvas.h index d8d26a97..8667fccc 100644 --- a/common/sw_canvas.h +++ b/common/sw_canvas.h @@ -41,7 +41,7 @@ SpiceCanvas *canvas_create(int width, int height, uint32_t format #elif defined(SW_CANVAS_IMAGE_CACHE) , SpiceImageCache *bits_cache #endif - , SpiceImageSurfaces *surfaces + , SpiceImageSurfaces *surfaces , SpiceGlzDecoder *glz_decoder , SpiceJpegDecoder *jpeg_decoder , SpiceZlibDecoder *zlib_decoder @@ -54,7 +54,7 @@ SpiceCanvas *canvas_create_for_data(int width, int height, uint32_t format, uint #elif defined(SW_CANVAS_IMAGE_CACHE) , SpiceImageCache *bits_cache #endif - , SpiceImageSurfaces *surfaces + , SpiceImageSurfaces *surfaces , SpiceGlzDecoder *glz_decoder , SpiceJpegDecoder *jpeg_decoder , SpiceZlibDecoder *zlib_decoder diff --git a/server/demarshallers.h b/server/demarshallers.h index abe9dfab..38e4e158 100644 --- a/server/demarshallers.h +++ b/server/demarshallers.h @@ -19,7 +19,7 @@ typedef void (*message_destructor_t)(uint8_t *message); typedef uint8_t * (*spice_parse_channel_func_t)(uint8_t *message_start, uint8_t *message_end, uint16_t message_type, int minor, - size_t *size_out, message_destructor_t *free_message); + size_t *size_out, message_destructor_t *free_message); spice_parse_channel_func_t spice_get_client_channel_parser(uint32_t channel, unsigned int *max_message_type); diff --git a/server/jpeg_encoder.c b/server/jpeg_encoder.c index a3084378..1c961774 100644 --- a/server/jpeg_encoder.c +++ b/server/jpeg_encoder.c @@ -145,7 +145,7 @@ static void convert_BGRX32_to_RGB24(uint8_t *line, int width, uint8_t **out_line uint8_t *out_pix; int x; - ASSERT(out_line && *out_line); + ASSERT(out_line && *out_line); out_pix = *out_line; diff --git a/server/red_worker.c b/server/red_worker.c index d096ee44..9d055d55 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -6166,7 +6166,7 @@ static inline int red_compress_image(DisplayChannelClient *dcc, } else { if (drawable->copy_bitmap_graduality == BITMAP_GRADUAL_INVALID) { quic_compress = BITMAP_FMT_IS_RGB[src->format] && - (_get_bitmap_graduality_level(display_channel->common.worker, src, drawable->group_id) == + (_get_bitmap_graduality_level(display_channel->common.worker, src, drawable->group_id) == BITMAP_GRADUAL_HIGH); } else { quic_compress = (drawable->copy_bitmap_graduality == BITMAP_GRADUAL_HIGH); From faf0947ebbcdbd2088d6349e936a23b24d09153b Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Mon, 12 Dec 2011 17:53:04 +0000 Subject: [PATCH 32/47] Remove useless if() before free() The free() function allows NULL to be passed in, so any code which puts a if() before free() is wasting time --- common/canvas_base.c | 8 ++------ common/canvas_utils.c | 4 +--- common/gdi_canvas.c | 4 +--- common/gl_canvas.c | 4 +--- common/lines.c | 15 +++++---------- common/mem.c | 4 +--- common/sw_canvas.c | 4 +--- server/mjpeg_encoder.c | 3 +-- server/red_parse_qxl.c | 4 +--- server/red_worker.c | 4 +--- server/tests/test_display_base.c | 4 +--- 11 files changed, 16 insertions(+), 42 deletions(-) diff --git a/common/canvas_base.c b/common/canvas_base.c index d11c8ec0..16688fb3 100644 --- a/common/canvas_base.c +++ b/common/canvas_base.c @@ -749,9 +749,7 @@ static pixman_image_t *canvas_get_lz(CanvasBase *canvas, SpiceImage *image, int int free_palette; if (setjmp(lz_data->jmp_env)) { - if (decomp_buf) { - free(decomp_buf); - } + free(decomp_buf); CANVAS_ERROR("lz error, %s", lz_data->message_buf); } @@ -3134,9 +3132,7 @@ static void canvas_draw_stroke(SpiceCanvas *spice_canvas, SpiceRect *bbox, stroke_lines_draw(&lines, (lineGC *)&gc, dashed); - if (gc.base.dash) { - free(gc.base.dash); - } + free(gc.base.dash); stroke_lines_free(&lines); if (!gc.solid && gc.tile && !surface_canvas) { diff --git a/common/canvas_utils.c b/common/canvas_utils.c index 55b71599..71f6890e 100644 --- a/common/canvas_utils.c +++ b/common/canvas_utils.c @@ -51,9 +51,7 @@ static void release_data(pixman_image_t *image, void *release_data) gdi_handlers--; } #endif - if (data->data) { - free(data->data); - } + free(data->data); free(data); } diff --git a/common/gdi_canvas.c b/common/gdi_canvas.c index 1a46ac1a..5c9cdf01 100644 --- a/common/gdi_canvas.c +++ b/common/gdi_canvas.c @@ -1773,9 +1773,7 @@ static void gdi_canvas_draw_stroke(SpiceCanvas *spice_canvas, SpiceRect *bbox, S } #endif - if (user_style) { - free(user_style); - } + free(user_style); } static void gdi_canvas_clear(SpiceCanvas *spice_canvas) diff --git a/common/gl_canvas.c b/common/gl_canvas.c index a04740b3..ffc6b52d 100644 --- a/common/gl_canvas.c +++ b/common/gl_canvas.c @@ -870,9 +870,7 @@ static void gl_canvas_destroy(SpiceCanvas *spice_canvas) } canvas_base_destroy(&canvas->base); glc_destroy(canvas->glc, canvas->textures_lost); - if (canvas->private_data) { - free(canvas->private_data); - } + free(canvas->private_data); free(canvas); } diff --git a/common/lines.c b/common/lines.c index e2349e82..9b47ee38 100644 --- a/common/lines.c +++ b/common/lines.c @@ -580,8 +580,7 @@ miAppendSpans (SpanGroup * spanGroup, SpanGroup * otherGroup, Spans * spans) static void miFreeSpanGroup (SpanGroup * spanGroup) { - if (spanGroup->group != NULL) - xfree (spanGroup->group); + xfree (spanGroup->group); } static void @@ -776,10 +775,8 @@ miFillUniqueSpanGroup (GCPtr pGC, SpanGroup * spanGroup, Boolean foreground) ysizes = (int *)xalloc (ylength * sizeof (int)); if (!yspans || !ysizes) { - if (yspans) - xfree (yspans); - if (ysizes) - xfree (ysizes); + xfree (yspans); + xfree (ysizes); miDisposeSpanGroup (spanGroup); return; } @@ -849,10 +846,8 @@ miFillUniqueSpanGroup (GCPtr pGC, SpanGroup * spanGroup, Boolean foreground) } xfree (yspans); xfree (ysizes); - if (points) - xfree (points); - if (widths) - xfree (widths); + xfree (points); + xfree (widths); return; } count = 0; diff --git a/common/mem.c b/common/mem.c index 7236cf0c..5298e37d 100644 --- a/common/mem.c +++ b/common/mem.c @@ -130,9 +130,7 @@ void *spice_realloc(void *mem, size_t n_bytes) (unsigned long)n_bytes); } - if (mem) { - free(mem); - } + free(mem); return NULL; } diff --git a/common/sw_canvas.c b/common/sw_canvas.c index 02934174..8eabc896 100644 --- a/common/sw_canvas.c +++ b/common/sw_canvas.c @@ -1166,9 +1166,7 @@ static void canvas_destroy(SpiceCanvas *spice_canvas) } pixman_image_unref(canvas->image); canvas_base_destroy(&canvas->base); - if (canvas->private_data) { - free(canvas->private_data); - } + free(canvas->private_data); free(canvas); } diff --git a/server/mjpeg_encoder.c b/server/mjpeg_encoder.c index 599d4f57..6b68549c 100644 --- a/server/mjpeg_encoder.c +++ b/server/mjpeg_encoder.c @@ -129,8 +129,7 @@ static boolean empty_mem_output_buffer(j_compress_ptr cinfo) memcpy(nextbuffer, dest->buffer, dest->bufsize); - if (dest->newbuffer != NULL) - free(dest->newbuffer); + free(dest->newbuffer); dest->newbuffer = nextbuffer; diff --git a/server/red_parse_qxl.c b/server/red_parse_qxl.c index 743a82d2..256e8e9b 100644 --- a/server/red_parse_qxl.c +++ b/server/red_parse_qxl.c @@ -409,9 +409,7 @@ void red_put_image(SpiceImage *red) switch (red->descriptor.type) { case SPICE_IMAGE_TYPE_BITMAP: - if (red->u.bitmap.palette) { - free(red->u.bitmap.palette); - } + free(red->u.bitmap.palette); spice_chunks_destroy(red->u.bitmap.data); break; case SPICE_IMAGE_TYPE_QUIC: diff --git a/server/red_worker.c b/server/red_worker.c index 9d055d55..c8ac8161 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -2472,9 +2472,7 @@ static void red_display_release_stream_clip(RedWorker *worker, StreamClipItem *i { if (!--item->refs) { red_display_release_stream(worker, item->stream_agent); - if (item->rects) { - free(item->rects); - } + free(item->rects); free(item); } } diff --git a/server/tests/test_display_base.c b/server/tests/test_display_base.c index 81f942bc..579ef1e4 100644 --- a/server/tests/test_display_base.c +++ b/server/tests/test_display_base.c @@ -29,9 +29,7 @@ static void test_spice_destroy_update(SimpleSpiceUpdate *update) if (!update) { return; } - if (update->bitmap) { - free(update->bitmap); - } + free(update->bitmap); free(update); } From d262f1d96e7ac519c48914c6899309c135ac8276 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 10 Jan 2012 11:36:47 +0000 Subject: [PATCH 33/47] Rewrite code to avoid triggering warning about casting param to free() Since free() takes a void* parameters do not need to be cast. The existing code here is actally fine, but it trips up the syntax-check rule, so tweak it to an equivalent construct which passes the syntax check --- server/smartcard.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/smartcard.c b/server/smartcard.c index 43ca1ac4..facc4b37 100644 --- a/server/smartcard.c +++ b/server/smartcard.c @@ -335,7 +335,8 @@ static void smartcard_channel_release_pipe_item(RedChannelClient *rcc, PipeItem *item, int item_pushed) { if (item->type == PIPE_ITEM_TYPE_MSG) { - free(((MsgItem*)item)->vheader); + MsgItem *mi = (MsgItem *)item; + free(mi->vheader); } free(item); } From 42df032c47dea6f02a932b318ac3ea81e017781e Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 10 Jan 2012 11:39:16 +0000 Subject: [PATCH 34/47] Remove casts from void * with xrealloc() calls The xrealloc() function returns void*, so the return value never needs to be cast --- common/lines.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/common/lines.c b/common/lines.c index 9b47ee38..797d5d62 100644 --- a/common/lines.c +++ b/common/lines.c @@ -509,17 +509,15 @@ miSubtractSpans (SpanGroup * spanGroup, Spans * sub) int *newwid; #define EXTRA 8 - newPt = - (DDXPointPtr) xrealloc (spans->points, - (spans->count + - EXTRA) * sizeof (DDXPointRec)); + newPt = xrealloc (spans->points, + (spans->count + + EXTRA) * sizeof (DDXPointRec)); if (!newPt) break; spansPt = newPt + (spansPt - spans->points); spans->points = newPt; - newwid = - (int *) xrealloc (spans->widths, - (spans->count + EXTRA) * sizeof (int)); + newwid = xrealloc (spans->widths, + (spans->count + EXTRA) * sizeof (int)); if (!newwid) break; spansWid = newwid + (spansWid - spans->widths); @@ -556,7 +554,7 @@ miAppendSpans (SpanGroup * spanGroup, SpanGroup * otherGroup, Spans * spans) if (spansCount > 0) { if (spanGroup->size == spanGroup->count) { spanGroup->size = (spanGroup->size + 8) * 2; - spanGroup->group = (Spans *) + spanGroup->group = xrealloc (spanGroup->group, sizeof (Spans) * spanGroup->size); } @@ -803,10 +801,10 @@ miFillUniqueSpanGroup (GCPtr pGC, SpanGroup * spanGroup, Boolean foreground) DDXPointPtr newpoints; int *newwidths; ysizes[index] = (ysizes[index] + 8) * 2; - newpoints = (DDXPointPtr) xrealloc (newspans->points, - ysizes[index] * sizeof (DDXPointRec)); - newwidths = (int *) xrealloc (newspans->widths, - ysizes[index] * sizeof (int)); + newpoints = xrealloc (newspans->points, + ysizes[index] * sizeof (DDXPointRec)); + newwidths = xrealloc (newspans->widths, + ysizes[index] * sizeof (int)); if (!newpoints || !newwidths) { int i; From c9b38f6ac77667eaee555348c084ff32b1706a9a Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 10 Jan 2012 13:13:44 +0000 Subject: [PATCH 35/47] Fill out the AUTHORS file with some content The AUTHORS file is empty, fill it in with a list of present and past maintainers, and email addresses of all people who have contributed patches --- AUTHORS | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/AUTHORS b/AUTHORS index e69de29b..6fe2e88e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -0,0 +1,33 @@ + Spice Authors + ============= + +The current active Spice maintainers are + + Alon Levy + Christophe Fergeau + Gerd Hoffmann + Marc-André Lureau + Uri Lublin + Yonit Halperin + +Previous Spice maintainers were + + Izik Eidus + Yaniv Kamay (Original project author) + +Patches also contributed by + + Alexander Larsson + Arnon Gilboa + Daniel P. Berrange + Dan Kenigsberg + Gal Hammer + Hans de Goede + Jürg Billeter + Liang Guo + Søren Sandmann Pedersen + Thomas Tyminski + Tiziano Mueller + Zeeshan Ali (Khattak) + + ....send patches to get your name here... From d6c31a697003368e642beb29466ba5953f6e6163 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 10 Jan 2012 13:29:14 +0000 Subject: [PATCH 36/47] Improve usefulness of README file The COPYING file already contains the license text, so the README file need not repeat it. Instead put in a description of what SPICE is, simple install instructions & pointers to mailing lists and bug trackers --- README | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 77 insertions(+), 9 deletions(-) diff --git a/README b/README index a6596d80..a27dc061 100644 --- a/README +++ b/README @@ -1,14 +1,82 @@ -Copyright 2009 Red Hat, Inc. and/or its affiliates. + SPICE: Simple Protocol for Independent Computing Environments + ============================================================= -This program and libraries is free software; you can redistribute it -and/or modify it under the terms of the GNU Lesser General Public +SPICE is a remote display system built for virtual environments which +allows you to view a computing 'desktop' environment not only on the +machine where it is running, but from anywhere on the Internet and +from a wide variety of machine architectures. + +Installation +------------ + +The SPICE package uses GNU autotools, so the build install process +follows the standard process documented in the INSTALL file. As a +quick start you can do + + ./configure --prefix=/usr --sysconfdir=/etc \ + --localstatedir=/var --libdir=/usr/lib + make + sudo make install + +Or to install into a private user specific location + + ./configure --prefix=$HOME/spice + make + make install + +The following mandatory dependancies are required in order to +build SPICE + + Spice protocol >= 0.9.0 + Celt >= 0.5.1.1, < 0.6.0 + Pixman >= 0.17.7 + OpenSSL + libjpeg + zlib + Cyrus-SASL + +The following optional dependancies increase the available +functionality + + GE Gui >= 0.6.0, < 0.7.0 (GUI app support) + OpenGL (GUI app support) + Alsa (Linux support) + XRandR >= 1.2 (X11 support) + Xinerama >= 1.0 (X11 support) + libcacard >= 0.1.2 (Smartcard support) + Slirp (Tunnelling support) + +Communication +------------- + +To communicate with the development team, or to post patches +there is a technical mailing list: + + http://lists.freedesktop.org/mailman/listinfo/spice-devel + +There is also a mailing list for new release announcements: + + http://lists.freedesktop.org/archives/spice-announce/ + +To view known bugs, or report new bugs, in SPICE visit + + https://bugs.freedesktop.org/describecomponents.cgi?product=Spice + +Bugs found when using an OS distribution's binary packages should +be reported to the OS vendors' own bug tracker first. + +The latest SPICE code can be found in GIT at: + + http://cgit.freedesktop.org/spice/ + +Licensing +--------- + +SPICE is provided under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. +Please see the COPYING file for the complete LGPLv2+ license +terms, or visit . -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, see . +-- End of readme From 0de78e9f59ec1fd7f48e5c51b44a0fc98e682d55 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 10 Jan 2012 14:44:16 +0000 Subject: [PATCH 37/47] Fix up copyright decl to always use 'Copyright (C) Red Hat, Inc.' A couple of files were missing '(C)' in the copyright header --- common/backtrace.c | 2 +- common/lz.c | 2 +- common/lz_compress_tmpl.c | 2 +- common/lz_decompress_tmpl.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/common/backtrace.c b/common/backtrace.c index 6fabdf02..4e2555ac 100644 --- a/common/backtrace.c +++ b/common/backtrace.c @@ -18,7 +18,7 @@ /* * Taken from xserver os/backtrace.c: - * Copyright 2008 Red Hat, Inc. + * Copyright (C) 2008 Red Hat, Inc. */ #include "config.h" diff --git a/common/lz.c b/common/lz.c index 2e3a1365..85c974b4 100644 --- a/common/lz.c +++ b/common/lz.c @@ -1,7 +1,7 @@ /* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* - Copyright 2009 Red Hat, Inc. and/or its affiliates. + Copyright (C) 2009 Red Hat, Inc. and/or its affiliates. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/common/lz_compress_tmpl.c b/common/lz_compress_tmpl.c index 865a30a8..ea878ffd 100644 --- a/common/lz_compress_tmpl.c +++ b/common/lz_compress_tmpl.c @@ -1,7 +1,7 @@ /* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* - Copyright 2009 Red Hat, Inc. and/or its affiliates. + Copyright (C) 2009 Red Hat, Inc. and/or its affiliates. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/common/lz_decompress_tmpl.c b/common/lz_decompress_tmpl.c index 6d520744..b962fb66 100644 --- a/common/lz_decompress_tmpl.c +++ b/common/lz_decompress_tmpl.c @@ -1,7 +1,7 @@ /* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* - Copyright 2009 Red Hat, Inc. and/or its affiliates. + Copyright (C) 2009 Red Hat, Inc. and/or its affiliates. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public From 440ba5d8f0f5b2a3a9f4ae09095b186299b745b9 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 10 Jan 2012 14:45:44 +0000 Subject: [PATCH 38/47] Always quote first arg to AC_DEFINE The first arg to AC_DEFINE should always be quoted --- configure.ac | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index cf3eda69..a8dbc730 100644 --- a/configure.ac +++ b/configure.ac @@ -99,7 +99,7 @@ AC_ARG_ENABLE(tunnel, AS_IF([test x"$enable_tunnel" != "xno"], [enable_tunnel="yes"]) AM_CONDITIONAL(SUPPORT_TUNNEL, test "x$enable_tunnel" != "xno") if test "x$enable_tunnel" != "xno"; then - AC_DEFINE(USE_TUNNEL, [1], [Define if supporting tunnel proxying]) + AC_DEFINE([USE_TUNNEL], [1], [Define if supporting tunnel proxying]) fi AC_ARG_ENABLE(gui, @@ -120,7 +120,7 @@ AC_ARG_ENABLE(smartcard, AS_IF([test x"$enable_smartcard" != "xno"], [enable_smartcard="yes"]) AM_CONDITIONAL(SUPPORT_SMARTCARD, test "x$enable_smartcard" != "xno") if test "x$enable_smartcard" = "xyes"; then - AC_DEFINE(USE_SMARTCARD, [1], [Define if supporting smartcard proxying]) + AC_DEFINE([USE_SMARTCARD], [1], [Define if supporting smartcard proxying]) fi AC_ARG_ENABLE(client, @@ -139,7 +139,7 @@ AC_CHECK_LIBM AC_SUBST(LIBM) AC_CHECK_LIB(rt, clock_gettime, - AC_DEFINE(HAVE_CLOCK_GETTIME, 1, [Defined if we have clock_gettime()]) + AC_DEFINE([HAVE_CLOCK_GETTIME], 1, [Defined if we have clock_gettime()]) LIBRT=-lrt ) AC_SUBST(LIBRT) @@ -168,7 +168,7 @@ else AC_MSG_RESULT($posix_yield_func) posix_yield_func="$posix_yield_func()" fi -AC_DEFINE_UNQUOTED(POSIX_YIELD_FUNC,$posix_yield_func,[The POSIX RT yield function]) +AC_DEFINE_UNQUOTED([POSIX_YIELD_FUNC],$posix_yield_func,[The POSIX RT yield function]) SPICE_REQUIRES="" From 9f087ee7f01c9139765adc7c0aa3e41a2d09810e Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 10 Jan 2012 14:46:03 +0000 Subject: [PATCH 39/47] Remove unused assert.h include The assert.h include was never used in any code --- server/main_dispatcher.c | 1 - 1 file changed, 1 deletion(-) diff --git a/server/main_dispatcher.c b/server/main_dispatcher.c index a5967fa4..2ccf5346 100644 --- a/server/main_dispatcher.c +++ b/server/main_dispatcher.c @@ -2,7 +2,6 @@ #include #include #include -#include #include "red_common.h" #include "dispatcher.h" From 8ab7c4535a884d301cfc8b02c855df36c0cf0e5b Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 10 Jan 2012 14:46:55 +0000 Subject: [PATCH 40/47] Remove 'the the' typos --- server/jpeg_encoder.h | 2 +- server/red_tunnel_worker.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/jpeg_encoder.h b/server/jpeg_encoder.h index 2b8d8b20..74c73243 100644 --- a/server/jpeg_encoder.h +++ b/server/jpeg_encoder.h @@ -53,7 +53,7 @@ struct JpegEncoderUsrContext { JpegEncoderContext* jpeg_encoder_create(JpegEncoderUsrContext *usr); void jpeg_encoder_destroy(JpegEncoderContext *encoder); -/* returns the total size of the encoded data. Images must be supplied from the the +/* returns the total size of the encoded data. Images must be supplied from the top line to the bottom */ int jpeg_encode(JpegEncoderContext *jpeg, int quality, JpegEncoderImageType type, int width, int height, uint8_t *lines, unsigned int num_lines, int stride, diff --git a/server/red_tunnel_worker.c b/server/red_tunnel_worker.c index 250e8b3e..429f7372 100644 --- a/server/red_tunnel_worker.c +++ b/server/red_tunnel_worker.c @@ -323,7 +323,7 @@ static TunneledBufferProcessQueue *tunnel_socket_alloc_simple_print_reply_proces static void free_simple_process_queue(TunneledBufferProcessQueue *queue); typedef struct ServiceCallback { - /* allocating the the queue & setting the analysis proc by service type */ + /* allocating the queue & setting the analysis proc by service type */ TunneledBufferProcessQueue *(*alloc_process_queue)(RedSocket * sckt); void (*free_process_queue)(TunneledBufferProcessQueue *queue); } ServiceCallback; From 02d56750bda532e9a0b4e4d9efcde82ae44fdc38 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 10 Jan 2012 15:03:38 +0000 Subject: [PATCH 41/47] Remove trailing blank lines Remove any blank lines at the end of all source files --- TODO.multiclient | 1 - autogen.sh | 1 - client/application.cpp | 1 - client/application.h | 1 - client/audio_channels.h | 1 - client/audio_devices.h | 1 - client/cache.hpp | 1 - client/canvas.h | 1 - client/client_net_socket.cpp | 1 - client/cmd_line_parser.cpp | 1 - client/cmd_line_parser.h | 1 - client/common.h | 1 - client/cursor.cpp | 1 - client/cursor.h | 1 - client/cursor_channel.cpp | 1 - client/cursor_channel.h | 1 - client/debug.h | 1 - client/demarshallers.h | 1 - client/display_channel.cpp | 1 - client/display_channel.h | 1 - client/event_sources.h | 1 - client/glz_decode_tmpl.c | 1 - client/glz_decoded_image.h | 1 - client/glz_decoder.cpp | 1 - client/glz_decoder.h | 1 - client/glz_decoder_config.h | 1 - client/glz_decoder_window.cpp | 1 - client/glz_decoder_window.h | 1 - client/gui/Makefile.am | 1 - client/gui/gui.cpp | 1 - client/gui/gui.h | 1 - client/gui/resource_provider.cpp | 1 - client/gui/resource_provider.h | 1 - client/gui/softrenderer.cpp | 1 - client/gui/softrenderer.h | 1 - client/gui/softtexture.cpp | 1 - client/gui/softtexture.h | 1 - client/hot_keys.cpp | 1 - client/hot_keys.h | 1 - client/icon.h | 1 - client/inputs_channel.cpp | 1 - client/inputs_channel.h | 1 - client/inputs_handler.h | 1 - client/jpeg_decoder.h | 1 - client/menu.h | 1 - client/monitor.h | 1 - client/pixels_source.h | 1 - client/platform.h | 1 - client/playback_channel.cpp | 1 - client/read_write_mutex.h | 1 - client/record_channel.cpp | 1 - client/red_channel.cpp | 1 - client/red_channel.h | 1 - client/red_client.cpp | 1 - client/red_client.h | 1 - client/red_drawable.h | 1 - client/red_gdi_canvas.cpp | 1 - client/red_gdi_canvas.h | 1 - client/red_gl_canvas.cpp | 1 - client/red_gl_canvas.h | 1 - client/red_key.h | 1 - client/red_peer.h | 1 - client/red_pixmap.h | 1 - client/red_pixmap_gdi.h | 1 - client/red_pixmap_gl.h | 1 - client/red_pixmap_sw.h | 1 - client/red_sw_canvas.cpp | 1 - client/red_sw_canvas.h | 1 - client/red_types.h | 1 - client/red_window.h | 1 - client/screen.cpp | 1 - client/screen.h | 1 - client/screen_layer.cpp | 1 - client/screen_layer.h | 1 - client/shared_cache.hpp | 1 - client/smartcard_channel.cpp | 1 - client/smartcard_channel.h | 1 - client/threads.cpp | 1 - client/threads.h | 1 - client/utils.cpp | 1 - client/utils.h | 1 - client/windows/atomic_count.h | 1 - client/windows/event_sources_p.cpp | 1 - client/windows/event_sources_p.h | 1 - client/windows/main.cpp | 1 - client/windows/my_getopt.cpp | 1 - client/windows/named_pipe.cpp | 1 - client/windows/named_pipe.h | 1 - client/windows/pixels_source.cpp | 1 - client/windows/pixels_source_p.h | 1 - client/windows/platform_utils.cpp | 1 - client/windows/platform_utils.h | 1 - client/windows/playback.cpp | 1 - client/windows/playback.h | 1 - client/windows/record.cpp | 1 - client/windows/record.h | 1 - client/windows/red_drawable.cpp | 1 - client/windows/red_pixmap.cpp | 1 - client/windows/red_pixmap_gdi.cpp | 1 - client/windows/red_pixmap_sw.cpp | 1 - client/windows/red_window_p.h | 1 - client/windows/stdint.h | 3 --- client/windows/win_platform.h | 1 - client/x11/.gitignore | 2 +- client/x11/atomic_count.h | 1 - client/x11/event_sources_p.h | 1 - client/x11/main.cpp | 1 - client/x11/named_pipe.cpp | 1 - client/x11/named_pipe.h | 1 - client/x11/pixels_source.cpp | 1 - client/x11/pixels_source_p.h | 1 - client/x11/platform_utils.h | 1 - client/x11/playback.cpp | 1 - client/x11/playback.h | 1 - client/x11/record.cpp | 1 - client/x11/record.h | 1 - client/x11/red_drawable.cpp | 1 - client/x11/red_pixmap.cpp | 1 - client/x11/red_pixmap_gl.cpp | 1 - client/x11/red_pixmap_sw.cpp | 1 - client/x11/red_window.cpp | 1 - client/x11/red_window_p.h | 1 - client/x11/res.cpp | 1 - client/x11/res.h | 1 - client/x11/resource.h | 1 - client/x11/x_icon.cpp | 1 - client/x11/x_icon.h | 1 - client/x11/x_platform.h | 1 - common/Makefile.am | 1 - common/canvas_utils.c | 1 - common/gdi_canvas.c | 1 - common/glc.c | 1 - common/lz.c | 1 - common/lz_decompress_tmpl.c | 1 - common/ogl_ctx.c | 1 - common/ogl_ctx.h | 1 - common/quic.c | 1 - common/quic.h | 1 - common/quic_config.h | 1 - common/quic_family_tmpl.c | 1 - common/quic_rgb_tmpl.c | 1 - common/quic_tmpl.c | 1 - common/rect.h | 1 - common/region.c | 1 - common/region.h | 1 - common/ring.h | 1 - common/rop3.h | 1 - python_modules/Makefile.am | 1 - python_modules/spice_parser.py | 1 - server/demarshallers.h | 1 - server/glz_encode_tmpl.c | 1 - server/glz_encoder.c | 1 - server/glz_encoder.h | 1 - server/glz_encoder_config.h | 1 - server/glz_encoder_dictionary.c | 1 - server/glz_encoder_dictionary.h | 1 - server/glz_encoder_dictionary_protected.h | 1 - server/inputs_channel.c | 1 - server/inputs_channel.h | 1 - server/main_channel.c | 1 - server/red_bitmap_utils.h | 1 - server/red_common.h | 1 - server/red_parse_qxl.c | 1 - server/red_tunnel_worker.c | 1 - server/red_worker.h | 1 - server/reds.h | 1 - server/smartcard.h | 1 - server/snd_worker.c | 1 - server/snd_worker.h | 1 - server/spice-experimental.h | 1 - server/stat.h | 1 - server/tests/README | 1 - server/tests/basic_event_loop.c | 1 - server/tests/test_display_base.c | 1 - server/tests/test_display_no_ssl.c | 1 - server/tests/test_display_streaming.c | 1 - server/tests/test_empty_success.c | 1 - server/tests/test_fail_on_null_core_interface.c | 1 - server/tests/test_just_sockets_no_ssl.c | 1 - tools/bitmap_to_c.c | 1 - tools/icon_to_c.c | 1 - tools/reds_stat.c | 1 - 182 files changed, 1 insertion(+), 184 deletions(-) diff --git a/TODO.multiclient b/TODO.multiclient index 92d8a7d5..5dcdb210 100644 --- a/TODO.multiclient +++ b/TODO.multiclient @@ -13,4 +13,3 @@ Chardev channel: allow adding a chardev channel without any server changes: qemu -spicevmc name=generic,channelname=bla,id=bla -mon chardev=bla Note: client will still need to decide what to do with it of course. So the channelname will have to have a predefined meaning. - diff --git a/autogen.sh b/autogen.sh index 217cc22e..48ee9a2f 100755 --- a/autogen.sh +++ b/autogen.sh @@ -164,4 +164,3 @@ cd $ORIGDIR || exit $? rm -f config.cache do_cmd $srcdir/configure --enable-maintainer-mode ${1+"$@"} || exit 1 - diff --git a/client/application.cpp b/client/application.cpp index b92b6484..08fa4fcb 100644 --- a/client/application.cpp +++ b/client/application.cpp @@ -2670,4 +2670,3 @@ int Application::main(int argc, char** argv, const char* version_str) cleanup_globals(); return ret; } - diff --git a/client/application.h b/client/application.h index db8d4e80..ac51cd2a 100644 --- a/client/application.h +++ b/client/application.h @@ -407,4 +407,3 @@ private: }; #endif - diff --git a/client/audio_channels.h b/client/audio_channels.h index 2722e20e..d38a79eb 100644 --- a/client/audio_channels.h +++ b/client/audio_channels.h @@ -106,4 +106,3 @@ private: }; #endif - diff --git a/client/audio_devices.h b/client/audio_devices.h index 85478acf..a1da1f72 100644 --- a/client/audio_devices.h +++ b/client/audio_devices.h @@ -49,4 +49,3 @@ public: }; #endif - diff --git a/client/cache.hpp b/client/cache.hpp index 66874002..42e6873d 100644 --- a/client/cache.hpp +++ b/client/cache.hpp @@ -118,4 +118,3 @@ private: }; #endif - diff --git a/client/canvas.h b/client/canvas.h index a9cdecd9..5a34bdc5 100644 --- a/client/canvas.h +++ b/client/canvas.h @@ -350,4 +350,3 @@ private: #endif - diff --git a/client/client_net_socket.cpp b/client/client_net_socket.cpp index 412c1fd5..e9f1e770 100644 --- a/client/client_net_socket.cpp +++ b/client/client_net_socket.cpp @@ -386,4 +386,3 @@ void ClientNetSocket::apply_disconnect() _close_pending = false; _fin_pending = false; } - diff --git a/client/cmd_line_parser.cpp b/client/cmd_line_parser.cpp index f2b32909..25ce05bf 100644 --- a/client/cmd_line_parser.cpp +++ b/client/cmd_line_parser.cpp @@ -517,4 +517,3 @@ void CmdLineParser::show_help() os << "\n"; Platform::term_printf(os.str().c_str()); } - diff --git a/client/cmd_line_parser.h b/client/cmd_line_parser.h index 5faf52bd..1ce1807d 100644 --- a/client/cmd_line_parser.h +++ b/client/cmd_line_parser.h @@ -102,4 +102,3 @@ private: }; #endif - diff --git a/client/common.h b/client/common.h index e9572bd7..268057a6 100644 --- a/client/common.h +++ b/client/common.h @@ -88,4 +88,3 @@ extern const char* PACKAGE_VERSION; #include "red_types.h" #endif - diff --git a/client/cursor.cpp b/client/cursor.cpp index 2ca2cd7f..e9e3006d 100644 --- a/client/cursor.cpp +++ b/client/cursor.cpp @@ -113,4 +113,3 @@ int LocalCursor::get_size_bits(const SpiceCursorHeader& header, int& size) return 0; } } - diff --git a/client/cursor.h b/client/cursor.h index f5084cd9..16b7fc52 100644 --- a/client/cursor.h +++ b/client/cursor.h @@ -70,4 +70,3 @@ private: }; #endif - diff --git a/client/cursor_channel.cpp b/client/cursor_channel.cpp index 12e2470b..e317dfa2 100644 --- a/client/cursor_channel.cpp +++ b/client/cursor_channel.cpp @@ -667,4 +667,3 @@ ChannelFactory& CursorChannel::Factory() { return factory; } - diff --git a/client/cursor_channel.h b/client/cursor_channel.h index c9e32b4d..3458c5f4 100644 --- a/client/cursor_channel.h +++ b/client/cursor_channel.h @@ -91,4 +91,3 @@ private: }; #endif - diff --git a/client/debug.h b/client/debug.h index c72ccd88..f2cc2990 100644 --- a/client/debug.h +++ b/client/debug.h @@ -90,4 +90,3 @@ void spice_log_cleanup(void); } #endif // _H_DEBUG - diff --git a/client/demarshallers.h b/client/demarshallers.h index 6d54ecea..90084cf2 100644 --- a/client/demarshallers.h +++ b/client/demarshallers.h @@ -25,4 +25,3 @@ spice_parse_channel_func_t spice_get_server_channel_parser(uint32_t channel, uns spice_parse_channel_func_t spice_get_server_channel_parser1(uint32_t channel, unsigned int *max_message_type); #endif - diff --git a/client/display_channel.cpp b/client/display_channel.cpp index 2e0613c2..22391220 100644 --- a/client/display_channel.cpp +++ b/client/display_channel.cpp @@ -1840,4 +1840,3 @@ ChannelFactory& DisplayChannel::Factory() { return factory; } - diff --git a/client/display_channel.h b/client/display_channel.h index 61109edf..7cdd55c8 100644 --- a/client/display_channel.h +++ b/client/display_channel.h @@ -241,4 +241,3 @@ private: }; #endif - diff --git a/client/event_sources.h b/client/event_sources.h index 5983f399..0db8ce6f 100644 --- a/client/event_sources.h +++ b/client/event_sources.h @@ -92,4 +92,3 @@ class EventSources::Handle: public EventSource, public Handle_p { }; #endif - diff --git a/client/glz_decode_tmpl.c b/client/glz_decode_tmpl.c index 2e4f1369..6aaf63b3 100644 --- a/client/glz_decode_tmpl.c +++ b/client/glz_decode_tmpl.c @@ -335,4 +335,3 @@ static size_t FNAME(decode)(GlzDecoderWindow &window, uint8_t* in_buf, #undef COPY_COMP_PIXEL #undef COPY_PLT_ENTRY #undef CAST_PLT_DISTANCE - diff --git a/client/glz_decoded_image.h b/client/glz_decoded_image.h index 6827d6dc..2e607f81 100644 --- a/client/glz_decoded_image.h +++ b/client/glz_decoded_image.h @@ -62,4 +62,3 @@ inline uint8_t* GlzDecodedImage::get_pixel_ref(int offset) } #endif - diff --git a/client/glz_decoder.cpp b/client/glz_decoder.cpp index dea1a1be..e5dd0fa8 100644 --- a/client/glz_decoder.cpp +++ b/client/glz_decoder.cpp @@ -299,4 +299,3 @@ void GlzDecoder::decode(uint8_t *data, SpicePalette *palette, void *opaque_usr_i _images_window.post_decode(decoded_image); } - diff --git a/client/glz_decoder.h b/client/glz_decoder.h index 35b0a3ed..a0352cc1 100644 --- a/client/glz_decoder.h +++ b/client/glz_decoder.h @@ -82,4 +82,3 @@ private: }; #endif // _H_GLZ_DECODER - diff --git a/client/glz_decoder_config.h b/client/glz_decoder_config.h index 835e2a70..52fa52d3 100644 --- a/client/glz_decoder_config.h +++ b/client/glz_decoder_config.h @@ -64,4 +64,3 @@ public: #define GLZ_DECODE_TO_RGB32 #endif //_H_GLZ_DECODER_CONFIG - diff --git a/client/glz_decoder_window.cpp b/client/glz_decoder_window.cpp index 54fdbdc8..51d44abc 100644 --- a/client/glz_decoder_window.cpp +++ b/client/glz_decoder_window.cpp @@ -327,4 +327,3 @@ inline int GlzDecoderWindow::calc_image_win_idx(uint64_t image_id) { return (int)((_head_idx + _n_images - 1 - (_tail_image_id - image_id)) % _images_capacity); } - diff --git a/client/glz_decoder_window.h b/client/glz_decoder_window.h index e061c736..f89d18f0 100644 --- a/client/glz_decoder_window.h +++ b/client/glz_decoder_window.h @@ -120,4 +120,3 @@ inline uint8_t *GlzDecoderWindow::get_ref_pixel(DecodedImageWinId decoded_image_ } #endif // _H_GLZ_DECODER_WINDOW - diff --git a/client/gui/Makefile.am b/client/gui/Makefile.am index e1204c92..81e4f88e 100644 --- a/client/gui/Makefile.am +++ b/client/gui/Makefile.am @@ -18,4 +18,3 @@ EXTRA_DIST = \ taharez_look.scheme.c \ taharez_look.tga.c \ $(NULL) - diff --git a/client/gui/gui.cpp b/client/gui/gui.cpp index abfe1110..6dd4ceab 100644 --- a/client/gui/gui.cpp +++ b/client/gui/gui.cpp @@ -1412,4 +1412,3 @@ bool GUI::message_box(MessageType type, const char *text, const ButtonsList& but } return _dialog->message_box(type, text, buttons, _response_handler); } - diff --git a/client/gui/gui.h b/client/gui/gui.h index 457c3512..b93b42a2 100644 --- a/client/gui/gui.h +++ b/client/gui/gui.h @@ -141,4 +141,3 @@ private: }; #endif - diff --git a/client/gui/resource_provider.cpp b/client/gui/resource_provider.cpp index b80ce092..3c0b897a 100644 --- a/client/gui/resource_provider.cpp +++ b/client/gui/resource_provider.cpp @@ -146,4 +146,3 @@ const char* res_get_string(int id) return NULL; } - diff --git a/client/gui/resource_provider.h b/client/gui/resource_provider.h index 6f59cb8a..c0d319b5 100644 --- a/client/gui/resource_provider.h +++ b/client/gui/resource_provider.h @@ -57,4 +57,3 @@ enum { const char* res_get_string(int id); #endif - diff --git a/client/gui/softrenderer.cpp b/client/gui/softrenderer.cpp index 92a1c838..9f19e7b0 100644 --- a/client/gui/softrenderer.cpp +++ b/client/gui/softrenderer.cpp @@ -388,4 +388,3 @@ uint SoftRenderer::getVertScreenDPI() const } } - diff --git a/client/gui/softrenderer.h b/client/gui/softrenderer.h index f25f79e2..b97f9d59 100644 --- a/client/gui/softrenderer.h +++ b/client/gui/softrenderer.h @@ -146,4 +146,3 @@ namespace CEGUI } #endif - diff --git a/client/gui/softtexture.cpp b/client/gui/softtexture.cpp index b41dd65b..d9ce9a07 100644 --- a/client/gui/softtexture.cpp +++ b/client/gui/softtexture.cpp @@ -137,4 +137,3 @@ void SoftTexture::loadFromMemory(const void* buffPtr, uint buffWidth, } - diff --git a/client/gui/softtexture.h b/client/gui/softtexture.h index 65a4ece5..668ca4f1 100644 --- a/client/gui/softtexture.h +++ b/client/gui/softtexture.h @@ -56,4 +56,3 @@ namespace CEGUI } #endif - diff --git a/client/hot_keys.cpp b/client/hot_keys.cpp index 65b1bc34..f98a4bb9 100644 --- a/client/hot_keys.cpp +++ b/client/hot_keys.cpp @@ -147,4 +147,3 @@ void HotKeysParser::add_hotkey(const std::string& hotkey, const CommandsMap& com std::string keys = hotkey.substr(key_start + 1); parse_keys(command_id, keys); } - diff --git a/client/hot_keys.h b/client/hot_keys.h index c7f50e49..e78390d3 100644 --- a/client/hot_keys.h +++ b/client/hot_keys.h @@ -46,4 +46,3 @@ private: }; #endif - diff --git a/client/icon.h b/client/icon.h index 45980fd7..35b0a9d9 100644 --- a/client/icon.h +++ b/client/icon.h @@ -33,4 +33,3 @@ private: }; #endif - diff --git a/client/inputs_channel.cpp b/client/inputs_channel.cpp index 9e940d9a..b6f02200 100644 --- a/client/inputs_channel.cpp +++ b/client/inputs_channel.cpp @@ -609,4 +609,3 @@ ChannelFactory& InputsChannel::Factory() { return factory; } - diff --git a/client/inputs_channel.h b/client/inputs_channel.h index 254ed450..cff3f904 100644 --- a/client/inputs_channel.h +++ b/client/inputs_channel.h @@ -94,4 +94,3 @@ private: #endif - diff --git a/client/inputs_handler.h b/client/inputs_handler.h index 6f9c373e..060a4adc 100644 --- a/client/inputs_handler.h +++ b/client/inputs_handler.h @@ -40,4 +40,3 @@ public: }; #endif - diff --git a/client/jpeg_decoder.h b/client/jpeg_decoder.h index 45d75d7c..8f7e1bb8 100644 --- a/client/jpeg_decoder.h +++ b/client/jpeg_decoder.h @@ -89,4 +89,3 @@ private: RGBToBGRXConverter _rgb2bgrx; }; #endif - diff --git a/client/menu.h b/client/menu.h index 6e3d2f1b..280cf388 100644 --- a/client/menu.h +++ b/client/menu.h @@ -100,4 +100,3 @@ private: }; #endif - diff --git a/client/monitor.h b/client/monitor.h index ec31da47..b8d7c88b 100644 --- a/client/monitor.h +++ b/client/monitor.h @@ -55,4 +55,3 @@ protected: }; #endif - diff --git a/client/pixels_source.h b/client/pixels_source.h index fac9c22e..1f4d1965 100644 --- a/client/pixels_source.h +++ b/client/pixels_source.h @@ -56,4 +56,3 @@ public: }; #endif - diff --git a/client/platform.h b/client/platform.h index a9a1715b..2025ad9d 100644 --- a/client/platform.h +++ b/client/platform.h @@ -201,4 +201,3 @@ public: }; #endif - diff --git a/client/playback_channel.cpp b/client/playback_channel.cpp index d3445e59..802a4d3b 100644 --- a/client/playback_channel.cpp +++ b/client/playback_channel.cpp @@ -368,4 +368,3 @@ ChannelFactory& PlaybackChannel::Factory() { return factory; } - diff --git a/client/read_write_mutex.h b/client/read_write_mutex.h index 72eb0fa5..107474ee 100644 --- a/client/read_write_mutex.h +++ b/client/read_write_mutex.h @@ -117,4 +117,3 @@ private: }; #endif - diff --git a/client/record_channel.cpp b/client/record_channel.cpp index 04760311..d9332c6b 100644 --- a/client/record_channel.cpp +++ b/client/record_channel.cpp @@ -291,4 +291,3 @@ ChannelFactory& RecordChannel::Factory() { return factory; } - diff --git a/client/red_channel.cpp b/client/red_channel.cpp index e8c058cc..5523abdb 100644 --- a/client/red_channel.cpp +++ b/client/red_channel.cpp @@ -885,4 +885,3 @@ void RedChannel::handle_wait_for_channels(RedPeer::InMessage* message) } _client.wait_for_channels(wait->wait_count, wait->wait_list); } - diff --git a/client/red_channel.h b/client/red_channel.h index 8128626f..a8390214 100644 --- a/client/red_channel.h +++ b/client/red_channel.h @@ -350,4 +350,3 @@ void MessageHandlerImp::set_handler(unsigned int id, H } #endif - diff --git a/client/red_client.cpp b/client/red_client.cpp index f3da4c92..6b11e38a 100644 --- a/client/red_client.cpp +++ b/client/red_client.cpp @@ -1407,4 +1407,3 @@ void RedClient::register_channel_factory(ChannelFactory& factory) { _factorys.push_back(&factory); } - diff --git a/client/red_client.h b/client/red_client.h index f4cd46b6..8872ce88 100644 --- a/client/red_client.h +++ b/client/red_client.h @@ -385,4 +385,3 @@ private: }; #endif - diff --git a/client/red_drawable.h b/client/red_drawable.h index 3fac164c..660ff4e8 100644 --- a/client/red_drawable.h +++ b/client/red_drawable.h @@ -120,4 +120,3 @@ public: }; #endif - diff --git a/client/red_gdi_canvas.cpp b/client/red_gdi_canvas.cpp index 6ac2e8a6..2e42510a 100644 --- a/client/red_gdi_canvas.cpp +++ b/client/red_gdi_canvas.cpp @@ -91,4 +91,3 @@ CanvasType GDICanvas::get_pixmap_type() { return CANVAS_TYPE_GDI; } - diff --git a/client/red_gdi_canvas.h b/client/red_gdi_canvas.h index 67a2dbab..fa173c44 100644 --- a/client/red_gdi_canvas.h +++ b/client/red_gdi_canvas.h @@ -53,4 +53,3 @@ private: }; #endif - diff --git a/client/red_gl_canvas.cpp b/client/red_gl_canvas.cpp index abe08558..59c8f06b 100644 --- a/client/red_gl_canvas.cpp +++ b/client/red_gl_canvas.cpp @@ -118,4 +118,3 @@ void GCanvas::post_gl_copy() { _pixmap->past_copy(); } - diff --git a/client/red_gl_canvas.h b/client/red_gl_canvas.h index a8c901c3..a57ea480 100644 --- a/client/red_gl_canvas.h +++ b/client/red_gl_canvas.h @@ -64,4 +64,3 @@ private: }; #endif - diff --git a/client/red_key.h b/client/red_key.h index b37234e0..ea3396ab 100644 --- a/client/red_key.h +++ b/client/red_key.h @@ -147,4 +147,3 @@ enum RedKey { }; #endif - diff --git a/client/red_peer.h b/client/red_peer.h index ce06143c..5e2b2b91 100644 --- a/client/red_peer.h +++ b/client/red_peer.h @@ -206,4 +206,3 @@ protected: }; #endif - diff --git a/client/red_pixmap.h b/client/red_pixmap.h index 46e3657b..240ed768 100644 --- a/client/red_pixmap.h +++ b/client/red_pixmap.h @@ -46,4 +46,3 @@ protected: }; #endif - diff --git a/client/red_pixmap_gdi.h b/client/red_pixmap_gdi.h index bccce849..828b76b9 100644 --- a/client/red_pixmap_gdi.h +++ b/client/red_pixmap_gdi.h @@ -33,4 +33,3 @@ public: }; #endif - diff --git a/client/red_pixmap_gl.h b/client/red_pixmap_gl.h index f7a14af9..88d14a1c 100644 --- a/client/red_pixmap_gl.h +++ b/client/red_pixmap_gl.h @@ -47,4 +47,3 @@ private: }; #endif - diff --git a/client/red_pixmap_sw.h b/client/red_pixmap_sw.h index c6061358..0c96a1f7 100644 --- a/client/red_pixmap_sw.h +++ b/client/red_pixmap_sw.h @@ -28,4 +28,3 @@ public: }; #endif - diff --git a/client/red_sw_canvas.cpp b/client/red_sw_canvas.cpp index 860e2a56..5f86dca1 100644 --- a/client/red_sw_canvas.cpp +++ b/client/red_sw_canvas.cpp @@ -106,4 +106,3 @@ CanvasType SCanvas::get_pixmap_type() { return CANVAS_TYPE_SW; } - diff --git a/client/red_sw_canvas.h b/client/red_sw_canvas.h index 807c128e..47366494 100644 --- a/client/red_sw_canvas.h +++ b/client/red_sw_canvas.h @@ -50,4 +50,3 @@ private: }; #endif - diff --git a/client/red_types.h b/client/red_types.h index a5a2fbb0..d5273390 100644 --- a/client/red_types.h +++ b/client/red_types.h @@ -35,4 +35,3 @@ struct IconHeader { class RedDrawable; #endif - diff --git a/client/red_window.h b/client/red_window.h index 82353aa1..dbd0c797 100644 --- a/client/red_window.h +++ b/client/red_window.h @@ -196,4 +196,3 @@ static bool find_anchor_point(const REGION& region, SpicePoint& pt) } #endif - diff --git a/client/screen.cpp b/client/screen.cpp index dc334559..a05d5620 100644 --- a/client/screen.cpp +++ b/client/screen.cpp @@ -939,4 +939,3 @@ void RedScreen::unset_type_gl() _window.unset_type_gl(); } #endif // USE_OPENGL - diff --git a/client/screen.h b/client/screen.h index 19efffb8..d7bb4c27 100644 --- a/client/screen.h +++ b/client/screen.h @@ -208,4 +208,3 @@ private: }; #endif - diff --git a/client/screen_layer.cpp b/client/screen_layer.cpp index 02abef24..3638509d 100644 --- a/client/screen_layer.cpp +++ b/client/screen_layer.cpp @@ -237,4 +237,3 @@ void ScreenLayer::detach_from_screen(Application& application) } ASSERT(!_screen); } - diff --git a/client/screen_layer.h b/client/screen_layer.h index 70cd6516..e8ad4217 100644 --- a/client/screen_layer.h +++ b/client/screen_layer.h @@ -85,4 +85,3 @@ private: }; #endif - diff --git a/client/shared_cache.hpp b/client/shared_cache.hpp index a8308545..b9c3fd90 100644 --- a/client/shared_cache.hpp +++ b/client/shared_cache.hpp @@ -221,4 +221,3 @@ private: }; #endif - diff --git a/client/smartcard_channel.cpp b/client/smartcard_channel.cpp index 11a6be07..09659c21 100644 --- a/client/smartcard_channel.cpp +++ b/client/smartcard_channel.cpp @@ -551,4 +551,3 @@ ChannelFactory& SmartCardChannel::Factory() { return factory; } - diff --git a/client/smartcard_channel.h b/client/smartcard_channel.h index a84cbfdb..0423bff0 100644 --- a/client/smartcard_channel.h +++ b/client/smartcard_channel.h @@ -157,4 +157,3 @@ private: }; #endif // __SMART_CARD_H__ - diff --git a/client/threads.cpp b/client/threads.cpp index 0b359e8e..bf499e72 100644 --- a/client/threads.cpp +++ b/client/threads.cpp @@ -133,4 +133,3 @@ Mutex::~Mutex() { pthread_mutex_destroy(&_mutex); } - diff --git a/client/threads.h b/client/threads.h index 8b5adb68..5bfd38b0 100644 --- a/client/threads.h +++ b/client/threads.h @@ -132,4 +132,3 @@ private: #endif - diff --git a/client/utils.cpp b/client/utils.cpp index 01ea0d3a..6b195b3d 100644 --- a/client/utils.cpp +++ b/client/utils.cpp @@ -42,4 +42,3 @@ int str_to_port(const char *str) } return port; } - diff --git a/client/utils.h b/client/utils.h index 3b3cbb0b..8f320085 100644 --- a/client/utils.h +++ b/client/utils.h @@ -148,4 +148,3 @@ class EmptyBase { }; #endif - diff --git a/client/windows/atomic_count.h b/client/windows/atomic_count.h index 0e49f7cb..7520fcae 100644 --- a/client/windows/atomic_count.h +++ b/client/windows/atomic_count.h @@ -39,4 +39,3 @@ private: }; #endif - diff --git a/client/windows/event_sources_p.cpp b/client/windows/event_sources_p.cpp index 4a9adf16..77035730 100644 --- a/client/windows/event_sources_p.cpp +++ b/client/windows/event_sources_p.cpp @@ -209,4 +209,3 @@ void EventSources::add_file(File& file) void EventSources::remove_file(File& file) { } - diff --git a/client/windows/event_sources_p.h b/client/windows/event_sources_p.h index 1b20fa7f..14cc8161 100644 --- a/client/windows/event_sources_p.h +++ b/client/windows/event_sources_p.h @@ -49,4 +49,3 @@ class Trigger_p: public Handle_p { }; #endif - diff --git a/client/windows/main.cpp b/client/windows/main.cpp index 46af699b..7a833055 100644 --- a/client/windows/main.cpp +++ b/client/windows/main.cpp @@ -108,4 +108,3 @@ int WINAPI WinMain(HINSTANCE hInstance, return exit_val; } - diff --git a/client/windows/my_getopt.cpp b/client/windows/my_getopt.cpp index da87655a..905b7174 100644 --- a/client/windows/my_getopt.cpp +++ b/client/windows/my_getopt.cpp @@ -20,4 +20,3 @@ #include "common.h" #include "../../common/win/my_getopt-1.5/my_getopt.c" - diff --git a/client/windows/named_pipe.cpp b/client/windows/named_pipe.cpp index 76d77da6..c8131120 100644 --- a/client/windows/named_pipe.cpp +++ b/client/windows/named_pipe.cpp @@ -230,4 +230,3 @@ void WinListener::create_pipe() THROW("ConnectNamedPipe() failed %u", GetLastError()); } } - diff --git a/client/windows/named_pipe.h b/client/windows/named_pipe.h index 4b7cfe64..10d5ced9 100644 --- a/client/windows/named_pipe.h +++ b/client/windows/named_pipe.h @@ -92,4 +92,3 @@ private: }; #endif - diff --git a/client/windows/pixels_source.cpp b/client/windows/pixels_source.cpp index 167255bd..3ddf5569 100644 --- a/client/windows/pixels_source.cpp +++ b/client/windows/pixels_source.cpp @@ -108,4 +108,3 @@ SpicePoint AlphaImageFromRes::get_size() Lock lock(*p_data->source_p._mutex); return get_bitmap_size(p_data->source_p.dc); } - diff --git a/client/windows/pixels_source_p.h b/client/windows/pixels_source_p.h index b8f00fa0..f06be0e1 100644 --- a/client/windows/pixels_source_p.h +++ b/client/windows/pixels_source_p.h @@ -26,4 +26,3 @@ struct PixelsSource_p { }; #endif - diff --git a/client/windows/platform_utils.cpp b/client/windows/platform_utils.cpp index a4405c1e..a4c9c417 100644 --- a/client/windows/platform_utils.cpp +++ b/client/windows/platform_utils.cpp @@ -148,4 +148,3 @@ int inet_aton(const char* ip, struct in_addr* in_addr) in_addr->S_un.S_addr = addr; return 1; } - diff --git a/client/windows/platform_utils.h b/client/windows/platform_utils.h index 2f333f70..a652feda 100644 --- a/client/windows/platform_utils.h +++ b/client/windows/platform_utils.h @@ -98,4 +98,3 @@ const char* sys_err_to_str(int error); int inet_aton(const char* ip, struct in_addr* in_addr); #endif - diff --git a/client/windows/playback.cpp b/client/windows/playback.cpp index 701dffcb..41b92bc1 100644 --- a/client/windows/playback.cpp +++ b/client/windows/playback.cpp @@ -176,4 +176,3 @@ uint32_t WavePlayer::get_delay_ms() { return _in_use * WavePlaybackAbstract::FRAME_SIZE / _sampels_per_ms; } - diff --git a/client/windows/playback.h b/client/windows/playback.h index 8632808c..6f70a7b4 100644 --- a/client/windows/playback.h +++ b/client/windows/playback.h @@ -52,4 +52,3 @@ private: }; #endif - diff --git a/client/windows/record.cpp b/client/windows/record.cpp index f0bb6446..0736b113 100644 --- a/client/windows/record.cpp +++ b/client/windows/record.cpp @@ -193,4 +193,3 @@ bool WaveRecorder::abort() { return true; } - diff --git a/client/windows/record.h b/client/windows/record.h index 3739c222..4071af4f 100644 --- a/client/windows/record.h +++ b/client/windows/record.h @@ -55,4 +55,3 @@ private: }; #endif - diff --git a/client/windows/red_drawable.cpp b/client/windows/red_drawable.cpp index dabc0d97..65c1aa6c 100644 --- a/client/windows/red_drawable.cpp +++ b/client/windows/red_drawable.cpp @@ -151,4 +151,3 @@ void RedDrawable::frame_rect(const SpiceRect& rect, rgb32_t color) } DeleteObject(brush); } - diff --git a/client/windows/red_pixmap.cpp b/client/windows/red_pixmap.cpp index 4538441c..6685e416 100644 --- a/client/windows/red_pixmap.cpp +++ b/client/windows/red_pixmap.cpp @@ -42,4 +42,3 @@ bool RedPixmap::is_big_endian_bits() { return _format == RedDrawable::A1; } - diff --git a/client/windows/red_pixmap_gdi.cpp b/client/windows/red_pixmap_gdi.cpp index 2d93113d..132ee6cc 100644 --- a/client/windows/red_pixmap_gdi.cpp +++ b/client/windows/red_pixmap_gdi.cpp @@ -119,4 +119,3 @@ RecurciveMutex& RedPixmapGdi::get_mutex() RedPixmap_p* p_data = (RedPixmap_p*)get_opaque(); return *p_data->pixels_source_p._mutex; } - diff --git a/client/windows/red_pixmap_sw.cpp b/client/windows/red_pixmap_sw.cpp index 9ed1460d..fac40a06 100644 --- a/client/windows/red_pixmap_sw.cpp +++ b/client/windows/red_pixmap_sw.cpp @@ -118,4 +118,3 @@ RedPixmapSw::~RedPixmapSw() DeleteDC(dc); } } - diff --git a/client/windows/red_window_p.h b/client/windows/red_window_p.h index 351d9b96..73d74e38 100644 --- a/client/windows/red_window_p.h +++ b/client/windows/red_window_p.h @@ -69,4 +69,3 @@ protected: }; #endif - diff --git a/client/windows/stdint.h b/client/windows/stdint.h index eaeb1996..0e0ecd41 100644 --- a/client/windows/stdint.h +++ b/client/windows/stdint.h @@ -391,6 +391,3 @@ typedef unsigned long long uintmax_t; #endif - - - diff --git a/client/windows/win_platform.h b/client/windows/win_platform.h index eba3b039..c1a356c8 100644 --- a/client/windows/win_platform.h +++ b/client/windows/win_platform.h @@ -37,4 +37,3 @@ private: }; #endif - diff --git a/client/x11/.gitignore b/client/x11/.gitignore index fbe61107..397a68f4 100644 --- a/client/x11/.gitignore +++ b/client/x11/.gitignore @@ -7,4 +7,4 @@ Makefile Makefile.in setup -spicec \ No newline at end of file +spicec diff --git a/client/x11/atomic_count.h b/client/x11/atomic_count.h index db20ad9e..02bb08d4 100644 --- a/client/x11/atomic_count.h +++ b/client/x11/atomic_count.h @@ -41,4 +41,3 @@ private: }; #endif - diff --git a/client/x11/event_sources_p.h b/client/x11/event_sources_p.h index 959460c2..4b826bb8 100644 --- a/client/x11/event_sources_p.h +++ b/client/x11/event_sources_p.h @@ -52,4 +52,3 @@ class Handle_p { }; #endif - diff --git a/client/x11/main.cpp b/client/x11/main.cpp index ccc95328..f95b3a21 100644 --- a/client/x11/main.cpp +++ b/client/x11/main.cpp @@ -49,4 +49,3 @@ int main(int argc, char** argv) return exit_val; } - diff --git a/client/x11/named_pipe.cpp b/client/x11/named_pipe.cpp index 0653bfcc..84b980dc 100644 --- a/client/x11/named_pipe.cpp +++ b/client/x11/named_pipe.cpp @@ -169,4 +169,3 @@ void LinuxListener::on_event() conn_interface.bind((NamedPipe::ConnectionRef)conn); } } - diff --git a/client/x11/named_pipe.h b/client/x11/named_pipe.h index 5b0e7f60..379cbffe 100644 --- a/client/x11/named_pipe.h +++ b/client/x11/named_pipe.h @@ -59,4 +59,3 @@ private: }; #endif - diff --git a/client/x11/pixels_source.cpp b/client/x11/pixels_source.cpp index 8d8b3443..71ea9ff4 100644 --- a/client/x11/pixels_source.cpp +++ b/client/x11/pixels_source.cpp @@ -106,4 +106,3 @@ SpicePoint AlphaImageFromRes::get_size() pt.y = pixman_image_get_height(image); return pt; } - diff --git a/client/x11/pixels_source_p.h b/client/x11/pixels_source_p.h index 8892c581..000fe4d0 100644 --- a/client/x11/pixels_source_p.h +++ b/client/x11/pixels_source_p.h @@ -89,4 +89,3 @@ struct RedDrawable_p { }; #endif - diff --git a/client/x11/platform_utils.h b/client/x11/platform_utils.h index d574e217..03a24892 100644 --- a/client/x11/platform_utils.h +++ b/client/x11/platform_utils.h @@ -36,4 +36,3 @@ typedef int SOCKET; #define sock_err_message(err) strerror(err) #endif - diff --git a/client/x11/playback.cpp b/client/x11/playback.cpp index e69294c8..5fa7e182 100644 --- a/client/x11/playback.cpp +++ b/client/x11/playback.cpp @@ -218,4 +218,3 @@ uint32_t WavePlayer::get_delay_ms() } return delay / _sampels_per_ms; } - diff --git a/client/x11/playback.h b/client/x11/playback.h index d8efd7e4..27ef9ed7 100644 --- a/client/x11/playback.h +++ b/client/x11/playback.h @@ -45,4 +45,3 @@ private: }; #endif - diff --git a/client/x11/record.cpp b/client/x11/record.cpp index 017a94db..bd76cee6 100644 --- a/client/x11/record.cpp +++ b/client/x11/record.cpp @@ -238,4 +238,3 @@ void WaveRecorder::on_event() } } } - diff --git a/client/x11/record.h b/client/x11/record.h index fde58c77..91410962 100644 --- a/client/x11/record.h +++ b/client/x11/record.h @@ -57,4 +57,3 @@ private: }; #endif - diff --git a/client/x11/red_drawable.cpp b/client/x11/red_drawable.cpp index d6cce920..fd5d4a16 100644 --- a/client/x11/red_drawable.cpp +++ b/client/x11/red_drawable.cpp @@ -793,4 +793,3 @@ void RedDrawable::frame_rect(const SpiceRect& area, rgb32_t color) THROW("invalid dest type %d", dest->source.type); } } - diff --git a/client/x11/red_pixmap.cpp b/client/x11/red_pixmap.cpp index 79190a06..af30f526 100644 --- a/client/x11/red_pixmap.cpp +++ b/client/x11/red_pixmap.cpp @@ -42,4 +42,3 @@ bool RedPixmap::is_big_endian_bits() { return false; } - diff --git a/client/x11/red_pixmap_gl.cpp b/client/x11/red_pixmap_gl.cpp index 011ead97..1e1e6e0f 100644 --- a/client/x11/red_pixmap_gl.cpp +++ b/client/x11/red_pixmap_gl.cpp @@ -309,4 +309,3 @@ RedPixmapGL::~RedPixmapGL() */ GLC_ERROR_TEST_FINISH; } - diff --git a/client/x11/red_pixmap_sw.cpp b/client/x11/red_pixmap_sw.cpp index a0dea4d0..3fd86778 100644 --- a/client/x11/red_pixmap_sw.cpp +++ b/client/x11/red_pixmap_sw.cpp @@ -91,4 +91,3 @@ RedPixmapSw::~RedPixmapSw() delete[] _data; } } - diff --git a/client/x11/red_window.cpp b/client/x11/red_window.cpp index 2d179f89..e0b7d456 100644 --- a/client/x11/red_window.cpp +++ b/client/x11/red_window.cpp @@ -2254,4 +2254,3 @@ void RedWindow::init() void RedWindow::cleanup() { } - diff --git a/client/x11/red_window_p.h b/client/x11/red_window_p.h index 6f94d261..27825393 100644 --- a/client/x11/red_window_p.h +++ b/client/x11/red_window_p.h @@ -87,4 +87,3 @@ protected: }; #endif - diff --git a/client/x11/res.cpp b/client/x11/res.cpp index f73e5404..efbd8de1 100644 --- a/client/x11/res.cpp +++ b/client/x11/res.cpp @@ -80,4 +80,3 @@ const IconHeader *res_get_icon(int id) } return NULL; } - diff --git a/client/x11/res.h b/client/x11/res.h index 77337720..8320e9b6 100644 --- a/client/x11/res.h +++ b/client/x11/res.h @@ -22,4 +22,3 @@ const PixmapHeader *res_get_image(int id); const IconHeader *res_get_icon(int id); #endif - diff --git a/client/x11/resource.h b/client/x11/resource.h index a0f18f31..562b9b98 100644 --- a/client/x11/resource.h +++ b/client/x11/resource.h @@ -22,4 +22,3 @@ #define ALT_IMAGE_RES_ID 4 #endif - diff --git a/client/x11/x_icon.cpp b/client/x11/x_icon.cpp index 8931d05f..edd983f1 100644 --- a/client/x11/x_icon.cpp +++ b/client/x11/x_icon.cpp @@ -173,4 +173,3 @@ Icon* Platform::load_icon(int id) XIcon *xicon = new XIcon(id, icon); return xicon->ref(); } - diff --git a/client/x11/x_icon.h b/client/x11/x_icon.h index fc2bdbd2..b8b5e96d 100644 --- a/client/x11/x_icon.h +++ b/client/x11/x_icon.h @@ -50,4 +50,3 @@ private: }; #endif - diff --git a/client/x11/x_platform.h b/client/x11/x_platform.h index 24f73ac4..39a2d1c3 100644 --- a/client/x11/x_platform.h +++ b/client/x11/x_platform.h @@ -54,4 +54,3 @@ public: }; #endif - diff --git a/common/Makefile.am b/common/Makefile.am index f07f9489..4189dc1f 100644 --- a/common/Makefile.am +++ b/common/Makefile.am @@ -74,4 +74,3 @@ EXTRA_DIST = \ quic_rgb_tmpl.c \ quic_tmpl.c \ $(NULL) - diff --git a/common/canvas_utils.c b/common/canvas_utils.c index 71f6890e..6632942e 100644 --- a/common/canvas_utils.c +++ b/common/canvas_utils.c @@ -297,4 +297,3 @@ pixman_image_t *alloc_lz_image_surface(LzDecodeUsrData *canvas_data, canvas_data->out_surface = surface; return surface; } - diff --git a/common/gdi_canvas.c b/common/gdi_canvas.c index 5c9cdf01..2cb83d8c 100644 --- a/common/gdi_canvas.c +++ b/common/gdi_canvas.c @@ -1857,4 +1857,3 @@ void gdi_canvas_init(void) //unsafe global function rop3_init(); } - diff --git a/common/glc.c b/common/glc.c index 1c81dd86..1414bcff 100644 --- a/common/glc.c +++ b/common/glc.c @@ -1511,4 +1511,3 @@ void glc_destroy(GLCCtx glc, int textures_lost) 8. support more image formats 9. use GLCImage in mask ops? */ - diff --git a/common/lz.c b/common/lz.c index 85c974b4..1d695a07 100644 --- a/common/lz.c +++ b/common/lz.c @@ -738,4 +738,3 @@ void lz_decode(LzContext *lz, LzImageType to_type, uint8_t *buf) encoder->usr->error(encoder->usr, "bad decode size\n"); } } - diff --git a/common/lz_decompress_tmpl.c b/common/lz_decompress_tmpl.c index b962fb66..46587eef 100644 --- a/common/lz_decompress_tmpl.c +++ b/common/lz_decompress_tmpl.c @@ -324,4 +324,3 @@ static size_t FNAME(decompress)(Encoder *encoder, OUT_PIXEL *out_buf, int size) #undef COPY_COMP_PIXEL #undef COPY_PLT_ENTRY #undef CAST_PLT_DISTANCE - diff --git a/common/ogl_ctx.c b/common/ogl_ctx.c index 0917f424..41c05915 100644 --- a/common/ogl_ctx.c +++ b/common/ogl_ctx.c @@ -249,4 +249,3 @@ void oglctx_destroy(OGLCtx *ctx) XCloseDisplay(ctx->x_display); free(ctx); } - diff --git a/common/ogl_ctx.h b/common/ogl_ctx.h index ae2ce7e1..e7f677ac 100644 --- a/common/ogl_ctx.h +++ b/common/ogl_ctx.h @@ -36,4 +36,3 @@ void oglctx_destroy(OGLCtx *ctx); #endif #endif - diff --git a/common/quic.c b/common/quic.c index ca7ffd24..46666383 100644 --- a/common/quic.c +++ b/common/quic.c @@ -1697,4 +1697,3 @@ void quic_init(void) init_zeroLUT(); #endif } - diff --git a/common/quic.h b/common/quic.h index 6047da8b..7ec94f56 100644 --- a/common/quic.h +++ b/common/quic.h @@ -70,4 +70,3 @@ void quic_init(void); #endif #endif - diff --git a/common/quic_config.h b/common/quic_config.h index 2a87f201..13c71f1d 100644 --- a/common/quic_config.h +++ b/common/quic_config.h @@ -46,4 +46,3 @@ extern "C" { #endif #endif - diff --git a/common/quic_family_tmpl.c b/common/quic_family_tmpl.c index fbefe893..bfba0ccf 100644 --- a/common/quic_family_tmpl.c +++ b/common/quic_family_tmpl.c @@ -115,4 +115,3 @@ static s_bucket *FNAME(find_bucket)(Channel *channel, const unsigned int val) #undef FNAME #undef VNAME #undef BPC - diff --git a/common/quic_rgb_tmpl.c b/common/quic_rgb_tmpl.c index 814fa5af..8f356792 100644 --- a/common/quic_rgb_tmpl.c +++ b/common/quic_rgb_tmpl.c @@ -763,4 +763,3 @@ static void FNAME(uncompress_row)(Encoder *encoder, #undef SET_b #undef GET_b #undef UNCOMPRESS_PIX_START - diff --git a/common/quic_tmpl.c b/common/quic_tmpl.c index d300fa97..6acd5042 100644 --- a/common/quic_tmpl.c +++ b/common/quic_tmpl.c @@ -633,4 +633,3 @@ static void FNAME(uncompress_row)(Encoder *encoder, Channel *channel, #undef family #undef BPC #undef BPC_MASK - diff --git a/common/rect.h b/common/rect.h index 360cb9d7..ef265cd9 100644 --- a/common/rect.h +++ b/common/rect.h @@ -120,4 +120,3 @@ static inline int rect_is_same_size(const SpiceRect& r1, const SpiceRect& r2) #endif #endif - diff --git a/common/region.c b/common/region.c index 10a6e62e..35935eac 100644 --- a/common/region.c +++ b/common/region.c @@ -888,4 +888,3 @@ int main(void) } #endif - diff --git a/common/region.h b/common/region.h index 16ec6eb7..954e06fa 100644 --- a/common/region.h +++ b/common/region.h @@ -68,4 +68,3 @@ void region_dump(const QRegion *rgn, const char *prefix); #endif #endif - diff --git a/common/ring.h b/common/ring.h index 304bc9a5..cb70696a 100644 --- a/common/ring.h +++ b/common/ring.h @@ -170,4 +170,3 @@ static inline unsigned int ring_get_length(Ring *ring) #endif #endif - diff --git a/common/rop3.h b/common/rop3.h index 3307649f..91c9207e 100644 --- a/common/rop3.h +++ b/common/rop3.h @@ -40,4 +40,3 @@ void rop3_init(void); #endif #endif - diff --git a/python_modules/Makefile.am b/python_modules/Makefile.am index f304ec0f..7d416dfc 100644 --- a/python_modules/Makefile.am +++ b/python_modules/Makefile.am @@ -3,4 +3,3 @@ NULL = PYTHON_MODULES = __init__.py codegen.py demarshal.py marshal.py ptypes.py spice_parser.py EXTRA_DIST = $(PYTHON_MODULES) - diff --git a/python_modules/spice_parser.py b/python_modules/spice_parser.py index e20e8fc1..d0aabb09 100644 --- a/python_modules/spice_parser.py +++ b/python_modules/spice_parser.py @@ -159,4 +159,3 @@ def parse(filename): t.register() protocol = types[-1] return protocol - diff --git a/server/demarshallers.h b/server/demarshallers.h index 38e4e158..c3d770db 100644 --- a/server/demarshallers.h +++ b/server/demarshallers.h @@ -24,4 +24,3 @@ typedef uint8_t * (*spice_parse_channel_func_t)(uint8_t *message_start, uint8_t spice_parse_channel_func_t spice_get_client_channel_parser(uint32_t channel, unsigned int *max_message_type); #endif - diff --git a/server/glz_encode_tmpl.c b/server/glz_encode_tmpl.c index d5144215..41edb1b7 100644 --- a/server/glz_encode_tmpl.c +++ b/server/glz_encode_tmpl.c @@ -572,4 +572,3 @@ static void FNAME(compress)(Encoder *encoder) #undef LZ_RGB32 #undef MIN_REF_ENCODE_SIZE #undef MAX_REF_ENCODE_SIZE - diff --git a/server/glz_encoder.c b/server/glz_encoder.c index 8d20807f..1ec1f9bd 100644 --- a/server/glz_encoder.c +++ b/server/glz_encoder.c @@ -308,4 +308,3 @@ int glz_encode(GlzEncoderContext *opaque_encoder, return encoder->io.bytes_count; } - diff --git a/server/glz_encoder.h b/server/glz_encoder.h index 6c4d2b38..9b4f9108 100644 --- a/server/glz_encoder.h +++ b/server/glz_encoder.h @@ -53,4 +53,3 @@ int glz_encode(GlzEncoderContext *opaque_encoder, LzImageType type, int width, i #endif // _H_GLZ_ENCODER - diff --git a/server/glz_encoder_config.h b/server/glz_encoder_config.h index 791d4fc4..2d1626a7 100644 --- a/server/glz_encoder_config.h +++ b/server/glz_encoder_config.h @@ -59,4 +59,3 @@ struct GlzEncoderUsrContext { #endif - diff --git a/server/glz_encoder_dictionary.c b/server/glz_encoder_dictionary.c index 7cadc492..efe6cb88 100644 --- a/server/glz_encoder_dictionary.c +++ b/server/glz_encoder_dictionary.c @@ -631,4 +631,3 @@ void glz_dictionary_post_encode(uint32_t encoder_id, GlzEncoderUsrContext *usr, dict->window.encoders_heads[encoder_id] = NULL_IMAGE_SEG_ID; pthread_mutex_unlock(&dict->lock); } - diff --git a/server/glz_encoder_dictionary.h b/server/glz_encoder_dictionary.h index a85db6e8..eb57aa54 100644 --- a/server/glz_encoder_dictionary.h +++ b/server/glz_encoder_dictionary.h @@ -67,4 +67,3 @@ void glz_enc_dictionary_remove_image(GlzEncDictContext *opaque_dict, GlzEncDictImageContext *image, GlzEncoderUsrContext *usr); #endif // _H_GLZ_ENCODER_DICTIONARY - diff --git a/server/glz_encoder_dictionary_protected.h b/server/glz_encoder_dictionary_protected.h index a594c5fa..ae7fdc20 100644 --- a/server/glz_encoder_dictionary_protected.h +++ b/server/glz_encoder_dictionary_protected.h @@ -184,4 +184,3 @@ void glz_dictionary_post_encode(uint32_t encoder_id, GlzEncoderUsrContext *usr, ref_seg->pixels_so_far))) #endif // _H_GLZ_ENCODER_DICTIONARY_PROTECTED - diff --git a/server/inputs_channel.c b/server/inputs_channel.c index 4fe36b8e..83c2cad9 100644 --- a/server/inputs_channel.c +++ b/server/inputs_channel.c @@ -570,4 +570,3 @@ void inputs_init(void) red_error("key modifiers timer create failed"); } } - diff --git a/server/inputs_channel.h b/server/inputs_channel.h index 39d244b9..672ca83a 100644 --- a/server/inputs_channel.h +++ b/server/inputs_channel.h @@ -36,4 +36,3 @@ void inputs_detach_tablet(SpiceTabletInstance *_tablet); void inputs_set_tablet_logical_size(int x_res, int y_res); #endif - diff --git a/server/main_channel.c b/server/main_channel.c index b55bf002..c4b27523 100644 --- a/server/main_channel.c +++ b/server/main_channel.c @@ -1113,4 +1113,3 @@ int main_channel_migrate_complete(MainChannel *main_chan, int success) } return semi_seamless_count; } - diff --git a/server/red_bitmap_utils.h b/server/red_bitmap_utils.h index 1f26eb4a..6d508a7c 100644 --- a/server/red_bitmap_utils.h +++ b/server/red_bitmap_utils.h @@ -159,4 +159,3 @@ static void FNAME(compute_lines_gradual_score)(PIXEL *lines, int width, int num_ #undef CONTRAST_TH #undef SAME_PIXEL_WEIGHT #undef NOT_CONTRAST_PIXELS_WEIGHT - diff --git a/server/red_common.h b/server/red_common.h index 494ffed2..86be95dd 100644 --- a/server/red_common.h +++ b/server/red_common.h @@ -35,4 +35,3 @@ enum { }; #endif - diff --git a/server/red_parse_qxl.c b/server/red_parse_qxl.c index 256e8e9b..201e683e 100644 --- a/server/red_parse_qxl.c +++ b/server/red_parse_qxl.c @@ -1110,4 +1110,3 @@ void red_put_cursor_cmd(RedCursorCmd *red) break; } } - diff --git a/server/red_tunnel_worker.c b/server/red_tunnel_worker.c index 429f7372..c2019dd0 100644 --- a/server/red_tunnel_worker.c +++ b/server/red_tunnel_worker.c @@ -3505,4 +3505,3 @@ static void red_tunnel_channel_create(TunnelWorker *worker) red_channel_set_data(channel, worker); reds_register_channel(worker->channel); } - diff --git a/server/red_worker.h b/server/red_worker.h index 08c7b223..1f63d01f 100644 --- a/server/red_worker.h +++ b/server/red_worker.h @@ -165,4 +165,3 @@ static inline void read_message(int fd, RedWorkerMessage *message) } #endif - diff --git a/server/reds.h b/server/reds.h index 450825de..2a4e3513 100644 --- a/server/reds.h +++ b/server/reds.h @@ -149,4 +149,3 @@ void reds_on_main_receive_migrate_data(MainMigrateData *data, uint8_t *end); void reds_on_main_mouse_mode_request(void *message, size_t size); void reds_on_client_migrate_complete(RedClient *client); #endif - diff --git a/server/smartcard.h b/server/smartcard.h index e7fa4572..60cc2c6c 100644 --- a/server/smartcard.h +++ b/server/smartcard.h @@ -30,4 +30,3 @@ int smartcard_device_connect(SpiceCharDeviceInstance *char_device); void smartcard_device_disconnect(SpiceCharDeviceInstance *char_device); #endif // __SMART_CARD_H__ - diff --git a/server/snd_worker.c b/server/snd_worker.c index 5d580778..0527009e 100644 --- a/server/snd_worker.c +++ b/server/snd_worker.c @@ -1562,4 +1562,3 @@ int snd_get_playback_compression(void) { return (playback_compression == SPICE_AUDIO_DATA_MODE_RAW) ? FALSE : TRUE; } - diff --git a/server/snd_worker.h b/server/snd_worker.h index 7659cb23..1811a610 100644 --- a/server/snd_worker.h +++ b/server/snd_worker.h @@ -30,4 +30,3 @@ void snd_set_playback_compression(int on); int snd_get_playback_compression(void); #endif - diff --git a/server/spice-experimental.h b/server/spice-experimental.h index 6997aa03..f16d555f 100644 --- a/server/spice-experimental.h +++ b/server/spice-experimental.h @@ -38,4 +38,3 @@ enum { int spice_server_migrate_client_state(SpiceServer *s); #endif // __SPICE_EXPERIMENTAL_H__ - diff --git a/server/stat.h b/server/stat.h index bdafd917..d5c18781 100644 --- a/server/stat.h +++ b/server/stat.h @@ -45,4 +45,3 @@ void stat_remove_counter(uint64_t *counter); #endif #endif - diff --git a/server/tests/README b/server/tests/README index 477ca0ce..8818830f 100644 --- a/server/tests/README +++ b/server/tests/README @@ -21,4 +21,3 @@ test_fail_on_null_core_interface basic_event_loop.c used by test_just_sockets_no_ssl, can be used by other tests. very crude event loop. Should probably use libevent for better tests, but this is self contained. - diff --git a/server/tests/basic_event_loop.c b/server/tests/basic_event_loop.c index e0cc06e6..41795f10 100644 --- a/server/tests/basic_event_loop.c +++ b/server/tests/basic_event_loop.c @@ -281,4 +281,3 @@ SpiceCoreInterface *basic_event_loop_init(void) ignore_sigpipe(); return &core; } - diff --git a/server/tests/test_display_base.c b/server/tests/test_display_base.c index 579ef1e4..b31e6fba 100644 --- a/server/tests/test_display_base.c +++ b/server/tests/test_display_base.c @@ -574,4 +574,3 @@ SpiceServer* test_init(SpiceCoreInterface *core) wakeup_timer = core->timer_add(do_wakeup, NULL); return server; } - diff --git a/server/tests/test_display_no_ssl.c b/server/tests/test_display_no_ssl.c index 1eb83b37..3877c8d8 100644 --- a/server/tests/test_display_no_ssl.c +++ b/server/tests/test_display_no_ssl.c @@ -50,4 +50,3 @@ int main(void) return 0; } - diff --git a/server/tests/test_display_streaming.c b/server/tests/test_display_streaming.c index b4025254..e7d5156a 100644 --- a/server/tests/test_display_streaming.c +++ b/server/tests/test_display_streaming.c @@ -24,4 +24,3 @@ int main(void) basic_event_loop_mainloop(); return 0; } - diff --git a/server/tests/test_empty_success.c b/server/tests/test_empty_success.c index 3641eb76..a4f49c7a 100644 --- a/server/tests/test_empty_success.c +++ b/server/tests/test_empty_success.c @@ -57,4 +57,3 @@ int main(void) return 0; } - diff --git a/server/tests/test_fail_on_null_core_interface.c b/server/tests/test_fail_on_null_core_interface.c index 6490a6a7..105dd639 100644 --- a/server/tests/test_fail_on_null_core_interface.c +++ b/server/tests/test_fail_on_null_core_interface.c @@ -10,4 +10,3 @@ int main(void) return 0; } - diff --git a/server/tests/test_just_sockets_no_ssl.c b/server/tests/test_just_sockets_no_ssl.c index afa3558b..e105b1ce 100644 --- a/server/tests/test_just_sockets_no_ssl.c +++ b/server/tests/test_just_sockets_no_ssl.c @@ -16,4 +16,3 @@ int main(void) return 0; } - diff --git a/tools/bitmap_to_c.c b/tools/bitmap_to_c.c index cafcc59b..7e9b303f 100644 --- a/tools/bitmap_to_c.c +++ b/tools/bitmap_to_c.c @@ -392,4 +392,3 @@ int main(int argc, char **argv) } return pixmap_to_c_struct(pixmap, dest, struct_name, alpha_convertion); } - diff --git a/tools/icon_to_c.c b/tools/icon_to_c.c index 8a88fffb..0957c2b0 100644 --- a/tools/icon_to_c.c +++ b/tools/icon_to_c.c @@ -374,4 +374,3 @@ int main(int argc, char **argv) return icon_to_c_struct(icon, dest, struct_name); } - diff --git a/tools/reds_stat.c b/tools/reds_stat.c index 09b0d09f..3ff13c8f 100644 --- a/tools/reds_stat.c +++ b/tools/reds_stat.c @@ -129,4 +129,3 @@ error1: free(shm_name); return ret; } - From 2d530f929f9d0fc6a66eede9cea4eb629f9863c8 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 10 Jan 2012 15:03:51 +0000 Subject: [PATCH 42/47] Remove unused backup file The common/glc.c.save file appears to be a obsolete copy of glc.c --- common/glc.c.save | 1413 --------------------------------------------- 1 file changed, 1413 deletions(-) delete mode 100644 common/glc.c.save diff --git a/common/glc.c.save b/common/glc.c.save deleted file mode 100644 index 19581105..00000000 --- a/common/glc.c.save +++ /dev/null @@ -1,1413 +0,0 @@ -#include -#include -#include - -#include -#include - -#ifdef WIN32 -#include "glext.h" -#include "wglext.h" -#endif - -#include "glc.h" - -#define TRUE 1 -#define FALSE 0 - -#define ASSERT(x) if (!(x)) {printf("%s: assert failed %s\n", __FUNCTION__, #x); for (;;);} - -#define GLC_ERROR_TETS { \ - GLenum gl_err; glFlush(); \ - if ((gl_err = glGetError()) != GL_NO_ERROR) { \ - printf("%s[%d]: opengl error: %s\n", __FUNCTION__, __LINE__, gluErrorString(gl_err)); \ - for(;;); \ - } \ -} - -#define WARN_ONCE(x) { \ - static int warn = TRUE; \ - if (warn) { \ - printf x; \ - warn = FALSE; \ - } \ -} - -#define TESS_VERTEX_ALLOC_BUNCH 20 - -typedef struct InternaCtx InternaCtx; -typedef struct InternalPat { - InternaCtx *owner; - int refs; - GLuint texture; - int x_orign; - int y_orign; - int width; - int height; -} InternalPat; - -typedef struct Pathpath { - int start_point; - int num_segments; -} Path; - -enum { - GLC_PATH_SEG_LINES, - GLC_PATH_SEG_BEIZER, -}; - -//todo: flatten cache -typedef struct PathSegment { - int type; - int count; -} PathSegment; - -typedef struct PathPoint { - double x; - double y; - double z; -} PathPoint; - -typedef GLdouble Vertex[3]; - -typedef struct InternalPath { - InternaCtx *owner; - - Path *paths; - int paths_size; - int paths_pos; - - PathSegment *segments; - int segments_size; - int segments_pos; - - PathPoint *points; - int points_size; - int points_pos; - - Path *current_path; - PathSegment *current_segment; - -} InternalPath; - -typedef struct TassVertex TassVertex; -struct TassVertex { - PathPoint point; - TassVertex *list_link; - TassVertex *next; -}; - -typedef struct TassVertexBuf TassVertexBuf; -struct TassVertexBuf { - TassVertexBuf *next; - TassVertex vertexs[0]; -}; - -struct InternaCtx { - int draw_mode; - int stencil_refs; - int stencil_mask; - int width; - int height; - GLfloat line_width; - InternalPat *pat; - int max_texture_size; - GLUtesselator* tesselator; - TassVertex *free_tess_vertex; - TassVertex *used_tess_vertex; - TassVertexBuf *vertex_bufs; -#ifdef WIN32 - PFNGLBLENDEQUATIONPROC glBlendEquation; -#endif -}; - -#define Y(y) -(y) -#define VERTEX2(x, y) glVertex2d(x, Y(y)) - -static void fill_rect(InternaCtx *ctx, void *rect); -static void fill_path(InternaCtx *ctx, void *path); -static void fill_mask(InternaCtx *ctx, int x_dest, int y_dest, int width, int height, int stride, - const uint8_t *bitmap); -static void set_pat(InternaCtx *ctx, InternalPat *pat); - -static inline void *zmalloc(size_t size) -{ - return calloc(1, size); -} - -static inline void set_raster_pos(InternaCtx *ctx, int x, int y) -{ - if (x >= 0 && y >= 0 && x < ctx->width && y < ctx->height) { - glRasterPos2i(x, Y(y)); - return; - } - glRasterPos2i(0, 0); - glBitmap(0, 0, 0, 0, (GLfloat)x, (GLfloat)Y(y), NULL); -} - -static TassVertex *alloc_tess_vertex(InternaCtx *ctx) -{ - TassVertex *vertex; - - if (!ctx->free_tess_vertex) { - TassVertexBuf *buf; - int i; - - if (!(buf = (TassVertexBuf *)malloc(sizeof(TassVertexBuf) + - sizeof(TassVertex) * TESS_VERTEX_ALLOC_BUNCH))) { - //warn - return NULL; - } - buf->next = ctx->vertex_bufs; - ctx->vertex_bufs = buf; - for (i = 0; i < TESS_VERTEX_ALLOC_BUNCH; i++) { - buf->vertexs[i].point.z = 0; - buf->vertexs[i].next = ctx->free_tess_vertex; - ctx->free_tess_vertex = &buf->vertexs[i]; - } - } - - vertex = ctx->free_tess_vertex; - ctx->free_tess_vertex = vertex->next; - vertex->next = ctx->used_tess_vertex; - ctx->used_tess_vertex = vertex; - return vertex; -} - -static void reset_tass_vertex(InternaCtx *ctx) -{ - TassVertex *vertex; - while ((vertex = ctx->used_tess_vertex)) { - ctx->used_tess_vertex = vertex->next; - vertex->next = ctx->free_tess_vertex; - ctx->free_tess_vertex = vertex; - } -} - -static void free_tass_vertex_bufs(InternaCtx *ctx) -{ - TassVertexBuf *buf; - - ctx->used_tess_vertex = NULL; - ctx->free_tess_vertex = NULL; - while ((buf = ctx->vertex_bufs)) { - ctx->vertex_bufs = buf->next; - free(buf); - } -} - -//naiev bezier flattener -static TassVertex *bezier_flattener(InternaCtx *ctx, PathPoint *points) -{ - double ax, bx, cx; - double ay, by, cy; - const int num_points = 30; - double dt; - int i; - - TassVertex *vertex_list = NULL; - TassVertex *curr_vertex; - - for (i = 0; i < num_points - 2; i++) { - TassVertex *vertex; - - if (!(vertex = alloc_tess_vertex(ctx))) { - //warn - return NULL; - } - vertex->list_link = vertex_list; - vertex_list = vertex; - } - - curr_vertex = vertex_list; - - cx = 3.0 * (points[1].x - points[0].x); - bx = 3.0 * (points[2].x - points[1].x) - cx; - ax = points[3].x - points[0].x - cx - bx; - - cy = 3.0 * (points[1].y - points[0].y); - by = 3.0 * (points[2].y - points[1].y) - cy; - ay = points[3].y - points[0].y - cy - by; - - dt = 1.0 / ( num_points - 1 ); - - for( i = 1; i < num_points - 1; i++, curr_vertex = curr_vertex->list_link) { - double tSquared, tCubed; - double t; - t = i * dt; - - tSquared = t * t; - tCubed = tSquared * t; - - curr_vertex->point.x = (ax * tCubed) + (bx * tSquared) + (cx * t) + points[0].x; - curr_vertex->point.y = (ay * tCubed) + (by * tSquared) + (cy * t) + points[0].y; - } - - return vertex_list; -} - -#define MORE_X(path, Type, name) {\ - Type *name;\ - \ - if (!(name = (Type *)zmalloc(sizeof(*name) * path->name##_size * 2))) {\ - return FALSE;\ - }\ - memcpy(name, path->name, sizeof(*name) * path->name##_size);\ - free(path->name);\ - path->name = name;\ - path->name##_size *= 2;\ - return TRUE;\ -} - -static int more_points(InternalPath *path) -{ - MORE_X(path, PathPoint, points); -} - -static int more_segments(InternalPath *path) -{ - MORE_X(path, PathSegment, segments); -} - -static int more_paths(InternalPath *path) -{ - MORE_X(path, Path, paths); -} - -static inline void put_point(InternalPath *path, double x, double y) -{ - path->points[path->points_pos].x = x; - path->points[path->points_pos++].y = Y(y + 0.5); - path->points[path->points_pos].z = 0; -} - -void glc_path_move_to(GLCPath path, double x, double y) -{ - InternalPath *internal = (InternalPath *)path; - - ASSERT(internal); - - if (internal->current_segment) { - internal->current_segment = NULL; - internal->current_path = NULL; - if (internal->points_pos == internal->points_size && !more_points(internal)) { - //warn - return; - } - internal->points_pos++; - } - internal->points[internal->points_pos - 1].x = x; - internal->points[internal->points_pos - 1].y = Y(y + 0.5); - internal->points[internal->points_pos - 1].z = 0; -} - -static int add_segment_common(InternalPath *internal, int type, int num_points) -{ - if (internal->points_size - internal->points_pos < num_points && !more_points(internal)) { - //warn - return FALSE; - } - - if (internal->current_segment) { - if (internal->current_segment->type == type) { - internal->current_segment->count++; - return TRUE; - } - if (internal->segments_pos == internal->segments_size && !more_segments(internal)) { - //warn - return FALSE; - } - internal->current_segment = &internal->segments[internal->segments_pos++]; - internal->current_segment->type = type; - internal->current_segment->count = 1; - internal->current_path->num_segments++; - return TRUE; - } - - if (internal->paths_pos == internal->paths_size && !more_paths(internal)) { - //warn - return FALSE; - } - - if (internal->segments_pos == internal->segments_size && !more_segments(internal)) { - //warn - return FALSE; - } - - internal->current_path = &internal->paths[internal->paths_pos++]; - internal->current_path->start_point = internal->points_pos - 1; - internal->current_path->num_segments = 1; - internal->current_segment = &internal->segments[internal->segments_pos++]; - internal->current_segment->type = type; - internal->current_segment->count = 1; - return TRUE; -} - -void glc_path_line_to(GLCPath path, double x, double y) -{ - InternalPath *internal = (InternalPath *)path; - - ASSERT(internal); - - if (!add_segment_common(internal, GLC_PATH_SEG_LINES, 1)) { - return; - } - put_point(internal, x, y); -} - -void glc_path_curve_to(GLCPath path, double p1_x, double p1_y, double p2_x, double p2_y, - double p3_x, double p3_y) -{ - InternalPath *internal = (InternalPath *)path; - - ASSERT(internal); - - if (!add_segment_common(internal, GLC_PATH_SEG_BEIZER, 3)) { - return; - } - put_point(internal, p1_x, p1_y); - put_point(internal, p2_x, p2_y); - put_point(internal, p3_x, p3_y); -} - -void glc_path_close(GLCPath path) -{ - InternalPath *internal = (InternalPath *)path; - - ASSERT(internal); - if (!internal->current_path) { - return; - } - PathPoint *end_point = &internal->points[internal->current_path->start_point]; - glc_path_line_to(path, end_point->x, Y(end_point->y)); - glc_path_move_to(path, end_point->x, Y(end_point->y)); -} - -void glc_path_cleare(GLCPath path) -{ - InternalPath *internal = (InternalPath *)path; - - ASSERT(internal); - internal->paths_pos = internal->segments_pos = 0; - internal->current_segment = NULL; - internal->current_path = NULL; - - internal->points[0].x = 0; - internal->points[0].y = 0; - internal->points_pos = 1; -} - -GLCPath glc_path_create(GLCCtx glc) -{ - InternaCtx *ctx = (InternaCtx *)glc; - InternalPath *path; - - ASSERT(ctx); - if (!(path = (InternalPath *)zmalloc(sizeof(*path)))) { - return NULL; - } - - path->paths = (Path *)malloc(sizeof(*path->paths) * (path->paths_size = 2)); - if (!path->paths) { - goto error_1; - } - - path->segments = (PathSegment *)malloc(sizeof(*path->segments) * (path->segments_size = 4)); - if (!path->segments) { - goto error_2; - } - - path->points = (PathPoint *)malloc(sizeof(*path->points) * (path->points_size = 20)); - if (!path->points) { - goto error_3; - } - - path->owner = ctx; - path->points_pos = 1; - return path; - -error_3: - free(path->segments); - -error_2: - free(path->paths); - -error_1: - free(path); - - return NULL; -} - -void glc_path_destroy(GLCPath path) -{ - InternalPath *internal = (InternalPath *)path; - - if (!path) { - return; - } - - free(internal->points); - free(internal->segments); - free(internal->paths); - free(internal); -} - -static inline void unref_pat(InternalPat *pat) -{ - if (!pat) { - return; - } - ASSERT(pat->refs > 0); - if (--pat->refs == 0) { - glFinish(); - glDeleteTextures(1, &pat->texture); - free(pat); - } - GLC_ERROR_TETS; -} - -static inline InternalPat *ref_pat(InternalPat *pat) -{ - pat->refs++; - return pat; -} - -#ifdef WIN32 -static inline int find_msb(uint32_t val) -{ - uint32_t r; - __asm { - bsr eax, val - jnz found - mov eax, -1 - - found: - mov r, eax - } - return r + 1; -} -#else -static inline int find_msb(uint32_t val) -{ - int ret; - - asm("bsrl %1,%0\n\t" - "jnz 1f\n\t" - "movl $-1,%0\n" - "1:" - : "=r"(ret) : "r"(val)); - return ret + 1; -} -#endif - -static int to_pwoer_two(uint32_t val) -{ - if ((val & (val - 1)) == 0) { - return val; - } - return 1 << find_msb(val); -} - -static void scale(uint32_t *dest, uint32_t dest_width, uint32_t dest_height, - uint32_t *src, uint32_t src_width, uint32_t src_height, int src_stride) -{ - double x_scale = (double)src_width / dest_width; - double y_scale = (double)src_height / dest_height; - uint32_t i; - uint32_t j; - int prev_row = -1; - - for (i = 0; i < dest_height; i++) { - int row = (int)(y_scale * i); - if (row == prev_row) { - memcpy(dest, dest - dest_width, dest_width * sizeof(uint32_t)); - dest += dest_width; - continue; - } - for (j = 0; j < dest_width; j++) { - int col = (int)(x_scale * j); - *(dest++) = *(src + col); - } - prev_row = row; - src = (uint32_t *)((uint8_t *)src + src_stride); - } -} - -static inline void init_pattern(InternalPat *pat, int x_orign, int y_orign, const GLCImage *image) -{ - InternaCtx *ctx = pat->owner; - uint32_t *tmp_pixmap = NULL; - int width; - int height; - int width2; - int height2; - - const int pix_bytes = 4; - - ASSERT(image->format == GLC_IMAGE_RGB32); //for now - - width = image->width; - height = image->height; - width2 = to_pwoer_two(width); - height2 = to_pwoer_two(height); - - ASSERT(width > 0 && height > 0); - ASSERT(width > 0 && width <= pat->owner->max_texture_size); - ASSERT(height > 0 && height <= pat->owner->max_texture_size); - - if (width2 != width || height2 != height) { - if (!(tmp_pixmap = (uint32_t *)malloc(width2 * height2 * sizeof(uint32_t)))) { - //warn - return; - } - scale(tmp_pixmap, width2, height2, (uint32_t *)image->pixels, width, height, image->stride); - } - - glBindTexture(GL_TEXTURE_2D, pat->texture); - - //glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); - - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - - if (tmp_pixmap) { - glPixelStorei(GL_UNPACK_ROW_LENGTH, width2); - glTexImage2D(GL_TEXTURE_2D, 0, 4, width2, height2, 0, GL_BGRA, GL_UNSIGNED_BYTE, - tmp_pixmap); - free(tmp_pixmap); - } else { - ASSERT(image->stride % pix_bytes == 0); - glPixelStorei(GL_UNPACK_ROW_LENGTH, image->stride / pix_bytes); - glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, - image->pixels); - } - - GLC_ERROR_TETS; - pat->x_orign = x_orign % width; - pat->y_orign = y_orign % height; - pat->width = width; - pat->height = height; - - if (ctx->pat == pat) { - set_pat(pat->owner, pat); - } else if (ctx->pat) { - glBindTexture(GL_TEXTURE_2D, ctx->pat->texture); - } -} - -GLCPattern glc_pattern_create(GLCCtx glc, int x_orign, int y_orign, const GLCImage *image) -{ - InternaCtx *ctx = (InternaCtx *)glc; - InternalPat *pat; - - ASSERT(ctx && image); - - if (!(pat = (InternalPat *)zmalloc(sizeof(*pat)))) { - return NULL; - } - pat->refs = 1; - pat->owner = ctx; - glGenTextures(1, &pat->texture); - init_pattern(pat, x_orign, y_orign, image); - return pat; -} - -void glc_pattern_set(GLCPattern pattern, int x_orign, int y_orign, const GLCImage *image) -{ - InternalPat *pat = (InternalPat *)pattern; - ASSERT(pat && pat->owner); - - glFinish(); - init_pattern(pat, x_orign, y_orign, image); -} - -void glc_pattern_destroy(GLCPattern pat) -{ - unref_pat((InternalPat *)pat); - GLC_ERROR_TETS; -} - -static void set_pat(InternaCtx *ctx, InternalPat *pat) -{ - pat = ref_pat(pat); - unref_pat(ctx->pat); - ctx->pat = pat; - - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, pat->texture); - - GLfloat s_gen_params[] = { (GLfloat)1.0 / pat->width, 0, 0, 0 }; - GLfloat t_gen_params[] = { 0, (GLfloat)1.0 / (GLfloat)pat->height, 0, 0 }; - glTexGenfv(GL_S, GL_OBJECT_PLANE, s_gen_params); - glTexGenfv(GL_T, GL_OBJECT_PLANE, t_gen_params); - - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); - glTranslatef((float)pat->x_orign / pat->width, (float)Y(pat->y_orign) / pat->height, 0); - GLC_ERROR_TETS; -} - -void glc_set_pattern(GLCCtx glc, GLCPattern pattern) -{ - InternaCtx *ctx = (InternaCtx *)glc; - InternalPat *pat = (InternalPat *)pattern; - - ASSERT(ctx && pat && pat->owner == ctx); - set_pat(ctx, pat); -} - -void glc_set_rgb(GLCCtx glc, double red, double green, double blue) -{ - InternaCtx *ctx = (InternaCtx *)glc; - - ASSERT(ctx); - - glDisable(GL_TEXTURE_2D); - unref_pat(ctx->pat); - ctx->pat = NULL; - glColor4d(red, green, blue, 1); - GLC_ERROR_TETS; -} - -void glc_set_op(GLCCtx glc, GLCOp op) -{ - if (op == GL_COPY) { - glDisable(GL_COLOR_LOGIC_OP); - return; - } - glLogicOp(op); - glEnable(GL_COLOR_LOGIC_OP); -} - -void glc_set_line_width(GLCCtx glc, double width) -{ - InternaCtx *ctx = (InternaCtx *)glc; - - ASSERT(ctx); - ctx->line_width = (GLfloat)width; - if (ctx->line_width > 0) { - glLineWidth(ctx->line_width); - } else { - ctx->line_width = 0; - } - GLC_ERROR_TETS; -} - -void glc_set_fill_mode(GLCCtx glc, GLCFillMode fill_mode) -{ - InternaCtx *ctx = (InternaCtx *)glc; - - ASSERT(ctx); - int mode; - switch (fill_mode) { - case GLC_FILL_MODE_WINDING_ODD: - mode = GLU_TESS_WINDING_ODD; - break; - case GLC_FILL_MODE_WINDING_NONZERO: - mode = GLU_TESS_WINDING_NONZERO; - break; - default: - //warn - return; - } - gluTessProperty(ctx->tesselator, GLU_TESS_WINDING_RULE, mode); -} - -static inline void add_stencil_client(InternaCtx *ctx) -{ - if (!ctx->stencil_refs) { - glEnable(GL_STENCIL_TEST); - } - ctx->stencil_refs++; -} - -static inline void remove_stencil_client(InternaCtx *ctx) -{ - ctx->stencil_refs--; - if (!ctx->stencil_refs) { - glDisable(GL_STENCIL_TEST); - } -} - -void glc_set_mask(GLCCtx glc, int x_dest, int y_dest, int width, int height, - int stride, const uint8_t *bitmap, GLCMaskID id) -{ - InternaCtx *ctx = (InternaCtx *)glc; - uint32_t mask = (id == GLC_MASK_A) ? 0x04 : 0x08; - ASSERT(ctx && bitmap); - ASSERT(id == GLC_MASK_A || id == GLC_MASK_B); - - if (ctx->pat) { - glDisable(GL_TEXTURE_2D); - } - - glDisable(GL_BLEND); - - if (!(ctx->stencil_mask & mask)) { - add_stencil_client(ctx); - ctx->stencil_mask |= mask; - } - - glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); - ctx->draw_mode = FALSE; - glStencilMask(mask); - glClear(GL_STENCIL_BUFFER_BIT); - - glStencilFunc(GL_ALWAYS, mask, mask); - glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); - fill_mask(ctx, x_dest, y_dest, width, height, stride, bitmap); -} - - -void glc_mask_rects(GLCCtx glc, int num_rect, GLCRect *rects, GLCMaskID id) -{ - InternaCtx *ctx = (InternaCtx *)glc; - uint32_t mask = (id == GLC_MASK_A) ? 0x04 : 0x08; - GLCRect *end; - ASSERT(ctx && rects); - ASSERT(id == GLC_MASK_A || id == GLC_MASK_B); - - if (ctx->pat) { - glDisable(GL_TEXTURE_2D); - } - - glDisable(GL_BLEND); - - if (!(ctx->stencil_mask & mask)) { - add_stencil_client(ctx); - ctx->stencil_mask |= mask; - } - - glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); - ctx->draw_mode = FALSE; - glStencilMask(mask); - glClear(GL_STENCIL_BUFFER_BIT); - - glStencilFunc(GL_ALWAYS, mask, mask); - glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); - end = rects + num_rect; - for (; rects < end; rects++) { - fill_rect(ctx, rects); - } -} - -void glc_clear_mask(GLCCtx glc, GLCMaskID id) -{ - InternaCtx *ctx = (InternaCtx *)glc; - uint32_t mask = (id == GLC_MASK_A) ? 0x04 : 0x08; - ASSERT(ctx); - ASSERT(id == GLC_MASK_A || id == GLC_MASK_B); - - if ((ctx->stencil_mask & mask)) { - ctx->stencil_mask &= ~mask; - remove_stencil_client(ctx); - } -} - -void glc_clip_reset(GLCCtx glc) -{ - InternaCtx *ctx = (InternaCtx *)glc; - - if (!(ctx->stencil_mask & 0x03)) { - return; - } - remove_stencil_client(ctx); - ctx->stencil_mask &= ~0x03; - glStencilMask(0x03); - glClear(GL_STENCIL_BUFFER_BIT); - GLC_ERROR_TETS; -} - -static void clip_common(InternaCtx *ctx, GLCClipOp op, void (*fill_func)(InternaCtx *, void *), - void *data) -{ - int stencil_val; - - if (ctx->pat) { - glDisable(GL_TEXTURE_2D); - } - glDisable(GL_BLEND); - glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); - ctx->draw_mode = FALSE; - - if (op == GLC_CLIP_OP_SET) { - glc_clip_reset(ctx); - add_stencil_client(ctx); - ctx->stencil_mask |= 0x01; - } else if (!(ctx->stencil_mask & 0x03)) { - GLCRect area; - if (op == GLC_CLIP_OP_OR) { - return; - } - area.x = area.y = 0; - area.width= ctx->width; - area.height = ctx->height; - clip_common(ctx, GLC_CLIP_OP_SET, fill_rect, &area); - } - glStencilMask(0x03); - switch (op) { - case GLC_CLIP_OP_SET: - case GLC_CLIP_OP_OR: - stencil_val = ctx->stencil_mask & 0x03; - glStencilFunc(GL_ALWAYS, stencil_val, stencil_val); - glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); - fill_func(ctx, data); - break; - case GLC_CLIP_OP_AND: { - int clear_mask; - stencil_val = ctx->stencil_mask & 0x03; - glStencilFunc(GL_EQUAL, stencil_val, stencil_val); - if (stencil_val == 0x01) { - glStencilOp(GL_ZERO, GL_INCR, GL_INCR); - stencil_val = 0x02; - clear_mask = 0x01; - } else { - glStencilOp(GL_ZERO, GL_DECR, GL_DECR); - stencil_val = 0x01; - clear_mask = 0x02; - } - fill_func(ctx, data); - - glStencilMask(clear_mask); - glClear(GL_STENCIL_BUFFER_BIT); - ctx->stencil_mask = (ctx->stencil_mask & ~clear_mask) |stencil_val; - break; - } - case GLC_CLIP_OP_EXCLUDE: - stencil_val = ctx->stencil_mask & 0x03; - glStencilFunc(GL_EQUAL, stencil_val, stencil_val); - glStencilOp(GL_KEEP, GL_ZERO, GL_ZERO); - fill_func(ctx, data); - break; - } - GLC_ERROR_TETS; -} - -void glc_clip_rect(GLCCtx glc, const GLCRect *rect, GLCClipOp op) -{ - InternaCtx *ctx = (InternaCtx *)glc; - - ASSERT(ctx && rect); - clip_common(ctx, op, fill_rect, (void *)rect); -} - -void glc_clip_path(GLCCtx glc, GLCPath path, GLCClipOp op) -{ - InternaCtx *ctx = (InternaCtx *)glc; - - ASSERT(ctx && path); - clip_common(ctx, op, fill_path, path); -} - -typedef struct FillMaskInfo { - int x_dest; - int y_dest; - int width; - int height; - int stride; - const uint8_t *bitmap; -} FillMaskInfo; - -static void __fill_mask(InternaCtx *ctx, void *data) -{ - FillMaskInfo *info = (FillMaskInfo *)data; - fill_mask(ctx, info->x_dest, info->y_dest, info->width, info->height, info->stride, - info->bitmap); -} - -void glc_clip_mask(GLCCtx glc, int x_dest, int y_dest, int width, int height, - int stride, const uint8_t *bitmap, GLCClipOp op) -{ - InternaCtx *ctx = (InternaCtx *)glc; - FillMaskInfo mask_info; - - ASSERT(ctx && bitmap); - mask_info.x_dest = x_dest; - mask_info.y_dest = y_dest; - mask_info.width = width; - mask_info.height = height; - mask_info.stride = stride; - mask_info.bitmap = bitmap; - clip_common(ctx, op, __fill_mask, &mask_info); -} - -static inline void start_draw(InternaCtx *ctx) -{ - if (ctx->draw_mode) { - return; - } - ctx->draw_mode = TRUE; - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - glStencilFunc(GL_EQUAL, ctx->stencil_mask, ctx->stencil_mask); - glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); - if (ctx->pat) { - glEnable(GL_TEXTURE_2D); - } else { - glDisable(GL_TEXTURE_2D); - } - GLC_ERROR_TETS; -} - -static void fill_rect(InternaCtx *ctx, void *r) -{ - GLCRect *rect = (GLCRect *)r; - glRectd(rect->x, Y(rect->y), rect->x + rect->width, Y(rect->y + rect->height)); - /*glBegin(GL_POLYGON); - VERTEX2(rect->x, rect->y); - VERTEX2 (rect->x + rect->width, rect->y); - VERTEX2 (rect->x + rect->width, rect->y + rect->height); - VERTEX2 (rect->x , rect->y + rect->height); - glEnd();*/ - GLC_ERROR_TETS; -} - -void glc_fill_rect(GLCCtx glc, const GLCRect *rect) -{ - InternaCtx *ctx = (InternaCtx *)glc; - - ASSERT(ctx); - start_draw(ctx); - fill_rect(ctx, (void *)rect); - GLC_ERROR_TETS; -} - -static void fill_path(InternaCtx *ctx, void *p) -{ - InternalPath *path = (InternalPath *)p; - - PathPoint *current_point = path->points; - PathSegment *current_segment = path->segments; - Path *current_path = path->paths; - Path *end_path = current_path + path->paths_pos; - reset_tass_vertex(ctx); - gluTessBeginPolygon(ctx->tesselator, ctx); - for (; current_path < end_path; current_path++) { - gluTessBeginContour(ctx->tesselator); - PathSegment *end_segment = current_segment + current_path->num_segments; - gluTessVertex(ctx->tesselator, (GLdouble *)current_point, current_point); - current_point++; - for (; current_segment < end_segment; current_segment++) { - PathPoint *end_point; - if (current_segment->type == GLC_PATH_SEG_BEIZER) { - end_point = current_point + current_segment->count * 3; - for (; current_point < end_point; current_point += 3) { - TassVertex *vertex = bezier_flattener(ctx, current_point - 1); - while (vertex) { - gluTessVertex(ctx->tesselator, (GLdouble *)&vertex->point, - (GLdouble *)&vertex->point); - vertex = vertex->list_link; - } - gluTessVertex(ctx->tesselator, (GLdouble *)¤t_point[2], - (GLdouble *)¤t_point[2]); - } - } else { - ASSERT(current_segment->type == GLC_PATH_SEG_LINES); - end_point = current_point + current_segment->count; - for (; current_point < end_point; current_point++) { - gluTessVertex(ctx->tesselator, (GLdouble *)current_point , - (GLdouble *)current_point); - } - } - } - gluTessEndContour(ctx->tesselator); - } - gluTessEndPolygon(ctx->tesselator); -} - -void glc_fill_path(GLCCtx glc, GLCPath path_ref) -{ - InternaCtx *ctx = (InternaCtx *)glc; - - ASSERT(ctx && path_ref); - start_draw(ctx); - fill_path(ctx, path_ref); -} - -static void fill_mask(InternaCtx *ctx, int x_dest, int y_dest, int width, int height, - int stride, const uint8_t *bitmap) -{ - set_raster_pos(ctx, x_dest, y_dest + height); - glPixelStorei(GL_UNPACK_ROW_LENGTH, stride * 8); - glBitmap(width, height, 0, 0, 0, 0, bitmap); -} - -void _glc_fill_mask(GLCCtx glc, int x_dest, int y_dest, int width, int height, int stride, - const uint8_t *bitmap) -{ - InternaCtx *ctx = (InternaCtx *)glc; - - ASSERT(ctx && bitmap); - start_draw(ctx); - if (ctx->pat) { - WARN_ONCE(("%s: unimplemented fill mask with pattern\n", __FUNCTION__)); - } - fill_mask(ctx, x_dest, y_dest, width, height, stride, bitmap); -} - -void glc_fill_alpha(GLCCtx glc, int x_dest, int y_dest, int width, int height, int stride, - const uint8_t *alpha_mask) -{ - InternaCtx *ctx = (InternaCtx *)glc; - GLCRect r; - - ASSERT(ctx); - start_draw(ctx); - - glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); - set_raster_pos(ctx, x_dest, y_dest + height); - glPixelStorei(GL_UNPACK_ROW_LENGTH, stride); - glPixelZoom(1, 1); - glDrawPixels(width, height, GL_ALPHA, GL_UNSIGNED_BYTE, alpha_mask); - - r.x = x_dest; - r.y = y_dest; - r.width = width; - r.height = height; - - //todo: support color/texture alpah vals (GL_MODULATE) - glEnable(GL_BLEND); - glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA); - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - fill_rect(ctx, &r); - glDisable(GL_BLEND); -} - -void glc_stroke_rect(GLCCtx glc, const GLCRect *rect) -{ - InternaCtx *ctx = (InternaCtx *)glc; - - ASSERT(ctx); - if (ctx->line_width == 0) { - return; - } - - start_draw(ctx); - - glBegin(GL_LINES); - VERTEX2 (rect->x , rect->y + 0.5); - VERTEX2 (rect->x + rect->width, rect->y + 0.5); - glEnd(); - - glBegin(GL_LINES); - VERTEX2 (rect->x + rect->width - 0.5, rect->y); - VERTEX2 (rect->x + rect->width - 0.5, rect->y + rect->height); - glEnd(); - - glBegin(GL_LINES); - VERTEX2 (rect->x + rect->width, rect->y + rect->height - 0.5); - VERTEX2 (rect->x, rect->y + rect->height - 0.5); - glEnd(); - - glBegin(GL_LINES); - VERTEX2(rect->x + 0.5, rect->y + rect->height); - VERTEX2(rect->x + 0.5 , rect->y); - glEnd(); - GLC_ERROR_TETS; -} - -void glc_stroke_path(GLCCtx glc, GLCPath path_ref) -{ - InternaCtx *ctx = (InternaCtx *)glc; - InternalPath *path = (InternalPath *)path_ref; - - ASSERT(ctx && path); - if (ctx->line_width == 0) { - return; - } - start_draw(ctx); - - reset_tass_vertex(ctx); - PathPoint *current_point = path->points; - PathSegment *current_segment = path->segments; - Path *current_path = path->paths; - Path *end_path = current_path + path->paths_pos; - for (; current_path < end_path; current_path++) { - glBegin(GL_LINE_STRIP); - PathSegment *end_segment = current_segment + current_path->num_segments; - glVertex2d(current_point->x , current_point->y); - current_point++; - for (; current_segment < end_segment; current_segment++) { - PathPoint *end_point; - if (current_segment->type == GLC_PATH_SEG_BEIZER) { - end_point = current_point + current_segment->count * 3; - for (; current_point < end_point; current_point += 3) { - TassVertex *vertex = bezier_flattener(ctx, current_point - 1); - while (vertex) { - glVertex2d(vertex->point.x, vertex->point.y); - vertex = vertex->list_link; - } - glVertex2d(current_point[2].x , current_point[2].y); - } - } else { - ASSERT(current_segment->type == GLC_PATH_SEG_LINES); - end_point = current_point + current_segment->count; - for (; current_point < end_point; current_point++) { - glVertex2d(current_point->x , current_point->y); - } - } - } - glEnd(); - } -} - -void glc_draw_image(GLCCtx glc, const GLCRecti *dest, const GLCRecti *src, const GLCImage *image, - int scale_mode, double alpha) -{ - InternaCtx *ctx = (InternaCtx *)glc; - uint8_t *pixels; - const int pix_bytes = 4; - - ASSERT(ctx && image); - ASSERT(src->width > 0 && src->height > 0); - - ASSERT(image->format == GLC_IMAGE_RGB32 || image->format == GLC_IMAGE_ARGB32); //for now - start_draw(ctx); - if (ctx->pat) { - glDisable(GL_TEXTURE_2D); - } - set_raster_pos(ctx, dest->x, dest->y + dest->height); - - if (dest->width == src->width && src->height == dest->height) { - glPixelZoom(1, 1); - } else { - glPixelZoom((float)dest->width / src->width, (float)dest->height / src->height); - } - - pixels = image->pixels + src->x * 4 + (image->height - (src->y + src->height)) * image->stride; - if (image->format == GLC_IMAGE_ARGB32 || alpha != 1) { - glPixelTransferf(GL_ALPHA_SCALE, (GLfloat)alpha); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_BLEND); - } - ASSERT(image->stride % pix_bytes == 0); - glPixelStorei(GL_UNPACK_ROW_LENGTH, image->stride / pix_bytes); - glDrawPixels(src->width, src->height, GL_BGRA, GL_UNSIGNED_BYTE, pixels); - - if (image->format == GLC_IMAGE_ARGB32 || alpha != 1) { - glDisable(GL_BLEND); - } - - if (ctx->pat) { - glEnable(GL_TEXTURE_2D); - } - GLC_ERROR_TETS; -} - -void glc_copy_pixels(GLCCtx glc, int x_dest, int y_dest, int x_src, int y_src, int width, - int height) -{ - InternaCtx *ctx = (InternaCtx *)glc; - ASSERT(ctx); -#ifdef USE_COPY_PIXELS - start_draw(ctx); - if (ctx->pat) { - glDisable(GL_TEXTURE_2D); - } - set_raster_pos(ctx, x_dest, y_dest + height); - glPixelZoom(1, 1); - glCopyPixels(x_src, ctx->height - (y_src + height), width, height, GL_COLOR); - if (ctx->pat) { - glEnable(GL_TEXTURE_2D); - } -#else - GLuint texture; - int width2 = to_pwoer_two(width); - int height2 = to_pwoer_two(height); - - start_draw(ctx); - glEnable(GL_TEXTURE_2D); - glGenTextures(1, &texture); - glBindTexture(GL_TEXTURE_2D, texture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - - glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, x_src, ctx->height - (y_src + height), - width2, height2, 0); - - GLfloat s_gen_params[] = { (GLfloat)1.0 / width2, 0, 0, 0 }; - GLfloat t_gen_params[] = { 0, (GLfloat)1.0 / height2, 0, 0 }; - glTexGenfv(GL_S, GL_OBJECT_PLANE, s_gen_params); - glTexGenfv(GL_T, GL_OBJECT_PLANE, t_gen_params); - - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); - glTranslatef((float)-x_dest / width2, (float)-Y(y_dest + height) / height2, 0); - - glRecti(x_dest, Y(y_dest), x_dest + width, Y(y_dest + height)); - glFinish(); - glDeleteTextures(1, &texture); - if (!ctx->pat) { - glDisable(GL_TEXTURE_2D); - } else { - set_pat(ctx, ctx->pat); - } -#endif - GLC_ERROR_TETS; -} - -void glc_read_pixels(GLCCtx glc, int x, int y, GLCImage *image) -{ - InternaCtx *ctx = (InternaCtx *)glc; - - ASSERT(ctx && image); - ASSERT(image->format == GLC_IMAGE_RGB32); //for now - ASSERT((image->stride % 4) == 0); //for now - glPixelStorei(GL_PACK_ROW_LENGTH, image->stride / 4); - glReadPixels(x, ctx->height - (y + image->height), image->width, image->height, - GL_BGRA, GL_UNSIGNED_BYTE, image->pixels); -} - -void glc_clear(GLCCtx glc) -{ - InternaCtx *ctx = (InternaCtx *)glc; - - ASSERT(ctx); - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - glClear(GL_COLOR_BUFFER_BIT); -} - -void glc_flush(GLCCtx glc) -{ - glFlush(); - - GLC_ERROR_TETS; -} - -static void tessellation_combine(GLdouble coords[3], GLdouble *vertex_data[4], GLfloat weight[4], - GLdouble **data_out, void *usr_data) -{ - TassVertex *vertex; - - if (!(vertex = alloc_tess_vertex((InternaCtx *)usr_data))) { - *data_out = NULL; - return; - } - vertex->point.x = coords[0]; - vertex->point.y = coords[1]; - //vertex->point.z = coords[2]; - *data_out = (GLdouble *)&vertex->point; -} - -static void tessellation_error(GLenum errorCode) -{ - printf ("%s: %s\n", __FUNCTION__, gluErrorString(errorCode)); -} - -#ifdef WIN32 -#define TESS_CALL_BACK_TYPE void (CALLBACK *)() -#else -#define TESS_CALL_BACK_TYPE void (*)() -#endif - -static int init(InternaCtx *ctx, int width, int height) -{ -#ifdef WIN32 - if (!(ctx->glBlendEquation = (PFNGLBLENDEQUATIONPROC)wglGetProcAddress("glBlendEquation"))) { - return FALSE; - } -#endif - ctx->width = width; - ctx->height = height; - ctx->line_width = 1; - - glClearColor(0, 0, 0, 0); - glClearStencil(0); - - if (!(ctx->tesselator = gluNewTess())) { - return FALSE; - } - - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(0, width, 0, height, -1, 1); - - gluTessProperty(ctx->tesselator, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD); - gluTessCallback(ctx->tesselator, GLU_BEGIN, (TESS_CALL_BACK_TYPE)glBegin); - gluTessCallback(ctx->tesselator, GLU_VERTEX, (TESS_CALL_BACK_TYPE)glVertex3dv); - gluTessCallback(ctx->tesselator, GLU_END, (TESS_CALL_BACK_TYPE)glEnd); - gluTessCallback(ctx->tesselator, GLU_TESS_COMBINE_DATA, (TESS_CALL_BACK_TYPE)tessellation_combine); - gluTessCallback(ctx->tesselator, GLU_TESS_ERROR, (TESS_CALL_BACK_TYPE)tessellation_error); - - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - glEnable(GL_TEXTURE_GEN_S); - glEnable(GL_TEXTURE_GEN_T); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0, (GLfloat)height, 0); - - glGetIntegerv( GL_MAX_TEXTURE_SIZE, &ctx->max_texture_size); - - glPixelStorei(GL_PACK_ALIGNMENT, 1); - - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE); - glPixelTransferf(GL_ALPHA_BIAS, 0); -#ifdef WIN32 - ctx->glBlendEquation(GL_FUNC_ADD); -#else - glBlendEquation(GL_FUNC_ADD); -#endif - - glStencilMask(0xff); - glClear(GL_STENCIL_BUFFER_BIT); - - glClear(GL_COLOR_BUFFER_BIT); - - return TRUE; -} - -GLCCtx glc_create(int width, int height) -{ - InternaCtx *ctx; - - ASSERT(sizeof(PathPoint) == sizeof(Vertex)); - - if (!(ctx = (InternaCtx *)zmalloc(sizeof(*ctx)))) { - return NULL; - } - - if (!init(ctx, width, height)) { - free(ctx); - return NULL; - } - return ctx; -} - -void glc_destroy(GLCCtx glc) -{ - InternaCtx *ctx; - - if (!(ctx = (InternaCtx *)glc)) { - return; - } - - unref_pat(ctx->pat); - free_tass_vertex_bufs(ctx); - free(ctx); -} - -/* - todo: - 1. test double vs float in gl calls - 2. int vs flat raster position - 3. pixels stride vs bytes stride - 4. improve non power of two. - glGetString(GL_EXTENSIONS); - ARB_texture_non_power_of_two - ARB_texture_rectangle - GL_TEXTURE_RECTANGLE_ARB - 5. scale - 6. origin - 7. fonts - 8. support more image formats - 9. use GLCImage in mask ops? -*/ - From d46bc7727818aa08f3dcb207bfca96768e63e342 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 10 Jan 2012 15:07:37 +0000 Subject: [PATCH 43/47] Remove bogus include of strings.h The tests include strings.h but don't need any of its functions --- server/tests/basic_event_loop.c | 1 - server/tests/test_empty_success.c | 1 - server/tests/test_just_sockets_no_ssl.c | 1 - server/tests/test_playback.c | 1 - 4 files changed, 4 deletions(-) diff --git a/server/tests/basic_event_loop.c b/server/tests/basic_event_loop.c index 41795f10..7e575276 100644 --- a/server/tests/basic_event_loop.c +++ b/server/tests/basic_event_loop.c @@ -1,7 +1,6 @@ #include #include #include -#include #include #include diff --git a/server/tests/test_empty_success.c b/server/tests/test_empty_success.c index a4f49c7a..63cf2a27 100644 --- a/server/tests/test_empty_success.c +++ b/server/tests/test_empty_success.c @@ -1,5 +1,4 @@ #include -#include #include SpiceTimer* timer_add(SpiceTimerFunc func, void *opaque) diff --git a/server/tests/test_just_sockets_no_ssl.c b/server/tests/test_just_sockets_no_ssl.c index e105b1ce..f0218b8a 100644 --- a/server/tests/test_just_sockets_no_ssl.c +++ b/server/tests/test_just_sockets_no_ssl.c @@ -1,4 +1,3 @@ -#include #include #include #include "basic_event_loop.h" diff --git a/server/tests/test_playback.c b/server/tests/test_playback.c index 0b95bfdf..1de2d288 100644 --- a/server/tests/test_playback.c +++ b/server/tests/test_playback.c @@ -1,5 +1,4 @@ #include -#include #include #include #include From 7427b23d84007018bc6569d0dba7776d4d527381 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 10 Jan 2012 15:16:03 +0000 Subject: [PATCH 44/47] Add missing includes of config.h Not all files were including config.h --- common/backtrace.c | 2 +- server/dispatcher.c | 1 + server/main_dispatcher.c | 1 + server/tests/basic_event_loop.c | 1 + server/tests/test_display_base.c | 1 + server/tests/test_display_no_ssl.c | 1 + server/tests/test_display_streaming.c | 1 + server/tests/test_empty_success.c | 1 + server/tests/test_fail_on_null_core_interface.c | 1 + server/tests/test_just_sockets_no_ssl.c | 1 + server/tests/test_playback.c | 1 + tools/bitmap_to_c.c | 1 + tools/icon_to_c.c | 1 + tools/reds_stat.c | 1 + 14 files changed, 14 insertions(+), 1 deletion(-) diff --git a/common/backtrace.c b/common/backtrace.c index 4e2555ac..c8f46263 100644 --- a/common/backtrace.c +++ b/common/backtrace.c @@ -21,7 +21,7 @@ * Copyright (C) 2008 Red Hat, Inc. */ -#include "config.h" +#include #include #include #include diff --git a/server/dispatcher.c b/server/dispatcher.c index 90e46e36..b123fa82 100644 --- a/server/dispatcher.c +++ b/server/dispatcher.c @@ -1,3 +1,4 @@ +#include #include #include #include diff --git a/server/main_dispatcher.c b/server/main_dispatcher.c index 2ccf5346..cf44b408 100644 --- a/server/main_dispatcher.c +++ b/server/main_dispatcher.c @@ -1,3 +1,4 @@ +#include #include #include #include diff --git a/server/tests/basic_event_loop.c b/server/tests/basic_event_loop.c index 7e575276..c0ee705c 100644 --- a/server/tests/basic_event_loop.c +++ b/server/tests/basic_event_loop.c @@ -1,3 +1,4 @@ +#include #include #include #include diff --git a/server/tests/test_display_base.c b/server/tests/test_display_base.c index b31e6fba..ef5a543f 100644 --- a/server/tests/test_display_base.c +++ b/server/tests/test_display_base.c @@ -1,3 +1,4 @@ +#include #include #include #include diff --git a/server/tests/test_display_no_ssl.c b/server/tests/test_display_no_ssl.c index 3877c8d8..a27bb001 100644 --- a/server/tests/test_display_no_ssl.c +++ b/server/tests/test_display_no_ssl.c @@ -6,6 +6,7 @@ * existing ones in the test_display_base supplied queue. */ +#include #include #include "test_display_base.h" diff --git a/server/tests/test_display_streaming.c b/server/tests/test_display_streaming.c index e7d5156a..025541d6 100644 --- a/server/tests/test_display_streaming.c +++ b/server/tests/test_display_streaming.c @@ -4,6 +4,7 @@ * TODO: stop updating same rect, check (prog) that stream stops */ +#include #include "test_display_base.h" int simple_commands[] = { diff --git a/server/tests/test_empty_success.c b/server/tests/test_empty_success.c index 63cf2a27..fb46aa89 100644 --- a/server/tests/test_empty_success.c +++ b/server/tests/test_empty_success.c @@ -1,3 +1,4 @@ +#include #include #include diff --git a/server/tests/test_fail_on_null_core_interface.c b/server/tests/test_fail_on_null_core_interface.c index 105dd639..23261a26 100644 --- a/server/tests/test_fail_on_null_core_interface.c +++ b/server/tests/test_fail_on_null_core_interface.c @@ -1,3 +1,4 @@ +#include #include int main(void) diff --git a/server/tests/test_just_sockets_no_ssl.c b/server/tests/test_just_sockets_no_ssl.c index f0218b8a..ac5403b1 100644 --- a/server/tests/test_just_sockets_no_ssl.c +++ b/server/tests/test_just_sockets_no_ssl.c @@ -1,3 +1,4 @@ +#include #include #include #include "basic_event_loop.h" diff --git a/server/tests/test_playback.c b/server/tests/test_playback.c index 1de2d288..ed1b7667 100644 --- a/server/tests/test_playback.c +++ b/server/tests/test_playback.c @@ -1,3 +1,4 @@ +#include #include #include #include diff --git a/tools/bitmap_to_c.c b/tools/bitmap_to_c.c index 7e9b303f..01b925ea 100644 --- a/tools/bitmap_to_c.c +++ b/tools/bitmap_to_c.c @@ -15,6 +15,7 @@ License along with this library; if not, see . */ +#include #include #include #include diff --git a/tools/icon_to_c.c b/tools/icon_to_c.c index 0957c2b0..882330eb 100644 --- a/tools/icon_to_c.c +++ b/tools/icon_to_c.c @@ -15,6 +15,7 @@ License along with this library; if not, see . */ +#include #include #include #include diff --git a/tools/reds_stat.c b/tools/reds_stat.c index 3ff13c8f..39d17afe 100644 --- a/tools/reds_stat.c +++ b/tools/reds_stat.c @@ -16,6 +16,7 @@ */ #define _GNU_SOURCE +#include #include #include #include From 51f1ad54ad51cdf202566f26e7d29082a3c577ed Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 10 Jan 2012 15:37:47 +0000 Subject: [PATCH 45/47] Replace test XXX -a YYY with test XXX && test YYY The '-a' and '-o' operators to test are not portable. Always combine two invocations of 'test' using || or && instead. --- configure.ac | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index a8dbc730..da600177 100644 --- a/configure.ac +++ b/configure.ac @@ -332,7 +332,7 @@ SASL_CFLAGS= SASL_LIBS= enable_sasl=no if test "x$with_sasl" != "xno"; then - if test "x$with_sasl" != "xyes" -a "x$with_sasl" != "xcheck"; then + if test "x$with_sasl" != "xyes" && test "x$with_sasl" != "xcheck"; then SASL_CFLAGS="-I$with_sasl" SASL_LIBS="-L$with_sasl" fi @@ -350,7 +350,7 @@ if test "x$with_sasl" != "xno"; then if test "x$with_sasl" != "xno" ; then AC_CHECK_LIB([sasl2], [sasl_client_init],[with_sasl2=yes],[with_sasl2=no]) fi - if test "x$with_sasl2" = "xno" -a "x$with_sasl" != "xno" ; then + if test "x$with_sasl2" = "xno" && test "x$with_sasl" != "xno" ; then AC_CHECK_LIB([sasl], [sasl_client_init],[with_sasl=yes],[with_sasl=no]) fi if test "x$with_sasl2" = "xyes"; then @@ -362,13 +362,13 @@ if test "x$with_sasl" != "xno"; then fi CFLAGS="$old_cflags" LIBS="$old_libs" - if test "x$with_sasl2" = "xyes" -o "x$with_sasl" = "xyes" ; then + if test "x$with_sasl2" = "xyes" || test "x$with_sasl" = "xyes" ; then AC_DEFINE_UNQUOTED([HAVE_SASL], 1, [whether Cyrus SASL is available for authentication]) enable_sasl=yes fi fi -AM_CONDITIONAL([HAVE_SASL], [test "x$with_sasl2" = "xyes" -o "x$with_sasl" = "xyes"]) +AM_CONDITIONAL([HAVE_SASL], [test "x$with_sasl2" = "xyes" || test "x$with_sasl" = "xyes"]) AC_SUBST([SASL_CFLAGS]) AC_SUBST([SASL_LIBS]) @@ -496,7 +496,7 @@ error Need GCC 4.0 for visibility int main () { return 0; } ])], have_gcc4=yes) -if test "x$have_gcc4" = "xyes" -a ! "$os_win32" = "yes" ; then +if test "x$have_gcc4" = "xyes" && test ! "$os_win32" = "yes" ; then VISIBILITY_HIDDEN_CFLAGS="-fvisibility=hidden" fi AC_MSG_RESULT($have_gcc4) From 68c2897e5bc910151ab5f6c1c06299ae7e60c678 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 10 Jan 2012 15:26:55 +0000 Subject: [PATCH 46/47] Remove trailing whitespace from end of lines --- TODO.multiclient | 2 +- client/display_channel.cpp | 2 +- client/glz_decode_tmpl.c | 2 +- client/jpeg_decoder.cpp | 2 +- client/red_client.cpp | 2 +- .../tests/controller_test/controller_test.cpp | 4 +- client/windows/platform.cpp | 10 ++--- client/windows/stdint.h | 10 ++--- client/x11/platform.cpp | 4 +- client/zlib_decoder.cpp | 4 +- common/canvas_base.c | 2 +- common/gdi_canvas.c | 45 +++++++++---------- common/lz.c | 2 +- common/lz_compress_tmpl.c | 2 +- common/lz_decompress_tmpl.c | 2 +- common/quic.c | 2 +- common/win/my_getopt-1.5/getopt.h | 4 +- common/win/my_getopt-1.5/main.c | 6 +-- common/win/my_getopt-1.5/my_getopt.c | 6 +-- common/win/my_getopt-1.5/my_getopt.h | 4 +- server/glz_encode_tmpl.c | 10 ++--- server/jpeg_encoder.c | 30 ++++++------- server/jpeg_encoder.h | 2 +- server/red_client_shared_cache.h | 2 +- server/red_worker.c | 2 +- server/tests/README | 2 +- 26 files changed, 82 insertions(+), 83 deletions(-) diff --git a/TODO.multiclient b/TODO.multiclient index 5dcdb210..ab37160f 100644 --- a/TODO.multiclient +++ b/TODO.multiclient @@ -10,6 +10,6 @@ SPICE_MSG_MAIN_CHANNEL_NEW single user only, so only one of the clients can use it. Chardev channel: allow adding a chardev channel without any server changes: - qemu -spicevmc name=generic,channelname=bla,id=bla -mon chardev=bla + qemu -spicevmc name=generic,channelname=bla,id=bla -mon chardev=bla Note: client will still need to decide what to do with it of course. So the channelname will have to have a predefined meaning. diff --git a/client/display_channel.cpp b/client/display_channel.cpp index 22391220..173f012e 100644 --- a/client/display_channel.cpp +++ b/client/display_channel.cpp @@ -1306,7 +1306,7 @@ void DisplayChannel::reset_screen() AutoRef reset_timer(new ResetTimer(screen()->ref(), get_client())); detach_from_screen(get_client().get_application()); - + get_client().activate_interval_timer(*reset_timer, RESET_TIMEOUT); } diff --git a/client/glz_decode_tmpl.c b/client/glz_decode_tmpl.c index 6aaf63b3..ad78cd71 100644 --- a/client/glz_decode_tmpl.c +++ b/client/glz_decode_tmpl.c @@ -136,7 +136,7 @@ out->b = (out->b << 3) | ((out->b >> 2) & 0x07); \ out->pad = 0; \ out++; \ -} +} #endif #endif diff --git a/client/jpeg_decoder.cpp b/client/jpeg_decoder.cpp index 19d22e34..2b2d5e47 100644 --- a/client/jpeg_decoder.cpp +++ b/client/jpeg_decoder.cpp @@ -85,7 +85,7 @@ JpegDecoder::JpegDecoder() _cinfo.src->skip_input_data = jpeg_decoder_skip_input_data; _cinfo.src->resync_to_restart = jpeg_resync_to_restart; _cinfo.src->term_source = jpeg_decoder_term_source; - + static SpiceJpegDecoderOps decoder_ops = { op_begin_decode, op_decode, diff --git a/client/red_client.cpp b/client/red_client.cpp index 6b11e38a..04544083 100644 --- a/client/red_client.cpp +++ b/client/red_client.cpp @@ -1311,7 +1311,7 @@ void RedClient::dispatch_agent_message(VDAgentMessage* msg, void* data) default: DBG(0, "Unsupported message type %u size %u", msg->type, msg->size); } -} +} void RedClient::handle_agent_tokens(RedPeer::InMessage* message) { diff --git a/client/tests/controller_test/controller_test.cpp b/client/tests/controller_test/controller_test.cpp index 24db9f49..4994613c 100644 --- a/client/tests/controller_test/controller_test.cpp +++ b/client/tests/controller_test/controller_test.cpp @@ -166,7 +166,7 @@ int main(int argc, char *argv[]) //send_data(CONTROLLER_HOST_SUBJECT, (uint8_t*)HOST_SUBJECT, sizeof(HOST_SUBJECT)); send_data(CONTROLLER_SET_TITLE, (uint8_t*)TITLE, sizeof(TITLE)); send_data(CONTROLLER_HOTKEYS, (uint8_t*)HOTKEYS, sizeof(HOTKEYS)); - + send_data(CONTROLLER_CREATE_MENU, (uint8_t*)MENU, sizeof(MENU)); send_value(CONTROLLER_FULL_SCREEN, /*CONTROLLER_SET_FULL_SCREEN |*/ CONTROLLER_AUTO_DISPLAY_RES); @@ -194,7 +194,7 @@ int main(int argc, char *argv[]) printf("Press to close connection\n"); getchar(); #ifdef WIN32 - CloseHandle(pipe); + CloseHandle(pipe); #else close(sock); #endif diff --git a/client/windows/platform.cpp b/client/windows/platform.cpp index a99d438d..2b719f21 100644 --- a/client/windows/platform.cpp +++ b/client/windows/platform.cpp @@ -139,7 +139,7 @@ static uint32_t get_clipboard_format(uint32_t type) { for (size_t i = 0; i < clipboard_formats_count; i++) { for (uint32_t* ptype = clipboard_formats[i].types; *ptype; ptype++) { if (*ptype == type) { - return clipboard_formats[i].format; + return clipboard_formats[i].format; } } } @@ -228,7 +228,7 @@ static LRESULT CALLBACK PlatformWinProc(HWND hWnd, UINT message, WPARAM wParam, // handling WM_RENDERFORMAT. Therefore, we try our best by sending CLIPBOARD_REQUEST to the // agent, while waiting alertably for a while (hoping for good) for receiving CLIPBOARD data // or CLIPBOARD_RELEASE from the agent, which both will signal clipboard_event. - uint32_t type = get_clipboard_type(wParam); + uint32_t type = get_clipboard_type(wParam); if (!type) { LOG_INFO("Unsupported clipboard format %u", wParam); break; @@ -985,11 +985,11 @@ void Platform::set_clipboard_listener(ClipboardListener* listener) static HGLOBAL utf8_alloc(LPCSTR data, int size) { - HGLOBAL handle; + HGLOBAL handle; LPVOID buf; int len; - // Received utf8 string is not null-terminated + // Received utf8 string is not null-terminated if (!(len = MultiByteToWideChar(CP_UTF8, 0, data, size, NULL, 0))) { return NULL; } @@ -1001,7 +1001,7 @@ static HGLOBAL utf8_alloc(LPCSTR data, int size) if (!(buf = GlobalLock(handle))) { GlobalFree(handle); return NULL; - } + } // Translate data and set clipboard content if (!(MultiByteToWideChar(CP_UTF8, 0, data, size, (LPWSTR)buf, len))) { GlobalUnlock(handle); diff --git a/client/windows/stdint.h b/client/windows/stdint.h index 0e0ecd41..30131610 100644 --- a/client/windows/stdint.h +++ b/client/windows/stdint.h @@ -104,11 +104,11 @@ typedef unsigned long long uint_least64_t; -/* 7.18.1.3 Fastest minimum-width integer types +/* 7.18.1.3 Fastest minimum-width integer types * Not actually guaranteed to be fastest for all purposes - * Here we use the exact-width types for 8 and 16-bit ints. + * Here we use the exact-width types for 8 and 16-bit ints. */ @@ -164,7 +164,7 @@ typedef unsigned long long uintmax_t; /* 7.18.2.1 Limits of exact-width integer types */ -#define INT8_MIN (-128) +#define INT8_MIN (-128) #define INT16_MIN (-32768) @@ -260,7 +260,7 @@ typedef unsigned long long uintmax_t; /* 7.18.2.4 Limits of integer types capable of holding - object pointers */ + object pointers */ #define INTPTR_MIN INT32_MIN @@ -298,7 +298,7 @@ typedef unsigned long long uintmax_t; -#ifndef WCHAR_MIN /* also in wchar.h */ +#ifndef WCHAR_MIN /* also in wchar.h */ #define WCHAR_MIN 0 diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp index 9094a64a..df8fa768 100644 --- a/client/x11/platform.cpp +++ b/client/x11/platform.cpp @@ -534,7 +534,7 @@ XIC XPlatform::get_input_context() void XPlatform::set_win_proc(Window win, win_proc_t proc) { int res; - + XLockDisplay(x_display); res = XSaveContext(x_display, win, win_proc_context, (XPointer)proc); XUnlockDisplay(x_display); @@ -1046,7 +1046,7 @@ bool DynamicScreen::set_screen_size(int size_index) XLockDisplay(get_display()); config = XRRGetScreenInfo(get_display(), root_window); XUnlockDisplay(get_display()); - + if (!config) { LOG_WARN("get screen info failed"); return false; diff --git a/client/zlib_decoder.cpp b/client/zlib_decoder.cpp index 6c154fef..f5741d3e 100644 --- a/client/zlib_decoder.cpp +++ b/client/zlib_decoder.cpp @@ -36,7 +36,7 @@ static void op_decode(SpiceZlibDecoder *decoder, ZlibDecoder::ZlibDecoder() { int z_ret; - + _z_strm.zalloc = Z_NULL; _z_strm.zfree = Z_NULL; _z_strm.opaque = Z_NULL; @@ -71,7 +71,7 @@ void ZlibDecoder::decode(uint8_t *data, int data_size, uint8_t *dest, int dest_s _z_strm.avail_out = dest_size; z_ret = inflate(&_z_strm, Z_FINISH); - + if (z_ret != Z_STREAM_END) { THROW("zlib inflate failed, error %d", z_ret); } diff --git a/common/canvas_base.c b/common/canvas_base.c index 16688fb3..c4203dd7 100644 --- a/common/canvas_base.c +++ b/common/canvas_base.c @@ -619,7 +619,7 @@ static pixman_image_t *canvas_get_jpeg_alpha(CanvasBase *canvas, decomp_alpha_buf = dest; } lz_decode(lz_data->lz, LZ_IMAGE_TYPE_XXXA, decomp_alpha_buf); - + if (invers) { uint8_t *end = dest + height * stride; for (; dest != end; dest += stride) { diff --git a/common/gdi_canvas.c b/common/gdi_canvas.c index 2cb83d8c..d3e9c7ff 100644 --- a/common/gdi_canvas.c +++ b/common/gdi_canvas.c @@ -641,7 +641,7 @@ static HBRUSH get_brush(GdiCanvas *canvas, SpiceBrush *brush, RecurciveMutex **b CANVAS_ERROR("CreateSolidBrush failed"); } return hbrush; - case SPICE_BRUSH_TYPE_PATTERN: { + case SPICE_BRUSH_TYPE_PATTERN: { GdiCanvas *gdi_surface = NULL; HBRUSH hbrush; pixman_image_t *surface = NULL; @@ -810,11 +810,11 @@ static struct BitmapData get_mask_bitmap(struct GdiCanvas *canvas, struct SpiceQ bitmap.cache = 0; bitmap.from_surface = 1; } else { - + if (!(surface = canvas_get_mask(&canvas->base, mask, NULL))) { return bitmap; } - + pixman_data = (PixmanData *)pixman_image_get_destroy_data (surface); if (pixman_data && (WaitForSingleObject(pixman_data->mutex, INFINITE) != WAIT_FAILED)) { bitmap.dc = create_compatible_dc(); @@ -1060,16 +1060,16 @@ static void gdi_canvas_draw_copy(SpiceCanvas *spice_canvas, SpiceRect *bbox, Spi } else { surface = canvas_get_image(&canvas->base, copy->src_bitmap, FALSE); pixman_data = (PixmanData *)pixman_image_get_destroy_data(surface); - + RecurciveLock lock(*canvas->lock); bitmapmask = get_mask_bitmap(canvas, ©->mask); set_scale_mode(canvas, copy->scale_mode); set_clip(canvas, clip); - + if (pixman_data && (WaitForSingleObject(pixman_data->mutex, INFINITE) != WAIT_FAILED)) { HDC dc; HBITMAP prev_bitmap; - + dc = create_compatible_dc(); prev_bitmap = (HBITMAP)SelectObject(dc, pixman_data->bitmap); gdi_draw_bitmap_redrop(canvas->dc, ©->src_area, bbox, dc, @@ -1083,7 +1083,6 @@ static void gdi_canvas_draw_copy(SpiceCanvas *spice_canvas, SpiceRect *bbox, Spi } pixman_image_unref(surface); - } free_mask(&bitmapmask); } @@ -1149,7 +1148,7 @@ static void gdi_canvas_put_image(SpiceCanvas *spice_canvas, HDC dc, const SpiceR gdi_draw_bitmap_redrop(canvas->dc, &src, dest, dc, NULL, SPICE_ROPD_OP_PUT, 0); } else { - pixman_image_t *image = pixman_image_create_bits(PIXMAN_a8r8g8b8, src_width, src_height, + pixman_image_t *image = pixman_image_create_bits(PIXMAN_a8r8g8b8, src_width, src_height, (uint32_t *)src_data, src_stride); gdi_draw_image(canvas->dc, &src, dest, image, NULL, SPICE_ROPD_OP_PUT, 0); pixman_image_unref(image); @@ -1166,7 +1165,7 @@ static void gdi_draw_bitmap_transparent(GdiCanvas *canvas, HDC dest_dc, const Sp } static void gdi_draw_image_transparent(GdiCanvas *canvas, HDC dest_dc, const SpiceRect *src, - const SpiceRect *dest, pixman_image_t *image, + const SpiceRect *dest, pixman_image_t *image, uint32_t color, int rotate) { HDC dc; @@ -1203,12 +1202,12 @@ static void gdi_canvas_draw_transparent(SpiceCanvas *spice_canvas, SpiceRect *bb if (pixman_data && (WaitForSingleObject(pixman_data->mutex, INFINITE) != WAIT_FAILED)) { HDC dc; HBITMAP prev_bitmap; - + dc = create_compatible_dc(); prev_bitmap = (HBITMAP)SelectObject(dc, pixman_data->bitmap); gdi_draw_bitmap_transparent(canvas, canvas->dc, &transparent->src_area, bbox, dc, transparent->true_color); - + SelectObject(dc, prev_bitmap); DeleteObject(dc); ReleaseMutex(pixman_data->mutex); @@ -1216,7 +1215,7 @@ static void gdi_canvas_draw_transparent(SpiceCanvas *spice_canvas, SpiceRect *bb gdi_draw_image_transparent(canvas, canvas->dc, &transparent->src_area, bbox, surface, transparent->true_color, 0); } - + pixman_image_unref(surface); } } @@ -1278,13 +1277,13 @@ static void gdi_canvas_draw_alpha_blend(SpiceCanvas *spice_canvas, SpiceRect *bb surface = canvas_get_image(&canvas->base, alpha_blend->src_bitmap, TRUE); use_bitmap_alpha = pixman_image_get_depth(surface) == 32; pixman_data = (PixmanData *)pixman_image_get_destroy_data(surface); - + RecurciveLock lock(*canvas->lock); set_clip(canvas, clip); if (pixman_data && (WaitForSingleObject(pixman_data->mutex, INFINITE) != WAIT_FAILED)) { HDC dc; HBITMAP prev_bitmap; - + dc = create_compatible_dc(); prev_bitmap = (HBITMAP)SelectObject(dc, pixman_data->bitmap); gdi_draw_bitmap_alpha(canvas->dc, &alpha_blend->src_area, bbox, dc, alpha_blend->alpha, @@ -1296,7 +1295,7 @@ static void gdi_canvas_draw_alpha_blend(SpiceCanvas *spice_canvas, SpiceRect *bb gdi_draw_image_alpha(canvas->dc, &alpha_blend->src_area, bbox, surface, alpha_blend->alpha, 0, use_bitmap_alpha); } - + pixman_image_unref(surface); } } @@ -1334,18 +1333,18 @@ static void gdi_canvas_draw_opaque(SpiceCanvas *spice_canvas, SpiceRect *bbox, S } else { surface = canvas_get_image(&canvas->base, opaque->src_bitmap, FALSE); pixman_data = (PixmanData *)pixman_image_get_destroy_data(surface); - + RecurciveLock lock(*canvas->lock); bitmapmask = get_mask_bitmap(canvas, &opaque->mask); hbrush = get_brush(canvas, &opaque->brush, &brush_lock); set_scale_mode(canvas, opaque->scale_mode); set_clip(canvas, clip); prev_hbrush = set_brush(canvas->dc, hbrush, &opaque->brush); - + if (pixman_data && (WaitForSingleObject(pixman_data->mutex, INFINITE) != WAIT_FAILED)) { HDC dc; HBITMAP prev_bitmap; - + dc = create_compatible_dc(); prev_bitmap = (HBITMAP)SelectObject(dc, pixman_data->bitmap); if (brush_lock) { @@ -1392,16 +1391,16 @@ static void gdi_canvas_draw_blend(SpiceCanvas *spice_canvas, SpiceRect *bbox, Sp } else { surface = canvas_get_image(&canvas->base, blend->src_bitmap, FALSE); pixman_data = (PixmanData *)pixman_image_get_destroy_data(surface); - + RecurciveLock lock(*canvas->lock); bitmapmask = get_mask_bitmap(canvas, &blend->mask); set_scale_mode(canvas, blend->scale_mode); set_clip(canvas, clip); - + if (pixman_data && (WaitForSingleObject(pixman_data->mutex, INFINITE) != WAIT_FAILED)) { HDC dc; HBITMAP prev_bitmap; - + dc = create_compatible_dc(); prev_bitmap = (HBITMAP)SelectObject(dc, pixman_data->bitmap); gdi_draw_bitmap_redrop(canvas->dc, &blend->src_area, bbox, dc, @@ -1497,11 +1496,11 @@ static void gdi_canvas_draw_rop3(SpiceCanvas *spice_canvas, SpiceRect *bbox, Spi set_scale_mode(canvas, rop3->scale_mode); set_clip(canvas, clip); prev_hbrush = set_brush(canvas->dc, hbrush, &rop3->brush); - + if (pixman_data && (WaitForSingleObject(pixman_data->mutex, INFINITE) != WAIT_FAILED)) { HDC dc; HBITMAP prev_bitmap; - + dc = create_compatible_dc(); prev_bitmap = (HBITMAP)SelectObject(dc, pixman_data->bitmap); if (brush_lock) { diff --git a/common/lz.c b/common/lz.c index 1d695a07..5f517940 100644 --- a/common/lz.c +++ b/common/lz.c @@ -439,7 +439,7 @@ typedef uint16_t rgb16_pixel_t; #define COMP_LEVEL_SIZE_LIMIT 65536 // TODO: implemented lz2. should lz1 be an option (no RLE + distance limitation of MAX_DISTANCE) -// TODO: I think MAX_FARDISTANCE can be changed easily to 2^29 +// TODO: I think MAX_FARDISTANCE can be changed easily to 2^29 // (and maybe even more when pixel > byte). // i.e. we can support 512M Bytes/Pixels distance instead of only ~68K. #define MAX_DISTANCE 8191 // 2^13 diff --git a/common/lz_compress_tmpl.c b/common/lz_compress_tmpl.c index ea878ffd..6db53872 100644 --- a/common/lz_compress_tmpl.c +++ b/common/lz_compress_tmpl.c @@ -296,7 +296,7 @@ match: // RLE or dictionary (both are encoded by distance from ref (-1) a PIXEL x = *ref; while ((ip < ip_bound) && (ref < ref_limit)) { // TODO: maybe separate a run from // the same seg or from different - // ones in order to spare + // ones in order to spare // ref < ref_limit if (!SAME_PIXEL(*ref, x)) { ref++; diff --git a/common/lz_decompress_tmpl.c b/common/lz_decompress_tmpl.c index 46587eef..b0cbb2a9 100644 --- a/common/lz_decompress_tmpl.c +++ b/common/lz_decompress_tmpl.c @@ -170,7 +170,7 @@ out->b = (out->b << 3) | ((out->b >> 2) & 0x07); \ out->pad = 0; \ out++; \ -} +} #endif #endif diff --git a/common/quic.c b/common/quic.c index 46666383..707724a2 100644 --- a/common/quic.c +++ b/common/quic.c @@ -1515,7 +1515,7 @@ static void uncompress_gray(Encoder *encoder, uint8_t *buf, int stride) encoder->width); \ encoder->rows_completed++; \ } - + int quic_decode(QuicContext *quic, QuicImageType type, uint8_t *buf, int stride) { Encoder *encoder = (Encoder *)quic; diff --git a/common/win/my_getopt-1.5/getopt.h b/common/win/my_getopt-1.5/getopt.h index 5f08ccb4..df07082a 100644 --- a/common/win/my_getopt-1.5/getopt.h +++ b/common/win/my_getopt-1.5/getopt.h @@ -9,10 +9,10 @@ * modify, merge, publish, distribute, sublicense, and/or sell copies * of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND diff --git a/common/win/my_getopt-1.5/main.c b/common/win/my_getopt-1.5/main.c index 25674e1c..a9de2723 100644 --- a/common/win/my_getopt-1.5/main.c +++ b/common/win/my_getopt-1.5/main.c @@ -163,7 +163,7 @@ main(int argc, char * argv[]) /* long option list index */ int longind = 0; - /* + /* * print a warning when the POSIXLY_CORRECT environment variable will * interfere with argument placement */ @@ -326,12 +326,12 @@ main(int argc, char * argv[]) if (optind < argc) { int argindex; - + for (argindex = optind; argindex < argc; argindex ++) { char *infilename = argv[argindex]; FILE *infile; - + /* we allow "-" as a synonym for stdin here */ if (! strcmp(infilename, "-")) { diff --git a/common/win/my_getopt-1.5/my_getopt.c b/common/win/my_getopt-1.5/my_getopt.c index e3737df8..5237b8e8 100644 --- a/common/win/my_getopt-1.5/my_getopt.c +++ b/common/win/my_getopt-1.5/my_getopt.c @@ -9,10 +9,10 @@ * modify, merge, publish, distribute, sublicense, and/or sell copies * of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -198,7 +198,7 @@ int _my_getopt_internal(int argc, char * argv[], const char *shortopts, if(((my_optopt = argv[my_optind][1]) != '-') && ! argv[my_optind][2]) { int c; - + ind = shortoff; while((c = shortopts[ind++])) { if(((shortopts[ind] == ':') || diff --git a/common/win/my_getopt-1.5/my_getopt.h b/common/win/my_getopt-1.5/my_getopt.h index 2c1dd66f..c75101a1 100644 --- a/common/win/my_getopt-1.5/my_getopt.h +++ b/common/win/my_getopt-1.5/my_getopt.h @@ -9,10 +9,10 @@ * modify, merge, publish, distribute, sublicense, and/or sell copies * of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND diff --git a/server/glz_encode_tmpl.c b/server/glz_encode_tmpl.c index 41edb1b7..1402f953 100644 --- a/server/glz_encode_tmpl.c +++ b/server/glz_encode_tmpl.c @@ -144,10 +144,10 @@ /* returns the length of the match. 0 if no match. if image_distance = 0, pixel_distance is the distance between the matching pixels. Otherwise, it is the offset from the beginning of the referred image */ -static INLINE size_t FNAME(do_match)(SharedDictionary *dict, - WindowImageSegment *ref_seg, const PIXEL *ref, +static INLINE size_t FNAME(do_match)(SharedDictionary *dict, + WindowImageSegment *ref_seg, const PIXEL *ref, const PIXEL *ref_limit, - WindowImageSegment *ip_seg, const PIXEL *ip, + WindowImageSegment *ip_seg, const PIXEL *ip, const PIXEL *ip_limit, #ifdef LZ_PLT int pix_per_byte, @@ -546,9 +546,9 @@ static void FNAME(compress)(Encoder *encoder) FNAME(compress_seg)(encoder, seg_id, ip, 2); // compressing the next segments - for (seg_id = dict->window.segs[seg_id].next; + for (seg_id = dict->window.segs[seg_id].next; seg_id != NULL_IMAGE_SEG_ID && ( - dict->window.segs[seg_id].image->id == encoder->cur_image.id); + dict->window.segs[seg_id].image->id == encoder->cur_image.id); seg_id = dict->window.segs[seg_id].next) { FNAME(compress_seg)(encoder, seg_id, (PIXEL *)dict->window.segs[seg_id].lines, 0); } diff --git a/server/jpeg_encoder.c b/server/jpeg_encoder.c index 1c961774..d0e2fc17 100644 --- a/server/jpeg_encoder.c +++ b/server/jpeg_encoder.c @@ -41,13 +41,13 @@ typedef struct JpegEncoder { /* jpeg destination manager callbacks */ -static void dest_mgr_init_destination(j_compress_ptr cinfo) +static void dest_mgr_init_destination(j_compress_ptr cinfo) { JpegEncoder *enc = (JpegEncoder *)cinfo->client_data; if (enc->dest_mgr.free_in_buffer == 0) { - enc->dest_mgr.free_in_buffer = enc->usr->more_space(enc->usr, + enc->dest_mgr.free_in_buffer = enc->usr->more_space(enc->usr, &enc->dest_mgr.next_output_byte); - + if (enc->dest_mgr.free_in_buffer == 0) { red_error("not enough space"); } @@ -59,12 +59,12 @@ static void dest_mgr_init_destination(j_compress_ptr cinfo) static boolean dest_mgr_empty_output_buffer(j_compress_ptr cinfo) { JpegEncoder *enc = (JpegEncoder *)cinfo->client_data; - enc->dest_mgr.free_in_buffer = enc->usr->more_space(enc->usr, + enc->dest_mgr.free_in_buffer = enc->usr->more_space(enc->usr, &enc->dest_mgr.next_output_byte); - + if (enc->dest_mgr.free_in_buffer == 0) { red_error("not enough space"); - } + } enc->cur_image.out_size += enc->dest_mgr.free_in_buffer; return TRUE; } @@ -85,13 +85,13 @@ JpegEncoderContext* jpeg_encoder_create(JpegEncoderUsrContext *usr) enc = spice_new0(JpegEncoder, 1); enc->usr = usr; - + enc->dest_mgr.init_destination = dest_mgr_init_destination; enc->dest_mgr.empty_output_buffer = dest_mgr_empty_output_buffer; enc->dest_mgr.term_destination = dest_mgr_term_destination; enc->cinfo.err = jpeg_std_error(&enc->jerr); - + jpeg_create_compress(&enc->cinfo); enc->cinfo.client_data = enc; enc->cinfo.dest = &enc->dest_mgr; @@ -99,7 +99,7 @@ JpegEncoderContext* jpeg_encoder_create(JpegEncoderUsrContext *usr) } void jpeg_encoder_destroy(JpegEncoderContext* encoder) -{ +{ jpeg_destroy_compress(&((JpegEncoder*)encoder)->cinfo); free(encoder); } @@ -144,8 +144,8 @@ static void convert_BGRX32_to_RGB24(uint8_t *line, int width, uint8_t **out_line uint32_t *src_line = (uint32_t *)line; uint8_t *out_pix; int x; - - ASSERT(out_line && *out_line); + + ASSERT(out_line && *out_line); out_pix = *out_line; @@ -174,7 +174,7 @@ static void convert_RGB24_to_RGB24(uint8_t *line, int width, uint8_t **out_line) } static void do_jpeg_encode(JpegEncoder *jpeg, uint8_t *lines, unsigned int num_lines) -{ +{ uint8_t *lines_end; uint8_t *RGB24_line; int stride, width; @@ -204,7 +204,7 @@ int jpeg_encode(JpegEncoderContext *jpeg, int quality, JpegEncoderImageType type int width, int height, uint8_t *lines, unsigned int num_lines, int stride, uint8_t *io_ptr, unsigned int num_io_bytes) { - JpegEncoder *enc = (JpegEncoder *)jpeg; + JpegEncoder *enc = (JpegEncoder *)jpeg; enc->cur_image.type = type; enc->cur_image.width = width; @@ -243,6 +243,6 @@ int jpeg_encode(JpegEncoderContext *jpeg, int quality, JpegEncoderImageType type do_jpeg_encode(enc, lines, num_lines); - jpeg_finish_compress(&enc->cinfo); - return enc->cur_image.out_size; + jpeg_finish_compress(&enc->cinfo); + return enc->cur_image.out_size; } diff --git a/server/jpeg_encoder.h b/server/jpeg_encoder.h index 74c73243..690a0296 100644 --- a/server/jpeg_encoder.h +++ b/server/jpeg_encoder.h @@ -35,7 +35,7 @@ typedef enum { JPEG_IMAGE_TYPE_INVALID, JPEG_IMAGE_TYPE_RGB16, - /* in byte per color types, the notation is according to the order of the + /* in byte per color types, the notation is according to the order of the colors in the memory */ JPEG_IMAGE_TYPE_RGB24, JPEG_IMAGE_TYPE_BGR24, diff --git a/server/red_client_shared_cache.h b/server/red_client_shared_cache.h index ed3f1dab..fb405c36 100644 --- a/server/red_client_shared_cache.h +++ b/server/red_client_shared_cache.h @@ -75,7 +75,7 @@ static int FUNC_NAME(set_lossy)(CACHE *cache, uint64_t id, int lossy) break; } item = item->next; - } + } pthread_mutex_unlock(&cache->lock); return !!item; } diff --git a/server/red_worker.c b/server/red_worker.c index c8ac8161..983d7676 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -3098,7 +3098,7 @@ static inline int red_current_add_equal(RedWorker *worker, DrawItem *item, TreeI other_drawable->refs++; current_remove_drawable(worker, other_drawable); - /* sending the drawable to clients that already received + /* sending the drawable to clients that already received * (or will receive) other_drawable */ worker_ring_item = ring_get_head(&worker->display_channel->common.base.clients); dpi_ring_item = ring_get_head(&other_drawable->pipes); diff --git a/server/tests/README b/server/tests/README index 8818830f..e44251de 100644 --- a/server/tests/README +++ b/server/tests/README @@ -14,7 +14,7 @@ test_just_sockets_no_ssl A complete server, only provides the main and inputs channels. Doesn't actually produce anything on the channels. Essentially a test of the regular link code (reds.c), good for multiple connect/disconnect tests. test_empty_success - tests calling + tests calling test_fail_on_null_core_interface should abort when run (when spice tries to watch_add) From b5060ff81392ffdbbb6b516dc294f2bea75b4246 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 10 Jan 2012 15:28:22 +0000 Subject: [PATCH 47/47] Add a 'syntax-check' make target The 'make syntax-check' target is used to perform various code style sanity checks, as well as to detect certain trivial error patterns. The target is placed in GNUmakefile, instead of Makefile.am since it relies on GNU specific make extensions. The actual GNUmakefile and maint.mk files are taken from the GNULIB project, unchanged The cfg.mk file is used to configure which of the syntax checks are activated, to allow addition of new project specific syntax checks, and to blacklist certain files which should not be checked * .mailmap: Add mapping for various broken email addrs in commit log, to stop complaints about AUTHORS file missing entries * GNUmakefile: define the 'syntax-check' rule * maint.mk: definition of standard syntax checks * cfg.mk: configuration for checks --- .mailmap | 4 + GNUmakefile | 132 +++ build-aux/useless-if-before-free | 207 ++++ build-aux/vc-list-files | 113 +++ cfg.mk | 150 +++ maint.mk | 1511 ++++++++++++++++++++++++++++++ 6 files changed, 2117 insertions(+) create mode 100644 .mailmap create mode 100644 GNUmakefile create mode 100755 build-aux/useless-if-before-free create mode 100755 build-aux/vc-list-files create mode 100644 cfg.mk create mode 100644 maint.mk diff --git a/.mailmap b/.mailmap new file mode 100644 index 00000000..ef992110 --- /dev/null +++ b/.mailmap @@ -0,0 +1,4 @@ + + + + diff --git a/GNUmakefile b/GNUmakefile new file mode 100644 index 00000000..ca88b6b0 --- /dev/null +++ b/GNUmakefile @@ -0,0 +1,132 @@ +# Having a separate GNUmakefile lets me `include' the dynamically +# generated rules created via cfg.mk (package-local configuration) +# as well as maint.mk (generic maintainer rules). +# This makefile is used only if you run GNU Make. +# It is necessary if you want to build targets usually of interest +# only to the maintainer. + +# Copyright (C) 2001, 2003, 2006-2011 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Systems where /bin/sh is not the default shell need this. The $(shell) +# command below won't work with e.g. stock DOS/Windows shells. +ifeq ($(wildcard /bin/s[h]),/bin/sh) +SHELL = /bin/sh +else +# will be used only with the next shell-test line, then overwritten +# by a configured-in value +SHELL = sh +endif + +# If the user runs GNU make but has not yet run ./configure, +# give them a diagnostic. +_have-Makefile := $(shell test -f Makefile && echo yes) +ifeq ($(_have-Makefile),yes) + +# Make tar archive easier to reproduce. +export TAR_OPTIONS = --owner=0 --group=0 --numeric-owner + +# Allow the user to add to this in the Makefile. +ALL_RECURSIVE_TARGETS = + +include Makefile + +# Some projects override e.g., _autoreconf here. +-include $(srcdir)/cfg.mk + +# Allow cfg.mk to override these. +_build-aux ?= build-aux +_autoreconf ?= autoreconf -v + +include $(srcdir)/maint.mk + +# Ensure that $(VERSION) is up to date for dist-related targets, but not +# for others: rerunning autoreconf and recompiling everything isn't cheap. +_have-git-version-gen := \ + $(shell test -f $(srcdir)/$(_build-aux)/git-version-gen && echo yes) +ifeq ($(_have-git-version-gen)0,yes$(MAKELEVEL)) + _is-dist-target ?= $(filter-out %clean, \ + $(filter maintainer-% dist% alpha beta stable,$(MAKECMDGOALS))) + _is-install-target ?= $(filter-out %check, $(filter install%,$(MAKECMDGOALS))) + ifneq (,$(_is-dist-target)$(_is-install-target)) + _curr-ver := $(shell cd $(srcdir) \ + && $(_build-aux)/git-version-gen \ + .tarball-version \ + $(git-version-gen-tag-sed-script)) + ifneq ($(_curr-ver),$(VERSION)) + ifeq ($(_curr-ver),UNKNOWN) + $(info WARNING: unable to verify if $(VERSION) is the correct version) + else + ifneq (,$(_is-install-target)) + # GNU Coding Standards state that 'make install' should not cause + # recompilation after 'make all'. But as long as changing the version + # string alters config.h, the cost of having 'make all' always have an + # up-to-date version is prohibitive. So, as a compromise, we merely + # warn when installing a version string that is out of date; the user + # should run 'autoreconf' (or something like 'make distcheck') to + # fix the version, 'make all' to propagate it, then 'make install'. + $(info WARNING: version string $(VERSION) is out of date;) + $(info run '$(MAKE) _version' to fix it) + else + $(info INFO: running autoreconf for new version string: $(_curr-ver)) +GNUmakefile: _version + touch GNUmakefile + endif + endif + endif + endif +endif + +.PHONY: _version +_version: + cd $(srcdir) && rm -rf autom4te.cache .version && $(_autoreconf) + $(MAKE) $(AM_MAKEFLAGS) Makefile + +else + +.DEFAULT_GOAL := abort-due-to-no-makefile +srcdir = . + +# The package can override .DEFAULT_GOAL to run actions like autoreconf. +-include ./cfg.mk +include ./maint.mk + +ifeq ($(.DEFAULT_GOAL),abort-due-to-no-makefile) +$(MAKECMDGOALS): abort-due-to-no-makefile +endif + +abort-due-to-no-makefile: + @echo There seems to be no Makefile in this directory. 1>&2 + @echo "You must run ./configure before running \`make'." 1>&2 + @exit 1 + +endif + +# Tell version 3.79 and up of GNU make to not build goals in this +# directory in parallel, in case someone tries to build multiple +# targets, and one of them can cause a recursive target to be invoked. + +# Only set this if Automake doesn't provide it. +AM_RECURSIVE_TARGETS ?= $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) \ + dist distcheck tags ctags + +ALL_RECURSIVE_TARGETS += $(AM_RECURSIVE_TARGETS) + +ifneq ($(word 2, $(MAKECMDGOALS)), ) +ifneq ($(filter $(ALL_RECURSIVE_TARGETS), $(MAKECMDGOALS)), ) +.NOTPARALLEL: +endif +endif diff --git a/build-aux/useless-if-before-free b/build-aux/useless-if-before-free new file mode 100755 index 00000000..b8f5a263 --- /dev/null +++ b/build-aux/useless-if-before-free @@ -0,0 +1,207 @@ +eval '(exit $?0)' && eval 'exec perl -wST "$0" ${1+"$@"}' + & eval 'exec perl -wST "$0" $argv:q' + if 0; +# Detect instances of "if (p) free (p);". +# Likewise "if (p != 0)", "if (0 != p)", or with NULL; and with braces. + +my $VERSION = '2011-04-20 13:43'; # UTC +# The definition above must lie within the first 8 lines in order +# for the Emacs time-stamp write hook (at end) to update it. +# If you change this file with Emacs, please let the write hook +# do its job. Otherwise, update this string manually. + +# Copyright (C) 2008-2011 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Written by Jim Meyering + +use strict; +use warnings; +use Getopt::Long; + +(my $ME = $0) =~ s|.*/||; + +# use File::Coda; # http://meyering.net/code/Coda/ +END { + defined fileno STDOUT or return; + close STDOUT and return; + warn "$ME: failed to close standard output: $!\n"; + $? ||= 1; +} + +sub usage ($) +{ + my ($exit_code) = @_; + my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR); + if ($exit_code != 0) + { + print $STREAM "Try `$ME --help' for more information.\n"; + } + else + { + print $STREAM < sub { usage 0 }, + version => sub { print "$ME version $VERSION\n"; exit }, + list => \$list, + 'name=s@' => \@name, + ) or usage 1; + + # Make sure we have the right number of non-option arguments. + # Always tell the user why we fail. + @ARGV < 1 + and (warn "$ME: missing FILE argument\n"), usage EXIT_ERROR; + + my $or = join '|', @name; + my $regexp = qr/(?:$or)/; + + # Set the input record separator. + # Note: this makes it impractical to print line numbers. + $/ = '"'; + + my $found_match = 0; + FILE: + foreach my $file (@ARGV) + { + open FH, '<', $file + or (warn "$ME: can't open `$file' for reading: $!\n"), + $err = EXIT_ERROR, next; + while (defined (my $line = )) + { + while ($line =~ + /\b(if\s*\(\s*([^)]+?)(?:\s*!=\s*([^)]+?))?\s*\) + # 1 2 3 + (?: \s*$regexp\s*\((?:\s*\([^)]+\))?\s*([^)]+)\)\s*;| + \s*\{\s*$regexp\s*\((?:\s*\([^)]+\))?\s*([^)]+)\)\s*;\s*\}))/sxg) + { + my $all = $1; + my ($lhs, $rhs) = ($2, $3); + my ($free_opnd, $braced_free_opnd) = ($4, $5); + my $non_NULL; + if (!defined $rhs) { $non_NULL = $lhs } + elsif (is_NULL $rhs) { $non_NULL = $lhs } + elsif (is_NULL $lhs) { $non_NULL = $rhs } + else { next } + + # Compare the non-NULL part of the "if" expression and the + # free'd expression, without regard to white space. + $non_NULL =~ tr/ \t//d; + my $e2 = defined $free_opnd ? $free_opnd : $braced_free_opnd; + $e2 =~ tr/ \t//d; + if ($non_NULL eq $e2) + { + $found_match = 1; + $list + and (print "$file\0"), next FILE; + print "$file: $all\n"; + } + } + } + } + continue + { + close FH; + } + + $found_match && $err == EXIT_NO_MATCH + and $err = EXIT_MATCH; + + exit $err; +} + +my $foo = <<'EOF'; +# The above is to *find* them. +# This adjusts them, removing the unnecessary "if (p)" part. + +# FIXME: do something like this as an option (doesn't do braces): +free=xfree +git grep -l -z "$free *(" \ + | xargs -0 useless-if-before-free -l --name="$free" \ + | xargs -0 perl -0x3b -pi -e \ + 's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*(?:0|NULL))?\s*\)\s+('"$free"'\s*\((?:\s*\([^)]+\))?\s*\1\s*\)\s*;)/$2/s' + +# Use the following to remove redundant uses of kfree inside braces. +# Note that -0777 puts perl in slurp-whole-file mode; +# but we have plenty of memory, these days... +free=kfree +git grep -l -z "$free *(" \ + | xargs -0 useless-if-before-free -l --name="$free" \ + | xargs -0 perl -0777 -pi -e \ + 's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*(?:0|NULL))?\s*\)\s*\{\s*('"$free"'\s*\((?:\s*\([^)]+\))?\s*\1\s*\);)\s*\}[^\n]*$/$2/gms' + +Be careful that the result of the above transformation is valid. +If the matched string is followed by "else", then obviously, it won't be. + +When modifying files, refuse to process anything other than a regular file. +EOF + +## Local Variables: +## mode: perl +## indent-tabs-mode: nil +## eval: (add-hook 'write-file-hooks 'time-stamp) +## time-stamp-start: "my $VERSION = '" +## time-stamp-format: "%:y-%02m-%02d %02H:%02M" +## time-stamp-time-zone: "UTC" +## time-stamp-end: "'; # UTC" +## End: diff --git a/build-aux/vc-list-files b/build-aux/vc-list-files new file mode 100755 index 00000000..405e458f --- /dev/null +++ b/build-aux/vc-list-files @@ -0,0 +1,113 @@ +#!/bin/sh +# List version-controlled file names. + +# Print a version string. +scriptversion=2011-05-16.22; # UTC + +# Copyright (C) 2006-2011 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +# List the specified version-controlled files. +# With no argument, list them all. With a single DIRECTORY argument, +# list the version-controlled files in that directory. + +# If there's an argument, it must be a single, "."-relative directory name. +# cvsu is part of the cvsutils package: http://www.red-bean.com/cvsutils/ + +postprocess= +case $1 in + --help) cat <. +EOF + exit ;; + + --version) + year=`echo "$scriptversion" | sed 's/[^0-9].*//'` + cat < +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. +EOF + exit ;; + + -C) + test "$2" = . || postprocess="| sed 's|^|$2/|'" + cd "$2" || exit 1 + shift; shift ;; +esac + +test $# = 0 && set . + +for dir +do + if test -d .git; then + test "x$dir" = x. \ + && dir= sed_esc= \ + || { dir="$dir/"; sed_esc=`echo "$dir"|env sed 's,\([\\/]\),\\\\\1,g'`; } + # Ignore git symlinks - either they point into the tree, in which case + # we don't need to visit the target twice, or they point somewhere + # else (often into a submodule), in which case the content does not + # belong to this package. + eval exec git ls-tree -r 'HEAD:"$dir"' \ + \| sed -n '"s/^100[^ ]*./$sed_esc/p"' $postprocess + elif test -d .hg; then + eval exec hg locate '"$dir/*"' $postprocess + elif test -d .bzr; then + test "$postprocess" = '' && postprocess="| sed 's|^\./||'" + eval exec bzr ls -R --versioned '"$dir"' $postprocess + elif test -d CVS; then + test "$postprocess" = '' && postprocess="| sed 's|^\./||'" + if test -x build-aux/cvsu; then + eval build-aux/cvsu --find --types=AFGM '"$dir"' $postprocess + elif (cvsu --help) >/dev/null 2>&1; then + eval cvsu --find --types=AFGM '"$dir"' $postprocess + else + eval awk -F/ \''{ \ + if (!$1 && $3 !~ /^-/) { \ + f=FILENAME; \ + if (f ~ /CVS\/Entries$/) \ + f = substr(f, 1, length(f)-11); \ + print f $2; \ + }}'\'' \ + `find "$dir" -name Entries -print` /dev/null' $postprocess + fi + elif test -d .svn; then + eval exec svn list -R '"$dir"' $postprocess + else + echo "$0: Failed to determine type of version control used in `pwd`" 1>&2 + exit 1 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/cfg.mk b/cfg.mk new file mode 100644 index 00000000..b7cd140f --- /dev/null +++ b/cfg.mk @@ -0,0 +1,150 @@ +# Customize Makefile.maint. -*- makefile -*- +# Copyright (C) 2008-2011 Red Hat, Inc. +# Copyright (C) 2003-2008 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Tests not to run as part of "make distcheck". +local-checks-to-skip = \ + changelog-check \ + check-AUTHORS \ + makefile-check \ + makefile_path_separator_check \ + patch-check \ + sc_GPL_version \ + sc_always_defined_macros \ + sc_cast_of_alloca_return_value \ + sc_cross_check_PATH_usage_in_tests \ + sc_dd_max_sym_length \ + sc_error_exit_success \ + sc_file_system \ + sc_immutable_NEWS \ + sc_makefile_path_separator_check \ + sc_obsolete_symbols \ + sc_prohibit_always_true_header_tests \ + sc_prohibit_S_IS_definition \ + sc_prohibit_atoi_atof \ + sc_prohibit_hash_without_use \ + sc_prohibit_jm_in_m4 \ + sc_prohibit_quote_without_use \ + sc_prohibit_quotearg_without_use \ + sc_prohibit_stat_st_blocks \ + sc_prohibit_magic_number_exit \ + sc_prohibit_strcmp \ + sc_prohibit_undesirable_word_seq \ + sc_root_tests \ + sc_space_tab \ + sc_sun_os_names \ + sc_system_h_headers \ + sc_texinfo_acronym \ + sc_tight_scope \ + sc_two_space_separator_in_usage \ + sc_error_message_uppercase \ + sc_program_name \ + sc_require_test_exit_idiom \ + sc_makefile_check \ + sc_useless_cpp_parens \ + sc_Wundef_boolean + +# Files that should never cause syntax check failures. +VC_LIST_ALWAYS_EXCLUDE_REGEX = \ + (^HACKING|\.po|maint.mk)$$ + +# Functions like free() that are no-ops on NULL arguments. +useless_free_options = \ + --name=xfree \ + --name=g_free \ + --name=xmlBufferFree \ + --name=xmlFree \ + --name=xmlFreeDoc \ + --name=xmlXPathFreeContext \ + --name=xmlXPathFreeObject + +# Ensure that no C source file, docs, or rng schema uses TABs for +# indentation. Also match *.h.in files, to get libvirt.h.in. Exclude +# files in gnulib, since they're imported. +space_indent_files=(\.(rng|s?[ch](\.in)?|html.in|py)|(daemon|tools)/.*\.in) +sc_TAB_in_indentation: + @prohibit='^ * ' \ + in_vc_files='$(space_indent_files)$$' \ + halt='indent with space, not TAB, in C, sh, html, py, and RNG schemas' \ + $(_sc_search_regexp) + +# G_GNUC_UNUSED should only be applied in implementations, not +# header declarations +sc_avoid_attribute_unused_in_header: + @prohibit='^[^#]*G_GNUC_UNUSED([^:]|$$)' \ + in_vc_files='\.h$$' \ + halt='use G_GNUC_UNUSED in .c rather than .h files' \ + $(_sc_search_regexp) + +# Enforce recommended preprocessor indentation style. +sc_preprocessor_indentation: + @if cppi --version >/dev/null 2>&1; then \ + $(VC_LIST_EXCEPT) | grep '\.[ch]$$' | xargs cppi -a -c \ + || { echo '$(ME): incorrect preprocessor indentation' 1>&2; \ + exit 1; }; \ + else \ + echo '$(ME): skipping test $@: cppi not installed' 1>&2; \ + fi + +sc_copyright_format: + @require='Copyright .*Red 'Hat', Inc\.' \ + containing='Copyright .*Red 'Hat \ + halt='Red Hat copyright is missing Inc.' \ + $(_sc_search_regexp) + @prohibit='Copyright [^(].*Red 'Hat \ + halt='consistently use (C) in Red Hat copyright' \ + $(_sc_search_regexp) + @prohibit='\' \ + halt='spell Red Hat as two words' \ + $(_sc_search_regexp) + +# We don't use this feature of maint.mk. +prev_version_file = /dev/null + +# Give credit where due: +# Ensure that each commit author email address (possibly mapped via +# git log's .mailmap) appears in our AUTHORS file. +sc_check_author_list: + @fail=0; \ + for i in $$(git log --pretty=format:%aE%n|sort -u|grep -v '^$$'); do \ + sanitized=$$(echo "$$i"|LC_ALL=C sed 's/\([^a-zA-Z0-9_@-]\)/\\\1/g'); \ + grep -iq "<$$sanitized>" $(srcdir)/AUTHORS \ + || { printf '%s\n' "$$i" >&2; fail=1; }; \ + done; \ + test $$fail = 1 \ + && echo '$(ME): committer(s) not listed in AUTHORS' >&2; \ + test $$fail = 0 + + +# XXX some of these tools/ programs probably ought to bindtextdomain ? +exclude_file_name_regexp--sc_bindtextdomain = ^server/tests|common/region.c|common/win/my_getopt-1.5/main.c|tools/(bitmap_to_c.c|icon_to_c.c|reds_stat.c) + +exclude_file_name_regexp--sc_preprocessor_indentation = ^*/*.[ch] + +exclude_file_name_regexp--sc_const_long_option = ^common/win/my_getopt-1.5/getopt.(3|txt) + +exclude_file_name_regexp--sc_prohibit_empty_lines_at_EOF = ^common/win/my_getopt-1.5/getopt.(3|txt)|client/windows/(spice.ico|sticky_alt.bmp)|client/tests/controller_test/build + +# XXX this should be removed & all cases fixde +exclude_file_name_regexp--sc_prohibit_have_config_h = ^*/.*(c|cpp|h) + +exclude_file_name_regexp--sc_require_config_h = ^client/gui/.*\.(ttf|font)\.c|client/gui/taharez.*\.c|client/x11/images/(alt_image|red_icon)\.c|common/win/my_getopt-1.5 + +exclude_file_name_regexp--sc_require_config_h_first = ^client/gui/.*\.(ttf|font)\.c|client/gui/taharez.*\.c|client/x11/images/(alt_image|red_icon)\.c|common/win/my_getopt-1.5 + +exclude_file_name_regexp--sc_trailing_blank = ^common/win/my_getopt-1.5/getopt.3 + +exclude_file_name_regexp--sc_unmarked_diagnostics = ^.*\.(c|py|h) diff --git a/maint.mk b/maint.mk new file mode 100644 index 00000000..405c6d09 --- /dev/null +++ b/maint.mk @@ -0,0 +1,1511 @@ +# -*-Makefile-*- +# This Makefile fragment tries to be general-purpose enough to be +# used by many projects via the gnulib maintainer-makefile module. + +## Copyright (C) 2001-2011 Free Software Foundation, Inc. +## +## This program is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program. If not, see . + +# This is reported not to work with make-3.79.1 +# ME := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) +ME := maint.mk + +# Diagnostic for continued use of deprecated variable. +# Remove in 2013 +ifneq ($(build_aux),) + $(error "$(ME): \ +set $$(_build-aux) relative to $$(srcdir) instead of $$(build_aux)") +endif + +# Do not save the original name or timestamp in the .tar.gz file. +# Use --rsyncable if available. +gzip_rsyncable := \ + $(shell gzip --help 2>/dev/null|grep rsyncable >/dev/null \ + && printf %s --rsyncable) +GZIP_ENV = '--no-name --best $(gzip_rsyncable)' + +GIT = git +VC = $(GIT) + +VC_LIST = $(srcdir)/$(_build-aux)/vc-list-files -C $(srcdir) + +# You can override this variable in cfg.mk to set your own regexp +# matching files to ignore. +VC_LIST_ALWAYS_EXCLUDE_REGEX ?= ^$$ + +# This is to preprocess robustly the output of $(VC_LIST), so that even +# when $(srcdir) is a pathological name like "....", the leading sed command +# removes only the intended prefix. +_dot_escaped_srcdir = $(subst .,\.,$(srcdir)) + +# Post-process $(VC_LIST) output, prepending $(srcdir)/, but only +# when $(srcdir) is not ".". +ifeq ($(srcdir),.) +_prepend_srcdir_prefix = +else +_prepend_srcdir_prefix = | sed 's|^|$(srcdir)/|' +endif + +# In order to be able to consistently filter "."-relative names, +# (i.e., with no $(srcdir) prefix), this definition is careful to +# remove any $(srcdir) prefix, and to restore what it removes. +_sc_excl = \ + $(if $(exclude_file_name_regexp--$@),$(exclude_file_name_regexp--$@),^$$) +VC_LIST_EXCEPT = \ + $(VC_LIST) | sed 's|^$(_dot_escaped_srcdir)/||' \ + | if test -f $(srcdir)/.x-$@; then grep -vEf $(srcdir)/.x-$@; \ + else grep -Ev -e "$${VC_LIST_EXCEPT_DEFAULT-ChangeLog}"; fi \ + | grep -Ev -e '($(VC_LIST_ALWAYS_EXCLUDE_REGEX)|$(_sc_excl))' \ + $(_prepend_srcdir_prefix) + +ifeq ($(origin prev_version_file), undefined) + prev_version_file = $(srcdir)/.prev-version +endif + +PREV_VERSION := $(shell cat $(prev_version_file) 2>/dev/null) +VERSION_REGEXP = $(subst .,\.,$(VERSION)) +PREV_VERSION_REGEXP = $(subst .,\.,$(PREV_VERSION)) + +ifeq ($(VC),$(GIT)) +this-vc-tag = v$(VERSION) +this-vc-tag-regexp = v$(VERSION_REGEXP) +else +tag-package = $(shell echo "$(PACKAGE)" | tr '[:lower:]' '[:upper:]') +tag-this-version = $(subst .,_,$(VERSION)) +this-vc-tag = $(tag-package)-$(tag-this-version) +this-vc-tag-regexp = $(this-vc-tag) +endif +my_distdir = $(PACKAGE)-$(VERSION) + +# Old releases are stored here. +release_archive_dir ?= ../release + +# Override gnu_rel_host and url_dir_list in cfg.mk if these are not right. +# Use alpha.gnu.org for alpha and beta releases. +# Use ftp.gnu.org for stable releases. +gnu_ftp_host-alpha = alpha.gnu.org +gnu_ftp_host-beta = alpha.gnu.org +gnu_ftp_host-stable = ftp.gnu.org +gnu_rel_host ?= $(gnu_ftp_host-$(RELEASE_TYPE)) + +ifeq ($(gnu_rel_host),ftp.gnu.org) +url_dir_list ?= http://ftpmirror.gnu.org/$(PACKAGE) +else +url_dir_list ?= ftp://$(gnu_rel_host)/gnu/$(PACKAGE) +endif + +# Override this in cfg.mk if you are using a different format in your +# NEWS file. +today = $(shell date +%Y-%m-%d) + +# Select which lines of NEWS are searched for $(news-check-regexp). +# This is a sed line number spec. The default says that we search +# lines 1..10 of NEWS for $(news-check-regexp). +# If you want to search only line 3 or only lines 20-22, use "3" or "20,22". +news-check-lines-spec ?= 1,10 +news-check-regexp ?= '^\*.* $(VERSION_REGEXP) \($(today)\)' + +# Prevent programs like 'sort' from considering distinct strings to be equal. +# Doing it here saves us from having to set LC_ALL elsewhere in this file. +export LC_ALL = C + +## --------------- ## +## Sanity checks. ## +## --------------- ## + +_cfg_mk := $(shell test -f $(srcdir)/cfg.mk && echo '$(srcdir)/cfg.mk') + +# Collect the names of rules starting with `sc_'. +syntax-check-rules := $(sort $(shell sed -n 's/^\(sc_[a-zA-Z0-9_-]*\):.*/\1/p' \ + $(srcdir)/$(ME) $(_cfg_mk))) +.PHONY: $(syntax-check-rules) + +ifeq ($(shell $(VC_LIST) >/dev/null 2>&1; echo $$?),0) +local-checks-available += $(syntax-check-rules) +else +local-checks-available += no-vc-detected +no-vc-detected: + @echo "No version control files detected; skipping syntax check" +endif +.PHONY: $(local-checks-available) + +# Arrange to print the name of each syntax-checking rule just before running it. +$(syntax-check-rules): %: %.m +sc_m_rules_ = $(patsubst %, %.m, $(syntax-check-rules)) +.PHONY: $(sc_m_rules_) +$(sc_m_rules_): + @echo $(patsubst sc_%.m, %, $@) + @date +%s.%N > .sc-start-$(basename $@) + +# Compute and print the elapsed time for each syntax-check rule. +sc_z_rules_ = $(patsubst %, %.z, $(syntax-check-rules)) +.PHONY: $(sc_z_rules_) +$(sc_z_rules_): %.z: % + @end=$$(date +%s.%N); \ + start=$$(cat .sc-start-$*); \ + rm -f .sc-start-$*; \ + awk -v s=$$start -v e=$$end \ + 'END {printf "%.2f $(patsubst sc_%,%,$*)\n", e - s}' < /dev/null + +# The patsubst here is to replace each sc_% rule with its sc_%.z wrapper +# that computes and prints elapsed time. +local-check := \ + $(patsubst sc_%, sc_%.z, \ + $(filter-out $(local-checks-to-skip), $(local-checks-available))) + +syntax-check: $(local-check) + +# _sc_search_regexp +# +# This macro searches for a given construct in the selected files and +# then takes some action. +# +# Parameters (shell variables): +# +# prohibit | require +# +# Regular expression (ERE) denoting either a forbidden construct +# or a required construct. Those arguments are exclusive. +# +# in_vc_files | in_files +# +# grep-E-style regexp denoting the files to check. If no files +# are specified the default are all the files that are under +# version control. +# +# containing | non_containing +# +# Select the files (non) containing strings matching this regexp. +# If both arguments are specified then CONTAINING takes +# precedence. +# +# with_grep_options +# +# Extra options for grep. +# +# ignore_case +# +# Ignore case. +# +# halt +# +# Message to display before to halting execution. +# +# Finally, you may exempt files based on an ERE matching file names. +# For example, to exempt from the sc_space_tab check all files with the +# .diff suffix, set this Make variable: +# +# exclude_file_name_regexp--sc_space_tab = \.diff$ +# +# Note that while this functionality is mostly inherited via VC_LIST_EXCEPT, +# when filtering by name via in_files, we explicitly filter out matching +# names here as well. + +# By default, _sc_search_regexp does not ignore case. +export ignore_case = +_ignore_case = $$(test -n "$$ignore_case" && printf %s -i || :) + +define _sc_say_and_exit + dummy=; : so we do not need a semicolon before each use; \ + { printf '%s\n' "$(ME): $$msg" 1>&2; exit 1; }; +endef + +# _sc_search_regexp used to be named _prohibit_regexp. However, +# upgrading to the new definition and leaving the old name undefined +# would usually convert each custom rule using $(_prohibit_regexp) +# (usually defined in cfg.mk) into a no-op. This definition ensures +# that people know right away if they're still using the old name. +# FIXME: remove in 2012. +_prohibit_regexp = \ + $(error '*** you need to s/_prohibit_regexp/_sc_search_regexp/, and adapt') + +define _sc_search_regexp + dummy=; : so we do not need a semicolon before each use; \ + \ + : Check arguments; \ + test -n "$$prohibit" && test -n "$$require" \ + && { msg='Cannot specify both prohibit and require' \ + $(_sc_say_and_exit) } || :; \ + test -z "$$prohibit" && test -z "$$require" \ + && { msg='Should specify either prohibit or require' \ + $(_sc_say_and_exit) } || :; \ + test -n "$$in_vc_files" && test -n "$$in_files" \ + && { msg='Cannot specify both in_vc_files and in_files' \ + $(_sc_say_and_exit) } || :; \ + test "x$$halt" != x \ + || { msg='halt not defined' $(_sc_say_and_exit) }; \ + \ + : Filter by file name; \ + if test -n "$$in_files"; then \ + files=$$(find $(srcdir) | grep -E "$$in_files" \ + | grep -Ev '$(exclude_file_name_regexp--$@)'); \ + else \ + files=$$($(VC_LIST_EXCEPT)); \ + if test -n "$$in_vc_files"; then \ + files=$$(echo "$$files" | grep -E "$$in_vc_files"); \ + fi; \ + fi; \ + \ + : Filter by content; \ + test -n "$$files" && test -n "$$containing" \ + && { files=$$(grep -l "$$containing" $$files); } || :; \ + test -n "$$files" && test -n "$$non_containing" \ + && { files=$$(grep -vl "$$non_containing" $$files); } || :; \ + \ + : Check for the construct; \ + if test -n "$$files"; then \ + if test -n "$$prohibit"; then \ + grep $$with_grep_options $(_ignore_case) -nE "$$prohibit" $$files \ + && { msg="$$halt" $(_sc_say_and_exit) } || :; \ + else \ + grep $$with_grep_options $(_ignore_case) -LE "$$require" $$files \ + | grep . \ + && { msg="$$halt" $(_sc_say_and_exit) } || :; \ + fi \ + else :; \ + fi || :; +endef + +sc_avoid_if_before_free: + @$(srcdir)/$(_build-aux)/useless-if-before-free \ + $(useless_free_options) \ + $$($(VC_LIST_EXCEPT) | grep -v useless-if-before-free) && \ + { echo '$(ME): found useless "if" before "free" above' 1>&2; \ + exit 1; } || : + +sc_cast_of_argument_to_free: + @prohibit='\&2; exit 1; } || : + +# Pass EXIT_*, not number, to usage, exit, and error (when exiting) +# Convert all uses automatically, via these two commands: +# git grep -l '\&2; \ + exit 1; } || : + +# Error messages should not start with a capital letter +sc_error_message_uppercase: + @grep -nEA2 '[^rp]error *\(' $$($(VC_LIST_EXCEPT)) \ + | grep -E '"[A-Z]' \ + | grep -vE '"FATAL|"WARNING|"Java|"C#|PRIuMAX' && \ + { echo '$(ME): found capitalized error message' 1>&2; \ + exit 1; } || : + +# Error messages should not end with a period +sc_error_message_period: + @grep -nEA2 '[^rp]error *\(' $$($(VC_LIST_EXCEPT)) \ + | grep -E '[^."]\."' && \ + { echo '$(ME): found error message ending in period' 1>&2; \ + exit 1; } || : + +sc_file_system: + @prohibit=file''system \ + ignore_case=1 \ + halt='found use of "file''system"; spell it "file system"' \ + $(_sc_search_regexp) + +# Don't use cpp tests of this symbol. All code assumes config.h is included. +sc_prohibit_have_config_h: + @prohibit='^# *if.*HAVE''_CONFIG_H' \ + halt='found use of HAVE''_CONFIG_H; remove' \ + $(_sc_search_regexp) + +# Nearly all .c files must include . However, we also permit this +# via inclusion of a package-specific header, if cfg.mk specified one. +# config_h_header must be suitable for grep -E. +config_h_header ?= +sc_require_config_h: + @require='^# *include $(config_h_header)' \ + in_vc_files='\.c$$' \ + halt='the above files do not include ' \ + $(_sc_search_regexp) + +# You must include before including any other header file. +# This can possibly be via a package-specific header, if given by cfg.mk. +sc_require_config_h_first: + @if $(VC_LIST_EXCEPT) | grep -l '\.c$$' > /dev/null; then \ + fail=0; \ + for i in $$($(VC_LIST_EXCEPT) | grep '\.c$$'); do \ + grep '^# *include\>' $$i | sed 1q \ + | grep -E '^# *include $(config_h_header)' > /dev/null \ + || { echo $$i; fail=1; }; \ + done; \ + test $$fail = 1 && \ + { echo '$(ME): the above files include some other header' \ + 'before ' 1>&2; exit 1; } || :; \ + else :; \ + fi + +sc_prohibit_HAVE_MBRTOWC: + @prohibit='\bHAVE_MBRTOWC\b' \ + halt="do not use $$prohibit; it is always defined" \ + $(_sc_search_regexp) + +# To use this "command" macro, you must first define two shell variables: +# h: the header name, with no enclosing <> or "" +# re: a regular expression that matches IFF something provided by $h is used. +define _sc_header_without_use + dummy=; : so we do not need a semicolon before each use; \ + h_esc=`echo '[<"]'"$$h"'[">]'|sed 's/\./\\\\./g'`; \ + if $(VC_LIST_EXCEPT) | grep -l '\.c$$' > /dev/null; then \ + files=$$(grep -l '^# *include '"$$h_esc" \ + $$($(VC_LIST_EXCEPT) | grep '\.c$$')) && \ + grep -LE "$$re" $$files | grep . && \ + { echo "$(ME): the above files include $$h but don't use it" \ + 1>&2; exit 1; } || :; \ + else :; \ + fi +endef + +# Prohibit the inclusion of assert.h without an actual use of assert. +sc_prohibit_assert_without_use: + @h='assert.h' re='\new(file => "/dev/stdin")->as_string'|sed 's/\?://g' +# Note this was produced by the above: +# _xa1 = \ +#x(((2n?)?re|c(har)?|n(re|m)|z)alloc|alloc_(oversized|die)|m(alloc|emdup)|strdup) +# But we can do better, in at least two ways: +# 1) take advantage of two "dup"-suffixed strings: +# x(((2n?)?re|c(har)?|n(re|m)|[mz])alloc|alloc_(oversized|die)|(mem|str)dup) +# 2) notice that "c(har)?|[mz]" is equivalent to the shorter and more readable +# "char|[cmz]" +# x(((2n?)?re|char|n(re|m)|[cmz])alloc|alloc_(oversized|die)|(mem|str)dup) +_xa1 = x(((2n?)?re|char|n(re|m)|[cmz])alloc|alloc_(oversized|die)|(mem|str)dup) +_xa2 = X([CZ]|N?M)ALLOC +sc_prohibit_xalloc_without_use: + @h='xalloc.h' \ + re='\<($(_xa1)|$(_xa2)) *\('\ + $(_sc_header_without_use) + +# Extract function names: +# perl -lne '/^(?:extern )?(?:void|char) \*?(\w+) *\(/ and print $1' lib/hash.h +_hash_re = \ +clear|delete|free|get_(first|next)|insert|lookup|print_statistics|reset_tuning +_hash_fn = \<($(_hash_re)) *\( +_hash_struct = (struct )?\<[Hh]ash_(table|tuning)\> +sc_prohibit_hash_without_use: + @h='hash.h' \ + re='$(_hash_fn)|$(_hash_struct)'\ + $(_sc_header_without_use) + +sc_prohibit_cloexec_without_use: + @h='cloexec.h' re='\<(set_cloexec_flag|dup_cloexec) *\(' \ + $(_sc_header_without_use) + +sc_prohibit_posixver_without_use: + @h='posixver.h' re='\' \ + halt='do not use HAVE''_FCNTL_H or O'_NDELAY \ + $(_sc_search_regexp) + +# FIXME: warn about definitions of EXIT_FAILURE, EXIT_SUCCESS, STREQ + +# Each nonempty ChangeLog line must start with a year number, or a TAB. +sc_changelog: + @prohibit='^[^12 ]' \ + in_vc_files='^ChangeLog$$' \ + halt='found unexpected prefix in a ChangeLog' \ + $(_sc_search_regexp) + +# Ensure that each .c file containing a "main" function also +# calls set_program_name. +sc_program_name: + @require='set_program_name *\(m?argv\[0\]\);' \ + in_vc_files='\.c$$' \ + containing='\
/dev/null \ + && : || { die=1; echo $$i; } \ + done; \ + test $$die = 1 && \ + { echo 1>&2 '$(ME): the final line in each of the above is not:'; \ + echo 1>&2 'Exit something'; \ + exit 1; } || :; \ + fi + +sc_trailing_blank: + @prohibit='[ ]$$' \ + halt='found trailing blank(s)' \ + $(_sc_search_regexp) + +# Match lines like the following, but where there is only one space +# between the options and the description: +# -D, --all-repeated[=delimit-method] print all duplicate lines\n +longopt_re = --[a-z][0-9A-Za-z-]*(\[?=[0-9A-Za-z-]*\]?)? +sc_two_space_separator_in_usage: + @prohibit='^ *(-[A-Za-z],)? $(longopt_re) [^ ].*\\$$' \ + halt='help2man requires at least two spaces between an option and its description'\ + $(_sc_search_regexp) + +# A regexp matching function names like "error" that may be used +# to emit translatable messages. +_gl_translatable_diag_func_re ?= error + +# Look for diagnostics that aren't marked for translation. +# This won't find any for which error's format string is on a separate line. +sc_unmarked_diagnostics: + @grep -nE \ + '\<$(_gl_translatable_diag_func_re) *\([^"]*"[^"]*[a-z]{3}' \ + $$($(VC_LIST_EXCEPT)) \ + | grep -Ev '(_|ngettext ?)\(' && \ + { echo '$(ME): found unmarked diagnostic(s)' 1>&2; \ + exit 1; } || : + +# Avoid useless parentheses like those in this example: +# #if defined (SYMBOL) || defined (SYM2) +sc_useless_cpp_parens: + @prohibit='^# *if .*defined *\(' \ + halt='found useless parentheses in cpp directive' \ + $(_sc_search_regexp) + +# List headers for which HAVE_HEADER_H is always true, assuming you are +# using the appropriate gnulib module. CAUTION: for each "unnecessary" +# #if HAVE_HEADER_H that you remove, be sure that your project explicitly +# requires the gnulib module that guarantees the usability of that header. +gl_assured_headers_ = \ + cd $(gnulib_dir)/lib && echo *.in.h|sed 's/\.in\.h//g' + +# Convert the list of names to upper case, and replace each space with "|". +az_ = abcdefghijklmnopqrstuvwxyz +AZ_ = ABCDEFGHIJKLMNOPQRSTUVWXYZ +gl_header_upper_case_or_ = \ + $$($(gl_assured_headers_) \ + | tr $(az_)/.- $(AZ_)___ \ + | tr -s ' ' '|' \ + ) +sc_prohibit_always_true_header_tests: + @or=$(gl_header_upper_case_or_); \ + re="HAVE_($$or)_H"; \ + prohibit='\<'"$$re"'\>' \ + halt=$$(printf '%s\n' \ + 'do not test the above HAVE_
_H symbol(s);' \ + ' with the corresponding gnulib module, they are always true') \ + $(_sc_search_regexp) + +# ================================================================== +gl_other_headers_ ?= \ + intprops.h \ + openat.h \ + stat-macros.h + +# Perl -lne code to extract "significant" cpp-defined symbols from a +# gnulib header file, eliminating a few common false-positives. +# The exempted names below are defined only conditionally in gnulib, +# and hence sometimes must/may be defined in application code. +gl_extract_significant_defines_ = \ + /^\# *define ([^_ (][^ (]*)(\s*\(|\s+\w+)/\ + && $$2 !~ /(?:rpl_|_used_without_)/\ + && $$1 !~ /^(?:NSIG|ENODATA)$$/\ + && $$1 !~ /^(?:SA_RESETHAND|SA_RESTART)$$/\ + and print $$1 + +# Create a list of regular expressions matching the names +# of macros that are guaranteed to be defined by parts of gnulib. +define def_sym_regex + gen_h=$(gl_generated_headers_); \ + (cd $(gnulib_dir)/lib; \ + for f in *.in.h $(gl_other_headers_); do \ + test -f $$f \ + && perl -lne '$(gl_extract_significant_defines_)' $$f; \ + done; \ + ) | sort -u \ + | sed 's/^/^ *# *(define|undef) */;s/$$/\\>/' +endef + +# Don't define macros that we already get from gnulib header files. +sc_prohibit_always-defined_macros: + @if test -d $(gnulib_dir); then \ + case $$(echo all: | grep -l -f - Makefile) in Makefile);; *) \ + echo '$(ME): skipping $@: you lack GNU grep' 1>&2; exit 0;; \ + esac; \ + $(def_sym_regex) | grep -E -f - $$($(VC_LIST_EXCEPT)) \ + && { echo '$(ME): define the above via some gnulib .h file' \ + 1>&2; exit 1; } || :; \ + fi +# ================================================================== + +# Prohibit checked in backup files. +sc_prohibit_backup_files: + @$(VC_LIST) | grep '~$$' && \ + { echo '$(ME): found version controlled backup file' 1>&2; \ + exit 1; } || : + +# Require the latest GPL. +sc_GPL_version: + @prohibit='either ''version [^3]' \ + halt='GPL vN, N!=3' \ + $(_sc_search_regexp) + +# Require the latest GFDL. Two regexp, since some .texi files end up +# line wrapping between 'Free Documentation License,' and 'Version'. +_GFDL_regexp = (Free ''Documentation.*Version 1\.[^3]|Version 1\.[^3] or any) +sc_GFDL_version: + @prohibit='$(_GFDL_regexp)' \ + halt='GFDL vN, N!=3' \ + $(_sc_search_regexp) + +# Don't use Texinfo's @acronym{}. +# http://lists.gnu.org/archive/html/bug-gnulib/2010-03/msg00321.html +texinfo_suffix_re_ ?= \.(txi|texi(nfo)?)$$ +sc_texinfo_acronym: + @prohibit='@acronym\{' \ + in_vc_files='$(texinfo_suffix_re_)' \ + halt='found use of Texinfo @acronym{}' \ + $(_sc_search_regexp) + +cvs_keywords = \ + Author|Date|Header|Id|Name|Locker|Log|RCSfile|Revision|Source|State + +sc_prohibit_cvs_keyword: + @prohibit='\$$($(cvs_keywords))\$$' \ + halt='do not use CVS keyword expansion' \ + $(_sc_search_regexp) + +# This Perl code is slightly obfuscated. Not only is each "$" doubled +# because it's in a Makefile, but the $$c's are comments; we cannot +# use "#" due to the way the script ends up concatenated onto one line. +# It would be much more concise, and would produce better output (including +# counts) if written as: +# perl -ln -0777 -e '/\n(\n+)$/ and print "$ARGV: ".length $1' ... +# but that would be far less efficient, reading the entire contents +# of each file, rather than just the last two bytes of each. +# In addition, while the code below detects both blank lines and a missing +# newline at EOF, the above detects only the former. +# +# This is a perl script that is expected to be the single-quoted argument +# to a command-line "-le". The remaining arguments are file names. +# Print the name of each file that ends in exactly one newline byte. +# I.e., warn if there are blank lines (2 or more newlines), or if the +# last byte is not a newline. However, currently we don't complain +# about any file that contains exactly one byte. +# Exit nonzero if at least one such file is found, otherwise, exit 0. +# Warn about, but otherwise ignore open failure. Ignore seek/read failure. +# +# Use this if you want to remove trailing empty lines from selected files: +# perl -pi -0777 -e 's/\n\n+$/\n/' files... +# +require_exactly_one_NL_at_EOF_ = \ + foreach my $$f (@ARGV) \ + { \ + open F, "<", $$f or (warn "failed to open $$f: $$!\n"), next; \ + my $$p = sysseek (F, -2, 2); \ + my $$c = "seek failure probably means file has < 2 bytes; ignore"; \ + my $$last_two_bytes; \ + defined $$p and $$p = sysread F, $$last_two_bytes, 2; \ + close F; \ + $$c = "ignore read failure"; \ + $$p && ($$last_two_bytes eq "\n\n" \ + || substr ($$last_two_bytes,1) ne "\n") \ + and (print $$f), $$fail=1; \ + } \ + END { exit defined $$fail } +sc_prohibit_empty_lines_at_EOF: + @perl -le '$(require_exactly_one_NL_at_EOF_)' $$($(VC_LIST_EXCEPT)) \ + || { echo '$(ME): empty line(s) or no newline at EOF' \ + 1>&2; exit 1; } || : + +# Make sure we don't use st_blocks. Use ST_NBLOCKS instead. +# This is a bit of a kludge, since it prevents use of the string +# even in comments, but for now it does the job with no false positives. +sc_prohibit_stat_st_blocks: + @prohibit='[.>]st_blocks' \ + halt='do not use st_blocks; use ST_NBLOCKS' \ + $(_sc_search_regexp) + +# Make sure we don't define any S_IS* macros in src/*.c files. +# They're already defined via gnulib's sys/stat.h replacement. +sc_prohibit_S_IS_definition: + @prohibit='^ *# *define *S_IS' \ + halt='do not define S_IS* macros; include ' \ + $(_sc_search_regexp) + +# Perl block to convert a match to FILE_NAME:LINENO:TEST, +# that is shared by two definitions below. +perl_filename_lineno_text_ = \ + -e ' {' \ + -e ' $$n = ($$` =~ tr/\n/\n/ + 1);' \ + -e ' ($$v = $$&) =~ s/\n/\\n/g;' \ + -e ' print "$$ARGV:$$n:$$v\n";' \ + -e ' }' + +prohibit_doubled_word_RE_ ?= \ + /\b(then?|[iao]n|i[fst]|but|f?or|at|and|[dt]o)\s+\1\b/gims +prohibit_doubled_word_ = \ + -e 'while ($(prohibit_doubled_word_RE_))' \ + $(perl_filename_lineno_text_) + +# Define this to a regular expression that matches +# any filename:dd:match lines you want to ignore. +# The default is to ignore no matches. +ignore_doubled_word_match_RE_ ?= ^$$ + +sc_prohibit_doubled_word: + @perl -n -0777 $(prohibit_doubled_word_) $$($(VC_LIST_EXCEPT)) \ + | grep -vE '$(ignore_doubled_word_match_RE_)' \ + | grep . && { echo '$(ME): doubled words' 1>&2; exit 1; } || : + +# A regular expression matching undesirable combinations of words like +# "can not"; this matches them even when the two words appear on different +# lines, but not when there is an intervening delimiter like "#" or "*". +prohibit_undesirable_word_seq_RE_ ?= \ + /\bcan\s+not\b/gims +prohibit_undesirable_word_seq_ = \ + -e 'while ($(prohibit_undesirable_word_seq_RE_))' \ + $(perl_filename_lineno_text_) +# Define this to a regular expression that matches +# any filename:dd:match lines you want to ignore. +# The default is to ignore no matches. +ignore_undesirable_word_sequence_RE_ ?= ^$$ + +sc_prohibit_undesirable_word_seq: + @perl -n -0777 $(prohibit_undesirable_word_seq_) \ + $$($(VC_LIST_EXCEPT)) \ + | grep -vE '$(ignore_undesirable_word_sequence_RE_)' | grep . \ + && { echo '$(ME): undesirable word sequence' >&2; exit 1; } || : + +_ptm1 = use "test C1 && test C2", not "test C1 -''a C2" +_ptm2 = use "test C1 || test C2", not "test C1 -''o C2" +# Using test's -a and -o operators is not portable. +# We prefer test over [, since the latter is spelled [[ in configure.ac. +sc_prohibit_test_minus_ao: + @prohibit='(\ /dev/null \ + || { fail=1; echo 1>&2 "$(ME): $$p uses proper_name_utf8"; }; \ + done; \ + test $$fail = 1 && \ + { echo 1>&2 '$(ME): the above do not link with any ICONV library'; \ + exit 1; } || :; \ + fi + +# Warn about "c0nst struct Foo const foo[]", +# but not about "char const *const foo" or "#define const const". +sc_redundant_const: + @prohibit='\bconst\b[[:space:][:alnum:]]{2,}\bconst\b' \ + halt='redundant "const" in declarations' \ + $(_sc_search_regexp) + +sc_const_long_option: + @grep '^ *static.*struct option ' $$($(VC_LIST_EXCEPT)) \ + | grep -Ev 'const struct option|struct option const' && { \ + echo 1>&2 '$(ME): add "const" to the above declarations'; \ + exit 1; } || : + +NEWS_hash = \ + $$(sed -n '/^\*.* $(PREV_VERSION_REGEXP) ([0-9-]*)/,$$p' \ + $(srcdir)/NEWS \ + | perl -0777 -pe \ + 's/^Copyright.+?Free\sSoftware\sFoundation,\sInc\.\n//ms' \ + | md5sum - \ + | sed 's/ .*//') + +# Ensure that we don't accidentally insert an entry into an old NEWS block. +sc_immutable_NEWS: + @if test -f $(srcdir)/NEWS; then \ + test "$(NEWS_hash)" = '$(old_NEWS_hash)' && : || \ + { echo '$(ME): you have modified old NEWS' 1>&2; exit 1; }; \ + fi + +# Update the hash stored above. Do this after each release and +# for any corrections to old entries. +update-NEWS-hash: NEWS + perl -pi -e 's/^(old_NEWS_hash[ \t]+:?=[ \t]+).*/$${1}'"$(NEWS_hash)/" \ + $(srcdir)/cfg.mk + +# Ensure that we use only the standard $(VAR) notation, +# not @...@ in Makefile.am, now that we can rely on automake +# to emit a definition for each substituted variable. +# However, there is still one case in which @VAR@ use is not just +# legitimate, but actually required: when augmenting an automake-defined +# variable with a prefix. For example, gettext uses this: +# MAKEINFO = env LANG= LC_MESSAGES= LC_ALL= LANGUAGE= @MAKEINFO@ +# otherwise, makeinfo would put German or French (current locale) +# navigation hints in the otherwise-English documentation. +# +# Allow the package to add exceptions via a hook in cfg.mk; +# for example, @PRAGMA_SYSTEM_HEADER@ can be permitted by +# setting this to ' && !/PRAGMA_SYSTEM_HEADER/'. +_makefile_at_at_check_exceptions ?= +sc_makefile_at_at_check: + @perl -ne '/\@[A-Z_0-9]+\@/' \ + -e ' && !/([A-Z_0-9]+)\s+=.*\@\1\@$$/' \ + -e ''$(_makefile_at_at_check_exceptions) \ + -e 'and (print "$$ARGV:$$.: $$_"), $$m=1; END {exit !$$m}' \ + $$($(VC_LIST_EXCEPT) | grep -E '(^|/)(Makefile\.am|[^/]+\.mk)$$') \ + && { echo '$(ME): use $$(...), not @...@' 1>&2; exit 1; } || : + +news-check: NEWS + if sed -n $(news-check-lines-spec)p $(srcdir)/NEWS \ + | grep -E $(news-check-regexp) >/dev/null; then \ + :; \ + else \ + echo 'NEWS: $$(news-check-regexp) failed to match' 1>&2; \ + exit 1; \ + fi + +sc_makefile_TAB_only_indentation: + @prohibit='^ [ ]{8}' \ + in_vc_files='akefile|\.mk$$' \ + halt='found TAB-8-space indentation' \ + $(_sc_search_regexp) + +sc_m4_quote_check: + @prohibit='(AC_DEFINE(_UNQUOTED)?|AC_DEFUN)\([^[]' \ + in_vc_files='(^configure\.ac|\.m4)$$' \ + halt='quote the first arg to AC_DEF*' \ + $(_sc_search_regexp) + +fix_po_file_diag = \ +'you have changed the set of files with translatable diagnostics;\n\ +apply the above patch\n' + +# Verify that all source files using _() are listed in po/POTFILES.in. +po_file ?= $(srcdir)/po/POTFILES.in +generated_files ?= $(srcdir)/lib/*.[ch] +sc_po_check: + @if test -f $(po_file); then \ + grep -E -v '^(#|$$)' $(po_file) \ + | grep -v '^src/false\.c$$' | sort > $@-1; \ + files=; \ + for file in $$($(VC_LIST_EXCEPT)) $(generated_files); do \ + test -r $$file || continue; \ + case $$file in \ + *.m4|*.mk) continue ;; \ + *.?|*.??) ;; \ + *) continue;; \ + esac; \ + case $$file in \ + *.[ch]) \ + base=`expr " $$file" : ' \(.*\)\..'`; \ + { test -f $$base.l || test -f $$base.y; } && continue;; \ + esac; \ + files="$$files $$file"; \ + done; \ + grep -E -l '\b(N?_|gettext *)\([^)"]*("|$$)' $$files \ + | sed 's|^$(_dot_escaped_srcdir)/||' | sort -u > $@-2; \ + diff -u -L $(po_file) -L $(po_file) $@-1 $@-2 \ + || { printf '$(ME): '$(fix_po_file_diag) 1>&2; exit 1; }; \ + rm -f $@-1 $@-2; \ + fi + +# Sometimes it is useful to change the PATH environment variable +# in Makefiles. When doing so, it's better not to use the Unix-centric +# path separator of `:', but rather the automake-provided `$(PATH_SEPARATOR)'. +msg = '$(ME): Do not use `:'\'' above; use $$(PATH_SEPARATOR) instead' +sc_makefile_path_separator_check: + @prohibit='PATH[=].*:' \ + in_vc_files='akefile|\.mk$$' \ + halt=$(msg) \ + $(_sc_search_regexp) + +# Check that `make alpha' will not fail at the end of the process, +# i.e., when pkg-M.N.tar.xz already exists (either in "." or in ../release) +# and is read-only. +writable-files: + if test -d $(release_archive_dir); then \ + for file in $(DIST_ARCHIVES); do \ + for p in ./ $(release_archive_dir)/; do \ + test -e $$p$$file || continue; \ + test -w $$p$$file \ + || { echo ERROR: $$p$$file is not writable; fail=1; }; \ + done; \ + done; \ + test "$$fail" && exit 1 || : ; \ + else :; \ + fi + +v_etc_file = $(gnulib_dir)/lib/version-etc.c +sample-test = tests/sample-test +texi = doc/$(PACKAGE).texi +# Make sure that the copyright date in $(v_etc_file) is up to date. +# Do the same for the $(sample-test) and the main doc/.texi file. +sc_copyright_check: + @require='enum { COPYRIGHT_YEAR = '$$(date +%Y)' };' \ + in_files=$(v_etc_file) \ + halt='out of date copyright in $(v_etc_file); update it' \ + $(_sc_search_regexp) + @require='# Copyright \(C\) '$$(date +%Y)' Free' \ + in_vc_files=$(sample-test) \ + halt='out of date copyright in $(sample-test); update it' \ + $(_sc_search_regexp) + @require='Copyright @copyright\{\} .*'$$(date +%Y)' Free' \ + in_vc_files=$(texi) \ + halt='out of date copyright in $(texi); update it' \ + $(_sc_search_regexp) + +# If tests/help-version exists and seems to be new enough, assume that its +# use of init.sh and path_prepend_ is correct, and ensure that every other +# use of init.sh is identical. +# This is useful because help-version cross-checks prog --version +# with $(VERSION), which verifies that its path_prepend_ invocation +# sets PATH correctly. This is an inexpensive way to ensure that +# the other init.sh-using tests also get it right. +_hv_file ?= $(srcdir)/tests/help-version +_hv_regex_weak ?= ^ *\. .*/init\.sh" +# Fix syntax-highlighters " +_hv_regex_strong ?= ^ *\. "\$${srcdir=\.}/init\.sh" +sc_cross_check_PATH_usage_in_tests: + @if test -f $(_hv_file); then \ + grep -l 'VERSION mismatch' $(_hv_file) >/dev/null \ + || { echo "$@: skipped: no such file: $(_hv_file)" 1>&2; \ + exit 0; }; \ + grep -lE '$(_hv_regex_strong)' $(_hv_file) >/dev/null \ + || { echo "$@: $(_hv_file) lacks conforming use of init.sh" 1>&2; \ + exit 1; }; \ + good=$$(grep -E '$(_hv_regex_strong)' $(_hv_file)); \ + grep -LFx "$$good" \ + $$(grep -lE '$(_hv_regex_weak)' $$($(VC_LIST_EXCEPT))) \ + | grep . && \ + { echo "$(ME): the above files use path_prepend_ inconsistently" \ + 1>&2; exit 1; } || :; \ + fi + +# #if HAVE_... will evaluate to false for any non numeric string. +# That would be flagged by using -Wundef, however gnulib currently +# tests many undefined macros, and so we can't enable that option. +# So at least preclude common boolean strings as macro values. +sc_Wundef_boolean: + @prohibit='^#define.*(yes|no|true|false)$$' \ + in_files='$(CONFIG_INCLUDE)' \ + halt='Use 0 or 1 for macro values' \ + $(_sc_search_regexp) + +# Even if you use pathmax.h to guarantee that PATH_MAX is defined, it might +# not be constant, or might overflow a stack. In general, use PATH_MAX as +# a limit, not an array or alloca size. +sc_prohibit_path_max_allocation: + @prohibit='(\balloca *\([^)]*|\[[^]]*)PATH_MAX' \ + halt='Avoid stack allocations of size PATH_MAX' \ + $(_sc_search_regexp) + +sc_vulnerable_makefile_CVE-2009-4029: + @prohibit='perm -777 -exec chmod a\+rwx|chmod 777 \$$\(distdir\)' \ + in_files=$$(find $(srcdir) -name Makefile.in) \ + halt=$$(printf '%s\n' \ + 'the above files are vulnerable; beware of running' \ + ' "make dist*" rules, and upgrade to fixed automake' \ + ' see http://bugzilla.redhat.com/542609 for details') \ + $(_sc_search_regexp) + +vc-diff-check: + (unset CDPATH; cd $(srcdir) && $(VC) diff) > vc-diffs || : + if test -s vc-diffs; then \ + cat vc-diffs; \ + echo "Some files are locally modified:" 1>&2; \ + exit 1; \ + else \ + rm vc-diffs; \ + fi + +rel-files = $(DIST_ARCHIVES) + +gnulib_dir ?= $(srcdir)/gnulib +gnulib-version = $$(cd $(gnulib_dir) && git describe) +bootstrap-tools ?= autoconf,automake,gnulib + +# If it's not already specified, derive the GPG key ID from +# the signed tag we've just applied to mark this release. +gpg_key_ID ?= \ + $$(git cat-file tag v$(VERSION) > .ann-sig \ + && gpgv .ann-sig - < /dev/null 2>&1 \ + | sed -n '/.*key ID \([0-9A-F]*\)/s//\1/p'; rm -f .ann-sig) + +translation_project_ ?= coordinator@translationproject.org + +# Make info-gnu the default only for a stable release. +ifeq ($(RELEASE_TYPE),stable) + announcement_Cc_ ?= $(translation_project_), $(PACKAGE_BUGREPORT) + announcement_mail_headers_ ?= \ + To: info-gnu@gnu.org \ + Cc: $(announcement_Cc_) \ + Mail-Followup-To: $(PACKAGE_BUGREPORT) +else + announcement_Cc_ ?= $(translation_project_) + announcement_mail_headers_ ?= \ + To: $(PACKAGE_BUGREPORT) \ + Cc: $(announcement_Cc_) +endif + +announcement: NEWS ChangeLog $(rel-files) + @$(srcdir)/$(_build-aux)/announce-gen \ + --mail-headers='$(announcement_mail_headers_)' \ + --release-type=$(RELEASE_TYPE) \ + --package=$(PACKAGE) \ + --prev=$(PREV_VERSION) \ + --curr=$(VERSION) \ + --gpg-key-id=$(gpg_key_ID) \ + --news=$(srcdir)/NEWS \ + --bootstrap-tools=$(bootstrap-tools) \ + --gnulib-version=$(gnulib-version) \ + --no-print-checksums \ + $(addprefix --url-dir=, $(url_dir_list)) + +## ---------------- ## +## Updating files. ## +## ---------------- ## + +ftp-gnu = ftp://ftp.gnu.org/gnu +www-gnu = http://www.gnu.org + +upload_dest_dir_ ?= $(PACKAGE) +emit_upload_commands: + @echo ===================================== + @echo ===================================== + @echo "$(srcdir)/$(_build-aux)/gnupload $(GNUPLOADFLAGS) \\" + @echo " --to $(gnu_rel_host):$(upload_dest_dir_) \\" + @echo " $(rel-files)" + @echo '# send the ~/announce-$(my_distdir) e-mail' + @echo ===================================== + @echo ===================================== + +define emit-commit-log + printf '%s\n' 'maint: post-release administrivia' '' \ + '* NEWS: Add header line for next release.' \ + '* .prev-version: Record previous version.' \ + '* cfg.mk (old_NEWS_hash): Auto-update.' +endef + +.PHONY: no-submodule-changes +no-submodule-changes: + if test -d $(srcdir)/.git; then \ + diff=$$(cd $(srcdir) && git submodule -q foreach \ + git diff-index --name-only HEAD) \ + || exit 1; \ + case $$diff in '') ;; \ + *) echo '$(ME): submodule files are locally modified:'; \ + echo "$$diff"; exit 1;; esac; \ + else \ + : ; \ + fi + +submodule-checks ?= no-submodule-changes public-submodule-commit + +# Ensure that each sub-module commit we're using is public. +# Without this, it is too easy to tag and release code that +# cannot be built from a fresh clone. +.PHONY: public-submodule-commit +public-submodule-commit: + $(AM_V_GEN)if test -d $(srcdir)/.git; then \ + cd $(srcdir) && \ + git submodule --quiet foreach test '$$(git rev-parse $$sha1)' \ + = '$$(git merge-base origin $$sha1)' \ + || { echo '$(ME): found non-public submodule commit' >&2; \ + exit 1; }; \ + else \ + : ; \ + fi +# This rule has a high enough utility/cost ratio that it should be a +# dependent of "check" by default. However, some of us do occasionally +# commit a temporary change that deliberately points to a non-public +# submodule commit, and want to be able to use rules like "make check". +# In that case, run e.g., "make check gl_public_submodule_commit=" +# to disable this test. +gl_public_submodule_commit ?= public-submodule-commit +check: $(gl_public_submodule_commit) + +.PHONY: alpha beta stable +ALL_RECURSIVE_TARGETS += alpha beta stable +alpha beta stable: $(local-check) writable-files $(submodule-checks) + test $@ = stable \ + && { echo $(VERSION) | grep -E '^[0-9]+(\.[0-9]+)+$$' \ + || { echo "invalid version string: $(VERSION)" 1>&2; exit 1;};}\ + || : + $(MAKE) vc-diff-check + $(MAKE) news-check + $(MAKE) distcheck + $(MAKE) dist XZ_OPT=-9ev + $(MAKE) $(release-prep-hook) RELEASE_TYPE=$@ + $(MAKE) -s emit_upload_commands RELEASE_TYPE=$@ + +# Override this in cfg.mk if you follow different procedures. +release-prep-hook ?= release-prep + +gl_noteworthy_news_ = * Noteworthy changes in release ?.? (????-??-??) [?] +.PHONY: release-prep +release-prep: + case $$RELEASE_TYPE in alpha|beta|stable) ;; \ + *) echo "invalid RELEASE_TYPE: $$RELEASE_TYPE" 1>&2; exit 1;; esac + $(MAKE) --no-print-directory -s announcement > ~/announce-$(my_distdir) + if test -d $(release_archive_dir); then \ + ln $(rel-files) $(release_archive_dir); \ + chmod a-w $(rel-files); \ + fi + echo $(VERSION) > $(prev_version_file) + $(MAKE) update-NEWS-hash + perl -pi -e '$$. == 3 and print "$(gl_noteworthy_news_)\n\n\n"' NEWS + $(emit-commit-log) > .ci-msg + $(VC) commit -F .ci-msg -a + rm .ci-msg + +# Override this with e.g., -s $(srcdir)/some_other_name.texi +# if the default $(PACKAGE)-derived name doesn't apply. +gendocs_options_ ?= + +.PHONY: web-manual +web-manual: + @test -z "$(manual_title)" \ + && { echo define manual_title in cfg.mk 1>&2; exit 1; } || : + @cd '$(srcdir)/doc'; \ + $(SHELL) ../$(_build-aux)/gendocs.sh $(gendocs_options_) \ + -o '$(abs_builddir)/doc/manual' \ + --email $(PACKAGE_BUGREPORT) $(PACKAGE) \ + "$(PACKAGE_NAME) - $(manual_title)" + @echo " *** Upload the doc/manual directory to web-cvs." + +# Code Coverage + +init-coverage: + $(MAKE) $(AM_MAKEFLAGS) clean + lcov --directory . --zerocounters + +COVERAGE_CCOPTS ?= "-g --coverage" +COVERAGE_OUT ?= doc/coverage + +build-coverage: + $(MAKE) $(AM_MAKEFLAGS) CFLAGS=$(COVERAGE_CCOPTS) CXXFLAGS=$(COVERAGE_CCOPTS) + $(MAKE) $(AM_MAKEFLAGS) CFLAGS=$(COVERAGE_CCOPTS) CXXFLAGS=$(COVERAGE_CCOPTS) check + mkdir -p $(COVERAGE_OUT) + lcov --directory . --output-file $(COVERAGE_OUT)/$(PACKAGE).info \ + --capture + +gen-coverage: + genhtml --output-directory $(COVERAGE_OUT) \ + $(COVERAGE_OUT)/$(PACKAGE).info \ + --highlight --frames --legend \ + --title "$(PACKAGE_NAME)" + +coverage: init-coverage build-coverage gen-coverage + +# Update gettext files. +PACKAGE ?= $(shell basename $(PWD)) +PO_DOMAIN ?= $(PACKAGE) +POURL = http://translationproject.org/latest/$(PO_DOMAIN)/ +PODIR ?= po +refresh-po: + rm -f $(PODIR)/*.po && \ + echo "$(ME): getting translations into po (please ignore the robots.txt ERROR 404)..." && \ + wget --no-verbose --directory-prefix $(PODIR) --no-directories --recursive --level 1 --accept .po --accept .po.1 $(POURL) && \ + echo 'en@boldquot' > $(PODIR)/LINGUAS && \ + echo 'en@quot' >> $(PODIR)/LINGUAS && \ + ls $(PODIR)/*.po | sed 's/\.po//' | sed 's,$(PODIR)/,,' | sort >> $(PODIR)/LINGUAS + + # Running indent once is not idempotent, but running it twice is. +INDENT_SOURCES ?= $(C_SOURCES) +.PHONY: indent +indent: + indent $(INDENT_SOURCES) + indent $(INDENT_SOURCES) + +# If you want to set UPDATE_COPYRIGHT_* environment variables, +# put the assignments in this variable. +update-copyright-env ?= + +# Run this rule once per year (usually early in January) +# to update all FSF copyright year lists in your project. +# If you have an additional project-specific rule, +# add it in cfg.mk along with a line 'update-copyright: prereq'. +# By default, exclude all variants of COPYING; you can also +# add exemptions (such as ChangeLog..* for rotated change logs) +# in the file .x-update-copyright. +.PHONY: update-copyright +update-copyright: + grep -l -w Copyright \ + $$(export VC_LIST_EXCEPT_DEFAULT=COPYING && $(VC_LIST_EXCEPT)) \ + | $(update-copyright-env) xargs $(srcdir)/$(_build-aux)/$@ + +# This tight_scope test is skipped with a warning if $(_gl_TS_headers) is not +# overridden and $(_gl_TS_dir)/Makefile.am does not mention noinst_HEADERS. + +# NOTE: to override any _gl_TS_* default value, you must +# define the variable(s) using "export" in cfg.mk. +_gl_TS_dir ?= src + +ALL_RECURSIVE_TARGETS += sc_tight_scope +sc_tight_scope: tight-scope.mk + @fail=0; \ + if ! grep '^ *export _gl_TS_headers *=' $(srcdir)/cfg.mk \ + > /dev/null \ + && ! grep -w noinst_HEADERS $(srcdir)/$(_gl_TS_dir)/Makefile.am \ + > /dev/null 2>&1; then \ + echo '$(ME): skipping $@'; \ + else \ + $(MAKE) -s -C $(_gl_TS_dir) \ + -f Makefile \ + -f $(abs_top_srcdir)/cfg.mk \ + -f $(abs_top_builddir)/$< \ + _gl_tight_scope \ + || fail=1; \ + fi; \ + rm -f $<; \ + exit $$fail + +tight-scope.mk: $(ME) + @rm -f $@ $@-t + @perl -ne '/^# TS-start/.../^# TS-end/ and print' $(ME) > $@-t + @chmod a=r $@-t && mv $@-t $@ + +ifeq (a,b) +# TS-start + +# Most functions should have static scope. +# Any that don't must be marked with `extern', but `main' +# and `usage' are exceptions: they're always extern, but +# do not need to be marked. Symbols matching `__.*' are +# reserved by the compiler, so are automatically excluded below. +_gl_TS_unmarked_extern_functions ?= main usage +_gl_TS_function_match ?= /^(?:$(_gl_TS_extern)) +.*?(\S+) *\(/ + +# If your project uses a macro like "XTERN", then put +# the following in cfg.mk to override this default: +# export _gl_TS_extern = extern|XTERN +_gl_TS_extern ?= extern + +# The second nm|grep checks for file-scope variables with `extern' scope. +# Without gnulib's progname module, you might put program_name here. +# Symbols matching `__.*' are reserved by the compiler, +# so are automatically excluded below. +_gl_TS_unmarked_extern_vars ?= + +# NOTE: the _match variables are perl expressions -- not mere regular +# expressions -- so that you can extend them to match other patterns +# and easily extract matched variable names. +# For example, if your project declares some global variables via +# a macro like this: GLOBAL(type, var_name, initializer), then you +# can override this definition to automatically extract those names: +# export _gl_TS_var_match = \ +# /^(?:$(_gl_TS_extern)) .*?\**(\w+)(\[.*?\])?;/ || /\bGLOBAL\(.*?,\s*(.*?),/ +_gl_TS_var_match ?= /^(?:$(_gl_TS_extern)) .*?(\w+)(\[.*?\])?;/ + +# The names of object files in (or relative to) $(_gl_TS_dir). +_gl_TS_obj_files ?= *.$(OBJEXT) + +# Files in which to search for the one-line style extern declarations. +# $(_gl_TS_dir)-relative. +_gl_TS_headers ?= $(noinst_HEADERS) + +.PHONY: _gl_tight_scope +_gl_tight_scope: $(bin_PROGRAMS) + t=exceptions-$$$$; \ + trap 's=$$?; rm -f $$t; exit $$s' 0; \ + for sig in 1 2 3 13 15; do \ + eval "trap 'v=`expr $$sig + 128`; (exit $$v); exit $$v' $$sig"; \ + done; \ + src=`for f in $(SOURCES); do \ + test -f $$f && d= || d=$(srcdir)/; echo $$d$$f; done`; \ + hdr=`for f in $(_gl_TS_headers); do \ + test -f $$f && d= || d=$(srcdir)/; echo $$d$$f; done`; \ + ( printf '^%s$$\n' '__.*' $(_gl_TS_unmarked_extern_functions); \ + grep -h -A1 '^extern .*[^;]$$' $$src \ + | grep -vE '^(extern |--)' | sed 's/ .*//'; \ + perl -lne \ + '$(_gl_TS_function_match) and print "^$$1\$$"' $$hdr; \ + ) | sort -u > $$t; \ + nm -e $(_gl_TS_obj_files) | sed -n 's/.* T //p'|grep -Ev -f $$t \ + && { echo the above functions should have static scope >&2; \ + exit 1; } || : ; \ + ( printf '^%s$$\n' '__.*' $(_gl_TS_unmarked_extern_vars); \ + perl -lne '$(_gl_TS_var_match) and print "^$$1\$$"' $$hdr *.h \ + ) | sort -u > $$t; \ + nm -e $(_gl_TS_obj_files) | sed -n 's/.* [BCDGRS] //p' \ + | sort -u | grep -Ev -f $$t \ + && { echo the above variables should have static scope >&2; \ + exit 1; } || : +# TS-end +endif