diff --git a/demo/gtk-libfprint-test.c b/demo/gtk-libfprint-test.c index c460e14..c6dd90e 100644 --- a/demo/gtk-libfprint-test.c +++ b/demo/gtk-libfprint-test.c @@ -22,35 +22,36 @@ #include #include -typedef GtkApplication LibfprintDemo; +typedef GtkApplication LibfprintDemo; typedef GtkApplicationClass LibfprintDemoClass; G_DEFINE_TYPE (LibfprintDemo, libfprint_demo, GTK_TYPE_APPLICATION) typedef enum { - IMAGE_DISPLAY_NONE = 0, - IMAGE_DISPLAY_MINUTIAE = 1 << 0, - IMAGE_DISPLAY_BINARY = 1 << 1 + IMAGE_DISPLAY_NONE = 0, + IMAGE_DISPLAY_MINUTIAE = 1 << 0, + IMAGE_DISPLAY_BINARY = 1 << 1 } ImageDisplayFlags; -typedef struct { - GtkApplicationWindow parent_instance; +typedef struct +{ + GtkApplicationWindow parent_instance; - GtkWidget *header_bar; - GtkWidget *mode_stack; - GtkWidget *capture_button; - GtkWidget *cancel_button; - GtkWidget *capture_image; - GtkWidget *spinner; - GtkWidget *instructions; + GtkWidget *header_bar; + GtkWidget *mode_stack; + GtkWidget *capture_button; + GtkWidget *cancel_button; + GtkWidget *capture_image; + GtkWidget *spinner; + GtkWidget *instructions; - GCancellable *cancellable; + GCancellable *cancellable; - gboolean opened; - FpDevice *dev; + gboolean opened; + FpDevice *dev; - FpImage *img; - ImageDisplayFlags img_flags; + FpImage *img; + ImageDisplayFlags img_flags; } LibfprintDemoWindow; typedef GtkApplicationWindowClass LibfprintDemoWindowClass; @@ -58,483 +59,506 @@ typedef GtkApplicationWindowClass LibfprintDemoWindowClass; G_DEFINE_TYPE (LibfprintDemoWindow, libfprint_demo_window, GTK_TYPE_APPLICATION_WINDOW) typedef enum { - EMPTY_MODE, - NOIMAGING_MODE, - CAPTURE_MODE, - SPINNER_MODE, - ERROR_MODE, - RETRY_MODE + EMPTY_MODE, + NOIMAGING_MODE, + CAPTURE_MODE, + SPINNER_MODE, + ERROR_MODE, + RETRY_MODE } LibfprintDemoMode; static void libfprint_demo_set_mode (LibfprintDemoWindow *win, - LibfprintDemoMode mode); + LibfprintDemoMode mode); static unsigned char * img_to_rgbdata (const guint8 *imgdata, - int width, - int height) + int width, + int height) { - int size = width * height; - guint8 *rgbdata = g_malloc (size * 3); - size_t i; - size_t rgb_offset = 0; + int size = width * height; + guint8 *rgbdata = g_malloc (size * 3); + size_t i; + size_t rgb_offset = 0; - for (i = 0; i < size; i++) { - guint8 pixel = imgdata[i]; + for (i = 0; i < size; i++) + { + guint8 pixel = imgdata[i]; - rgbdata[rgb_offset++] = pixel; - rgbdata[rgb_offset++] = pixel; - rgbdata[rgb_offset++] = pixel; - } + rgbdata[rgb_offset++] = pixel; + rgbdata[rgb_offset++] = pixel; + rgbdata[rgb_offset++] = pixel; + } - return rgbdata; + return rgbdata; } static void -plot_minutiae (unsigned char *rgbdata, - int width, - int height, - GPtrArray *minutiae) +plot_minutiae (unsigned char *rgbdata, + int width, + int height, + GPtrArray *minutiae) { - int i; + int i; + #define write_pixel(num) do { \ - rgbdata[((num) * 3)] = 0xff; \ - rgbdata[((num) * 3) + 1] = 0; \ - rgbdata[((num) * 3) + 2] = 0; \ - } while(0) + rgbdata[((num) * 3)] = 0xff; \ + rgbdata[((num) * 3) + 1] = 0; \ + rgbdata[((num) * 3) + 2] = 0; \ + } while(0) - for (i = 0; i < minutiae->len; i++) { - struct fp_minutia *min = g_ptr_array_index (minutiae, i); - int x, y; - size_t pixel_offset; + for (i = 0; i < minutiae->len; i++) + { + struct fp_minutia *min = g_ptr_array_index (minutiae, i); + int x, y; + size_t pixel_offset; - fp_minutia_get_coords(min, &x, &y); - pixel_offset = (y * width) + x; - write_pixel(pixel_offset - 2); - write_pixel(pixel_offset - 1); - write_pixel(pixel_offset); - write_pixel(pixel_offset + 1); - write_pixel(pixel_offset + 2); + fp_minutia_get_coords (min, &x, &y); + pixel_offset = (y * width) + x; + write_pixel (pixel_offset - 2); + write_pixel (pixel_offset - 1); + write_pixel (pixel_offset); + write_pixel (pixel_offset + 1); + write_pixel (pixel_offset + 2); - write_pixel(pixel_offset - (width * 2)); - write_pixel(pixel_offset - (width * 1) - 1); - write_pixel(pixel_offset - (width * 1)); - write_pixel(pixel_offset - (width * 1) + 1); - write_pixel(pixel_offset + (width * 1) - 1); - write_pixel(pixel_offset + (width * 1)); - write_pixel(pixel_offset + (width * 1) + 1); - write_pixel(pixel_offset + (width * 2)); - } + write_pixel (pixel_offset - (width * 2)); + write_pixel (pixel_offset - (width * 1) - 1); + write_pixel (pixel_offset - (width * 1)); + write_pixel (pixel_offset - (width * 1) + 1); + write_pixel (pixel_offset + (width * 1) - 1); + write_pixel (pixel_offset + (width * 1)); + write_pixel (pixel_offset + (width * 1) + 1); + write_pixel (pixel_offset + (width * 2)); + } } static GdkPixbuf * -img_to_pixbuf (FpImage *img, - ImageDisplayFlags flags) +img_to_pixbuf (FpImage *img, + ImageDisplayFlags flags) { - int width; - int height; - const guint8 *data; - unsigned char *rgbdata; + int width; + int height; + const guint8 *data; + unsigned char *rgbdata; - width = fp_image_get_width (img); - height = fp_image_get_height (img); + width = fp_image_get_width (img); + height = fp_image_get_height (img); - if (flags & IMAGE_DISPLAY_BINARY) - data = fp_image_get_binarized (img, NULL); - else - data = fp_image_get_data (img, NULL); + if (flags & IMAGE_DISPLAY_BINARY) + data = fp_image_get_binarized (img, NULL); + else + data = fp_image_get_data (img, NULL); - if (!data) - return NULL; + if (!data) + return NULL; - rgbdata = img_to_rgbdata (data, width, height); + rgbdata = img_to_rgbdata (data, width, height); - if (flags & IMAGE_DISPLAY_MINUTIAE) { - GPtrArray *minutiae; + if (flags & IMAGE_DISPLAY_MINUTIAE) + { + GPtrArray *minutiae; - minutiae = fp_image_get_minutiae (img); - plot_minutiae (rgbdata, width, height, minutiae); - } + minutiae = fp_image_get_minutiae (img); + plot_minutiae (rgbdata, width, height, minutiae); + } - return gdk_pixbuf_new_from_data (rgbdata, GDK_COLORSPACE_RGB, - FALSE, 8, width, height, - width * 3, (GdkPixbufDestroyNotify) g_free, - NULL); + return gdk_pixbuf_new_from_data (rgbdata, GDK_COLORSPACE_RGB, + FALSE, 8, width, height, + width * 3, (GdkPixbufDestroyNotify) g_free, + NULL); } static void update_image (LibfprintDemoWindow *win) { - GdkPixbuf *pixbuf; + GdkPixbuf *pixbuf; - if (win->img == NULL) { - gtk_image_clear (GTK_IMAGE (win->capture_image)); - return; - } + if (win->img == NULL) + { + gtk_image_clear (GTK_IMAGE (win->capture_image)); + return; + } - g_debug ("Updating image, minutiae %s, binary mode %s", - win->img_flags & IMAGE_DISPLAY_MINUTIAE ? "shown" : "hidden", - win->img_flags & IMAGE_DISPLAY_BINARY ? "on" : "off"); - pixbuf = img_to_pixbuf (win->img, win->img_flags); - gtk_image_set_from_pixbuf (GTK_IMAGE (win->capture_image), pixbuf); - g_object_unref (pixbuf); + g_debug ("Updating image, minutiae %s, binary mode %s", + win->img_flags & IMAGE_DISPLAY_MINUTIAE ? "shown" : "hidden", + win->img_flags & IMAGE_DISPLAY_BINARY ? "on" : "off"); + pixbuf = img_to_pixbuf (win->img, win->img_flags); + gtk_image_set_from_pixbuf (GTK_IMAGE (win->capture_image), pixbuf); + g_object_unref (pixbuf); } static void libfprint_demo_set_spinner_label (LibfprintDemoWindow *win, - const char *message) + const char *message) { - char *label; + char *label; - label = g_strdup_printf ("%s", message); - gtk_label_set_markup (GTK_LABEL (win->instructions), label); - g_free (label); + label = g_strdup_printf ("%s", message); + gtk_label_set_markup (GTK_LABEL (win->instructions), label); + g_free (label); } static void libfprint_demo_set_capture_label (LibfprintDemoWindow *win) { - FpScanType scan_type; - const char *message; + FpScanType scan_type; + const char *message; - scan_type = fp_device_get_scan_type(win->dev); + scan_type = fp_device_get_scan_type (win->dev); - switch (scan_type) { - case FP_SCAN_TYPE_PRESS: - message = "Place your finger on the fingerprint reader"; - break; - case FP_SCAN_TYPE_SWIPE: - message = "Swipe your finger across the fingerprint reader"; - break; - default: - g_assert_not_reached (); - } + switch (scan_type) + { + case FP_SCAN_TYPE_PRESS: + message = "Place your finger on the fingerprint reader"; + break; - libfprint_demo_set_spinner_label (win, message); + case FP_SCAN_TYPE_SWIPE: + message = "Swipe your finger across the fingerprint reader"; + break; + + default: + g_assert_not_reached (); + } + + libfprint_demo_set_spinner_label (win, message); } static void -dev_capture_start_cb (FpDevice *dev, - GAsyncResult *res, - void *user_data) +dev_capture_start_cb (FpDevice *dev, + GAsyncResult *res, + void *user_data) { - g_autoptr(GError) error = NULL; - LibfprintDemoWindow *win = user_data; - FpImage *image = NULL; + g_autoptr(GError) error = NULL; + LibfprintDemoWindow *win = user_data; + FpImage *image = NULL; - g_clear_object (&win->cancellable); + g_clear_object (&win->cancellable); - image = fp_device_capture_finish (dev, res, &error); - if (!image) { - g_warning ("Error capturing data: %s", error->message); - if (error->domain == FP_DEVICE_RETRY || - g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - libfprint_demo_set_mode (win, RETRY_MODE); - else - libfprint_demo_set_mode (win, ERROR_MODE); - return; - } + image = fp_device_capture_finish (dev, res, &error); + if (!image) + { + g_warning ("Error capturing data: %s", error->message); + if (error->domain == FP_DEVICE_RETRY || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + libfprint_demo_set_mode (win, RETRY_MODE); + else + libfprint_demo_set_mode (win, ERROR_MODE); + return; + } - g_clear_object (&win->img); - win->img = image; - update_image (win); + g_clear_object (&win->img); + win->img = image; + update_image (win); - libfprint_demo_set_mode (win, CAPTURE_MODE); + libfprint_demo_set_mode (win, CAPTURE_MODE); } static void dev_start_capture (LibfprintDemoWindow *win) { - libfprint_demo_set_capture_label (win); + libfprint_demo_set_capture_label (win); - fp_device_capture (win->dev, TRUE, win->cancellable, (GAsyncReadyCallback) dev_capture_start_cb, win); + fp_device_capture (win->dev, TRUE, win->cancellable, (GAsyncReadyCallback) dev_capture_start_cb, win); } static void dev_open_cb (FpDevice *dev, GAsyncResult *res, void *user_data) { - LibfprintDemoWindow *win = user_data; - g_autoptr(GError) error = NULL; + LibfprintDemoWindow *win = user_data; - if (!fp_device_open_finish (dev, res, &error)) { - g_warning ("Failed to open device: %s", error->message); - libfprint_demo_set_mode (win, ERROR_MODE); - return; - } + g_autoptr(GError) error = NULL; - dev_start_capture(win); + if (!fp_device_open_finish (dev, res, &error)) + { + g_warning ("Failed to open device: %s", error->message); + libfprint_demo_set_mode (win, ERROR_MODE); + return; + } + + dev_start_capture (win); } static void activate_capture (GSimpleAction *action, - GVariant *parameter, - gpointer user_data) + GVariant *parameter, + gpointer user_data) { - LibfprintDemoWindow *win = user_data; + LibfprintDemoWindow *win = user_data; - libfprint_demo_set_mode (win, SPINNER_MODE); - g_clear_pointer (&win->img, g_object_unref); + libfprint_demo_set_mode (win, SPINNER_MODE); + g_clear_pointer (&win->img, g_object_unref); - g_clear_object (&win->cancellable); - win->cancellable = g_cancellable_new (); + g_clear_object (&win->cancellable); + win->cancellable = g_cancellable_new (); - if (win->opened) { - dev_start_capture (win); - return; - } + if (win->opened) + { + dev_start_capture (win); + return; + } - libfprint_demo_set_spinner_label (win, "Opening fingerprint reader"); + libfprint_demo_set_spinner_label (win, "Opening fingerprint reader"); - win->opened = TRUE; - fp_device_open (win->dev, win->cancellable, (GAsyncReadyCallback) dev_open_cb, user_data); + win->opened = TRUE; + fp_device_open (win->dev, win->cancellable, (GAsyncReadyCallback) dev_open_cb, user_data); } static void cancel_capture (GSimpleAction *action, - GVariant *parameter, - gpointer user_data) + GVariant *parameter, + gpointer user_data) { - LibfprintDemoWindow *win = user_data; + LibfprintDemoWindow *win = user_data; - g_debug ("cancelling %p", win->cancellable); + g_debug ("cancelling %p", win->cancellable); - if (win->cancellable) - g_cancellable_cancel (win->cancellable); + if (win->cancellable) + g_cancellable_cancel (win->cancellable); } static void activate_quit (GSimpleAction *action, - GVariant *parameter, - gpointer user_data) + GVariant *parameter, + gpointer user_data) { - GtkApplication *app = user_data; - GtkWidget *win; - GList *list, *next; + GtkApplication *app = user_data; + GtkWidget *win; + GList *list, *next; - list = gtk_application_get_windows (app); - while (list) - { - win = list->data; - next = list->next; + list = gtk_application_get_windows (app); + while (list) + { + win = list->data; + next = list->next; - gtk_widget_destroy (GTK_WIDGET (win)); + gtk_widget_destroy (GTK_WIDGET (win)); - list = next; - } + list = next; + } } static void activate_show_minutiae (GSimpleAction *action, - GVariant *parameter, - gpointer user_data) + GVariant *parameter, + gpointer user_data) { - LibfprintDemoWindow *win = user_data; - GVariant *state; - gboolean new_state; + LibfprintDemoWindow *win = user_data; + GVariant *state; + gboolean new_state; - state = g_action_get_state (G_ACTION (action)); - new_state = !g_variant_get_boolean (state); - g_action_change_state (G_ACTION (action), g_variant_new_boolean (new_state)); - g_variant_unref (state); + state = g_action_get_state (G_ACTION (action)); + new_state = !g_variant_get_boolean (state); + g_action_change_state (G_ACTION (action), g_variant_new_boolean (new_state)); + g_variant_unref (state); - if (new_state) - win->img_flags |= IMAGE_DISPLAY_MINUTIAE; - else - win->img_flags &= ~IMAGE_DISPLAY_MINUTIAE; + if (new_state) + win->img_flags |= IMAGE_DISPLAY_MINUTIAE; + else + win->img_flags &= ~IMAGE_DISPLAY_MINUTIAE; - update_image (win); + update_image (win); } static void activate_show_binary (GSimpleAction *action, - GVariant *parameter, - gpointer user_data) + GVariant *parameter, + gpointer user_data) { - LibfprintDemoWindow *win = user_data; - GVariant *state; - gboolean new_state; + LibfprintDemoWindow *win = user_data; + GVariant *state; + gboolean new_state; - state = g_action_get_state (G_ACTION (action)); - new_state = !g_variant_get_boolean (state); - g_action_change_state (G_ACTION (action), g_variant_new_boolean (new_state)); - g_variant_unref (state); + state = g_action_get_state (G_ACTION (action)); + new_state = !g_variant_get_boolean (state); + g_action_change_state (G_ACTION (action), g_variant_new_boolean (new_state)); + g_variant_unref (state); - if (new_state) - win->img_flags |= IMAGE_DISPLAY_BINARY; - else - win->img_flags &= ~IMAGE_DISPLAY_BINARY; + if (new_state) + win->img_flags |= IMAGE_DISPLAY_BINARY; + else + win->img_flags &= ~IMAGE_DISPLAY_BINARY; - update_image (win); + update_image (win); } static void change_show_minutiae_state (GSimpleAction *action, - GVariant *state, - gpointer user_data) + GVariant *state, + gpointer user_data) { - g_simple_action_set_state (action, state); + g_simple_action_set_state (action, state); } static void change_show_binary_state (GSimpleAction *action, - GVariant *state, - gpointer user_data) + GVariant *state, + gpointer user_data) { - g_simple_action_set_state (action, state); + g_simple_action_set_state (action, state); } static GActionEntry app_entries[] = { - { "quit", activate_quit, NULL, NULL, NULL }, + { "quit", activate_quit, NULL, NULL, NULL }, }; static GActionEntry win_entries[] = { - { "show-minutiae", activate_show_minutiae, NULL, "false", change_show_minutiae_state }, - { "show-binary", activate_show_binary, NULL, "false", change_show_binary_state }, - { "capture", activate_capture, NULL, NULL, NULL }, - { "cancel", cancel_capture, NULL, NULL, NULL } + { "show-minutiae", activate_show_minutiae, NULL, "false", change_show_minutiae_state }, + { "show-binary", activate_show_binary, NULL, "false", change_show_binary_state }, + { "capture", activate_capture, NULL, NULL, NULL }, + { "cancel", cancel_capture, NULL, NULL, NULL } }; static void activate (GApplication *app) { - LibfprintDemoWindow *window; + LibfprintDemoWindow *window; - window = g_object_new (libfprint_demo_window_get_type (), - "application", app, - NULL); - gtk_widget_show (GTK_WIDGET (window)); + window = g_object_new (libfprint_demo_window_get_type (), + "application", app, + NULL); + gtk_widget_show (GTK_WIDGET (window)); } static void libfprint_demo_set_mode (LibfprintDemoWindow *win, - LibfprintDemoMode mode) + LibfprintDemoMode mode) { - char *title; + char *title; - switch (mode) { - case EMPTY_MODE: - gtk_stack_set_visible_child_name (GTK_STACK (win->mode_stack), "empty-mode"); - gtk_widget_set_sensitive (win->capture_button, FALSE); - gtk_widget_set_sensitive (win->cancel_button, FALSE); - gtk_spinner_stop (GTK_SPINNER (win->spinner)); - break; - case NOIMAGING_MODE: - gtk_stack_set_visible_child_name (GTK_STACK (win->mode_stack), "noimaging-mode"); - gtk_widget_set_sensitive (win->capture_button, FALSE); - gtk_widget_set_sensitive (win->cancel_button, FALSE); - gtk_spinner_stop (GTK_SPINNER (win->spinner)); - break; - case CAPTURE_MODE: - gtk_stack_set_visible_child_name (GTK_STACK (win->mode_stack), "capture-mode"); - gtk_widget_set_sensitive (win->capture_button, TRUE); - gtk_widget_set_sensitive (win->cancel_button, FALSE); + switch (mode) + { + case EMPTY_MODE: + gtk_stack_set_visible_child_name (GTK_STACK (win->mode_stack), "empty-mode"); + gtk_widget_set_sensitive (win->capture_button, FALSE); + gtk_widget_set_sensitive (win->cancel_button, FALSE); + gtk_spinner_stop (GTK_SPINNER (win->spinner)); + break; - title = g_strdup_printf ("%s Test", fp_device_get_name (win->dev)); - gtk_header_bar_set_title (GTK_HEADER_BAR (win->header_bar), title); - g_free (title); + case NOIMAGING_MODE: + gtk_stack_set_visible_child_name (GTK_STACK (win->mode_stack), "noimaging-mode"); + gtk_widget_set_sensitive (win->capture_button, FALSE); + gtk_widget_set_sensitive (win->cancel_button, FALSE); + gtk_spinner_stop (GTK_SPINNER (win->spinner)); + break; - gtk_spinner_stop (GTK_SPINNER (win->spinner)); - break; - case SPINNER_MODE: - gtk_stack_set_visible_child_name (GTK_STACK (win->mode_stack), "spinner-mode"); - gtk_widget_set_sensitive (win->capture_button, FALSE); - gtk_widget_set_sensitive (win->cancel_button, TRUE); - gtk_spinner_start (GTK_SPINNER (win->spinner)); - break; - case ERROR_MODE: - gtk_stack_set_visible_child_name (GTK_STACK (win->mode_stack), "error-mode"); - gtk_widget_set_sensitive (win->capture_button, FALSE); - gtk_widget_set_sensitive (win->cancel_button, FALSE); - gtk_spinner_stop (GTK_SPINNER (win->spinner)); - break; - case RETRY_MODE: - gtk_stack_set_visible_child_name (GTK_STACK (win->mode_stack), "retry-mode"); - gtk_widget_set_sensitive (win->capture_button, TRUE); - gtk_widget_set_sensitive (win->cancel_button, FALSE); - gtk_spinner_stop (GTK_SPINNER (win->spinner)); - break; - default: - g_assert_not_reached (); - } + case CAPTURE_MODE: + gtk_stack_set_visible_child_name (GTK_STACK (win->mode_stack), "capture-mode"); + gtk_widget_set_sensitive (win->capture_button, TRUE); + gtk_widget_set_sensitive (win->cancel_button, FALSE); + + title = g_strdup_printf ("%s Test", fp_device_get_name (win->dev)); + gtk_header_bar_set_title (GTK_HEADER_BAR (win->header_bar), title); + g_free (title); + + gtk_spinner_stop (GTK_SPINNER (win->spinner)); + break; + + case SPINNER_MODE: + gtk_stack_set_visible_child_name (GTK_STACK (win->mode_stack), "spinner-mode"); + gtk_widget_set_sensitive (win->capture_button, FALSE); + gtk_widget_set_sensitive (win->cancel_button, TRUE); + gtk_spinner_start (GTK_SPINNER (win->spinner)); + break; + + case ERROR_MODE: + gtk_stack_set_visible_child_name (GTK_STACK (win->mode_stack), "error-mode"); + gtk_widget_set_sensitive (win->capture_button, FALSE); + gtk_widget_set_sensitive (win->cancel_button, FALSE); + gtk_spinner_stop (GTK_SPINNER (win->spinner)); + break; + + case RETRY_MODE: + gtk_stack_set_visible_child_name (GTK_STACK (win->mode_stack), "retry-mode"); + gtk_widget_set_sensitive (win->capture_button, TRUE); + gtk_widget_set_sensitive (win->cancel_button, FALSE); + gtk_spinner_stop (GTK_SPINNER (win->spinner)); + break; + + default: + g_assert_not_reached (); + } } static void libfprint_demo_init (LibfprintDemo *app) { - g_action_map_add_action_entries (G_ACTION_MAP (app), - app_entries, G_N_ELEMENTS (app_entries), - app); + g_action_map_add_action_entries (G_ACTION_MAP (app), + app_entries, G_N_ELEMENTS (app_entries), + app); } static void libfprint_demo_class_init (LibfprintDemoClass *class) { - GApplicationClass *app_class = G_APPLICATION_CLASS (class); + GApplicationClass *app_class = G_APPLICATION_CLASS (class); - app_class->activate = activate; + app_class->activate = activate; } static void libfprint_demo_window_init (LibfprintDemoWindow *window) { - FpContext *ctx; - GPtrArray *devices; + FpContext *ctx; + GPtrArray *devices; - gtk_widget_init_template (GTK_WIDGET (window)); - gtk_window_set_default_size (GTK_WINDOW (window), 700, 500); + gtk_widget_init_template (GTK_WIDGET (window)); + gtk_window_set_default_size (GTK_WINDOW (window), 700, 500); - g_action_map_add_action_entries (G_ACTION_MAP (window), - win_entries, G_N_ELEMENTS (win_entries), - window); + g_action_map_add_action_entries (G_ACTION_MAP (window), + win_entries, G_N_ELEMENTS (win_entries), + window); - ctx = fp_context_new (); + ctx = fp_context_new (); - devices = fp_context_get_devices(ctx); - if (!devices) { - libfprint_demo_set_mode (window, ERROR_MODE); - return; - } + devices = fp_context_get_devices (ctx); + if (!devices) + { + libfprint_demo_set_mode (window, ERROR_MODE); + return; + } - /* Empty list? */ - if (devices->len == 0) { - libfprint_demo_set_mode (window, EMPTY_MODE); - return; - } + /* Empty list? */ + if (devices->len == 0) + { + libfprint_demo_set_mode (window, EMPTY_MODE); + return; + } - if (!fp_device_supports_capture(g_ptr_array_index (devices, 0))) { - libfprint_demo_set_mode (window, NOIMAGING_MODE); - return; - } + if (!fp_device_supports_capture (g_ptr_array_index (devices, 0))) + { + libfprint_demo_set_mode (window, NOIMAGING_MODE); + return; + } - window->dev = g_object_ref (g_ptr_array_index (devices, 0)); - libfprint_demo_set_mode (window, CAPTURE_MODE); + window->dev = g_object_ref (g_ptr_array_index (devices, 0)); + libfprint_demo_set_mode (window, CAPTURE_MODE); } static void libfprint_demo_window_class_init (LibfprintDemoWindowClass *class) { - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); - gtk_widget_class_set_template_from_resource (widget_class, "/libfprint_demo/gtk-libfprint-test.ui"); - gtk_widget_class_bind_template_child (widget_class, LibfprintDemoWindow, header_bar); - gtk_widget_class_bind_template_child (widget_class, LibfprintDemoWindow, mode_stack); - gtk_widget_class_bind_template_child (widget_class, LibfprintDemoWindow, capture_button); - gtk_widget_class_bind_template_child (widget_class, LibfprintDemoWindow, cancel_button); - gtk_widget_class_bind_template_child (widget_class, LibfprintDemoWindow, capture_image); - gtk_widget_class_bind_template_child (widget_class, LibfprintDemoWindow, spinner); - gtk_widget_class_bind_template_child (widget_class, LibfprintDemoWindow, instructions); + gtk_widget_class_set_template_from_resource (widget_class, "/libfprint_demo/gtk-libfprint-test.ui"); + gtk_widget_class_bind_template_child (widget_class, LibfprintDemoWindow, header_bar); + gtk_widget_class_bind_template_child (widget_class, LibfprintDemoWindow, mode_stack); + gtk_widget_class_bind_template_child (widget_class, LibfprintDemoWindow, capture_button); + gtk_widget_class_bind_template_child (widget_class, LibfprintDemoWindow, cancel_button); + gtk_widget_class_bind_template_child (widget_class, LibfprintDemoWindow, capture_image); + gtk_widget_class_bind_template_child (widget_class, LibfprintDemoWindow, spinner); + gtk_widget_class_bind_template_child (widget_class, LibfprintDemoWindow, instructions); - //FIXME setup dispose + //FIXME setup dispose } -int main (int argc, char **argv) +int +main (int argc, char **argv) { - GtkApplication *app; + GtkApplication *app; - app = GTK_APPLICATION (g_object_new (libfprint_demo_get_type (), - "application-id", "org.freedesktop.libfprint.Demo", - "flags", G_APPLICATION_FLAGS_NONE, - NULL)); + app = GTK_APPLICATION (g_object_new (libfprint_demo_get_type (), + "application-id", "org.freedesktop.libfprint.Demo", + "flags", G_APPLICATION_FLAGS_NONE, + NULL)); - return g_application_run (G_APPLICATION (app), 0, NULL); + return g_application_run (G_APPLICATION (app), 0, NULL); } diff --git a/examples/enroll.c b/examples/enroll.c index 7542f30..81535f2 100644 --- a/examples/enroll.c +++ b/examples/enroll.c @@ -24,155 +24,171 @@ #include "storage.h" -typedef struct _EnrollData { - GMainLoop *loop; - int ret_value; +typedef struct _EnrollData +{ + GMainLoop *loop; + int ret_value; } EnrollData; static void enroll_data_free (EnrollData *enroll_data) { - g_main_loop_unref (enroll_data->loop); - g_free (enroll_data); + g_main_loop_unref (enroll_data->loop); + g_free (enroll_data); } G_DEFINE_AUTOPTR_CLEANUP_FUNC (EnrollData, enroll_data_free) -FpDevice *discover_device (GPtrArray *devices) +FpDevice *discover_device (GPtrArray * devices) { - FpDevice *dev; - if (!devices->len) - return NULL; + FpDevice *dev; - dev = g_ptr_array_index (devices, 0); - printf("Found device claimed by %s driver\n", fp_device_get_driver (dev)); - return dev; + if (!devices->len) + return NULL; + + dev = g_ptr_array_index (devices, 0); + printf ("Found device claimed by %s driver\n", fp_device_get_driver (dev)); + return dev; } static void -on_device_closed (FpDevice *dev, GAsyncResult *res, void *user_data) { - EnrollData *enroll_data = user_data; - g_autoptr(GError) error = NULL; +on_device_closed (FpDevice *dev, GAsyncResult *res, void *user_data) +{ + EnrollData *enroll_data = user_data; - fp_device_close_finish (dev, res, &error); + g_autoptr(GError) error = NULL; - if (error) - g_warning ("Failed closing device %s\n", error->message); + fp_device_close_finish (dev, res, &error); - g_main_loop_quit (enroll_data->loop); + if (error) + g_warning ("Failed closing device %s\n", error->message); + + g_main_loop_quit (enroll_data->loop); } static void -on_enroll_completed (FpDevice *dev, GAsyncResult *res, void *user_data) { - EnrollData *enroll_data = user_data; - g_autoptr(FpPrint) print = NULL; - g_autoptr(GError) error = NULL; +on_enroll_completed (FpDevice *dev, GAsyncResult *res, void *user_data) +{ + EnrollData *enroll_data = user_data; - print = fp_device_enroll_finish (dev, res, &error); + g_autoptr(FpPrint) print = NULL; + g_autoptr(GError) error = NULL; - if (!error) { - enroll_data->ret_value = EXIT_SUCCESS; + print = fp_device_enroll_finish (dev, res, &error); - if (!fp_device_has_storage (dev)) { - g_debug("Device has not storage, saving locally"); - int r = print_data_save(print, FP_FINGER_RIGHT_INDEX); - if (r < 0) { - g_warning("Data save failed, code %d", r); - enroll_data->ret_value = EXIT_FAILURE; - } - } - } else { - g_warning("Enroll failed with error %s\n", error->message); - } + if (!error) + { + enroll_data->ret_value = EXIT_SUCCESS; - fp_device_close (dev, NULL, (GAsyncReadyCallback) on_device_closed, - enroll_data); + if (!fp_device_has_storage (dev)) + { + g_debug ("Device has not storage, saving locally"); + int r = print_data_save (print, FP_FINGER_RIGHT_INDEX); + if (r < 0) + { + g_warning ("Data save failed, code %d", r); + enroll_data->ret_value = EXIT_FAILURE; + } + } + } + else + { + g_warning ("Enroll failed with error %s\n", error->message); + } + + fp_device_close (dev, NULL, (GAsyncReadyCallback) on_device_closed, + enroll_data); } static void on_enroll_progress (FpDevice *device, - gint completed_stages, - FpPrint *print, - gpointer user_data, - GError *error) + gint completed_stages, + FpPrint *print, + gpointer user_data, + GError *error) { - if (error) { - g_warning ("Enroll stage %d of %d failed with error %s", - completed_stages, - fp_device_get_nr_enroll_stages (device), - error->message); - return; - } + if (error) + { + g_warning ("Enroll stage %d of %d failed with error %s", + completed_stages, + fp_device_get_nr_enroll_stages (device), + error->message); + return; + } - if (fp_device_supports_capture (device) && - print_image_save (print, "enrolled.pgm")) { - printf ("Wrote scanned image to enrolled.pgm\n"); - } + if (fp_device_supports_capture (device) && + print_image_save (print, "enrolled.pgm")) + printf ("Wrote scanned image to enrolled.pgm\n"); - printf ("Enroll stage %d of %d passed. Yay!\n", completed_stages, - fp_device_get_nr_enroll_stages (device)); + printf ("Enroll stage %d of %d passed. Yay!\n", completed_stages, + fp_device_get_nr_enroll_stages (device)); } static void on_device_opened (FpDevice *dev, GAsyncResult *res, void *user_data) { - EnrollData *enroll_data = user_data; - FpPrint *print_template; - g_autoptr(GError) error = NULL; + EnrollData *enroll_data = user_data; + FpPrint *print_template; - if (!fp_device_open_finish (dev, res, &error)) { - g_warning ("Failed to open device: %s", error->message); - g_main_loop_quit (enroll_data->loop); - return; - } + g_autoptr(GError) error = NULL; - printf ("Opened device. It's now time to enroll your finger.\n\n"); - printf ("You will need to successfully scan your finger %d times to " - "complete the process.\n\n", fp_device_get_nr_enroll_stages (dev)); - printf ("Scan your finger now.\n"); + if (!fp_device_open_finish (dev, res, &error)) + { + g_warning ("Failed to open device: %s", error->message); + g_main_loop_quit (enroll_data->loop); + return; + } - print_template = print_create_template (dev, FP_FINGER_RIGHT_INDEX); - fp_device_enroll (dev, print_template, NULL, on_enroll_progress, NULL, - NULL, (GAsyncReadyCallback) on_enroll_completed, - enroll_data); + printf ("Opened device. It's now time to enroll your finger.\n\n"); + printf ("You will need to successfully scan your finger %d times to " + "complete the process.\n\n", fp_device_get_nr_enroll_stages (dev)); + printf ("Scan your finger now.\n"); + + print_template = print_create_template (dev, FP_FINGER_RIGHT_INDEX); + fp_device_enroll (dev, print_template, NULL, on_enroll_progress, NULL, + NULL, (GAsyncReadyCallback) on_enroll_completed, + enroll_data); } -int main(void) +int +main (void) { - g_autoptr (FpContext) ctx = NULL; - g_autoptr (EnrollData) enroll_data = NULL; - GPtrArray *devices; - FpDevice *dev; + g_autoptr(FpContext) ctx = NULL; + g_autoptr(EnrollData) enroll_data = NULL; + GPtrArray *devices; + FpDevice *dev; - printf("This program will enroll your right index finger, " - "unconditionally overwriting any right-index print that was enrolled " - "previously. If you want to continue, press enter, otherwise hit " - "Ctrl+C\n"); - getchar(); + printf ("This program will enroll your right index finger, " + "unconditionally overwriting any right-index print that was enrolled " + "previously. If you want to continue, press enter, otherwise hit " + "Ctrl+C\n"); + getchar (); - setenv ("G_MESSAGES_DEBUG", "all", 0); + setenv ("G_MESSAGES_DEBUG", "all", 0); - ctx = fp_context_new (); + ctx = fp_context_new (); - devices = fp_context_get_devices (ctx); - if (!devices) { - g_warning("Impossible to get devices"); - return EXIT_FAILURE; - } + devices = fp_context_get_devices (ctx); + if (!devices) + { + g_warning ("Impossible to get devices"); + return EXIT_FAILURE; + } - dev = discover_device (devices); - if (!dev) { - g_warning("No devices detected."); - return EXIT_FAILURE; - } + dev = discover_device (devices); + if (!dev) + { + g_warning ("No devices detected."); + return EXIT_FAILURE; + } - enroll_data = g_new0 (EnrollData, 1); - enroll_data->ret_value = EXIT_FAILURE; - enroll_data->loop = g_main_loop_new (NULL, FALSE); + enroll_data = g_new0 (EnrollData, 1); + enroll_data->ret_value = EXIT_FAILURE; + enroll_data->loop = g_main_loop_new (NULL, FALSE); - fp_device_open (dev, NULL, (GAsyncReadyCallback) on_device_opened, - enroll_data); + fp_device_open (dev, NULL, (GAsyncReadyCallback) on_device_opened, + enroll_data); - g_main_loop_run (enroll_data->loop); + g_main_loop_run (enroll_data->loop); - return enroll_data->ret_value; + return enroll_data->ret_value; } diff --git a/examples/manage-prints.c b/examples/manage-prints.c index 9e6696a..16ab54f 100644 --- a/examples/manage-prints.c +++ b/examples/manage-prints.c @@ -122,8 +122,9 @@ delete_data_free (DeleteData *delete_data) } G_DEFINE_AUTOPTR_CLEANUP_FUNC (DeleteData, delete_data_free); -static void -on_print_deleted (FpDevice *dev, GAsyncResult *res, gpointer user_data); +static void on_print_deleted (FpDevice *dev, + GAsyncResult *res, + gpointer user_data); static void delete_next_print (FpDevice *dev, @@ -145,6 +146,7 @@ on_print_deleted (FpDevice *dev, gpointer user_data) { ListData *list_data = user_data; + g_autoptr(GError) error = NULL; g_autoptr(FpPrint) print = NULL; GList *deleted_link; @@ -157,12 +159,14 @@ on_print_deleted (FpDevice *dev, if (error) { - g_warning("Failed to remove print %s: %s", - fp_print_get_description (print), error->message); + g_warning ("Failed to remove print %s: %s", + fp_print_get_description (print), error->message); list_data->any_failed = TRUE; } else - g_debug ("Deleted print %s from device", fp_print_get_description (print)); + { + g_debug ("Deleted print %s from device", fp_print_get_description (print)); + } if (list_data->to_delete != NULL) { @@ -184,6 +188,7 @@ on_list_completed (FpDevice *dev, gpointer user_data) { ListData *list_data = user_data; + g_autoptr(GPtrArray) prints = NULL; g_autoptr(GError) error = NULL; @@ -198,7 +203,7 @@ on_list_completed (FpDevice *dev, for (i = 0; i < prints->len; ++i) { - FpPrint* print = prints->pdata[i]; + FpPrint * print = prints->pdata[i]; g_date_strftime (buf, G_N_ELEMENTS (buf), "%Y-%m-%d", fp_print_get_enroll_date (print)); @@ -247,10 +252,8 @@ on_list_completed (FpDevice *dev, if (list_data->to_delete) delete_next_print (dev, list_data); else - { - fp_device_close (dev, NULL, (GAsyncReadyCallback) on_device_closed, - list_data); - } + fp_device_close (dev, NULL, (GAsyncReadyCallback) on_device_closed, + list_data); } else { diff --git a/examples/storage.c b/examples/storage.c index d2f4832..932163e 100644 --- a/examples/storage.c +++ b/examples/storage.c @@ -31,183 +31,196 @@ static char * get_print_data_descriptor (FpPrint *print, FpDevice *dev, FpFinger finger) { - const char *driver; - const char *dev_id; + const char *driver; + const char *dev_id; - if (print) { - driver = fp_print_get_driver (print); - dev_id = fp_print_get_device_id (print); - } else { - driver = fp_device_get_driver (dev); - dev_id = fp_device_get_device_id (dev); - } + if (print) + { + driver = fp_print_get_driver (print); + dev_id = fp_print_get_device_id (print); + } + else + { + driver = fp_device_get_driver (dev); + dev_id = fp_device_get_device_id (dev); + } - return g_strdup_printf("%s/%s/%x", - driver, - dev_id, - finger); + return g_strdup_printf ("%s/%s/%x", + driver, + dev_id, + finger); } static GVariantDict * -load_data(void) +load_data (void) { - GVariantDict *res; - GVariant *var; - g_autofree gchar *contents = NULL; - gssize length = 0; + GVariantDict *res; + GVariant *var; + g_autofree gchar *contents = NULL; + gssize length = 0; - if (!g_file_get_contents (STORAGE_FILE, &contents, &length, NULL)) { - g_warning ("Error loading storage, assuming it is empty"); - return g_variant_dict_new(NULL); - } + if (!g_file_get_contents (STORAGE_FILE, &contents, &length, NULL)) + { + g_warning ("Error loading storage, assuming it is empty"); + return g_variant_dict_new (NULL); + } - var = g_variant_new_from_data (G_VARIANT_TYPE_VARDICT, contents, length, FALSE, NULL, NULL); + var = g_variant_new_from_data (G_VARIANT_TYPE_VARDICT, contents, length, FALSE, NULL, NULL); - res = g_variant_dict_new(var); - g_variant_unref(var); - return res; + res = g_variant_dict_new (var); + g_variant_unref (var); + return res; } static int -save_data(GVariant *data) +save_data (GVariant *data) { - const gchar *contents = NULL; - gsize length; + const gchar *contents = NULL; + gsize length; - length = g_variant_get_size(data); - contents = (gchar*) g_variant_get_data (data); + length = g_variant_get_size (data); + contents = (gchar *) g_variant_get_data (data); - if (!g_file_set_contents (STORAGE_FILE, contents, length, NULL)) { - g_warning ("Error saving storage,!"); - return -1; - } + if (!g_file_set_contents (STORAGE_FILE, contents, length, NULL)) + { + g_warning ("Error saving storage,!"); + return -1; + } - g_variant_ref_sink(data); - g_variant_unref(data); + g_variant_ref_sink (data); + g_variant_unref (data); - return 0; + return 0; } int -print_data_save(FpPrint *print, FpFinger finger) +print_data_save (FpPrint *print, FpFinger finger) { - g_autofree gchar *descr = get_print_data_descriptor (print, NULL, finger); - g_autoptr (GError) error = NULL; - g_autoptr (GVariantDict) dict = NULL; - g_autofree guchar *data = NULL; - GVariant *val; - gsize size; - int res; + g_autofree gchar *descr = get_print_data_descriptor (print, NULL, finger); - dict = load_data(); + g_autoptr(GError) error = NULL; + g_autoptr(GVariantDict) dict = NULL; + g_autofree guchar *data = NULL; + GVariant *val; + gsize size; + int res; - fp_print_serialize (print, &data, &size, &error); - if (error) { - g_warning ("Error serializing data: %s", error->message); - return -1; - } - val = g_variant_new_fixed_array (G_VARIANT_TYPE("y"), data, size, 1); - g_variant_dict_insert_value (dict, descr, val); + dict = load_data (); - res = save_data(g_variant_dict_end(dict)); + fp_print_serialize (print, &data, &size, &error); + if (error) + { + g_warning ("Error serializing data: %s", error->message); + return -1; + } + val = g_variant_new_fixed_array (G_VARIANT_TYPE ("y"), data, size, 1); + g_variant_dict_insert_value (dict, descr, val); - return res; + res = save_data (g_variant_dict_end (dict)); + + return res; } FpPrint * -print_data_load(FpDevice *dev, FpFinger finger) +print_data_load (FpDevice *dev, FpFinger finger) { - g_autofree gchar *descr = get_print_data_descriptor (NULL, dev, finger); - g_autoptr (GVariant) val = NULL; - g_autoptr (GVariantDict) dict = NULL; - g_autofree guchar *stored_data = NULL; - gsize stored_len; + g_autofree gchar *descr = get_print_data_descriptor (NULL, dev, finger); - dict = load_data(); - val = g_variant_dict_lookup_value (dict, descr, G_VARIANT_TYPE ("ay")); + g_autoptr(GVariant) val = NULL; + g_autoptr(GVariantDict) dict = NULL; + g_autofree guchar *stored_data = NULL; + gsize stored_len; - if (val) { - FpPrint *print; - g_autoptr (GError) error = NULL; + dict = load_data (); + val = g_variant_dict_lookup_value (dict, descr, G_VARIANT_TYPE ("ay")); - stored_data = (guchar*) g_variant_get_fixed_array (val, &stored_len, 1); - print = fp_print_deserialize (stored_data, stored_len, &error); + if (val) + { + FpPrint *print; + g_autoptr(GError) error = NULL; - if (error) - g_warning ("Error deserializing data: %s", error->message); + stored_data = (guchar *) g_variant_get_fixed_array (val, &stored_len, 1); + print = fp_print_deserialize (stored_data, stored_len, &error); - return print; - } + if (error) + g_warning ("Error deserializing data: %s", error->message); - return NULL; + return print; + } + + return NULL; } FpPrint * print_create_template (FpDevice *dev, FpFinger finger) { - g_autoptr(GDateTime) datetime = NULL; - FpPrint *template = NULL; - GDate *date = NULL; - gint year, month, day; + g_autoptr(GDateTime) datetime = NULL; + FpPrint *template = NULL; + GDate *date = NULL; + gint year, month, day; - template = fp_print_new (dev); - fp_print_set_finger (template, finger); - fp_print_set_username (template, g_get_user_name ()); - datetime = g_date_time_new_now_local (); - g_date_time_get_ymd (datetime, &year, &month, &day); - date = g_date_new_dmy (day, month, year); - fp_print_set_enroll_date (template, date); - g_date_free (date); + template = fp_print_new (dev); + fp_print_set_finger (template, finger); + fp_print_set_username (template, g_get_user_name ()); + datetime = g_date_time_new_now_local (); + g_date_time_get_ymd (datetime, &year, &month, &day); + date = g_date_new_dmy (day, month, year); + fp_print_set_enroll_date (template, date); + g_date_free (date); - return template; + return template; } static gboolean save_image_to_pgm (FpImage *img, const char *path) { - FILE *fd = fopen (path, "w"); - size_t write_size; - const guchar *data = fp_image_get_data (img, &write_size); - int r; + FILE *fd = fopen (path, "w"); + size_t write_size; + const guchar *data = fp_image_get_data (img, &write_size); + int r; - if (!fd) { - g_warning("could not open '%s' for writing: %d", path, errno); - return FALSE; - } + if (!fd) + { + g_warning ("could not open '%s' for writing: %d", path, errno); + return FALSE; + } - r = fprintf (fd, "P5 %d %d 255\n", - fp_image_get_width (img), fp_image_get_height (img)); - if (r < 0) { - fclose(fd); - g_critical("pgm header write failed, error %d", r); - return FALSE; - } + r = fprintf (fd, "P5 %d %d 255\n", + fp_image_get_width (img), fp_image_get_height (img)); + if (r < 0) + { + fclose (fd); + g_critical ("pgm header write failed, error %d", r); + return FALSE; + } - r = fwrite (data, 1, write_size, fd); - if (r < write_size) { - fclose(fd); - g_critical("short write (%d)", r); - return FALSE; - } + r = fwrite (data, 1, write_size, fd); + if (r < write_size) + { + fclose (fd); + g_critical ("short write (%d)", r); + return FALSE; + } - fclose (fd); - g_debug ("written to '%s'", path); + fclose (fd); + g_debug ("written to '%s'", path); - return TRUE; + return TRUE; } -gboolean print_image_save (FpPrint *print, const char *path) +gboolean +print_image_save (FpPrint *print, const char *path) { - g_autoptr(FpImage) img = NULL; + g_autoptr(FpImage) img = NULL; - g_return_val_if_fail (FP_IS_PRINT (print), FALSE); - g_return_val_if_fail (path != NULL, FALSE); + g_return_val_if_fail (FP_IS_PRINT (print), FALSE); + g_return_val_if_fail (path != NULL, FALSE); - img = fp_print_get_image (print); + img = fp_print_get_image (print); - if (img) - return save_image_to_pgm (img, path); + if (img) + return save_image_to_pgm (img, path); - return FALSE; + return FALSE; } diff --git a/examples/storage.h b/examples/storage.h index f419995..bcbd009 100644 --- a/examples/storage.h +++ b/examples/storage.h @@ -22,9 +22,13 @@ #define __STORAGE_H -int print_data_save(FpPrint *print, FpFinger finger); -FpPrint * print_data_load(FpDevice *dev, FpFinger finger); -FpPrint * print_create_template(FpDevice *dev, FpFinger finger); -gboolean print_image_save(FpPrint *print, const char *path); +int print_data_save (FpPrint *print, + FpFinger finger); +FpPrint * print_data_load (FpDevice *dev, + FpFinger finger); +FpPrint * print_create_template (FpDevice *dev, + FpFinger finger); +gboolean print_image_save (FpPrint *print, + const char *path); #endif /* __STORAGE_H */ diff --git a/examples/verify.c b/examples/verify.c index 69e3cbd..e543282 100644 --- a/examples/verify.c +++ b/examples/verify.c @@ -24,212 +24,236 @@ #include "storage.h" -typedef struct _VerifyData { - GMainLoop *loop; - int ret_value; +typedef struct _VerifyData +{ + GMainLoop *loop; + int ret_value; } VerifyData; static void verify_data_free (VerifyData *verify_data) { - g_main_loop_unref (verify_data->loop); - g_free (verify_data); + g_main_loop_unref (verify_data->loop); + g_free (verify_data); } G_DEFINE_AUTOPTR_CLEANUP_FUNC (VerifyData, verify_data_free) -FpDevice *discover_device (GPtrArray *devices) +FpDevice *discover_device (GPtrArray * devices) { - FpDevice *dev; - if (!devices->len) - return NULL; + FpDevice *dev; - dev = g_ptr_array_index (devices, 0); - printf("Found device claimed by %s driver\n", fp_device_get_driver (dev)); - return dev; + if (!devices->len) + return NULL; + + dev = g_ptr_array_index (devices, 0); + printf ("Found device claimed by %s driver\n", fp_device_get_driver (dev)); + return dev; } static void -on_device_closed (FpDevice *dev, GAsyncResult *res, void *user_data) { - VerifyData *verify_data = user_data; - g_autoptr(GError) error = NULL; +on_device_closed (FpDevice *dev, GAsyncResult *res, void *user_data) +{ + VerifyData *verify_data = user_data; - fp_device_close_finish (dev, res, &error); + g_autoptr(GError) error = NULL; - if (error) - g_warning ("Failed closing device %s\n", error->message); + fp_device_close_finish (dev, res, &error); - g_main_loop_quit (verify_data->loop); + if (error) + g_warning ("Failed closing device %s\n", error->message); + + g_main_loop_quit (verify_data->loop); } -static void start_verification (FpDevice *dev, VerifyData *verify_data); +static void start_verification (FpDevice *dev, + VerifyData *verify_data); static void on_verify_completed (FpDevice *dev, GAsyncResult *res, void *user_data) { - VerifyData *verify_data = user_data; - g_autoptr(FpPrint) print = NULL; - g_autoptr(GError) error = NULL; - char buffer[20]; - gboolean match; + VerifyData *verify_data = user_data; - if (!fp_device_verify_finish (dev, res, &match, &print, &error)) { - g_warning ("Failed to verify print: %s", error->message); - g_main_loop_quit (verify_data->loop); - return; - } + g_autoptr(FpPrint) print = NULL; + g_autoptr(GError) error = NULL; + char buffer[20]; + gboolean match; - if (match) { - g_print ("MATCH!\n"); - if (fp_device_supports_capture (dev) && - print_image_save (print, "verify.pgm")) { - g_print("Print image saved as verify.pgm"); - } + if (!fp_device_verify_finish (dev, res, &match, &print, &error)) + { + g_warning ("Failed to verify print: %s", error->message); + g_main_loop_quit (verify_data->loop); + return; + } - verify_data->ret_value = EXIT_SUCCESS; - } else { - g_print ("NO MATCH!\n"); - verify_data->ret_value = EXIT_FAILURE; - } + if (match) + { + g_print ("MATCH!\n"); + if (fp_device_supports_capture (dev) && + print_image_save (print, "verify.pgm")) + g_print ("Print image saved as verify.pgm"); - g_print ("Verify again? [Y/n]? "); - if (fgets (buffer, sizeof (buffer), stdin) && - (buffer[0] == 'Y' || buffer[0] == 'y')) { - start_verification (dev, verify_data); - return; - } + verify_data->ret_value = EXIT_SUCCESS; + } + else + { + g_print ("NO MATCH!\n"); + verify_data->ret_value = EXIT_FAILURE; + } - fp_device_close (dev, NULL, (GAsyncReadyCallback) on_device_closed, - verify_data); + g_print ("Verify again? [Y/n]? "); + if (fgets (buffer, sizeof (buffer), stdin) && + (buffer[0] == 'Y' || buffer[0] == 'y')) + { + start_verification (dev, verify_data); + return; + } + + fp_device_close (dev, NULL, (GAsyncReadyCallback) on_device_closed, + verify_data); } static void on_list_completed (FpDevice *dev, GAsyncResult *res, gpointer user_data) { - VerifyData *verify_data = user_data; - g_autoptr(GPtrArray) prints = NULL; - g_autoptr(GError) error = NULL; + VerifyData *verify_data = user_data; - prints = fp_device_list_prints_finish (dev, res, &error); + g_autoptr(GPtrArray) prints = NULL; + g_autoptr(GError) error = NULL; - if (!error) { - FpPrint *verify_print = NULL; - guint i; + prints = fp_device_list_prints_finish (dev, res, &error); - if (!prints->len) - g_warning ("No prints saved on device"); + if (!error) + { + FpPrint *verify_print = NULL; + guint i; - for (i = 0; i < prints->len; ++i) { - FpPrint *print = prints->pdata[i]; + if (!prints->len) + g_warning ("No prints saved on device"); - if (fp_print_get_finger (print) == FP_FINGER_RIGHT_INDEX && - g_strcmp0 (fp_print_get_username (print), g_get_user_name ()) == 0) { - if (!verify_print || - (g_date_compare (fp_print_get_enroll_date (print), - fp_print_get_enroll_date (verify_print)) >= 0)) - verify_print = print; - } - } + for (i = 0; i < prints->len; ++i) + { + FpPrint *print = prints->pdata[i]; - if (!verify_print) { - g_warning ("Did you remember to enroll your right index " - "finger first?"); - g_main_loop_quit (verify_data->loop); - return; - } + if (fp_print_get_finger (print) == FP_FINGER_RIGHT_INDEX && + g_strcmp0 (fp_print_get_username (print), g_get_user_name ()) == 0) + { + if (!verify_print || + (g_date_compare (fp_print_get_enroll_date (print), + fp_print_get_enroll_date (verify_print)) >= 0)) + verify_print = print; + } + } - g_debug ("Comparing print with %s", - fp_print_get_description (verify_print)); + if (!verify_print) + { + g_warning ("Did you remember to enroll your right index " + "finger first?"); + g_main_loop_quit (verify_data->loop); + return; + } - g_print ("Print loaded. Time to verify!\n"); - fp_device_verify (dev, verify_print, NULL, - (GAsyncReadyCallback) on_verify_completed, - verify_data); - } else { - g_warning ("Loading prints failed with error %s", error->message); - g_main_loop_quit (verify_data->loop); - } + g_debug ("Comparing print with %s", + fp_print_get_description (verify_print)); + + g_print ("Print loaded. Time to verify!\n"); + fp_device_verify (dev, verify_print, NULL, + (GAsyncReadyCallback) on_verify_completed, + verify_data); + } + else + { + g_warning ("Loading prints failed with error %s", error->message); + g_main_loop_quit (verify_data->loop); + } } static void start_verification (FpDevice *dev, VerifyData *verify_data) { - if (fp_device_has_storage (dev)) { - g_print ("Creating finger template, using device storage...\n"); - fp_device_list_prints (dev, NULL, - (GAsyncReadyCallback) on_list_completed, - verify_data); - } else { - g_print ("Loading previously enrolled right index finger data...\n"); - g_autoptr(FpPrint) verify_print; + if (fp_device_has_storage (dev)) + { + g_print ("Creating finger template, using device storage...\n"); + fp_device_list_prints (dev, NULL, + (GAsyncReadyCallback) on_list_completed, + verify_data); + } + else + { + g_print ("Loading previously enrolled right index finger data...\n"); + g_autoptr(FpPrint) verify_print; - verify_print = print_data_load (dev, FP_FINGER_RIGHT_INDEX); + verify_print = print_data_load (dev, FP_FINGER_RIGHT_INDEX); - if (!verify_print) { - g_warning ("Failed to load fingerprint data"); - g_warning ("Did you remember to enroll your right index " - "finger first?"); - g_main_loop_quit (verify_data->loop); - return; - } + if (!verify_print) + { + g_warning ("Failed to load fingerprint data"); + g_warning ("Did you remember to enroll your right index " + "finger first?"); + g_main_loop_quit (verify_data->loop); + return; + } - g_print ("Print loaded. Time to verify!\n"); - fp_device_verify (dev, verify_print, NULL, - (GAsyncReadyCallback) on_verify_completed, - verify_data); - } + g_print ("Print loaded. Time to verify!\n"); + fp_device_verify (dev, verify_print, NULL, + (GAsyncReadyCallback) on_verify_completed, + verify_data); + } } static void on_device_opened (FpDevice *dev, GAsyncResult *res, void *user_data) { - VerifyData *verify_data = user_data; - g_autoptr(GError) error = NULL; + VerifyData *verify_data = user_data; - if (!fp_device_open_finish (dev, res, &error)) { - g_warning ("Failed to open device: %s", error->message); - g_main_loop_quit (verify_data->loop); - return; - } + g_autoptr(GError) error = NULL; - g_print ("Opened device. "); + if (!fp_device_open_finish (dev, res, &error)) + { + g_warning ("Failed to open device: %s", error->message); + g_main_loop_quit (verify_data->loop); + return; + } - start_verification (dev, verify_data); + g_print ("Opened device. "); + + start_verification (dev, verify_data); } -int main(void) +int +main (void) { - g_autoptr (FpContext) ctx = NULL; - g_autoptr (VerifyData) verify_data = NULL; - GPtrArray *devices; - FpDevice *dev; + g_autoptr(FpContext) ctx = NULL; + g_autoptr(VerifyData) verify_data = NULL; + GPtrArray *devices; + FpDevice *dev; - setenv ("G_MESSAGES_DEBUG", "all", 0); - setenv ("LIBUSB_DEBUG", "3", 0); + setenv ("G_MESSAGES_DEBUG", "all", 0); + setenv ("LIBUSB_DEBUG", "3", 0); - ctx = fp_context_new (); + ctx = fp_context_new (); - devices = fp_context_get_devices (ctx); - if (!devices) { - g_warning("Impossible to get devices"); - return EXIT_FAILURE; - } + devices = fp_context_get_devices (ctx); + if (!devices) + { + g_warning ("Impossible to get devices"); + return EXIT_FAILURE; + } - dev = discover_device (devices); - if (!dev) { - g_warning("No devices detected."); - return EXIT_FAILURE; - } + dev = discover_device (devices); + if (!dev) + { + g_warning ("No devices detected."); + return EXIT_FAILURE; + } - verify_data = g_new0 (VerifyData, 1); - verify_data->ret_value = EXIT_FAILURE; - verify_data->loop = g_main_loop_new (NULL, FALSE); + verify_data = g_new0 (VerifyData, 1); + verify_data->ret_value = EXIT_FAILURE; + verify_data->loop = g_main_loop_new (NULL, FALSE); - fp_device_open (dev, NULL, (GAsyncReadyCallback) on_device_opened, - verify_data); + fp_device_open (dev, NULL, (GAsyncReadyCallback) on_device_opened, + verify_data); - g_main_loop_run (verify_data->loop); + g_main_loop_run (verify_data->loop); - return verify_data->ret_value; + return verify_data->ret_value; } - - diff --git a/libfprint/drivers/aes1610.c b/libfprint/drivers/aes1610.c index 374252e..30443f7 100644 --- a/libfprint/drivers/aes1610.c +++ b/libfprint/drivers/aes1610.c @@ -28,24 +28,25 @@ #include "drivers_api.h" #include "aeslib.h" -static void start_capture(FpImageDevice *dev); -static void complete_deactivation(FpImageDevice *dev); -static int adjust_gain(unsigned char *buffer, int status); +static void start_capture (FpImageDevice *dev); +static void complete_deactivation (FpImageDevice *dev); +static int adjust_gain (unsigned char *buffer, + int status); -#define FIRST_AES1610_REG 0x1B -#define LAST_AES1610_REG 0xFF +#define FIRST_AES1610_REG 0x1B +#define LAST_AES1610_REG 0xFF #define GAIN_STATUS_FIRST 1 #define GAIN_STATUS_NORMAL 2 /* FIXME these need checking */ -#define EP_IN (1 | FPI_USB_ENDPOINT_IN) -#define EP_OUT (2 | FPI_USB_ENDPOINT_OUT) +#define EP_IN (1 | FPI_USB_ENDPOINT_IN) +#define EP_OUT (2 | FPI_USB_ENDPOINT_OUT) #define BULK_TIMEOUT 4000 -#define FINGER_DETECTION_LEN 19 -#define STRIP_CAPTURE_LEN 665 +#define FINGER_DETECTION_LEN 19 +#define STRIP_CAPTURE_LEN 665 /* * The AES1610 is an imaging device using a swipe-type sensor. It samples @@ -59,333 +60,352 @@ static int adjust_gain(unsigned char *buffer, int status); * images returned from this driver vary in height. */ -#define FRAME_WIDTH 128 -#define FRAME_HEIGHT 8 -#define FRAME_SIZE (FRAME_WIDTH * FRAME_HEIGHT) -#define IMAGE_WIDTH (FRAME_WIDTH + (FRAME_WIDTH / 2)) +#define FRAME_WIDTH 128 +#define FRAME_HEIGHT 8 +#define FRAME_SIZE (FRAME_WIDTH * FRAME_HEIGHT) +#define IMAGE_WIDTH (FRAME_WIDTH + (FRAME_WIDTH / 2)) /* maximum number of frames to read during a scan */ /* FIXME reduce substantially */ -#define MAX_FRAMES 350 +#define MAX_FRAMES 350 /****** GENERAL FUNCTIONS ******/ -struct _FpiDeviceAes1610 { - FpImageDevice parent; +struct _FpiDeviceAes1610 +{ + FpImageDevice parent; - guint8 read_regs_retry_count; - GSList *strips; - gsize strips_len; - gboolean deactivating; - guint8 blanks_count; + guint8 read_regs_retry_count; + GSList *strips; + gsize strips_len; + gboolean deactivating; + guint8 blanks_count; }; -G_DECLARE_FINAL_TYPE(FpiDeviceAes1610, fpi_device_aes1610, FPI, DEVICE_AES1610, - FpImageDevice); -G_DEFINE_TYPE(FpiDeviceAes1610, fpi_device_aes1610, FP_TYPE_IMAGE_DEVICE); +G_DECLARE_FINAL_TYPE (FpiDeviceAes1610, fpi_device_aes1610, FPI, DEVICE_AES1610, + FpImageDevice); +G_DEFINE_TYPE (FpiDeviceAes1610, fpi_device_aes1610, FP_TYPE_IMAGE_DEVICE); static struct fpi_frame_asmbl_ctx assembling_ctx = { - .frame_width = FRAME_WIDTH, - .frame_height = FRAME_HEIGHT, - .image_width = IMAGE_WIDTH, - .get_pixel = aes_get_pixel, + .frame_width = FRAME_WIDTH, + .frame_height = FRAME_HEIGHT, + .image_width = IMAGE_WIDTH, + .get_pixel = aes_get_pixel, }; -typedef void (*aes1610_read_regs_cb)(FpImageDevice *dev, int status, - unsigned char *regs, void *user_data); +typedef void (*aes1610_read_regs_cb)(FpImageDevice *dev, + int status, + unsigned char *regs, + void *user_data); -struct aes1610_read_regs { - FpImageDevice *dev; - aes1610_read_regs_cb callback; - struct aes_regwrite *regwrite; - void *user_data; +struct aes1610_read_regs +{ + FpImageDevice *dev; + aes1610_read_regs_cb callback; + struct aes_regwrite *regwrite; + void *user_data; }; /* FIXME: what to do here? */ -static void stub_capture_stop_cb(FpImageDevice *dev, GError *error, - void *user_data) +static void +stub_capture_stop_cb (FpImageDevice *dev, GError *error, + void *user_data) { - if (error) { - fp_warn ("Error stopping capture: %s", error->message); - g_error_free (error); - } + if (error) + { + fp_warn ("Error stopping capture: %s", error->message); + g_error_free (error); + } } /* check that read succeeded but ignore all data */ -static void generic_ignore_data_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +generic_ignore_data_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - if (error) - fpi_ssm_mark_failed(transfer->ssm, error); - else - fpi_ssm_next_state(transfer->ssm); + if (error) + fpi_ssm_mark_failed (transfer->ssm, error); + else + fpi_ssm_next_state (transfer->ssm); } -static void generic_write_regv_cb(FpImageDevice *dev, GError *error, - void *user_data) +static void +generic_write_regv_cb (FpImageDevice *dev, GError *error, + void *user_data) { - FpiSsm *ssm = user_data; - if (!error) - fpi_ssm_next_state(ssm); - else - fpi_ssm_mark_failed(ssm, error); + FpiSsm *ssm = user_data; + + if (!error) + fpi_ssm_next_state (ssm); + else + fpi_ssm_mark_failed (ssm, error); } /* read the specified number of bytes from the IN endpoint but throw them * away, then increment the SSM */ -static void generic_read_ignore_data(FpiSsm *ssm, FpDevice *dev, - size_t bytes) +static void +generic_read_ignore_data (FpiSsm *ssm, FpDevice *dev, + size_t bytes) { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(dev); - unsigned char *data; + FpiUsbTransfer *transfer = fpi_usb_transfer_new (dev); + unsigned char *data; - data = g_malloc(bytes); - fpi_usb_transfer_fill_bulk_full(transfer, EP_IN, data, bytes, NULL); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - generic_ignore_data_cb, NULL); - fpi_usb_transfer_unref(transfer); + data = g_malloc (bytes); + fpi_usb_transfer_fill_bulk_full (transfer, EP_IN, data, bytes, NULL); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + generic_ignore_data_cb, NULL); + fpi_usb_transfer_unref (transfer); } /****** FINGER PRESENCE DETECTION ******/ static const struct aes_regwrite finger_det_reqs[] = { - { 0x80, 0x01 }, - { 0x80, 0x12 }, - { 0x85, 0x00 }, - { 0x8A, 0x00 }, - { 0x8B, 0x0E }, - { 0x8C, 0x90 }, - { 0x8D, 0x83 }, - { 0x8E, 0x07 }, - { 0x8F, 0x07 }, - { 0x96, 0x00 }, - { 0x97, 0x48 }, - { 0xA1, 0x00 }, - { 0xA2, 0x50 }, - { 0xA6, 0xE4 }, - { 0xAD, 0x08 }, - { 0xAE, 0x5B }, - { 0xAF, 0x54 }, - { 0xB1, 0x28 }, - { 0xB5, 0xAB }, - { 0xB6, 0x0E }, - { 0x1B, 0x2D }, - { 0x81, 0x04 } + { 0x80, 0x01 }, + { 0x80, 0x12 }, + { 0x85, 0x00 }, + { 0x8A, 0x00 }, + { 0x8B, 0x0E }, + { 0x8C, 0x90 }, + { 0x8D, 0x83 }, + { 0x8E, 0x07 }, + { 0x8F, 0x07 }, + { 0x96, 0x00 }, + { 0x97, 0x48 }, + { 0xA1, 0x00 }, + { 0xA2, 0x50 }, + { 0xA6, 0xE4 }, + { 0xAD, 0x08 }, + { 0xAE, 0x5B }, + { 0xAF, 0x54 }, + { 0xB1, 0x28 }, + { 0xB5, 0xAB }, + { 0xB6, 0x0E }, + { 0x1B, 0x2D }, + { 0x81, 0x04 } }; -static void start_finger_detection(FpImageDevice *dev); +static void start_finger_detection (FpImageDevice *dev); -static void finger_det_data_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +finger_det_data_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpImageDevice *dev = FP_IMAGE_DEVICE(device); - unsigned char *data = transfer->buffer; - int i; - int sum = 0; + FpImageDevice *dev = FP_IMAGE_DEVICE (device); + unsigned char *data = transfer->buffer; + int i; + int sum = 0; - if (error) { - fpi_image_device_session_error (dev, error); - return; - } + if (error) + { + fpi_image_device_session_error (dev, error); + return; + } - /* examine histogram to determine finger presence */ - for (i = 3; i < 17; i++) - sum += (data[i] & 0xf) + (data[i] >> 4); - if (sum > 20) { - /* reset default gain */ - adjust_gain(data,GAIN_STATUS_FIRST); - /* finger present, start capturing */ - fpi_image_device_report_finger_status(dev, TRUE); - start_capture(dev); - } else { - /* no finger, poll for a new histogram */ - start_finger_detection(dev); - } + /* examine histogram to determine finger presence */ + for (i = 3; i < 17; i++) + sum += (data[i] & 0xf) + (data[i] >> 4); + if (sum > 20) + { + /* reset default gain */ + adjust_gain (data, GAIN_STATUS_FIRST); + /* finger present, start capturing */ + fpi_image_device_report_finger_status (dev, TRUE); + start_capture (dev); + } + else + { + /* no finger, poll for a new histogram */ + start_finger_detection (dev); + } } -static void finger_det_reqs_cb(FpImageDevice *dev, GError *error, - void *user_data) +static void +finger_det_reqs_cb (FpImageDevice *dev, GError *error, + void *user_data) { - FpiUsbTransfer *transfer; + FpiUsbTransfer *transfer; - if (error) { - fpi_image_device_session_error(dev, error); - return; - } + if (error) + { + fpi_image_device_session_error (dev, error); + return; + } - transfer = fpi_usb_transfer_new(FP_DEVICE(dev)); - fpi_usb_transfer_fill_bulk (transfer, EP_IN, FINGER_DETECTION_LEN); - transfer->short_is_error = TRUE; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - finger_det_data_cb, NULL); - fpi_usb_transfer_unref(transfer); + transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); + fpi_usb_transfer_fill_bulk (transfer, EP_IN, FINGER_DETECTION_LEN); + transfer->short_is_error = TRUE; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + finger_det_data_cb, NULL); + fpi_usb_transfer_unref (transfer); } -static void start_finger_detection(FpImageDevice *dev) +static void +start_finger_detection (FpImageDevice *dev) { - FpiDeviceAes1610 *self = FPI_DEVICE_AES1610(dev); + FpiDeviceAes1610 *self = FPI_DEVICE_AES1610 (dev); - if (self->deactivating) { - complete_deactivation(dev); - return; - } + if (self->deactivating) + { + complete_deactivation (dev); + return; + } - aes_write_regv(dev, finger_det_reqs, G_N_ELEMENTS(finger_det_reqs), finger_det_reqs_cb, NULL); + aes_write_regv (dev, finger_det_reqs, G_N_ELEMENTS (finger_det_reqs), finger_det_reqs_cb, NULL); } /****** CAPTURE ******/ static struct aes_regwrite capture_reqs[] = { - { 0x80, 0x01 }, - { 0x80, 0x12 }, - { 0x84, 0x01 }, - { 0x85, 0x00 }, - { 0x89, 0x64 }, - { 0x8A, 0x00 }, - { 0x8B, 0x0E }, - { 0x8C, 0x90 }, - { 0xBE, 0x23 }, - { 0x29, 0x04 }, - { 0x2A, 0xFF }, - { 0x96, 0x00 }, - { 0x98, 0x03 }, - { 0x99, 0x00 }, - { 0x9C, 0xA5 }, - { 0x9D, 0x40 }, - { 0x9E, 0xC6 }, - { 0x9F, 0x8E }, - { 0xA2, 0x50 }, - { 0xA3, 0xF0 }, - { 0xAD, 0x08 }, - { 0xBD, 0x4F }, - { 0xAF, 0x54 }, - { 0xB1, 0x08 }, - { 0xB5, 0xAB }, - { 0x1B, 0x2D }, - { 0xB6, 0x4E }, - { 0xB8, 0x70 }, - { 0x2B, 0xB3 }, - { 0x2C, 0x5D }, - { 0x2D, 0x98 }, - { 0x2E, 0xB0 }, - { 0x2F, 0x20 }, - { 0xA2, 0xD0 }, - { 0x1D, 0x21 }, - { 0x1E, 0xBE }, - { 0x1C, 0x00 }, - { 0x1D, 0x30 }, - { 0x1E, 0x29 }, - { 0x1C, 0x01 }, - { 0x1D, 0x00 }, - { 0x1E, 0x9E }, - { 0x1C, 0x02 }, - { 0x1D, 0x30 }, - { 0x1E, 0xBB }, - { 0x1C, 0x03 }, - { 0x1D, 0x00 }, - { 0x1E, 0x9D }, - { 0x1C, 0x04 }, - { 0x1D, 0x22 }, - { 0x1E, 0xFF }, - { 0x1C, 0x05 }, - { 0x1D, 0x1B }, - { 0x1E, 0x4E }, - { 0x1C, 0x06 }, - { 0x1D, 0x16 }, - { 0x1E, 0x28 }, - { 0x1C, 0x07 }, - { 0x1D, 0x22 }, - { 0x1E, 0xFF }, - { 0x1C, 0x08 }, - { 0x1D, 0x15 }, - { 0x1E, 0xF1 }, - { 0x1C, 0x09 }, - { 0x1D, 0x30 }, - { 0x1E, 0xD5 }, - { 0x1C, 0x0A }, - { 0x1D, 0x00 }, - { 0x1E, 0x9E }, - { 0x1C, 0x0B }, - { 0x1D, 0x17 }, - { 0x1E, 0x9D }, - { 0x1C, 0x0C }, - { 0x1D, 0x28 }, - { 0x1E, 0xD7 }, - { 0x1C, 0x0D }, - { 0x1D, 0x17 }, - { 0x1E, 0xD7 }, - { 0x1C, 0x0E }, - { 0x1D, 0x0A }, - { 0x1E, 0xCB }, - { 0x1C, 0x0F }, - { 0x1D, 0x24 }, - { 0x1E, 0x14 }, - { 0x1C, 0x10 }, - { 0x1D, 0x17 }, - { 0x1E, 0x85 }, - { 0x1C, 0x11 }, - { 0x1D, 0x15 }, - { 0x1E, 0x71 }, - { 0x1C, 0x12 }, - { 0x1D, 0x2B }, - { 0x1E, 0x36 }, - { 0x1C, 0x13 }, - { 0x1D, 0x12 }, - { 0x1E, 0x06 }, - { 0x1C, 0x14 }, - { 0x1D, 0x30 }, - { 0x1E, 0x97 }, - { 0x1C, 0x15 }, - { 0x1D, 0x21 }, - { 0x1E, 0x32 }, - { 0x1C, 0x16 }, - { 0x1D, 0x06 }, - { 0x1E, 0xE6 }, - { 0x1C, 0x17 }, - { 0x1D, 0x16 }, - { 0x1E, 0x06 }, - { 0x1C, 0x18 }, - { 0x1D, 0x30 }, - { 0x1E, 0x01 }, - { 0x1C, 0x19 }, - { 0x1D, 0x21 }, - { 0x1E, 0x37 }, - { 0x1C, 0x1A }, - { 0x1D, 0x00 }, - { 0x1E, 0x08 }, - { 0x1C, 0x1B }, - { 0x1D, 0x80 }, - { 0x1E, 0xD5 }, - { 0xA2, 0x50 }, - { 0xA2, 0x50 }, - { 0x81, 0x01 } + { 0x80, 0x01 }, + { 0x80, 0x12 }, + { 0x84, 0x01 }, + { 0x85, 0x00 }, + { 0x89, 0x64 }, + { 0x8A, 0x00 }, + { 0x8B, 0x0E }, + { 0x8C, 0x90 }, + { 0xBE, 0x23 }, + { 0x29, 0x04 }, + { 0x2A, 0xFF }, + { 0x96, 0x00 }, + { 0x98, 0x03 }, + { 0x99, 0x00 }, + { 0x9C, 0xA5 }, + { 0x9D, 0x40 }, + { 0x9E, 0xC6 }, + { 0x9F, 0x8E }, + { 0xA2, 0x50 }, + { 0xA3, 0xF0 }, + { 0xAD, 0x08 }, + { 0xBD, 0x4F }, + { 0xAF, 0x54 }, + { 0xB1, 0x08 }, + { 0xB5, 0xAB }, + { 0x1B, 0x2D }, + { 0xB6, 0x4E }, + { 0xB8, 0x70 }, + { 0x2B, 0xB3 }, + { 0x2C, 0x5D }, + { 0x2D, 0x98 }, + { 0x2E, 0xB0 }, + { 0x2F, 0x20 }, + { 0xA2, 0xD0 }, + { 0x1D, 0x21 }, + { 0x1E, 0xBE }, + { 0x1C, 0x00 }, + { 0x1D, 0x30 }, + { 0x1E, 0x29 }, + { 0x1C, 0x01 }, + { 0x1D, 0x00 }, + { 0x1E, 0x9E }, + { 0x1C, 0x02 }, + { 0x1D, 0x30 }, + { 0x1E, 0xBB }, + { 0x1C, 0x03 }, + { 0x1D, 0x00 }, + { 0x1E, 0x9D }, + { 0x1C, 0x04 }, + { 0x1D, 0x22 }, + { 0x1E, 0xFF }, + { 0x1C, 0x05 }, + { 0x1D, 0x1B }, + { 0x1E, 0x4E }, + { 0x1C, 0x06 }, + { 0x1D, 0x16 }, + { 0x1E, 0x28 }, + { 0x1C, 0x07 }, + { 0x1D, 0x22 }, + { 0x1E, 0xFF }, + { 0x1C, 0x08 }, + { 0x1D, 0x15 }, + { 0x1E, 0xF1 }, + { 0x1C, 0x09 }, + { 0x1D, 0x30 }, + { 0x1E, 0xD5 }, + { 0x1C, 0x0A }, + { 0x1D, 0x00 }, + { 0x1E, 0x9E }, + { 0x1C, 0x0B }, + { 0x1D, 0x17 }, + { 0x1E, 0x9D }, + { 0x1C, 0x0C }, + { 0x1D, 0x28 }, + { 0x1E, 0xD7 }, + { 0x1C, 0x0D }, + { 0x1D, 0x17 }, + { 0x1E, 0xD7 }, + { 0x1C, 0x0E }, + { 0x1D, 0x0A }, + { 0x1E, 0xCB }, + { 0x1C, 0x0F }, + { 0x1D, 0x24 }, + { 0x1E, 0x14 }, + { 0x1C, 0x10 }, + { 0x1D, 0x17 }, + { 0x1E, 0x85 }, + { 0x1C, 0x11 }, + { 0x1D, 0x15 }, + { 0x1E, 0x71 }, + { 0x1C, 0x12 }, + { 0x1D, 0x2B }, + { 0x1E, 0x36 }, + { 0x1C, 0x13 }, + { 0x1D, 0x12 }, + { 0x1E, 0x06 }, + { 0x1C, 0x14 }, + { 0x1D, 0x30 }, + { 0x1E, 0x97 }, + { 0x1C, 0x15 }, + { 0x1D, 0x21 }, + { 0x1E, 0x32 }, + { 0x1C, 0x16 }, + { 0x1D, 0x06 }, + { 0x1E, 0xE6 }, + { 0x1C, 0x17 }, + { 0x1D, 0x16 }, + { 0x1E, 0x06 }, + { 0x1C, 0x18 }, + { 0x1D, 0x30 }, + { 0x1E, 0x01 }, + { 0x1C, 0x19 }, + { 0x1D, 0x21 }, + { 0x1E, 0x37 }, + { 0x1C, 0x1A }, + { 0x1D, 0x00 }, + { 0x1E, 0x08 }, + { 0x1C, 0x1B }, + { 0x1D, 0x80 }, + { 0x1E, 0xD5 }, + { 0xA2, 0x50 }, + { 0xA2, 0x50 }, + { 0x81, 0x01 } }; static struct aes_regwrite strip_scan_reqs[] = { - { 0xBE, 0x23 }, - { 0x29, 0x04 }, - { 0x2A, 0xFF }, - { 0xBD, 0x4F }, - { 0xFF, 0x00 } + { 0xBE, 0x23 }, + { 0x29, 0x04 }, + { 0x2A, 0xFF }, + { 0xBD, 0x4F }, + { 0xFF, 0x00 } }; static const struct aes_regwrite capture_stop[] = { - { 0x81,0x00 } + { 0x81, 0x00 } }; /* * The different possible values for 0xBE register */ static unsigned char list_BE_values[10] = { - 0x23, 0x43, 0x63, 0x64, 0x65, 0x67, 0x6A, 0x6B + 0x23, 0x43, 0x63, 0x64, 0x65, 0x67, 0x6A, 0x6B }; /* * The different possible values for 0xBD register */ static unsigned char list_BD_values[10] = { - 0x28, 0x2b, 0x30, 0x3b, 0x45, 0x49, 0x4B + 0x28, 0x2b, 0x30, 0x3b, 0x45, 0x49, 0x4B }; /* @@ -393,129 +413,141 @@ static unsigned char list_BD_values[10] = { * 0xbd, 0xbe, 0x29 and 0x2A registers are affected * Returns 0 if no problem occurred * TODO: This is a basic support for gain. It needs testing/tweaking. */ -static int adjust_gain(unsigned char *buffer, int status) +static int +adjust_gain (unsigned char *buffer, int status) { - // The position in the array of possible values for 0xBE and 0xBD registers - static int pos_list_BE = 0; - static int pos_list_BD = 0; + // The position in the array of possible values for 0xBE and 0xBD registers + static int pos_list_BE = 0; + static int pos_list_BD = 0; - // This is the first adjustment (we begin acquisition) - // We adjust strip_scan_reqs for future strips and capture_reqs that is sent just after this step - if (status == GAIN_STATUS_FIRST) { - if (buffer[1] > 0x78) { // maximum gain needed - strip_scan_reqs[0].value = 0x6B; - strip_scan_reqs[1].value = 0x06; - strip_scan_reqs[2].value = 0x35; - strip_scan_reqs[3].value = 0x4B; - } - else if (buffer[1] > 0x55) { - strip_scan_reqs[0].value = 0x63; - strip_scan_reqs[1].value = 0x15; - strip_scan_reqs[2].value = 0x35; - strip_scan_reqs[3].value = 0x3b; - } - else if (buffer[1] > 0x40 || buffer[16] > 0x19) { - strip_scan_reqs[0].value = 0x43; - strip_scan_reqs[1].value = 0x13; - strip_scan_reqs[2].value = 0x35; - strip_scan_reqs[3].value = 0x30; - } - else { // minimum gain needed - strip_scan_reqs[0].value = 0x23; - strip_scan_reqs[1].value = 0x07; - strip_scan_reqs[2].value = 0x35; - strip_scan_reqs[3].value = 0x28; - } + // This is the first adjustment (we begin acquisition) + // We adjust strip_scan_reqs for future strips and capture_reqs that is sent just after this step + if (status == GAIN_STATUS_FIRST) + { + if (buffer[1] > 0x78) // maximum gain needed + { + strip_scan_reqs[0].value = 0x6B; + strip_scan_reqs[1].value = 0x06; + strip_scan_reqs[2].value = 0x35; + strip_scan_reqs[3].value = 0x4B; + } + else if (buffer[1] > 0x55) + { + strip_scan_reqs[0].value = 0x63; + strip_scan_reqs[1].value = 0x15; + strip_scan_reqs[2].value = 0x35; + strip_scan_reqs[3].value = 0x3b; + } + else if (buffer[1] > 0x40 || buffer[16] > 0x19) + { + strip_scan_reqs[0].value = 0x43; + strip_scan_reqs[1].value = 0x13; + strip_scan_reqs[2].value = 0x35; + strip_scan_reqs[3].value = 0x30; + } + else // minimum gain needed + { + strip_scan_reqs[0].value = 0x23; + strip_scan_reqs[1].value = 0x07; + strip_scan_reqs[2].value = 0x35; + strip_scan_reqs[3].value = 0x28; + } - // Now copy this values in capture_reqs - capture_reqs[8].value = strip_scan_reqs[0].value; - capture_reqs[9].value = strip_scan_reqs[1].value; - capture_reqs[10].value = strip_scan_reqs[2].value; - capture_reqs[21].value = strip_scan_reqs[3].value; + // Now copy this values in capture_reqs + capture_reqs[8].value = strip_scan_reqs[0].value; + capture_reqs[9].value = strip_scan_reqs[1].value; + capture_reqs[10].value = strip_scan_reqs[2].value; + capture_reqs[21].value = strip_scan_reqs[3].value; - fp_dbg("first gain: %x %x %x %x %x %x %x %x", strip_scan_reqs[0].reg, strip_scan_reqs[0].value, strip_scan_reqs[1].reg, strip_scan_reqs[1].value, strip_scan_reqs[2].reg, strip_scan_reqs[2].value, strip_scan_reqs[3].reg, strip_scan_reqs[3].value); - } + fp_dbg ("first gain: %x %x %x %x %x %x %x %x", strip_scan_reqs[0].reg, strip_scan_reqs[0].value, strip_scan_reqs[1].reg, strip_scan_reqs[1].value, strip_scan_reqs[2].reg, strip_scan_reqs[2].value, strip_scan_reqs[3].reg, strip_scan_reqs[3].value); + } + // Every 2/3 strips + // We try to soften big changes of the gain (at least for 0xBE and 0xBD + // FIXME: This softenning will need testing and tweaking too + else if (status == GAIN_STATUS_NORMAL) + { + if (buffer[514] > 0x78) // maximum gain needed + { + if (pos_list_BE < 7) + pos_list_BE++; - // Every 2/3 strips - // We try to soften big changes of the gain (at least for 0xBE and 0xBD - // FIXME: This softenning will need testing and tweaking too - else if (status == GAIN_STATUS_NORMAL) { - if (buffer[514] > 0x78) { // maximum gain needed - if (pos_list_BE < 7) - pos_list_BE++; + if (pos_list_BD < 6) + pos_list_BD++; - if (pos_list_BD < 6) - pos_list_BD++; + strip_scan_reqs[1].value = 0x04; + strip_scan_reqs[2].value = 0x35; + } + else if (buffer[514] > 0x55) + { + if (pos_list_BE < 2) + pos_list_BE++; + else if (pos_list_BE > 2) + pos_list_BE--; - strip_scan_reqs[1].value = 0x04; - strip_scan_reqs[2].value = 0x35; - } - else if (buffer[514] > 0x55) { - if (pos_list_BE < 2) - pos_list_BE++; - else if (pos_list_BE > 2) - pos_list_BE--; + if (pos_list_BD < 2) + pos_list_BD++; + else if (pos_list_BD > 2) + pos_list_BD--; - if (pos_list_BD < 2) - pos_list_BD++; - else if (pos_list_BD > 2) - pos_list_BD--; + strip_scan_reqs[1].value = 0x15; + strip_scan_reqs[2].value = 0x35; + } + else if (buffer[514] > 0x40 || buffer[529] > 0x19) + { + if (pos_list_BE < 1) + pos_list_BE++; + else if (pos_list_BE > 1) + pos_list_BE--; - strip_scan_reqs[1].value = 0x15; - strip_scan_reqs[2].value = 0x35; - } - else if (buffer[514] > 0x40 || buffer[529] > 0x19) { - if (pos_list_BE < 1) - pos_list_BE++; - else if (pos_list_BE > 1) - pos_list_BE--; + if (pos_list_BD < 1) + pos_list_BD++; + else if (pos_list_BD > 1) + pos_list_BD--; - if (pos_list_BD < 1) - pos_list_BD++; - else if (pos_list_BD > 1) - pos_list_BD--; + strip_scan_reqs[1].value = 0x13; + strip_scan_reqs[2].value = 0x35; + } + else // minimum gain needed + { + if (pos_list_BE > 0) + pos_list_BE--; - strip_scan_reqs[1].value = 0x13; - strip_scan_reqs[2].value = 0x35; - } - else { // minimum gain needed - if (pos_list_BE > 0) - pos_list_BE--; + if (pos_list_BD > 0) + pos_list_BD--; - if (pos_list_BD > 0) - pos_list_BD--; + strip_scan_reqs[1].value = 0x07; + strip_scan_reqs[2].value = 0x35; + } - strip_scan_reqs[1].value = 0x07; - strip_scan_reqs[2].value = 0x35; - } + strip_scan_reqs[0].value = list_BE_values[pos_list_BE]; + strip_scan_reqs[3].value = list_BD_values[pos_list_BD]; - strip_scan_reqs[0].value = list_BE_values[pos_list_BE]; - strip_scan_reqs[3].value = list_BD_values[pos_list_BD]; + fp_dbg ("gain: %x %x %x %x %x %x %x %x", strip_scan_reqs[0].reg, strip_scan_reqs[0].value, strip_scan_reqs[1].reg, strip_scan_reqs[1].value, strip_scan_reqs[2].reg, strip_scan_reqs[2].value, strip_scan_reqs[3].reg, strip_scan_reqs[3].value); + } + // Unknown status + else + { + fp_err ("Unexpected gain status."); + return 1; + } - fp_dbg("gain: %x %x %x %x %x %x %x %x", strip_scan_reqs[0].reg, strip_scan_reqs[0].value, strip_scan_reqs[1].reg, strip_scan_reqs[1].value, strip_scan_reqs[2].reg, strip_scan_reqs[2].value, strip_scan_reqs[3].reg, strip_scan_reqs[3].value); - } - // Unknown status - else { - fp_err("Unexpected gain status."); - return 1; - } - - return 0; + return 0; } /* * Restore the default gain values */ -static void restore_gain(void) +static void +restore_gain (void) { - strip_scan_reqs[0].value = list_BE_values[0]; - strip_scan_reqs[1].value = 0x04; - strip_scan_reqs[2].value = 0xFF; - strip_scan_reqs[3].value = list_BD_values[0]; + strip_scan_reqs[0].value = list_BE_values[0]; + strip_scan_reqs[1].value = 0x04; + strip_scan_reqs[2].value = 0xFF; + strip_scan_reqs[3].value = list_BD_values[0]; - capture_reqs[8].value = list_BE_values[0]; - capture_reqs[9].value = 0x04; - capture_reqs[10].value = 0xFF; - capture_reqs[21].value = list_BD_values[0]; + capture_reqs[8].value = list_BE_values[0]; + capture_reqs[9].value = 0x04; + capture_reqs[10].value = 0xFF; + capture_reqs[21].value = list_BD_values[0]; } @@ -525,285 +557,321 @@ static void restore_gain(void) * report lack of finger presence, and move to finger detection */ enum capture_states { - CAPTURE_WRITE_REQS, - CAPTURE_READ_DATA, - CAPTURE_REQUEST_STRIP, - CAPTURE_READ_STRIP, - CAPTURE_NUM_STATES, + CAPTURE_WRITE_REQS, + CAPTURE_READ_DATA, + CAPTURE_REQUEST_STRIP, + CAPTURE_READ_STRIP, + CAPTURE_NUM_STATES, }; -static void capture_read_strip_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +capture_read_strip_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - unsigned char *stripdata; - FpImageDevice *dev = FP_IMAGE_DEVICE (device); - FpiDeviceAes1610 *self = FPI_DEVICE_AES1610(dev); - unsigned char *data = transfer->buffer; - gint sum, i; + unsigned char *stripdata; + FpImageDevice *dev = FP_IMAGE_DEVICE (device); + FpiDeviceAes1610 *self = FPI_DEVICE_AES1610 (dev); + unsigned char *data = transfer->buffer; + gint sum, i; - if (error) { - fpi_ssm_mark_failed (transfer->ssm, error); - return; - } + if (error) + { + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } - /* FIXME: would preallocating strip buffers be a decent optimization? */ + /* FIXME: would preallocating strip buffers be a decent optimization? */ - sum = 0; - for (i = 516; i < 530; i++) - { - /* histogram[i] = number of pixels of value i - Only the pixel values from 10 to 15 are used to detect finger. */ - sum += data[i]; - } + sum = 0; + for (i = 516; i < 530; i++) + /* histogram[i] = number of pixels of value i + Only the pixel values from 10 to 15 are used to detect finger. */ + sum += data[i]; - fp_dbg("sum=%d", sum); - if (sum > 0) { - /* FIXME: would preallocating strip buffers be a decent optimization? */ - struct fpi_frame *stripe = g_malloc(FRAME_WIDTH * (FRAME_HEIGHT / 2) + sizeof(struct fpi_frame)); - stripe->delta_x = 0; - stripe->delta_y = 0; - stripdata = stripe->data; - memcpy(stripdata, data + 1, FRAME_WIDTH * (FRAME_HEIGHT / 2)); - self->strips = g_slist_prepend(self->strips, stripe); - self->strips_len++; - self->blanks_count = 0; - } else { - /* FIXME: 0 might be too low as a threshold */ - /* FIXME: sometimes we get 0 in the middle of a scan, should we wait for - * a few consecutive zeroes? */ + fp_dbg ("sum=%d", sum); + if (sum > 0) + { + /* FIXME: would preallocating strip buffers be a decent optimization? */ + struct fpi_frame *stripe = g_malloc (FRAME_WIDTH * (FRAME_HEIGHT / 2) + sizeof (struct fpi_frame)); + stripe->delta_x = 0; + stripe->delta_y = 0; + stripdata = stripe->data; + memcpy (stripdata, data + 1, FRAME_WIDTH * (FRAME_HEIGHT / 2)); + self->strips = g_slist_prepend (self->strips, stripe); + self->strips_len++; + self->blanks_count = 0; + } + else + { + /* FIXME: 0 might be too low as a threshold */ + /* FIXME: sometimes we get 0 in the middle of a scan, should we wait for + * a few consecutive zeroes? */ - /* sum cannot be negative, so is 0 */ - self->blanks_count++; - fp_dbg("got blank frame"); - } + /* sum cannot be negative, so is 0 */ + self->blanks_count++; + fp_dbg ("got blank frame"); + } - /* use histogram data above for gain calibration (0xbd, 0xbe, 0x29 and 0x2A ) */ - adjust_gain(data, GAIN_STATUS_NORMAL); + /* use histogram data above for gain calibration (0xbd, 0xbe, 0x29 and 0x2A ) */ + adjust_gain (data, GAIN_STATUS_NORMAL); - /* stop capturing if MAX_FRAMES is reached */ - if (self->blanks_count > 10 || g_slist_length(self->strips) >= MAX_FRAMES) { - FpImage *img; + /* stop capturing if MAX_FRAMES is reached */ + if (self->blanks_count > 10 || g_slist_length (self->strips) >= MAX_FRAMES) + { + FpImage *img; - fp_dbg("sending stop capture.... blanks=%d frames=%d", - self->blanks_count, g_slist_length(self->strips)); - /* send stop capture bits */ - aes_write_regv(dev, capture_stop, G_N_ELEMENTS(capture_stop), stub_capture_stop_cb, NULL); - self->strips = g_slist_reverse(self->strips); - fpi_do_movement_estimation(&assembling_ctx, self->strips); - img = fpi_assemble_frames(&assembling_ctx, self->strips); + fp_dbg ("sending stop capture.... blanks=%d frames=%d", + self->blanks_count, g_slist_length (self->strips)); + /* send stop capture bits */ + aes_write_regv (dev, capture_stop, G_N_ELEMENTS (capture_stop), stub_capture_stop_cb, NULL); + self->strips = g_slist_reverse (self->strips); + fpi_do_movement_estimation (&assembling_ctx, self->strips); + img = fpi_assemble_frames (&assembling_ctx, self->strips); - g_slist_free_full(self->strips, g_free); - self->strips = NULL; - self->strips_len = 0; - self->blanks_count = 0; - fpi_image_device_image_captured(dev, img); - fpi_image_device_report_finger_status(dev, FALSE); - /* marking machine complete will re-trigger finger detection loop */ - fpi_ssm_mark_completed(transfer->ssm); - /* Acquisition finished: restore default gain values */ - restore_gain(); - } else { - /* obtain next strip */ - fpi_ssm_jump_to_state(transfer->ssm, CAPTURE_REQUEST_STRIP); - } + g_slist_free_full (self->strips, g_free); + self->strips = NULL; + self->strips_len = 0; + self->blanks_count = 0; + fpi_image_device_image_captured (dev, img); + fpi_image_device_report_finger_status (dev, FALSE); + /* marking machine complete will re-trigger finger detection loop */ + fpi_ssm_mark_completed (transfer->ssm); + /* Acquisition finished: restore default gain values */ + restore_gain (); + } + else + { + /* obtain next strip */ + fpi_ssm_jump_to_state (transfer->ssm, CAPTURE_REQUEST_STRIP); + } } -static void capture_run_state(FpiSsm *ssm, FpDevice *_dev, void *user_data) +static void +capture_run_state (FpiSsm *ssm, FpDevice *_dev, void *user_data) { - FpImageDevice *dev = user_data; - FpiDeviceAes1610 *self = FPI_DEVICE_AES1610(_dev); + FpImageDevice *dev = user_data; + FpiDeviceAes1610 *self = FPI_DEVICE_AES1610 (_dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case CAPTURE_WRITE_REQS: - fp_dbg("write reqs"); - aes_write_regv(dev, capture_reqs, G_N_ELEMENTS(capture_reqs), - generic_write_regv_cb, ssm); - break; - case CAPTURE_READ_DATA: - fp_dbg("read data"); - generic_read_ignore_data(ssm, _dev, STRIP_CAPTURE_LEN); - break; - case CAPTURE_REQUEST_STRIP: - fp_dbg("request strip"); - if (self->deactivating) - fpi_ssm_mark_completed(ssm); - else - aes_write_regv(dev, strip_scan_reqs, G_N_ELEMENTS(strip_scan_reqs), - generic_write_regv_cb, ssm); - break; - case CAPTURE_READ_STRIP: ; - FpiUsbTransfer *transfer = fpi_usb_transfer_new(_dev); + switch (fpi_ssm_get_cur_state (ssm)) + { + case CAPTURE_WRITE_REQS: + fp_dbg ("write reqs"); + aes_write_regv (dev, capture_reqs, G_N_ELEMENTS (capture_reqs), + generic_write_regv_cb, ssm); + break; - fpi_usb_transfer_fill_bulk (transfer, EP_IN, STRIP_CAPTURE_LEN); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - capture_read_strip_cb, NULL); - fpi_usb_transfer_unref(transfer); - break; - }; + case CAPTURE_READ_DATA: + fp_dbg ("read data"); + generic_read_ignore_data (ssm, _dev, STRIP_CAPTURE_LEN); + break; + + case CAPTURE_REQUEST_STRIP: + fp_dbg ("request strip"); + if (self->deactivating) + fpi_ssm_mark_completed (ssm); + else + aes_write_regv (dev, strip_scan_reqs, G_N_ELEMENTS (strip_scan_reqs), + generic_write_regv_cb, ssm); + break; + + case CAPTURE_READ_STRIP:; + FpiUsbTransfer *transfer = fpi_usb_transfer_new (_dev); + + fpi_usb_transfer_fill_bulk (transfer, EP_IN, STRIP_CAPTURE_LEN); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + capture_read_strip_cb, NULL); + fpi_usb_transfer_unref (transfer); + break; + } + ; } -static void capture_sm_complete(FpiSsm *ssm, FpDevice *_dev, void *user_data, - GError *error) +static void +capture_sm_complete (FpiSsm *ssm, FpDevice *_dev, void *user_data, + GError *error) { - FpImageDevice *dev = user_data; - FpiDeviceAes1610 *self = FPI_DEVICE_AES1610(_dev); + FpImageDevice *dev = user_data; + FpiDeviceAes1610 *self = FPI_DEVICE_AES1610 (_dev); - G_DEBUG_HERE(); - if (self->deactivating) { - complete_deactivation(dev); - if (error) - g_error_free (error); - } else if (error) { - fpi_image_device_session_error(dev, error); - } else { - start_finger_detection(dev); - } - fpi_ssm_free(ssm); + G_DEBUG_HERE (); + if (self->deactivating) + { + complete_deactivation (dev); + if (error) + g_error_free (error); + } + else if (error) + { + fpi_image_device_session_error (dev, error); + } + else + { + start_finger_detection (dev); + } + fpi_ssm_free (ssm); } -static void start_capture(FpImageDevice *dev) +static void +start_capture (FpImageDevice *dev) { - FpiDeviceAes1610 *self = FPI_DEVICE_AES1610(dev); - FpiSsm *ssm; + FpiDeviceAes1610 *self = FPI_DEVICE_AES1610 (dev); + FpiSsm *ssm; - if (self->deactivating) { - complete_deactivation(dev); - return; - } + if (self->deactivating) + { + complete_deactivation (dev); + return; + } - ssm = fpi_ssm_new(FP_DEVICE(dev), capture_run_state, - CAPTURE_NUM_STATES, dev); - G_DEBUG_HERE(); - fpi_ssm_start(ssm, capture_sm_complete); + ssm = fpi_ssm_new (FP_DEVICE (dev), capture_run_state, + CAPTURE_NUM_STATES, dev); + G_DEBUG_HERE (); + fpi_ssm_start (ssm, capture_sm_complete); } /****** INITIALIZATION/DEINITIALIZATION ******/ static const struct aes_regwrite init[] = { - { 0x82, 0x00 } + { 0x82, 0x00 } }; /* -static const struct aes_regwrite stop_reader[] = { - { 0xFF, 0x00 } -}; -*/ + static const struct aes_regwrite stop_reader[] = { + { 0xFF, 0x00 } + }; + */ enum activate_states { - WRITE_INIT, - ACTIVATE_NUM_STATES, + WRITE_INIT, + ACTIVATE_NUM_STATES, }; -static void activate_run_state(FpiSsm *ssm, FpDevice *_dev, void *user_data) +static void +activate_run_state (FpiSsm *ssm, FpDevice *_dev, void *user_data) { - FpImageDevice *dev = user_data; + FpImageDevice *dev = user_data; - /* activation on aes1610 seems much more straightforward compared to aes2501 */ - /* verify there's anything missing here */ - switch (fpi_ssm_get_cur_state(ssm)) { - case WRITE_INIT: - fp_dbg("write init"); - aes_write_regv(dev, init, G_N_ELEMENTS(init), generic_write_regv_cb, ssm); - break; - } + /* activation on aes1610 seems much more straightforward compared to aes2501 */ + /* verify there's anything missing here */ + switch (fpi_ssm_get_cur_state (ssm)) + { + case WRITE_INIT: + fp_dbg ("write init"); + aes_write_regv (dev, init, G_N_ELEMENTS (init), generic_write_regv_cb, ssm); + break; + } } /* jump to finger detection */ -static void activate_sm_complete(FpiSsm *ssm, FpDevice *_dev, - void *user_data, GError *error) +static void +activate_sm_complete (FpiSsm *ssm, FpDevice *_dev, + void *user_data, GError *error) { - FpImageDevice *dev = user_data; - fpi_image_device_activate_complete(dev, error); + FpImageDevice *dev = user_data; - if (!error) - start_finger_detection(dev); - fpi_ssm_free(ssm); + fpi_image_device_activate_complete (dev, error); + + if (!error) + start_finger_detection (dev); + fpi_ssm_free (ssm); } -static void dev_activate(FpImageDevice *dev) +static void +dev_activate (FpImageDevice *dev) { - FpiDeviceAes1610 *self = FPI_DEVICE_AES1610(dev); - FpiSsm *ssm = fpi_ssm_new(FP_DEVICE(dev), activate_run_state, - ACTIVATE_NUM_STATES, dev); - self->read_regs_retry_count = 0; - fpi_ssm_start(ssm, activate_sm_complete); + FpiDeviceAes1610 *self = FPI_DEVICE_AES1610 (dev); + FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (dev), activate_run_state, + ACTIVATE_NUM_STATES, dev); + + self->read_regs_retry_count = 0; + fpi_ssm_start (ssm, activate_sm_complete); } -static void dev_deactivate(FpImageDevice *dev) +static void +dev_deactivate (FpImageDevice *dev) { - FpiDeviceAes1610 *self = FPI_DEVICE_AES1610(dev); - /* FIXME: audit cancellation points, probably need more, specifically - * in error handling paths? */ - self->deactivating = TRUE; + FpiDeviceAes1610 *self = FPI_DEVICE_AES1610 (dev); + + /* FIXME: audit cancellation points, probably need more, specifically + * in error handling paths? */ + self->deactivating = TRUE; } -static void complete_deactivation(FpImageDevice *dev) +static void +complete_deactivation (FpImageDevice *dev) { - FpiDeviceAes1610 *self = FPI_DEVICE_AES1610(dev); - G_DEBUG_HERE(); + FpiDeviceAes1610 *self = FPI_DEVICE_AES1610 (dev); - /* FIXME: if we're in the middle of a scan, we should cancel the scan. - * maybe we can do this with a master reset, unconditionally? */ + G_DEBUG_HERE (); - self->deactivating = FALSE; - g_slist_free(self->strips); - self->strips = NULL; - self->strips_len = 0; - self->blanks_count = 0; - fpi_image_device_deactivate_complete(dev, NULL); + /* FIXME: if we're in the middle of a scan, we should cancel the scan. + * maybe we can do this with a master reset, unconditionally? */ + + self->deactivating = FALSE; + g_slist_free (self->strips); + self->strips = NULL; + self->strips_len = 0; + self->blanks_count = 0; + fpi_image_device_deactivate_complete (dev, NULL); } -static void dev_init(FpImageDevice *dev) +static void +dev_init (FpImageDevice *dev) { - GError *error = NULL; - /* FIXME check endpoints */ + GError *error = NULL; - if (!g_usb_device_claim_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), 0, 0, &error)) { - fpi_image_device_open_complete(dev, error); - return; - } + /* FIXME check endpoints */ - fpi_image_device_open_complete(dev, NULL); + if (!g_usb_device_claim_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), 0, 0, &error)) + { + fpi_image_device_open_complete (dev, error); + return; + } + + fpi_image_device_open_complete (dev, NULL); } -static void dev_deinit(FpImageDevice *dev) +static void +dev_deinit (FpImageDevice *dev) { - GError *error = NULL; + GError *error = NULL; - g_usb_device_release_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), - 0, 0, &error); - fpi_image_device_close_complete(dev, error); + g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), + 0, 0, &error); + fpi_image_device_close_complete (dev, error); } -static const FpIdEntry id_table [ ] = { - { .vid = 0x08ff, .pid = 0x1600, - }, /* AES1600 */ - { .vid = 0, .pid = 0, .driver_data = 0 }, +static const FpIdEntry id_table[] = { + { .vid = 0x08ff, .pid = 0x1600, },/* AES1600 */ + { .vid = 0, .pid = 0, .driver_data = 0 }, }; -static void fpi_device_aes1610_init(FpiDeviceAes1610 *self) { +static void +fpi_device_aes1610_init (FpiDeviceAes1610 *self) +{ } -static void fpi_device_aes1610_class_init(FpiDeviceAes1610Class *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); - FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS(klass); +static void +fpi_device_aes1610_class_init (FpiDeviceAes1610Class *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); + FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); - dev_class->id = "aes1610"; - dev_class->full_name = "AuthenTec AES1610"; - dev_class->type = FP_DEVICE_TYPE_USB; - dev_class->id_table = id_table; - dev_class->scan_type = FP_SCAN_TYPE_SWIPE; + dev_class->id = "aes1610"; + dev_class->full_name = "AuthenTec AES1610"; + dev_class->type = FP_DEVICE_TYPE_USB; + dev_class->id_table = id_table; + dev_class->scan_type = FP_SCAN_TYPE_SWIPE; - img_class->img_open = dev_init; - img_class->img_close = dev_deinit; - img_class->activate = dev_activate; - img_class->deactivate = dev_deactivate; + img_class->img_open = dev_init; + img_class->img_close = dev_deinit; + img_class->activate = dev_activate; + img_class->deactivate = dev_deactivate; - img_class->bz3_threshold = 20; + img_class->bz3_threshold = 20; - img_class->img_width = IMAGE_WIDTH; - img_class->img_height = -1; + img_class->img_width = IMAGE_WIDTH; + img_class->img_height = -1; } - diff --git a/libfprint/drivers/aes1660.c b/libfprint/drivers/aes1660.c index cde7b48..93da696 100644 --- a/libfprint/drivers/aes1660.c +++ b/libfprint/drivers/aes1660.c @@ -25,66 +25,71 @@ #include "aes1660.h" #define FRAME_WIDTH 128 -#define IMAGE_WIDTH (FRAME_WIDTH + (FRAME_WIDTH / 2)) +#define IMAGE_WIDTH (FRAME_WIDTH + (FRAME_WIDTH / 2)) -struct _FpiDeviceAes1660 { - FpiDeviceAesX660 parent; +struct _FpiDeviceAes1660 +{ + FpiDeviceAesX660 parent; }; -G_DECLARE_FINAL_TYPE(FpiDeviceAes1660, fpi_device_aes1660, FPI, - DEVICE_AES1660, FpiDeviceAesX660); -G_DEFINE_TYPE(FpiDeviceAes1660, fpi_device_aes1660, FPI_TYPE_DEVICE_AES_X660); +G_DECLARE_FINAL_TYPE (FpiDeviceAes1660, fpi_device_aes1660, FPI, + DEVICE_AES1660, FpiDeviceAesX660); +G_DEFINE_TYPE (FpiDeviceAes1660, fpi_device_aes1660, FPI_TYPE_DEVICE_AES_X660); static struct fpi_frame_asmbl_ctx assembling_ctx = { - .frame_width = FRAME_WIDTH, - .frame_height = AESX660_FRAME_HEIGHT, - .image_width = IMAGE_WIDTH, - .get_pixel = aes_get_pixel, + .frame_width = FRAME_WIDTH, + .frame_height = AESX660_FRAME_HEIGHT, + .image_width = IMAGE_WIDTH, + .get_pixel = aes_get_pixel, }; -static const FpIdEntry id_table [ ] = { - { .vid = 0x08ff, .pid = 0x1660, }, - { .vid = 0x08ff, .pid = 0x1680, }, - { .vid = 0x08ff, .pid = 0x1681, }, - { .vid = 0x08ff, .pid = 0x1682, }, - { .vid = 0x08ff, .pid = 0x1683, }, - { .vid = 0x08ff, .pid = 0x1684, }, - { .vid = 0x08ff, .pid = 0x1685, }, - { .vid = 0x08ff, .pid = 0x1686, }, - { .vid = 0x08ff, .pid = 0x1687, }, - { .vid = 0x08ff, .pid = 0x1688, }, - { .vid = 0x08ff, .pid = 0x1689, }, - { .vid = 0x08ff, .pid = 0x168a, }, - { .vid = 0x08ff, .pid = 0x168b, }, - { .vid = 0x08ff, .pid = 0x168c, }, - { .vid = 0x08ff, .pid = 0x168d, }, - { .vid = 0x08ff, .pid = 0x168e, }, - { .vid = 0x08ff, .pid = 0x168f, }, - { .vid = 0, .pid = 0, .driver_data = 0 }, +static const FpIdEntry id_table[] = { + { .vid = 0x08ff, .pid = 0x1660, }, + { .vid = 0x08ff, .pid = 0x1680, }, + { .vid = 0x08ff, .pid = 0x1681, }, + { .vid = 0x08ff, .pid = 0x1682, }, + { .vid = 0x08ff, .pid = 0x1683, }, + { .vid = 0x08ff, .pid = 0x1684, }, + { .vid = 0x08ff, .pid = 0x1685, }, + { .vid = 0x08ff, .pid = 0x1686, }, + { .vid = 0x08ff, .pid = 0x1687, }, + { .vid = 0x08ff, .pid = 0x1688, }, + { .vid = 0x08ff, .pid = 0x1689, }, + { .vid = 0x08ff, .pid = 0x168a, }, + { .vid = 0x08ff, .pid = 0x168b, }, + { .vid = 0x08ff, .pid = 0x168c, }, + { .vid = 0x08ff, .pid = 0x168d, }, + { .vid = 0x08ff, .pid = 0x168e, }, + { .vid = 0x08ff, .pid = 0x168f, }, + { .vid = 0, .pid = 0, .driver_data = 0 }, }; -static void fpi_device_aes1660_init(FpiDeviceAes1660 *self) { +static void +fpi_device_aes1660_init (FpiDeviceAes1660 *self) +{ } -static void fpi_device_aes1660_class_init(FpiDeviceAes1660Class *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); - FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS(klass); - FpiDeviceAesX660Class *aes_class = FPI_DEVICE_AES_X660_CLASS (klass); +static void +fpi_device_aes1660_class_init (FpiDeviceAes1660Class *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); + FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); + FpiDeviceAesX660Class *aes_class = FPI_DEVICE_AES_X660_CLASS (klass); - dev_class->id = "aes1660"; - dev_class->full_name = "AuthenTec AES1660"; - dev_class->type = FP_DEVICE_TYPE_USB; - dev_class->id_table = id_table; - dev_class->scan_type = FP_SCAN_TYPE_SWIPE; + dev_class->id = "aes1660"; + dev_class->full_name = "AuthenTec AES1660"; + dev_class->type = FP_DEVICE_TYPE_USB; + dev_class->id_table = id_table; + dev_class->scan_type = FP_SCAN_TYPE_SWIPE; - img_class->bz3_threshold = 20; + img_class->bz3_threshold = 20; - img_class->img_width = FRAME_WIDTH + FRAME_WIDTH / 2; - img_class->img_height = -1; + img_class->img_width = FRAME_WIDTH + FRAME_WIDTH / 2; + img_class->img_height = -1; - aes_class->init_seqs[0] = aes1660_init_1; - aes_class->init_seqs_len[0] = G_N_ELEMENTS(aes1660_init_1); - aes_class->init_seqs[1] = aes1660_init_2; - aes_class->init_seqs_len[1] = G_N_ELEMENTS(aes1660_init_2); - aes_class->start_imaging_cmd = (unsigned char *)aes1660_start_imaging_cmd; - aes_class->start_imaging_cmd_len = sizeof(aes1660_start_imaging_cmd); - aes_class->assembling_ctx = &assembling_ctx; + aes_class->init_seqs[0] = aes1660_init_1; + aes_class->init_seqs_len[0] = G_N_ELEMENTS (aes1660_init_1); + aes_class->init_seqs[1] = aes1660_init_2; + aes_class->init_seqs_len[1] = G_N_ELEMENTS (aes1660_init_2); + aes_class->start_imaging_cmd = (unsigned char *) aes1660_start_imaging_cmd; + aes_class->start_imaging_cmd_len = sizeof (aes1660_start_imaging_cmd); + aes_class->assembling_ctx = &assembling_ctx; } diff --git a/libfprint/drivers/aes1660.h b/libfprint/drivers/aes1660.h index ccfb0bc..55a94e2 100644 --- a/libfprint/drivers/aes1660.h +++ b/libfprint/drivers/aes1660.h @@ -29,912 +29,912 @@ /* INIT1 */ static const unsigned char pkt107[] = { -0x44, 0x02, 0x00, 0x04, 0x00, -0x0d, 0x23, -0x42, 0xca, 0x00, -0x00, 0x20, 0x23, -0xff, 0x3f, 0x1d, 0xc1, 0x2e, 0xa3, 0xbf, 0xc2, -0x2e, 0x00, 0xdf, 0xff, 0x2d, 0x02, 0x5a, 0xbf, -0x22, 0xc1, 0x2e, 0xa3, 0xbf, 0x02, 0xcf, 0x0f, -0x1c, 0x10, 0x18, 0x26, 0x83, 0xc8, 0x46, 0x00, -0x5b, 0x01, 0x0c, 0xa2, 0x32, 0xa8, 0xcf, 0xf1, -0x1c, 0x0c, 0x18, 0xa8, 0xaf, 0xaf, 0x31, 0x0a, -0x3a, 0x5d, 0xcf, 0x30, 0x1c, 0x05, 0x55, 0x5d, -0x41, 0x03, 0x5b, 0x5d, 0xcf, 0xfc, 0x1c, 0x01, -0x18, 0x5d, 0xaf, 0x02, 0x43, 0x00, 0x2e, 0x09, -0x5a, 0x0c, 0xef, 0x56, 0xaf, 0x2e, 0x23, 0x02, -0x2e, 0x0b, 0x87, 0x83, 0x23, 0x84, 0x23, 0x81, -0x23, 0x82, 0x23, 0x24, 0x23, 0x0a, 0xef, 0xbf, -0x22, 0x00, 0x2e, 0xa9, 0x8b, 0x57, 0x23, 0x3c, -0x23, 0xf9, 0x34, 0x6b, 0x81, 0x64, 0xef, 0x64, -0xaf, 0x09, 0x88, 0xdf, 0xef, 0x27, 0xff, 0xd6, -0xaf, 0xd7, 0xbf, 0x46, 0xef, 0x46, 0xaf, 0x2a, -0xef, 0x2a, 0xaf, 0x05, 0x81, 0x05, 0x27, 0x10, -0xef, 0x99, 0xaf, 0x9b, 0xaf, 0x04, 0xaf, 0x3d, -0x23, 0x44, 0xef, 0x20, 0xff, 0x1a, 0x27, 0x05, -0xef, 0x27, 0xff, 0x06, 0x27, 0x05, 0x27, 0x9c, -0xcf, 0xdf, 0x96, 0xfe, 0xef, 0x27, 0xff, 0x19, -0x27, 0x65, 0xdf, 0xe1, 0x22, 0x1c, 0x55, 0xe0, -0x97, 0xbf, 0x03, 0x19, 0x5e, 0xfe, 0x0c, 0x9f, -0x22, 0x0f, 0xff, 0xe1, 0x22, 0x10, 0x55, 0x20, -0x00, 0x0e, 0x52, 0x82, 0x03, 0x03, 0x53 + 0x44, 0x02, 0x00, 0x04, 0x00, + 0x0d, 0x23, + 0x42, 0xca, 0x00, + 0x00, 0x20, 0x23, + 0xff, 0x3f, 0x1d, 0xc1, 0x2e, 0xa3, 0xbf, 0xc2, + 0x2e, 0x00, 0xdf, 0xff, 0x2d, 0x02, 0x5a, 0xbf, + 0x22, 0xc1, 0x2e, 0xa3, 0xbf, 0x02, 0xcf, 0x0f, + 0x1c, 0x10, 0x18, 0x26, 0x83, 0xc8, 0x46, 0x00, + 0x5b, 0x01, 0x0c, 0xa2, 0x32, 0xa8, 0xcf, 0xf1, + 0x1c, 0x0c, 0x18, 0xa8, 0xaf, 0xaf, 0x31, 0x0a, + 0x3a, 0x5d, 0xcf, 0x30, 0x1c, 0x05, 0x55, 0x5d, + 0x41, 0x03, 0x5b, 0x5d, 0xcf, 0xfc, 0x1c, 0x01, + 0x18, 0x5d, 0xaf, 0x02, 0x43, 0x00, 0x2e, 0x09, + 0x5a, 0x0c, 0xef, 0x56, 0xaf, 0x2e, 0x23, 0x02, + 0x2e, 0x0b, 0x87, 0x83, 0x23, 0x84, 0x23, 0x81, + 0x23, 0x82, 0x23, 0x24, 0x23, 0x0a, 0xef, 0xbf, + 0x22, 0x00, 0x2e, 0xa9, 0x8b, 0x57, 0x23, 0x3c, + 0x23, 0xf9, 0x34, 0x6b, 0x81, 0x64, 0xef, 0x64, + 0xaf, 0x09, 0x88, 0xdf, 0xef, 0x27, 0xff, 0xd6, + 0xaf, 0xd7, 0xbf, 0x46, 0xef, 0x46, 0xaf, 0x2a, + 0xef, 0x2a, 0xaf, 0x05, 0x81, 0x05, 0x27, 0x10, + 0xef, 0x99, 0xaf, 0x9b, 0xaf, 0x04, 0xaf, 0x3d, + 0x23, 0x44, 0xef, 0x20, 0xff, 0x1a, 0x27, 0x05, + 0xef, 0x27, 0xff, 0x06, 0x27, 0x05, 0x27, 0x9c, + 0xcf, 0xdf, 0x96, 0xfe, 0xef, 0x27, 0xff, 0x19, + 0x27, 0x65, 0xdf, 0xe1, 0x22, 0x1c, 0x55, 0xe0, + 0x97, 0xbf, 0x03, 0x19, 0x5e, 0xfe, 0x0c, 0x9f, + 0x22, 0x0f, 0xff, 0xe1, 0x22, 0x10, 0x55, 0x20, + 0x00, 0x0e, 0x52, 0x82, 0x03, 0x03, 0x53 }; static const unsigned char pkt112[] = { -0x42, 0xca, 0x00, -0x64, 0x20, 0xfe, 0x0d, 0x7f, -0x20, 0xf6, 0x55, 0x08, 0x50, 0x5f, 0x90, 0x82, -0x01, 0x1f, 0x90, 0xc1, 0x97, 0xa0, 0x01, 0x82, -0x01, 0xdf, 0x21, 0x80, 0x03, 0x00, 0x5e, 0x3f, -0x20, 0x29, 0xbf, 0x03, 0x0c, 0x05, 0x27, 0x01, -0x0c, 0x10, 0xff, 0x29, 0xbf, 0x05, 0x27, 0x9a, -0xcf, 0xdf, 0x96, 0xe0, 0xef, 0x27, 0xff, 0x19, -0x27, 0xfe, 0x0c, 0x9f, 0x22, 0x00, 0xff, 0xe1, -0x22, 0x10, 0x55, 0x20, 0x00, 0x0e, 0x52, 0x82, -0x03, 0x03, 0x53, 0x02, 0x0d, 0x3f, 0x20, 0x0f, -0x1f, 0xf5, 0x55, 0x5f, 0x90, 0x82, 0x01, 0x1f, -0x90, 0xc1, 0x97, 0xa0, 0x01, 0x82, 0x01, 0xdf, -0x21, 0x80, 0x03, 0x02, 0x5e, 0x7f, 0x20, 0x00, -0x53, 0xbf, 0x22, 0x29, 0xcf, 0xbf, 0x03, 0x01, -0x5e, 0x5f, 0x20, 0xdf, 0x9f, 0x28, 0xbf, 0x03, -0x0c, 0x05, 0x27, 0x24, 0xcf, 0x10, 0xdf, 0xbf, -0x01, 0x06, 0x1e, 0xe1, 0x2f, 0xe6, 0x5c, 0xdf, -0x2d, 0x00, 0x5b, 0x9f, 0x22, 0xdf, 0x96, 0xc8, -0xef, 0x20, 0xff, 0x1d, 0x00, 0x00, 0x13, 0x1a, -0x27, 0x07, 0x27, 0x9b, 0x22, 0xdf, 0x96, 0xbb, -0xcf, 0x1a, 0x88, 0xbb, 0xcf, 0x1b, 0x88, 0x01, -0x0f, 0xbc, 0xcf, 0x15, 0x88, 0xbc, 0xcf, 0x16, -0x88, 0x01, 0x0f, 0xbd, 0xcf, 0x10, 0x88, 0xbd, -0xcf, 0x11, 0x88, 0x01, 0x0f, 0xbe, 0xcf, 0x0b, -0x88, 0xbe, 0xcf, 0x0c, 0x88, 0x01, 0x0c, 0xdd, -0x97, 0x25, 0xaf, 0x05, 0x27 + 0x42, 0xca, 0x00, + 0x64, 0x20, 0xfe, 0x0d, 0x7f, + 0x20, 0xf6, 0x55, 0x08, 0x50, 0x5f, 0x90, 0x82, + 0x01, 0x1f, 0x90, 0xc1, 0x97, 0xa0, 0x01, 0x82, + 0x01, 0xdf, 0x21, 0x80, 0x03, 0x00, 0x5e, 0x3f, + 0x20, 0x29, 0xbf, 0x03, 0x0c, 0x05, 0x27, 0x01, + 0x0c, 0x10, 0xff, 0x29, 0xbf, 0x05, 0x27, 0x9a, + 0xcf, 0xdf, 0x96, 0xe0, 0xef, 0x27, 0xff, 0x19, + 0x27, 0xfe, 0x0c, 0x9f, 0x22, 0x00, 0xff, 0xe1, + 0x22, 0x10, 0x55, 0x20, 0x00, 0x0e, 0x52, 0x82, + 0x03, 0x03, 0x53, 0x02, 0x0d, 0x3f, 0x20, 0x0f, + 0x1f, 0xf5, 0x55, 0x5f, 0x90, 0x82, 0x01, 0x1f, + 0x90, 0xc1, 0x97, 0xa0, 0x01, 0x82, 0x01, 0xdf, + 0x21, 0x80, 0x03, 0x02, 0x5e, 0x7f, 0x20, 0x00, + 0x53, 0xbf, 0x22, 0x29, 0xcf, 0xbf, 0x03, 0x01, + 0x5e, 0x5f, 0x20, 0xdf, 0x9f, 0x28, 0xbf, 0x03, + 0x0c, 0x05, 0x27, 0x24, 0xcf, 0x10, 0xdf, 0xbf, + 0x01, 0x06, 0x1e, 0xe1, 0x2f, 0xe6, 0x5c, 0xdf, + 0x2d, 0x00, 0x5b, 0x9f, 0x22, 0xdf, 0x96, 0xc8, + 0xef, 0x20, 0xff, 0x1d, 0x00, 0x00, 0x13, 0x1a, + 0x27, 0x07, 0x27, 0x9b, 0x22, 0xdf, 0x96, 0xbb, + 0xcf, 0x1a, 0x88, 0xbb, 0xcf, 0x1b, 0x88, 0x01, + 0x0f, 0xbc, 0xcf, 0x15, 0x88, 0xbc, 0xcf, 0x16, + 0x88, 0x01, 0x0f, 0xbd, 0xcf, 0x10, 0x88, 0xbd, + 0xcf, 0x11, 0x88, 0x01, 0x0f, 0xbe, 0xcf, 0x0b, + 0x88, 0xbe, 0xcf, 0x0c, 0x88, 0x01, 0x0c, 0xdd, + 0x97, 0x25, 0xaf, 0x05, 0x27 }; static const unsigned char pkt116[] = { -0x42, 0xca, 0x00, -0xc8, 0x20, 0xff, 0x00, 0xab, -0x00, 0x72, 0x00, 0x4c, 0x00, 0x33, 0x00, 0x22, -0x00, 0x09, 0x88, 0xbf, 0x9d, 0x05, 0x27, 0x09, -0x27, 0x05, 0x88, 0xff, 0x97, 0x09, 0x27, 0xf6, -0x9f, 0x5f, 0x02, 0xbf, 0x9d, 0x05, 0x27, 0x0f, -0x1c, 0xc0, 0x9f, 0x8a, 0x80, 0x80, 0x10, 0x00, -0x13, 0x0f, 0x1d, 0xc1, 0x03, 0x00, 0x5f, 0x7f, -0x90, 0x05, 0x27, 0x53, 0x80, 0x2b, 0x0d, 0x05, -0x27, 0x9f, 0x22, 0x8f, 0xaf, 0x67, 0x2e, 0xe0, -0xdf, 0x04, 0x1e, 0x00, 0x52, 0x8f, 0x30, 0x67, -0x2e, 0xe1, 0xdf, 0xdf, 0x22, 0x00, 0x54, 0x8f, -0x30, 0x67, 0x2e, 0xfe, 0xdf, 0x04, 0x1e, 0x00, -0x52, 0x8f, 0x31, 0x67, 0x2e, 0xff, 0xdf, 0xdf, -0x22, 0x00, 0x54, 0x8f, 0x31, 0x8f, 0xcf, 0x03, -0x1c, 0x03, 0x1e, 0x00, 0x55, 0x0c, 0x27, 0x0d, -0x27, 0x4a, 0xcf, 0xdf, 0x96, 0x10, 0xcf, 0x5f, -0xdf, 0xbf, 0x03, 0x02, 0x5f, 0x5f, 0xcf, 0x10, -0xaf, 0x04, 0x50, 0x5e, 0xdf, 0xbf, 0x03, 0x01, -0x53, 0x5e, 0xcf, 0x10, 0xaf, 0x46, 0x88, 0x01, -0x2e, 0x1e, 0x80, 0xdd, 0x97, 0x0a, 0x40, 0x1c, -0x5a, 0x37, 0x43, 0x0b, 0x5b, 0xe2, 0xcf, 0x0f, -0x1c, 0x06, 0x1e, 0x07, 0x52, 0x62, 0xdf, 0x18, -0x1f, 0x07, 0x53, 0x04, 0x16, 0xe2, 0xaf, 0x04, -0x11, 0x62, 0xbf, 0x02, 0x50, 0x62, 0xcf, 0xdf, -0x22, 0x0e, 0x54, 0x0e, 0x88, 0x62, 0xdf, 0xbf, -0x03, 0x04, 0x53, 0x62, 0xaf + 0x42, 0xca, 0x00, + 0xc8, 0x20, 0xff, 0x00, 0xab, + 0x00, 0x72, 0x00, 0x4c, 0x00, 0x33, 0x00, 0x22, + 0x00, 0x09, 0x88, 0xbf, 0x9d, 0x05, 0x27, 0x09, + 0x27, 0x05, 0x88, 0xff, 0x97, 0x09, 0x27, 0xf6, + 0x9f, 0x5f, 0x02, 0xbf, 0x9d, 0x05, 0x27, 0x0f, + 0x1c, 0xc0, 0x9f, 0x8a, 0x80, 0x80, 0x10, 0x00, + 0x13, 0x0f, 0x1d, 0xc1, 0x03, 0x00, 0x5f, 0x7f, + 0x90, 0x05, 0x27, 0x53, 0x80, 0x2b, 0x0d, 0x05, + 0x27, 0x9f, 0x22, 0x8f, 0xaf, 0x67, 0x2e, 0xe0, + 0xdf, 0x04, 0x1e, 0x00, 0x52, 0x8f, 0x30, 0x67, + 0x2e, 0xe1, 0xdf, 0xdf, 0x22, 0x00, 0x54, 0x8f, + 0x30, 0x67, 0x2e, 0xfe, 0xdf, 0x04, 0x1e, 0x00, + 0x52, 0x8f, 0x31, 0x67, 0x2e, 0xff, 0xdf, 0xdf, + 0x22, 0x00, 0x54, 0x8f, 0x31, 0x8f, 0xcf, 0x03, + 0x1c, 0x03, 0x1e, 0x00, 0x55, 0x0c, 0x27, 0x0d, + 0x27, 0x4a, 0xcf, 0xdf, 0x96, 0x10, 0xcf, 0x5f, + 0xdf, 0xbf, 0x03, 0x02, 0x5f, 0x5f, 0xcf, 0x10, + 0xaf, 0x04, 0x50, 0x5e, 0xdf, 0xbf, 0x03, 0x01, + 0x53, 0x5e, 0xcf, 0x10, 0xaf, 0x46, 0x88, 0x01, + 0x2e, 0x1e, 0x80, 0xdd, 0x97, 0x0a, 0x40, 0x1c, + 0x5a, 0x37, 0x43, 0x0b, 0x5b, 0xe2, 0xcf, 0x0f, + 0x1c, 0x06, 0x1e, 0x07, 0x52, 0x62, 0xdf, 0x18, + 0x1f, 0x07, 0x53, 0x04, 0x16, 0xe2, 0xaf, 0x04, + 0x11, 0x62, 0xbf, 0x02, 0x50, 0x62, 0xcf, 0xdf, + 0x22, 0x0e, 0x54, 0x0e, 0x88, 0x62, 0xdf, 0xbf, + 0x03, 0x04, 0x53, 0x62, 0xaf }; static const unsigned char pkt120[] = { -0x42, 0xca, 0x00, -0x2c, 0x21, 0xdf, 0x01, 0xe2, -0xcf, 0x3f, 0x00, 0xe2, 0xaf, 0x0e, 0x88, 0x4a, -0xdf, 0x3f, 0x00, 0x4a, 0xaf, 0x00, 0x2e, 0xc4, -0x8d, 0x05, 0x27, 0xff, 0xef, 0x4a, 0xdf, 0xbf, -0x01, 0x0a, 0x88, 0xa1, 0x27, 0x5f, 0x21, 0x7f, -0x20, 0xfb, 0x55, 0x05, 0x27, 0x62, 0xcf, 0x03, -0x88, 0x1f, 0x22, 0x7f, 0x20, 0xfc, 0x55, 0x05, -0x27, 0x10, 0xdf, 0x02, 0x1f, 0x02, 0x5e, 0x04, -0xff, 0x00, 0x2e, 0x0a, 0x50, 0x05, 0x1f, 0x02, -0x5e, 0x03, 0xff, 0x00, 0x2e, 0x05, 0x50, 0x06, -0x1f, 0x02, 0x5e, 0x02, 0xff, 0x00, 0x2e, 0x00, -0x50, 0x01, 0xff, 0x05, 0x27, 0x10, 0xcf, 0x60, -0xff, 0x3f, 0x00, 0x21, 0xff, 0x00, 0x13, 0x1a, -0x27, 0x07, 0x27, 0x05, 0x27, 0x01, 0x00, 0x02, -0x57, 0x42, 0x87, 0x52, 0x80, 0x92, 0x81, 0xd2, -0x6c, 0xe2, 0x80, 0xf2, 0x80, 0xf6, 0x7b, 0xfa, -0x7e, 0xfe, 0x8b, 0xf9, 0x45, 0x04, 0x5a, 0x40, -0xef, 0xf9, 0x44, 0x03, 0x5b, 0x80, 0xef, 0x01, -0x50, 0x41, 0x2e, 0x7e, 0xdf, 0x4d, 0xaf, 0x05, -0x27, 0x28, 0xff, 0x54, 0xef, 0x19, 0x27, 0x4d, -0x26, 0xe0, 0x2f, 0xfb, 0x54, 0x27, 0xff, 0xe0, -0xef, 0x1b, 0x27, 0x10, 0xef, 0x06, 0xaf, 0xfc, -0x97, 0xfc, 0x9f, 0x1c, 0x82, 0x1c, 0x82, 0x1a, -0x27, 0x4d, 0xdf, 0x6d, 0x80, 0x5f, 0x9f, 0x06, -0x25, 0xf5, 0x55, 0x05, 0x27, 0x26, 0x1f, 0x00, -0x5f, 0xbf, 0x22, 0xff, 0x96 + 0x42, 0xca, 0x00, + 0x2c, 0x21, 0xdf, 0x01, 0xe2, + 0xcf, 0x3f, 0x00, 0xe2, 0xaf, 0x0e, 0x88, 0x4a, + 0xdf, 0x3f, 0x00, 0x4a, 0xaf, 0x00, 0x2e, 0xc4, + 0x8d, 0x05, 0x27, 0xff, 0xef, 0x4a, 0xdf, 0xbf, + 0x01, 0x0a, 0x88, 0xa1, 0x27, 0x5f, 0x21, 0x7f, + 0x20, 0xfb, 0x55, 0x05, 0x27, 0x62, 0xcf, 0x03, + 0x88, 0x1f, 0x22, 0x7f, 0x20, 0xfc, 0x55, 0x05, + 0x27, 0x10, 0xdf, 0x02, 0x1f, 0x02, 0x5e, 0x04, + 0xff, 0x00, 0x2e, 0x0a, 0x50, 0x05, 0x1f, 0x02, + 0x5e, 0x03, 0xff, 0x00, 0x2e, 0x05, 0x50, 0x06, + 0x1f, 0x02, 0x5e, 0x02, 0xff, 0x00, 0x2e, 0x00, + 0x50, 0x01, 0xff, 0x05, 0x27, 0x10, 0xcf, 0x60, + 0xff, 0x3f, 0x00, 0x21, 0xff, 0x00, 0x13, 0x1a, + 0x27, 0x07, 0x27, 0x05, 0x27, 0x01, 0x00, 0x02, + 0x57, 0x42, 0x87, 0x52, 0x80, 0x92, 0x81, 0xd2, + 0x6c, 0xe2, 0x80, 0xf2, 0x80, 0xf6, 0x7b, 0xfa, + 0x7e, 0xfe, 0x8b, 0xf9, 0x45, 0x04, 0x5a, 0x40, + 0xef, 0xf9, 0x44, 0x03, 0x5b, 0x80, 0xef, 0x01, + 0x50, 0x41, 0x2e, 0x7e, 0xdf, 0x4d, 0xaf, 0x05, + 0x27, 0x28, 0xff, 0x54, 0xef, 0x19, 0x27, 0x4d, + 0x26, 0xe0, 0x2f, 0xfb, 0x54, 0x27, 0xff, 0xe0, + 0xef, 0x1b, 0x27, 0x10, 0xef, 0x06, 0xaf, 0xfc, + 0x97, 0xfc, 0x9f, 0x1c, 0x82, 0x1c, 0x82, 0x1a, + 0x27, 0x4d, 0xdf, 0x6d, 0x80, 0x5f, 0x9f, 0x06, + 0x25, 0xf5, 0x55, 0x05, 0x27, 0x26, 0x1f, 0x00, + 0x5f, 0xbf, 0x22, 0xff, 0x96 }; static const unsigned char pkt124[] = { -0x42, 0xac, 0x00, -0x90, 0x21, 0x99, 0xef, 0x21, -0xff, 0x1d, 0x00, 0x00, 0x13, 0x1a, 0x27, 0x07, -0x27, 0x1a, 0x27, 0xd6, 0x97, 0x05, 0x27, 0xa3, -0x01, 0xa4, 0x01, 0xa3, 0x01, 0x2e, 0x00, 0xb0, -0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, -0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, -0x00, 0xb9, 0x00, 0xba, 0x00, 0x56, 0x00, 0xae, -0x00, 0x54, 0x01, 0x44, 0x01, 0x55, 0x01, 0x44, -0x01, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, -0x00, 0x83, 0x00, 0x84, 0x00, 0x81, 0x00, 0x82, -0x00, 0x24, 0x00, 0x44, 0x01, 0xdb, 0x00, 0xdc, -0x00, 0xdd, 0x00, 0xde, 0x00, 0x04, 0x00, 0x9b, -0x00, 0x99, 0x00, 0x9e, 0x00, 0x10, 0xef, 0xe6, -0x81, 0x65, 0xaf, 0x10, 0xef, 0xe6, 0x81, 0x9c, -0xaf, 0x10, 0xef, 0xe6, 0x81, 0x9a, 0xaf, 0x05, -0x27, 0xe5, 0x31, 0x1d, 0x81, 0xe5, 0x39, 0x05, -0x27, 0xc8, 0x46, 0x0b, 0x5b, 0xd3, 0x45, 0xfd, -0x5a, 0xd3, 0x45, 0xfb, 0x5a, 0xd3, 0x45, 0xf9, -0x5a, 0x41, 0x2e, 0xa1, 0xdf, 0x9f, 0x28, 0x41, -0x2e, 0xa1, 0xbf, 0x00, 0x88, 0x05, 0x27, 0x9f, -0x22, 0xbf, 0x22, 0x1f, 0x20, 0xfd, 0x53, 0x3f, -0x20, 0x14, 0x1f, 0xfa, 0x55, 0x05, 0x27 + 0x42, 0xac, 0x00, + 0x90, 0x21, 0x99, 0xef, 0x21, + 0xff, 0x1d, 0x00, 0x00, 0x13, 0x1a, 0x27, 0x07, + 0x27, 0x1a, 0x27, 0xd6, 0x97, 0x05, 0x27, 0xa3, + 0x01, 0xa4, 0x01, 0xa3, 0x01, 0x2e, 0x00, 0xb0, + 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, + 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, + 0x00, 0xb9, 0x00, 0xba, 0x00, 0x56, 0x00, 0xae, + 0x00, 0x54, 0x01, 0x44, 0x01, 0x55, 0x01, 0x44, + 0x01, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, + 0x00, 0x83, 0x00, 0x84, 0x00, 0x81, 0x00, 0x82, + 0x00, 0x24, 0x00, 0x44, 0x01, 0xdb, 0x00, 0xdc, + 0x00, 0xdd, 0x00, 0xde, 0x00, 0x04, 0x00, 0x9b, + 0x00, 0x99, 0x00, 0x9e, 0x00, 0x10, 0xef, 0xe6, + 0x81, 0x65, 0xaf, 0x10, 0xef, 0xe6, 0x81, 0x9c, + 0xaf, 0x10, 0xef, 0xe6, 0x81, 0x9a, 0xaf, 0x05, + 0x27, 0xe5, 0x31, 0x1d, 0x81, 0xe5, 0x39, 0x05, + 0x27, 0xc8, 0x46, 0x0b, 0x5b, 0xd3, 0x45, 0xfd, + 0x5a, 0xd3, 0x45, 0xfb, 0x5a, 0xd3, 0x45, 0xf9, + 0x5a, 0x41, 0x2e, 0xa1, 0xdf, 0x9f, 0x28, 0x41, + 0x2e, 0xa1, 0xbf, 0x00, 0x88, 0x05, 0x27, 0x9f, + 0x22, 0xbf, 0x22, 0x1f, 0x20, 0xfd, 0x53, 0x3f, + 0x20, 0x14, 0x1f, 0xfa, 0x55, 0x05, 0x27 }; static const unsigned char pkt128[] = { -0x42, 0xca, 0x00, -0xe5, 0x21, 0x25, 0x85, 0x01, -0x1e, 0x17, 0x55, 0xdc, 0x8a, 0x41, 0x2e, 0x53, -0xdf, 0xc1, 0x2e, 0x79, 0xdf, 0xff, 0x96, 0xdf, -0x96, 0x41, 0x2e, 0x55, 0xdf, 0xc1, 0x2e, 0x78, -0xdf, 0x9d, 0x01, 0x5d, 0x01, 0xff, 0x22, 0x00, -0x54, 0xff, 0xef, 0x2e, 0xaf, 0x05, 0x27, 0x07, -0x80, 0x9f, 0x22, 0xff, 0xaf, 0x00, 0x2e, 0x5d, -0x89, 0x05, 0x27, 0x03, 0x1e, 0x3c, 0x55, 0xaf, -0x8a, 0xa1, 0xcf, 0xfe, 0x1c, 0xa1, 0xaf, 0x05, -0x81, 0x47, 0x81, 0x76, 0x88, 0xff, 0x96, 0xdf, -0x96, 0xa1, 0xcf, 0x01, 0x18, 0xa1, 0xaf, 0x05, -0x81, 0x64, 0xef, 0xbf, 0x22, 0xbd, 0x80, 0x47, -0x81, 0x6b, 0x88, 0xff, 0x96, 0xdf, 0x96, 0x9b, -0x22, 0x14, 0x1e, 0x03, 0x53, 0xff, 0x22, 0x01, -0x55, 0x00, 0x20, 0x0a, 0x50, 0xc3, 0x97, 0xc4, -0x9f, 0x81, 0x01, 0x42, 0x01, 0x03, 0x52, 0xfa, -0x1e, 0x03, 0x53, 0xff, 0x22, 0x01, 0x55, 0x00, -0x20, 0xf2, 0x50, 0x00, 0x2e, 0xf0, 0x8b, 0x03, -0xcf, 0x7f, 0x1c, 0xff, 0xaf, 0x05, 0xef, 0xff, -0xaf, 0x00, 0xef, 0xff, 0xaf, 0xdd, 0x97, 0xff, -0xaf, 0xc2, 0x97, 0xff, 0xaf, 0xc3, 0x97, 0xff, -0xaf, 0xc0, 0x97, 0xff, 0xaf, 0xc1, 0x97, 0xff, -0xaf, 0x04, 0x0c, 0x00, 0x2e, 0x5d, 0x89, 0x05, -0x27, 0x06, 0x1e, 0x00, 0x55, 0x0f, 0x27, 0x0a, -0x1e, 0x07, 0x55, 0x00, 0x88, 0x66, 0x76, 0x3b, -0x30, 0x07, 0x35, 0xff, 0xff + 0x42, 0xca, 0x00, + 0xe5, 0x21, 0x25, 0x85, 0x01, + 0x1e, 0x17, 0x55, 0xdc, 0x8a, 0x41, 0x2e, 0x53, + 0xdf, 0xc1, 0x2e, 0x79, 0xdf, 0xff, 0x96, 0xdf, + 0x96, 0x41, 0x2e, 0x55, 0xdf, 0xc1, 0x2e, 0x78, + 0xdf, 0x9d, 0x01, 0x5d, 0x01, 0xff, 0x22, 0x00, + 0x54, 0xff, 0xef, 0x2e, 0xaf, 0x05, 0x27, 0x07, + 0x80, 0x9f, 0x22, 0xff, 0xaf, 0x00, 0x2e, 0x5d, + 0x89, 0x05, 0x27, 0x03, 0x1e, 0x3c, 0x55, 0xaf, + 0x8a, 0xa1, 0xcf, 0xfe, 0x1c, 0xa1, 0xaf, 0x05, + 0x81, 0x47, 0x81, 0x76, 0x88, 0xff, 0x96, 0xdf, + 0x96, 0xa1, 0xcf, 0x01, 0x18, 0xa1, 0xaf, 0x05, + 0x81, 0x64, 0xef, 0xbf, 0x22, 0xbd, 0x80, 0x47, + 0x81, 0x6b, 0x88, 0xff, 0x96, 0xdf, 0x96, 0x9b, + 0x22, 0x14, 0x1e, 0x03, 0x53, 0xff, 0x22, 0x01, + 0x55, 0x00, 0x20, 0x0a, 0x50, 0xc3, 0x97, 0xc4, + 0x9f, 0x81, 0x01, 0x42, 0x01, 0x03, 0x52, 0xfa, + 0x1e, 0x03, 0x53, 0xff, 0x22, 0x01, 0x55, 0x00, + 0x20, 0xf2, 0x50, 0x00, 0x2e, 0xf0, 0x8b, 0x03, + 0xcf, 0x7f, 0x1c, 0xff, 0xaf, 0x05, 0xef, 0xff, + 0xaf, 0x00, 0xef, 0xff, 0xaf, 0xdd, 0x97, 0xff, + 0xaf, 0xc2, 0x97, 0xff, 0xaf, 0xc3, 0x97, 0xff, + 0xaf, 0xc0, 0x97, 0xff, 0xaf, 0xc1, 0x97, 0xff, + 0xaf, 0x04, 0x0c, 0x00, 0x2e, 0x5d, 0x89, 0x05, + 0x27, 0x06, 0x1e, 0x00, 0x55, 0x0f, 0x27, 0x0a, + 0x1e, 0x07, 0x55, 0x00, 0x88, 0x66, 0x76, 0x3b, + 0x30, 0x07, 0x35, 0xff, 0xff }; static const unsigned char pkt133[] = { -0x42, 0xc2, 0x00, -0x49, 0x22, 0xc2, 0xbf, 0x0d, -0x27, 0x0c, 0x27, 0x0d, 0x1e, 0x02, 0x55, 0x28, -0x85, 0xf5, 0x5b, 0x7b, 0x76, 0x12, 0x1e, 0x07, -0x55, 0xdc, 0xef, 0x05, 0xff, 0x1a, 0x27, 0x56, -0xdf, 0x3f, 0x20, 0x6d, 0x80, 0x3c, 0xaf, 0x05, -0x27, 0x13, 0x1e, 0x01, 0x55, 0x3c, 0x23, 0x05, -0x27, 0x23, 0x1e, 0x0c, 0x55, 0x00, 0xef, 0x02, -0xff, 0x19, 0x27, 0xbf, 0x22, 0x20, 0xef, 0x7f, -0x9f, 0x5f, 0x20, 0xfc, 0x55, 0xf0, 0x81, 0x9f, -0x22, 0x41, 0x2e, 0xa3, 0xbf, 0x05, 0x27, 0x30, -0x1e, 0x0e, 0x55, 0x7e, 0xef, 0xff, 0xaf, 0x02, -0xef, 0xff, 0xaf, 0x00, 0xef, 0xff, 0xaf, 0xff, -0xef, 0x17, 0xff, 0x1a, 0x27, 0x07, 0x27, 0xff, -0xaf, 0xff, 0xbf, 0x00, 0x2e, 0x5d, 0x89, 0x05, -0x27, 0xcb, 0x74, 0xc9, 0xcf, 0xf3, 0x1c, 0x04, -0x18, 0xc9, 0xaf, 0x39, 0x81, 0x10, 0xff, 0xff, -0xef, 0xc1, 0x2e, 0x7c, 0xbf, 0x41, 0x2e, 0x7b, -0xbf, 0x02, 0xef, 0x41, 0x2e, 0x7a, 0xbf, 0xc9, -0x31, 0x18, 0xef, 0xc0, 0xaf, 0x04, 0x27, 0x41, -0x2e, 0x7a, 0xdf, 0xdf, 0x2d, 0x08, 0x5b, 0x01, -0xef, 0x41, 0x2e, 0x7a, 0xbf, 0xc0, 0x23, 0x18, -0xef, 0xc1, 0xaf, 0xcb, 0xcf, 0xcc, 0xdf, 0x05, -0x27, 0xc9, 0x30, 0x01, 0xef, 0x41, 0x2e, 0x7a, -0xbf, 0xc0, 0x23, 0x18, 0xef, 0xc1, 0xaf, 0x9f, -0x22, 0xbf, 0x22, 0x05, 0x27 + 0x42, 0xc2, 0x00, + 0x49, 0x22, 0xc2, 0xbf, 0x0d, + 0x27, 0x0c, 0x27, 0x0d, 0x1e, 0x02, 0x55, 0x28, + 0x85, 0xf5, 0x5b, 0x7b, 0x76, 0x12, 0x1e, 0x07, + 0x55, 0xdc, 0xef, 0x05, 0xff, 0x1a, 0x27, 0x56, + 0xdf, 0x3f, 0x20, 0x6d, 0x80, 0x3c, 0xaf, 0x05, + 0x27, 0x13, 0x1e, 0x01, 0x55, 0x3c, 0x23, 0x05, + 0x27, 0x23, 0x1e, 0x0c, 0x55, 0x00, 0xef, 0x02, + 0xff, 0x19, 0x27, 0xbf, 0x22, 0x20, 0xef, 0x7f, + 0x9f, 0x5f, 0x20, 0xfc, 0x55, 0xf0, 0x81, 0x9f, + 0x22, 0x41, 0x2e, 0xa3, 0xbf, 0x05, 0x27, 0x30, + 0x1e, 0x0e, 0x55, 0x7e, 0xef, 0xff, 0xaf, 0x02, + 0xef, 0xff, 0xaf, 0x00, 0xef, 0xff, 0xaf, 0xff, + 0xef, 0x17, 0xff, 0x1a, 0x27, 0x07, 0x27, 0xff, + 0xaf, 0xff, 0xbf, 0x00, 0x2e, 0x5d, 0x89, 0x05, + 0x27, 0xcb, 0x74, 0xc9, 0xcf, 0xf3, 0x1c, 0x04, + 0x18, 0xc9, 0xaf, 0x39, 0x81, 0x10, 0xff, 0xff, + 0xef, 0xc1, 0x2e, 0x7c, 0xbf, 0x41, 0x2e, 0x7b, + 0xbf, 0x02, 0xef, 0x41, 0x2e, 0x7a, 0xbf, 0xc9, + 0x31, 0x18, 0xef, 0xc0, 0xaf, 0x04, 0x27, 0x41, + 0x2e, 0x7a, 0xdf, 0xdf, 0x2d, 0x08, 0x5b, 0x01, + 0xef, 0x41, 0x2e, 0x7a, 0xbf, 0xc0, 0x23, 0x18, + 0xef, 0xc1, 0xaf, 0xcb, 0xcf, 0xcc, 0xdf, 0x05, + 0x27, 0xc9, 0x30, 0x01, 0xef, 0x41, 0x2e, 0x7a, + 0xbf, 0xc0, 0x23, 0x18, 0xef, 0xc1, 0xaf, 0x9f, + 0x22, 0xbf, 0x22, 0x05, 0x27 }; static const unsigned char pkt136[] = { -0x42, 0xca, 0x00, -0xa9, 0x22, 0x25, 0x85, 0x44, -0x1e, 0x01, 0x55, 0xe2, 0x2f, 0x7d, 0x50, 0x49, -0x1e, 0x02, 0x55, 0xe2, 0x2f, 0x79, 0x50, 0x05, -0x27, 0x4a, 0x1e, 0x01, 0x55, 0xe2, 0x2f, 0x74, -0x50, 0x4e, 0x1e, 0x01, 0x55, 0x00, 0x2e, 0xbb, -0x79, 0x4f, 0x1e, 0x00, 0x55, 0x7d, 0x78, 0x55, -0x1e, 0x00, 0x55, 0x05, 0x27, 0x58, 0x1e, 0x0d, -0x55, 0x02, 0x44, 0x01, 0x5a, 0x00, 0x2e, 0x07, -0x78, 0xfe, 0xcf, 0x75, 0xaf, 0xfe, 0xdf, 0x76, -0xbf, 0x41, 0x2e, 0xa4, 0xdf, 0xdf, 0x29, 0x41, -0x2e, 0xa4, 0xbf, 0x05, 0x27, 0x59, 0x1e, 0x02, -0x55, 0xfe, 0xcf, 0x10, 0xaf, 0x2b, 0x7e, 0x63, -0x1e, 0x1a, 0x55, 0x28, 0x85, 0xe2, 0x2f, 0x50, -0x5b, 0x0c, 0xef, 0x20, 0x80, 0xe2, 0x2f, 0x4c, -0x5a, 0xf0, 0xef, 0x00, 0xff, 0x19, 0x27, 0x08, -0xef, 0x06, 0xaf, 0xfe, 0xcf, 0x5f, 0x9f, 0x06, -0x25, 0xfb, 0x55, 0xfe, 0xcf, 0xfe, 0xcf, 0x41, -0x2e, 0x40, 0xbf, 0xfe, 0xcf, 0x41, 0x2e, 0x41, -0xbf, 0xfe, 0xcf, 0x41, 0x2e, 0x42, 0xbf, 0x05, -0x27, 0x64, 0x1e, 0x31, 0x55, 0xb0, 0xef, 0x00, -0xff, 0x19, 0x27, 0x0b, 0xef, 0x06, 0xaf, 0xfe, -0xcf, 0x5f, 0x9f, 0x06, 0x25, 0xfb, 0x55, 0xfe, -0xcf, 0x56, 0xaf, 0xfe, 0xcf, 0xae, 0xdf, 0x1f, -0x1c, 0xe0, 0x1d, 0x5f, 0x02, 0xae, 0xbf, 0xfe, -0xcf, 0x41, 0x2e, 0x54, 0xbf, 0xfe, 0xcf, 0x41, -0x2e, 0x77, 0xbf, 0xfe, 0xcf + 0x42, 0xca, 0x00, + 0xa9, 0x22, 0x25, 0x85, 0x44, + 0x1e, 0x01, 0x55, 0xe2, 0x2f, 0x7d, 0x50, 0x49, + 0x1e, 0x02, 0x55, 0xe2, 0x2f, 0x79, 0x50, 0x05, + 0x27, 0x4a, 0x1e, 0x01, 0x55, 0xe2, 0x2f, 0x74, + 0x50, 0x4e, 0x1e, 0x01, 0x55, 0x00, 0x2e, 0xbb, + 0x79, 0x4f, 0x1e, 0x00, 0x55, 0x7d, 0x78, 0x55, + 0x1e, 0x00, 0x55, 0x05, 0x27, 0x58, 0x1e, 0x0d, + 0x55, 0x02, 0x44, 0x01, 0x5a, 0x00, 0x2e, 0x07, + 0x78, 0xfe, 0xcf, 0x75, 0xaf, 0xfe, 0xdf, 0x76, + 0xbf, 0x41, 0x2e, 0xa4, 0xdf, 0xdf, 0x29, 0x41, + 0x2e, 0xa4, 0xbf, 0x05, 0x27, 0x59, 0x1e, 0x02, + 0x55, 0xfe, 0xcf, 0x10, 0xaf, 0x2b, 0x7e, 0x63, + 0x1e, 0x1a, 0x55, 0x28, 0x85, 0xe2, 0x2f, 0x50, + 0x5b, 0x0c, 0xef, 0x20, 0x80, 0xe2, 0x2f, 0x4c, + 0x5a, 0xf0, 0xef, 0x00, 0xff, 0x19, 0x27, 0x08, + 0xef, 0x06, 0xaf, 0xfe, 0xcf, 0x5f, 0x9f, 0x06, + 0x25, 0xfb, 0x55, 0xfe, 0xcf, 0xfe, 0xcf, 0x41, + 0x2e, 0x40, 0xbf, 0xfe, 0xcf, 0x41, 0x2e, 0x41, + 0xbf, 0xfe, 0xcf, 0x41, 0x2e, 0x42, 0xbf, 0x05, + 0x27, 0x64, 0x1e, 0x31, 0x55, 0xb0, 0xef, 0x00, + 0xff, 0x19, 0x27, 0x0b, 0xef, 0x06, 0xaf, 0xfe, + 0xcf, 0x5f, 0x9f, 0x06, 0x25, 0xfb, 0x55, 0xfe, + 0xcf, 0x56, 0xaf, 0xfe, 0xcf, 0xae, 0xdf, 0x1f, + 0x1c, 0xe0, 0x1d, 0x5f, 0x02, 0xae, 0xbf, 0xfe, + 0xcf, 0x41, 0x2e, 0x54, 0xbf, 0xfe, 0xcf, 0x41, + 0x2e, 0x77, 0xbf, 0xfe, 0xcf }; static const unsigned char pkt140[] = { -0x42, 0xca, 0x00, -0x0d, 0x23, 0x41, 0x2e, 0x55, -0xbf, 0xfe, 0xcf, 0x41, 0x2e, 0x78, 0xbf, 0xfe, -0xcf, 0xbb, 0xaf, 0xfe, 0xcf, 0xbc, 0xaf, 0xfe, -0xcf, 0xbd, 0xaf, 0xfe, 0xcf, 0xbe, 0xaf, 0xfe, -0xcf, 0x83, 0xaf, 0xfe, 0xcf, 0x84, 0xaf, 0xfe, -0xcf, 0x81, 0xaf, 0xfe, 0xcf, 0x82, 0xaf, 0xfe, -0xcf, 0x24, 0xaf, 0xfe, 0xcf, 0x02, 0x33, 0x05, -0x27, 0x66, 0x1e, 0x0b, 0x55, 0x60, 0xef, 0x21, -0xff, 0x1a, 0x27, 0x0b, 0xef, 0x06, 0xaf, 0xfe, -0xcf, 0xfe, 0xdf, 0x06, 0x27, 0x01, 0x0e, 0x06, -0x25, 0xf9, 0x55, 0x05, 0x27, 0x35, 0x74, 0xff, -0x96, 0xc6, 0x2e, 0x01, 0xdf, 0x3f, 0x2c, 0xdd, -0x9f, 0x05, 0x27, 0x01, 0xef, 0x20, 0x80, 0xe1, -0x2f, 0xeb, 0x5a, 0xfe, 0xcf, 0xdf, 0x22, 0xe7, -0x2f, 0x1e, 0x54, 0x01, 0xff, 0x05, 0xef, 0xff, -0x96, 0xdf, 0x96, 0x2d, 0xff, 0x8d, 0xef, 0x19, -0x27, 0x03, 0xcf, 0x7f, 0x1c, 0x5f, 0x9f, 0xdd, -0x97, 0x5f, 0x9f, 0xdd, 0x97, 0x5f, 0x9f, 0x05, -0xef, 0x06, 0xaf, 0x9f, 0x22, 0x5f, 0x9f, 0x06, -0x25, 0xfc, 0x55, 0x5f, 0x9f, 0x06, 0x25, 0xfc, -0x55, 0x20, 0xef, 0x08, 0xaf, 0x09, 0x23, 0x00, -0x2e, 0xd1, 0x8d, 0x67, 0x81, 0x03, 0xef, 0xfc, -0xaf, 0x86, 0xef, 0xaa, 0xaf, 0x08, 0xef, 0xe3, -0xaf, 0x9f, 0x22, 0xe2, 0xaf, 0x21, 0xef, 0x41, -0x2e, 0x47, 0xbf, 0x27, 0xef, 0xf4, 0xaf, 0x28, -0xff, 0xa7, 0xef, 0xe1, 0xbf + 0x42, 0xca, 0x00, + 0x0d, 0x23, 0x41, 0x2e, 0x55, + 0xbf, 0xfe, 0xcf, 0x41, 0x2e, 0x78, 0xbf, 0xfe, + 0xcf, 0xbb, 0xaf, 0xfe, 0xcf, 0xbc, 0xaf, 0xfe, + 0xcf, 0xbd, 0xaf, 0xfe, 0xcf, 0xbe, 0xaf, 0xfe, + 0xcf, 0x83, 0xaf, 0xfe, 0xcf, 0x84, 0xaf, 0xfe, + 0xcf, 0x81, 0xaf, 0xfe, 0xcf, 0x82, 0xaf, 0xfe, + 0xcf, 0x24, 0xaf, 0xfe, 0xcf, 0x02, 0x33, 0x05, + 0x27, 0x66, 0x1e, 0x0b, 0x55, 0x60, 0xef, 0x21, + 0xff, 0x1a, 0x27, 0x0b, 0xef, 0x06, 0xaf, 0xfe, + 0xcf, 0xfe, 0xdf, 0x06, 0x27, 0x01, 0x0e, 0x06, + 0x25, 0xf9, 0x55, 0x05, 0x27, 0x35, 0x74, 0xff, + 0x96, 0xc6, 0x2e, 0x01, 0xdf, 0x3f, 0x2c, 0xdd, + 0x9f, 0x05, 0x27, 0x01, 0xef, 0x20, 0x80, 0xe1, + 0x2f, 0xeb, 0x5a, 0xfe, 0xcf, 0xdf, 0x22, 0xe7, + 0x2f, 0x1e, 0x54, 0x01, 0xff, 0x05, 0xef, 0xff, + 0x96, 0xdf, 0x96, 0x2d, 0xff, 0x8d, 0xef, 0x19, + 0x27, 0x03, 0xcf, 0x7f, 0x1c, 0x5f, 0x9f, 0xdd, + 0x97, 0x5f, 0x9f, 0xdd, 0x97, 0x5f, 0x9f, 0x05, + 0xef, 0x06, 0xaf, 0x9f, 0x22, 0x5f, 0x9f, 0x06, + 0x25, 0xfc, 0x55, 0x5f, 0x9f, 0x06, 0x25, 0xfc, + 0x55, 0x20, 0xef, 0x08, 0xaf, 0x09, 0x23, 0x00, + 0x2e, 0xd1, 0x8d, 0x67, 0x81, 0x03, 0xef, 0xfc, + 0xaf, 0x86, 0xef, 0xaa, 0xaf, 0x08, 0xef, 0xe3, + 0xaf, 0x9f, 0x22, 0xe2, 0xaf, 0x21, 0xef, 0x41, + 0x2e, 0x47, 0xbf, 0x27, 0xef, 0xf4, 0xaf, 0x28, + 0xff, 0xa7, 0xef, 0xe1, 0xbf }; static const unsigned char pkt144[] = { -0x42, 0x88, 0x00, -0x71, 0x23, 0xe0, 0xaf, 0x08, -0xef, 0x10, 0xaf, 0x8c, 0x8d, 0x05, 0x81, 0x01, -0x2e, 0x54, 0x80, 0x01, 0x2e, 0x56, 0x80, 0x9b, -0x22, 0x9b, 0x22, 0x2d, 0xff, 0x95, 0xef, 0x19, -0x27, 0x28, 0xff, 0xa7, 0xef, 0x1a, 0x27, 0x80, -0xef, 0x06, 0xaf, 0xdc, 0x97, 0x5f, 0x9f, 0xdf, -0x22, 0x01, 0x54, 0x00, 0x2e, 0x66, 0x8a, 0x06, -0x25, 0xf7, 0x55, 0x2d, 0xff, 0x91, 0xef, 0x19, -0x27, 0xdd, 0x97, 0xdd, 0x9f, 0x5f, 0x9f, 0x7f, -0x9f, 0xfd, 0x0d, 0xdf, 0x22, 0x01, 0x55, 0xff, -0x22, 0x01, 0x54, 0x01, 0xef, 0x1f, 0x98, 0x2f, -0xef, 0x41, 0x2e, 0x47, 0xbf, 0x11, 0xef, 0xf4, -0xaf, 0x28, 0xff, 0xa7, 0xef, 0xe1, 0xbf, 0xe0, -0xaf, 0x01, 0x2e, 0x54, 0x80, 0x01, 0x2e, 0x56, -0x80, 0x9b, 0x22, 0x9b, 0x22, 0x2e, 0xff, 0x15, -0xef, 0x19, 0x27, 0x28, 0xff, 0xa7, 0xef, 0x1a, -0x27, 0x80, 0xef, 0x06, 0xaf, 0x00, 0x2e, 0x3c, -0x8a, 0x05, 0x27 + 0x42, 0x88, 0x00, + 0x71, 0x23, 0xe0, 0xaf, 0x08, + 0xef, 0x10, 0xaf, 0x8c, 0x8d, 0x05, 0x81, 0x01, + 0x2e, 0x54, 0x80, 0x01, 0x2e, 0x56, 0x80, 0x9b, + 0x22, 0x9b, 0x22, 0x2d, 0xff, 0x95, 0xef, 0x19, + 0x27, 0x28, 0xff, 0xa7, 0xef, 0x1a, 0x27, 0x80, + 0xef, 0x06, 0xaf, 0xdc, 0x97, 0x5f, 0x9f, 0xdf, + 0x22, 0x01, 0x54, 0x00, 0x2e, 0x66, 0x8a, 0x06, + 0x25, 0xf7, 0x55, 0x2d, 0xff, 0x91, 0xef, 0x19, + 0x27, 0xdd, 0x97, 0xdd, 0x9f, 0x5f, 0x9f, 0x7f, + 0x9f, 0xfd, 0x0d, 0xdf, 0x22, 0x01, 0x55, 0xff, + 0x22, 0x01, 0x54, 0x01, 0xef, 0x1f, 0x98, 0x2f, + 0xef, 0x41, 0x2e, 0x47, 0xbf, 0x11, 0xef, 0xf4, + 0xaf, 0x28, 0xff, 0xa7, 0xef, 0xe1, 0xbf, 0xe0, + 0xaf, 0x01, 0x2e, 0x54, 0x80, 0x01, 0x2e, 0x56, + 0x80, 0x9b, 0x22, 0x9b, 0x22, 0x2e, 0xff, 0x15, + 0xef, 0x19, 0x27, 0x28, 0xff, 0xa7, 0xef, 0x1a, + 0x27, 0x80, 0xef, 0x06, 0xaf, 0x00, 0x2e, 0x3c, + 0x8a, 0x05, 0x27 }; static const unsigned char pkt148[] = { -0x42, 0xca, 0x00, -0xb4, 0x23, 0x37, 0xcf, 0xdf, -0x96, 0x08, 0xcf, 0xdf, 0x96, 0x3d, 0xcf, 0xdf, -0x96, 0x00, 0x2e, 0xd4, 0x8d, 0xdd, 0x97, 0x3d, -0xaf, 0xdd, 0x97, 0x08, 0xaf, 0xdd, 0x97, 0x37, -0xaf, 0x03, 0xcf, 0x51, 0x1e, 0x00, 0x55, 0x44, -0x8b, 0xa0, 0xcf, 0xbf, 0x1c, 0xa0, 0xaf, 0x05, -0x81, 0xfb, 0x39, 0x08, 0x45, 0x00, 0x5a, 0xfb, -0x31, 0x0a, 0x42, 0x00, 0x5b, 0xa2, 0x39, 0x02, -0xcf, 0x5c, 0xaf, 0xe1, 0xef, 0x40, 0x2e, 0x95, -0xbf, 0x9f, 0x22, 0x25, 0xaf, 0x69, 0xaf, 0x6a, -0xaf, 0x16, 0xaf, 0x40, 0x2e, 0x96, 0xbf, 0x29, -0xaf, 0x02, 0x47, 0x06, 0x5a, 0x0a, 0x41, 0x04, -0x5a, 0x0a, 0xdf, 0x30, 0x1d, 0x30, 0x1f, 0x00, -0x54, 0x01, 0xef, 0x44, 0xaf, 0x09, 0xef, 0x60, -0xaf, 0x0a, 0x40, 0x06, 0x5a, 0x10, 0xcf, 0x27, -0xaf, 0xe2, 0x23, 0x6e, 0x23, 0x08, 0xef, 0xe3, -0xaf, 0x6f, 0xaf, 0x0d, 0x8d, 0x5d, 0xcf, 0x30, -0x1c, 0x00, 0x1e, 0x07, 0x55, 0xf8, 0xcf, 0x5f, -0x2b, 0x9f, 0x29, 0xf8, 0xaf, 0xa1, 0xcf, 0xc1, -0x1c, 0xa1, 0xaf, 0x09, 0x50, 0x10, 0x1e, 0x07, -0x55, 0xf8, 0xcf, 0x5f, 0x29, 0x9f, 0x2b, 0xf8, -0xaf, 0xa1, 0xcf, 0xc1, 0x1c, 0x08, 0x18, 0xa1, -0xaf, 0x41, 0x2e, 0xa4, 0xdf, 0xdf, 0x2d, 0x04, -0x5b, 0x75, 0xcf, 0xf4, 0xaf, 0x76, 0xcf, 0xf5, -0xaf, 0x00, 0x50, 0x0f, 0x88, 0xe2, 0x23, 0x08, -0xef, 0xe3, 0xaf, 0x81, 0x82 + 0x42, 0xca, 0x00, + 0xb4, 0x23, 0x37, 0xcf, 0xdf, + 0x96, 0x08, 0xcf, 0xdf, 0x96, 0x3d, 0xcf, 0xdf, + 0x96, 0x00, 0x2e, 0xd4, 0x8d, 0xdd, 0x97, 0x3d, + 0xaf, 0xdd, 0x97, 0x08, 0xaf, 0xdd, 0x97, 0x37, + 0xaf, 0x03, 0xcf, 0x51, 0x1e, 0x00, 0x55, 0x44, + 0x8b, 0xa0, 0xcf, 0xbf, 0x1c, 0xa0, 0xaf, 0x05, + 0x81, 0xfb, 0x39, 0x08, 0x45, 0x00, 0x5a, 0xfb, + 0x31, 0x0a, 0x42, 0x00, 0x5b, 0xa2, 0x39, 0x02, + 0xcf, 0x5c, 0xaf, 0xe1, 0xef, 0x40, 0x2e, 0x95, + 0xbf, 0x9f, 0x22, 0x25, 0xaf, 0x69, 0xaf, 0x6a, + 0xaf, 0x16, 0xaf, 0x40, 0x2e, 0x96, 0xbf, 0x29, + 0xaf, 0x02, 0x47, 0x06, 0x5a, 0x0a, 0x41, 0x04, + 0x5a, 0x0a, 0xdf, 0x30, 0x1d, 0x30, 0x1f, 0x00, + 0x54, 0x01, 0xef, 0x44, 0xaf, 0x09, 0xef, 0x60, + 0xaf, 0x0a, 0x40, 0x06, 0x5a, 0x10, 0xcf, 0x27, + 0xaf, 0xe2, 0x23, 0x6e, 0x23, 0x08, 0xef, 0xe3, + 0xaf, 0x6f, 0xaf, 0x0d, 0x8d, 0x5d, 0xcf, 0x30, + 0x1c, 0x00, 0x1e, 0x07, 0x55, 0xf8, 0xcf, 0x5f, + 0x2b, 0x9f, 0x29, 0xf8, 0xaf, 0xa1, 0xcf, 0xc1, + 0x1c, 0xa1, 0xaf, 0x09, 0x50, 0x10, 0x1e, 0x07, + 0x55, 0xf8, 0xcf, 0x5f, 0x29, 0x9f, 0x2b, 0xf8, + 0xaf, 0xa1, 0xcf, 0xc1, 0x1c, 0x08, 0x18, 0xa1, + 0xaf, 0x41, 0x2e, 0xa4, 0xdf, 0xdf, 0x2d, 0x04, + 0x5b, 0x75, 0xcf, 0xf4, 0xaf, 0x76, 0xcf, 0xf5, + 0xaf, 0x00, 0x50, 0x0f, 0x88, 0xe2, 0x23, 0x08, + 0xef, 0xe3, 0xaf, 0x81, 0x82 }; static const unsigned char pkt152[] = { -0x42, 0x24, 0x00, -0x18, 0x24, 0x4d, 0xaf, 0xdf, -0x96, 0x64, 0xdf, 0x93, 0x82, 0x93, 0xbf, 0xdd, -0x97, 0x77, 0xff, 0x93, 0x82, 0x94, 0xbf, 0x9e, -0x23, 0xe4, 0x23, 0x05, 0x27, 0x14, 0xef, 0xf4, -0xaf, 0x00, 0xef, 0xf5, 0xaf, 0x05, 0x27 + 0x42, 0x24, 0x00, + 0x18, 0x24, 0x4d, 0xaf, 0xdf, + 0x96, 0x64, 0xdf, 0x93, 0x82, 0x93, 0xbf, 0xdd, + 0x97, 0x77, 0xff, 0x93, 0x82, 0x94, 0xbf, 0x9e, + 0x23, 0xe4, 0x23, 0x05, 0x27, 0x14, 0xef, 0xf4, + 0xaf, 0x00, 0xef, 0xf5, 0xaf, 0x05, 0x27 }; static const unsigned char pkt156[] = { -0x42, 0xca, 0x00, -0x29, 0x24, 0xfe, 0xcf, 0x58, -0xaf, 0xfe, 0xcf, 0xfe, 0xdf, 0x00, 0x2e, 0xa9, -0x8b, 0xfe, 0xcf, 0x3c, 0xaf, 0x07, 0x3d, 0x58, -0x40, 0x4a, 0x5a, 0x3c, 0x26, 0x48, 0x55, 0x37, -0x45, 0x46, 0x5a, 0xe0, 0x88, 0x44, 0x5a, 0x77, -0x88, 0x00, 0x2e, 0xd1, 0x8b, 0xfe, 0xef, 0x16, -0x80, 0x02, 0xcf, 0xdf, 0x96, 0x61, 0xef, 0xc0, -0xaf, 0x04, 0x27, 0xc1, 0x46, 0x04, 0x5b, 0xc0, -0x3e, 0x40, 0xef, 0xc1, 0xaf, 0x01, 0x2e, 0x94, -0x84, 0xd0, 0x41, 0x06, 0x5b, 0x2d, 0x88, 0xf3, -0x5b, 0x6c, 0x86, 0xdd, 0x97, 0x1f, 0x2d, 0x05, -0x5b, 0x03, 0x50, 0x01, 0x0c, 0x02, 0xcf, 0xc0, -0x1c, 0x00, 0x55, 0x05, 0x88, 0xc0, 0x23, 0x20, -0xef, 0xc1, 0xaf, 0x00, 0x2e, 0xf0, 0x8b, 0x05, -0x27, 0x9b, 0x22, 0x37, 0x45, 0x05, 0x5a, 0x41, -0x2e, 0x52, 0xdf, 0xdf, 0x2d, 0x04, 0x5b, 0x00, -0x28, 0x02, 0x50, 0x3b, 0x43, 0x00, 0x5b, 0x00, -0x28, 0xd3, 0xdf, 0xc6, 0x2e, 0x15, 0xbf, 0xd3, -0x3c, 0x40, 0xef, 0x09, 0x80, 0xdd, 0x97, 0xff, -0xaf, 0x00, 0x2e, 0x5d, 0x89, 0xc6, 0x2e, 0x15, -0xdf, 0x10, 0x1d, 0xd3, 0xcf, 0x3f, 0x02, 0xd3, -0xaf, 0x05, 0x27, 0xc1, 0x83, 0x07, 0x45, 0x05, -0x27, 0x3d, 0x23, 0x07, 0x3d, 0x02, 0xcf, 0xdf, -0x96, 0x2e, 0x88, 0x26, 0x88, 0xfe, 0xef, 0x16, -0x80, 0x05, 0xef, 0xc0, 0xaf, 0x04, 0x27, 0xd0, -0x41, 0x02, 0x5b, 0xee, 0x8f + 0x42, 0xca, 0x00, + 0x29, 0x24, 0xfe, 0xcf, 0x58, + 0xaf, 0xfe, 0xcf, 0xfe, 0xdf, 0x00, 0x2e, 0xa9, + 0x8b, 0xfe, 0xcf, 0x3c, 0xaf, 0x07, 0x3d, 0x58, + 0x40, 0x4a, 0x5a, 0x3c, 0x26, 0x48, 0x55, 0x37, + 0x45, 0x46, 0x5a, 0xe0, 0x88, 0x44, 0x5a, 0x77, + 0x88, 0x00, 0x2e, 0xd1, 0x8b, 0xfe, 0xef, 0x16, + 0x80, 0x02, 0xcf, 0xdf, 0x96, 0x61, 0xef, 0xc0, + 0xaf, 0x04, 0x27, 0xc1, 0x46, 0x04, 0x5b, 0xc0, + 0x3e, 0x40, 0xef, 0xc1, 0xaf, 0x01, 0x2e, 0x94, + 0x84, 0xd0, 0x41, 0x06, 0x5b, 0x2d, 0x88, 0xf3, + 0x5b, 0x6c, 0x86, 0xdd, 0x97, 0x1f, 0x2d, 0x05, + 0x5b, 0x03, 0x50, 0x01, 0x0c, 0x02, 0xcf, 0xc0, + 0x1c, 0x00, 0x55, 0x05, 0x88, 0xc0, 0x23, 0x20, + 0xef, 0xc1, 0xaf, 0x00, 0x2e, 0xf0, 0x8b, 0x05, + 0x27, 0x9b, 0x22, 0x37, 0x45, 0x05, 0x5a, 0x41, + 0x2e, 0x52, 0xdf, 0xdf, 0x2d, 0x04, 0x5b, 0x00, + 0x28, 0x02, 0x50, 0x3b, 0x43, 0x00, 0x5b, 0x00, + 0x28, 0xd3, 0xdf, 0xc6, 0x2e, 0x15, 0xbf, 0xd3, + 0x3c, 0x40, 0xef, 0x09, 0x80, 0xdd, 0x97, 0xff, + 0xaf, 0x00, 0x2e, 0x5d, 0x89, 0xc6, 0x2e, 0x15, + 0xdf, 0x10, 0x1d, 0xd3, 0xcf, 0x3f, 0x02, 0xd3, + 0xaf, 0x05, 0x27, 0xc1, 0x83, 0x07, 0x45, 0x05, + 0x27, 0x3d, 0x23, 0x07, 0x3d, 0x02, 0xcf, 0xdf, + 0x96, 0x2e, 0x88, 0x26, 0x88, 0xfe, 0xef, 0x16, + 0x80, 0x05, 0xef, 0xc0, 0xaf, 0x04, 0x27, 0xd0, + 0x41, 0x02, 0x5b, 0xee, 0x8f }; static const unsigned char pkt160[] = { -0x42, 0xca, 0x00, -0x8d, 0x24, 0xfa, 0x5b, 0xbf, -0x50, 0x31, 0x82, 0x04, 0xef, 0xc1, 0xaf, 0x9b, -0x22, 0x41, 0x88, 0xdd, 0x97, 0xdf, 0x22, 0x02, -0x55, 0x58, 0x40, 0x02, 0x5a, 0x09, 0x50, 0x58, -0x40, 0x07, 0x5a, 0xdd, 0x97, 0x1f, 0x2d, 0xb8, -0x5a, 0x7a, 0x88, 0xb7, 0x5b, 0x9b, 0x22, 0xc7, -0x8f, 0xb4, 0x50, 0x75, 0x88, 0xdc, 0x5b, 0xb7, -0x8f, 0x58, 0x41, 0x01, 0x5b, 0x01, 0x0c, 0xad, -0x7f, 0xd6, 0x50, 0x41, 0x2e, 0x52, 0xdf, 0xed, -0x1c, 0x04, 0x18, 0x41, 0x2e, 0x52, 0xbf, 0x05, -0x27, 0x00, 0x2e, 0xb9, 0x8b, 0xae, 0xdf, 0xe0, -0x19, 0xae, 0xbf, 0x57, 0x40, 0x00, 0x5b, 0xa1, -0x32, 0x57, 0x43, 0x00, 0x5b, 0xae, 0x3f, 0x05, -0x81, 0x05, 0x27, 0x41, 0x2e, 0x52, 0xdf, 0x03, -0x18, 0x41, 0x2e, 0x52, 0xbf, 0x05, 0x27, 0xd3, -0xdf, 0xff, 0x96, 0x9b, 0x22, 0x0b, 0x88, 0xd3, -0x3c, 0x07, 0x80, 0xdd, 0x97, 0xff, 0xaf, 0x00, -0x2e, 0x5d, 0x89, 0xdd, 0x9f, 0x10, 0x1d, 0xd3, -0xcf, 0x3f, 0x02, 0xd3, 0xaf, 0x05, 0x27, 0x37, -0x45, 0x0e, 0x5a, 0x40, 0x88, 0x0c, 0x5a, 0xd7, -0x8f, 0x00, 0x2e, 0xd7, 0x8b, 0x00, 0x2e, 0xeb, -0x8b, 0x41, 0x2e, 0x52, 0xdf, 0xdf, 0x2d, 0x00, -0x5b, 0x00, 0x28, 0x00, 0x2e, 0xf0, 0x8b, 0x05, -0x27, 0xf9, 0xcf, 0xdf, 0x96, 0xf9, 0x3d, 0x00, -0x2e, 0xd1, 0x8d, 0x28, 0xff, 0xa7, 0xef, 0xe1, -0xbf, 0xe0, 0xaf, 0x09, 0xef + 0x42, 0xca, 0x00, + 0x8d, 0x24, 0xfa, 0x5b, 0xbf, + 0x50, 0x31, 0x82, 0x04, 0xef, 0xc1, 0xaf, 0x9b, + 0x22, 0x41, 0x88, 0xdd, 0x97, 0xdf, 0x22, 0x02, + 0x55, 0x58, 0x40, 0x02, 0x5a, 0x09, 0x50, 0x58, + 0x40, 0x07, 0x5a, 0xdd, 0x97, 0x1f, 0x2d, 0xb8, + 0x5a, 0x7a, 0x88, 0xb7, 0x5b, 0x9b, 0x22, 0xc7, + 0x8f, 0xb4, 0x50, 0x75, 0x88, 0xdc, 0x5b, 0xb7, + 0x8f, 0x58, 0x41, 0x01, 0x5b, 0x01, 0x0c, 0xad, + 0x7f, 0xd6, 0x50, 0x41, 0x2e, 0x52, 0xdf, 0xed, + 0x1c, 0x04, 0x18, 0x41, 0x2e, 0x52, 0xbf, 0x05, + 0x27, 0x00, 0x2e, 0xb9, 0x8b, 0xae, 0xdf, 0xe0, + 0x19, 0xae, 0xbf, 0x57, 0x40, 0x00, 0x5b, 0xa1, + 0x32, 0x57, 0x43, 0x00, 0x5b, 0xae, 0x3f, 0x05, + 0x81, 0x05, 0x27, 0x41, 0x2e, 0x52, 0xdf, 0x03, + 0x18, 0x41, 0x2e, 0x52, 0xbf, 0x05, 0x27, 0xd3, + 0xdf, 0xff, 0x96, 0x9b, 0x22, 0x0b, 0x88, 0xd3, + 0x3c, 0x07, 0x80, 0xdd, 0x97, 0xff, 0xaf, 0x00, + 0x2e, 0x5d, 0x89, 0xdd, 0x9f, 0x10, 0x1d, 0xd3, + 0xcf, 0x3f, 0x02, 0xd3, 0xaf, 0x05, 0x27, 0x37, + 0x45, 0x0e, 0x5a, 0x40, 0x88, 0x0c, 0x5a, 0xd7, + 0x8f, 0x00, 0x2e, 0xd7, 0x8b, 0x00, 0x2e, 0xeb, + 0x8b, 0x41, 0x2e, 0x52, 0xdf, 0xdf, 0x2d, 0x00, + 0x5b, 0x00, 0x28, 0x00, 0x2e, 0xf0, 0x8b, 0x05, + 0x27, 0xf9, 0xcf, 0xdf, 0x96, 0xf9, 0x3d, 0x00, + 0x2e, 0xd1, 0x8d, 0x28, 0xff, 0xa7, 0xef, 0xe1, + 0xbf, 0xe0, 0xaf, 0x09, 0xef }; static const unsigned char pkt164[] = { -0x42, 0x6c, 0x00, -0xf1, 0x24, 0x10, 0xaf, 0x0e, -0x8c, 0x05, 0x81, 0x01, 0x2e, 0x54, 0x80, 0x01, -0x2e, 0x56, 0x80, 0x20, 0x82, 0x7b, 0x8c, 0x37, -0x82, 0x26, 0x37, 0x00, 0x5a, 0x0c, 0x50, 0xff, -0x96, 0xdf, 0x96, 0x79, 0xcf, 0x7a, 0xdf, 0xff, -0x96, 0xdf, 0x96, 0xc2, 0x97, 0xc3, 0x9f, 0x9d, -0x01, 0x5d, 0x01, 0x07, 0x53, 0xdd, 0x97, 0xdd, -0x9f, 0x79, 0xaf, 0x7a, 0xbf, 0x3b, 0x3b, 0xdd, -0x97, 0xf9, 0xaf, 0x05, 0x27, 0xff, 0x22, 0x01, -0x55, 0x32, 0x1e, 0xf3, 0x5f, 0x02, 0x0c, 0xf6, -0x8f, 0x3b, 0x33, 0x00, 0x28, 0x05, 0x27, 0x0d, -0x27, 0x3c, 0x26, 0x07, 0x54, 0x3c, 0xcf, 0x3d, -0xdf, 0x3f, 0x20, 0x3d, 0xbf, 0xdf, 0x03, 0x01, -0x52, 0x3d, 0x23, 0x0c, 0x27, 0x0d, 0x27 + 0x42, 0x6c, 0x00, + 0xf1, 0x24, 0x10, 0xaf, 0x0e, + 0x8c, 0x05, 0x81, 0x01, 0x2e, 0x54, 0x80, 0x01, + 0x2e, 0x56, 0x80, 0x20, 0x82, 0x7b, 0x8c, 0x37, + 0x82, 0x26, 0x37, 0x00, 0x5a, 0x0c, 0x50, 0xff, + 0x96, 0xdf, 0x96, 0x79, 0xcf, 0x7a, 0xdf, 0xff, + 0x96, 0xdf, 0x96, 0xc2, 0x97, 0xc3, 0x9f, 0x9d, + 0x01, 0x5d, 0x01, 0x07, 0x53, 0xdd, 0x97, 0xdd, + 0x9f, 0x79, 0xaf, 0x7a, 0xbf, 0x3b, 0x3b, 0xdd, + 0x97, 0xf9, 0xaf, 0x05, 0x27, 0xff, 0x22, 0x01, + 0x55, 0x32, 0x1e, 0xf3, 0x5f, 0x02, 0x0c, 0xf6, + 0x8f, 0x3b, 0x33, 0x00, 0x28, 0x05, 0x27, 0x0d, + 0x27, 0x3c, 0x26, 0x07, 0x54, 0x3c, 0xcf, 0x3d, + 0xdf, 0x3f, 0x20, 0x3d, 0xbf, 0xdf, 0x03, 0x01, + 0x52, 0x3d, 0x23, 0x0c, 0x27, 0x0d, 0x27 }; static const unsigned char pkt168[] = { -0x42, 0x50, 0x00, -0x26, 0x25, 0x08, 0x44, 0x12, -0x5a, 0x07, 0x40, 0x01, 0x5b, 0x4f, 0x80, 0x00, -0x50, 0x53, 0x80, 0x27, 0x0d, 0x25, 0xcf, 0x1f, -0x98, 0x29, 0xcf, 0x09, 0x27, 0x28, 0xdf, 0x3f, -0x02, 0x5f, 0x98, 0x62, 0xcf, 0xdf, 0x98, 0xd9, -0x0d, 0x02, 0x0d, 0x00, 0x2e, 0xd5, 0x7f, 0x05, -0x27, 0x01, 0x0d, 0x41, 0x2e, 0x56, 0xdf, 0x5f, -0x9f, 0x41, 0x2e, 0x57, 0xdf, 0x5f, 0x9f, 0x41, -0x2e, 0x58, 0xdf, 0x5f, 0x9f, 0x41, 0x2e, 0x59, -0xdf, 0x5f, 0x9f, 0x06, 0x0d, 0x3b, 0xcf, 0x5f, -0x9f, 0x05, 0x27 + 0x42, 0x50, 0x00, + 0x26, 0x25, 0x08, 0x44, 0x12, + 0x5a, 0x07, 0x40, 0x01, 0x5b, 0x4f, 0x80, 0x00, + 0x50, 0x53, 0x80, 0x27, 0x0d, 0x25, 0xcf, 0x1f, + 0x98, 0x29, 0xcf, 0x09, 0x27, 0x28, 0xdf, 0x3f, + 0x02, 0x5f, 0x98, 0x62, 0xcf, 0xdf, 0x98, 0xd9, + 0x0d, 0x02, 0x0d, 0x00, 0x2e, 0xd5, 0x7f, 0x05, + 0x27, 0x01, 0x0d, 0x41, 0x2e, 0x56, 0xdf, 0x5f, + 0x9f, 0x41, 0x2e, 0x57, 0xdf, 0x5f, 0x9f, 0x41, + 0x2e, 0x58, 0xdf, 0x5f, 0x9f, 0x41, 0x2e, 0x59, + 0xdf, 0x5f, 0x9f, 0x06, 0x0d, 0x3b, 0xcf, 0x5f, + 0x9f, 0x05, 0x27 }; static const unsigned char pkt172[] = { -0x42, 0xca, 0x00, -0x4d, 0x25, 0x9b, 0x22, 0xbb, -0x89, 0x22, 0x88, 0x75, 0x88, 0x14, 0x86, 0x2b, -0x86, 0x2b, 0x86, 0x2b, 0x86, 0x2b, 0x86, 0xa0, -0x88, 0x2e, 0x89, 0x24, 0x89, 0x02, 0x33, 0x07, -0x80, 0xdd, 0x97, 0xff, 0xaf, 0x00, 0x2e, 0x5d, -0x89, 0x05, 0x27, 0x6c, 0xcf, 0x6d, 0xdf, 0xbf, -0x01, 0x6c, 0xaf, 0x6d, 0x26, 0x00, 0x2e, 0x33, -0x55, 0x00, 0x2e, 0x4e, 0x50, 0xdf, 0x96, 0xff, -0x96, 0x32, 0xff, 0x07, 0xef, 0x91, 0x81, 0x7f, -0x20, 0xfb, 0x55, 0xdd, 0x9f, 0xdd, 0x97, 0x05, -0x27, 0x9f, 0x22, 0x6b, 0xaf, 0x00, 0x2e, 0x6e, -0x8f, 0x00, 0xef, 0x41, 0x2e, 0x44, 0xbf, 0x7f, -0xef, 0x41, 0x2e, 0x45, 0xbf, 0x80, 0xef, 0x0a, -0xaf, 0x00, 0x2e, 0xd1, 0x8d, 0x88, 0x82, 0x8c, -0x82, 0x6b, 0xcf, 0x10, 0xaf, 0x02, 0x2e, 0x02, -0x81, 0x40, 0xef, 0x6d, 0xaf, 0x80, 0xef, 0x6c, -0xaf, 0x00, 0x2e, 0xc4, 0x8d, 0x05, 0x81, 0x01, -0x2e, 0x54, 0x80, 0x01, 0x2e, 0x56, 0x80, 0x7f, -0x89, 0xff, 0x2f, 0xca, 0x5a, 0x6c, 0xcf, 0x6d, -0xdf, 0x3f, 0x00, 0x6c, 0xaf, 0x6d, 0x26, 0x03, -0x54, 0x6d, 0xdf, 0x16, 0x82, 0x6d, 0xbf, 0xeb, -0x50, 0x6b, 0xcf, 0x08, 0x1e, 0x11, 0x5f, 0x6c, -0x24, 0x02, 0x53, 0xff, 0xef, 0x6c, 0xaf, 0x10, -0x50, 0x6c, 0x24, 0x02, 0x53, 0xff, 0xef, 0x6c, -0xaf, 0x0b, 0x50, 0x6b, 0xcf, 0x0a, 0x1e, 0x08, -0x55, 0x6c, 0x24, 0x02, 0x53 + 0x42, 0xca, 0x00, + 0x4d, 0x25, 0x9b, 0x22, 0xbb, + 0x89, 0x22, 0x88, 0x75, 0x88, 0x14, 0x86, 0x2b, + 0x86, 0x2b, 0x86, 0x2b, 0x86, 0x2b, 0x86, 0xa0, + 0x88, 0x2e, 0x89, 0x24, 0x89, 0x02, 0x33, 0x07, + 0x80, 0xdd, 0x97, 0xff, 0xaf, 0x00, 0x2e, 0x5d, + 0x89, 0x05, 0x27, 0x6c, 0xcf, 0x6d, 0xdf, 0xbf, + 0x01, 0x6c, 0xaf, 0x6d, 0x26, 0x00, 0x2e, 0x33, + 0x55, 0x00, 0x2e, 0x4e, 0x50, 0xdf, 0x96, 0xff, + 0x96, 0x32, 0xff, 0x07, 0xef, 0x91, 0x81, 0x7f, + 0x20, 0xfb, 0x55, 0xdd, 0x9f, 0xdd, 0x97, 0x05, + 0x27, 0x9f, 0x22, 0x6b, 0xaf, 0x00, 0x2e, 0x6e, + 0x8f, 0x00, 0xef, 0x41, 0x2e, 0x44, 0xbf, 0x7f, + 0xef, 0x41, 0x2e, 0x45, 0xbf, 0x80, 0xef, 0x0a, + 0xaf, 0x00, 0x2e, 0xd1, 0x8d, 0x88, 0x82, 0x8c, + 0x82, 0x6b, 0xcf, 0x10, 0xaf, 0x02, 0x2e, 0x02, + 0x81, 0x40, 0xef, 0x6d, 0xaf, 0x80, 0xef, 0x6c, + 0xaf, 0x00, 0x2e, 0xc4, 0x8d, 0x05, 0x81, 0x01, + 0x2e, 0x54, 0x80, 0x01, 0x2e, 0x56, 0x80, 0x7f, + 0x89, 0xff, 0x2f, 0xca, 0x5a, 0x6c, 0xcf, 0x6d, + 0xdf, 0x3f, 0x00, 0x6c, 0xaf, 0x6d, 0x26, 0x03, + 0x54, 0x6d, 0xdf, 0x16, 0x82, 0x6d, 0xbf, 0xeb, + 0x50, 0x6b, 0xcf, 0x08, 0x1e, 0x11, 0x5f, 0x6c, + 0x24, 0x02, 0x53, 0xff, 0xef, 0x6c, 0xaf, 0x10, + 0x50, 0x6c, 0x24, 0x02, 0x53, 0xff, 0xef, 0x6c, + 0xaf, 0x0b, 0x50, 0x6b, 0xcf, 0x0a, 0x1e, 0x08, + 0x55, 0x6c, 0x24, 0x02, 0x53 }; static const unsigned char pkt176[] = { -0x42, 0xca, 0x00, -0xb1, 0x25, 0xff, 0xef, 0x6c, -0xaf, 0x03, 0x50, 0x6c, 0x24, 0x01, 0x53, 0xff, -0xef, 0x6c, 0xaf, 0x6b, 0xcf, 0xdf, 0x96, 0xb0, -0xef, 0x00, 0xff, 0x1d, 0x00, 0x00, 0x13, 0x1b, -0x27, 0x6c, 0xcf, 0x9f, 0x9d, 0x6b, 0xcf, 0x1f, -0x20, 0x6b, 0xaf, 0x0a, 0x1e, 0xbc, 0x5f, 0x05, -0x27, 0x0c, 0xef, 0x41, 0x2e, 0x76, 0xbf, 0x10, -0xef, 0x6d, 0xaf, 0xae, 0xcf, 0xe0, 0x1c, 0xae, -0xaf, 0x0b, 0x78, 0xcb, 0xcf, 0xcc, 0xdf, 0x0a, -0x1f, 0x07, 0x52, 0x01, 0x5e, 0x00, 0x1e, 0x04, -0x5f, 0xae, 0xcf, 0x6d, 0xdf, 0xbf, 0x01, 0xae, -0xaf, 0x03, 0x78, 0xae, 0xcf, 0x6d, 0xdf, 0x3f, -0x00, 0xae, 0xaf, 0x16, 0x82, 0x6d, 0xbf, 0x05, -0x81, 0x64, 0xef, 0xbf, 0x22, 0xbd, 0x80, 0x34, -0x81, 0x53, 0x81, 0x6d, 0x26, 0xe5, 0x55, 0xcb, -0xcf, 0xcc, 0xdf, 0x0a, 0x1f, 0x02, 0x5e, 0x04, -0x52, 0x00, 0x1e, 0x02, 0x5f, 0xae, 0xcf, 0x5f, -0x20, 0xae, 0xaf, 0x00, 0xef, 0x41, 0x2e, 0x76, -0xbf, 0x05, 0x27, 0x00, 0x2e, 0x6e, 0x8f, 0x02, -0x2e, 0x6b, 0x81, 0x00, 0x2e, 0xd1, 0x8d, 0x73, -0x23, 0x0a, 0xef, 0x10, 0xaf, 0x02, 0x2e, 0x02, -0x81, 0x80, 0xef, 0x00, 0x2e, 0xc4, 0x8d, 0x05, -0x81, 0x08, 0xef, 0x06, 0xaf, 0x01, 0x2e, 0x54, -0x80, 0x01, 0x2e, 0x56, 0x80, 0x06, 0x25, 0xf9, -0x55, 0xb3, 0x88, 0x40, 0xcf, 0xe0, 0xaf, 0x41, -0xdf, 0xe1, 0xbf, 0x41, 0x2e + 0x42, 0xca, 0x00, + 0xb1, 0x25, 0xff, 0xef, 0x6c, + 0xaf, 0x03, 0x50, 0x6c, 0x24, 0x01, 0x53, 0xff, + 0xef, 0x6c, 0xaf, 0x6b, 0xcf, 0xdf, 0x96, 0xb0, + 0xef, 0x00, 0xff, 0x1d, 0x00, 0x00, 0x13, 0x1b, + 0x27, 0x6c, 0xcf, 0x9f, 0x9d, 0x6b, 0xcf, 0x1f, + 0x20, 0x6b, 0xaf, 0x0a, 0x1e, 0xbc, 0x5f, 0x05, + 0x27, 0x0c, 0xef, 0x41, 0x2e, 0x76, 0xbf, 0x10, + 0xef, 0x6d, 0xaf, 0xae, 0xcf, 0xe0, 0x1c, 0xae, + 0xaf, 0x0b, 0x78, 0xcb, 0xcf, 0xcc, 0xdf, 0x0a, + 0x1f, 0x07, 0x52, 0x01, 0x5e, 0x00, 0x1e, 0x04, + 0x5f, 0xae, 0xcf, 0x6d, 0xdf, 0xbf, 0x01, 0xae, + 0xaf, 0x03, 0x78, 0xae, 0xcf, 0x6d, 0xdf, 0x3f, + 0x00, 0xae, 0xaf, 0x16, 0x82, 0x6d, 0xbf, 0x05, + 0x81, 0x64, 0xef, 0xbf, 0x22, 0xbd, 0x80, 0x34, + 0x81, 0x53, 0x81, 0x6d, 0x26, 0xe5, 0x55, 0xcb, + 0xcf, 0xcc, 0xdf, 0x0a, 0x1f, 0x02, 0x5e, 0x04, + 0x52, 0x00, 0x1e, 0x02, 0x5f, 0xae, 0xcf, 0x5f, + 0x20, 0xae, 0xaf, 0x00, 0xef, 0x41, 0x2e, 0x76, + 0xbf, 0x05, 0x27, 0x00, 0x2e, 0x6e, 0x8f, 0x02, + 0x2e, 0x6b, 0x81, 0x00, 0x2e, 0xd1, 0x8d, 0x73, + 0x23, 0x0a, 0xef, 0x10, 0xaf, 0x02, 0x2e, 0x02, + 0x81, 0x80, 0xef, 0x00, 0x2e, 0xc4, 0x8d, 0x05, + 0x81, 0x08, 0xef, 0x06, 0xaf, 0x01, 0x2e, 0x54, + 0x80, 0x01, 0x2e, 0x56, 0x80, 0x06, 0x25, 0xf9, + 0x55, 0xb3, 0x88, 0x40, 0xcf, 0xe0, 0xaf, 0x41, + 0xdf, 0xe1, 0xbf, 0x41, 0x2e }; static const unsigned char pkt180[] = { -0x42, 0xca, 0x00, -0x15, 0x26, 0x4e, 0xdf, 0xf7, -0x1c, 0x41, 0x2e, 0x4e, 0xbf, 0x01, 0x2e, 0x54, -0x80, 0x01, 0x2e, 0x56, 0x80, 0x4f, 0x82, 0x40, -0x2e, 0x8f, 0xdf, 0xdf, 0x22, 0xed, 0x55, 0x30, -0x88, 0x4e, 0x23, 0x4e, 0xcf, 0x31, 0x88, 0x37, -0x88, 0x3f, 0x9f, 0x4e, 0xcf, 0x2d, 0x88, 0x39, -0x88, 0x1f, 0x9f, 0x4e, 0x24, 0x4e, 0xcf, 0x04, -0x1e, 0xf3, 0x55, 0xf8, 0x0f, 0x08, 0xef, 0x06, -0xaf, 0xf6, 0x97, 0xbc, 0x03, 0x01, 0x5f, 0xff, -0x0f, 0xfc, 0x97, 0x06, 0x25, 0xf9, 0x55, 0xf8, -0x0f, 0x08, 0xff, 0x06, 0xbf, 0xf6, 0x9f, 0xdf, -0x01, 0xa1, 0x27, 0x7f, 0x21, 0x3f, 0x9f, 0x06, -0x25, 0xf8, 0x55, 0xf8, 0x0f, 0x04, 0xef, 0x06, -0xaf, 0xbb, 0xef, 0x00, 0xff, 0x1a, 0x27, 0xfc, -0x9f, 0xfc, 0x97, 0x09, 0x27, 0x5f, 0x02, 0x3f, -0x97, 0x06, 0x25, 0xf8, 0x55, 0x81, 0xcf, 0x24, -0xaf, 0x05, 0x27, 0x54, 0xef, 0x28, 0xff, 0x1b, -0x27, 0x05, 0x27, 0xdf, 0x96, 0x40, 0xcf, 0x41, -0xdf, 0x1d, 0x00, 0x00, 0x13, 0x19, 0x27, 0x05, -0x27, 0x0f, 0xff, 0x0b, 0x88, 0x40, 0x10, 0x00, -0x13, 0x8e, 0x81, 0x05, 0x27, 0xf0, 0xff, 0x05, -0x88, 0x04, 0x11, 0x3f, 0x22, 0xff, 0x97, 0x09, -0x27, 0x0f, 0x1c, 0x05, 0x27, 0xff, 0x96, 0x9b, -0x22, 0x9b, 0x22, 0x80, 0xef, 0x06, 0xaf, 0xe0, -0x97, 0x02, 0x03, 0xbf, 0x22, 0x00, 0x00, 0xc1, -0x00, 0x1f, 0x90, 0x7f, 0x90 + 0x42, 0xca, 0x00, + 0x15, 0x26, 0x4e, 0xdf, 0xf7, + 0x1c, 0x41, 0x2e, 0x4e, 0xbf, 0x01, 0x2e, 0x54, + 0x80, 0x01, 0x2e, 0x56, 0x80, 0x4f, 0x82, 0x40, + 0x2e, 0x8f, 0xdf, 0xdf, 0x22, 0xed, 0x55, 0x30, + 0x88, 0x4e, 0x23, 0x4e, 0xcf, 0x31, 0x88, 0x37, + 0x88, 0x3f, 0x9f, 0x4e, 0xcf, 0x2d, 0x88, 0x39, + 0x88, 0x1f, 0x9f, 0x4e, 0x24, 0x4e, 0xcf, 0x04, + 0x1e, 0xf3, 0x55, 0xf8, 0x0f, 0x08, 0xef, 0x06, + 0xaf, 0xf6, 0x97, 0xbc, 0x03, 0x01, 0x5f, 0xff, + 0x0f, 0xfc, 0x97, 0x06, 0x25, 0xf9, 0x55, 0xf8, + 0x0f, 0x08, 0xff, 0x06, 0xbf, 0xf6, 0x9f, 0xdf, + 0x01, 0xa1, 0x27, 0x7f, 0x21, 0x3f, 0x9f, 0x06, + 0x25, 0xf8, 0x55, 0xf8, 0x0f, 0x04, 0xef, 0x06, + 0xaf, 0xbb, 0xef, 0x00, 0xff, 0x1a, 0x27, 0xfc, + 0x9f, 0xfc, 0x97, 0x09, 0x27, 0x5f, 0x02, 0x3f, + 0x97, 0x06, 0x25, 0xf8, 0x55, 0x81, 0xcf, 0x24, + 0xaf, 0x05, 0x27, 0x54, 0xef, 0x28, 0xff, 0x1b, + 0x27, 0x05, 0x27, 0xdf, 0x96, 0x40, 0xcf, 0x41, + 0xdf, 0x1d, 0x00, 0x00, 0x13, 0x19, 0x27, 0x05, + 0x27, 0x0f, 0xff, 0x0b, 0x88, 0x40, 0x10, 0x00, + 0x13, 0x8e, 0x81, 0x05, 0x27, 0xf0, 0xff, 0x05, + 0x88, 0x04, 0x11, 0x3f, 0x22, 0xff, 0x97, 0x09, + 0x27, 0x0f, 0x1c, 0x05, 0x27, 0xff, 0x96, 0x9b, + 0x22, 0x9b, 0x22, 0x80, 0xef, 0x06, 0xaf, 0xe0, + 0x97, 0x02, 0x03, 0xbf, 0x22, 0x00, 0x00, 0xc1, + 0x00, 0x1f, 0x90, 0x7f, 0x90 }; static const unsigned char pkt184[] = { -0x42, 0xca, 0x00, -0x79, 0x26, 0x04, 0x0d, 0x06, -0x25, 0xf5, 0x55, 0x03, 0x0c, 0x05, 0x27, 0x04, -0xef, 0x10, 0xaf, 0x02, 0x2e, 0x02, 0x81, 0x05, -0x81, 0xf7, 0xef, 0x16, 0x80, 0x6b, 0x81, 0x05, -0x27, 0x73, 0x23, 0x08, 0xef, 0x0b, 0xaf, 0x02, -0x2e, 0x6b, 0x81, 0x00, 0x2e, 0x6e, 0x8f, 0x00, -0x2e, 0xd1, 0x8d, 0x0a, 0xef, 0x10, 0xaf, 0x02, -0x2e, 0x02, 0x81, 0x88, 0x82, 0x02, 0x2e, 0x9f, -0x80, 0x80, 0xef, 0x00, 0x2e, 0xc4, 0x8d, 0x05, -0x81, 0x0b, 0xcf, 0x06, 0xaf, 0x01, 0x2e, 0x54, -0x80, 0x01, 0x2e, 0x56, 0x80, 0x06, 0x25, 0xf9, -0x55, 0x1f, 0x88, 0x20, 0x82, 0x02, 0x2e, 0x76, -0x81, 0xf7, 0xef, 0x16, 0x80, 0x81, 0xcf, 0x72, -0xaf, 0x02, 0x2e, 0x6b, 0x81, 0x02, 0x2e, 0xc0, -0x81, 0x08, 0xef, 0x02, 0x2e, 0x51, 0x80, 0x08, -0xef, 0x02, 0x2e, 0x7a, 0x80, 0x01, 0x2e, 0x89, -0x81, 0x2d, 0xcf, 0xdf, 0x96, 0x2c, 0xcf, 0xdf, -0x96, 0x2a, 0xcf, 0x2b, 0xdf, 0x9d, 0x01, 0x5d, -0x01, 0x83, 0xaf, 0x84, 0xbf, 0xc8, 0xef, 0x0b, -0xaf, 0x05, 0x27, 0x0a, 0xef, 0x73, 0x43, 0x02, -0x5b, 0x73, 0xcf, 0x09, 0x27, 0x0f, 0x1c, 0x81, -0xaf, 0x73, 0xcf, 0x09, 0x27, 0x30, 0x1c, 0xfc, -0xdf, 0xcf, 0x1d, 0x5f, 0x02, 0xfc, 0xbf, 0x81, -0xcf, 0x10, 0xaf, 0x02, 0x2e, 0x02, 0x81, 0x88, -0x82, 0x02, 0x2e, 0x9f, 0x80, 0x40, 0xef, 0x6b, -0xaf, 0x80, 0xef, 0x82, 0xaf + 0x42, 0xca, 0x00, + 0x79, 0x26, 0x04, 0x0d, 0x06, + 0x25, 0xf5, 0x55, 0x03, 0x0c, 0x05, 0x27, 0x04, + 0xef, 0x10, 0xaf, 0x02, 0x2e, 0x02, 0x81, 0x05, + 0x81, 0xf7, 0xef, 0x16, 0x80, 0x6b, 0x81, 0x05, + 0x27, 0x73, 0x23, 0x08, 0xef, 0x0b, 0xaf, 0x02, + 0x2e, 0x6b, 0x81, 0x00, 0x2e, 0x6e, 0x8f, 0x00, + 0x2e, 0xd1, 0x8d, 0x0a, 0xef, 0x10, 0xaf, 0x02, + 0x2e, 0x02, 0x81, 0x88, 0x82, 0x02, 0x2e, 0x9f, + 0x80, 0x80, 0xef, 0x00, 0x2e, 0xc4, 0x8d, 0x05, + 0x81, 0x0b, 0xcf, 0x06, 0xaf, 0x01, 0x2e, 0x54, + 0x80, 0x01, 0x2e, 0x56, 0x80, 0x06, 0x25, 0xf9, + 0x55, 0x1f, 0x88, 0x20, 0x82, 0x02, 0x2e, 0x76, + 0x81, 0xf7, 0xef, 0x16, 0x80, 0x81, 0xcf, 0x72, + 0xaf, 0x02, 0x2e, 0x6b, 0x81, 0x02, 0x2e, 0xc0, + 0x81, 0x08, 0xef, 0x02, 0x2e, 0x51, 0x80, 0x08, + 0xef, 0x02, 0x2e, 0x7a, 0x80, 0x01, 0x2e, 0x89, + 0x81, 0x2d, 0xcf, 0xdf, 0x96, 0x2c, 0xcf, 0xdf, + 0x96, 0x2a, 0xcf, 0x2b, 0xdf, 0x9d, 0x01, 0x5d, + 0x01, 0x83, 0xaf, 0x84, 0xbf, 0xc8, 0xef, 0x0b, + 0xaf, 0x05, 0x27, 0x0a, 0xef, 0x73, 0x43, 0x02, + 0x5b, 0x73, 0xcf, 0x09, 0x27, 0x0f, 0x1c, 0x81, + 0xaf, 0x73, 0xcf, 0x09, 0x27, 0x30, 0x1c, 0xfc, + 0xdf, 0xcf, 0x1d, 0x5f, 0x02, 0xfc, 0xbf, 0x81, + 0xcf, 0x10, 0xaf, 0x02, 0x2e, 0x02, 0x81, 0x88, + 0x82, 0x02, 0x2e, 0x9f, 0x80, 0x40, 0xef, 0x6b, + 0xaf, 0x80, 0xef, 0x82, 0xaf }; static const unsigned char pkt188[] = { -0x42, 0x9a, 0x00, -0xdd, 0x26, 0x00, 0x2e, 0xc4, -0x8d, 0x05, 0x81, 0x01, 0x2e, 0x54, 0x80, 0x01, -0x2e, 0x56, 0x80, 0x20, 0x82, 0x02, 0x2e, 0xe6, -0x80, 0x0a, 0x5b, 0x73, 0x43, 0x18, 0x5a, 0x81, -0xcf, 0x5e, 0xdf, 0xbf, 0x03, 0x14, 0x5f, 0x5f, -0x20, 0x81, 0xaf, 0xdf, 0x22, 0x10, 0x54, 0xde, -0x50, 0x40, 0x2e, 0x8f, 0xdf, 0x1f, 0x2c, 0x0c, -0x5a, 0x5f, 0x2c, 0x09, 0x5b, 0x82, 0xcf, 0x6b, -0xdf, 0x3f, 0x00, 0x82, 0xaf, 0x6b, 0x26, 0xe8, -0x54, 0x6b, 0xdf, 0x16, 0x82, 0x6b, 0xbf, 0xd9, -0x50, 0x05, 0x27, 0x82, 0xcf, 0x6b, 0xdf, 0xbf, -0x01, 0x82, 0xaf, 0x6b, 0x26, 0xf4, 0x55, 0xdc, -0x50, 0x88, 0x82, 0x8c, 0x82, 0x9f, 0x22, 0xbb, -0xaf, 0xbc, 0xaf, 0xbd, 0xaf, 0xbe, 0xaf, 0x05, -0x27, 0xf9, 0x44, 0x08, 0x5a, 0xc1, 0x2e, 0x81, -0xdf, 0x01, 0x1f, 0x0e, 0x52, 0x0c, 0x5e, 0xc1, -0x2e, 0x80, 0xdf, 0xfe, 0x1f, 0x09, 0x52, 0xc1, -0x2e, 0x81, 0xdf, 0x03, 0x1f, 0x05, 0x52, 0x03, -0x5e, 0xc1, 0x2e, 0x80, 0xdf, 0xfc, 0x1f, 0x00, -0x52, 0x0c, 0x27, 0x0d, 0x27 + 0x42, 0x9a, 0x00, + 0xdd, 0x26, 0x00, 0x2e, 0xc4, + 0x8d, 0x05, 0x81, 0x01, 0x2e, 0x54, 0x80, 0x01, + 0x2e, 0x56, 0x80, 0x20, 0x82, 0x02, 0x2e, 0xe6, + 0x80, 0x0a, 0x5b, 0x73, 0x43, 0x18, 0x5a, 0x81, + 0xcf, 0x5e, 0xdf, 0xbf, 0x03, 0x14, 0x5f, 0x5f, + 0x20, 0x81, 0xaf, 0xdf, 0x22, 0x10, 0x54, 0xde, + 0x50, 0x40, 0x2e, 0x8f, 0xdf, 0x1f, 0x2c, 0x0c, + 0x5a, 0x5f, 0x2c, 0x09, 0x5b, 0x82, 0xcf, 0x6b, + 0xdf, 0x3f, 0x00, 0x82, 0xaf, 0x6b, 0x26, 0xe8, + 0x54, 0x6b, 0xdf, 0x16, 0x82, 0x6b, 0xbf, 0xd9, + 0x50, 0x05, 0x27, 0x82, 0xcf, 0x6b, 0xdf, 0xbf, + 0x01, 0x82, 0xaf, 0x6b, 0x26, 0xf4, 0x55, 0xdc, + 0x50, 0x88, 0x82, 0x8c, 0x82, 0x9f, 0x22, 0xbb, + 0xaf, 0xbc, 0xaf, 0xbd, 0xaf, 0xbe, 0xaf, 0x05, + 0x27, 0xf9, 0x44, 0x08, 0x5a, 0xc1, 0x2e, 0x81, + 0xdf, 0x01, 0x1f, 0x0e, 0x52, 0x0c, 0x5e, 0xc1, + 0x2e, 0x80, 0xdf, 0xfe, 0x1f, 0x09, 0x52, 0xc1, + 0x2e, 0x81, 0xdf, 0x03, 0x1f, 0x05, 0x52, 0x03, + 0x5e, 0xc1, 0x2e, 0x80, 0xdf, 0xfc, 0x1f, 0x00, + 0x52, 0x0c, 0x27, 0x0d, 0x27 }; static const unsigned char pkt192[] = { -0x42, 0x7e, 0x00, -0x29, 0x27, 0x53, 0x80, 0x01, -0x0d, 0xf5, 0x97, 0xff, 0x0d, 0x1f, 0x99, 0x49, -0xcf, 0x5f, 0x99, 0x08, 0x44, 0x00, 0x2e, 0x32, -0x5a, 0x0b, 0x0d, 0x44, 0xcf, 0x0c, 0x41, 0x00, -0x5b, 0x1f, 0x20, 0x44, 0xaf, 0x5f, 0x9f, 0x04, -0x0d, 0x11, 0xcf, 0x5f, 0x9f, 0x12, 0xcf, 0x5f, -0x9f, 0x1c, 0xcf, 0x5f, 0x9f, 0x1d, 0xcf, 0x5f, -0x9f, 0x4d, 0xcf, 0x5f, 0x9f, 0x49, 0xcf, 0x5f, -0x9f, 0x06, 0x0d, 0xe0, 0x97, 0x0f, 0x1c, 0x5f, -0x9f, 0x0a, 0xcf, 0x5f, 0x9f, 0x09, 0xcf, 0x5f, -0x9f, 0x78, 0xcf, 0x5f, 0x9f, 0x9f, 0xcf, 0x5f, -0x9f, 0x92, 0xcf, 0x5f, 0x9f, 0x19, 0xcf, 0x5f, -0x9f, 0x02, 0x0d, 0x85, 0xcf, 0x5f, 0x9f, 0x44, -0xdf, 0x02, 0x2e, 0x8c, 0x81, 0x5f, 0x9f, 0x4d, -0xcf, 0x5f, 0x9f, 0x01, 0x0d, 0x6a, 0xcf, 0x09, -0x27, 0x69, 0xdf, 0x3f, 0x02, 0x5f, 0x9f, 0x05, -0x27 + 0x42, 0x7e, 0x00, + 0x29, 0x27, 0x53, 0x80, 0x01, + 0x0d, 0xf5, 0x97, 0xff, 0x0d, 0x1f, 0x99, 0x49, + 0xcf, 0x5f, 0x99, 0x08, 0x44, 0x00, 0x2e, 0x32, + 0x5a, 0x0b, 0x0d, 0x44, 0xcf, 0x0c, 0x41, 0x00, + 0x5b, 0x1f, 0x20, 0x44, 0xaf, 0x5f, 0x9f, 0x04, + 0x0d, 0x11, 0xcf, 0x5f, 0x9f, 0x12, 0xcf, 0x5f, + 0x9f, 0x1c, 0xcf, 0x5f, 0x9f, 0x1d, 0xcf, 0x5f, + 0x9f, 0x4d, 0xcf, 0x5f, 0x9f, 0x49, 0xcf, 0x5f, + 0x9f, 0x06, 0x0d, 0xe0, 0x97, 0x0f, 0x1c, 0x5f, + 0x9f, 0x0a, 0xcf, 0x5f, 0x9f, 0x09, 0xcf, 0x5f, + 0x9f, 0x78, 0xcf, 0x5f, 0x9f, 0x9f, 0xcf, 0x5f, + 0x9f, 0x92, 0xcf, 0x5f, 0x9f, 0x19, 0xcf, 0x5f, + 0x9f, 0x02, 0x0d, 0x85, 0xcf, 0x5f, 0x9f, 0x44, + 0xdf, 0x02, 0x2e, 0x8c, 0x81, 0x5f, 0x9f, 0x4d, + 0xcf, 0x5f, 0x9f, 0x01, 0x0d, 0x6a, 0xcf, 0x09, + 0x27, 0x69, 0xdf, 0x3f, 0x02, 0x5f, 0x9f, 0x05, + 0x27 }; static const unsigned char pkt196[] = { -0x42, 0xca, 0x00, -0x67, 0x27, 0x00, 0x2e, 0xf5, -0x88, 0x39, 0x81, 0x84, 0x88, 0x05, 0xcf, 0xdf, -0x22, 0x33, 0x55, 0x04, 0xcf, 0x2a, 0x1e, 0x30, -0x55, 0xfe, 0xdf, 0xfe, 0xcf, 0x00, 0x1f, 0x1b, -0x55, 0x00, 0x1e, 0x0d, 0x54, 0xc6, 0x2e, 0x00, -0xdf, 0x3f, 0x20, 0xbf, 0x03, 0x14, 0x55, 0xc6, -0x2e, 0x01, 0xdf, 0x3f, 0x2c, 0x10, 0x5b, 0x46, -0x2e, 0x00, 0xbf, 0x00, 0x2e, 0xdb, 0x88, 0x09, -0x78, 0x00, 0xef, 0x46, 0x2e, 0x00, 0xbf, 0x46, -0x2e, 0x01, 0xdf, 0x1f, 0x28, 0x46, 0x2e, 0x01, -0xbf, 0x00, 0x2e, 0xbc, 0x88, 0x13, 0x88, 0x05, -0x27, 0x46, 0x2e, 0x01, 0xdf, 0x1f, 0x2a, 0x46, -0x2e, 0x01, 0xbf, 0x41, 0x2e, 0xb6, 0xdf, 0x01, -0xff, 0xab, 0xef, 0x19, 0x27, 0x42, 0xff, 0x7f, -0x98, 0x9f, 0x98, 0x24, 0x28, 0x2a, 0x85, 0x24, -0x2a, 0x05, 0x27, 0x2c, 0x85, 0x05, 0x27, 0xfd, -0x0c, 0x00, 0x2e, 0xab, 0x88, 0x14, 0xef, 0x00, -0x2e, 0xef, 0x88, 0x32, 0x88, 0x3a, 0x88, 0x34, -0x88, 0x38, 0x88, 0x32, 0x88, 0x36, 0x88, 0x30, -0x88, 0x34, 0x88, 0x2e, 0x88, 0x32, 0x88, 0x46, -0x2e, 0x00, 0xdf, 0x1f, 0x9f, 0xe2, 0xef, 0x1f, -0x90, 0xe0, 0xff, 0x7f, 0x90, 0x0e, 0xef, 0x00, -0x2e, 0xe7, 0x88, 0x80, 0xef, 0x1f, 0x9f, 0x9f, -0x22, 0x1f, 0x9f, 0x1f, 0x9f, 0x1f, 0x9f, 0x1f, -0x9f, 0x1f, 0x9f, 0x1f, 0x9f, 0x01, 0xef, 0x1f, -0x9f, 0xb8, 0xef, 0x1f, 0x9f + 0x42, 0xca, 0x00, + 0x67, 0x27, 0x00, 0x2e, 0xf5, + 0x88, 0x39, 0x81, 0x84, 0x88, 0x05, 0xcf, 0xdf, + 0x22, 0x33, 0x55, 0x04, 0xcf, 0x2a, 0x1e, 0x30, + 0x55, 0xfe, 0xdf, 0xfe, 0xcf, 0x00, 0x1f, 0x1b, + 0x55, 0x00, 0x1e, 0x0d, 0x54, 0xc6, 0x2e, 0x00, + 0xdf, 0x3f, 0x20, 0xbf, 0x03, 0x14, 0x55, 0xc6, + 0x2e, 0x01, 0xdf, 0x3f, 0x2c, 0x10, 0x5b, 0x46, + 0x2e, 0x00, 0xbf, 0x00, 0x2e, 0xdb, 0x88, 0x09, + 0x78, 0x00, 0xef, 0x46, 0x2e, 0x00, 0xbf, 0x46, + 0x2e, 0x01, 0xdf, 0x1f, 0x28, 0x46, 0x2e, 0x01, + 0xbf, 0x00, 0x2e, 0xbc, 0x88, 0x13, 0x88, 0x05, + 0x27, 0x46, 0x2e, 0x01, 0xdf, 0x1f, 0x2a, 0x46, + 0x2e, 0x01, 0xbf, 0x41, 0x2e, 0xb6, 0xdf, 0x01, + 0xff, 0xab, 0xef, 0x19, 0x27, 0x42, 0xff, 0x7f, + 0x98, 0x9f, 0x98, 0x24, 0x28, 0x2a, 0x85, 0x24, + 0x2a, 0x05, 0x27, 0x2c, 0x85, 0x05, 0x27, 0xfd, + 0x0c, 0x00, 0x2e, 0xab, 0x88, 0x14, 0xef, 0x00, + 0x2e, 0xef, 0x88, 0x32, 0x88, 0x3a, 0x88, 0x34, + 0x88, 0x38, 0x88, 0x32, 0x88, 0x36, 0x88, 0x30, + 0x88, 0x34, 0x88, 0x2e, 0x88, 0x32, 0x88, 0x46, + 0x2e, 0x00, 0xdf, 0x1f, 0x9f, 0xe2, 0xef, 0x1f, + 0x90, 0xe0, 0xff, 0x7f, 0x90, 0x0e, 0xef, 0x00, + 0x2e, 0xe7, 0x88, 0x80, 0xef, 0x1f, 0x9f, 0x9f, + 0x22, 0x1f, 0x9f, 0x1f, 0x9f, 0x1f, 0x9f, 0x1f, + 0x9f, 0x1f, 0x9f, 0x1f, 0x9f, 0x01, 0xef, 0x1f, + 0x9f, 0xb8, 0xef, 0x1f, 0x9f }; static const unsigned char pkt200[] = { -0x42, 0x66, 0x00, -0xcb, 0x27, 0x00, 0x2e, 0xab, -0x88, 0x40, 0xef, 0xfc, 0x9f, 0x5f, 0x20, 0xfc, -0x55, 0x03, 0x0c, 0x01, 0x2e, 0x6e, 0x86, 0x01, -0x2e, 0x05, 0x86, 0x00, 0x2e, 0xb5, 0x88, 0x00, -0x2e, 0xb1, 0x88, 0x14, 0xef, 0x00, 0x2e, 0xb7, -0x88, 0x05, 0x27, 0x40, 0xef, 0x28, 0xff, 0x1a, -0x27, 0x05, 0x27, 0x16, 0x27, 0x04, 0x10, 0x00, -0x13, 0x1a, 0x27, 0x05, 0x27, 0xd9, 0x9f, 0x3f, -0x9f, 0xd8, 0x9f, 0x3f, 0x9f, 0xd7, 0x9f, 0x3f, -0x9f, 0xd6, 0x9f, 0x3f, 0x9f, 0x05, 0x27, 0x7f, -0xef, 0x28, 0xff, 0x46, 0x2e, 0x1d, 0xbf, 0xc6, -0x2e, 0x1c, 0xbf, 0x93, 0xef, 0x28, 0xff, 0x46, -0x2e, 0x1f, 0xbf, 0xc6, 0x2e, 0x1e, 0xbf, 0x05, -0x27 + 0x42, 0x66, 0x00, + 0xcb, 0x27, 0x00, 0x2e, 0xab, + 0x88, 0x40, 0xef, 0xfc, 0x9f, 0x5f, 0x20, 0xfc, + 0x55, 0x03, 0x0c, 0x01, 0x2e, 0x6e, 0x86, 0x01, + 0x2e, 0x05, 0x86, 0x00, 0x2e, 0xb5, 0x88, 0x00, + 0x2e, 0xb1, 0x88, 0x14, 0xef, 0x00, 0x2e, 0xb7, + 0x88, 0x05, 0x27, 0x40, 0xef, 0x28, 0xff, 0x1a, + 0x27, 0x05, 0x27, 0x16, 0x27, 0x04, 0x10, 0x00, + 0x13, 0x1a, 0x27, 0x05, 0x27, 0xd9, 0x9f, 0x3f, + 0x9f, 0xd8, 0x9f, 0x3f, 0x9f, 0xd7, 0x9f, 0x3f, + 0x9f, 0xd6, 0x9f, 0x3f, 0x9f, 0x05, 0x27, 0x7f, + 0xef, 0x28, 0xff, 0x46, 0x2e, 0x1d, 0xbf, 0xc6, + 0x2e, 0x1c, 0xbf, 0x93, 0xef, 0x28, 0xff, 0x46, + 0x2e, 0x1f, 0xbf, 0xc6, 0x2e, 0x1e, 0xbf, 0x05, + 0x27 }; static const unsigned char pkt204[] = { -0x42, 0xca, 0x00, -0xfd, 0x27, 0xfd, 0x0c, 0x00, -0x2e, 0xf5, 0x88, 0x0d, 0x84, 0x05, 0xcf, 0xdf, -0x22, 0x00, 0x2e, 0x98, 0x55, 0x04, 0xcf, 0x14, -0x1e, 0x00, 0x2e, 0x94, 0x55, 0x00, 0x2e, 0xab, -0x88, 0xbb, 0xef, 0x1f, 0x90, 0x91, 0xff, 0x7f, -0x90, 0x14, 0xef, 0x00, 0x2e, 0xe7, 0x88, 0x14, -0xef, 0x00, 0x2e, 0xef, 0x88, 0x33, 0xef, 0x1f, -0x90, 0x71, 0xff, 0x7f, 0x90, 0x18, 0xef, 0x00, -0x2e, 0xe7, 0x88, 0x00, 0x2e, 0xab, 0x88, 0x40, -0xef, 0xfc, 0x9f, 0x5f, 0x20, 0xfc, 0x55, 0x01, -0x2e, 0x6e, 0x86, 0x01, 0x2e, 0x05, 0x86, 0x00, -0x2e, 0xab, 0x88, 0x7a, 0x88, 0x0a, 0xef, 0x00, -0x2e, 0xb7, 0x88, 0x76, 0x88, 0x00, 0xff, 0x80, -0xef, 0x19, 0x27, 0x0a, 0xef, 0xdc, 0x9f, 0x7f, -0x9f, 0x5f, 0x20, 0xfb, 0x55, 0x0d, 0x84, 0x6c, -0x88, 0x0a, 0xef, 0x00, 0x2e, 0xb7, 0x88, 0x68, -0x88, 0x0a, 0xef, 0xdc, 0x9f, 0x7f, 0x9f, 0x5f, -0x20, 0xfb, 0x55, 0x5e, 0x88, 0xa4, 0x8f, 0x9e, -0x8f, 0xa2, 0x8f, 0x9c, 0x8f, 0xa0, 0x8f, 0x9a, -0x8f, 0x9e, 0x8f, 0x98, 0x8f, 0x9c, 0x8f, 0x9d, -0xef, 0x1f, 0x90, 0xda, 0xff, 0x7f, 0x90, 0x0f, -0xef, 0x00, 0x2e, 0xe7, 0x88, 0x80, 0xef, 0x1f, -0x9f, 0x9f, 0x22, 0x1f, 0x9f, 0x1f, 0x9f, 0x1f, -0x9f, 0x1f, 0x9f, 0x1f, 0x9f, 0x1f, 0x9f, 0x03, -0xef, 0x1f, 0x9f, 0xb8, 0xef, 0x1f, 0x9f, 0x00, -0x2e, 0xab, 0x88, 0x40, 0xef + 0x42, 0xca, 0x00, + 0xfd, 0x27, 0xfd, 0x0c, 0x00, + 0x2e, 0xf5, 0x88, 0x0d, 0x84, 0x05, 0xcf, 0xdf, + 0x22, 0x00, 0x2e, 0x98, 0x55, 0x04, 0xcf, 0x14, + 0x1e, 0x00, 0x2e, 0x94, 0x55, 0x00, 0x2e, 0xab, + 0x88, 0xbb, 0xef, 0x1f, 0x90, 0x91, 0xff, 0x7f, + 0x90, 0x14, 0xef, 0x00, 0x2e, 0xe7, 0x88, 0x14, + 0xef, 0x00, 0x2e, 0xef, 0x88, 0x33, 0xef, 0x1f, + 0x90, 0x71, 0xff, 0x7f, 0x90, 0x18, 0xef, 0x00, + 0x2e, 0xe7, 0x88, 0x00, 0x2e, 0xab, 0x88, 0x40, + 0xef, 0xfc, 0x9f, 0x5f, 0x20, 0xfc, 0x55, 0x01, + 0x2e, 0x6e, 0x86, 0x01, 0x2e, 0x05, 0x86, 0x00, + 0x2e, 0xab, 0x88, 0x7a, 0x88, 0x0a, 0xef, 0x00, + 0x2e, 0xb7, 0x88, 0x76, 0x88, 0x00, 0xff, 0x80, + 0xef, 0x19, 0x27, 0x0a, 0xef, 0xdc, 0x9f, 0x7f, + 0x9f, 0x5f, 0x20, 0xfb, 0x55, 0x0d, 0x84, 0x6c, + 0x88, 0x0a, 0xef, 0x00, 0x2e, 0xb7, 0x88, 0x68, + 0x88, 0x0a, 0xef, 0xdc, 0x9f, 0x7f, 0x9f, 0x5f, + 0x20, 0xfb, 0x55, 0x5e, 0x88, 0xa4, 0x8f, 0x9e, + 0x8f, 0xa2, 0x8f, 0x9c, 0x8f, 0xa0, 0x8f, 0x9a, + 0x8f, 0x9e, 0x8f, 0x98, 0x8f, 0x9c, 0x8f, 0x9d, + 0xef, 0x1f, 0x90, 0xda, 0xff, 0x7f, 0x90, 0x0f, + 0xef, 0x00, 0x2e, 0xe7, 0x88, 0x80, 0xef, 0x1f, + 0x9f, 0x9f, 0x22, 0x1f, 0x9f, 0x1f, 0x9f, 0x1f, + 0x9f, 0x1f, 0x9f, 0x1f, 0x9f, 0x1f, 0x9f, 0x03, + 0xef, 0x1f, 0x9f, 0xb8, 0xef, 0x1f, 0x9f, 0x00, + 0x2e, 0xab, 0x88, 0x40, 0xef }; static const unsigned char pkt208[] = { -0x42, 0xca, 0x00, -0x61, 0x28, 0xfc, 0x9f, 0x5f, -0x20, 0xfc, 0x55, 0x01, 0x2e, 0x05, 0x86, 0x00, -0x2e, 0xb5, 0x88, 0x72, 0x88, 0x7c, 0x8f, 0x76, -0x8f, 0x7a, 0x8f, 0x74, 0x8f, 0x78, 0x8f, 0x72, -0x8f, 0x76, 0x8f, 0x70, 0x8f, 0x74, 0x8f, 0x68, -0x88, 0x14, 0xef, 0xfc, 0x9f, 0x5f, 0x20, 0xfc, -0x55, 0x01, 0xff, 0xab, 0xef, 0x19, 0x27, 0x60, -0x88, 0x11, 0xff, 0xbf, 0x90, 0x51, 0xff, 0xc2, -0x97, 0xdf, 0x01, 0x7f, 0x98, 0xfc, 0x9f, 0xbf, -0x98, 0x24, 0x28, 0xc2, 0x9f, 0x7f, 0x20, 0xbf, -0x90, 0xf4, 0x55, 0x24, 0x2a, 0x1d, 0x88, 0x72, -0xef, 0xff, 0xaf, 0x14, 0xef, 0xff, 0xaf, 0x00, -0xef, 0xff, 0xaf, 0x00, 0xff, 0x80, 0xef, 0x19, -0x27, 0x14, 0xff, 0xfd, 0x97, 0xff, 0xaf, 0x7f, -0x20, 0xfb, 0x55, 0x00, 0x2e, 0x5f, 0x89, 0x03, -0x0c, 0x02, 0x2e, 0xdd, 0x81, 0x05, 0x27, 0x2c, -0x85, 0x05, 0x27, 0x40, 0xef, 0x28, 0xff, 0x1a, -0x27, 0x05, 0x27, 0x02, 0xef, 0x06, 0xff, 0x1a, -0x27, 0x05, 0x27, 0x01, 0xff, 0xab, 0xef, 0x19, -0x27, 0x08, 0xef, 0x1f, 0x98, 0xe4, 0x29, 0x00, -0xff, 0xff, 0x96, 0x20, 0xff, 0xff, 0x96, 0x00, -0xff, 0xff, 0x96, 0x40, 0xff, 0xff, 0x96, 0x00, -0xff, 0xff, 0x96, 0x60, 0xff, 0xff, 0x96, 0x00, -0xff, 0xff, 0x96, 0x00, 0xff, 0xff, 0x96, 0x01, -0xff, 0xff, 0x96, 0x20, 0xff, 0xff, 0x96, 0x00, -0xff, 0xff, 0x96, 0x02, 0xff + 0x42, 0xca, 0x00, + 0x61, 0x28, 0xfc, 0x9f, 0x5f, + 0x20, 0xfc, 0x55, 0x01, 0x2e, 0x05, 0x86, 0x00, + 0x2e, 0xb5, 0x88, 0x72, 0x88, 0x7c, 0x8f, 0x76, + 0x8f, 0x7a, 0x8f, 0x74, 0x8f, 0x78, 0x8f, 0x72, + 0x8f, 0x76, 0x8f, 0x70, 0x8f, 0x74, 0x8f, 0x68, + 0x88, 0x14, 0xef, 0xfc, 0x9f, 0x5f, 0x20, 0xfc, + 0x55, 0x01, 0xff, 0xab, 0xef, 0x19, 0x27, 0x60, + 0x88, 0x11, 0xff, 0xbf, 0x90, 0x51, 0xff, 0xc2, + 0x97, 0xdf, 0x01, 0x7f, 0x98, 0xfc, 0x9f, 0xbf, + 0x98, 0x24, 0x28, 0xc2, 0x9f, 0x7f, 0x20, 0xbf, + 0x90, 0xf4, 0x55, 0x24, 0x2a, 0x1d, 0x88, 0x72, + 0xef, 0xff, 0xaf, 0x14, 0xef, 0xff, 0xaf, 0x00, + 0xef, 0xff, 0xaf, 0x00, 0xff, 0x80, 0xef, 0x19, + 0x27, 0x14, 0xff, 0xfd, 0x97, 0xff, 0xaf, 0x7f, + 0x20, 0xfb, 0x55, 0x00, 0x2e, 0x5f, 0x89, 0x03, + 0x0c, 0x02, 0x2e, 0xdd, 0x81, 0x05, 0x27, 0x2c, + 0x85, 0x05, 0x27, 0x40, 0xef, 0x28, 0xff, 0x1a, + 0x27, 0x05, 0x27, 0x02, 0xef, 0x06, 0xff, 0x1a, + 0x27, 0x05, 0x27, 0x01, 0xff, 0xab, 0xef, 0x19, + 0x27, 0x08, 0xef, 0x1f, 0x98, 0xe4, 0x29, 0x00, + 0xff, 0xff, 0x96, 0x20, 0xff, 0xff, 0x96, 0x00, + 0xff, 0xff, 0x96, 0x40, 0xff, 0xff, 0x96, 0x00, + 0xff, 0xff, 0x96, 0x60, 0xff, 0xff, 0x96, 0x00, + 0xff, 0xff, 0x96, 0x00, 0xff, 0xff, 0x96, 0x01, + 0xff, 0xff, 0x96, 0x20, 0xff, 0xff, 0x96, 0x00, + 0xff, 0xff, 0x96, 0x02, 0xff }; static const unsigned char pkt212[] = { -0x42, 0x38, 0x00, -0xc5, 0x28, 0xff, 0x96, 0x02, -0xff, 0xff, 0x96, 0x82, 0xff, 0xff, 0x96, 0x02, -0xff, 0xff, 0x96, 0x05, 0x88, 0x46, 0x2e, 0x01, -0xdf, 0x9f, 0x28, 0x46, 0x2e, 0x01, 0xbf, 0x05, -0x27, 0x0f, 0xef, 0x5f, 0x98, 0xdd, 0x9f, 0xbf, -0x98, 0x24, 0x28, 0x5f, 0x20, 0xf9, 0x55, 0x24, -0x2a, 0x05, 0x27, 0x7f, 0xef, 0x28, 0xff, 0x1b, -0x27, 0x05, 0x27 + 0x42, 0x38, 0x00, + 0xc5, 0x28, 0xff, 0x96, 0x02, + 0xff, 0xff, 0x96, 0x82, 0xff, 0xff, 0x96, 0x02, + 0xff, 0xff, 0x96, 0x05, 0x88, 0x46, 0x2e, 0x01, + 0xdf, 0x9f, 0x28, 0x46, 0x2e, 0x01, 0xbf, 0x05, + 0x27, 0x0f, 0xef, 0x5f, 0x98, 0xdd, 0x9f, 0xbf, + 0x98, 0x24, 0x28, 0x5f, 0x20, 0xf9, 0x55, 0x24, + 0x2a, 0x05, 0x27, 0x7f, 0xef, 0x28, 0xff, 0x1b, + 0x27, 0x05, 0x27 }; static const unsigned char pkt216[] = { -0x42, 0xca, 0x00, -0xe0, 0x28, 0xe1, 0x97, 0xe2, -0x9f, 0x46, 0x2e, 0x28, 0xbf, 0xc6, 0x2e, 0x29, -0xbf, 0xad, 0x88, 0x0a, 0x5b, 0xe9, 0x97, 0xea, -0x9f, 0x4f, 0xaf, 0x50, 0xbf, 0x46, 0x2e, 0x28, -0xdf, 0xc6, 0x2e, 0x29, 0xdf, 0x10, 0x10, 0x00, -0x13, 0x01, 0x78, 0x03, 0x10, 0x00, 0x13, 0xff, -0x96, 0xdf, 0x96, 0xd6, 0xcf, 0xd7, 0xdf, 0x0f, -0x1d, 0x01, 0x10, 0x00, 0x13, 0xff, 0x96, 0xdf, -0x96, 0xc8, 0xdf, 0xc7, 0xcf, 0x1f, 0x1d, 0xff, -0x96, 0xdf, 0x96, 0xc2, 0x97, 0xc3, 0x9f, 0x9d, -0x01, 0x5d, 0x01, 0xf5, 0x52, 0xc3, 0x03, 0x02, -0x5e, 0xf2, 0x52, 0x82, 0x03, 0xf0, 0x52, 0x02, -0x0c, 0xf8, 0x43, 0x03, 0x5b, 0x08, 0x44, 0x01, -0x5a, 0x00, 0x2e, 0xf3, 0x8f, 0x7f, 0x88, 0x6d, -0x5b, 0x41, 0x2e, 0xaf, 0xdf, 0xdf, 0x29, 0x41, -0x2e, 0xaf, 0xbf, 0x46, 0x2e, 0x28, 0xdf, 0xc6, -0x2e, 0x29, 0xdf, 0x03, 0x16, 0x00, 0x15, 0x46, -0x2e, 0x28, 0xbf, 0xc6, 0x2e, 0x29, 0xbf, 0x15, -0x27, 0xff, 0x96, 0xdf, 0x96, 0x8d, 0x88, 0x94, -0x88, 0xcd, 0x88, 0x01, 0xff, 0xab, 0xef, 0x19, -0x27, 0x6b, 0x88, 0xbf, 0x22, 0x3f, 0x98, 0x05, -0xff, 0x7f, 0x98, 0xdd, 0x9f, 0xbf, 0x98, 0x24, -0x28, 0x04, 0xff, 0x7f, 0x98, 0xdd, 0x9f, 0xbf, -0x98, 0x24, 0x28, 0x66, 0xff, 0xbf, 0x99, 0x12, -0xff, 0x7f, 0x99, 0xdd, 0x97, 0xdd, 0x9f, 0x19, -0x27, 0xe0, 0x97, 0xff, 0xaf + 0x42, 0xca, 0x00, + 0xe0, 0x28, 0xe1, 0x97, 0xe2, + 0x9f, 0x46, 0x2e, 0x28, 0xbf, 0xc6, 0x2e, 0x29, + 0xbf, 0xad, 0x88, 0x0a, 0x5b, 0xe9, 0x97, 0xea, + 0x9f, 0x4f, 0xaf, 0x50, 0xbf, 0x46, 0x2e, 0x28, + 0xdf, 0xc6, 0x2e, 0x29, 0xdf, 0x10, 0x10, 0x00, + 0x13, 0x01, 0x78, 0x03, 0x10, 0x00, 0x13, 0xff, + 0x96, 0xdf, 0x96, 0xd6, 0xcf, 0xd7, 0xdf, 0x0f, + 0x1d, 0x01, 0x10, 0x00, 0x13, 0xff, 0x96, 0xdf, + 0x96, 0xc8, 0xdf, 0xc7, 0xcf, 0x1f, 0x1d, 0xff, + 0x96, 0xdf, 0x96, 0xc2, 0x97, 0xc3, 0x9f, 0x9d, + 0x01, 0x5d, 0x01, 0xf5, 0x52, 0xc3, 0x03, 0x02, + 0x5e, 0xf2, 0x52, 0x82, 0x03, 0xf0, 0x52, 0x02, + 0x0c, 0xf8, 0x43, 0x03, 0x5b, 0x08, 0x44, 0x01, + 0x5a, 0x00, 0x2e, 0xf3, 0x8f, 0x7f, 0x88, 0x6d, + 0x5b, 0x41, 0x2e, 0xaf, 0xdf, 0xdf, 0x29, 0x41, + 0x2e, 0xaf, 0xbf, 0x46, 0x2e, 0x28, 0xdf, 0xc6, + 0x2e, 0x29, 0xdf, 0x03, 0x16, 0x00, 0x15, 0x46, + 0x2e, 0x28, 0xbf, 0xc6, 0x2e, 0x29, 0xbf, 0x15, + 0x27, 0xff, 0x96, 0xdf, 0x96, 0x8d, 0x88, 0x94, + 0x88, 0xcd, 0x88, 0x01, 0xff, 0xab, 0xef, 0x19, + 0x27, 0x6b, 0x88, 0xbf, 0x22, 0x3f, 0x98, 0x05, + 0xff, 0x7f, 0x98, 0xdd, 0x9f, 0xbf, 0x98, 0x24, + 0x28, 0x04, 0xff, 0x7f, 0x98, 0xdd, 0x9f, 0xbf, + 0x98, 0x24, 0x28, 0x66, 0xff, 0xbf, 0x99, 0x12, + 0xff, 0x7f, 0x99, 0xdd, 0x97, 0xdd, 0x9f, 0x19, + 0x27, 0xe0, 0x97, 0xff, 0xaf }; static const unsigned char pkt220[] = { -0x42, 0xca, 0x00, -0x44, 0x29, 0x46, 0x2e, 0x28, -0xdf, 0xc6, 0x2e, 0x29, 0xdf, 0x13, 0x10, 0x00, -0x13, 0xff, 0xaf, 0xff, 0xbf, 0xe3, 0x97, 0xff, -0xaf, 0xe4, 0x97, 0xff, 0xaf, 0xe5, 0x97, 0xff, -0xaf, 0xef, 0x88, 0x06, 0x0d, 0xdd, 0x97, 0xdd, -0x9f, 0x46, 0x2e, 0x28, 0xdf, 0xc6, 0x2e, 0x29, -0xdf, 0x06, 0xaf, 0x4e, 0xbf, 0xff, 0x22, 0x11, -0x54, 0x15, 0x27, 0x1a, 0x27, 0x01, 0xff, 0xab, -0xef, 0x19, 0x27, 0xdc, 0x97, 0xdf, 0x99, 0x28, -0x28, 0x0f, 0x27, 0x68, 0x2c, 0xfd, 0x5b, 0xe9, -0x97, 0xff, 0xaf, 0x6a, 0x28, 0x06, 0x25, 0xf4, -0x53, 0x4e, 0x25, 0xf2, 0x55, 0xdc, 0x97, 0xdf, -0x99, 0x28, 0x28, 0x0f, 0x27, 0x68, 0x2c, 0xfd, -0x5b, 0xe9, 0x97, 0xff, 0xaf, 0x6a, 0x28, 0x06, -0x25, 0xf4, 0x55, 0x41, 0x2e, 0xaf, 0xdf, 0xdf, -0x2b, 0x41, 0x2e, 0xaf, 0xbf, 0xbf, 0x22, 0xbf, -0x99, 0x7f, 0x99, 0x05, 0x27, 0xdd, 0x97, 0xdd, -0x9f, 0x06, 0xaf, 0x4e, 0xbf, 0xff, 0x22, 0x05, -0x54, 0xfd, 0x97, 0xff, 0xaf, 0x06, 0x25, 0xfb, -0x53, 0x4e, 0x25, 0xf9, 0x55, 0xfd, 0x97, 0xff, -0xaf, 0x06, 0x25, 0xfb, 0x55, 0x05, 0x27, 0xff, -0x96, 0xc6, 0x2e, 0x01, 0xdf, 0xbf, 0x2c, 0xdd, -0x9f, 0x05, 0x27, 0xc6, 0x2e, 0x28, 0xdf, 0x0f, -0x1d, 0x04, 0x55, 0x0b, 0x88, 0xff, 0x96, 0x10, -0xef, 0xdf, 0x96, 0x06, 0x50, 0x06, 0x88, 0x3f, -0x20, 0xff, 0x96, 0xc6, 0x2e + 0x42, 0xca, 0x00, + 0x44, 0x29, 0x46, 0x2e, 0x28, + 0xdf, 0xc6, 0x2e, 0x29, 0xdf, 0x13, 0x10, 0x00, + 0x13, 0xff, 0xaf, 0xff, 0xbf, 0xe3, 0x97, 0xff, + 0xaf, 0xe4, 0x97, 0xff, 0xaf, 0xe5, 0x97, 0xff, + 0xaf, 0xef, 0x88, 0x06, 0x0d, 0xdd, 0x97, 0xdd, + 0x9f, 0x46, 0x2e, 0x28, 0xdf, 0xc6, 0x2e, 0x29, + 0xdf, 0x06, 0xaf, 0x4e, 0xbf, 0xff, 0x22, 0x11, + 0x54, 0x15, 0x27, 0x1a, 0x27, 0x01, 0xff, 0xab, + 0xef, 0x19, 0x27, 0xdc, 0x97, 0xdf, 0x99, 0x28, + 0x28, 0x0f, 0x27, 0x68, 0x2c, 0xfd, 0x5b, 0xe9, + 0x97, 0xff, 0xaf, 0x6a, 0x28, 0x06, 0x25, 0xf4, + 0x53, 0x4e, 0x25, 0xf2, 0x55, 0xdc, 0x97, 0xdf, + 0x99, 0x28, 0x28, 0x0f, 0x27, 0x68, 0x2c, 0xfd, + 0x5b, 0xe9, 0x97, 0xff, 0xaf, 0x6a, 0x28, 0x06, + 0x25, 0xf4, 0x55, 0x41, 0x2e, 0xaf, 0xdf, 0xdf, + 0x2b, 0x41, 0x2e, 0xaf, 0xbf, 0xbf, 0x22, 0xbf, + 0x99, 0x7f, 0x99, 0x05, 0x27, 0xdd, 0x97, 0xdd, + 0x9f, 0x06, 0xaf, 0x4e, 0xbf, 0xff, 0x22, 0x05, + 0x54, 0xfd, 0x97, 0xff, 0xaf, 0x06, 0x25, 0xfb, + 0x53, 0x4e, 0x25, 0xf9, 0x55, 0xfd, 0x97, 0xff, + 0xaf, 0x06, 0x25, 0xfb, 0x55, 0x05, 0x27, 0xff, + 0x96, 0xc6, 0x2e, 0x01, 0xdf, 0xbf, 0x2c, 0xdd, + 0x9f, 0x05, 0x27, 0xc6, 0x2e, 0x28, 0xdf, 0x0f, + 0x1d, 0x04, 0x55, 0x0b, 0x88, 0xff, 0x96, 0x10, + 0xef, 0xdf, 0x96, 0x06, 0x50, 0x06, 0x88, 0x3f, + 0x20, 0xff, 0x96, 0xc6, 0x2e }; static const unsigned char pkt224[] = { -0x42, 0xca, 0x00, -0xa8, 0x29, 0x28, 0xdf, 0x0f, -0x1d, 0xff, 0x96, 0x05, 0x27, 0x46, 0x2e, 0x28, -0xdf, 0xf0, 0x1c, 0x09, 0x27, 0xdf, 0x9f, 0x46, -0x2e, 0x29, 0xdf, 0x0f, 0x1c, 0x09, 0x27, 0x5f, -0x02, 0x05, 0x27, 0x78, 0x88, 0x6f, 0x88, 0x0a, -0xef, 0xdc, 0x9f, 0x3f, 0x9f, 0x5f, 0x20, 0xfb, -0x55, 0x05, 0x27, 0x9f, 0x22, 0x41, 0x2e, 0xab, -0xbf, 0x50, 0xef, 0xdf, 0x96, 0x3a, 0xef, 0xdf, -0x96, 0x29, 0x88, 0x68, 0x88, 0x0a, 0xef, 0xfc, -0x9f, 0xc1, 0x2e, 0xad, 0xbf, 0xc1, 0x2e, 0xac, -0xdf, 0x3f, 0x20, 0xc1, 0x2e, 0xac, 0xbf, 0x6a, -0x88, 0x5f, 0x20, 0xf4, 0x55, 0x5b, 0xef, 0xdf, -0x96, 0x50, 0xcf, 0xdf, 0x96, 0x17, 0x88, 0x5c, -0xef, 0xdf, 0x96, 0x4f, 0xcf, 0xdf, 0x96, 0x12, -0x88, 0x5d, 0xef, 0xdf, 0x96, 0x9f, 0x22, 0xdf, -0x96, 0x0d, 0x88, 0x5e, 0xef, 0xdf, 0x96, 0x46, -0x2e, 0x29, 0xdf, 0xdf, 0x96, 0x07, 0x88, 0x5f, -0xef, 0xdf, 0x96, 0x46, 0x2e, 0x28, 0xdf, 0xdf, -0x96, 0x01, 0x88, 0x0f, 0x27, 0x05, 0x27, 0xdd, -0x97, 0x41, 0x2e, 0xad, 0xbf, 0xdd, 0x97, 0x41, -0x2e, 0xac, 0xbf, 0x44, 0x88, 0x05, 0x27, 0x9f, -0x22, 0x41, 0x2e, 0xab, 0xbf, 0x10, 0xef, 0xdf, -0x96, 0x02, 0xef, 0xdf, 0x96, 0xef, 0x8f, 0x2e, -0x88, 0x0a, 0xef, 0xfc, 0x9f, 0xc1, 0x2e, 0xad, -0xbf, 0xc1, 0x2e, 0xac, 0xdf, 0x3f, 0x20, 0xc1, -0x2e, 0xac, 0xbf, 0x30, 0x88 + 0x42, 0xca, 0x00, + 0xa8, 0x29, 0x28, 0xdf, 0x0f, + 0x1d, 0xff, 0x96, 0x05, 0x27, 0x46, 0x2e, 0x28, + 0xdf, 0xf0, 0x1c, 0x09, 0x27, 0xdf, 0x9f, 0x46, + 0x2e, 0x29, 0xdf, 0x0f, 0x1c, 0x09, 0x27, 0x5f, + 0x02, 0x05, 0x27, 0x78, 0x88, 0x6f, 0x88, 0x0a, + 0xef, 0xdc, 0x9f, 0x3f, 0x9f, 0x5f, 0x20, 0xfb, + 0x55, 0x05, 0x27, 0x9f, 0x22, 0x41, 0x2e, 0xab, + 0xbf, 0x50, 0xef, 0xdf, 0x96, 0x3a, 0xef, 0xdf, + 0x96, 0x29, 0x88, 0x68, 0x88, 0x0a, 0xef, 0xfc, + 0x9f, 0xc1, 0x2e, 0xad, 0xbf, 0xc1, 0x2e, 0xac, + 0xdf, 0x3f, 0x20, 0xc1, 0x2e, 0xac, 0xbf, 0x6a, + 0x88, 0x5f, 0x20, 0xf4, 0x55, 0x5b, 0xef, 0xdf, + 0x96, 0x50, 0xcf, 0xdf, 0x96, 0x17, 0x88, 0x5c, + 0xef, 0xdf, 0x96, 0x4f, 0xcf, 0xdf, 0x96, 0x12, + 0x88, 0x5d, 0xef, 0xdf, 0x96, 0x9f, 0x22, 0xdf, + 0x96, 0x0d, 0x88, 0x5e, 0xef, 0xdf, 0x96, 0x46, + 0x2e, 0x29, 0xdf, 0xdf, 0x96, 0x07, 0x88, 0x5f, + 0xef, 0xdf, 0x96, 0x46, 0x2e, 0x28, 0xdf, 0xdf, + 0x96, 0x01, 0x88, 0x0f, 0x27, 0x05, 0x27, 0xdd, + 0x97, 0x41, 0x2e, 0xad, 0xbf, 0xdd, 0x97, 0x41, + 0x2e, 0xac, 0xbf, 0x44, 0x88, 0x05, 0x27, 0x9f, + 0x22, 0x41, 0x2e, 0xab, 0xbf, 0x10, 0xef, 0xdf, + 0x96, 0x02, 0xef, 0xdf, 0x96, 0xef, 0x8f, 0x2e, + 0x88, 0x0a, 0xef, 0xfc, 0x9f, 0xc1, 0x2e, 0xad, + 0xbf, 0xc1, 0x2e, 0xac, 0xdf, 0x3f, 0x20, 0xc1, + 0x2e, 0xac, 0xbf, 0x30, 0x88 }; static const unsigned char pkt228[] = { -0x42, 0x9a, 0x00, -0x0c, 0x2a, 0x5f, 0x20, 0xf4, -0x55, 0x1b, 0xef, 0xdf, 0x96, 0x50, 0xcf, 0xdf, -0x96, 0xdd, 0x8f, 0x1c, 0xef, 0xdf, 0x96, 0x4f, -0xcf, 0xdf, 0x96, 0xd8, 0x8f, 0x1d, 0xef, 0xdf, -0x96, 0x9f, 0x22, 0xdf, 0x96, 0xd3, 0x8f, 0x1e, -0xef, 0xdf, 0x96, 0x9f, 0x22, 0xdf, 0x96, 0xce, -0x8f, 0x1f, 0xef, 0xdf, 0x96, 0x01, 0xef, 0xdf, -0x96, 0xc9, 0x8f, 0x0f, 0x27, 0x05, 0x27, 0x02, -0xef, 0x06, 0xff, 0x1a, 0x27, 0x05, 0x27, 0x02, -0xef, 0x06, 0xff, 0x1a, 0x27, 0x05, 0x27, 0xdf, -0x96, 0xff, 0x96, 0x7b, 0xef, 0x00, 0xff, 0x1b, -0x27, 0xdd, 0x9f, 0xdd, 0x97, 0x05, 0x27, 0x01, -0xff, 0xab, 0xef, 0x1b, 0x27, 0x05, 0x27, 0xdf, -0x96, 0x81, 0xef, 0x41, 0x2e, 0xaf, 0xbf, 0xdd, -0x97, 0x05, 0x27, 0x3a, 0xef, 0xff, 0xaf, 0xea, -0x8f, 0x0a, 0xef, 0xfc, 0x9f, 0xff, 0xbf, 0x5f, -0x20, 0xfb, 0x55, 0x50, 0xcf, 0xff, 0xaf, 0x4f, -0xcf, 0xff, 0xaf, 0x9f, 0x22, 0xff, 0xaf, 0x46, -0x2e, 0x29, 0xdf, 0xff, 0xaf, 0x46, 0x2e, 0x28, -0xdf, 0xff, 0xaf, 0x05, 0x27 + 0x42, 0x9a, 0x00, + 0x0c, 0x2a, 0x5f, 0x20, 0xf4, + 0x55, 0x1b, 0xef, 0xdf, 0x96, 0x50, 0xcf, 0xdf, + 0x96, 0xdd, 0x8f, 0x1c, 0xef, 0xdf, 0x96, 0x4f, + 0xcf, 0xdf, 0x96, 0xd8, 0x8f, 0x1d, 0xef, 0xdf, + 0x96, 0x9f, 0x22, 0xdf, 0x96, 0xd3, 0x8f, 0x1e, + 0xef, 0xdf, 0x96, 0x9f, 0x22, 0xdf, 0x96, 0xce, + 0x8f, 0x1f, 0xef, 0xdf, 0x96, 0x01, 0xef, 0xdf, + 0x96, 0xc9, 0x8f, 0x0f, 0x27, 0x05, 0x27, 0x02, + 0xef, 0x06, 0xff, 0x1a, 0x27, 0x05, 0x27, 0x02, + 0xef, 0x06, 0xff, 0x1a, 0x27, 0x05, 0x27, 0xdf, + 0x96, 0xff, 0x96, 0x7b, 0xef, 0x00, 0xff, 0x1b, + 0x27, 0xdd, 0x9f, 0xdd, 0x97, 0x05, 0x27, 0x01, + 0xff, 0xab, 0xef, 0x1b, 0x27, 0x05, 0x27, 0xdf, + 0x96, 0x81, 0xef, 0x41, 0x2e, 0xaf, 0xbf, 0xdd, + 0x97, 0x05, 0x27, 0x3a, 0xef, 0xff, 0xaf, 0xea, + 0x8f, 0x0a, 0xef, 0xfc, 0x9f, 0xff, 0xbf, 0x5f, + 0x20, 0xfb, 0x55, 0x50, 0xcf, 0xff, 0xaf, 0x4f, + 0xcf, 0xff, 0xaf, 0x9f, 0x22, 0xff, 0xaf, 0x46, + 0x2e, 0x29, 0xdf, 0xff, 0xaf, 0x46, 0x2e, 0x28, + 0xdf, 0xff, 0xaf, 0x05, 0x27 }; static const unsigned char pkt232[] = { -0x42, 0x18, 0x00, -0x58, 0x2a, 0xd3, 0x45, 0x03, -0x5a, 0x0f, 0x27, 0xd3, 0x45, 0x00, 0x5a, 0x05, -0x27, 0xd0, 0x41, 0xf7, 0x5b, 0xc1, 0x83, 0xf5, -0x50, 0x05, 0x27 + 0x42, 0x18, 0x00, + 0x58, 0x2a, 0xd3, 0x45, 0x03, + 0x5a, 0x0f, 0x27, 0xd3, 0x45, 0x00, 0x5a, 0x05, + 0x27, 0xd0, 0x41, 0xf7, 0x5b, 0xc1, 0x83, 0xf5, + 0x50, 0x05, 0x27 }; static const unsigned char pkt236[] = { -0x42, 0x22, 0x00, -0x63, 0x2a, 0xc8, 0x46, 0x0c, -0x5b, 0xd3, 0x45, 0xfd, 0x5a, 0xd3, 0x45, 0xfb, -0x5a, 0xd3, 0x45, 0xf9, 0x5a, 0x41, 0x2e, 0xa1, -0xdf, 0x9f, 0x28, 0x41, 0x2e, 0xa1, 0xbf, 0x02, -0x2e, 0xdd, 0x81, 0x05, 0x27 + 0x42, 0x22, 0x00, + 0x63, 0x2a, 0xc8, 0x46, 0x0c, + 0x5b, 0xd3, 0x45, 0xfd, 0x5a, 0xd3, 0x45, 0xfb, + 0x5a, 0xd3, 0x45, 0xf9, 0x5a, 0x41, 0x2e, 0xa1, + 0xdf, 0x9f, 0x28, 0x41, 0x2e, 0xa1, 0xbf, 0x02, + 0x2e, 0xdd, 0x81, 0x05, 0x27 }; static const unsigned char pkt240[] = { -0x42, 0x50, 0x00, -0x73, 0x2a, 0x07, 0x3d, 0x02, -0x5b, 0x6c, 0x86, 0xc2, 0x23, 0xd3, 0x3c, 0x02, -0x44, 0xd8, 0x2f, 0x1d, 0x5a, 0x02, 0x45, 0xd8, -0x2f, 0x7e, 0x5b, 0x58, 0x23, 0x3c, 0x26, 0x02, -0x55, 0x02, 0x2e, 0x31, 0x84, 0x01, 0x50, 0x02, -0x2e, 0x80, 0x84, 0x07, 0x45, 0xea, 0x5a, 0x41, -0x2e, 0x53, 0xdf, 0xc1, 0x2e, 0x79, 0xdf, 0xff, -0x96, 0xdf, 0x96, 0x41, 0x2e, 0x55, 0xdf, 0xc1, -0x2e, 0x78, 0xdf, 0x9d, 0x01, 0x5d, 0x01, 0xff, -0x22, 0x00, 0x54, 0xff, 0xef, 0x2e, 0xaf, 0xd8, -0x2f, 0x62, 0x50 + 0x42, 0x50, 0x00, + 0x73, 0x2a, 0x07, 0x3d, 0x02, + 0x5b, 0x6c, 0x86, 0xc2, 0x23, 0xd3, 0x3c, 0x02, + 0x44, 0xd8, 0x2f, 0x1d, 0x5a, 0x02, 0x45, 0xd8, + 0x2f, 0x7e, 0x5b, 0x58, 0x23, 0x3c, 0x26, 0x02, + 0x55, 0x02, 0x2e, 0x31, 0x84, 0x01, 0x50, 0x02, + 0x2e, 0x80, 0x84, 0x07, 0x45, 0xea, 0x5a, 0x41, + 0x2e, 0x53, 0xdf, 0xc1, 0x2e, 0x79, 0xdf, 0xff, + 0x96, 0xdf, 0x96, 0x41, 0x2e, 0x55, 0xdf, 0xc1, + 0x2e, 0x78, 0xdf, 0x9d, 0x01, 0x5d, 0x01, 0xff, + 0x22, 0x00, 0x54, 0xff, 0xef, 0x2e, 0xaf, 0xd8, + 0x2f, 0x62, 0x50 }; static const unsigned char pkt244[] = { -0x67, 0x05, 0x00, 0x00, 0x02, 0x2e, 0x00, 0x70, -0x67, 0x05, 0x00, 0x01, 0x02, 0x2e, 0xe5, 0x71, -0x67, 0x05, 0x00, 0x02, 0x02, 0x2e, 0xa9, 0x72, -0x67, 0x05, 0x00, 0x08, 0x02, 0x2e, 0xb4, 0x73, -0x67, 0x05, 0x00, 0x07, 0x02, 0x2e, 0x29, 0x74, -0x67, 0x05, 0x00, 0x0d, 0x02, 0x2e, 0x26, 0x75, -0x67, 0x05, 0x00, 0x03, 0x02, 0x2e, 0x4d, 0x75, -0x67, 0x05, 0x00, 0x0e, 0x02, 0x2e, 0x29, 0x77, -0x5a, 0x05, 0x00, 0x00, 0xaa, 0x08, 0x67, 0x27, -0x5a, 0x05, 0x00, 0x01, 0xf4, 0x08, 0xfd, 0x27, -0x67, 0x05, 0x00, 0x09, 0x02, 0x2e, 0xe0, 0x78, -0x5a, 0x05, 0x00, 0x02, 0x82, 0x09, 0x58, 0x2a, -0x5a, 0x05, 0x00, 0x03, 0x78, 0x09, 0x63, 0x2a, -0x5a, 0x05, 0x00, 0x04, 0xe1, 0x02, 0x73, 0x2a, -0x0d, -0x42, 0x04, 0x00, 0x73, 0x2a, 0x07, 0x3d + 0x67, 0x05, 0x00, 0x00, 0x02, 0x2e, 0x00, 0x70, + 0x67, 0x05, 0x00, 0x01, 0x02, 0x2e, 0xe5, 0x71, + 0x67, 0x05, 0x00, 0x02, 0x02, 0x2e, 0xa9, 0x72, + 0x67, 0x05, 0x00, 0x08, 0x02, 0x2e, 0xb4, 0x73, + 0x67, 0x05, 0x00, 0x07, 0x02, 0x2e, 0x29, 0x74, + 0x67, 0x05, 0x00, 0x0d, 0x02, 0x2e, 0x26, 0x75, + 0x67, 0x05, 0x00, 0x03, 0x02, 0x2e, 0x4d, 0x75, + 0x67, 0x05, 0x00, 0x0e, 0x02, 0x2e, 0x29, 0x77, + 0x5a, 0x05, 0x00, 0x00, 0xaa, 0x08, 0x67, 0x27, + 0x5a, 0x05, 0x00, 0x01, 0xf4, 0x08, 0xfd, 0x27, + 0x67, 0x05, 0x00, 0x09, 0x02, 0x2e, 0xe0, 0x78, + 0x5a, 0x05, 0x00, 0x02, 0x82, 0x09, 0x58, 0x2a, + 0x5a, 0x05, 0x00, 0x03, 0x78, 0x09, 0x63, 0x2a, + 0x5a, 0x05, 0x00, 0x04, 0xe1, 0x02, 0x73, 0x2a, + 0x0d, + 0x42, 0x04, 0x00, 0x73, 0x2a, 0x07, 0x3d }; struct aesX660_cmd aes1660_init_1[] = { - { .cmd = pkt107, .len = sizeof(pkt107) }, - { .cmd = pkt112, .len = sizeof(pkt112) }, - { .cmd = pkt116, .len = sizeof(pkt116) }, - { .cmd = pkt120, .len = sizeof(pkt120) }, - { .cmd = pkt124, .len = sizeof(pkt124) }, - { .cmd = pkt128, .len = sizeof(pkt128) }, - { .cmd = pkt133, .len = sizeof(pkt133) }, - { .cmd = pkt136, .len = sizeof(pkt136) }, - { .cmd = pkt140, .len = sizeof(pkt140) }, - { .cmd = pkt144, .len = sizeof(pkt144) }, - { .cmd = pkt148, .len = sizeof(pkt148) }, - { .cmd = pkt152, .len = sizeof(pkt152) }, - { .cmd = pkt156, .len = sizeof(pkt156) }, - { .cmd = pkt160, .len = sizeof(pkt160) }, - { .cmd = pkt164, .len = sizeof(pkt164) }, - { .cmd = pkt168, .len = sizeof(pkt168) }, - { .cmd = pkt172, .len = sizeof(pkt172) }, - { .cmd = pkt176, .len = sizeof(pkt176) }, - { .cmd = pkt180, .len = sizeof(pkt180) }, - { .cmd = pkt184, .len = sizeof(pkt184) }, - { .cmd = pkt188, .len = sizeof(pkt188) }, - { .cmd = pkt192, .len = sizeof(pkt192) }, - { .cmd = pkt196, .len = sizeof(pkt196) }, - { .cmd = pkt200, .len = sizeof(pkt200) }, - { .cmd = pkt204, .len = sizeof(pkt204) }, - { .cmd = pkt208, .len = sizeof(pkt208) }, - { .cmd = pkt212, .len = sizeof(pkt212) }, - { .cmd = pkt216, .len = sizeof(pkt216) }, - { .cmd = pkt220, .len = sizeof(pkt220) }, - { .cmd = pkt224, .len = sizeof(pkt224) }, - { .cmd = pkt228, .len = sizeof(pkt228) }, - { .cmd = pkt232, .len = sizeof(pkt232) }, - { .cmd = pkt236, .len = sizeof(pkt236) }, - { .cmd = pkt240, .len = sizeof(pkt240) }, - { .cmd = pkt244, .len = sizeof(pkt244) }, + { .cmd = pkt107, .len = sizeof (pkt107) }, + { .cmd = pkt112, .len = sizeof (pkt112) }, + { .cmd = pkt116, .len = sizeof (pkt116) }, + { .cmd = pkt120, .len = sizeof (pkt120) }, + { .cmd = pkt124, .len = sizeof (pkt124) }, + { .cmd = pkt128, .len = sizeof (pkt128) }, + { .cmd = pkt133, .len = sizeof (pkt133) }, + { .cmd = pkt136, .len = sizeof (pkt136) }, + { .cmd = pkt140, .len = sizeof (pkt140) }, + { .cmd = pkt144, .len = sizeof (pkt144) }, + { .cmd = pkt148, .len = sizeof (pkt148) }, + { .cmd = pkt152, .len = sizeof (pkt152) }, + { .cmd = pkt156, .len = sizeof (pkt156) }, + { .cmd = pkt160, .len = sizeof (pkt160) }, + { .cmd = pkt164, .len = sizeof (pkt164) }, + { .cmd = pkt168, .len = sizeof (pkt168) }, + { .cmd = pkt172, .len = sizeof (pkt172) }, + { .cmd = pkt176, .len = sizeof (pkt176) }, + { .cmd = pkt180, .len = sizeof (pkt180) }, + { .cmd = pkt184, .len = sizeof (pkt184) }, + { .cmd = pkt188, .len = sizeof (pkt188) }, + { .cmd = pkt192, .len = sizeof (pkt192) }, + { .cmd = pkt196, .len = sizeof (pkt196) }, + { .cmd = pkt200, .len = sizeof (pkt200) }, + { .cmd = pkt204, .len = sizeof (pkt204) }, + { .cmd = pkt208, .len = sizeof (pkt208) }, + { .cmd = pkt212, .len = sizeof (pkt212) }, + { .cmd = pkt216, .len = sizeof (pkt216) }, + { .cmd = pkt220, .len = sizeof (pkt220) }, + { .cmd = pkt224, .len = sizeof (pkt224) }, + { .cmd = pkt228, .len = sizeof (pkt228) }, + { .cmd = pkt232, .len = sizeof (pkt232) }, + { .cmd = pkt236, .len = sizeof (pkt236) }, + { .cmd = pkt240, .len = sizeof (pkt240) }, + { .cmd = pkt244, .len = sizeof (pkt244) }, }; /* INIT1 is over, 0x07 cmd returns @@ -944,1034 +944,1034 @@ struct aesX660_cmd aes1660_init_1[] = { /* Second init sequence * INIT2 */ static const unsigned char pkt433[] = { -0x0d, -0x23, -0x42, 0xca, 0x00, -0x00, 0x20, 0x23, -0xff, 0x3f, 0x1d, 0x40, 0x19, 0xc1, 0x2e, 0xa3, -0xbf, 0xc2, 0x2e, 0x00, 0xdf, 0xff, 0x2d, 0x02, -0x5a, 0xbf, 0x22, 0xc1, 0x2e, 0xa3, 0xbf, 0x02, -0xcf, 0x0f, 0x1c, 0x10, 0x18, 0x26, 0x83, 0xc8, -0x46, 0x00, 0x5b, 0x01, 0x0c, 0x57, 0x23, 0x3c, -0x23, 0xf9, 0x34, 0x6b, 0x81, 0x64, 0xef, 0x64, -0xaf, 0xdf, 0xef, 0x27, 0xff, 0xd6, 0xaf, 0xd7, -0xbf, 0x46, 0xef, 0x46, 0xaf, 0x2a, 0xef, 0x2a, -0xaf, 0x05, 0x81, 0x05, 0x27, 0x9c, 0xcf, 0xdf, -0x96, 0xfe, 0xef, 0x27, 0xff, 0x19, 0x27, 0x65, -0xdf, 0xe1, 0x22, 0x1c, 0x55, 0xe0, 0x97, 0xbf, -0x03, 0x19, 0x5e, 0xfe, 0x0c, 0x9f, 0x22, 0x0f, -0xff, 0xe1, 0x22, 0x10, 0x55, 0x20, 0x00, 0x0e, -0x52, 0x82, 0x03, 0x03, 0x53, 0xfe, 0x0d, 0x7f, -0x20, 0xf6, 0x55, 0x08, 0x50, 0x5f, 0x90, 0x82, -0x01, 0x1f, 0x90, 0xc1, 0x97, 0xa0, 0x01, 0x82, -0x01, 0xdf, 0x21, 0x80, 0x03, 0x00, 0x5e, 0x3f, -0x20, 0x29, 0xbf, 0x03, 0x0c, 0x05, 0x27, 0x01, -0x0c, 0x10, 0xff, 0x29, 0xbf, 0x05, 0x27, 0x9a, -0xcf, 0xdf, 0x96, 0xe0, 0xef, 0x27, 0xff, 0x19, -0x27, 0xfe, 0x0c, 0x9f, 0x22, 0x00, 0xff, 0xe1, -0x22, 0x10, 0x55, 0x20, 0x00, 0x0e, 0x52, 0x82, -0x03, 0x03, 0x53, 0x02, 0x0d, 0x3f, 0x20, 0x0f, -0x1f, 0xf5, 0x55, 0x5f, 0x90, 0x82, 0x01, 0x1f, -0x90, 0xc1, 0x97, 0xa0, 0x01, 0x82, 0x01 + 0x0d, + 0x23, + 0x42, 0xca, 0x00, + 0x00, 0x20, 0x23, + 0xff, 0x3f, 0x1d, 0x40, 0x19, 0xc1, 0x2e, 0xa3, + 0xbf, 0xc2, 0x2e, 0x00, 0xdf, 0xff, 0x2d, 0x02, + 0x5a, 0xbf, 0x22, 0xc1, 0x2e, 0xa3, 0xbf, 0x02, + 0xcf, 0x0f, 0x1c, 0x10, 0x18, 0x26, 0x83, 0xc8, + 0x46, 0x00, 0x5b, 0x01, 0x0c, 0x57, 0x23, 0x3c, + 0x23, 0xf9, 0x34, 0x6b, 0x81, 0x64, 0xef, 0x64, + 0xaf, 0xdf, 0xef, 0x27, 0xff, 0xd6, 0xaf, 0xd7, + 0xbf, 0x46, 0xef, 0x46, 0xaf, 0x2a, 0xef, 0x2a, + 0xaf, 0x05, 0x81, 0x05, 0x27, 0x9c, 0xcf, 0xdf, + 0x96, 0xfe, 0xef, 0x27, 0xff, 0x19, 0x27, 0x65, + 0xdf, 0xe1, 0x22, 0x1c, 0x55, 0xe0, 0x97, 0xbf, + 0x03, 0x19, 0x5e, 0xfe, 0x0c, 0x9f, 0x22, 0x0f, + 0xff, 0xe1, 0x22, 0x10, 0x55, 0x20, 0x00, 0x0e, + 0x52, 0x82, 0x03, 0x03, 0x53, 0xfe, 0x0d, 0x7f, + 0x20, 0xf6, 0x55, 0x08, 0x50, 0x5f, 0x90, 0x82, + 0x01, 0x1f, 0x90, 0xc1, 0x97, 0xa0, 0x01, 0x82, + 0x01, 0xdf, 0x21, 0x80, 0x03, 0x00, 0x5e, 0x3f, + 0x20, 0x29, 0xbf, 0x03, 0x0c, 0x05, 0x27, 0x01, + 0x0c, 0x10, 0xff, 0x29, 0xbf, 0x05, 0x27, 0x9a, + 0xcf, 0xdf, 0x96, 0xe0, 0xef, 0x27, 0xff, 0x19, + 0x27, 0xfe, 0x0c, 0x9f, 0x22, 0x00, 0xff, 0xe1, + 0x22, 0x10, 0x55, 0x20, 0x00, 0x0e, 0x52, 0x82, + 0x03, 0x03, 0x53, 0x02, 0x0d, 0x3f, 0x20, 0x0f, + 0x1f, 0xf5, 0x55, 0x5f, 0x90, 0x82, 0x01, 0x1f, + 0x90, 0xc1, 0x97, 0xa0, 0x01, 0x82, 0x01 }; static const unsigned char pkt440[] = { -0x42, 0xca, 0x00, -0x64, 0x20, 0xdf, 0x21, 0x80, -0x03, 0x02, 0x5e, 0x7f, 0x20, 0x00, 0x53, 0xbf, -0x22, 0x29, 0xcf, 0xbf, 0x03, 0x01, 0x5e, 0x5f, -0x20, 0xdf, 0x9f, 0x28, 0xbf, 0x03, 0x0c, 0x05, -0x27, 0x24, 0xcf, 0x10, 0xdf, 0xbf, 0x01, 0x06, -0x1e, 0xe2, 0x2f, 0x13, 0x5c, 0xdf, 0x2d, 0x00, -0x5b, 0x9f, 0x22, 0xdf, 0x96, 0x9b, 0xef, 0x20, -0xff, 0x1d, 0x00, 0x00, 0x13, 0x1a, 0x27, 0x07, -0x27, 0x9b, 0x22, 0xdf, 0x96, 0xbb, 0xcf, 0x1a, -0x88, 0xbb, 0xcf, 0x1b, 0x88, 0x01, 0x0f, 0xbc, -0xcf, 0x15, 0x88, 0xbc, 0xcf, 0x16, 0x88, 0x01, -0x0f, 0xbd, 0xcf, 0x10, 0x88, 0xbd, 0xcf, 0x11, -0x88, 0x01, 0x0f, 0xbe, 0xcf, 0x0b, 0x88, 0xbe, -0xcf, 0x0c, 0x88, 0x01, 0x0c, 0xdd, 0x97, 0x25, -0xaf, 0x05, 0x27, 0xff, 0x00, 0xab, 0x00, 0x72, -0x00, 0x4c, 0x00, 0x33, 0x00, 0x22, 0x00, 0x09, -0x88, 0xbf, 0x9d, 0x05, 0x27, 0x09, 0x27, 0x05, -0x88, 0xff, 0x97, 0x09, 0x27, 0xf6, 0x9f, 0x5f, -0x02, 0xbf, 0x9d, 0x05, 0x27, 0x0f, 0x1c, 0xc0, -0x9f, 0x8a, 0x80, 0x80, 0x10, 0x00, 0x13, 0x0f, -0x1d, 0xc1, 0x03, 0x00, 0x5f, 0x7f, 0x90, 0x05, -0x27, 0x53, 0x80, 0x2b, 0x0d, 0x05, 0x27, 0x9f, -0x22, 0x8f, 0xaf, 0x67, 0x2e, 0xe0, 0xdf, 0x04, -0x1e, 0x00, 0x52, 0x8f, 0x30, 0x67, 0x2e, 0xe1, -0xdf, 0xdf, 0x22, 0x00, 0x54, 0x8f, 0x30, 0x67, -0x2e, 0xfe, 0xdf, 0x04, 0x1e + 0x42, 0xca, 0x00, + 0x64, 0x20, 0xdf, 0x21, 0x80, + 0x03, 0x02, 0x5e, 0x7f, 0x20, 0x00, 0x53, 0xbf, + 0x22, 0x29, 0xcf, 0xbf, 0x03, 0x01, 0x5e, 0x5f, + 0x20, 0xdf, 0x9f, 0x28, 0xbf, 0x03, 0x0c, 0x05, + 0x27, 0x24, 0xcf, 0x10, 0xdf, 0xbf, 0x01, 0x06, + 0x1e, 0xe2, 0x2f, 0x13, 0x5c, 0xdf, 0x2d, 0x00, + 0x5b, 0x9f, 0x22, 0xdf, 0x96, 0x9b, 0xef, 0x20, + 0xff, 0x1d, 0x00, 0x00, 0x13, 0x1a, 0x27, 0x07, + 0x27, 0x9b, 0x22, 0xdf, 0x96, 0xbb, 0xcf, 0x1a, + 0x88, 0xbb, 0xcf, 0x1b, 0x88, 0x01, 0x0f, 0xbc, + 0xcf, 0x15, 0x88, 0xbc, 0xcf, 0x16, 0x88, 0x01, + 0x0f, 0xbd, 0xcf, 0x10, 0x88, 0xbd, 0xcf, 0x11, + 0x88, 0x01, 0x0f, 0xbe, 0xcf, 0x0b, 0x88, 0xbe, + 0xcf, 0x0c, 0x88, 0x01, 0x0c, 0xdd, 0x97, 0x25, + 0xaf, 0x05, 0x27, 0xff, 0x00, 0xab, 0x00, 0x72, + 0x00, 0x4c, 0x00, 0x33, 0x00, 0x22, 0x00, 0x09, + 0x88, 0xbf, 0x9d, 0x05, 0x27, 0x09, 0x27, 0x05, + 0x88, 0xff, 0x97, 0x09, 0x27, 0xf6, 0x9f, 0x5f, + 0x02, 0xbf, 0x9d, 0x05, 0x27, 0x0f, 0x1c, 0xc0, + 0x9f, 0x8a, 0x80, 0x80, 0x10, 0x00, 0x13, 0x0f, + 0x1d, 0xc1, 0x03, 0x00, 0x5f, 0x7f, 0x90, 0x05, + 0x27, 0x53, 0x80, 0x2b, 0x0d, 0x05, 0x27, 0x9f, + 0x22, 0x8f, 0xaf, 0x67, 0x2e, 0xe0, 0xdf, 0x04, + 0x1e, 0x00, 0x52, 0x8f, 0x30, 0x67, 0x2e, 0xe1, + 0xdf, 0xdf, 0x22, 0x00, 0x54, 0x8f, 0x30, 0x67, + 0x2e, 0xfe, 0xdf, 0x04, 0x1e }; static const unsigned char pkt444[] = { -0x42, 0xca, 0x00, -0xc8, 0x20, 0x00, 0x52, 0x8f, -0x31, 0x67, 0x2e, 0xff, 0xdf, 0xdf, 0x22, 0x00, -0x54, 0x8f, 0x31, 0x8f, 0xcf, 0x03, 0x1c, 0x03, -0x1e, 0x00, 0x55, 0x0c, 0x27, 0x0d, 0x27, 0x4a, -0xcf, 0xdf, 0x96, 0x10, 0xcf, 0x5f, 0xdf, 0xbf, -0x03, 0x02, 0x5f, 0x5f, 0xcf, 0x10, 0xaf, 0x04, -0x50, 0x5e, 0xdf, 0xbf, 0x03, 0x01, 0x53, 0x5e, -0xcf, 0x10, 0xaf, 0x46, 0x88, 0x01, 0x2e, 0x1e, -0x80, 0xdd, 0x97, 0x0a, 0x40, 0x1c, 0x5a, 0x37, -0x43, 0x0b, 0x5b, 0xe2, 0xcf, 0x0f, 0x1c, 0x06, -0x1e, 0x07, 0x52, 0x62, 0xdf, 0x18, 0x1f, 0x07, -0x53, 0x04, 0x16, 0xe2, 0xaf, 0x04, 0x11, 0x62, -0xbf, 0x02, 0x50, 0x62, 0xcf, 0xdf, 0x22, 0x0e, -0x54, 0x0e, 0x88, 0x62, 0xdf, 0xbf, 0x03, 0x04, -0x53, 0x62, 0xaf, 0xdf, 0x01, 0xe2, 0xcf, 0x3f, -0x00, 0xe2, 0xaf, 0x0e, 0x88, 0x4a, 0xdf, 0x3f, -0x00, 0x4a, 0xaf, 0x00, 0x2e, 0xc4, 0x8d, 0x05, -0x27, 0xff, 0xef, 0x4a, 0xdf, 0xbf, 0x01, 0x0a, -0x88, 0xa1, 0x27, 0x5f, 0x21, 0x7f, 0x20, 0xfb, -0x55, 0x05, 0x27, 0x62, 0xcf, 0x03, 0x88, 0x1f, -0x22, 0x7f, 0x20, 0xfc, 0x55, 0x05, 0x27, 0x10, -0xdf, 0x02, 0x1f, 0x02, 0x5e, 0x04, 0xff, 0x00, -0x2e, 0x0a, 0x50, 0x05, 0x1f, 0x02, 0x5e, 0x03, -0xff, 0x00, 0x2e, 0x05, 0x50, 0x06, 0x1f, 0x02, -0x5e, 0x02, 0xff, 0x00, 0x2e, 0x00, 0x50, 0x01, -0xff, 0x05, 0x27, 0x10, 0xcf + 0x42, 0xca, 0x00, + 0xc8, 0x20, 0x00, 0x52, 0x8f, + 0x31, 0x67, 0x2e, 0xff, 0xdf, 0xdf, 0x22, 0x00, + 0x54, 0x8f, 0x31, 0x8f, 0xcf, 0x03, 0x1c, 0x03, + 0x1e, 0x00, 0x55, 0x0c, 0x27, 0x0d, 0x27, 0x4a, + 0xcf, 0xdf, 0x96, 0x10, 0xcf, 0x5f, 0xdf, 0xbf, + 0x03, 0x02, 0x5f, 0x5f, 0xcf, 0x10, 0xaf, 0x04, + 0x50, 0x5e, 0xdf, 0xbf, 0x03, 0x01, 0x53, 0x5e, + 0xcf, 0x10, 0xaf, 0x46, 0x88, 0x01, 0x2e, 0x1e, + 0x80, 0xdd, 0x97, 0x0a, 0x40, 0x1c, 0x5a, 0x37, + 0x43, 0x0b, 0x5b, 0xe2, 0xcf, 0x0f, 0x1c, 0x06, + 0x1e, 0x07, 0x52, 0x62, 0xdf, 0x18, 0x1f, 0x07, + 0x53, 0x04, 0x16, 0xe2, 0xaf, 0x04, 0x11, 0x62, + 0xbf, 0x02, 0x50, 0x62, 0xcf, 0xdf, 0x22, 0x0e, + 0x54, 0x0e, 0x88, 0x62, 0xdf, 0xbf, 0x03, 0x04, + 0x53, 0x62, 0xaf, 0xdf, 0x01, 0xe2, 0xcf, 0x3f, + 0x00, 0xe2, 0xaf, 0x0e, 0x88, 0x4a, 0xdf, 0x3f, + 0x00, 0x4a, 0xaf, 0x00, 0x2e, 0xc4, 0x8d, 0x05, + 0x27, 0xff, 0xef, 0x4a, 0xdf, 0xbf, 0x01, 0x0a, + 0x88, 0xa1, 0x27, 0x5f, 0x21, 0x7f, 0x20, 0xfb, + 0x55, 0x05, 0x27, 0x62, 0xcf, 0x03, 0x88, 0x1f, + 0x22, 0x7f, 0x20, 0xfc, 0x55, 0x05, 0x27, 0x10, + 0xdf, 0x02, 0x1f, 0x02, 0x5e, 0x04, 0xff, 0x00, + 0x2e, 0x0a, 0x50, 0x05, 0x1f, 0x02, 0x5e, 0x03, + 0xff, 0x00, 0x2e, 0x05, 0x50, 0x06, 0x1f, 0x02, + 0x5e, 0x02, 0xff, 0x00, 0x2e, 0x00, 0x50, 0x01, + 0xff, 0x05, 0x27, 0x10, 0xcf }; static const unsigned char pkt448[] = { -0x42, 0xca, 0x00, -0x2c, 0x21, 0x33, 0xff, 0x3f, -0x00, 0x21, 0xff, 0x00, 0x13, 0x1a, 0x27, 0x07, -0x27, 0x05, 0x27, 0x01, 0x00, 0x02, 0x57, 0x42, -0x87, 0x52, 0x80, 0x92, 0x81, 0xd2, 0x6c, 0xe2, -0x80, 0xf2, 0x80, 0xf6, 0x7b, 0xfa, 0x7e, 0xfe, -0x8b, 0xf9, 0x45, 0x04, 0x5a, 0x40, 0xef, 0xf9, -0x44, 0x03, 0x5b, 0x80, 0xef, 0x01, 0x50, 0x41, -0x2e, 0x7e, 0xdf, 0x4d, 0xaf, 0x05, 0x27, 0x28, -0xff, 0x54, 0xef, 0x19, 0x27, 0x4d, 0x26, 0xe1, -0x2f, 0x28, 0x54, 0x27, 0xff, 0xe0, 0xef, 0x1b, -0x27, 0x10, 0xef, 0x06, 0xaf, 0xfc, 0x97, 0xfc, -0x9f, 0x1c, 0x82, 0x1c, 0x82, 0x1a, 0x27, 0x4d, -0xdf, 0x6d, 0x80, 0x5f, 0x9f, 0x06, 0x25, 0xf5, -0x55, 0x05, 0x27, 0x26, 0x1f, 0x00, 0x5f, 0xbf, -0x22, 0xff, 0x96, 0x6c, 0xef, 0x21, 0xff, 0x1d, -0x00, 0x00, 0x13, 0x1a, 0x27, 0x07, 0x27, 0x1a, -0x27, 0xd6, 0x97, 0x05, 0x27, 0xa3, 0x01, 0xa4, -0x01, 0xa3, 0x01, 0x2e, 0x00, 0xb0, 0x00, 0xb1, -0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, -0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, -0x00, 0xba, 0x00, 0x56, 0x00, 0xae, 0x00, 0x54, -0x01, 0x44, 0x01, 0x55, 0x01, 0x44, 0x01, 0xbb, -0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0x83, -0x00, 0x84, 0x00, 0x81, 0x00, 0x82, 0x00, 0x24, -0x00, 0x44, 0x01, 0xdb, 0x00, 0xdc, 0x00, 0xdd, -0x00, 0xde, 0x00, 0x04, 0x00 + 0x42, 0xca, 0x00, + 0x2c, 0x21, 0x33, 0xff, 0x3f, + 0x00, 0x21, 0xff, 0x00, 0x13, 0x1a, 0x27, 0x07, + 0x27, 0x05, 0x27, 0x01, 0x00, 0x02, 0x57, 0x42, + 0x87, 0x52, 0x80, 0x92, 0x81, 0xd2, 0x6c, 0xe2, + 0x80, 0xf2, 0x80, 0xf6, 0x7b, 0xfa, 0x7e, 0xfe, + 0x8b, 0xf9, 0x45, 0x04, 0x5a, 0x40, 0xef, 0xf9, + 0x44, 0x03, 0x5b, 0x80, 0xef, 0x01, 0x50, 0x41, + 0x2e, 0x7e, 0xdf, 0x4d, 0xaf, 0x05, 0x27, 0x28, + 0xff, 0x54, 0xef, 0x19, 0x27, 0x4d, 0x26, 0xe1, + 0x2f, 0x28, 0x54, 0x27, 0xff, 0xe0, 0xef, 0x1b, + 0x27, 0x10, 0xef, 0x06, 0xaf, 0xfc, 0x97, 0xfc, + 0x9f, 0x1c, 0x82, 0x1c, 0x82, 0x1a, 0x27, 0x4d, + 0xdf, 0x6d, 0x80, 0x5f, 0x9f, 0x06, 0x25, 0xf5, + 0x55, 0x05, 0x27, 0x26, 0x1f, 0x00, 0x5f, 0xbf, + 0x22, 0xff, 0x96, 0x6c, 0xef, 0x21, 0xff, 0x1d, + 0x00, 0x00, 0x13, 0x1a, 0x27, 0x07, 0x27, 0x1a, + 0x27, 0xd6, 0x97, 0x05, 0x27, 0xa3, 0x01, 0xa4, + 0x01, 0xa3, 0x01, 0x2e, 0x00, 0xb0, 0x00, 0xb1, + 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, + 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, + 0x00, 0xba, 0x00, 0x56, 0x00, 0xae, 0x00, 0x54, + 0x01, 0x44, 0x01, 0x55, 0x01, 0x44, 0x01, 0xbb, + 0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0x83, + 0x00, 0x84, 0x00, 0x81, 0x00, 0x82, 0x00, 0x24, + 0x00, 0x44, 0x01, 0xdb, 0x00, 0xdc, 0x00, 0xdd, + 0x00, 0xde, 0x00, 0x04, 0x00 }; static const unsigned char pkt452[] = { -0x42, 0x52, 0x00, -0x90, 0x21, 0x9b, 0x00, 0x99, -0x00, 0x9e, 0x00, 0x10, 0xef, 0xe6, 0x81, 0x65, -0xaf, 0x10, 0xef, 0xe6, 0x81, 0x9c, 0xaf, 0x10, -0xef, 0xe6, 0x81, 0x9a, 0xaf, 0x05, 0x27, 0xe5, -0x31, 0x1d, 0x81, 0xe5, 0x39, 0x05, 0x27, 0xc8, -0x46, 0x0b, 0x5b, 0xd3, 0x45, 0xfd, 0x5a, 0xd3, -0x45, 0xfb, 0x5a, 0xd3, 0x45, 0xf9, 0x5a, 0x41, -0x2e, 0xa1, 0xdf, 0x9f, 0x28, 0x41, 0x2e, 0xa1, -0xbf, 0x00, 0x88, 0x05, 0x27, 0x9f, 0x22, 0xbf, -0x22, 0x1f, 0x20, 0xfd, 0x53, 0x3f, 0x20, 0x14, -0x1f, 0xfa, 0x55, 0x05, 0x27 + 0x42, 0x52, 0x00, + 0x90, 0x21, 0x9b, 0x00, 0x99, + 0x00, 0x9e, 0x00, 0x10, 0xef, 0xe6, 0x81, 0x65, + 0xaf, 0x10, 0xef, 0xe6, 0x81, 0x9c, 0xaf, 0x10, + 0xef, 0xe6, 0x81, 0x9a, 0xaf, 0x05, 0x27, 0xe5, + 0x31, 0x1d, 0x81, 0xe5, 0x39, 0x05, 0x27, 0xc8, + 0x46, 0x0b, 0x5b, 0xd3, 0x45, 0xfd, 0x5a, 0xd3, + 0x45, 0xfb, 0x5a, 0xd3, 0x45, 0xf9, 0x5a, 0x41, + 0x2e, 0xa1, 0xdf, 0x9f, 0x28, 0x41, 0x2e, 0xa1, + 0xbf, 0x00, 0x88, 0x05, 0x27, 0x9f, 0x22, 0xbf, + 0x22, 0x1f, 0x20, 0xfd, 0x53, 0x3f, 0x20, 0x14, + 0x1f, 0xfa, 0x55, 0x05, 0x27 }; static const unsigned char pkt456[] = { -0x42, 0xca, 0x00, -0xb8, 0x21, 0x25, 0x85, 0x01, -0x1e, 0x17, 0x55, 0x1b, 0x8a, 0x41, 0x2e, 0x53, -0xdf, 0xc1, 0x2e, 0x79, 0xdf, 0xff, 0x96, 0xdf, -0x96, 0x41, 0x2e, 0x55, 0xdf, 0xc1, 0x2e, 0x78, -0xdf, 0x9d, 0x01, 0x5d, 0x01, 0xff, 0x22, 0x00, -0x54, 0xff, 0xef, 0x2e, 0xaf, 0x05, 0x27, 0x07, -0x80, 0x9f, 0x22, 0xff, 0xaf, 0x00, 0x2e, 0x5d, -0x89, 0x05, 0x27, 0x06, 0x1e, 0x01, 0x55, 0x0f, -0x27, 0x01, 0x70, 0x0a, 0x1e, 0x0a, 0x55, 0x00, -0x88, 0x66, 0x76, 0x02, 0x46, 0x00, 0x5b, 0x08, -0x3b, 0x3b, 0x30, 0x07, 0x35, 0xff, 0xff, 0xc2, -0xbf, 0x0d, 0x27, 0x0c, 0x27, 0x0d, 0x1e, 0x02, -0x55, 0x28, 0x85, 0xf2, 0x5b, 0x7b, 0x76, 0x12, -0x1e, 0x07, 0x55, 0xdc, 0xef, 0x05, 0xff, 0x1a, -0x27, 0x56, 0xdf, 0x3f, 0x20, 0x6d, 0x80, 0x3c, -0xaf, 0x05, 0x27, 0x13, 0x1e, 0x01, 0x55, 0x3c, -0x23, 0x05, 0x27, 0x1f, 0x1e, 0x06, 0x55, 0x37, -0x35, 0x08, 0xef, 0x40, 0x2e, 0xf0, 0xbf, 0x40, -0x2e, 0xf6, 0xbf, 0x05, 0x27, 0x20, 0x1e, 0x06, -0x55, 0x37, 0x3d, 0x16, 0xef, 0x40, 0x2e, 0xf0, -0xbf, 0x40, 0x2e, 0xf6, 0xbf, 0x05, 0x27, 0x22, -0x1e, 0x19, 0x55, 0x21, 0xef, 0x08, 0xaf, 0x09, -0x23, 0x01, 0xef, 0x0b, 0xaf, 0x31, 0xef, 0x0a, -0xaf, 0x81, 0xcf, 0x10, 0xaf, 0xbf, 0x8e, 0x82, -0xcf, 0x4a, 0xaf, 0x00, 0x2e, 0xc4, 0x8d, 0x08, -0xef, 0x9b, 0xaf, 0x99, 0xaf + 0x42, 0xca, 0x00, + 0xb8, 0x21, 0x25, 0x85, 0x01, + 0x1e, 0x17, 0x55, 0x1b, 0x8a, 0x41, 0x2e, 0x53, + 0xdf, 0xc1, 0x2e, 0x79, 0xdf, 0xff, 0x96, 0xdf, + 0x96, 0x41, 0x2e, 0x55, 0xdf, 0xc1, 0x2e, 0x78, + 0xdf, 0x9d, 0x01, 0x5d, 0x01, 0xff, 0x22, 0x00, + 0x54, 0xff, 0xef, 0x2e, 0xaf, 0x05, 0x27, 0x07, + 0x80, 0x9f, 0x22, 0xff, 0xaf, 0x00, 0x2e, 0x5d, + 0x89, 0x05, 0x27, 0x06, 0x1e, 0x01, 0x55, 0x0f, + 0x27, 0x01, 0x70, 0x0a, 0x1e, 0x0a, 0x55, 0x00, + 0x88, 0x66, 0x76, 0x02, 0x46, 0x00, 0x5b, 0x08, + 0x3b, 0x3b, 0x30, 0x07, 0x35, 0xff, 0xff, 0xc2, + 0xbf, 0x0d, 0x27, 0x0c, 0x27, 0x0d, 0x1e, 0x02, + 0x55, 0x28, 0x85, 0xf2, 0x5b, 0x7b, 0x76, 0x12, + 0x1e, 0x07, 0x55, 0xdc, 0xef, 0x05, 0xff, 0x1a, + 0x27, 0x56, 0xdf, 0x3f, 0x20, 0x6d, 0x80, 0x3c, + 0xaf, 0x05, 0x27, 0x13, 0x1e, 0x01, 0x55, 0x3c, + 0x23, 0x05, 0x27, 0x1f, 0x1e, 0x06, 0x55, 0x37, + 0x35, 0x08, 0xef, 0x40, 0x2e, 0xf0, 0xbf, 0x40, + 0x2e, 0xf6, 0xbf, 0x05, 0x27, 0x20, 0x1e, 0x06, + 0x55, 0x37, 0x3d, 0x16, 0xef, 0x40, 0x2e, 0xf0, + 0xbf, 0x40, 0x2e, 0xf6, 0xbf, 0x05, 0x27, 0x22, + 0x1e, 0x19, 0x55, 0x21, 0xef, 0x08, 0xaf, 0x09, + 0x23, 0x01, 0xef, 0x0b, 0xaf, 0x31, 0xef, 0x0a, + 0xaf, 0x81, 0xcf, 0x10, 0xaf, 0xbf, 0x8e, 0x82, + 0xcf, 0x4a, 0xaf, 0x00, 0x2e, 0xc4, 0x8d, 0x08, + 0xef, 0x9b, 0xaf, 0x99, 0xaf }; static const unsigned char pkt460[] = { -0x42, 0x34, 0x00, -0x1c, 0x22, 0x02, 0xcf, 0x0f, -0x1c, 0x40, 0x18, 0x37, 0x31, 0x02, 0xaf, 0xe2, -0x23, 0x08, 0xef, 0xe3, 0xaf, 0x05, 0x27, 0x23, -0x1e, 0x0c, 0x55, 0x00, 0xef, 0x02, 0xff, 0x19, -0x27, 0xbf, 0x22, 0x20, 0xef, 0x7f, 0x9f, 0x5f, -0x20, 0xfc, 0x55, 0xf0, 0x81, 0x9f, 0x22, 0x41, -0x2e, 0xa3, 0xbf, 0x05, 0x27, 0xcb, 0x74 + 0x42, 0x34, 0x00, + 0x1c, 0x22, 0x02, 0xcf, 0x0f, + 0x1c, 0x40, 0x18, 0x37, 0x31, 0x02, 0xaf, 0xe2, + 0x23, 0x08, 0xef, 0xe3, 0xaf, 0x05, 0x27, 0x23, + 0x1e, 0x0c, 0x55, 0x00, 0xef, 0x02, 0xff, 0x19, + 0x27, 0xbf, 0x22, 0x20, 0xef, 0x7f, 0x9f, 0x5f, + 0x20, 0xfc, 0x55, 0xf0, 0x81, 0x9f, 0x22, 0x41, + 0x2e, 0xa3, 0xbf, 0x05, 0x27, 0xcb, 0x74 }; static const unsigned char pkt464[] = { -0x42, 0xca, 0x00, -0x35, 0x22, 0x25, 0x85, 0x44, -0x1e, 0x01, 0x55, 0xe2, 0x2f, 0xf1, 0x50, 0x49, -0x1e, 0x0d, 0x55, 0x37, 0x39, 0x01, 0xef, 0x72, -0x88, 0x00, 0x2e, 0x45, 0x8d, 0x6b, 0x81, 0x08, -0x42, 0x03, 0x5b, 0x3d, 0x23, 0x9f, 0x22, 0x00, -0x2e, 0xb2, 0x8b, 0xd3, 0x3b, 0x05, 0x27, 0x4a, -0x1e, 0x01, 0x55, 0xe2, 0x2f, 0xdd, 0x50, 0x4e, -0x1e, 0x01, 0x55, 0x00, 0x2e, 0xbb, 0x79, 0x55, -0x1e, 0x16, 0x55, 0x28, 0x85, 0xe2, 0x2f, 0xd4, -0x5b, 0x07, 0xef, 0x20, 0x80, 0xe2, 0x2f, 0xd0, -0x5a, 0xfe, 0xcf, 0x0a, 0xaf, 0xfe, 0xcf, 0xfe, -0xcf, 0x41, 0x2e, 0x44, 0xbf, 0xfe, 0xcf, 0x41, -0x2e, 0x45, 0xbf, 0xfe, 0xcf, 0x52, 0xaf, 0xfe, -0xcf, 0x53, 0xaf, 0xfe, 0xcf, 0x5a, 0xaf, 0x05, -0x27, 0x58, 0x1e, 0x0d, 0x55, 0x02, 0x44, 0x01, -0x5a, 0x00, 0x2e, 0x07, 0x78, 0xfe, 0xcf, 0x75, -0xaf, 0xfe, 0xdf, 0x76, 0xbf, 0x41, 0x2e, 0xa4, -0xdf, 0xdf, 0x29, 0x41, 0x2e, 0xa4, 0xbf, 0x05, -0x27, 0x59, 0x1e, 0x02, 0x55, 0xfe, 0xcf, 0x10, -0xaf, 0x54, 0x7e, 0x63, 0x1e, 0x1a, 0x55, 0x28, -0x85, 0xe2, 0x2f, 0xa6, 0x5b, 0x0c, 0xef, 0x20, -0x80, 0xe2, 0x2f, 0xa2, 0x5a, 0xf0, 0xef, 0x00, -0xff, 0x19, 0x27, 0x08, 0xef, 0x06, 0xaf, 0xfe, -0xcf, 0x5f, 0x9f, 0x06, 0x25, 0xfb, 0x55, 0xfe, -0xcf, 0xfe, 0xcf, 0x41, 0x2e, 0x40, 0xbf, 0xfe, -0xcf, 0x41, 0x2e, 0x41, 0xbf + 0x42, 0xca, 0x00, + 0x35, 0x22, 0x25, 0x85, 0x44, + 0x1e, 0x01, 0x55, 0xe2, 0x2f, 0xf1, 0x50, 0x49, + 0x1e, 0x0d, 0x55, 0x37, 0x39, 0x01, 0xef, 0x72, + 0x88, 0x00, 0x2e, 0x45, 0x8d, 0x6b, 0x81, 0x08, + 0x42, 0x03, 0x5b, 0x3d, 0x23, 0x9f, 0x22, 0x00, + 0x2e, 0xb2, 0x8b, 0xd3, 0x3b, 0x05, 0x27, 0x4a, + 0x1e, 0x01, 0x55, 0xe2, 0x2f, 0xdd, 0x50, 0x4e, + 0x1e, 0x01, 0x55, 0x00, 0x2e, 0xbb, 0x79, 0x55, + 0x1e, 0x16, 0x55, 0x28, 0x85, 0xe2, 0x2f, 0xd4, + 0x5b, 0x07, 0xef, 0x20, 0x80, 0xe2, 0x2f, 0xd0, + 0x5a, 0xfe, 0xcf, 0x0a, 0xaf, 0xfe, 0xcf, 0xfe, + 0xcf, 0x41, 0x2e, 0x44, 0xbf, 0xfe, 0xcf, 0x41, + 0x2e, 0x45, 0xbf, 0xfe, 0xcf, 0x52, 0xaf, 0xfe, + 0xcf, 0x53, 0xaf, 0xfe, 0xcf, 0x5a, 0xaf, 0x05, + 0x27, 0x58, 0x1e, 0x0d, 0x55, 0x02, 0x44, 0x01, + 0x5a, 0x00, 0x2e, 0x07, 0x78, 0xfe, 0xcf, 0x75, + 0xaf, 0xfe, 0xdf, 0x76, 0xbf, 0x41, 0x2e, 0xa4, + 0xdf, 0xdf, 0x29, 0x41, 0x2e, 0xa4, 0xbf, 0x05, + 0x27, 0x59, 0x1e, 0x02, 0x55, 0xfe, 0xcf, 0x10, + 0xaf, 0x54, 0x7e, 0x63, 0x1e, 0x1a, 0x55, 0x28, + 0x85, 0xe2, 0x2f, 0xa6, 0x5b, 0x0c, 0xef, 0x20, + 0x80, 0xe2, 0x2f, 0xa2, 0x5a, 0xf0, 0xef, 0x00, + 0xff, 0x19, 0x27, 0x08, 0xef, 0x06, 0xaf, 0xfe, + 0xcf, 0x5f, 0x9f, 0x06, 0x25, 0xfb, 0x55, 0xfe, + 0xcf, 0xfe, 0xcf, 0x41, 0x2e, 0x40, 0xbf, 0xfe, + 0xcf, 0x41, 0x2e, 0x41, 0xbf }; static const unsigned char pkt468[] = { -0x42, 0x46, 0x00, -0x99, 0x22, 0xfe, 0xcf, 0x41, -0x2e, 0x42, 0xbf, 0x05, 0x27, 0x66, 0x1e, 0x0b, -0x55, 0x33, 0xef, 0x21, 0xff, 0x1a, 0x27, 0x0b, -0xef, 0x06, 0xaf, 0xfe, 0xcf, 0xfe, 0xdf, 0x06, -0x27, 0x01, 0x0e, 0x06, 0x25, 0xf9, 0x55, 0x05, -0x27, 0x35, 0x74, 0xff, 0x96, 0xc6, 0x2e, 0x01, -0xdf, 0x3f, 0x2c, 0xdd, 0x9f, 0x05, 0x27, 0xf9, -0x35, 0xc1, 0x2e, 0x4e, 0xdf, 0x0f, 0x1d, 0x09, -0x27, 0x5f, 0x02, 0xc1, 0x2e, 0x4e, 0xbf, 0x05, -0x27 + 0x42, 0x46, 0x00, + 0x99, 0x22, 0xfe, 0xcf, 0x41, + 0x2e, 0x42, 0xbf, 0x05, 0x27, 0x66, 0x1e, 0x0b, + 0x55, 0x33, 0xef, 0x21, 0xff, 0x1a, 0x27, 0x0b, + 0xef, 0x06, 0xaf, 0xfe, 0xcf, 0xfe, 0xdf, 0x06, + 0x27, 0x01, 0x0e, 0x06, 0x25, 0xf9, 0x55, 0x05, + 0x27, 0x35, 0x74, 0xff, 0x96, 0xc6, 0x2e, 0x01, + 0xdf, 0x3f, 0x2c, 0xdd, 0x9f, 0x05, 0x27, 0xf9, + 0x35, 0xc1, 0x2e, 0x4e, 0xdf, 0x0f, 0x1d, 0x09, + 0x27, 0x5f, 0x02, 0xc1, 0x2e, 0x4e, 0xbf, 0x05, + 0x27 }; static const unsigned char pkt472[] = { -0x42, 0xca, 0x00, -0xbb, 0x22, 0x09, 0x46, 0x0b, -0x5b, 0x08, 0x31, 0xf2, 0xcf, 0x0b, 0xaf, 0x15, -0xef, 0xf4, 0xaf, 0x30, 0xef, 0x0a, 0xaf, 0x44, -0xef, 0xfa, 0xaf, 0x10, 0xef, 0xf8, 0xaf, 0x5c, -0x88, 0x37, 0xcf, 0xdf, 0x96, 0x08, 0xcf, 0xdf, -0x96, 0x3d, 0xcf, 0xdf, 0x96, 0x00, 0x2e, 0xd4, -0x8d, 0xdd, 0x97, 0x3d, 0xaf, 0xdd, 0x97, 0x08, -0xaf, 0xdd, 0x97, 0x37, 0xaf, 0xa0, 0xcf, 0xbf, -0x1c, 0xa0, 0xaf, 0x05, 0x81, 0xfb, 0x39, 0x08, -0x45, 0x00, 0x5a, 0xfb, 0x31, 0x0a, 0x42, 0x00, -0x5b, 0xa2, 0x39, 0x02, 0xcf, 0x5c, 0xaf, 0xe1, -0xef, 0x40, 0x2e, 0x95, 0xbf, 0x9f, 0x22, 0x25, -0xaf, 0x69, 0xaf, 0x6a, 0xaf, 0x16, 0xaf, 0x40, -0x2e, 0x96, 0xbf, 0x29, 0xaf, 0x02, 0x47, 0x06, -0x5a, 0x0a, 0x41, 0x04, 0x5a, 0x0a, 0xdf, 0x30, -0x1d, 0x30, 0x1f, 0x00, 0x54, 0x01, 0xef, 0x44, -0xaf, 0x09, 0xef, 0x60, 0xaf, 0x08, 0x45, 0x0a, -0x40, 0x06, 0x5a, 0x10, 0xcf, 0x27, 0xaf, 0xe2, -0x23, 0x6e, 0x23, 0x08, 0xef, 0xe3, 0xaf, 0x6f, -0xaf, 0xce, 0x8d, 0x5d, 0xcf, 0x30, 0x1c, 0x00, -0x1e, 0x07, 0x55, 0xf8, 0xcf, 0x5f, 0x2b, 0x9f, -0x29, 0xf8, 0xaf, 0xa1, 0xcf, 0xc1, 0x1c, 0xa1, -0xaf, 0x09, 0x50, 0x10, 0x1e, 0x07, 0x55, 0xf8, -0xcf, 0x5f, 0x29, 0x9f, 0x2b, 0xf8, 0xaf, 0xa1, -0xcf, 0xc1, 0x1c, 0x08, 0x18, 0xa1, 0xaf, 0x41, -0x2e, 0xa4, 0xdf, 0xdf, 0x2d + 0x42, 0xca, 0x00, + 0xbb, 0x22, 0x09, 0x46, 0x0b, + 0x5b, 0x08, 0x31, 0xf2, 0xcf, 0x0b, 0xaf, 0x15, + 0xef, 0xf4, 0xaf, 0x30, 0xef, 0x0a, 0xaf, 0x44, + 0xef, 0xfa, 0xaf, 0x10, 0xef, 0xf8, 0xaf, 0x5c, + 0x88, 0x37, 0xcf, 0xdf, 0x96, 0x08, 0xcf, 0xdf, + 0x96, 0x3d, 0xcf, 0xdf, 0x96, 0x00, 0x2e, 0xd4, + 0x8d, 0xdd, 0x97, 0x3d, 0xaf, 0xdd, 0x97, 0x08, + 0xaf, 0xdd, 0x97, 0x37, 0xaf, 0xa0, 0xcf, 0xbf, + 0x1c, 0xa0, 0xaf, 0x05, 0x81, 0xfb, 0x39, 0x08, + 0x45, 0x00, 0x5a, 0xfb, 0x31, 0x0a, 0x42, 0x00, + 0x5b, 0xa2, 0x39, 0x02, 0xcf, 0x5c, 0xaf, 0xe1, + 0xef, 0x40, 0x2e, 0x95, 0xbf, 0x9f, 0x22, 0x25, + 0xaf, 0x69, 0xaf, 0x6a, 0xaf, 0x16, 0xaf, 0x40, + 0x2e, 0x96, 0xbf, 0x29, 0xaf, 0x02, 0x47, 0x06, + 0x5a, 0x0a, 0x41, 0x04, 0x5a, 0x0a, 0xdf, 0x30, + 0x1d, 0x30, 0x1f, 0x00, 0x54, 0x01, 0xef, 0x44, + 0xaf, 0x09, 0xef, 0x60, 0xaf, 0x08, 0x45, 0x0a, + 0x40, 0x06, 0x5a, 0x10, 0xcf, 0x27, 0xaf, 0xe2, + 0x23, 0x6e, 0x23, 0x08, 0xef, 0xe3, 0xaf, 0x6f, + 0xaf, 0xce, 0x8d, 0x5d, 0xcf, 0x30, 0x1c, 0x00, + 0x1e, 0x07, 0x55, 0xf8, 0xcf, 0x5f, 0x2b, 0x9f, + 0x29, 0xf8, 0xaf, 0xa1, 0xcf, 0xc1, 0x1c, 0xa1, + 0xaf, 0x09, 0x50, 0x10, 0x1e, 0x07, 0x55, 0xf8, + 0xcf, 0x5f, 0x29, 0x9f, 0x2b, 0xf8, 0xaf, 0xa1, + 0xcf, 0xc1, 0x1c, 0x08, 0x18, 0xa1, 0xaf, 0x41, + 0x2e, 0xa4, 0xdf, 0xdf, 0x2d }; static const unsigned char pkt476[] = { -0x42, 0x3a, 0x00, -0x1f, 0x23, 0x04, 0x5b, 0x75, -0xcf, 0xf4, 0xaf, 0x76, 0xcf, 0xf5, 0xaf, 0x00, -0x50, 0x0f, 0x88, 0xe2, 0x23, 0x08, 0xef, 0xe3, -0xaf, 0x81, 0x82, 0x4d, 0xaf, 0xdf, 0x96, 0x64, -0xdf, 0x93, 0x82, 0x93, 0xbf, 0xdd, 0x97, 0x77, -0xff, 0x93, 0x82, 0x94, 0xbf, 0x9e, 0x23, 0xe4, -0x23, 0x05, 0x27, 0x14, 0xef, 0xf4, 0xaf, 0x00, -0xef, 0xf5, 0xaf, 0x05, 0x27 + 0x42, 0x3a, 0x00, + 0x1f, 0x23, 0x04, 0x5b, 0x75, + 0xcf, 0xf4, 0xaf, 0x76, 0xcf, 0xf5, 0xaf, 0x00, + 0x50, 0x0f, 0x88, 0xe2, 0x23, 0x08, 0xef, 0xe3, + 0xaf, 0x81, 0x82, 0x4d, 0xaf, 0xdf, 0x96, 0x64, + 0xdf, 0x93, 0x82, 0x93, 0xbf, 0xdd, 0x97, 0x77, + 0xff, 0x93, 0x82, 0x94, 0xbf, 0x9e, 0x23, 0xe4, + 0x23, 0x05, 0x27, 0x14, 0xef, 0xf4, 0xaf, 0x00, + 0xef, 0xf5, 0xaf, 0x05, 0x27 }; static const unsigned char pkt480[] = { -0x42, 0xca, 0x00, -0x3b, 0x23, 0xfe, 0xcf, 0x58, -0xaf, 0xfe, 0xcf, 0xfe, 0xdf, 0x00, 0x2e, 0xa9, -0x8b, 0xfe, 0xcf, 0x3c, 0xaf, 0x07, 0x3d, 0x58, -0x40, 0x4a, 0x5a, 0x3c, 0x26, 0x48, 0x55, 0x37, -0x45, 0x46, 0x5a, 0xe0, 0x88, 0x44, 0x5a, 0x77, -0x88, 0x00, 0x2e, 0xd1, 0x8b, 0xfe, 0xef, 0x16, -0x80, 0x02, 0xcf, 0xdf, 0x96, 0x61, 0xef, 0xc0, -0xaf, 0x04, 0x27, 0xc1, 0x46, 0x04, 0x5b, 0xc0, -0x3e, 0x40, 0xef, 0xc1, 0xaf, 0x01, 0x2e, 0x94, -0x84, 0xd0, 0x41, 0x06, 0x5b, 0x2d, 0x88, 0xf3, -0x5b, 0x6c, 0x86, 0xdd, 0x97, 0x1f, 0x2d, 0x05, -0x5b, 0x03, 0x50, 0x01, 0x0c, 0x02, 0xcf, 0xc0, -0x1c, 0x00, 0x55, 0x05, 0x88, 0xc0, 0x23, 0x20, -0xef, 0xc1, 0xaf, 0x00, 0x2e, 0xf0, 0x8b, 0x05, -0x27, 0x9b, 0x22, 0x37, 0x45, 0x05, 0x5a, 0x41, -0x2e, 0x52, 0xdf, 0xdf, 0x2d, 0x04, 0x5b, 0x00, -0x28, 0x02, 0x50, 0x3b, 0x43, 0x00, 0x5b, 0x00, -0x28, 0xd3, 0xdf, 0xc6, 0x2e, 0x15, 0xbf, 0xd3, -0x3c, 0x40, 0xef, 0x09, 0x80, 0xdd, 0x97, 0xff, -0xaf, 0x00, 0x2e, 0x5d, 0x89, 0xc6, 0x2e, 0x15, -0xdf, 0x10, 0x1d, 0xd3, 0xcf, 0x3f, 0x02, 0xd3, -0xaf, 0x05, 0x27, 0xc1, 0x83, 0x07, 0x45, 0x05, -0x27, 0x3d, 0x23, 0x07, 0x3d, 0x02, 0xcf, 0xdf, -0x96, 0x2e, 0x88, 0x26, 0x88, 0xfe, 0xef, 0x16, -0x80, 0x05, 0xef, 0xc0, 0xaf, 0x04, 0x27, 0xd0, -0x41, 0x02, 0x5b, 0xee, 0x8f + 0x42, 0xca, 0x00, + 0x3b, 0x23, 0xfe, 0xcf, 0x58, + 0xaf, 0xfe, 0xcf, 0xfe, 0xdf, 0x00, 0x2e, 0xa9, + 0x8b, 0xfe, 0xcf, 0x3c, 0xaf, 0x07, 0x3d, 0x58, + 0x40, 0x4a, 0x5a, 0x3c, 0x26, 0x48, 0x55, 0x37, + 0x45, 0x46, 0x5a, 0xe0, 0x88, 0x44, 0x5a, 0x77, + 0x88, 0x00, 0x2e, 0xd1, 0x8b, 0xfe, 0xef, 0x16, + 0x80, 0x02, 0xcf, 0xdf, 0x96, 0x61, 0xef, 0xc0, + 0xaf, 0x04, 0x27, 0xc1, 0x46, 0x04, 0x5b, 0xc0, + 0x3e, 0x40, 0xef, 0xc1, 0xaf, 0x01, 0x2e, 0x94, + 0x84, 0xd0, 0x41, 0x06, 0x5b, 0x2d, 0x88, 0xf3, + 0x5b, 0x6c, 0x86, 0xdd, 0x97, 0x1f, 0x2d, 0x05, + 0x5b, 0x03, 0x50, 0x01, 0x0c, 0x02, 0xcf, 0xc0, + 0x1c, 0x00, 0x55, 0x05, 0x88, 0xc0, 0x23, 0x20, + 0xef, 0xc1, 0xaf, 0x00, 0x2e, 0xf0, 0x8b, 0x05, + 0x27, 0x9b, 0x22, 0x37, 0x45, 0x05, 0x5a, 0x41, + 0x2e, 0x52, 0xdf, 0xdf, 0x2d, 0x04, 0x5b, 0x00, + 0x28, 0x02, 0x50, 0x3b, 0x43, 0x00, 0x5b, 0x00, + 0x28, 0xd3, 0xdf, 0xc6, 0x2e, 0x15, 0xbf, 0xd3, + 0x3c, 0x40, 0xef, 0x09, 0x80, 0xdd, 0x97, 0xff, + 0xaf, 0x00, 0x2e, 0x5d, 0x89, 0xc6, 0x2e, 0x15, + 0xdf, 0x10, 0x1d, 0xd3, 0xcf, 0x3f, 0x02, 0xd3, + 0xaf, 0x05, 0x27, 0xc1, 0x83, 0x07, 0x45, 0x05, + 0x27, 0x3d, 0x23, 0x07, 0x3d, 0x02, 0xcf, 0xdf, + 0x96, 0x2e, 0x88, 0x26, 0x88, 0xfe, 0xef, 0x16, + 0x80, 0x05, 0xef, 0xc0, 0xaf, 0x04, 0x27, 0xd0, + 0x41, 0x02, 0x5b, 0xee, 0x8f }; static const unsigned char pkt484[] = { -0x42, 0xca, 0x00, -0x9f, 0x23, 0xfa, 0x5b, 0xbf, -0x50, 0x31, 0x82, 0x04, 0xef, 0xc1, 0xaf, 0x9b, -0x22, 0x41, 0x88, 0xdd, 0x97, 0xdf, 0x22, 0x02, -0x55, 0x58, 0x40, 0x02, 0x5a, 0x09, 0x50, 0x58, -0x40, 0x07, 0x5a, 0xdd, 0x97, 0x1f, 0x2d, 0xb8, -0x5a, 0x7a, 0x88, 0xb7, 0x5b, 0x9b, 0x22, 0xc7, -0x8f, 0xb4, 0x50, 0x75, 0x88, 0xdc, 0x5b, 0xb7, -0x8f, 0x58, 0x41, 0x01, 0x5b, 0x01, 0x0c, 0xad, -0x7f, 0xd6, 0x50, 0x41, 0x2e, 0x52, 0xdf, 0xed, -0x1c, 0x04, 0x18, 0x41, 0x2e, 0x52, 0xbf, 0x05, -0x27, 0x00, 0x2e, 0xb9, 0x8b, 0xae, 0xdf, 0xe0, -0x19, 0xae, 0xbf, 0x57, 0x40, 0x00, 0x5b, 0xa1, -0x32, 0x57, 0x43, 0x00, 0x5b, 0xae, 0x3f, 0x05, -0x81, 0x05, 0x27, 0x41, 0x2e, 0x52, 0xdf, 0x03, -0x18, 0x41, 0x2e, 0x52, 0xbf, 0x05, 0x27, 0xd3, -0xdf, 0xff, 0x96, 0x9b, 0x22, 0x0b, 0x88, 0xd3, -0x3c, 0x07, 0x80, 0xdd, 0x97, 0xff, 0xaf, 0x00, -0x2e, 0x5d, 0x89, 0xdd, 0x9f, 0x10, 0x1d, 0xd3, -0xcf, 0x3f, 0x02, 0xd3, 0xaf, 0x05, 0x27, 0x37, -0x45, 0x0e, 0x5a, 0x40, 0x88, 0x0c, 0x5a, 0xd7, -0x8f, 0x00, 0x2e, 0xd7, 0x8b, 0x00, 0x2e, 0xeb, -0x8b, 0x41, 0x2e, 0x52, 0xdf, 0xdf, 0x2d, 0x00, -0x5b, 0x00, 0x28, 0x00, 0x2e, 0xf0, 0x8b, 0x05, -0x27, 0xf9, 0xcf, 0xdf, 0x96, 0xf9, 0x3d, 0x00, -0x2e, 0xd1, 0x8d, 0x28, 0xff, 0xa7, 0xef, 0xe1, -0xbf, 0xe0, 0xaf, 0x09, 0xef + 0x42, 0xca, 0x00, + 0x9f, 0x23, 0xfa, 0x5b, 0xbf, + 0x50, 0x31, 0x82, 0x04, 0xef, 0xc1, 0xaf, 0x9b, + 0x22, 0x41, 0x88, 0xdd, 0x97, 0xdf, 0x22, 0x02, + 0x55, 0x58, 0x40, 0x02, 0x5a, 0x09, 0x50, 0x58, + 0x40, 0x07, 0x5a, 0xdd, 0x97, 0x1f, 0x2d, 0xb8, + 0x5a, 0x7a, 0x88, 0xb7, 0x5b, 0x9b, 0x22, 0xc7, + 0x8f, 0xb4, 0x50, 0x75, 0x88, 0xdc, 0x5b, 0xb7, + 0x8f, 0x58, 0x41, 0x01, 0x5b, 0x01, 0x0c, 0xad, + 0x7f, 0xd6, 0x50, 0x41, 0x2e, 0x52, 0xdf, 0xed, + 0x1c, 0x04, 0x18, 0x41, 0x2e, 0x52, 0xbf, 0x05, + 0x27, 0x00, 0x2e, 0xb9, 0x8b, 0xae, 0xdf, 0xe0, + 0x19, 0xae, 0xbf, 0x57, 0x40, 0x00, 0x5b, 0xa1, + 0x32, 0x57, 0x43, 0x00, 0x5b, 0xae, 0x3f, 0x05, + 0x81, 0x05, 0x27, 0x41, 0x2e, 0x52, 0xdf, 0x03, + 0x18, 0x41, 0x2e, 0x52, 0xbf, 0x05, 0x27, 0xd3, + 0xdf, 0xff, 0x96, 0x9b, 0x22, 0x0b, 0x88, 0xd3, + 0x3c, 0x07, 0x80, 0xdd, 0x97, 0xff, 0xaf, 0x00, + 0x2e, 0x5d, 0x89, 0xdd, 0x9f, 0x10, 0x1d, 0xd3, + 0xcf, 0x3f, 0x02, 0xd3, 0xaf, 0x05, 0x27, 0x37, + 0x45, 0x0e, 0x5a, 0x40, 0x88, 0x0c, 0x5a, 0xd7, + 0x8f, 0x00, 0x2e, 0xd7, 0x8b, 0x00, 0x2e, 0xeb, + 0x8b, 0x41, 0x2e, 0x52, 0xdf, 0xdf, 0x2d, 0x00, + 0x5b, 0x00, 0x28, 0x00, 0x2e, 0xf0, 0x8b, 0x05, + 0x27, 0xf9, 0xcf, 0xdf, 0x96, 0xf9, 0x3d, 0x00, + 0x2e, 0xd1, 0x8d, 0x28, 0xff, 0xa7, 0xef, 0xe1, + 0xbf, 0xe0, 0xaf, 0x09, 0xef }; static const unsigned char pkt488[] = { -0x42, 0x6c, 0x00, -0x03, 0x24, 0x10, 0xaf, 0xcf, -0x8c, 0x05, 0x81, 0x01, 0x2e, 0x54, 0x80, 0x01, -0x2e, 0x56, 0x80, 0x20, 0x82, 0x3c, 0x8d, 0x37, -0x82, 0x26, 0x37, 0x00, 0x5a, 0x0c, 0x50, 0xff, -0x96, 0xdf, 0x96, 0x79, 0xcf, 0x7a, 0xdf, 0xff, -0x96, 0xdf, 0x96, 0xc2, 0x97, 0xc3, 0x9f, 0x9d, -0x01, 0x5d, 0x01, 0x07, 0x53, 0xdd, 0x97, 0xdd, -0x9f, 0x79, 0xaf, 0x7a, 0xbf, 0x3b, 0x3b, 0xdd, -0x97, 0xf9, 0xaf, 0x05, 0x27, 0xff, 0x22, 0x01, -0x55, 0x32, 0x1e, 0xf3, 0x5f, 0x02, 0x0c, 0xf6, -0x8f, 0x3b, 0x33, 0x00, 0x28, 0x05, 0x27, 0x0d, -0x27, 0x3c, 0x26, 0x07, 0x54, 0x3c, 0xcf, 0x3d, -0xdf, 0x3f, 0x20, 0x3d, 0xbf, 0xdf, 0x03, 0x01, -0x52, 0x3d, 0x23, 0x0c, 0x27, 0x0d, 0x27 + 0x42, 0x6c, 0x00, + 0x03, 0x24, 0x10, 0xaf, 0xcf, + 0x8c, 0x05, 0x81, 0x01, 0x2e, 0x54, 0x80, 0x01, + 0x2e, 0x56, 0x80, 0x20, 0x82, 0x3c, 0x8d, 0x37, + 0x82, 0x26, 0x37, 0x00, 0x5a, 0x0c, 0x50, 0xff, + 0x96, 0xdf, 0x96, 0x79, 0xcf, 0x7a, 0xdf, 0xff, + 0x96, 0xdf, 0x96, 0xc2, 0x97, 0xc3, 0x9f, 0x9d, + 0x01, 0x5d, 0x01, 0x07, 0x53, 0xdd, 0x97, 0xdd, + 0x9f, 0x79, 0xaf, 0x7a, 0xbf, 0x3b, 0x3b, 0xdd, + 0x97, 0xf9, 0xaf, 0x05, 0x27, 0xff, 0x22, 0x01, + 0x55, 0x32, 0x1e, 0xf3, 0x5f, 0x02, 0x0c, 0xf6, + 0x8f, 0x3b, 0x33, 0x00, 0x28, 0x05, 0x27, 0x0d, + 0x27, 0x3c, 0x26, 0x07, 0x54, 0x3c, 0xcf, 0x3d, + 0xdf, 0x3f, 0x20, 0x3d, 0xbf, 0xdf, 0x03, 0x01, + 0x52, 0x3d, 0x23, 0x0c, 0x27, 0x0d, 0x27 }; static const unsigned char pkt492[] = { -0x42, 0x9c, 0x00, -0x38, 0x24, 0x08, 0x44, 0x12, -0x5a, 0x07, 0x40, 0x01, 0x5b, 0x4f, 0x80, 0x00, -0x50, 0x53, 0x80, 0x27, 0x0d, 0x25, 0xcf, 0x1f, -0x98, 0x29, 0xcf, 0x09, 0x27, 0x28, 0xdf, 0x3f, -0x02, 0x5f, 0x98, 0x62, 0xcf, 0xdf, 0x98, 0xd9, -0x0d, 0x02, 0x0d, 0x00, 0x2e, 0xd5, 0x7f, 0x05, -0x27, 0x08, 0x44, 0x22, 0x5a, 0x07, 0x40, 0x01, -0x5b, 0x4f, 0x80, 0x00, 0x50, 0x53, 0x80, 0x0b, -0x0d, 0x07, 0x40, 0x1b, 0x5a, 0x44, 0xcf, 0x1f, -0x20, 0x44, 0xaf, 0x5f, 0x9f, 0xc1, 0x2e, 0x57, -0xdf, 0xff, 0x96, 0x41, 0x2e, 0x56, 0xdf, 0xdf, -0x96, 0x41, 0x2e, 0x58, 0xdf, 0xc1, 0x2e, 0x59, -0xdf, 0x9d, 0x01, 0x5d, 0x01, 0xff, 0x96, 0xdf, -0x96, 0x40, 0x2e, 0x59, 0xdf, 0x5f, 0x9f, 0x50, -0xdf, 0x7f, 0x9f, 0x1d, 0x00, 0xdd, 0x00, 0x5f, -0x9f, 0x7f, 0x9f, 0x05, 0x27, 0x01, 0x0d, 0x41, -0x2e, 0x56, 0xdf, 0x5f, 0x9f, 0x41, 0x2e, 0x57, -0xdf, 0x5f, 0x9f, 0x41, 0x2e, 0x58, 0xdf, 0x5f, -0x9f, 0x41, 0x2e, 0x59, 0xdf, 0x5f, 0x9f, 0x06, -0x0d, 0x3b, 0xcf, 0x5f, 0x9f, 0x05, 0x27 + 0x42, 0x9c, 0x00, + 0x38, 0x24, 0x08, 0x44, 0x12, + 0x5a, 0x07, 0x40, 0x01, 0x5b, 0x4f, 0x80, 0x00, + 0x50, 0x53, 0x80, 0x27, 0x0d, 0x25, 0xcf, 0x1f, + 0x98, 0x29, 0xcf, 0x09, 0x27, 0x28, 0xdf, 0x3f, + 0x02, 0x5f, 0x98, 0x62, 0xcf, 0xdf, 0x98, 0xd9, + 0x0d, 0x02, 0x0d, 0x00, 0x2e, 0xd5, 0x7f, 0x05, + 0x27, 0x08, 0x44, 0x22, 0x5a, 0x07, 0x40, 0x01, + 0x5b, 0x4f, 0x80, 0x00, 0x50, 0x53, 0x80, 0x0b, + 0x0d, 0x07, 0x40, 0x1b, 0x5a, 0x44, 0xcf, 0x1f, + 0x20, 0x44, 0xaf, 0x5f, 0x9f, 0xc1, 0x2e, 0x57, + 0xdf, 0xff, 0x96, 0x41, 0x2e, 0x56, 0xdf, 0xdf, + 0x96, 0x41, 0x2e, 0x58, 0xdf, 0xc1, 0x2e, 0x59, + 0xdf, 0x9d, 0x01, 0x5d, 0x01, 0xff, 0x96, 0xdf, + 0x96, 0x40, 0x2e, 0x59, 0xdf, 0x5f, 0x9f, 0x50, + 0xdf, 0x7f, 0x9f, 0x1d, 0x00, 0xdd, 0x00, 0x5f, + 0x9f, 0x7f, 0x9f, 0x05, 0x27, 0x01, 0x0d, 0x41, + 0x2e, 0x56, 0xdf, 0x5f, 0x9f, 0x41, 0x2e, 0x57, + 0xdf, 0x5f, 0x9f, 0x41, 0x2e, 0x58, 0xdf, 0x5f, + 0x9f, 0x41, 0x2e, 0x59, 0xdf, 0x5f, 0x9f, 0x06, + 0x0d, 0x3b, 0xcf, 0x5f, 0x9f, 0x05, 0x27 }; static const unsigned char pkt496[] = { -0x42, 0xca, 0x00, -0x85, 0x24, 0x02, 0x2e, 0x23, -0x80, 0x02, 0x2e, 0x4c, 0x80, 0x99, 0x88, 0x37, -0x41, 0xdd, 0x2f, 0xc1, 0x5a, 0x0a, 0x40, 0x11, -0x5a, 0x1f, 0x88, 0x41, 0x88, 0x4d, 0x88, 0x37, -0x42, 0x08, 0x5a, 0x09, 0x46, 0x0a, 0x5b, 0x23, -0x26, 0x08, 0x55, 0x22, 0xcf, 0xc6, 0x1e, 0x09, -0x52, 0x10, 0xcf, 0x27, 0xaf, 0x6e, 0x23, 0x08, -0xef, 0x6f, 0xaf, 0x62, 0x23, 0x6e, 0x26, 0x00, -0x55, 0x6e, 0x24, 0x05, 0x27, 0x67, 0x2e, 0xff, -0xdf, 0xdf, 0x22, 0x00, 0x2e, 0x25, 0x55, 0x67, -0x2e, 0xfe, 0xdf, 0xdf, 0x22, 0x00, 0x2e, 0x20, -0x55, 0x05, 0x27, 0x61, 0x23, 0x67, 0x2e, 0xff, -0xdf, 0xdf, 0x22, 0x00, 0x2e, 0x19, 0x55, 0x67, -0x2e, 0xfe, 0xdf, 0x65, 0xdf, 0xbf, 0x03, 0x00, -0x2e, 0x13, 0x5e, 0x3b, 0x43, 0x01, 0x5a, 0x3b, -0x41, 0x0e, 0x5a, 0x29, 0xdf, 0xff, 0x96, 0x25, -0xdf, 0x5d, 0x00, 0x10, 0x1f, 0x00, 0x2e, 0x08, -0x53, 0x07, 0x1f, 0x05, 0x53, 0x61, 0x24, 0x3b, -0x41, 0x02, 0x5a, 0x03, 0x1f, 0x00, 0x53, 0x61, -0x24, 0x05, 0x27, 0xff, 0xef, 0x61, 0xaf, 0x05, -0x27, 0x3b, 0x43, 0x09, 0x5b, 0x28, 0xdf, 0x6e, -0xbf, 0x70, 0xef, 0xbf, 0x22, 0x1a, 0x27, 0x29, -0xdf, 0x6e, 0xcf, 0xdf, 0x01, 0x6d, 0x80, 0x6f, -0xaf, 0x05, 0x27, 0x62, 0x26, 0x01, 0x54, 0x61, -0x47, 0x1d, 0x5b, 0x10, 0xdf, 0x27, 0xbf, 0x61, -0xcf, 0xdf, 0x22, 0x18, 0x54 + 0x42, 0xca, 0x00, + 0x85, 0x24, 0x02, 0x2e, 0x23, + 0x80, 0x02, 0x2e, 0x4c, 0x80, 0x99, 0x88, 0x37, + 0x41, 0xdd, 0x2f, 0xc1, 0x5a, 0x0a, 0x40, 0x11, + 0x5a, 0x1f, 0x88, 0x41, 0x88, 0x4d, 0x88, 0x37, + 0x42, 0x08, 0x5a, 0x09, 0x46, 0x0a, 0x5b, 0x23, + 0x26, 0x08, 0x55, 0x22, 0xcf, 0xc6, 0x1e, 0x09, + 0x52, 0x10, 0xcf, 0x27, 0xaf, 0x6e, 0x23, 0x08, + 0xef, 0x6f, 0xaf, 0x62, 0x23, 0x6e, 0x26, 0x00, + 0x55, 0x6e, 0x24, 0x05, 0x27, 0x67, 0x2e, 0xff, + 0xdf, 0xdf, 0x22, 0x00, 0x2e, 0x25, 0x55, 0x67, + 0x2e, 0xfe, 0xdf, 0xdf, 0x22, 0x00, 0x2e, 0x20, + 0x55, 0x05, 0x27, 0x61, 0x23, 0x67, 0x2e, 0xff, + 0xdf, 0xdf, 0x22, 0x00, 0x2e, 0x19, 0x55, 0x67, + 0x2e, 0xfe, 0xdf, 0x65, 0xdf, 0xbf, 0x03, 0x00, + 0x2e, 0x13, 0x5e, 0x3b, 0x43, 0x01, 0x5a, 0x3b, + 0x41, 0x0e, 0x5a, 0x29, 0xdf, 0xff, 0x96, 0x25, + 0xdf, 0x5d, 0x00, 0x10, 0x1f, 0x00, 0x2e, 0x08, + 0x53, 0x07, 0x1f, 0x05, 0x53, 0x61, 0x24, 0x3b, + 0x41, 0x02, 0x5a, 0x03, 0x1f, 0x00, 0x53, 0x61, + 0x24, 0x05, 0x27, 0xff, 0xef, 0x61, 0xaf, 0x05, + 0x27, 0x3b, 0x43, 0x09, 0x5b, 0x28, 0xdf, 0x6e, + 0xbf, 0x70, 0xef, 0xbf, 0x22, 0x1a, 0x27, 0x29, + 0xdf, 0x6e, 0xcf, 0xdf, 0x01, 0x6d, 0x80, 0x6f, + 0xaf, 0x05, 0x27, 0x62, 0x26, 0x01, 0x54, 0x61, + 0x47, 0x1d, 0x5b, 0x10, 0xdf, 0x27, 0xbf, 0x61, + 0xcf, 0xdf, 0x22, 0x18, 0x54 }; static const unsigned char pkt500[] = { -0x42, 0xca, 0x00, -0xe9, 0x24, 0x5f, 0x00, 0x00, -0x57, 0xbf, 0x22, 0x5f, 0xcf, 0xdf, 0x03, 0x00, -0x5f, 0x5f, 0xdf, 0x27, 0xbf, 0x61, 0xcf, 0xdf, -0x2d, 0x00, 0x2e, 0x19, 0x5a, 0x26, 0x88, 0xdf, -0x96, 0x6e, 0xdf, 0x09, 0x88, 0x6e, 0xbf, 0xc0, -0x97, 0x62, 0xdf, 0x05, 0x88, 0x62, 0xbf, 0x6f, -0xdf, 0xdd, 0x97, 0x06, 0x88, 0x6f, 0xaf, 0x05, -0x27, 0x8a, 0x80, 0x20, 0x10, 0x00, 0x13, 0x1c, -0x82, 0x05, 0x27, 0xdf, 0x96, 0x9f, 0x22, 0xd9, -0x81, 0x1a, 0x27, 0xdd, 0x9f, 0x6d, 0x80, 0x05, -0x27, 0x0c, 0x88, 0xdf, 0x96, 0x6f, 0xdf, 0xef, -0x8f, 0x6f, 0xbf, 0x6e, 0xdf, 0xc0, 0x97, 0xf0, -0x8f, 0x6e, 0xaf, 0x62, 0xdf, 0xdd, 0x97, 0xec, -0x8f, 0x62, 0xaf, 0x05, 0x27, 0x27, 0xcf, 0x61, -0x47, 0x00, 0x5b, 0x1f, 0x20, 0x09, 0x8c, 0xff, -0x97, 0x05, 0x27, 0x28, 0xdf, 0x06, 0x88, 0x2d, -0xbf, 0x2c, 0xaf, 0x29, 0xdf, 0x02, 0x88, 0x2b, -0xbf, 0x2a, 0xaf, 0x05, 0x27, 0xff, 0x96, 0x72, -0xcf, 0x01, 0x16, 0xdf, 0x96, 0x57, 0xef, 0x25, -0xff, 0x1d, 0x00, 0x00, 0x13, 0x1a, 0x27, 0x07, -0x27, 0xff, 0x96, 0xc1, 0x9f, 0x3f, 0x22, 0x01, -0x11, 0x8a, 0x80, 0xff, 0x96, 0xdf, 0x96, 0xc2, -0x97, 0xc3, 0x9f, 0x3f, 0x22, 0x01, 0x11, 0x8a, -0x80, 0x01, 0x00, 0xdf, 0x9f, 0xc0, 0x97, 0x04, -0x0c, 0xff, 0x96, 0xdf, 0x96, 0x72, 0xcf, 0x07, -0x1e, 0x04, 0x53, 0x03, 0x1e + 0x42, 0xca, 0x00, + 0xe9, 0x24, 0x5f, 0x00, 0x00, + 0x57, 0xbf, 0x22, 0x5f, 0xcf, 0xdf, 0x03, 0x00, + 0x5f, 0x5f, 0xdf, 0x27, 0xbf, 0x61, 0xcf, 0xdf, + 0x2d, 0x00, 0x2e, 0x19, 0x5a, 0x26, 0x88, 0xdf, + 0x96, 0x6e, 0xdf, 0x09, 0x88, 0x6e, 0xbf, 0xc0, + 0x97, 0x62, 0xdf, 0x05, 0x88, 0x62, 0xbf, 0x6f, + 0xdf, 0xdd, 0x97, 0x06, 0x88, 0x6f, 0xaf, 0x05, + 0x27, 0x8a, 0x80, 0x20, 0x10, 0x00, 0x13, 0x1c, + 0x82, 0x05, 0x27, 0xdf, 0x96, 0x9f, 0x22, 0xd9, + 0x81, 0x1a, 0x27, 0xdd, 0x9f, 0x6d, 0x80, 0x05, + 0x27, 0x0c, 0x88, 0xdf, 0x96, 0x6f, 0xdf, 0xef, + 0x8f, 0x6f, 0xbf, 0x6e, 0xdf, 0xc0, 0x97, 0xf0, + 0x8f, 0x6e, 0xaf, 0x62, 0xdf, 0xdd, 0x97, 0xec, + 0x8f, 0x62, 0xaf, 0x05, 0x27, 0x27, 0xcf, 0x61, + 0x47, 0x00, 0x5b, 0x1f, 0x20, 0x09, 0x8c, 0xff, + 0x97, 0x05, 0x27, 0x28, 0xdf, 0x06, 0x88, 0x2d, + 0xbf, 0x2c, 0xaf, 0x29, 0xdf, 0x02, 0x88, 0x2b, + 0xbf, 0x2a, 0xaf, 0x05, 0x27, 0xff, 0x96, 0x72, + 0xcf, 0x01, 0x16, 0xdf, 0x96, 0x57, 0xef, 0x25, + 0xff, 0x1d, 0x00, 0x00, 0x13, 0x1a, 0x27, 0x07, + 0x27, 0xff, 0x96, 0xc1, 0x9f, 0x3f, 0x22, 0x01, + 0x11, 0x8a, 0x80, 0xff, 0x96, 0xdf, 0x96, 0xc2, + 0x97, 0xc3, 0x9f, 0x3f, 0x22, 0x01, 0x11, 0x8a, + 0x80, 0x01, 0x00, 0xdf, 0x9f, 0xc0, 0x97, 0x04, + 0x0c, 0xff, 0x96, 0xdf, 0x96, 0x72, 0xcf, 0x07, + 0x1e, 0x04, 0x53, 0x03, 0x1e }; static const unsigned char pkt504[] = { -0x42, 0x2a, 0x00, -0x4d, 0x25, 0x04, 0x53, 0xdd, -0x97, 0xdd, 0x9f, 0x05, 0x27, 0x00, 0x88, 0xd8, -0x71, 0xdd, 0x97, 0xdd, 0x9f, 0xd8, 0x81, 0x05, -0x27, 0x00, 0x04, 0x00, 0x02, 0x4e, 0x07, 0x8e, -0x03, 0x19, 0x02, 0x0c, 0x01, 0x32, 0x04, 0x1c, -0x02, 0x0e, 0x01, 0x87, 0x00 + 0x42, 0x2a, 0x00, + 0x4d, 0x25, 0x04, 0x53, 0xdd, + 0x97, 0xdd, 0x9f, 0x05, 0x27, 0x00, 0x88, 0xd8, + 0x71, 0xdd, 0x97, 0xdd, 0x9f, 0xd8, 0x81, 0x05, + 0x27, 0x00, 0x04, 0x00, 0x02, 0x4e, 0x07, 0x8e, + 0x03, 0x19, 0x02, 0x0c, 0x01, 0x32, 0x04, 0x1c, + 0x02, 0x0e, 0x01, 0x87, 0x00 }; static const unsigned char pkt508[] = { -0x42, 0x8c, 0x00, -0x61, 0x25, 0x53, 0x80, 0x01, -0x0d, 0xf5, 0x97, 0xff, 0x0d, 0x1f, 0x99, 0x49, -0xcf, 0x5f, 0x99, 0x08, 0x44, 0x00, 0x2e, 0x39, -0x5a, 0x0b, 0x0d, 0x44, 0xcf, 0x0c, 0x41, 0x00, -0x5b, 0x1f, 0x20, 0x44, 0xaf, 0x5f, 0x9f, 0x04, -0x0d, 0x47, 0xcf, 0x5f, 0x9f, 0x48, 0xcf, 0x5f, -0x9f, 0x1c, 0xcf, 0x5f, 0x9f, 0x1d, 0xcf, 0x5f, -0x9f, 0x1e, 0xcf, 0x5f, 0x9f, 0x49, 0xcf, 0x5f, -0x9f, 0x06, 0x0d, 0xe0, 0x97, 0x0f, 0x1c, 0x5f, -0x9f, 0x0a, 0xcf, 0x5f, 0x9f, 0x09, 0xcf, 0x5f, -0x9f, 0x2a, 0xcf, 0x5f, 0x9f, 0x2b, 0xcf, 0x5f, -0x9f, 0x2c, 0xcf, 0x5f, 0x9f, 0x2d, 0xcf, 0x5f, -0x9f, 0x02, 0x0d, 0x16, 0xcf, 0x5f, 0x9f, 0x44, -0xdf, 0x02, 0x2e, 0x5f, 0x81, 0x5f, 0x9f, 0x4d, -0xcf, 0x5f, 0x9f, 0x09, 0x46, 0x04, 0x5b, 0x90, -0xcf, 0x5f, 0x9f, 0x91, 0xcf, 0x5f, 0x9f, 0x05, -0x50, 0x01, 0x0d, 0x6a, 0xcf, 0x09, 0x27, 0x69, -0xdf, 0x3f, 0x02, 0x5f, 0x9f, 0x05, 0x27 + 0x42, 0x8c, 0x00, + 0x61, 0x25, 0x53, 0x80, 0x01, + 0x0d, 0xf5, 0x97, 0xff, 0x0d, 0x1f, 0x99, 0x49, + 0xcf, 0x5f, 0x99, 0x08, 0x44, 0x00, 0x2e, 0x39, + 0x5a, 0x0b, 0x0d, 0x44, 0xcf, 0x0c, 0x41, 0x00, + 0x5b, 0x1f, 0x20, 0x44, 0xaf, 0x5f, 0x9f, 0x04, + 0x0d, 0x47, 0xcf, 0x5f, 0x9f, 0x48, 0xcf, 0x5f, + 0x9f, 0x1c, 0xcf, 0x5f, 0x9f, 0x1d, 0xcf, 0x5f, + 0x9f, 0x1e, 0xcf, 0x5f, 0x9f, 0x49, 0xcf, 0x5f, + 0x9f, 0x06, 0x0d, 0xe0, 0x97, 0x0f, 0x1c, 0x5f, + 0x9f, 0x0a, 0xcf, 0x5f, 0x9f, 0x09, 0xcf, 0x5f, + 0x9f, 0x2a, 0xcf, 0x5f, 0x9f, 0x2b, 0xcf, 0x5f, + 0x9f, 0x2c, 0xcf, 0x5f, 0x9f, 0x2d, 0xcf, 0x5f, + 0x9f, 0x02, 0x0d, 0x16, 0xcf, 0x5f, 0x9f, 0x44, + 0xdf, 0x02, 0x2e, 0x5f, 0x81, 0x5f, 0x9f, 0x4d, + 0xcf, 0x5f, 0x9f, 0x09, 0x46, 0x04, 0x5b, 0x90, + 0xcf, 0x5f, 0x9f, 0x91, 0xcf, 0x5f, 0x9f, 0x05, + 0x50, 0x01, 0x0d, 0x6a, 0xcf, 0x09, 0x27, 0x69, + 0xdf, 0x3f, 0x02, 0x5f, 0x9f, 0x05, 0x27 }; static const unsigned char pkt512[] = { -0x42, 0xca, 0x00, -0xa6, 0x25, 0x5c, 0x46, 0x00, -0x5b, 0xfb, 0x31, 0x2d, 0x8a, 0xa9, 0x89, 0xbe, -0x89, 0x06, 0x8a, 0x18, 0x89, 0x18, 0x89, 0x40, -0xcf, 0x41, 0xdf, 0x45, 0xaf, 0x46, 0xbf, 0x07, -0x38, 0x01, 0x5b, 0x01, 0x2e, 0xb7, 0x80, 0x3b, -0x40, 0x00, 0x2e, 0x42, 0x5b, 0x5c, 0x47, 0x00, -0x5a, 0xad, 0x89, 0x09, 0x46, 0x00, 0x5b, 0x75, -0x8d, 0xc9, 0x30, 0x41, 0x2e, 0x7a, 0xdf, 0x1f, -0x28, 0x41, 0x2e, 0x7a, 0xbf, 0xfb, 0x39, 0xfa, -0x33, 0xc8, 0x46, 0x10, 0x5b, 0xd0, 0x46, 0xfd, -0x5b, 0xd3, 0x45, 0xfd, 0x5a, 0xd3, 0x45, 0xfb, -0x5a, 0xd3, 0x45, 0xf9, 0x5a, 0xd3, 0x3c, 0x41, -0x2e, 0xa1, 0xdf, 0x9f, 0x28, 0x41, 0x2e, 0xa1, -0xbf, 0x02, 0x2e, 0xb0, 0x81, 0x0c, 0x78, 0x64, -0x81, 0xd3, 0x45, 0xe9, 0x5a, 0xd3, 0x3c, 0xc8, -0xcf, 0xdf, 0x22, 0x02, 0x55, 0xc7, 0xcf, 0xdf, -0x22, 0x02, 0x54, 0xd3, 0x33, 0xd3, 0x31, 0x64, -0x81, 0xf7, 0xef, 0x16, 0x80, 0xf8, 0xcf, 0x9f, -0x1c, 0xf8, 0xaf, 0xfb, 0x39, 0xfa, 0x33, 0x5c, -0x47, 0x03, 0x5a, 0x08, 0x43, 0xdc, 0x2f, 0xec, -0x5a, 0x02, 0x50, 0x3d, 0x23, 0xdc, 0x2f, 0xe8, -0x50, 0x02, 0xcf, 0x0f, 0x1c, 0x10, 0x18, 0x02, -0xaf, 0xe1, 0x72, 0x5c, 0x46, 0x01, 0x5a, 0x01, -0x2e, 0xcd, 0x80, 0xd0, 0x41, 0x00, 0x5b, 0xc1, -0x83, 0x52, 0x26, 0xe6, 0x2f, 0xbd, 0x55, 0x53, -0x26, 0xe6, 0x2f, 0xba, 0x55 + 0x42, 0xca, 0x00, + 0xa6, 0x25, 0x5c, 0x46, 0x00, + 0x5b, 0xfb, 0x31, 0x2d, 0x8a, 0xa9, 0x89, 0xbe, + 0x89, 0x06, 0x8a, 0x18, 0x89, 0x18, 0x89, 0x40, + 0xcf, 0x41, 0xdf, 0x45, 0xaf, 0x46, 0xbf, 0x07, + 0x38, 0x01, 0x5b, 0x01, 0x2e, 0xb7, 0x80, 0x3b, + 0x40, 0x00, 0x2e, 0x42, 0x5b, 0x5c, 0x47, 0x00, + 0x5a, 0xad, 0x89, 0x09, 0x46, 0x00, 0x5b, 0x75, + 0x8d, 0xc9, 0x30, 0x41, 0x2e, 0x7a, 0xdf, 0x1f, + 0x28, 0x41, 0x2e, 0x7a, 0xbf, 0xfb, 0x39, 0xfa, + 0x33, 0xc8, 0x46, 0x10, 0x5b, 0xd0, 0x46, 0xfd, + 0x5b, 0xd3, 0x45, 0xfd, 0x5a, 0xd3, 0x45, 0xfb, + 0x5a, 0xd3, 0x45, 0xf9, 0x5a, 0xd3, 0x3c, 0x41, + 0x2e, 0xa1, 0xdf, 0x9f, 0x28, 0x41, 0x2e, 0xa1, + 0xbf, 0x02, 0x2e, 0xb0, 0x81, 0x0c, 0x78, 0x64, + 0x81, 0xd3, 0x45, 0xe9, 0x5a, 0xd3, 0x3c, 0xc8, + 0xcf, 0xdf, 0x22, 0x02, 0x55, 0xc7, 0xcf, 0xdf, + 0x22, 0x02, 0x54, 0xd3, 0x33, 0xd3, 0x31, 0x64, + 0x81, 0xf7, 0xef, 0x16, 0x80, 0xf8, 0xcf, 0x9f, + 0x1c, 0xf8, 0xaf, 0xfb, 0x39, 0xfa, 0x33, 0x5c, + 0x47, 0x03, 0x5a, 0x08, 0x43, 0xdc, 0x2f, 0xec, + 0x5a, 0x02, 0x50, 0x3d, 0x23, 0xdc, 0x2f, 0xe8, + 0x50, 0x02, 0xcf, 0x0f, 0x1c, 0x10, 0x18, 0x02, + 0xaf, 0xe1, 0x72, 0x5c, 0x46, 0x01, 0x5a, 0x01, + 0x2e, 0xcd, 0x80, 0xd0, 0x41, 0x00, 0x5b, 0xc1, + 0x83, 0x52, 0x26, 0xe6, 0x2f, 0xbd, 0x55, 0x53, + 0x26, 0xe6, 0x2f, 0xba, 0x55 }; static const unsigned char pkt516[] = { -0x42, 0xca, 0x00, -0x0a, 0x26, 0x07, 0x3a, 0x00, -0x2e, 0x38, 0x7c, 0x02, 0x2e, 0x49, 0x81, 0x45, -0xcf, 0x46, 0xdf, 0x19, 0x27, 0xef, 0x88, 0x02, -0x89, 0x05, 0x27, 0x12, 0x82, 0x05, 0x27, 0x41, -0x8a, 0x10, 0x5b, 0x49, 0xef, 0xff, 0xaf, 0x05, -0xef, 0xff, 0xaf, 0x9f, 0x22, 0xff, 0xaf, 0x10, -0xef, 0xff, 0xaf, 0x22, 0xcf, 0xff, 0xaf, 0x23, -0xcf, 0xff, 0xaf, 0x9f, 0x22, 0xff, 0xaf, 0xff, -0xaf, 0x02, 0x2e, 0xa1, 0x81, 0x0c, 0x40, 0x29, -0x5b, 0x4a, 0x80, 0x0d, 0x34, 0x10, 0x5a, 0x49, -0xcf, 0x5f, 0x9d, 0x49, 0x38, 0x53, 0x80, 0x49, -0xcf, 0x5f, 0x9d, 0x4a, 0x80, 0x9f, 0x22, 0x1f, -0x9c, 0x5f, 0x9c, 0x1e, 0xcf, 0x1f, 0x9d, 0x48, -0xcf, 0x1d, 0xdf, 0xdf, 0x01, 0x9f, 0x22, 0x11, -0x50, 0xbb, 0x88, 0xf5, 0x97, 0x49, 0xaf, 0xd4, -0x89, 0x49, 0xcf, 0xf7, 0x1c, 0x5f, 0x9d, 0x44, -0xdf, 0x3f, 0x20, 0x44, 0xbf, 0xff, 0x9a, 0x02, -0x2e, 0x5f, 0x81, 0x20, 0x0d, 0x9f, 0x99, 0xe0, -0x0d, 0x1c, 0xcf, 0x1d, 0xdf, 0x9f, 0x9c, 0xff, -0x9c, 0x00, 0x2e, 0xe9, 0x8f, 0x0c, 0x41, 0x01, -0x5b, 0x00, 0x2e, 0xeb, 0x8f, 0x0c, 0x42, 0x04, -0x5b, 0xe4, 0x40, 0x01, 0x5a, 0xe4, 0x3a, 0x00, -0x50, 0xe4, 0x32, 0x0c, 0x43, 0x04, 0x5b, 0xe4, -0x42, 0x01, 0x5a, 0xe4, 0x30, 0x00, 0x50, 0xe4, -0x38, 0x0c, 0x44, 0x10, 0x5b, 0x18, 0x23, 0x1a, -0x23, 0x1b, 0x23, 0xe4, 0x42 + 0x42, 0xca, 0x00, + 0x0a, 0x26, 0x07, 0x3a, 0x00, + 0x2e, 0x38, 0x7c, 0x02, 0x2e, 0x49, 0x81, 0x45, + 0xcf, 0x46, 0xdf, 0x19, 0x27, 0xef, 0x88, 0x02, + 0x89, 0x05, 0x27, 0x12, 0x82, 0x05, 0x27, 0x41, + 0x8a, 0x10, 0x5b, 0x49, 0xef, 0xff, 0xaf, 0x05, + 0xef, 0xff, 0xaf, 0x9f, 0x22, 0xff, 0xaf, 0x10, + 0xef, 0xff, 0xaf, 0x22, 0xcf, 0xff, 0xaf, 0x23, + 0xcf, 0xff, 0xaf, 0x9f, 0x22, 0xff, 0xaf, 0xff, + 0xaf, 0x02, 0x2e, 0xa1, 0x81, 0x0c, 0x40, 0x29, + 0x5b, 0x4a, 0x80, 0x0d, 0x34, 0x10, 0x5a, 0x49, + 0xcf, 0x5f, 0x9d, 0x49, 0x38, 0x53, 0x80, 0x49, + 0xcf, 0x5f, 0x9d, 0x4a, 0x80, 0x9f, 0x22, 0x1f, + 0x9c, 0x5f, 0x9c, 0x1e, 0xcf, 0x1f, 0x9d, 0x48, + 0xcf, 0x1d, 0xdf, 0xdf, 0x01, 0x9f, 0x22, 0x11, + 0x50, 0xbb, 0x88, 0xf5, 0x97, 0x49, 0xaf, 0xd4, + 0x89, 0x49, 0xcf, 0xf7, 0x1c, 0x5f, 0x9d, 0x44, + 0xdf, 0x3f, 0x20, 0x44, 0xbf, 0xff, 0x9a, 0x02, + 0x2e, 0x5f, 0x81, 0x20, 0x0d, 0x9f, 0x99, 0xe0, + 0x0d, 0x1c, 0xcf, 0x1d, 0xdf, 0x9f, 0x9c, 0xff, + 0x9c, 0x00, 0x2e, 0xe9, 0x8f, 0x0c, 0x41, 0x01, + 0x5b, 0x00, 0x2e, 0xeb, 0x8f, 0x0c, 0x42, 0x04, + 0x5b, 0xe4, 0x40, 0x01, 0x5a, 0xe4, 0x3a, 0x00, + 0x50, 0xe4, 0x32, 0x0c, 0x43, 0x04, 0x5b, 0xe4, + 0x42, 0x01, 0x5a, 0xe4, 0x30, 0x00, 0x50, 0xe4, + 0x38, 0x0c, 0x44, 0x10, 0x5b, 0x18, 0x23, 0x1a, + 0x23, 0x1b, 0x23, 0xe4, 0x42 }; static const unsigned char pkt520[] = { -0x42, 0xca, 0x00, -0x6e, 0x26, 0x01, 0x5a, 0xe4, -0x38, 0x00, 0x50, 0xe4, 0x30, 0x4a, 0x80, 0x2b, -0x0d, 0x02, 0x2e, 0x9d, 0x81, 0xe4, 0x42, 0x01, -0x5a, 0xe4, 0x30, 0x00, 0x50, 0xe4, 0x38, 0x0c, -0x45, 0x00, 0x5b, 0x0f, 0x88, 0x0c, 0x46, 0x01, -0x5a, 0x01, 0x2e, 0xb7, 0x80, 0x0c, 0x43, 0x05, -0x5b, 0x0c, 0x45, 0x03, 0x5b, 0x0d, 0x45, 0x01, -0x5b, 0x0d, 0x37, 0x05, 0x27, 0x0c, 0x40, 0x00, -0x5b, 0x0d, 0x3f, 0x05, 0x27, 0x60, 0xcf, 0x0f, -0x1c, 0xdf, 0x9f, 0x0c, 0x1c, 0x12, 0x82, 0x03, -0x1d, 0x19, 0x82, 0x5f, 0x02, 0x60, 0xcf, 0xf0, -0x1c, 0x3f, 0x02, 0x60, 0xaf, 0x05, 0x27, 0x28, -0xff, 0x64, 0xef, 0x19, 0x27, 0x01, 0xff, 0x5a, -0xef, 0x1b, 0x27, 0x06, 0xef, 0x06, 0xaf, 0xfc, -0x97, 0x5f, 0x9f, 0x06, 0x25, 0xfb, 0x55, 0x05, -0x27, 0x10, 0xcf, 0x72, 0xaf, 0x0a, 0x40, 0x13, -0x5a, 0x27, 0xcf, 0x10, 0xaf, 0x07, 0x43, 0x08, -0x5b, 0x3b, 0x31, 0x02, 0x5b, 0x3b, 0x36, 0x3b, -0x43, 0x03, 0x5b, 0x6e, 0xcf, 0xe2, 0xaf, 0x6f, -0xcf, 0xe3, 0xaf, 0x02, 0x2e, 0xd5, 0x80, 0x07, -0x40, 0x02, 0x5a, 0x61, 0x26, 0x00, 0x55, 0x07, -0x33, 0x88, 0x82, 0x02, 0x43, 0xdb, 0x2f, 0xc7, -0x5b, 0x02, 0x2e, 0x72, 0x80, 0x05, 0x27, 0x05, -0x27, 0x05, 0x27, 0x0c, 0xcf, 0x03, 0x1c, 0x0b, -0x55, 0x0c, 0xcf, 0x0c, 0x1c, 0x0c, 0x1e, 0x07, -0x54, 0x08, 0x1e, 0x03, 0x55 + 0x42, 0xca, 0x00, + 0x6e, 0x26, 0x01, 0x5a, 0xe4, + 0x38, 0x00, 0x50, 0xe4, 0x30, 0x4a, 0x80, 0x2b, + 0x0d, 0x02, 0x2e, 0x9d, 0x81, 0xe4, 0x42, 0x01, + 0x5a, 0xe4, 0x30, 0x00, 0x50, 0xe4, 0x38, 0x0c, + 0x45, 0x00, 0x5b, 0x0f, 0x88, 0x0c, 0x46, 0x01, + 0x5a, 0x01, 0x2e, 0xb7, 0x80, 0x0c, 0x43, 0x05, + 0x5b, 0x0c, 0x45, 0x03, 0x5b, 0x0d, 0x45, 0x01, + 0x5b, 0x0d, 0x37, 0x05, 0x27, 0x0c, 0x40, 0x00, + 0x5b, 0x0d, 0x3f, 0x05, 0x27, 0x60, 0xcf, 0x0f, + 0x1c, 0xdf, 0x9f, 0x0c, 0x1c, 0x12, 0x82, 0x03, + 0x1d, 0x19, 0x82, 0x5f, 0x02, 0x60, 0xcf, 0xf0, + 0x1c, 0x3f, 0x02, 0x60, 0xaf, 0x05, 0x27, 0x28, + 0xff, 0x64, 0xef, 0x19, 0x27, 0x01, 0xff, 0x5a, + 0xef, 0x1b, 0x27, 0x06, 0xef, 0x06, 0xaf, 0xfc, + 0x97, 0x5f, 0x9f, 0x06, 0x25, 0xfb, 0x55, 0x05, + 0x27, 0x10, 0xcf, 0x72, 0xaf, 0x0a, 0x40, 0x13, + 0x5a, 0x27, 0xcf, 0x10, 0xaf, 0x07, 0x43, 0x08, + 0x5b, 0x3b, 0x31, 0x02, 0x5b, 0x3b, 0x36, 0x3b, + 0x43, 0x03, 0x5b, 0x6e, 0xcf, 0xe2, 0xaf, 0x6f, + 0xcf, 0xe3, 0xaf, 0x02, 0x2e, 0xd5, 0x80, 0x07, + 0x40, 0x02, 0x5a, 0x61, 0x26, 0x00, 0x55, 0x07, + 0x33, 0x88, 0x82, 0x02, 0x43, 0xdb, 0x2f, 0xc7, + 0x5b, 0x02, 0x2e, 0x72, 0x80, 0x05, 0x27, 0x05, + 0x27, 0x05, 0x27, 0x0c, 0xcf, 0x03, 0x1c, 0x0b, + 0x55, 0x0c, 0xcf, 0x0c, 0x1c, 0x0c, 0x1e, 0x07, + 0x54, 0x08, 0x1e, 0x03, 0x55 }; static const unsigned char pkt524[] = { -0x42, 0xca, 0x00, -0xd2, 0x26, 0x0c, 0x45, 0x01, -0x5b, 0x0d, 0x44, 0x01, 0x5b, 0x0e, 0x33, 0x05, -0x27, 0x0e, 0x3b, 0x05, 0x27, 0x0d, 0xcf, 0x06, -0x1c, 0x09, 0x55, 0x09, 0x46, 0x04, 0x5b, 0x15, -0x88, 0x02, 0x5a, 0xf2, 0xcf, 0x0b, 0xaf, 0x10, -0x50, 0x02, 0xef, 0x0c, 0xaf, 0x0d, 0x50, 0x0a, -0x41, 0x0b, 0x5b, 0x0c, 0x39, 0x0c, 0x46, 0x03, -0x5b, 0x4a, 0x80, 0x0e, 0x88, 0x29, 0x89, 0x00, -0x50, 0x0c, 0x31, 0x0c, 0x38, 0x01, 0x5b, 0x0d, -0x3f, 0x0d, 0x34, 0x05, 0x27, 0x23, 0x26, 0x02, -0x55, 0x22, 0xcf, 0xc8, 0x1e, 0x00, 0x5f, 0x0c, -0x27, 0x0d, 0x27, 0xf0, 0x97, 0x47, 0xaf, 0xf1, -0x97, 0x48, 0xaf, 0x05, 0x27, 0x46, 0x80, 0x08, -0x46, 0x0f, 0x5a, 0xde, 0xef, 0x5f, 0x9f, 0x10, -0xef, 0x5f, 0x9f, 0x00, 0xef, 0x5f, 0x9f, 0x28, -0xff, 0x54, 0xef, 0x1b, 0x27, 0x10, 0xef, 0x06, -0xaf, 0xfc, 0x97, 0x5f, 0x9f, 0x06, 0x25, 0xfb, -0x55, 0x62, 0x80, 0x05, 0x27, 0x46, 0x80, 0x08, -0x47, 0xfb, 0x5a, 0xdf, 0xef, 0x5f, 0x9f, 0x06, -0xef, 0x5f, 0x9f, 0x00, 0xef, 0x5f, 0x9f, 0x28, -0xff, 0x64, 0xef, 0x1b, 0x27, 0x06, 0xef, 0x06, -0xaf, 0xea, 0x50, 0x28, 0xff, 0x64, 0xef, 0x19, -0x27, 0x0f, 0xef, 0x6b, 0xdf, 0xff, 0x96, 0xbf, -0x22, 0xff, 0x96, 0x7b, 0x00, 0xc1, 0x03, 0x6b, -0xbf, 0x0c, 0x53, 0xdf, 0x96, 0xc2, 0x97, 0xbf, -0x01, 0x5f, 0x90, 0xdd, 0x97 + 0x42, 0xca, 0x00, + 0xd2, 0x26, 0x0c, 0x45, 0x01, + 0x5b, 0x0d, 0x44, 0x01, 0x5b, 0x0e, 0x33, 0x05, + 0x27, 0x0e, 0x3b, 0x05, 0x27, 0x0d, 0xcf, 0x06, + 0x1c, 0x09, 0x55, 0x09, 0x46, 0x04, 0x5b, 0x15, + 0x88, 0x02, 0x5a, 0xf2, 0xcf, 0x0b, 0xaf, 0x10, + 0x50, 0x02, 0xef, 0x0c, 0xaf, 0x0d, 0x50, 0x0a, + 0x41, 0x0b, 0x5b, 0x0c, 0x39, 0x0c, 0x46, 0x03, + 0x5b, 0x4a, 0x80, 0x0e, 0x88, 0x29, 0x89, 0x00, + 0x50, 0x0c, 0x31, 0x0c, 0x38, 0x01, 0x5b, 0x0d, + 0x3f, 0x0d, 0x34, 0x05, 0x27, 0x23, 0x26, 0x02, + 0x55, 0x22, 0xcf, 0xc8, 0x1e, 0x00, 0x5f, 0x0c, + 0x27, 0x0d, 0x27, 0xf0, 0x97, 0x47, 0xaf, 0xf1, + 0x97, 0x48, 0xaf, 0x05, 0x27, 0x46, 0x80, 0x08, + 0x46, 0x0f, 0x5a, 0xde, 0xef, 0x5f, 0x9f, 0x10, + 0xef, 0x5f, 0x9f, 0x00, 0xef, 0x5f, 0x9f, 0x28, + 0xff, 0x54, 0xef, 0x1b, 0x27, 0x10, 0xef, 0x06, + 0xaf, 0xfc, 0x97, 0x5f, 0x9f, 0x06, 0x25, 0xfb, + 0x55, 0x62, 0x80, 0x05, 0x27, 0x46, 0x80, 0x08, + 0x47, 0xfb, 0x5a, 0xdf, 0xef, 0x5f, 0x9f, 0x06, + 0xef, 0x5f, 0x9f, 0x00, 0xef, 0x5f, 0x9f, 0x28, + 0xff, 0x64, 0xef, 0x1b, 0x27, 0x06, 0xef, 0x06, + 0xaf, 0xea, 0x50, 0x28, 0xff, 0x64, 0xef, 0x19, + 0x27, 0x0f, 0xef, 0x6b, 0xdf, 0xff, 0x96, 0xbf, + 0x22, 0xff, 0x96, 0x7b, 0x00, 0xc1, 0x03, 0x6b, + 0xbf, 0x0c, 0x53, 0xdf, 0x96, 0xc2, 0x97, 0xbf, + 0x01, 0x5f, 0x90, 0xdd, 0x97 }; static const unsigned char pkt528[] = { -0x42, 0xca, 0x00, -0x36, 0x27, 0x5f, 0x20, 0x02, -0x1e, 0xf3, 0x53, 0x02, 0xef, 0x01, 0x0c, 0xdd, -0x9f, 0x6b, 0xbf, 0x15, 0x50, 0xdf, 0x96, 0xc2, -0x97, 0xdf, 0x01, 0xc1, 0x03, 0x05, 0x52, 0xdd, -0x97, 0x1f, 0x20, 0x6b, 0xdf, 0xe0, 0x01, 0x6b, -0xbf, 0x00, 0x50, 0xdd, 0x97, 0x02, 0x0c, 0x6b, -0xdf, 0x28, 0x1f, 0x01, 0x53, 0x28, 0xff, 0x6b, -0xbf, 0x68, 0x1f, 0x01, 0x5f, 0x68, 0xff, 0x6b, -0xbf, 0x05, 0x27, 0x01, 0x81, 0x50, 0x8f, 0xf1, -0x88, 0x05, 0x81, 0x00, 0x2e, 0x32, 0x8d, 0x01, -0x2e, 0x06, 0x80, 0x00, 0x2e, 0xd8, 0x8e, 0x5c, -0x47, 0x02, 0x5b, 0x00, 0x2e, 0x16, 0x8f, 0x01, -0x50, 0x00, 0x2e, 0x14, 0x8f, 0x08, 0xef, 0x0f, -0x80, 0x01, 0x2e, 0x54, 0x80, 0x05, 0x27, 0x07, -0x40, 0x01, 0x5b, 0x54, 0x23, 0x18, 0x50, 0x9c, -0x8e, 0x0d, 0xcf, 0x06, 0x1c, 0x08, 0x54, 0x14, -0x88, 0x02, 0x2e, 0x9d, 0x81, 0x01, 0x2e, 0x50, -0x82, 0x4f, 0x8f, 0x68, 0x88, 0x01, 0x2e, 0x44, -0x84, 0x5c, 0x8f, 0x54, 0x88, 0x09, 0x46, 0x02, -0x5b, 0x37, 0x82, 0x90, 0xaf, 0x91, 0xbf, 0x00, -0x2e, 0xe6, 0x8f, 0x90, 0x8e, 0x0c, 0x3e, 0xed, -0x5a, 0x05, 0x27, 0x37, 0x82, 0x4a, 0x82, 0x1c, -0x82, 0x1c, 0x82, 0x9d, 0xbf, 0xff, 0x97, 0x08, -0x10, 0x09, 0x27, 0x0f, 0x1c, 0x5c, 0x46, 0x03, -0x5b, 0x02, 0x1e, 0x04, 0x53, 0x02, 0xef, 0x02, -0x50, 0x03, 0x1e, 0x00, 0x53 + 0x42, 0xca, 0x00, + 0x36, 0x27, 0x5f, 0x20, 0x02, + 0x1e, 0xf3, 0x53, 0x02, 0xef, 0x01, 0x0c, 0xdd, + 0x9f, 0x6b, 0xbf, 0x15, 0x50, 0xdf, 0x96, 0xc2, + 0x97, 0xdf, 0x01, 0xc1, 0x03, 0x05, 0x52, 0xdd, + 0x97, 0x1f, 0x20, 0x6b, 0xdf, 0xe0, 0x01, 0x6b, + 0xbf, 0x00, 0x50, 0xdd, 0x97, 0x02, 0x0c, 0x6b, + 0xdf, 0x28, 0x1f, 0x01, 0x53, 0x28, 0xff, 0x6b, + 0xbf, 0x68, 0x1f, 0x01, 0x5f, 0x68, 0xff, 0x6b, + 0xbf, 0x05, 0x27, 0x01, 0x81, 0x50, 0x8f, 0xf1, + 0x88, 0x05, 0x81, 0x00, 0x2e, 0x32, 0x8d, 0x01, + 0x2e, 0x06, 0x80, 0x00, 0x2e, 0xd8, 0x8e, 0x5c, + 0x47, 0x02, 0x5b, 0x00, 0x2e, 0x16, 0x8f, 0x01, + 0x50, 0x00, 0x2e, 0x14, 0x8f, 0x08, 0xef, 0x0f, + 0x80, 0x01, 0x2e, 0x54, 0x80, 0x05, 0x27, 0x07, + 0x40, 0x01, 0x5b, 0x54, 0x23, 0x18, 0x50, 0x9c, + 0x8e, 0x0d, 0xcf, 0x06, 0x1c, 0x08, 0x54, 0x14, + 0x88, 0x02, 0x2e, 0x9d, 0x81, 0x01, 0x2e, 0x50, + 0x82, 0x4f, 0x8f, 0x68, 0x88, 0x01, 0x2e, 0x44, + 0x84, 0x5c, 0x8f, 0x54, 0x88, 0x09, 0x46, 0x02, + 0x5b, 0x37, 0x82, 0x90, 0xaf, 0x91, 0xbf, 0x00, + 0x2e, 0xe6, 0x8f, 0x90, 0x8e, 0x0c, 0x3e, 0xed, + 0x5a, 0x05, 0x27, 0x37, 0x82, 0x4a, 0x82, 0x1c, + 0x82, 0x1c, 0x82, 0x9d, 0xbf, 0xff, 0x97, 0x08, + 0x10, 0x09, 0x27, 0x0f, 0x1c, 0x5c, 0x46, 0x03, + 0x5b, 0x02, 0x1e, 0x04, 0x53, 0x02, 0xef, 0x02, + 0x50, 0x03, 0x1e, 0x00, 0x53 }; static const unsigned char pkt532[] = { -0x42, 0xca, 0x00, -0x9a, 0x27, 0x03, 0xef, 0x69, -0xaf, 0x53, 0x80, 0x1b, 0x0d, 0xe1, 0x97, 0x0f, -0x1c, 0x69, 0xdf, 0xdf, 0x01, 0x00, 0x53, 0x00, -0xff, 0xe0, 0x97, 0x8a, 0x80, 0x04, 0x10, 0x11, -0x82, 0x0f, 0x1e, 0x00, 0x5f, 0x0f, 0xef, 0x6a, -0xaf, 0xc1, 0x2e, 0x47, 0xdf, 0xf0, 0x1d, 0x5f, -0x02, 0xc1, 0x2e, 0x47, 0xbf, 0x10, 0x0d, 0x05, -0x27, 0x01, 0x2e, 0x56, 0x80, 0xf7, 0xef, 0x16, -0x80, 0x66, 0x80, 0x20, 0x82, 0xdf, 0x8e, 0x02, -0x2e, 0x3e, 0x81, 0x02, 0x2e, 0x93, 0x81, 0x00, -0x2e, 0xb4, 0x8e, 0x5c, 0x47, 0x09, 0x5b, 0x6c, -0x38, 0x3b, 0x43, 0x00, 0x5b, 0x6c, 0x30, 0x41, -0x2e, 0x71, 0xdf, 0xc1, 0x2e, 0x72, 0xdf, 0xbf, -0x03, 0x01, 0x55, 0x00, 0x2e, 0xc7, 0x8e, 0x67, -0x8c, 0x01, 0x2e, 0xcd, 0x80, 0x05, 0x27, 0x3b, -0x40, 0x01, 0x5b, 0x02, 0xef, 0x0c, 0xaf, 0x05, -0x27, 0x52, 0xcf, 0xcb, 0xaf, 0x53, 0xdf, 0xcc, -0xbf, 0xdf, 0x22, 0x01, 0x55, 0xff, 0x22, 0x01, -0x54, 0x0e, 0xef, 0xc9, 0xaf, 0x05, 0x27, 0x0e, -0xcf, 0x6e, 0x1c, 0x49, 0xdf, 0x10, 0x1d, 0x3f, -0x02, 0x49, 0xaf, 0x0d, 0x44, 0x06, 0x5a, 0x0a, -0x41, 0x03, 0x5b, 0x49, 0x43, 0x02, 0x5a, 0x48, -0x26, 0x00, 0x55, 0x49, 0x30, 0x9f, 0x2c, 0x05, -0x5a, 0xdf, 0x2c, 0x4c, 0x5a, 0x0e, 0x41, 0x15, -0x5b, 0x0c, 0x46, 0x13, 0x5a, 0x9f, 0x22, 0x1c, -0xaf, 0x21, 0xaf, 0x45, 0x88 + 0x42, 0xca, 0x00, + 0x9a, 0x27, 0x03, 0xef, 0x69, + 0xaf, 0x53, 0x80, 0x1b, 0x0d, 0xe1, 0x97, 0x0f, + 0x1c, 0x69, 0xdf, 0xdf, 0x01, 0x00, 0x53, 0x00, + 0xff, 0xe0, 0x97, 0x8a, 0x80, 0x04, 0x10, 0x11, + 0x82, 0x0f, 0x1e, 0x00, 0x5f, 0x0f, 0xef, 0x6a, + 0xaf, 0xc1, 0x2e, 0x47, 0xdf, 0xf0, 0x1d, 0x5f, + 0x02, 0xc1, 0x2e, 0x47, 0xbf, 0x10, 0x0d, 0x05, + 0x27, 0x01, 0x2e, 0x56, 0x80, 0xf7, 0xef, 0x16, + 0x80, 0x66, 0x80, 0x20, 0x82, 0xdf, 0x8e, 0x02, + 0x2e, 0x3e, 0x81, 0x02, 0x2e, 0x93, 0x81, 0x00, + 0x2e, 0xb4, 0x8e, 0x5c, 0x47, 0x09, 0x5b, 0x6c, + 0x38, 0x3b, 0x43, 0x00, 0x5b, 0x6c, 0x30, 0x41, + 0x2e, 0x71, 0xdf, 0xc1, 0x2e, 0x72, 0xdf, 0xbf, + 0x03, 0x01, 0x55, 0x00, 0x2e, 0xc7, 0x8e, 0x67, + 0x8c, 0x01, 0x2e, 0xcd, 0x80, 0x05, 0x27, 0x3b, + 0x40, 0x01, 0x5b, 0x02, 0xef, 0x0c, 0xaf, 0x05, + 0x27, 0x52, 0xcf, 0xcb, 0xaf, 0x53, 0xdf, 0xcc, + 0xbf, 0xdf, 0x22, 0x01, 0x55, 0xff, 0x22, 0x01, + 0x54, 0x0e, 0xef, 0xc9, 0xaf, 0x05, 0x27, 0x0e, + 0xcf, 0x6e, 0x1c, 0x49, 0xdf, 0x10, 0x1d, 0x3f, + 0x02, 0x49, 0xaf, 0x0d, 0x44, 0x06, 0x5a, 0x0a, + 0x41, 0x03, 0x5b, 0x49, 0x43, 0x02, 0x5a, 0x48, + 0x26, 0x00, 0x55, 0x49, 0x30, 0x9f, 0x2c, 0x05, + 0x5a, 0xdf, 0x2c, 0x4c, 0x5a, 0x0e, 0x41, 0x15, + 0x5b, 0x0c, 0x46, 0x13, 0x5a, 0x9f, 0x22, 0x1c, + 0xaf, 0x21, 0xaf, 0x45, 0x88 }; static const unsigned char pkt536[] = { -0x42, 0xca, 0x00, -0xfe, 0x27, 0x03, 0x5a, 0x9f, -0x2c, 0x05, 0x5a, 0x9f, 0x22, 0x04, 0x50, 0x9f, -0x22, 0x0e, 0x3e, 0x0e, 0x3d, 0x00, 0x5b, 0x5f, -0xef, 0x1d, 0xaf, 0x49, 0xcf, 0x87, 0x1c, 0x01, -0x18, 0x49, 0xaf, 0x34, 0x50, 0x20, 0x26, 0x08, -0x55, 0x1f, 0xcf, 0x48, 0xdf, 0xff, 0x2d, 0x00, -0x5b, 0xff, 0x21, 0x3f, 0x00, 0x00, 0x53, 0xff, -0xef, 0x1f, 0xaf, 0x47, 0xdf, 0x1c, 0xcf, 0x3f, -0x00, 0x1c, 0xaf, 0x1d, 0xcf, 0x48, 0xdf, 0x3f, -0x00, 0x1d, 0xaf, 0xff, 0x22, 0x1f, 0x54, 0xff, -0x2d, 0x03, 0x5b, 0xff, 0x1e, 0x19, 0x5b, 0x60, -0x10, 0x02, 0x50, 0x60, 0x1e, 0x0a, 0x52, 0x60, -0x16, 0x1d, 0xaf, 0x49, 0x30, 0x49, 0x3c, 0x12, -0x5b, 0x21, 0xcf, 0x47, 0xdf, 0x3f, 0x00, 0x1c, -0xaf, 0x21, 0x23, 0x0c, 0x50, 0x59, 0x1e, 0x0a, -0x52, 0x49, 0x34, 0x01, 0x5a, 0x21, 0x23, 0x06, -0x50, 0x21, 0xcf, 0x47, 0xdf, 0x3f, 0x00, 0x21, -0xaf, 0x01, 0x50, 0x06, 0x1e, 0xf4, 0x5f, 0x05, -0x27, 0x0d, 0xcf, 0x06, 0x1c, 0x06, 0x1e, 0x00, -0x54, 0x0d, 0x27, 0x0c, 0x27, 0x09, 0x46, 0x0c, -0x5b, 0xa8, 0x8e, 0x07, 0x52, 0x0f, 0xcf, 0x01, -0x16, 0x02, 0x53, 0x02, 0x2e, 0x36, 0x83, 0x04, -0x50, 0xf4, 0xaf, 0x02, 0x50, 0xf2, 0xcf, 0x02, -0x10, 0x0f, 0xaf, 0x05, 0x27, 0x5a, 0xcf, 0xdf, -0x22, 0x10, 0x54, 0x3e, 0xdf, 0x3f, 0x20, 0x3f, -0x1f, 0x0a, 0x52, 0xbf, 0x22 + 0x42, 0xca, 0x00, + 0xfe, 0x27, 0x03, 0x5a, 0x9f, + 0x2c, 0x05, 0x5a, 0x9f, 0x22, 0x04, 0x50, 0x9f, + 0x22, 0x0e, 0x3e, 0x0e, 0x3d, 0x00, 0x5b, 0x5f, + 0xef, 0x1d, 0xaf, 0x49, 0xcf, 0x87, 0x1c, 0x01, + 0x18, 0x49, 0xaf, 0x34, 0x50, 0x20, 0x26, 0x08, + 0x55, 0x1f, 0xcf, 0x48, 0xdf, 0xff, 0x2d, 0x00, + 0x5b, 0xff, 0x21, 0x3f, 0x00, 0x00, 0x53, 0xff, + 0xef, 0x1f, 0xaf, 0x47, 0xdf, 0x1c, 0xcf, 0x3f, + 0x00, 0x1c, 0xaf, 0x1d, 0xcf, 0x48, 0xdf, 0x3f, + 0x00, 0x1d, 0xaf, 0xff, 0x22, 0x1f, 0x54, 0xff, + 0x2d, 0x03, 0x5b, 0xff, 0x1e, 0x19, 0x5b, 0x60, + 0x10, 0x02, 0x50, 0x60, 0x1e, 0x0a, 0x52, 0x60, + 0x16, 0x1d, 0xaf, 0x49, 0x30, 0x49, 0x3c, 0x12, + 0x5b, 0x21, 0xcf, 0x47, 0xdf, 0x3f, 0x00, 0x1c, + 0xaf, 0x21, 0x23, 0x0c, 0x50, 0x59, 0x1e, 0x0a, + 0x52, 0x49, 0x34, 0x01, 0x5a, 0x21, 0x23, 0x06, + 0x50, 0x21, 0xcf, 0x47, 0xdf, 0x3f, 0x00, 0x21, + 0xaf, 0x01, 0x50, 0x06, 0x1e, 0xf4, 0x5f, 0x05, + 0x27, 0x0d, 0xcf, 0x06, 0x1c, 0x06, 0x1e, 0x00, + 0x54, 0x0d, 0x27, 0x0c, 0x27, 0x09, 0x46, 0x0c, + 0x5b, 0xa8, 0x8e, 0x07, 0x52, 0x0f, 0xcf, 0x01, + 0x16, 0x02, 0x53, 0x02, 0x2e, 0x36, 0x83, 0x04, + 0x50, 0xf4, 0xaf, 0x02, 0x50, 0xf2, 0xcf, 0x02, + 0x10, 0x0f, 0xaf, 0x05, 0x27, 0x5a, 0xcf, 0xdf, + 0x22, 0x10, 0x54, 0x3e, 0xdf, 0x3f, 0x20, 0x3f, + 0x1f, 0x0a, 0x52, 0xbf, 0x22 }; static const unsigned char pkt540[] = { -0x42, 0x50, 0x00, -0x62, 0x28, 0x3e, 0xbf, 0x3d, -0xdf, 0x3f, 0x20, 0xdf, 0x03, 0x02, 0x52, 0xbf, -0x22, 0x3d, 0xbf, 0x0c, 0x27, 0x3d, 0xbf, 0x0d, -0x27, 0x3e, 0xbf, 0x0d, 0x27, 0x0d, 0x27, 0x0f, -0x1c, 0x69, 0xdf, 0xdf, 0x01, 0x00, 0x53, 0x00, -0xff, 0x05, 0x27, 0x37, 0x82, 0x4a, 0x82, 0x1c, -0x82, 0x1c, 0x82, 0x9d, 0xbf, 0xff, 0x97, 0x08, -0x10, 0x09, 0x27, 0x0f, 0x1c, 0x5c, 0x46, 0x03, -0x5b, 0x02, 0x1e, 0x04, 0x53, 0x02, 0xef, 0x02, -0x50, 0x03, 0x1e, 0x00, 0x53, 0x03, 0xef, 0x69, -0xaf, 0x05, 0x27 + 0x42, 0x50, 0x00, + 0x62, 0x28, 0x3e, 0xbf, 0x3d, + 0xdf, 0x3f, 0x20, 0xdf, 0x03, 0x02, 0x52, 0xbf, + 0x22, 0x3d, 0xbf, 0x0c, 0x27, 0x3d, 0xbf, 0x0d, + 0x27, 0x3e, 0xbf, 0x0d, 0x27, 0x0d, 0x27, 0x0f, + 0x1c, 0x69, 0xdf, 0xdf, 0x01, 0x00, 0x53, 0x00, + 0xff, 0x05, 0x27, 0x37, 0x82, 0x4a, 0x82, 0x1c, + 0x82, 0x1c, 0x82, 0x9d, 0xbf, 0xff, 0x97, 0x08, + 0x10, 0x09, 0x27, 0x0f, 0x1c, 0x5c, 0x46, 0x03, + 0x5b, 0x02, 0x1e, 0x04, 0x53, 0x02, 0xef, 0x02, + 0x50, 0x03, 0x1e, 0x00, 0x53, 0x03, 0xef, 0x69, + 0xaf, 0x05, 0x27 }; static const unsigned char pkt544[] = { -0x42, 0xca, 0x00, -0x89, 0x28, 0x0c, 0x42, 0x00, -0x5b, 0x18, 0x23, 0x0c, 0x23, 0x0e, 0xcf, 0xe0, -0x1c, 0x0e, 0xaf, 0x0a, 0x40, 0x02, 0x5a, 0x3b, -0x46, 0x00, 0x5a, 0x05, 0x27, 0x37, 0x43, 0xfc, -0x5b, 0x08, 0xef, 0x0c, 0xaf, 0x0d, 0x40, 0x0a, -0x5a, 0xee, 0xcf, 0x64, 0x1e, 0x01, 0x5e, 0x0c, -0x3b, 0x05, 0x27, 0x0d, 0x30, 0x0c, 0x35, 0xbf, -0x22, 0xc0, 0x2e, 0x96, 0xbf, 0x05, 0x27, 0x0e, -0x45, 0x01, 0x5b, 0x07, 0x88, 0x00, 0x50, 0x0e, -0x88, 0x0d, 0x41, 0x1f, 0x5a, 0x0d, 0x42, 0x11, -0x5a, 0xd6, 0x78, 0x51, 0x88, 0x19, 0xcf, 0xfe, -0x1e, 0x03, 0x5c, 0x0e, 0x3d, 0x0d, 0x39, 0x0d, -0x3b, 0x0c, 0x27, 0x0d, 0x27, 0x64, 0x88, 0x19, -0xcf, 0x02, 0x1e, 0xfa, 0x5a, 0x0e, 0x3e, 0x0d, -0x3a, 0x0d, 0x33, 0x0c, 0x27, 0xe4, 0x37, 0x04, -0x89, 0xe4, 0x3f, 0x01, 0x2e, 0xef, 0x82, 0x0d, -0x45, 0x54, 0x5b, 0x18, 0xcf, 0xdf, 0x22, 0x67, -0x54, 0x0d, 0x3b, 0x4f, 0x78, 0xf9, 0x88, 0x01, -0x2e, 0xef, 0x82, 0x0d, 0x42, 0x06, 0x5a, 0x0d, -0x45, 0x48, 0x5b, 0x18, 0xcf, 0xdf, 0x22, 0x5b, -0x54, 0x0d, 0x33, 0x43, 0x78, 0x15, 0xcf, 0x1a, -0xaf, 0xe4, 0x37, 0xea, 0x88, 0x15, 0xcf, 0x1b, -0xaf, 0xe4, 0x3f, 0x0d, 0xcf, 0x60, 0x1c, 0xdf, -0x22, 0x00, 0x55, 0x63, 0x78, 0x16, 0xcf, 0x13, -0xdf, 0x2a, 0x1e, 0x02, 0x5f, 0x2a, 0x1f, 0x00, -0x5f, 0x5c, 0x78, 0xbf, 0x03 + 0x42, 0xca, 0x00, + 0x89, 0x28, 0x0c, 0x42, 0x00, + 0x5b, 0x18, 0x23, 0x0c, 0x23, 0x0e, 0xcf, 0xe0, + 0x1c, 0x0e, 0xaf, 0x0a, 0x40, 0x02, 0x5a, 0x3b, + 0x46, 0x00, 0x5a, 0x05, 0x27, 0x37, 0x43, 0xfc, + 0x5b, 0x08, 0xef, 0x0c, 0xaf, 0x0d, 0x40, 0x0a, + 0x5a, 0xee, 0xcf, 0x64, 0x1e, 0x01, 0x5e, 0x0c, + 0x3b, 0x05, 0x27, 0x0d, 0x30, 0x0c, 0x35, 0xbf, + 0x22, 0xc0, 0x2e, 0x96, 0xbf, 0x05, 0x27, 0x0e, + 0x45, 0x01, 0x5b, 0x07, 0x88, 0x00, 0x50, 0x0e, + 0x88, 0x0d, 0x41, 0x1f, 0x5a, 0x0d, 0x42, 0x11, + 0x5a, 0xd6, 0x78, 0x51, 0x88, 0x19, 0xcf, 0xfe, + 0x1e, 0x03, 0x5c, 0x0e, 0x3d, 0x0d, 0x39, 0x0d, + 0x3b, 0x0c, 0x27, 0x0d, 0x27, 0x64, 0x88, 0x19, + 0xcf, 0x02, 0x1e, 0xfa, 0x5a, 0x0e, 0x3e, 0x0d, + 0x3a, 0x0d, 0x33, 0x0c, 0x27, 0xe4, 0x37, 0x04, + 0x89, 0xe4, 0x3f, 0x01, 0x2e, 0xef, 0x82, 0x0d, + 0x45, 0x54, 0x5b, 0x18, 0xcf, 0xdf, 0x22, 0x67, + 0x54, 0x0d, 0x3b, 0x4f, 0x78, 0xf9, 0x88, 0x01, + 0x2e, 0xef, 0x82, 0x0d, 0x42, 0x06, 0x5a, 0x0d, + 0x45, 0x48, 0x5b, 0x18, 0xcf, 0xdf, 0x22, 0x5b, + 0x54, 0x0d, 0x33, 0x43, 0x78, 0x15, 0xcf, 0x1a, + 0xaf, 0xe4, 0x37, 0xea, 0x88, 0x15, 0xcf, 0x1b, + 0xaf, 0xe4, 0x3f, 0x0d, 0xcf, 0x60, 0x1c, 0xdf, + 0x22, 0x00, 0x55, 0x63, 0x78, 0x16, 0xcf, 0x13, + 0xdf, 0x2a, 0x1e, 0x02, 0x5f, 0x2a, 0x1f, 0x00, + 0x5f, 0x5c, 0x78, 0xbf, 0x03 }; static const unsigned char pkt548[] = { -0x42, 0xca, 0x00, -0xed, 0x28, 0x44, 0x54, 0x1d, -0x52, 0x01, 0x2e, 0xef, 0x82, 0x9f, 0x22, 0x1a, -0xaf, 0x18, 0xcf, 0x12, 0xdf, 0xbf, 0x03, 0x00, -0x53, 0x24, 0x50, 0x09, 0x88, 0x01, 0x2e, 0xe3, -0x82, 0x9f, 0x22, 0x1b, 0xaf, 0xb1, 0x8f, 0x1d, -0x78, 0x0e, 0xcf, 0x9f, 0x1c, 0x0e, 0xaf, 0x05, -0x27, 0x0e, 0xcf, 0x5f, 0x2d, 0x05, 0x5a, 0x9f, -0x2b, 0x5f, 0x29, 0x0e, 0xaf, 0x5f, 0xff, 0x1d, -0xbf, 0x1c, 0x23, 0x05, 0x27, 0x9f, 0x22, 0x1b, -0xaf, 0x18, 0xcf, 0xdf, 0x22, 0x0a, 0x54, 0x18, -0xcf, 0x12, 0xdf, 0xbf, 0x03, 0x00, 0x53, 0x05, -0x50, 0x06, 0x88, 0x01, 0x2e, 0xe9, 0x82, 0x9f, -0x22, 0x1a, 0xaf, 0x9b, 0x8f, 0x09, 0x88, 0x05, -0x27, 0x0e, 0xcf, 0x9f, 0x2d, 0x04, 0x5a, 0x9f, -0x29, 0x5f, 0x2b, 0x0e, 0xaf, 0x1d, 0x23, 0x1c, -0x23, 0x05, 0x27, 0x0d, 0x45, 0x1e, 0x5b, 0x8e, -0x88, 0x18, 0xcf, 0x12, 0xdf, 0xbf, 0x03, 0x57, -0x53, 0x0d, 0x44, 0x02, 0x5b, 0x0c, 0x35, 0x0c, -0x78, 0x85, 0x88, 0x17, 0xcf, 0xdf, 0x22, 0x08, -0x55, 0x18, 0xcf, 0xdf, 0x22, 0x05, 0x55, 0x0a, -0x88, 0x0e, 0x3b, 0x0c, 0xdf, 0x24, 0x19, 0x0c, -0xbf, 0x05, 0x27, 0x11, 0xcf, 0xff, 0x1e, 0x01, -0x54, 0x1f, 0x20, 0x11, 0xaf, 0x05, 0x27, 0x1a, -0x23, 0x1b, 0x23, 0x05, 0x27, 0xfb, 0x8f, 0x0b, -0x88, 0x6d, 0x88, 0xf6, 0x8e, 0x34, 0x5a, 0x0a, -0xcf, 0xc0, 0x1c, 0xc0, 0x1e + 0x42, 0xca, 0x00, + 0xed, 0x28, 0x44, 0x54, 0x1d, + 0x52, 0x01, 0x2e, 0xef, 0x82, 0x9f, 0x22, 0x1a, + 0xaf, 0x18, 0xcf, 0x12, 0xdf, 0xbf, 0x03, 0x00, + 0x53, 0x24, 0x50, 0x09, 0x88, 0x01, 0x2e, 0xe3, + 0x82, 0x9f, 0x22, 0x1b, 0xaf, 0xb1, 0x8f, 0x1d, + 0x78, 0x0e, 0xcf, 0x9f, 0x1c, 0x0e, 0xaf, 0x05, + 0x27, 0x0e, 0xcf, 0x5f, 0x2d, 0x05, 0x5a, 0x9f, + 0x2b, 0x5f, 0x29, 0x0e, 0xaf, 0x5f, 0xff, 0x1d, + 0xbf, 0x1c, 0x23, 0x05, 0x27, 0x9f, 0x22, 0x1b, + 0xaf, 0x18, 0xcf, 0xdf, 0x22, 0x0a, 0x54, 0x18, + 0xcf, 0x12, 0xdf, 0xbf, 0x03, 0x00, 0x53, 0x05, + 0x50, 0x06, 0x88, 0x01, 0x2e, 0xe9, 0x82, 0x9f, + 0x22, 0x1a, 0xaf, 0x9b, 0x8f, 0x09, 0x88, 0x05, + 0x27, 0x0e, 0xcf, 0x9f, 0x2d, 0x04, 0x5a, 0x9f, + 0x29, 0x5f, 0x2b, 0x0e, 0xaf, 0x1d, 0x23, 0x1c, + 0x23, 0x05, 0x27, 0x0d, 0x45, 0x1e, 0x5b, 0x8e, + 0x88, 0x18, 0xcf, 0x12, 0xdf, 0xbf, 0x03, 0x57, + 0x53, 0x0d, 0x44, 0x02, 0x5b, 0x0c, 0x35, 0x0c, + 0x78, 0x85, 0x88, 0x17, 0xcf, 0xdf, 0x22, 0x08, + 0x55, 0x18, 0xcf, 0xdf, 0x22, 0x05, 0x55, 0x0a, + 0x88, 0x0e, 0x3b, 0x0c, 0xdf, 0x24, 0x19, 0x0c, + 0xbf, 0x05, 0x27, 0x11, 0xcf, 0xff, 0x1e, 0x01, + 0x54, 0x1f, 0x20, 0x11, 0xaf, 0x05, 0x27, 0x1a, + 0x23, 0x1b, 0x23, 0x05, 0x27, 0xfb, 0x8f, 0x0b, + 0x88, 0x6d, 0x88, 0xf6, 0x8e, 0x34, 0x5a, 0x0a, + 0xcf, 0xc0, 0x1c, 0xc0, 0x1e }; static const unsigned char pkt552[] = { -0x42, 0xca, 0x00, -0x51, 0x29, 0x0d, 0x55, 0x9f, -0x22, 0x1f, 0xaf, 0x20, 0xaf, 0x19, 0xaf, 0x1b, -0x78, 0x0e, 0xcf, 0x05, 0x18, 0x0e, 0xaf, 0x9f, -0x22, 0x47, 0xaf, 0x48, 0xaf, 0x17, 0xaf, 0x18, -0xaf, 0x05, 0x27, 0x20, 0xcf, 0xdf, 0x22, 0x05, -0x54, 0x05, 0x1e, 0x19, 0x55, 0x1f, 0xdf, 0x80, -0x1f, 0x16, 0x5e, 0x02, 0x78, 0x1f, 0xdf, 0x10, -0x1f, 0x12, 0x5e, 0x9f, 0x22, 0x20, 0xaf, 0x1f, -0xaf, 0x0a, 0xcf, 0xc0, 0x1c, 0x80, 0x1e, 0x0a, -0x55, 0x0d, 0x41, 0x01, 0x5a, 0x0e, 0x35, 0x00, -0x50, 0x0e, 0x36, 0x0d, 0xcf, 0x06, 0x18, 0x0d, -0xaf, 0x0e, 0x31, 0x9f, 0x22, 0x19, 0xaf, 0x03, -0x78, 0x1f, 0x20, 0x06, 0x1e, 0x00, 0x5e, 0x20, -0xaf, 0x0d, 0x47, 0x01, 0x5b, 0x01, 0x2e, 0xa2, -0x73, 0x0d, 0x44, 0x0b, 0x5a, 0x0d, 0xcf, 0x06, -0x1c, 0x08, 0x54, 0x0c, 0x30, 0x48, 0xcf, 0xdf, -0x2d, 0x02, 0x5a, 0x9f, 0x22, 0x1d, 0xaf, 0x01, -0x50, 0x5f, 0xef, 0x1d, 0xaf, 0x0c, 0x31, 0x0d, -0x45, 0x11, 0x5b, 0x0a, 0xcf, 0x30, 0x1c, 0x0c, -0x55, 0x0d, 0xcf, 0x06, 0x1c, 0x06, 0x1e, 0x0b, -0x54, 0x11, 0xcf, 0x07, 0x1e, 0x02, 0x53, 0x04, -0xef, 0x12, 0xaf, 0x04, 0x78, 0x05, 0xef, 0x12, -0xaf, 0x01, 0x78, 0x01, 0xef, 0x12, 0xaf, 0x18, -0x23, 0x9f, 0x22, 0x11, 0xaf, 0x0d, 0xcf, 0x1f, -0x1c, 0x0d, 0xaf, 0x0c, 0xdf, 0x24, 0x19, 0x0c, -0xbf, 0x0a, 0xdf, 0x30, 0x1d + 0x42, 0xca, 0x00, + 0x51, 0x29, 0x0d, 0x55, 0x9f, + 0x22, 0x1f, 0xaf, 0x20, 0xaf, 0x19, 0xaf, 0x1b, + 0x78, 0x0e, 0xcf, 0x05, 0x18, 0x0e, 0xaf, 0x9f, + 0x22, 0x47, 0xaf, 0x48, 0xaf, 0x17, 0xaf, 0x18, + 0xaf, 0x05, 0x27, 0x20, 0xcf, 0xdf, 0x22, 0x05, + 0x54, 0x05, 0x1e, 0x19, 0x55, 0x1f, 0xdf, 0x80, + 0x1f, 0x16, 0x5e, 0x02, 0x78, 0x1f, 0xdf, 0x10, + 0x1f, 0x12, 0x5e, 0x9f, 0x22, 0x20, 0xaf, 0x1f, + 0xaf, 0x0a, 0xcf, 0xc0, 0x1c, 0x80, 0x1e, 0x0a, + 0x55, 0x0d, 0x41, 0x01, 0x5a, 0x0e, 0x35, 0x00, + 0x50, 0x0e, 0x36, 0x0d, 0xcf, 0x06, 0x18, 0x0d, + 0xaf, 0x0e, 0x31, 0x9f, 0x22, 0x19, 0xaf, 0x03, + 0x78, 0x1f, 0x20, 0x06, 0x1e, 0x00, 0x5e, 0x20, + 0xaf, 0x0d, 0x47, 0x01, 0x5b, 0x01, 0x2e, 0xa2, + 0x73, 0x0d, 0x44, 0x0b, 0x5a, 0x0d, 0xcf, 0x06, + 0x1c, 0x08, 0x54, 0x0c, 0x30, 0x48, 0xcf, 0xdf, + 0x2d, 0x02, 0x5a, 0x9f, 0x22, 0x1d, 0xaf, 0x01, + 0x50, 0x5f, 0xef, 0x1d, 0xaf, 0x0c, 0x31, 0x0d, + 0x45, 0x11, 0x5b, 0x0a, 0xcf, 0x30, 0x1c, 0x0c, + 0x55, 0x0d, 0xcf, 0x06, 0x1c, 0x06, 0x1e, 0x0b, + 0x54, 0x11, 0xcf, 0x07, 0x1e, 0x02, 0x53, 0x04, + 0xef, 0x12, 0xaf, 0x04, 0x78, 0x05, 0xef, 0x12, + 0xaf, 0x01, 0x78, 0x01, 0xef, 0x12, 0xaf, 0x18, + 0x23, 0x9f, 0x22, 0x11, 0xaf, 0x0d, 0xcf, 0x1f, + 0x1c, 0x0d, 0xaf, 0x0c, 0xdf, 0x24, 0x19, 0x0c, + 0xbf, 0x0a, 0xdf, 0x30, 0x1d }; static const unsigned char pkt556[] = { -0x42, 0x46, 0x00, -0xb5, 0x29, 0x20, 0x1f, 0x01, -0x55, 0xf9, 0x1c, 0x0d, 0xaf, 0x05, 0x27, 0x17, -0xdf, 0xff, 0x21, 0x47, 0xbf, 0x18, 0xdf, 0x84, -0x8e, 0x02, 0x5b, 0x0e, 0x46, 0x03, 0x5a, 0x01, -0x78, 0x0d, 0x43, 0x00, 0x5a, 0xff, 0x21, 0x48, -0xbf, 0x05, 0x27, 0x14, 0x23, 0x15, 0x23, 0xff, -0xef, 0x13, 0xaf, 0x01, 0x2e, 0x00, 0x83, 0x0d, -0x3e, 0x13, 0xcf, 0x46, 0xff, 0xbf, 0x03, 0x00, -0x53, 0x0d, 0x36, 0x05, 0x27, 0x05, 0x27, 0x05, -0x27 + 0x42, 0x46, 0x00, + 0xb5, 0x29, 0x20, 0x1f, 0x01, + 0x55, 0xf9, 0x1c, 0x0d, 0xaf, 0x05, 0x27, 0x17, + 0xdf, 0xff, 0x21, 0x47, 0xbf, 0x18, 0xdf, 0x84, + 0x8e, 0x02, 0x5b, 0x0e, 0x46, 0x03, 0x5a, 0x01, + 0x78, 0x0d, 0x43, 0x00, 0x5a, 0xff, 0x21, 0x48, + 0xbf, 0x05, 0x27, 0x14, 0x23, 0x15, 0x23, 0xff, + 0xef, 0x13, 0xaf, 0x01, 0x2e, 0x00, 0x83, 0x0d, + 0x3e, 0x13, 0xcf, 0x46, 0xff, 0xbf, 0x03, 0x00, + 0x53, 0x0d, 0x36, 0x05, 0x27, 0x05, 0x27, 0x05, + 0x27 }; static const unsigned char pkt560[] = { -0x42, 0xca, 0x00, -0xd7, 0x29, 0xe1, 0x97, 0xe2, -0x9f, 0x46, 0x2e, 0x28, 0xbf, 0xc6, 0x2e, 0x29, -0xbf, 0xad, 0x88, 0x0a, 0x5b, 0xe9, 0x97, 0xea, -0x9f, 0x4f, 0xaf, 0x50, 0xbf, 0x46, 0x2e, 0x28, -0xdf, 0xc6, 0x2e, 0x29, 0xdf, 0x10, 0x10, 0x00, -0x13, 0x01, 0x78, 0x03, 0x10, 0x00, 0x13, 0xff, -0x96, 0xdf, 0x96, 0xd6, 0xcf, 0xd7, 0xdf, 0x0f, -0x1d, 0x01, 0x10, 0x00, 0x13, 0xff, 0x96, 0xdf, -0x96, 0xc8, 0xdf, 0xc7, 0xcf, 0x1f, 0x1d, 0xff, -0x96, 0xdf, 0x96, 0xc2, 0x97, 0xc3, 0x9f, 0x9d, -0x01, 0x5d, 0x01, 0xf5, 0x52, 0xc3, 0x03, 0x02, -0x5e, 0xf2, 0x52, 0x82, 0x03, 0xf0, 0x52, 0x02, -0x0c, 0xf8, 0x43, 0x03, 0x5b, 0x08, 0x44, 0x01, -0x5a, 0x00, 0x2e, 0xf3, 0x8f, 0x7f, 0x88, 0x6d, -0x5b, 0x41, 0x2e, 0xaf, 0xdf, 0xdf, 0x29, 0x41, -0x2e, 0xaf, 0xbf, 0x46, 0x2e, 0x28, 0xdf, 0xc6, -0x2e, 0x29, 0xdf, 0x03, 0x16, 0x00, 0x15, 0x46, -0x2e, 0x28, 0xbf, 0xc6, 0x2e, 0x29, 0xbf, 0x15, -0x27, 0xff, 0x96, 0xdf, 0x96, 0x8d, 0x88, 0x94, -0x88, 0xcd, 0x88, 0x01, 0xff, 0xab, 0xef, 0x19, -0x27, 0x6b, 0x88, 0xbf, 0x22, 0x3f, 0x98, 0x05, -0xff, 0x7f, 0x98, 0xdd, 0x9f, 0xbf, 0x98, 0x24, -0x28, 0x04, 0xff, 0x7f, 0x98, 0xdd, 0x9f, 0xbf, -0x98, 0x24, 0x28, 0x66, 0xff, 0xbf, 0x99, 0x12, -0xff, 0x7f, 0x99, 0xdd, 0x97, 0xdd, 0x9f, 0x19, -0x27, 0xe0, 0x97, 0xff, 0xaf + 0x42, 0xca, 0x00, + 0xd7, 0x29, 0xe1, 0x97, 0xe2, + 0x9f, 0x46, 0x2e, 0x28, 0xbf, 0xc6, 0x2e, 0x29, + 0xbf, 0xad, 0x88, 0x0a, 0x5b, 0xe9, 0x97, 0xea, + 0x9f, 0x4f, 0xaf, 0x50, 0xbf, 0x46, 0x2e, 0x28, + 0xdf, 0xc6, 0x2e, 0x29, 0xdf, 0x10, 0x10, 0x00, + 0x13, 0x01, 0x78, 0x03, 0x10, 0x00, 0x13, 0xff, + 0x96, 0xdf, 0x96, 0xd6, 0xcf, 0xd7, 0xdf, 0x0f, + 0x1d, 0x01, 0x10, 0x00, 0x13, 0xff, 0x96, 0xdf, + 0x96, 0xc8, 0xdf, 0xc7, 0xcf, 0x1f, 0x1d, 0xff, + 0x96, 0xdf, 0x96, 0xc2, 0x97, 0xc3, 0x9f, 0x9d, + 0x01, 0x5d, 0x01, 0xf5, 0x52, 0xc3, 0x03, 0x02, + 0x5e, 0xf2, 0x52, 0x82, 0x03, 0xf0, 0x52, 0x02, + 0x0c, 0xf8, 0x43, 0x03, 0x5b, 0x08, 0x44, 0x01, + 0x5a, 0x00, 0x2e, 0xf3, 0x8f, 0x7f, 0x88, 0x6d, + 0x5b, 0x41, 0x2e, 0xaf, 0xdf, 0xdf, 0x29, 0x41, + 0x2e, 0xaf, 0xbf, 0x46, 0x2e, 0x28, 0xdf, 0xc6, + 0x2e, 0x29, 0xdf, 0x03, 0x16, 0x00, 0x15, 0x46, + 0x2e, 0x28, 0xbf, 0xc6, 0x2e, 0x29, 0xbf, 0x15, + 0x27, 0xff, 0x96, 0xdf, 0x96, 0x8d, 0x88, 0x94, + 0x88, 0xcd, 0x88, 0x01, 0xff, 0xab, 0xef, 0x19, + 0x27, 0x6b, 0x88, 0xbf, 0x22, 0x3f, 0x98, 0x05, + 0xff, 0x7f, 0x98, 0xdd, 0x9f, 0xbf, 0x98, 0x24, + 0x28, 0x04, 0xff, 0x7f, 0x98, 0xdd, 0x9f, 0xbf, + 0x98, 0x24, 0x28, 0x66, 0xff, 0xbf, 0x99, 0x12, + 0xff, 0x7f, 0x99, 0xdd, 0x97, 0xdd, 0x9f, 0x19, + 0x27, 0xe0, 0x97, 0xff, 0xaf }; static const unsigned char pkt564[] = { -0x42, 0xca, 0x00, -0x3b, 0x2a, 0x46, 0x2e, 0x28, -0xdf, 0xc6, 0x2e, 0x29, 0xdf, 0x13, 0x10, 0x00, -0x13, 0xff, 0xaf, 0xff, 0xbf, 0xe3, 0x97, 0xff, -0xaf, 0xe4, 0x97, 0xff, 0xaf, 0xe5, 0x97, 0xff, -0xaf, 0xef, 0x88, 0x06, 0x0d, 0xdd, 0x97, 0xdd, -0x9f, 0x46, 0x2e, 0x28, 0xdf, 0xc6, 0x2e, 0x29, -0xdf, 0x06, 0xaf, 0x4e, 0xbf, 0xff, 0x22, 0x11, -0x54, 0x15, 0x27, 0x1a, 0x27, 0x01, 0xff, 0xab, -0xef, 0x19, 0x27, 0xdc, 0x97, 0xdf, 0x99, 0x28, -0x28, 0x0f, 0x27, 0x68, 0x2c, 0xfd, 0x5b, 0xe9, -0x97, 0xff, 0xaf, 0x6a, 0x28, 0x06, 0x25, 0xf4, -0x53, 0x4e, 0x25, 0xf2, 0x55, 0xdc, 0x97, 0xdf, -0x99, 0x28, 0x28, 0x0f, 0x27, 0x68, 0x2c, 0xfd, -0x5b, 0xe9, 0x97, 0xff, 0xaf, 0x6a, 0x28, 0x06, -0x25, 0xf4, 0x55, 0x41, 0x2e, 0xaf, 0xdf, 0xdf, -0x2b, 0x41, 0x2e, 0xaf, 0xbf, 0xbf, 0x22, 0xbf, -0x99, 0x7f, 0x99, 0x05, 0x27, 0xdd, 0x97, 0xdd, -0x9f, 0x06, 0xaf, 0x4e, 0xbf, 0xff, 0x22, 0x05, -0x54, 0xfd, 0x97, 0xff, 0xaf, 0x06, 0x25, 0xfb, -0x53, 0x4e, 0x25, 0xf9, 0x55, 0xfd, 0x97, 0xff, -0xaf, 0x06, 0x25, 0xfb, 0x55, 0x05, 0x27, 0xff, -0x96, 0xc6, 0x2e, 0x01, 0xdf, 0xbf, 0x2c, 0xdd, -0x9f, 0x05, 0x27, 0xc6, 0x2e, 0x28, 0xdf, 0x0f, -0x1d, 0x04, 0x55, 0x0b, 0x88, 0xff, 0x96, 0x10, -0xef, 0xdf, 0x96, 0x06, 0x50, 0x06, 0x88, 0x3f, -0x20, 0xff, 0x96, 0xc6, 0x2e + 0x42, 0xca, 0x00, + 0x3b, 0x2a, 0x46, 0x2e, 0x28, + 0xdf, 0xc6, 0x2e, 0x29, 0xdf, 0x13, 0x10, 0x00, + 0x13, 0xff, 0xaf, 0xff, 0xbf, 0xe3, 0x97, 0xff, + 0xaf, 0xe4, 0x97, 0xff, 0xaf, 0xe5, 0x97, 0xff, + 0xaf, 0xef, 0x88, 0x06, 0x0d, 0xdd, 0x97, 0xdd, + 0x9f, 0x46, 0x2e, 0x28, 0xdf, 0xc6, 0x2e, 0x29, + 0xdf, 0x06, 0xaf, 0x4e, 0xbf, 0xff, 0x22, 0x11, + 0x54, 0x15, 0x27, 0x1a, 0x27, 0x01, 0xff, 0xab, + 0xef, 0x19, 0x27, 0xdc, 0x97, 0xdf, 0x99, 0x28, + 0x28, 0x0f, 0x27, 0x68, 0x2c, 0xfd, 0x5b, 0xe9, + 0x97, 0xff, 0xaf, 0x6a, 0x28, 0x06, 0x25, 0xf4, + 0x53, 0x4e, 0x25, 0xf2, 0x55, 0xdc, 0x97, 0xdf, + 0x99, 0x28, 0x28, 0x0f, 0x27, 0x68, 0x2c, 0xfd, + 0x5b, 0xe9, 0x97, 0xff, 0xaf, 0x6a, 0x28, 0x06, + 0x25, 0xf4, 0x55, 0x41, 0x2e, 0xaf, 0xdf, 0xdf, + 0x2b, 0x41, 0x2e, 0xaf, 0xbf, 0xbf, 0x22, 0xbf, + 0x99, 0x7f, 0x99, 0x05, 0x27, 0xdd, 0x97, 0xdd, + 0x9f, 0x06, 0xaf, 0x4e, 0xbf, 0xff, 0x22, 0x05, + 0x54, 0xfd, 0x97, 0xff, 0xaf, 0x06, 0x25, 0xfb, + 0x53, 0x4e, 0x25, 0xf9, 0x55, 0xfd, 0x97, 0xff, + 0xaf, 0x06, 0x25, 0xfb, 0x55, 0x05, 0x27, 0xff, + 0x96, 0xc6, 0x2e, 0x01, 0xdf, 0xbf, 0x2c, 0xdd, + 0x9f, 0x05, 0x27, 0xc6, 0x2e, 0x28, 0xdf, 0x0f, + 0x1d, 0x04, 0x55, 0x0b, 0x88, 0xff, 0x96, 0x10, + 0xef, 0xdf, 0x96, 0x06, 0x50, 0x06, 0x88, 0x3f, + 0x20, 0xff, 0x96, 0xc6, 0x2e }; static const unsigned char pkt568[] = { -0x42, 0xca, 0x00, -0x9f, 0x2a, 0x28, 0xdf, 0x0f, -0x1d, 0xff, 0x96, 0x05, 0x27, 0x46, 0x2e, 0x28, -0xdf, 0xf0, 0x1c, 0x09, 0x27, 0xdf, 0x9f, 0x46, -0x2e, 0x29, 0xdf, 0x0f, 0x1c, 0x09, 0x27, 0x5f, -0x02, 0x05, 0x27, 0x78, 0x88, 0x6f, 0x88, 0x0a, -0xef, 0xdc, 0x9f, 0x3f, 0x9f, 0x5f, 0x20, 0xfb, -0x55, 0x05, 0x27, 0x9f, 0x22, 0x41, 0x2e, 0xab, -0xbf, 0x50, 0xef, 0xdf, 0x96, 0x3a, 0xef, 0xdf, -0x96, 0x29, 0x88, 0x68, 0x88, 0x0a, 0xef, 0xfc, -0x9f, 0xc1, 0x2e, 0xad, 0xbf, 0xc1, 0x2e, 0xac, -0xdf, 0x3f, 0x20, 0xc1, 0x2e, 0xac, 0xbf, 0x6a, -0x88, 0x5f, 0x20, 0xf4, 0x55, 0x5b, 0xef, 0xdf, -0x96, 0x50, 0xcf, 0xdf, 0x96, 0x17, 0x88, 0x5c, -0xef, 0xdf, 0x96, 0x4f, 0xcf, 0xdf, 0x96, 0x12, -0x88, 0x5d, 0xef, 0xdf, 0x96, 0x9f, 0x22, 0xdf, -0x96, 0x0d, 0x88, 0x5e, 0xef, 0xdf, 0x96, 0x46, -0x2e, 0x29, 0xdf, 0xdf, 0x96, 0x07, 0x88, 0x5f, -0xef, 0xdf, 0x96, 0x46, 0x2e, 0x28, 0xdf, 0xdf, -0x96, 0x01, 0x88, 0x0f, 0x27, 0x05, 0x27, 0xdd, -0x97, 0x41, 0x2e, 0xad, 0xbf, 0xdd, 0x97, 0x41, -0x2e, 0xac, 0xbf, 0x44, 0x88, 0x05, 0x27, 0x9f, -0x22, 0x41, 0x2e, 0xab, 0xbf, 0x10, 0xef, 0xdf, -0x96, 0x02, 0xef, 0xdf, 0x96, 0xef, 0x8f, 0x2e, -0x88, 0x0a, 0xef, 0xfc, 0x9f, 0xc1, 0x2e, 0xad, -0xbf, 0xc1, 0x2e, 0xac, 0xdf, 0x3f, 0x20, 0xc1, -0x2e, 0xac, 0xbf, 0x30, 0x88 + 0x42, 0xca, 0x00, + 0x9f, 0x2a, 0x28, 0xdf, 0x0f, + 0x1d, 0xff, 0x96, 0x05, 0x27, 0x46, 0x2e, 0x28, + 0xdf, 0xf0, 0x1c, 0x09, 0x27, 0xdf, 0x9f, 0x46, + 0x2e, 0x29, 0xdf, 0x0f, 0x1c, 0x09, 0x27, 0x5f, + 0x02, 0x05, 0x27, 0x78, 0x88, 0x6f, 0x88, 0x0a, + 0xef, 0xdc, 0x9f, 0x3f, 0x9f, 0x5f, 0x20, 0xfb, + 0x55, 0x05, 0x27, 0x9f, 0x22, 0x41, 0x2e, 0xab, + 0xbf, 0x50, 0xef, 0xdf, 0x96, 0x3a, 0xef, 0xdf, + 0x96, 0x29, 0x88, 0x68, 0x88, 0x0a, 0xef, 0xfc, + 0x9f, 0xc1, 0x2e, 0xad, 0xbf, 0xc1, 0x2e, 0xac, + 0xdf, 0x3f, 0x20, 0xc1, 0x2e, 0xac, 0xbf, 0x6a, + 0x88, 0x5f, 0x20, 0xf4, 0x55, 0x5b, 0xef, 0xdf, + 0x96, 0x50, 0xcf, 0xdf, 0x96, 0x17, 0x88, 0x5c, + 0xef, 0xdf, 0x96, 0x4f, 0xcf, 0xdf, 0x96, 0x12, + 0x88, 0x5d, 0xef, 0xdf, 0x96, 0x9f, 0x22, 0xdf, + 0x96, 0x0d, 0x88, 0x5e, 0xef, 0xdf, 0x96, 0x46, + 0x2e, 0x29, 0xdf, 0xdf, 0x96, 0x07, 0x88, 0x5f, + 0xef, 0xdf, 0x96, 0x46, 0x2e, 0x28, 0xdf, 0xdf, + 0x96, 0x01, 0x88, 0x0f, 0x27, 0x05, 0x27, 0xdd, + 0x97, 0x41, 0x2e, 0xad, 0xbf, 0xdd, 0x97, 0x41, + 0x2e, 0xac, 0xbf, 0x44, 0x88, 0x05, 0x27, 0x9f, + 0x22, 0x41, 0x2e, 0xab, 0xbf, 0x10, 0xef, 0xdf, + 0x96, 0x02, 0xef, 0xdf, 0x96, 0xef, 0x8f, 0x2e, + 0x88, 0x0a, 0xef, 0xfc, 0x9f, 0xc1, 0x2e, 0xad, + 0xbf, 0xc1, 0x2e, 0xac, 0xdf, 0x3f, 0x20, 0xc1, + 0x2e, 0xac, 0xbf, 0x30, 0x88 }; static const unsigned char pkt572[] = { -0x42, 0x9a, 0x00, -0x03, 0x2b, 0x5f, 0x20, 0xf4, -0x55, 0x1b, 0xef, 0xdf, 0x96, 0x50, 0xcf, 0xdf, -0x96, 0xdd, 0x8f, 0x1c, 0xef, 0xdf, 0x96, 0x4f, -0xcf, 0xdf, 0x96, 0xd8, 0x8f, 0x1d, 0xef, 0xdf, -0x96, 0x9f, 0x22, 0xdf, 0x96, 0xd3, 0x8f, 0x1e, -0xef, 0xdf, 0x96, 0x9f, 0x22, 0xdf, 0x96, 0xce, -0x8f, 0x1f, 0xef, 0xdf, 0x96, 0x01, 0xef, 0xdf, -0x96, 0xc9, 0x8f, 0x0f, 0x27, 0x05, 0x27, 0x02, -0xef, 0x06, 0xff, 0x1a, 0x27, 0x05, 0x27, 0x02, -0xef, 0x06, 0xff, 0x1a, 0x27, 0x05, 0x27, 0xdf, -0x96, 0xff, 0x96, 0x7b, 0xef, 0x00, 0xff, 0x1b, -0x27, 0xdd, 0x9f, 0xdd, 0x97, 0x05, 0x27, 0x01, -0xff, 0xab, 0xef, 0x1b, 0x27, 0x05, 0x27, 0xdf, -0x96, 0x81, 0xef, 0x41, 0x2e, 0xaf, 0xbf, 0xdd, -0x97, 0x05, 0x27, 0x3a, 0xef, 0xff, 0xaf, 0xea, -0x8f, 0x0a, 0xef, 0xfc, 0x9f, 0xff, 0xbf, 0x5f, -0x20, 0xfb, 0x55, 0x50, 0xcf, 0xff, 0xaf, 0x4f, -0xcf, 0xff, 0xaf, 0x9f, 0x22, 0xff, 0xaf, 0x46, -0x2e, 0x29, 0xdf, 0xff, 0xaf, 0x46, 0x2e, 0x28, -0xdf, 0xff, 0xaf, 0x05, 0x27 + 0x42, 0x9a, 0x00, + 0x03, 0x2b, 0x5f, 0x20, 0xf4, + 0x55, 0x1b, 0xef, 0xdf, 0x96, 0x50, 0xcf, 0xdf, + 0x96, 0xdd, 0x8f, 0x1c, 0xef, 0xdf, 0x96, 0x4f, + 0xcf, 0xdf, 0x96, 0xd8, 0x8f, 0x1d, 0xef, 0xdf, + 0x96, 0x9f, 0x22, 0xdf, 0x96, 0xd3, 0x8f, 0x1e, + 0xef, 0xdf, 0x96, 0x9f, 0x22, 0xdf, 0x96, 0xce, + 0x8f, 0x1f, 0xef, 0xdf, 0x96, 0x01, 0xef, 0xdf, + 0x96, 0xc9, 0x8f, 0x0f, 0x27, 0x05, 0x27, 0x02, + 0xef, 0x06, 0xff, 0x1a, 0x27, 0x05, 0x27, 0x02, + 0xef, 0x06, 0xff, 0x1a, 0x27, 0x05, 0x27, 0xdf, + 0x96, 0xff, 0x96, 0x7b, 0xef, 0x00, 0xff, 0x1b, + 0x27, 0xdd, 0x9f, 0xdd, 0x97, 0x05, 0x27, 0x01, + 0xff, 0xab, 0xef, 0x1b, 0x27, 0x05, 0x27, 0xdf, + 0x96, 0x81, 0xef, 0x41, 0x2e, 0xaf, 0xbf, 0xdd, + 0x97, 0x05, 0x27, 0x3a, 0xef, 0xff, 0xaf, 0xea, + 0x8f, 0x0a, 0xef, 0xfc, 0x9f, 0xff, 0xbf, 0x5f, + 0x20, 0xfb, 0x55, 0x50, 0xcf, 0xff, 0xaf, 0x4f, + 0xcf, 0xff, 0xaf, 0x9f, 0x22, 0xff, 0xaf, 0x46, + 0x2e, 0x29, 0xdf, 0xff, 0xaf, 0x46, 0x2e, 0x28, + 0xdf, 0xff, 0xaf, 0x05, 0x27 }; static const unsigned char pkt576[] = { -0x42, 0x1a, 0x00, -0x4f, 0x2b, 0x09, 0x43, 0x04, -0x5b, 0x00, 0xef, 0xf8, 0xaf, 0x32, 0xef, 0xfa, -0xaf, 0x03, 0x50, 0x01, 0xef, 0xf8, 0xaf, 0x42, -0xef, 0xfa, 0xaf, 0x05, 0x27 + 0x42, 0x1a, 0x00, + 0x4f, 0x2b, 0x09, 0x43, 0x04, + 0x5b, 0x00, 0xef, 0xf8, 0xaf, 0x32, 0xef, 0xfa, + 0xaf, 0x03, 0x50, 0x01, 0xef, 0xf8, 0xaf, 0x42, + 0xef, 0xfa, 0xaf, 0x05, 0x27 }; static const unsigned char pkt580[] = { -0x42, 0x18, 0x00, -0x5b, 0x2b, 0xd3, 0x45, 0x03, -0x5a, 0x0f, 0x27, 0xd3, 0x45, 0x00, 0x5a, 0x05, -0x27, 0xd0, 0x41, 0xf7, 0x5b, 0xc1, 0x83, 0xf5, -0x50, 0x05, 0x27 + 0x42, 0x18, 0x00, + 0x5b, 0x2b, 0xd3, 0x45, 0x03, + 0x5a, 0x0f, 0x27, 0xd3, 0x45, 0x00, 0x5a, 0x05, + 0x27, 0xd0, 0x41, 0xf7, 0x5b, 0xc1, 0x83, 0xf5, + 0x50, 0x05, 0x27 }; static const unsigned char pkt584[] = { -0x42, 0x22, 0x00, -0x66, 0x2b, 0xc8, 0x46, 0x0c, -0x5b, 0xd3, 0x45, 0xfd, 0x5a, 0xd3, 0x45, 0xfb, -0x5a, 0xd3, 0x45, 0xf9, 0x5a, 0x41, 0x2e, 0xa1, -0xdf, 0x9f, 0x28, 0x41, 0x2e, 0xa1, 0xbf, 0x02, -0x2e, 0xb0, 0x81, 0x05, 0x27 + 0x42, 0x22, 0x00, + 0x66, 0x2b, 0xc8, 0x46, 0x0c, + 0x5b, 0xd3, 0x45, 0xfd, 0x5a, 0xd3, 0x45, 0xfb, + 0x5a, 0xd3, 0x45, 0xf9, 0x5a, 0x41, 0x2e, 0xa1, + 0xdf, 0x9f, 0x28, 0x41, 0x2e, 0xa1, 0xbf, 0x02, + 0x2e, 0xb0, 0x81, 0x05, 0x27 }; static const unsigned char pkt588[] = { -0x42, 0x0e, 0x00, -0x76, 0x2b, 0x00, 0x19, 0xe9, -0x2f, 0xe3, 0x55, 0xdf, 0x2d, 0xe9, 0x2f, 0xd0, -0x50 + 0x42, 0x0e, 0x00, + 0x76, 0x2b, 0x00, 0x19, 0xe9, + 0x2f, 0xe3, 0x55, 0xdf, 0x2d, 0xe9, 0x2f, 0xd0, + 0x50 }; static const unsigned char pkt592[] = { -0x42, 0x0e, 0x00, -0x7c, 0x2b, 0x00, 0x19, 0xe9, -0x2f, 0xb5, 0x55, 0xdf, 0x2d, 0xe9, 0x2f, 0xa2, -0x50 + 0x42, 0x0e, 0x00, + 0x7c, 0x2b, 0x00, 0x19, 0xe9, + 0x2f, 0xb5, 0x55, 0xdf, 0x2d, 0xe9, 0x2f, 0xa2, + 0x50 }; static const unsigned char pkt596[] = { -0x42, 0x0e, 0x00, -0x82, 0x2b, 0xbf, 0x03, 0xe7, -0x2f, 0xb2, 0x53, 0xec, 0xcf, 0x01, 0x2e, 0x2d, -0x73 + 0x42, 0x0e, 0x00, + 0x82, 0x2b, 0xbf, 0x03, 0xe7, + 0x2f, 0xb2, 0x53, 0xec, 0xcf, 0x01, 0x2e, 0x2d, + 0x73 }; static const unsigned char pkt600[] = { -0x42, 0x50, 0x00, -0x88, 0x2b, 0x07, 0x3d, 0x02, -0x5b, 0x6c, 0x86, 0xc2, 0x23, 0xd3, 0x3c, 0x02, -0x44, 0xd7, 0x2f, 0x08, 0x5a, 0x02, 0x45, 0xd7, -0x2f, 0x69, 0x5b, 0x58, 0x23, 0x3c, 0x26, 0x02, -0x55, 0x02, 0x2e, 0x43, 0x83, 0x01, 0x50, 0x02, -0x2e, 0x92, 0x83, 0x07, 0x45, 0xea, 0x5a, 0x41, -0x2e, 0x53, 0xdf, 0xc1, 0x2e, 0x79, 0xdf, 0xff, -0x96, 0xdf, 0x96, 0x41, 0x2e, 0x55, 0xdf, 0xc1, -0x2e, 0x78, 0xdf, 0x9d, 0x01, 0x5d, 0x01, 0xff, -0x22, 0x00, 0x54, 0xff, 0xef, 0x2e, 0xaf, 0xd7, -0x2f, 0x4d, 0x50 + 0x42, 0x50, 0x00, + 0x88, 0x2b, 0x07, 0x3d, 0x02, + 0x5b, 0x6c, 0x86, 0xc2, 0x23, 0xd3, 0x3c, 0x02, + 0x44, 0xd7, 0x2f, 0x08, 0x5a, 0x02, 0x45, 0xd7, + 0x2f, 0x69, 0x5b, 0x58, 0x23, 0x3c, 0x26, 0x02, + 0x55, 0x02, 0x2e, 0x43, 0x83, 0x01, 0x50, 0x02, + 0x2e, 0x92, 0x83, 0x07, 0x45, 0xea, 0x5a, 0x41, + 0x2e, 0x53, 0xdf, 0xc1, 0x2e, 0x79, 0xdf, 0xff, + 0x96, 0xdf, 0x96, 0x41, 0x2e, 0x55, 0xdf, 0xc1, + 0x2e, 0x78, 0xdf, 0x9d, 0x01, 0x5d, 0x01, 0xff, + 0x22, 0x00, 0x54, 0xff, 0xef, 0x2e, 0xaf, 0xd7, + 0x2f, 0x4d, 0x50 }; static const unsigned char pkt604[] = { -0x67, 0x05, 0x00, 0x00, 0x02, 0x2e, 0x00, 0x70, -0x67, 0x05, 0x00, 0x01, 0x02, 0x2e, 0xb8, 0x71, -0x67, 0x05, 0x00, 0x02, 0x02, 0x2e, 0x35, 0x72, -0x67, 0x05, 0x00, 0x08, 0x02, 0x2e, 0xbb, 0x72, -0x67, 0x05, 0x00, 0x07, 0x02, 0x2e, 0x3b, 0x73, -0x67, 0x05, 0x00, 0x0d, 0x02, 0x2e, 0x38, 0x74, -0x67, 0x05, 0x00, 0x0b, 0x02, 0x2e, 0x85, 0x74, -0x67, 0x05, 0x00, 0x0e, 0x02, 0x2e, 0x61, 0x75, -0x67, 0x05, 0x00, 0x05, 0x02, 0x2e, 0xa6, 0x75, -0x67, 0x05, 0x00, 0x0c, 0x02, 0x2e, 0x89, 0x78, -0x67, 0x05, 0x00, 0x09, 0x02, 0x2e, 0xd7, 0x79, -0x5a, 0x05, 0x00, 0x00, 0x6b, 0x01, 0x4f, 0x2b, -0x5a, 0x05, 0x00, 0x01, 0x82, 0x09, 0x5b, 0x2b, -0x5a, 0x05, 0x00, 0x02, 0x78, 0x09, 0x66, 0x2b, -0x5a, 0x05, 0x00, 0x03, 0x4c, 0x15, 0x76, 0x2b, -0x5a, 0x05, 0x00, 0x04, 0x24, 0x15, 0x7c, 0x2b, -0x5a, 0x05, 0x00, 0x05, 0x50, 0x13, 0x82, 0x2b, -0x5a, 0x05, 0x00, 0x06, 0xe1, 0x02, 0x88, 0x2b, -0x0d, -0x42, 0x04, 0x00, 0x88, 0x2b, 0x07, 0x3d + 0x67, 0x05, 0x00, 0x00, 0x02, 0x2e, 0x00, 0x70, + 0x67, 0x05, 0x00, 0x01, 0x02, 0x2e, 0xb8, 0x71, + 0x67, 0x05, 0x00, 0x02, 0x02, 0x2e, 0x35, 0x72, + 0x67, 0x05, 0x00, 0x08, 0x02, 0x2e, 0xbb, 0x72, + 0x67, 0x05, 0x00, 0x07, 0x02, 0x2e, 0x3b, 0x73, + 0x67, 0x05, 0x00, 0x0d, 0x02, 0x2e, 0x38, 0x74, + 0x67, 0x05, 0x00, 0x0b, 0x02, 0x2e, 0x85, 0x74, + 0x67, 0x05, 0x00, 0x0e, 0x02, 0x2e, 0x61, 0x75, + 0x67, 0x05, 0x00, 0x05, 0x02, 0x2e, 0xa6, 0x75, + 0x67, 0x05, 0x00, 0x0c, 0x02, 0x2e, 0x89, 0x78, + 0x67, 0x05, 0x00, 0x09, 0x02, 0x2e, 0xd7, 0x79, + 0x5a, 0x05, 0x00, 0x00, 0x6b, 0x01, 0x4f, 0x2b, + 0x5a, 0x05, 0x00, 0x01, 0x82, 0x09, 0x5b, 0x2b, + 0x5a, 0x05, 0x00, 0x02, 0x78, 0x09, 0x66, 0x2b, + 0x5a, 0x05, 0x00, 0x03, 0x4c, 0x15, 0x76, 0x2b, + 0x5a, 0x05, 0x00, 0x04, 0x24, 0x15, 0x7c, 0x2b, + 0x5a, 0x05, 0x00, 0x05, 0x50, 0x13, 0x82, 0x2b, + 0x5a, 0x05, 0x00, 0x06, 0xe1, 0x02, 0x88, 0x2b, + 0x0d, + 0x42, 0x04, 0x00, 0x88, 0x2b, 0x07, 0x3d }; struct aesX660_cmd aes1660_init_2[] = { - { .cmd = pkt433, .len = sizeof(pkt433) }, - { .cmd = pkt440, .len = sizeof(pkt440) }, - { .cmd = pkt444, .len = sizeof(pkt444) }, - { .cmd = pkt448, .len = sizeof(pkt448) }, - { .cmd = pkt452, .len = sizeof(pkt452) }, - { .cmd = pkt456, .len = sizeof(pkt456) }, - { .cmd = pkt460, .len = sizeof(pkt460) }, - { .cmd = pkt464, .len = sizeof(pkt464) }, - { .cmd = pkt468, .len = sizeof(pkt468) }, - { .cmd = pkt472, .len = sizeof(pkt472) }, - { .cmd = pkt476, .len = sizeof(pkt476) }, - { .cmd = pkt480, .len = sizeof(pkt480) }, - { .cmd = pkt484, .len = sizeof(pkt484) }, - { .cmd = pkt488, .len = sizeof(pkt488) }, - { .cmd = pkt492, .len = sizeof(pkt492) }, - { .cmd = pkt496, .len = sizeof(pkt496) }, - { .cmd = pkt500, .len = sizeof(pkt500) }, - { .cmd = pkt504, .len = sizeof(pkt504) }, - { .cmd = pkt508, .len = sizeof(pkt508) }, - { .cmd = pkt512, .len = sizeof(pkt512) }, - { .cmd = pkt516, .len = sizeof(pkt516) }, - { .cmd = pkt520, .len = sizeof(pkt520) }, - { .cmd = pkt524, .len = sizeof(pkt524) }, - { .cmd = pkt528, .len = sizeof(pkt528) }, - { .cmd = pkt532, .len = sizeof(pkt532) }, - { .cmd = pkt536, .len = sizeof(pkt536) }, - { .cmd = pkt540, .len = sizeof(pkt540) }, - { .cmd = pkt544, .len = sizeof(pkt544) }, - { .cmd = pkt548, .len = sizeof(pkt548) }, - { .cmd = pkt552, .len = sizeof(pkt552) }, - { .cmd = pkt556, .len = sizeof(pkt556) }, - { .cmd = pkt560, .len = sizeof(pkt560) }, - { .cmd = pkt564, .len = sizeof(pkt564) }, - { .cmd = pkt568, .len = sizeof(pkt568) }, - { .cmd = pkt572, .len = sizeof(pkt572) }, - { .cmd = pkt576, .len = sizeof(pkt576) }, - { .cmd = pkt580, .len = sizeof(pkt580) }, - { .cmd = pkt584, .len = sizeof(pkt584) }, - { .cmd = pkt588, .len = sizeof(pkt588) }, - { .cmd = pkt592, .len = sizeof(pkt592) }, - { .cmd = pkt596, .len = sizeof(pkt596) }, - { .cmd = pkt600, .len = sizeof(pkt600) }, - { .cmd = pkt604, .len = sizeof(pkt604) }, + { .cmd = pkt433, .len = sizeof (pkt433) }, + { .cmd = pkt440, .len = sizeof (pkt440) }, + { .cmd = pkt444, .len = sizeof (pkt444) }, + { .cmd = pkt448, .len = sizeof (pkt448) }, + { .cmd = pkt452, .len = sizeof (pkt452) }, + { .cmd = pkt456, .len = sizeof (pkt456) }, + { .cmd = pkt460, .len = sizeof (pkt460) }, + { .cmd = pkt464, .len = sizeof (pkt464) }, + { .cmd = pkt468, .len = sizeof (pkt468) }, + { .cmd = pkt472, .len = sizeof (pkt472) }, + { .cmd = pkt476, .len = sizeof (pkt476) }, + { .cmd = pkt480, .len = sizeof (pkt480) }, + { .cmd = pkt484, .len = sizeof (pkt484) }, + { .cmd = pkt488, .len = sizeof (pkt488) }, + { .cmd = pkt492, .len = sizeof (pkt492) }, + { .cmd = pkt496, .len = sizeof (pkt496) }, + { .cmd = pkt500, .len = sizeof (pkt500) }, + { .cmd = pkt504, .len = sizeof (pkt504) }, + { .cmd = pkt508, .len = sizeof (pkt508) }, + { .cmd = pkt512, .len = sizeof (pkt512) }, + { .cmd = pkt516, .len = sizeof (pkt516) }, + { .cmd = pkt520, .len = sizeof (pkt520) }, + { .cmd = pkt524, .len = sizeof (pkt524) }, + { .cmd = pkt528, .len = sizeof (pkt528) }, + { .cmd = pkt532, .len = sizeof (pkt532) }, + { .cmd = pkt536, .len = sizeof (pkt536) }, + { .cmd = pkt540, .len = sizeof (pkt540) }, + { .cmd = pkt544, .len = sizeof (pkt544) }, + { .cmd = pkt548, .len = sizeof (pkt548) }, + { .cmd = pkt552, .len = sizeof (pkt552) }, + { .cmd = pkt556, .len = sizeof (pkt556) }, + { .cmd = pkt560, .len = sizeof (pkt560) }, + { .cmd = pkt564, .len = sizeof (pkt564) }, + { .cmd = pkt568, .len = sizeof (pkt568) }, + { .cmd = pkt572, .len = sizeof (pkt572) }, + { .cmd = pkt576, .len = sizeof (pkt576) }, + { .cmd = pkt580, .len = sizeof (pkt580) }, + { .cmd = pkt584, .len = sizeof (pkt584) }, + { .cmd = pkt588, .len = sizeof (pkt588) }, + { .cmd = pkt592, .len = sizeof (pkt592) }, + { .cmd = pkt596, .len = sizeof (pkt596) }, + { .cmd = pkt600, .len = sizeof (pkt600) }, + { .cmd = pkt604, .len = sizeof (pkt604) }, }; /* INIT2 is over, 0x07 cmd returns * { 0x07, 0x05, 0x00, 0x8f, 0x16, 0x25, 0x01, 0x63 } @@ -1979,12 +1979,12 @@ struct aesX660_cmd aes1660_init_2[] = { /* This command sequence starts imaging */ static const unsigned char aes1660_start_imaging_cmd[] = { -0x13, -0x20, -0x4c, 0x01, 0x00, 0x00, -0x4b, 0x04, 0x00, 0x78, 0x56, 0x34, 0x12, -0x55, 0x07, 0x00, 0x80, 0x42, 0x00, 0x7f, 0x00, 0x00, 0x14, -0x49, 0x03, 0x00, 0x20, 0x00, 0xc8 + 0x13, + 0x20, + 0x4c, 0x01, 0x00, 0x00, + 0x4b, 0x04, 0x00, 0x78, 0x56, 0x34, 0x12, + 0x55, 0x07, 0x00, 0x80, 0x42, 0x00, 0x7f, 0x00, 0x00, 0x14, + 0x49, 0x03, 0x00, 0x20, 0x00, 0xc8 }; #endif diff --git a/libfprint/drivers/aes2501.c b/libfprint/drivers/aes2501.c index c321b8c..d073bae 100644 --- a/libfprint/drivers/aes2501.c +++ b/libfprint/drivers/aes2501.c @@ -27,19 +27,19 @@ #include "aeslib.h" #include "aes2501.h" -static void start_capture(FpImageDevice *dev); -static void complete_deactivation(FpImageDevice *dev); +static void start_capture (FpImageDevice *dev); +static void complete_deactivation (FpImageDevice *dev); /* FIXME these need checking */ -#define EP_IN (1 | FPI_USB_ENDPOINT_IN) -#define EP_OUT (2 | FPI_USB_ENDPOINT_OUT) +#define EP_IN (1 | FPI_USB_ENDPOINT_IN) +#define EP_OUT (2 | FPI_USB_ENDPOINT_OUT) #define BULK_TIMEOUT 4000 -#define FINGER_DETECTION_LEN 20 -#define READ_REGS_LEN 126 -#define READ_REGS_RESP_LEN 159 -#define STRIP_CAPTURE_LEN 1705 +#define FINGER_DETECTION_LEN 20 +#define READ_REGS_LEN 126 +#define READ_REGS_RESP_LEN 159 +#define STRIP_CAPTURE_LEN 1705 /* * The AES2501 is an imaging device using a swipe-type sensor. It samples @@ -53,318 +53,345 @@ static void complete_deactivation(FpImageDevice *dev); * images returned from this driver vary in height. */ -#define FRAME_WIDTH 192 -#define FRAME_HEIGHT 16 -#define FRAME_SIZE (FRAME_WIDTH * FRAME_HEIGHT) -#define IMAGE_WIDTH (FRAME_WIDTH + (FRAME_WIDTH / 2)) +#define FRAME_WIDTH 192 +#define FRAME_HEIGHT 16 +#define FRAME_SIZE (FRAME_WIDTH * FRAME_HEIGHT) +#define IMAGE_WIDTH (FRAME_WIDTH + (FRAME_WIDTH / 2)) /* maximum number of frames to read during a scan */ /* FIXME reduce substantially */ -#define MAX_FRAMES 150 +#define MAX_FRAMES 150 /****** GENERAL FUNCTIONS ******/ -struct _FpiDeviceAes2501 { - FpImageDevice parent; +struct _FpiDeviceAes2501 +{ + FpImageDevice parent; - guint8 read_regs_retry_count; - GSList *strips; - size_t strips_len; - gboolean deactivating; - int no_finger_cnt; + guint8 read_regs_retry_count; + GSList *strips; + size_t strips_len; + gboolean deactivating; + int no_finger_cnt; }; -G_DECLARE_FINAL_TYPE(FpiDeviceAes2501, fpi_device_aes2501, FPI, DEVICE_AES2501, - FpImageDevice); -G_DEFINE_TYPE(FpiDeviceAes2501, fpi_device_aes2501, FP_TYPE_IMAGE_DEVICE); +G_DECLARE_FINAL_TYPE (FpiDeviceAes2501, fpi_device_aes2501, FPI, DEVICE_AES2501, + FpImageDevice); +G_DEFINE_TYPE (FpiDeviceAes2501, fpi_device_aes2501, FP_TYPE_IMAGE_DEVICE); static struct fpi_frame_asmbl_ctx assembling_ctx = { - .frame_width = FRAME_WIDTH, - .frame_height = FRAME_HEIGHT, - .image_width = IMAGE_WIDTH, - .get_pixel = aes_get_pixel, + .frame_width = FRAME_WIDTH, + .frame_height = FRAME_HEIGHT, + .image_width = IMAGE_WIDTH, + .get_pixel = aes_get_pixel, }; -typedef void (*aes2501_read_regs_cb)(FpImageDevice *dev, GError *error, - unsigned char *regs, void *user_data); +typedef void (*aes2501_read_regs_cb)(FpImageDevice *dev, + GError *error, + unsigned char *regs, + void *user_data); -struct aes2501_read_regs { - FpImageDevice *dev; - aes2501_read_regs_cb callback; - struct aes_regwrite *regwrite; - void *user_data; +struct aes2501_read_regs +{ + FpImageDevice *dev; + aes2501_read_regs_cb callback; + struct aes_regwrite *regwrite; + void *user_data; }; -static void read_regs_data_cb(FpiUsbTransfer *transfer, FpDevice *dev, - gpointer user_data, GError *error) +static void +read_regs_data_cb (FpiUsbTransfer *transfer, FpDevice *dev, + gpointer user_data, GError *error) { - struct aes2501_read_regs *rdata = user_data; + struct aes2501_read_regs *rdata = user_data; - rdata->callback(rdata->dev, error, transfer->buffer, rdata->user_data); - g_free(rdata); + rdata->callback (rdata->dev, error, transfer->buffer, rdata->user_data); + g_free (rdata); } -static void read_regs_rq_cb(FpImageDevice *dev, GError *error, void *user_data) +static void +read_regs_rq_cb (FpImageDevice *dev, GError *error, void *user_data) { - struct aes2501_read_regs *rdata = user_data; - FpiUsbTransfer *transfer; + struct aes2501_read_regs *rdata = user_data; + FpiUsbTransfer *transfer; - g_free(rdata->regwrite); - if (error) { - rdata->callback(dev, error, NULL, rdata->user_data); - g_free (rdata); - return; - } + g_free (rdata->regwrite); + if (error) + { + rdata->callback (dev, error, NULL, rdata->user_data); + g_free (rdata); + return; + } - transfer = fpi_usb_transfer_new(FP_DEVICE(dev)); - transfer->short_is_error = TRUE; - fpi_usb_transfer_fill_bulk(transfer, EP_IN, READ_REGS_LEN); - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - read_regs_data_cb, rdata); - fpi_usb_transfer_unref(transfer); + transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); + transfer->short_is_error = TRUE; + fpi_usb_transfer_fill_bulk (transfer, EP_IN, READ_REGS_LEN); + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + read_regs_data_cb, rdata); + fpi_usb_transfer_unref (transfer); } -static void read_regs(FpImageDevice *dev, aes2501_read_regs_cb callback, - void *user_data) +static void +read_regs (FpImageDevice *dev, aes2501_read_regs_cb callback, + void *user_data) { - /* FIXME: regwrite is dynamic because of asynchronity. is this really - * required? */ - struct aes_regwrite *regwrite = g_malloc(sizeof(*regwrite)); - struct aes2501_read_regs *rdata = g_malloc(sizeof(*rdata)); + /* FIXME: regwrite is dynamic because of asynchronity. is this really + * required? */ + struct aes_regwrite *regwrite = g_malloc (sizeof (*regwrite)); + struct aes2501_read_regs *rdata = g_malloc (sizeof (*rdata)); - G_DEBUG_HERE(); - regwrite->reg = AES2501_REG_CTRL2; - regwrite->value = AES2501_CTRL2_READ_REGS; - rdata->dev = dev; - rdata->callback = callback; - rdata->user_data = user_data; - rdata->regwrite = regwrite; + G_DEBUG_HERE (); + regwrite->reg = AES2501_REG_CTRL2; + regwrite->value = AES2501_CTRL2_READ_REGS; + rdata->dev = dev; + rdata->callback = callback; + rdata->user_data = user_data; + rdata->regwrite = regwrite; - aes_write_regv(dev, (const struct aes_regwrite *) regwrite, 1, - read_regs_rq_cb, rdata); + aes_write_regv (dev, (const struct aes_regwrite *) regwrite, 1, + read_regs_rq_cb, rdata); } /* Read the value of a specific register from a register dump */ -static int regval_from_dump(unsigned char *data, guint8 target) +static int +regval_from_dump (unsigned char *data, guint8 target) { - if (*data != FIRST_AES2501_REG) { - fp_err("not a register dump"); - return -1; - } + if (*data != FIRST_AES2501_REG) + { + fp_err ("not a register dump"); + return -1; + } - if (!(FIRST_AES2501_REG <= target && target <= LAST_AES2501_REG)) { - fp_err("out of range"); - return -1; - } + if (!(FIRST_AES2501_REG <= target && target <= LAST_AES2501_REG)) + { + fp_err ("out of range"); + return -1; + } - target -= FIRST_AES2501_REG; - target *= 2; - return data[target + 1]; + target -= FIRST_AES2501_REG; + target *= 2; + return data[target + 1]; } -static void generic_write_regv_cb(FpImageDevice *dev, GError *error, - void *user_data) +static void +generic_write_regv_cb (FpImageDevice *dev, GError *error, + void *user_data) { - FpiSsm *ssm = user_data; - if (!error) - fpi_ssm_next_state(ssm); - else - fpi_ssm_mark_failed(ssm, error); + FpiSsm *ssm = user_data; + + if (!error) + fpi_ssm_next_state (ssm); + else + fpi_ssm_mark_failed (ssm, error); } /* check that read succeeded but ignore all data */ -static void generic_ignore_data_cb(FpiUsbTransfer *transfer, FpDevice *dev, - gpointer user_data, GError *error) +static void +generic_ignore_data_cb (FpiUsbTransfer *transfer, FpDevice *dev, + gpointer user_data, GError *error) { - FpiSsm *ssm = transfer->ssm; - if (error) - fpi_ssm_mark_failed(ssm, error); - else - fpi_ssm_next_state(ssm); + FpiSsm *ssm = transfer->ssm; + + if (error) + fpi_ssm_mark_failed (ssm, error); + else + fpi_ssm_next_state (ssm); } /* read the specified number of bytes from the IN endpoint but throw them * away, then increment the SSM */ -static void generic_read_ignore_data(FpiSsm *ssm, FpDevice *dev, - size_t bytes) +static void +generic_read_ignore_data (FpiSsm *ssm, FpDevice *dev, + size_t bytes) { - FpiUsbTransfer *transfer; + FpiUsbTransfer *transfer; - transfer = fpi_usb_transfer_new(dev); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_fill_bulk(transfer, EP_IN, bytes); - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - generic_ignore_data_cb, NULL); - fpi_usb_transfer_unref(transfer); + transfer = fpi_usb_transfer_new (dev); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_fill_bulk (transfer, EP_IN, bytes); + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + generic_ignore_data_cb, NULL); + fpi_usb_transfer_unref (transfer); } /****** IMAGE PROCESSING ******/ -static int sum_histogram_values(unsigned char *data, guint8 threshold) +static int +sum_histogram_values (unsigned char *data, guint8 threshold) { - int r = 0; - int i; - guint16 *histogram = (guint16 *)(data + 1); + int r = 0; + int i; + guint16 *histogram = (guint16 *) (data + 1); - if (*data != 0xde) - return -1; + if (*data != 0xde) + return -1; - if (threshold > 0x0f) - return -1; + if (threshold > 0x0f) + return -1; - /* FIXME endianness */ - for (i = threshold; i < 16; i++) - r += histogram[i]; - - return r; + /* FIXME endianness */ + for (i = threshold; i < 16; i++) + r += histogram[i]; + + return r; } /****** FINGER PRESENCE DETECTION ******/ static const struct aes_regwrite finger_det_reqs[] = { - { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, - { AES2501_REG_EXCITCTRL, 0x40 }, - { AES2501_REG_DETCTRL, - AES2501_DETCTRL_DRATE_CONTINUOUS | AES2501_DETCTRL_SDELAY_31_MS }, - { AES2501_REG_COLSCAN, AES2501_COLSCAN_SRATE_128_US }, - { AES2501_REG_MEASDRV, AES2501_MEASDRV_MDRIVE_0_325 | AES2501_MEASDRV_MEASURE_SQUARE }, - { AES2501_REG_MEASFREQ, AES2501_MEASFREQ_2M }, - { AES2501_REG_DEMODPHASE1, DEMODPHASE_NONE }, - { AES2501_REG_DEMODPHASE2, DEMODPHASE_NONE }, - { AES2501_REG_CHANGAIN, - AES2501_CHANGAIN_STAGE2_4X | AES2501_CHANGAIN_STAGE1_16X }, - { AES2501_REG_ADREFHI, 0x44 }, - { AES2501_REG_ADREFLO, 0x34 }, - { AES2501_REG_STRTCOL, 0x16 }, - { AES2501_REG_ENDCOL, 0x16 }, - { AES2501_REG_DATFMT, AES2501_DATFMT_BIN_IMG | 0x08 }, - { AES2501_REG_TREG1, 0x70 }, - { 0xa2, 0x02 }, - { 0xa7, 0x00 }, - { AES2501_REG_TREGC, AES2501_TREGC_ENABLE }, - { AES2501_REG_TREGD, 0x1a }, - { 0, 0 }, - { AES2501_REG_CTRL1, AES2501_CTRL1_REG_UPDATE }, - { AES2501_REG_CTRL2, AES2501_CTRL2_SET_ONE_SHOT }, - { AES2501_REG_LPONT, AES2501_LPONT_MIN_VALUE }, + { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, + { AES2501_REG_EXCITCTRL, 0x40 }, + { AES2501_REG_DETCTRL, + AES2501_DETCTRL_DRATE_CONTINUOUS | AES2501_DETCTRL_SDELAY_31_MS }, + { AES2501_REG_COLSCAN, AES2501_COLSCAN_SRATE_128_US }, + { AES2501_REG_MEASDRV, AES2501_MEASDRV_MDRIVE_0_325 | AES2501_MEASDRV_MEASURE_SQUARE }, + { AES2501_REG_MEASFREQ, AES2501_MEASFREQ_2M }, + { AES2501_REG_DEMODPHASE1, DEMODPHASE_NONE }, + { AES2501_REG_DEMODPHASE2, DEMODPHASE_NONE }, + { AES2501_REG_CHANGAIN, + AES2501_CHANGAIN_STAGE2_4X | AES2501_CHANGAIN_STAGE1_16X }, + { AES2501_REG_ADREFHI, 0x44 }, + { AES2501_REG_ADREFLO, 0x34 }, + { AES2501_REG_STRTCOL, 0x16 }, + { AES2501_REG_ENDCOL, 0x16 }, + { AES2501_REG_DATFMT, AES2501_DATFMT_BIN_IMG | 0x08 }, + { AES2501_REG_TREG1, 0x70 }, + { 0xa2, 0x02 }, + { 0xa7, 0x00 }, + { AES2501_REG_TREGC, AES2501_TREGC_ENABLE }, + { AES2501_REG_TREGD, 0x1a }, + { 0, 0 }, + { AES2501_REG_CTRL1, AES2501_CTRL1_REG_UPDATE }, + { AES2501_REG_CTRL2, AES2501_CTRL2_SET_ONE_SHOT }, + { AES2501_REG_LPONT, AES2501_LPONT_MIN_VALUE }, }; -static void start_finger_detection(FpImageDevice *dev); +static void start_finger_detection (FpImageDevice *dev); -static void finger_det_data_cb(FpiUsbTransfer *transfer, FpDevice *_dev, - gpointer user_data, GError *error) +static void +finger_det_data_cb (FpiUsbTransfer *transfer, FpDevice *_dev, + gpointer user_data, GError *error) { - FpImageDevice *dev = FP_IMAGE_DEVICE(_dev); - unsigned char *data = transfer->buffer; - int i; - int sum = 0; + FpImageDevice *dev = FP_IMAGE_DEVICE (_dev); + unsigned char *data = transfer->buffer; + int i; + int sum = 0; - if (error) { - fpi_image_device_session_error(dev, error); - return; - } + if (error) + { + fpi_image_device_session_error (dev, error); + return; + } - /* examine histogram to determine finger presence */ - for (i = 1; i < 9; i++) - sum += (data[i] & 0xf) + (data[i] >> 4); - if (sum > 20) { - /* finger present, start capturing */ - fpi_image_device_report_finger_status(dev, TRUE); - start_capture(dev); - } else { - /* no finger, poll for a new histogram */ - start_finger_detection(dev); - } + /* examine histogram to determine finger presence */ + for (i = 1; i < 9; i++) + sum += (data[i] & 0xf) + (data[i] >> 4); + if (sum > 20) + { + /* finger present, start capturing */ + fpi_image_device_report_finger_status (dev, TRUE); + start_capture (dev); + } + else + { + /* no finger, poll for a new histogram */ + start_finger_detection (dev); + } } -static void finger_det_reqs_cb(FpImageDevice *dev, GError *error, - void *user_data) +static void +finger_det_reqs_cb (FpImageDevice *dev, GError *error, + void *user_data) { - FpiUsbTransfer *transfer; + FpiUsbTransfer *transfer; - if (error) { - fpi_image_device_session_error (dev, error); - return; - } + if (error) + { + fpi_image_device_session_error (dev, error); + return; + } - transfer = fpi_usb_transfer_new(FP_DEVICE(dev)); - transfer->short_is_error = TRUE; - fpi_usb_transfer_fill_bulk(transfer, EP_IN, FINGER_DETECTION_LEN); - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - finger_det_data_cb, NULL); - fpi_usb_transfer_unref(transfer); + transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); + transfer->short_is_error = TRUE; + fpi_usb_transfer_fill_bulk (transfer, EP_IN, FINGER_DETECTION_LEN); + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + finger_det_data_cb, NULL); + fpi_usb_transfer_unref (transfer); } -static void start_finger_detection(FpImageDevice *dev) +static void +start_finger_detection (FpImageDevice *dev) { - FpiDeviceAes2501 *self = FPI_DEVICE_AES2501(dev); - G_DEBUG_HERE(); + FpiDeviceAes2501 *self = FPI_DEVICE_AES2501 (dev); - if (self->deactivating) { - complete_deactivation(dev); - return; - } + G_DEBUG_HERE (); - aes_write_regv(dev, finger_det_reqs, G_N_ELEMENTS(finger_det_reqs), - finger_det_reqs_cb, NULL); + if (self->deactivating) + { + complete_deactivation (dev); + return; + } + + aes_write_regv (dev, finger_det_reqs, G_N_ELEMENTS (finger_det_reqs), + finger_det_reqs_cb, NULL); } /****** CAPTURE ******/ static const struct aes_regwrite capture_reqs_1[] = { - { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, - { 0, 0 }, - { AES2501_REG_EXCITCTRL, 0x40 }, - { AES2501_REG_DETCTRL, - AES2501_DETCTRL_SDELAY_31_MS | AES2501_DETCTRL_DRATE_CONTINUOUS }, - { AES2501_REG_COLSCAN, AES2501_COLSCAN_SRATE_128_US }, - { AES2501_REG_DEMODPHASE2, 0x7c }, - { AES2501_REG_MEASDRV, - AES2501_MEASDRV_MEASURE_SQUARE | AES2501_MEASDRV_MDRIVE_0_325 }, - { AES2501_REG_DEMODPHASE1, 0x24 }, - { AES2501_REG_CHWORD1, 0x00 }, - { AES2501_REG_CHWORD2, 0x6c }, - { AES2501_REG_CHWORD3, 0x09 }, - { AES2501_REG_CHWORD4, 0x54 }, - { AES2501_REG_CHWORD5, 0x78 }, - { 0xa2, 0x02 }, - { 0xa7, 0x00 }, - { 0xb6, 0x26 }, - { 0xb7, 0x1a }, - { AES2501_REG_CTRL1, AES2501_CTRL1_REG_UPDATE }, - { AES2501_REG_IMAGCTRL, - AES2501_IMAGCTRL_TST_REG_ENABLE | AES2501_IMAGCTRL_HISTO_DATA_ENABLE | - AES2501_IMAGCTRL_IMG_DATA_DISABLE }, - { AES2501_REG_STRTCOL, 0x10 }, - { AES2501_REG_ENDCOL, 0x1f }, - { AES2501_REG_CHANGAIN, - AES2501_CHANGAIN_STAGE1_2X | AES2501_CHANGAIN_STAGE2_2X }, - { AES2501_REG_ADREFHI, 0x70 }, - { AES2501_REG_ADREFLO, 0x20 }, - { AES2501_REG_CTRL2, AES2501_CTRL2_SET_ONE_SHOT }, - { AES2501_REG_LPONT, AES2501_LPONT_MIN_VALUE }, + { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, + { 0, 0 }, + { AES2501_REG_EXCITCTRL, 0x40 }, + { AES2501_REG_DETCTRL, + AES2501_DETCTRL_SDELAY_31_MS | AES2501_DETCTRL_DRATE_CONTINUOUS }, + { AES2501_REG_COLSCAN, AES2501_COLSCAN_SRATE_128_US }, + { AES2501_REG_DEMODPHASE2, 0x7c }, + { AES2501_REG_MEASDRV, + AES2501_MEASDRV_MEASURE_SQUARE | AES2501_MEASDRV_MDRIVE_0_325 }, + { AES2501_REG_DEMODPHASE1, 0x24 }, + { AES2501_REG_CHWORD1, 0x00 }, + { AES2501_REG_CHWORD2, 0x6c }, + { AES2501_REG_CHWORD3, 0x09 }, + { AES2501_REG_CHWORD4, 0x54 }, + { AES2501_REG_CHWORD5, 0x78 }, + { 0xa2, 0x02 }, + { 0xa7, 0x00 }, + { 0xb6, 0x26 }, + { 0xb7, 0x1a }, + { AES2501_REG_CTRL1, AES2501_CTRL1_REG_UPDATE }, + { AES2501_REG_IMAGCTRL, + AES2501_IMAGCTRL_TST_REG_ENABLE | AES2501_IMAGCTRL_HISTO_DATA_ENABLE | + AES2501_IMAGCTRL_IMG_DATA_DISABLE }, + { AES2501_REG_STRTCOL, 0x10 }, + { AES2501_REG_ENDCOL, 0x1f }, + { AES2501_REG_CHANGAIN, + AES2501_CHANGAIN_STAGE1_2X | AES2501_CHANGAIN_STAGE2_2X }, + { AES2501_REG_ADREFHI, 0x70 }, + { AES2501_REG_ADREFLO, 0x20 }, + { AES2501_REG_CTRL2, AES2501_CTRL2_SET_ONE_SHOT }, + { AES2501_REG_LPONT, AES2501_LPONT_MIN_VALUE }, }; static const struct aes_regwrite capture_reqs_2[] = { - { AES2501_REG_IMAGCTRL, - AES2501_IMAGCTRL_TST_REG_ENABLE | AES2501_IMAGCTRL_HISTO_DATA_ENABLE | - AES2501_IMAGCTRL_IMG_DATA_DISABLE }, - { AES2501_REG_STRTCOL, 0x10 }, - { AES2501_REG_ENDCOL, 0x1f }, - { AES2501_REG_CHANGAIN, AES2501_CHANGAIN_STAGE1_16X }, - { AES2501_REG_ADREFHI, 0x70 }, - { AES2501_REG_ADREFLO, 0x20 }, - { AES2501_REG_CTRL2, AES2501_CTRL2_SET_ONE_SHOT }, + { AES2501_REG_IMAGCTRL, + AES2501_IMAGCTRL_TST_REG_ENABLE | AES2501_IMAGCTRL_HISTO_DATA_ENABLE | + AES2501_IMAGCTRL_IMG_DATA_DISABLE }, + { AES2501_REG_STRTCOL, 0x10 }, + { AES2501_REG_ENDCOL, 0x1f }, + { AES2501_REG_CHANGAIN, AES2501_CHANGAIN_STAGE1_16X }, + { AES2501_REG_ADREFHI, 0x70 }, + { AES2501_REG_ADREFLO, 0x20 }, + { AES2501_REG_CTRL2, AES2501_CTRL2_SET_ONE_SHOT }, }; static struct aes_regwrite strip_scan_reqs[] = { - { AES2501_REG_IMAGCTRL, - AES2501_IMAGCTRL_TST_REG_ENABLE | AES2501_IMAGCTRL_HISTO_DATA_ENABLE }, - { AES2501_REG_STRTCOL, 0x00 }, - { AES2501_REG_ENDCOL, 0x2f }, - { AES2501_REG_CHANGAIN, AES2501_CHANGAIN_STAGE1_16X }, - { AES2501_REG_ADREFHI, AES2501_ADREFHI_MAX_VALUE }, - { AES2501_REG_ADREFLO, 0x20 }, - { AES2501_REG_CTRL2, AES2501_CTRL2_SET_ONE_SHOT }, + { AES2501_REG_IMAGCTRL, + AES2501_IMAGCTRL_TST_REG_ENABLE | AES2501_IMAGCTRL_HISTO_DATA_ENABLE }, + { AES2501_REG_STRTCOL, 0x00 }, + { AES2501_REG_ENDCOL, 0x2f }, + { AES2501_REG_CHANGAIN, AES2501_CHANGAIN_STAGE1_16X }, + { AES2501_REG_ADREFHI, AES2501_ADREFHI_MAX_VALUE }, + { AES2501_REG_ADREFLO, 0x20 }, + { AES2501_REG_CTRL2, AES2501_CTRL2_SET_ONE_SHOT }, }; /* capture SM movement: @@ -374,448 +401,502 @@ static struct aes_regwrite strip_scan_reqs[] = { * report lack of finger presence, and move to finger detection */ enum capture_states { - CAPTURE_WRITE_REQS_1, - CAPTURE_READ_DATA_1, - CAPTURE_WRITE_REQS_2, - CAPTURE_READ_DATA_2, - CAPTURE_REQUEST_STRIP, - CAPTURE_READ_STRIP, - CAPTURE_NUM_STATES, + CAPTURE_WRITE_REQS_1, + CAPTURE_READ_DATA_1, + CAPTURE_WRITE_REQS_2, + CAPTURE_READ_DATA_2, + CAPTURE_REQUEST_STRIP, + CAPTURE_READ_STRIP, + CAPTURE_NUM_STATES, }; -static void capture_read_strip_cb(FpiUsbTransfer *transfer, FpDevice *_dev, - gpointer user_data, GError *error) +static void +capture_read_strip_cb (FpiUsbTransfer *transfer, FpDevice *_dev, + gpointer user_data, GError *error) { - FpiSsm *ssm = transfer->ssm; - unsigned char *stripdata; - FpImageDevice *dev = FP_IMAGE_DEVICE(_dev); - FpiDeviceAes2501 *self = FPI_DEVICE_AES2501(_dev); - unsigned char *data = transfer->buffer; - int sum; - int threshold; + FpiSsm *ssm = transfer->ssm; + unsigned char *stripdata; + FpImageDevice *dev = FP_IMAGE_DEVICE (_dev); + FpiDeviceAes2501 *self = FPI_DEVICE_AES2501 (_dev); + unsigned char *data = transfer->buffer; + int sum; + int threshold; - if (error) { - fpi_ssm_mark_failed(ssm, error); - return; - } + if (error) + { + fpi_ssm_mark_failed (ssm, error); + return; + } - threshold = regval_from_dump(data + 1 + 192*8 + 1 + 16*2 + 1 + 8, - AES2501_REG_DATFMT); - if (threshold < 0) { - fpi_ssm_mark_failed(ssm, - fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); - return; - } + threshold = regval_from_dump (data + 1 + 192 * 8 + 1 + 16 * 2 + 1 + 8, + AES2501_REG_DATFMT); + if (threshold < 0) + { + fpi_ssm_mark_failed (ssm, + fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + return; + } - sum = sum_histogram_values(data + 1 + 192*8, threshold & 0x0f); - if (sum < 0) { - fpi_ssm_mark_failed(ssm, - fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); - return; - } - fp_dbg("sum=%d", sum); + sum = sum_histogram_values (data + 1 + 192 * 8, threshold & 0x0f); + if (sum < 0) + { + fpi_ssm_mark_failed (ssm, + fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + return; + } + fp_dbg ("sum=%d", sum); - if (sum < AES2501_SUM_LOW_THRESH) { - strip_scan_reqs[4].value -= 0x8; - if (strip_scan_reqs[4].value < AES2501_ADREFHI_MIN_VALUE) - strip_scan_reqs[4].value = AES2501_ADREFHI_MIN_VALUE; - } else if (sum > AES2501_SUM_HIGH_THRESH) { - strip_scan_reqs[4].value += 0x8; - if (strip_scan_reqs[4].value > AES2501_ADREFHI_MAX_VALUE) - strip_scan_reqs[4].value = AES2501_ADREFHI_MAX_VALUE; - } - fp_dbg("ADREFHI is %.2x", strip_scan_reqs[4].value); + if (sum < AES2501_SUM_LOW_THRESH) + { + strip_scan_reqs[4].value -= 0x8; + if (strip_scan_reqs[4].value < AES2501_ADREFHI_MIN_VALUE) + strip_scan_reqs[4].value = AES2501_ADREFHI_MIN_VALUE; + } + else if (sum > AES2501_SUM_HIGH_THRESH) + { + strip_scan_reqs[4].value += 0x8; + if (strip_scan_reqs[4].value > AES2501_ADREFHI_MAX_VALUE) + strip_scan_reqs[4].value = AES2501_ADREFHI_MAX_VALUE; + } + fp_dbg ("ADREFHI is %.2x", strip_scan_reqs[4].value); - /* Sum is 0, maybe finger was removed? Wait for 3 empty frames - * to ensure - */ - if (sum == 0) { - self->no_finger_cnt++; - if (self->no_finger_cnt == 3) { - FpImage *img; + /* Sum is 0, maybe finger was removed? Wait for 3 empty frames + * to ensure + */ + if (sum == 0) + { + self->no_finger_cnt++; + if (self->no_finger_cnt == 3) + { + FpImage *img; - self->strips = g_slist_reverse(self->strips); - fpi_do_movement_estimation(&assembling_ctx, self->strips); - img = fpi_assemble_frames(&assembling_ctx, - self->strips); - g_slist_free_full(self->strips, g_free); - self->strips = NULL; - self->strips_len = 0; - fpi_image_device_image_captured(dev, img); - fpi_image_device_report_finger_status(dev, FALSE); - /* marking machine complete will re-trigger finger detection loop */ - fpi_ssm_mark_completed(ssm); - } else { - fpi_ssm_jump_to_state(ssm, CAPTURE_REQUEST_STRIP); - } - } else { - /* obtain next strip */ - /* FIXME: would preallocating strip buffers be a decent optimization? */ - struct fpi_frame *stripe = g_malloc(FRAME_WIDTH * FRAME_HEIGHT / 2 + sizeof(struct fpi_frame)); - stripe->delta_x = 0; - stripe->delta_y = 0; - stripdata = stripe->data; - memcpy(stripdata, data + 1, 192*8); - self->no_finger_cnt = 0; - self->strips = g_slist_prepend(self->strips, stripe); - self->strips_len++; + self->strips = g_slist_reverse (self->strips); + fpi_do_movement_estimation (&assembling_ctx, self->strips); + img = fpi_assemble_frames (&assembling_ctx, + self->strips); + g_slist_free_full (self->strips, g_free); + self->strips = NULL; + self->strips_len = 0; + fpi_image_device_image_captured (dev, img); + fpi_image_device_report_finger_status (dev, FALSE); + /* marking machine complete will re-trigger finger detection loop */ + fpi_ssm_mark_completed (ssm); + } + else + { + fpi_ssm_jump_to_state (ssm, CAPTURE_REQUEST_STRIP); + } + } + else + { + /* obtain next strip */ + /* FIXME: would preallocating strip buffers be a decent optimization? */ + struct fpi_frame *stripe = g_malloc (FRAME_WIDTH * FRAME_HEIGHT / 2 + sizeof (struct fpi_frame)); + stripe->delta_x = 0; + stripe->delta_y = 0; + stripdata = stripe->data; + memcpy (stripdata, data + 1, 192 * 8); + self->no_finger_cnt = 0; + self->strips = g_slist_prepend (self->strips, stripe); + self->strips_len++; - fpi_ssm_jump_to_state(ssm, CAPTURE_REQUEST_STRIP); - } + fpi_ssm_jump_to_state (ssm, CAPTURE_REQUEST_STRIP); + } } -static void capture_run_state(FpiSsm *ssm, FpDevice *device, void *user_data) +static void +capture_run_state (FpiSsm *ssm, FpDevice *device, void *user_data) { - FpImageDevice *dev = user_data; - FpiDeviceAes2501 *self = FPI_DEVICE_AES2501(device); + FpImageDevice *dev = user_data; + FpiDeviceAes2501 *self = FPI_DEVICE_AES2501 (device); - switch (fpi_ssm_get_cur_state(ssm)) { - case CAPTURE_WRITE_REQS_1: - aes_write_regv(dev, capture_reqs_1, G_N_ELEMENTS(capture_reqs_1), - generic_write_regv_cb, ssm); - break; - case CAPTURE_READ_DATA_1: - generic_read_ignore_data(ssm, device, READ_REGS_RESP_LEN); - break; - case CAPTURE_WRITE_REQS_2: - aes_write_regv(dev, capture_reqs_2, G_N_ELEMENTS(capture_reqs_2), - generic_write_regv_cb, ssm); - break; - case CAPTURE_READ_DATA_2: - generic_read_ignore_data(ssm, device, READ_REGS_RESP_LEN); - break; - case CAPTURE_REQUEST_STRIP: - if (self->deactivating) - fpi_ssm_mark_completed(ssm); - else - aes_write_regv(dev, strip_scan_reqs, G_N_ELEMENTS(strip_scan_reqs), - generic_write_regv_cb, ssm); - break; - case CAPTURE_READ_STRIP: { - FpiUsbTransfer *transfer; + switch (fpi_ssm_get_cur_state (ssm)) + { + case CAPTURE_WRITE_REQS_1: + aes_write_regv (dev, capture_reqs_1, G_N_ELEMENTS (capture_reqs_1), + generic_write_regv_cb, ssm); + break; - transfer = fpi_usb_transfer_new(device); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_fill_bulk(transfer, EP_IN, STRIP_CAPTURE_LEN); - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - capture_read_strip_cb, NULL); - fpi_usb_transfer_unref(transfer); - break; - } - }; + case CAPTURE_READ_DATA_1: + generic_read_ignore_data (ssm, device, READ_REGS_RESP_LEN); + break; + + case CAPTURE_WRITE_REQS_2: + aes_write_regv (dev, capture_reqs_2, G_N_ELEMENTS (capture_reqs_2), + generic_write_regv_cb, ssm); + break; + + case CAPTURE_READ_DATA_2: + generic_read_ignore_data (ssm, device, READ_REGS_RESP_LEN); + break; + + case CAPTURE_REQUEST_STRIP: + if (self->deactivating) + fpi_ssm_mark_completed (ssm); + else + aes_write_regv (dev, strip_scan_reqs, G_N_ELEMENTS (strip_scan_reqs), + generic_write_regv_cb, ssm); + break; + + case CAPTURE_READ_STRIP: { + FpiUsbTransfer *transfer; + + transfer = fpi_usb_transfer_new (device); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_fill_bulk (transfer, EP_IN, STRIP_CAPTURE_LEN); + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + capture_read_strip_cb, NULL); + fpi_usb_transfer_unref (transfer); + break; + } + } + ; } -static void capture_sm_complete(FpiSsm *ssm, FpDevice *_dev, void *user_data, - GError *error) +static void +capture_sm_complete (FpiSsm *ssm, FpDevice *_dev, void *user_data, + GError *error) { - FpImageDevice *dev = user_data; - FpiDeviceAes2501 *self = FPI_DEVICE_AES2501(_dev); + FpImageDevice *dev = user_data; + FpiDeviceAes2501 *self = FPI_DEVICE_AES2501 (_dev); - G_DEBUG_HERE(); + G_DEBUG_HERE (); - if (self->deactivating) { - complete_deactivation(dev); - g_clear_pointer (&error, g_error_free); - } else if (error) { - fpi_image_device_session_error(dev, error); - } else { - start_finger_detection(dev); - } - fpi_ssm_free(ssm); + if (self->deactivating) + { + complete_deactivation (dev); + g_clear_pointer (&error, g_error_free); + } + else if (error) + { + fpi_image_device_session_error (dev, error); + } + else + { + start_finger_detection (dev); + } + fpi_ssm_free (ssm); } -static void start_capture(FpImageDevice *dev) +static void +start_capture (FpImageDevice *dev) { - FpiDeviceAes2501 *self = FPI_DEVICE_AES2501(dev); - FpiSsm *ssm; + FpiDeviceAes2501 *self = FPI_DEVICE_AES2501 (dev); + FpiSsm *ssm; - if (self->deactivating) { - complete_deactivation(dev); - return; - } + if (self->deactivating) + { + complete_deactivation (dev); + return; + } - self->no_finger_cnt = 0; - /* Reset gain */ - strip_scan_reqs[4].value = AES2501_ADREFHI_MAX_VALUE; - ssm = fpi_ssm_new(FP_DEVICE(dev), capture_run_state, - CAPTURE_NUM_STATES, dev); - G_DEBUG_HERE(); - fpi_ssm_start(ssm, capture_sm_complete); + self->no_finger_cnt = 0; + /* Reset gain */ + strip_scan_reqs[4].value = AES2501_ADREFHI_MAX_VALUE; + ssm = fpi_ssm_new (FP_DEVICE (dev), capture_run_state, + CAPTURE_NUM_STATES, dev); + G_DEBUG_HERE (); + fpi_ssm_start (ssm, capture_sm_complete); } /****** INITIALIZATION/DEINITIALIZATION ******/ static const struct aes_regwrite init_1[] = { - { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, - { 0, 0 }, - { 0xb0, 0x27 }, /* Reserved? */ - { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, - { AES2501_REG_EXCITCTRL, 0x40 }, - { 0xff, 0x00 }, /* Reserved? */ - { 0xff, 0x00 }, /* Reserved? */ - { 0xff, 0x00 }, /* Reserved? */ - { 0xff, 0x00 }, /* Reserved? */ - { 0xff, 0x00 }, /* Reserved? */ - { 0xff, 0x00 }, /* Reserved? */ - { 0xff, 0x00 }, /* Reserved? */ - { 0xff, 0x00 }, /* Reserved? */ - { 0xff, 0x00 }, /* Reserved? */ - { 0xff, 0x00 }, /* Reserved? */ - { 0xff, 0x00 }, /* Reserved? */ - { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, - { AES2501_REG_EXCITCTRL, 0x40 }, - { AES2501_REG_DETCTRL, - AES2501_DETCTRL_DRATE_CONTINUOUS | AES2501_DETCTRL_SDELAY_31_MS }, - { AES2501_REG_COLSCAN, AES2501_COLSCAN_SRATE_128_US }, - { AES2501_REG_MEASDRV, - AES2501_MEASDRV_MDRIVE_0_325 | AES2501_MEASDRV_MEASURE_SQUARE }, - { AES2501_REG_MEASFREQ, AES2501_MEASFREQ_2M }, - { AES2501_REG_DEMODPHASE1, DEMODPHASE_NONE }, - { AES2501_REG_DEMODPHASE2, DEMODPHASE_NONE }, - { AES2501_REG_CHANGAIN, - AES2501_CHANGAIN_STAGE2_4X | AES2501_CHANGAIN_STAGE1_16X }, - { AES2501_REG_ADREFHI, 0x44 }, - { AES2501_REG_ADREFLO, 0x34 }, - { AES2501_REG_STRTCOL, 0x16 }, - { AES2501_REG_ENDCOL, 0x16 }, - { AES2501_REG_DATFMT, AES2501_DATFMT_BIN_IMG | 0x08 }, - { AES2501_REG_TREG1, 0x70 }, - { 0xa2, 0x02 }, - { 0xa7, 0x00 }, - { AES2501_REG_TREGC, AES2501_TREGC_ENABLE }, - { AES2501_REG_TREGD, 0x1a }, - { AES2501_REG_CTRL1, AES2501_CTRL1_REG_UPDATE }, - { AES2501_REG_CTRL2, AES2501_CTRL2_SET_ONE_SHOT }, - { AES2501_REG_LPONT, AES2501_LPONT_MIN_VALUE }, + { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, + { 0, 0 }, + { 0xb0, 0x27 }, /* Reserved? */ + { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, + { AES2501_REG_EXCITCTRL, 0x40 }, + { 0xff, 0x00 }, /* Reserved? */ + { 0xff, 0x00 }, /* Reserved? */ + { 0xff, 0x00 }, /* Reserved? */ + { 0xff, 0x00 }, /* Reserved? */ + { 0xff, 0x00 }, /* Reserved? */ + { 0xff, 0x00 }, /* Reserved? */ + { 0xff, 0x00 }, /* Reserved? */ + { 0xff, 0x00 }, /* Reserved? */ + { 0xff, 0x00 }, /* Reserved? */ + { 0xff, 0x00 }, /* Reserved? */ + { 0xff, 0x00 }, /* Reserved? */ + { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, + { AES2501_REG_EXCITCTRL, 0x40 }, + { AES2501_REG_DETCTRL, + AES2501_DETCTRL_DRATE_CONTINUOUS | AES2501_DETCTRL_SDELAY_31_MS }, + { AES2501_REG_COLSCAN, AES2501_COLSCAN_SRATE_128_US }, + { AES2501_REG_MEASDRV, + AES2501_MEASDRV_MDRIVE_0_325 | AES2501_MEASDRV_MEASURE_SQUARE }, + { AES2501_REG_MEASFREQ, AES2501_MEASFREQ_2M }, + { AES2501_REG_DEMODPHASE1, DEMODPHASE_NONE }, + { AES2501_REG_DEMODPHASE2, DEMODPHASE_NONE }, + { AES2501_REG_CHANGAIN, + AES2501_CHANGAIN_STAGE2_4X | AES2501_CHANGAIN_STAGE1_16X }, + { AES2501_REG_ADREFHI, 0x44 }, + { AES2501_REG_ADREFLO, 0x34 }, + { AES2501_REG_STRTCOL, 0x16 }, + { AES2501_REG_ENDCOL, 0x16 }, + { AES2501_REG_DATFMT, AES2501_DATFMT_BIN_IMG | 0x08 }, + { AES2501_REG_TREG1, 0x70 }, + { 0xa2, 0x02 }, + { 0xa7, 0x00 }, + { AES2501_REG_TREGC, AES2501_TREGC_ENABLE }, + { AES2501_REG_TREGD, 0x1a }, + { AES2501_REG_CTRL1, AES2501_CTRL1_REG_UPDATE }, + { AES2501_REG_CTRL2, AES2501_CTRL2_SET_ONE_SHOT }, + { AES2501_REG_LPONT, AES2501_LPONT_MIN_VALUE }, }; static const struct aes_regwrite init_2[] = { - { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, - { AES2501_REG_EXCITCTRL, 0x40 }, - { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, - { AES2501_REG_AUTOCALOFFSET, 0x41 }, - { AES2501_REG_EXCITCTRL, 0x42 }, - { AES2501_REG_DETCTRL, 0x53 }, - { AES2501_REG_CTRL1, AES2501_CTRL1_REG_UPDATE }, + { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, + { AES2501_REG_EXCITCTRL, 0x40 }, + { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, + { AES2501_REG_AUTOCALOFFSET, 0x41 }, + { AES2501_REG_EXCITCTRL, 0x42 }, + { AES2501_REG_DETCTRL, 0x53 }, + { AES2501_REG_CTRL1, AES2501_CTRL1_REG_UPDATE }, }; static const struct aes_regwrite init_3[] = { - { 0xff, 0x00 }, - { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, - { AES2501_REG_AUTOCALOFFSET, 0x41 }, - { AES2501_REG_EXCITCTRL, 0x42 }, - { AES2501_REG_DETCTRL, 0x53 }, - { AES2501_REG_CTRL1, AES2501_CTRL1_REG_UPDATE }, + { 0xff, 0x00 }, + { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, + { AES2501_REG_AUTOCALOFFSET, 0x41 }, + { AES2501_REG_EXCITCTRL, 0x42 }, + { AES2501_REG_DETCTRL, 0x53 }, + { AES2501_REG_CTRL1, AES2501_CTRL1_REG_UPDATE }, }; static const struct aes_regwrite init_4[] = { - { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, - { AES2501_REG_EXCITCTRL, 0x40 }, - { 0xb0, 0x27 }, - { AES2501_REG_ENDROW, 0x0a }, - { AES2501_REG_CTRL1, AES2501_CTRL1_REG_UPDATE }, - { AES2501_REG_DETCTRL, 0x45 }, - { AES2501_REG_AUTOCALOFFSET, 0x41 }, + { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, + { AES2501_REG_EXCITCTRL, 0x40 }, + { 0xb0, 0x27 }, + { AES2501_REG_ENDROW, 0x0a }, + { AES2501_REG_CTRL1, AES2501_CTRL1_REG_UPDATE }, + { AES2501_REG_DETCTRL, 0x45 }, + { AES2501_REG_AUTOCALOFFSET, 0x41 }, }; static const struct aes_regwrite init_5[] = { - { 0xb0, 0x27 }, - { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, - { AES2501_REG_EXCITCTRL, 0x40 }, - { 0xff, 0x00 }, - { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, - { AES2501_REG_EXCITCTRL, 0x40 }, - { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, - { AES2501_REG_EXCITCTRL, 0x40 }, - { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, - { AES2501_REG_EXCITCTRL, 0x40 }, - { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, - { AES2501_REG_EXCITCTRL, 0x40 }, - { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, - { AES2501_REG_EXCITCTRL, 0x40 }, - { AES2501_REG_CTRL1, AES2501_CTRL1_SCAN_RESET }, - { AES2501_REG_CTRL1, AES2501_CTRL1_SCAN_RESET }, + { 0xb0, 0x27 }, + { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, + { AES2501_REG_EXCITCTRL, 0x40 }, + { 0xff, 0x00 }, + { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, + { AES2501_REG_EXCITCTRL, 0x40 }, + { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, + { AES2501_REG_EXCITCTRL, 0x40 }, + { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, + { AES2501_REG_EXCITCTRL, 0x40 }, + { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, + { AES2501_REG_EXCITCTRL, 0x40 }, + { AES2501_REG_CTRL1, AES2501_CTRL1_MASTER_RESET }, + { AES2501_REG_EXCITCTRL, 0x40 }, + { AES2501_REG_CTRL1, AES2501_CTRL1_SCAN_RESET }, + { AES2501_REG_CTRL1, AES2501_CTRL1_SCAN_RESET }, }; enum activate_states { - WRITE_INIT_1, - READ_DATA_1, - WRITE_INIT_2, - READ_REGS, - WRITE_INIT_3, - WRITE_INIT_4, - WRITE_INIT_5, - ACTIVATE_NUM_STATES, + WRITE_INIT_1, + READ_DATA_1, + WRITE_INIT_2, + READ_REGS, + WRITE_INIT_3, + WRITE_INIT_4, + WRITE_INIT_5, + ACTIVATE_NUM_STATES, }; -void activate_read_regs_cb(FpImageDevice *dev, GError *error, - unsigned char *regs, void *user_data) +void +activate_read_regs_cb (FpImageDevice *dev, GError *error, + unsigned char *regs, void *user_data) { - FpiSsm *ssm = user_data; - FpiDeviceAes2501 *self = FPI_DEVICE_AES2501(dev); + FpiSsm *ssm = user_data; + FpiDeviceAes2501 *self = FPI_DEVICE_AES2501 (dev); - if (error) { - fpi_ssm_mark_failed(ssm, error); - } else { - fp_dbg("reg 0xaf = %x", regs[0x5f]); - if (regs[0x5f] != 0x6b || ++self->read_regs_retry_count == 13) - fpi_ssm_jump_to_state(ssm, WRITE_INIT_4); - else - fpi_ssm_next_state(ssm); - } + if (error) + { + fpi_ssm_mark_failed (ssm, error); + } + else + { + fp_dbg ("reg 0xaf = %x", regs[0x5f]); + if (regs[0x5f] != 0x6b || ++self->read_regs_retry_count == 13) + fpi_ssm_jump_to_state (ssm, WRITE_INIT_4); + else + fpi_ssm_next_state (ssm); + } } -static void activate_init3_cb(FpImageDevice *dev, GError *error, - void *user_data) +static void +activate_init3_cb (FpImageDevice *dev, GError *error, + void *user_data) { - FpiSsm *ssm = user_data; - if (!error) - fpi_ssm_jump_to_state(ssm, READ_REGS); - else - fpi_ssm_mark_failed(ssm, error); + FpiSsm *ssm = user_data; + + if (!error) + fpi_ssm_jump_to_state (ssm, READ_REGS); + else + fpi_ssm_mark_failed (ssm, error); } -static void activate_run_state(FpiSsm *ssm, FpDevice *_dev, void *user_data) +static void +activate_run_state (FpiSsm *ssm, FpDevice *_dev, void *user_data) { - FpImageDevice *dev = user_data; + FpImageDevice *dev = user_data; - /* This state machine isn't as linear as it may appear. After doing init1 - * and init2 register configuration writes, we have to poll a register - * waiting for a specific value. READ_REGS checks the register value, and - * if we're ready to move on, we jump to init4. Otherwise, we write init3 - * and then jump back to READ_REGS. In a synchronous model: + /* This state machine isn't as linear as it may appear. After doing init1 + * and init2 register configuration writes, we have to poll a register + * waiting for a specific value. READ_REGS checks the register value, and + * if we're ready to move on, we jump to init4. Otherwise, we write init3 + * and then jump back to READ_REGS. In a synchronous model: - [...] - aes_write_regv(init_2); - read_regs(into buffer); - i = 0; - while (buffer[0x5f] == 0x6b) { - aes_write_regv(init_3); - read_regs(into buffer); - if (++i == 13) - break; - } - aes_write_regv(init_4); - */ + [...] + aes_write_regv(init_2); + read_regs(into buffer); + i = 0; + while (buffer[0x5f] == 0x6b) { + aes_write_regv(init_3); + read_regs(into buffer); + if (++i == 13) + break; + } + aes_write_regv(init_4); + */ - switch (fpi_ssm_get_cur_state(ssm)) { - case WRITE_INIT_1: - aes_write_regv(dev, init_1, G_N_ELEMENTS(init_1), - generic_write_regv_cb, ssm); - break; - case READ_DATA_1: - fp_dbg("read data 1"); - generic_read_ignore_data(ssm, _dev, FINGER_DETECTION_LEN); - break; - case WRITE_INIT_2: - aes_write_regv(dev, init_2, G_N_ELEMENTS(init_2), - generic_write_regv_cb, ssm); - break; - case READ_REGS: - read_regs(dev, activate_read_regs_cb, ssm); - break; - case WRITE_INIT_3: - aes_write_regv(dev, init_3, G_N_ELEMENTS(init_3), - activate_init3_cb, ssm); - break; - case WRITE_INIT_4: - aes_write_regv(dev, init_4, G_N_ELEMENTS(init_4), - generic_write_regv_cb, ssm); - break; - case WRITE_INIT_5: - aes_write_regv(dev, init_5, G_N_ELEMENTS(init_5), - generic_write_regv_cb, ssm); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case WRITE_INIT_1: + aes_write_regv (dev, init_1, G_N_ELEMENTS (init_1), + generic_write_regv_cb, ssm); + break; + + case READ_DATA_1: + fp_dbg ("read data 1"); + generic_read_ignore_data (ssm, _dev, FINGER_DETECTION_LEN); + break; + + case WRITE_INIT_2: + aes_write_regv (dev, init_2, G_N_ELEMENTS (init_2), + generic_write_regv_cb, ssm); + break; + + case READ_REGS: + read_regs (dev, activate_read_regs_cb, ssm); + break; + + case WRITE_INIT_3: + aes_write_regv (dev, init_3, G_N_ELEMENTS (init_3), + activate_init3_cb, ssm); + break; + + case WRITE_INIT_4: + aes_write_regv (dev, init_4, G_N_ELEMENTS (init_4), + generic_write_regv_cb, ssm); + break; + + case WRITE_INIT_5: + aes_write_regv (dev, init_5, G_N_ELEMENTS (init_5), + generic_write_regv_cb, ssm); + break; + } } -static void activate_sm_complete(FpiSsm *ssm, FpDevice *dev, - void *user_data, GError *error) +static void +activate_sm_complete (FpiSsm *ssm, FpDevice *dev, + void *user_data, GError *error) { - fpi_image_device_activate_complete(FP_IMAGE_DEVICE (dev), error); + fpi_image_device_activate_complete (FP_IMAGE_DEVICE (dev), error); - if (!error) - start_finger_detection(FP_IMAGE_DEVICE (dev)); - fpi_ssm_free(ssm); + if (!error) + start_finger_detection (FP_IMAGE_DEVICE (dev)); + fpi_ssm_free (ssm); } -static void dev_activate(FpImageDevice *dev) +static void +dev_activate (FpImageDevice *dev) { - FpiDeviceAes2501 *self = FPI_DEVICE_AES2501(dev); - FpiSsm *ssm = fpi_ssm_new(FP_DEVICE(dev), activate_run_state, - ACTIVATE_NUM_STATES, dev); - self->read_regs_retry_count = 0; - fpi_ssm_start(ssm, activate_sm_complete); + FpiDeviceAes2501 *self = FPI_DEVICE_AES2501 (dev); + FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (dev), activate_run_state, + ACTIVATE_NUM_STATES, dev); + + self->read_regs_retry_count = 0; + fpi_ssm_start (ssm, activate_sm_complete); } -static void dev_deactivate(FpImageDevice *dev) +static void +dev_deactivate (FpImageDevice *dev) { - FpiDeviceAes2501 *self = FPI_DEVICE_AES2501(dev); - /* FIXME: audit cancellation points, probably need more, specifically - * in error handling paths? */ - self->deactivating = TRUE; + FpiDeviceAes2501 *self = FPI_DEVICE_AES2501 (dev); + + /* FIXME: audit cancellation points, probably need more, specifically + * in error handling paths? */ + self->deactivating = TRUE; } -static void complete_deactivation(FpImageDevice *dev) +static void +complete_deactivation (FpImageDevice *dev) { - FpiDeviceAes2501 *self = FPI_DEVICE_AES2501(dev); - G_DEBUG_HERE(); + FpiDeviceAes2501 *self = FPI_DEVICE_AES2501 (dev); - /* FIXME: if we're in the middle of a scan, we should cancel the scan. - * maybe we can do this with a master reset, unconditionally? */ + G_DEBUG_HERE (); - self->deactivating = FALSE; - g_slist_free(self->strips); - self->strips = NULL; - self->strips_len = 0; - fpi_image_device_deactivate_complete(dev, NULL); + /* FIXME: if we're in the middle of a scan, we should cancel the scan. + * maybe we can do this with a master reset, unconditionally? */ + + self->deactivating = FALSE; + g_slist_free (self->strips); + self->strips = NULL; + self->strips_len = 0; + fpi_image_device_deactivate_complete (dev, NULL); } -static void dev_init(FpImageDevice *dev) +static void +dev_init (FpImageDevice *dev) { - GError *error = NULL; - /* FIXME check endpoints */ + GError *error = NULL; - g_usb_device_claim_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), 0, 0, &error); - fpi_image_device_open_complete(dev, error); + /* FIXME check endpoints */ + + g_usb_device_claim_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), 0, 0, &error); + fpi_image_device_open_complete (dev, error); } -static void dev_deinit(FpImageDevice *dev) +static void +dev_deinit (FpImageDevice *dev) { - GError *error = NULL; + GError *error = NULL; - g_usb_device_release_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), - 0, 0, &error); - fpi_image_device_close_complete(dev, error); + g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), + 0, 0, &error); + fpi_image_device_close_complete (dev, error); } -static const FpIdEntry id_table [ ] = { - { .vid = 0x08ff, .pid = 0x2500, - }, /* AES2500 */ - { .vid = 0x08ff, .pid = 0x2580, - }, /* AES2501 */ - { .vid = 0, .pid = 0, .driver_data = 0 }, +static const FpIdEntry id_table[] = { + { .vid = 0x08ff, .pid = 0x2500, },/* AES2500 */ + { .vid = 0x08ff, .pid = 0x2580, },/* AES2501 */ + { .vid = 0, .pid = 0, .driver_data = 0 }, }; -static void fpi_device_aes2501_init(FpiDeviceAes2501 *self) { +static void +fpi_device_aes2501_init (FpiDeviceAes2501 *self) +{ } -static void fpi_device_aes2501_class_init(FpiDeviceAes2501Class *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); - FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS(klass); +static void +fpi_device_aes2501_class_init (FpiDeviceAes2501Class *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); + FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); - dev_class->id = "aes2501"; - dev_class->full_name = "AuthenTec AES2501"; - dev_class->type = FP_DEVICE_TYPE_USB; - dev_class->id_table = id_table; - dev_class->scan_type = FP_SCAN_TYPE_SWIPE; + dev_class->id = "aes2501"; + dev_class->full_name = "AuthenTec AES2501"; + dev_class->type = FP_DEVICE_TYPE_USB; + dev_class->id_table = id_table; + dev_class->scan_type = FP_SCAN_TYPE_SWIPE; - img_class->img_open = dev_init; - img_class->img_close = dev_deinit; - img_class->activate = dev_activate; - img_class->deactivate = dev_deactivate; + img_class->img_open = dev_init; + img_class->img_close = dev_deinit; + img_class->activate = dev_activate; + img_class->deactivate = dev_deactivate; - img_class->img_width = IMAGE_WIDTH; - img_class->img_height = -1; + img_class->img_width = IMAGE_WIDTH; + img_class->img_height = -1; } - diff --git a/libfprint/drivers/aes2501.h b/libfprint/drivers/aes2501.h index 19adcc9..dc802ca 100644 --- a/libfprint/drivers/aes2501.h +++ b/libfprint/drivers/aes2501.h @@ -23,149 +23,149 @@ #define __AES2501_H enum aes2501_regs { - AES2501_REG_CTRL1 = 0x80, - AES2501_REG_CTRL2 = 0x81, - AES2501_REG_EXCITCTRL = 0x82, /* excitation control */ - AES2501_REG_DETCTRL = 0x83, /* detect control */ - AES2501_REG_COLSCAN = 0x88, /* column scan rate register */ - AES2501_REG_MEASDRV = 0x89, /* measure drive */ - AES2501_REG_MEASFREQ = 0x8a, /* measure frequency */ - AES2501_REG_DEMODPHASE1 = 0x8d, - AES2501_REG_DEMODPHASE2 = 0x8c, - AES2501_REG_CHANGAIN = 0x8e, /* channel gain */ - AES2501_REG_ADREFHI = 0x91, /* A/D reference high */ - AES2501_REG_ADREFLO = 0x92, /* A/D reference low */ - AES2501_REG_STRTROW = 0x93, /* start row */ - AES2501_REG_ENDROW = 0x94, /* end row */ - AES2501_REG_STRTCOL = 0x95, /* start column */ - AES2501_REG_ENDCOL = 0x96, /* end column */ - AES2501_REG_DATFMT = 0x97, /* data format */ - AES2501_REG_IMAGCTRL = 0x98, /* image data */ - AES2501_REG_STAT = 0x9a, - AES2501_REG_CHWORD1 = 0x9b, /* challenge word 1 */ - AES2501_REG_CHWORD2 = 0x9c, - AES2501_REG_CHWORD3 = 0x9d, - AES2501_REG_CHWORD4 = 0x9e, - AES2501_REG_CHWORD5 = 0x9f, - AES2501_REG_TREG1 = 0xa1, /* test register 1 */ - AES2501_REG_AUTOCALOFFSET = 0xa8, - AES2501_REG_TREGC = 0xac, - AES2501_REG_TREGD = 0xad, - AES2501_REG_LPONT = 0xb4, /* low power oscillator on time */ + AES2501_REG_CTRL1 = 0x80, + AES2501_REG_CTRL2 = 0x81, + AES2501_REG_EXCITCTRL = 0x82, /* excitation control */ + AES2501_REG_DETCTRL = 0x83, /* detect control */ + AES2501_REG_COLSCAN = 0x88, /* column scan rate register */ + AES2501_REG_MEASDRV = 0x89, /* measure drive */ + AES2501_REG_MEASFREQ = 0x8a, /* measure frequency */ + AES2501_REG_DEMODPHASE1 = 0x8d, + AES2501_REG_DEMODPHASE2 = 0x8c, + AES2501_REG_CHANGAIN = 0x8e, /* channel gain */ + AES2501_REG_ADREFHI = 0x91, /* A/D reference high */ + AES2501_REG_ADREFLO = 0x92, /* A/D reference low */ + AES2501_REG_STRTROW = 0x93, /* start row */ + AES2501_REG_ENDROW = 0x94, /* end row */ + AES2501_REG_STRTCOL = 0x95, /* start column */ + AES2501_REG_ENDCOL = 0x96, /* end column */ + AES2501_REG_DATFMT = 0x97, /* data format */ + AES2501_REG_IMAGCTRL = 0x98, /* image data */ + AES2501_REG_STAT = 0x9a, + AES2501_REG_CHWORD1 = 0x9b, /* challenge word 1 */ + AES2501_REG_CHWORD2 = 0x9c, + AES2501_REG_CHWORD3 = 0x9d, + AES2501_REG_CHWORD4 = 0x9e, + AES2501_REG_CHWORD5 = 0x9f, + AES2501_REG_TREG1 = 0xa1, /* test register 1 */ + AES2501_REG_AUTOCALOFFSET = 0xa8, + AES2501_REG_TREGC = 0xac, + AES2501_REG_TREGD = 0xad, + AES2501_REG_LPONT = 0xb4, /* low power oscillator on time */ }; -#define FIRST_AES2501_REG AES2501_REG_CTRL1 -#define LAST_AES2501_REG AES2501_REG_CHWORD5 +#define FIRST_AES2501_REG AES2501_REG_CTRL1 +#define LAST_AES2501_REG AES2501_REG_CHWORD5 -#define AES2501_CTRL1_MASTER_RESET (1<<0) -#define AES2501_CTRL1_SCAN_RESET (1<<1) /* stop + restart scan sequencer */ +#define AES2501_CTRL1_MASTER_RESET (1 << 0) +#define AES2501_CTRL1_SCAN_RESET (1 << 1) /* stop + restart scan sequencer */ /* 1 = continuously updated, 0 = updated prior to starting a scan */ -#define AES2501_CTRL1_REG_UPDATE (1<<2) +#define AES2501_CTRL1_REG_UPDATE (1 << 2) /* 1 = continuous scans, 0 = single scans */ -#define AES2501_CTRL2_CONTINUOUS 0x01 -#define AES2501_CTRL2_READ_REGS 0x02 /* dump registers */ -#define AES2501_CTRL2_SET_ONE_SHOT 0x04 -#define AES2501_CTRL2_CLR_ONE_SHOT 0x08 -#define AES2501_CTRL2_READ_ID 0x10 +#define AES2501_CTRL2_CONTINUOUS 0x01 +#define AES2501_CTRL2_READ_REGS 0x02 /* dump registers */ +#define AES2501_CTRL2_SET_ONE_SHOT 0x04 +#define AES2501_CTRL2_CLR_ONE_SHOT 0x08 +#define AES2501_CTRL2_READ_ID 0x10 enum aes2501_detection_rate { - /* rate of detection cycles: */ - AES2501_DETCTRL_DRATE_CONTINUOUS = 0x00, /* continuously */ - AES2501_DETCTRL_DRATE_16_MS = 0x01, /* every 16.62ms */ - AES2501_DETCTRL_DRATE_31_MS = 0x02, /* every 31.24ms */ - AES2501_DETCTRL_DRATE_62_MS = 0x03, /* every 62.50ms */ - AES2501_DETCTRL_DRATE_125_MS = 0x04, /* every 125.0ms */ - AES2501_DETCTRL_DRATE_250_MS = 0x05, /* every 250.0ms */ - AES2501_DETCTRL_DRATE_500_MS = 0x06, /* every 500.0ms */ - AES2501_DETCTRL_DRATE_1_S = 0x07, /* every 1s */ + /* rate of detection cycles: */ + AES2501_DETCTRL_DRATE_CONTINUOUS = 0x00, /* continuously */ + AES2501_DETCTRL_DRATE_16_MS = 0x01, /* every 16.62ms */ + AES2501_DETCTRL_DRATE_31_MS = 0x02, /* every 31.24ms */ + AES2501_DETCTRL_DRATE_62_MS = 0x03, /* every 62.50ms */ + AES2501_DETCTRL_DRATE_125_MS = 0x04, /* every 125.0ms */ + AES2501_DETCTRL_DRATE_250_MS = 0x05, /* every 250.0ms */ + AES2501_DETCTRL_DRATE_500_MS = 0x06, /* every 500.0ms */ + AES2501_DETCTRL_DRATE_1_S = 0x07, /* every 1s */ }; enum aes2501_settling_delay { - AES2501_DETCTRL_SDELAY_31_MS = 0x00, /* 31.25ms */ - AES2501_DETCTRL_SSDELAY_62_MS = 0x10, /* 62.5ms */ - AES2501_DETCTRL_SSDELAY_125_MS = 0x20, /* 125ms */ - AES2501_DETCTRL_SSDELAY_250_MS = 0x30 /* 250ms */ + AES2501_DETCTRL_SDELAY_31_MS = 0x00, /* 31.25ms */ + AES2501_DETCTRL_SSDELAY_62_MS = 0x10, /* 62.5ms */ + AES2501_DETCTRL_SSDELAY_125_MS = 0x20, /* 125ms */ + AES2501_DETCTRL_SSDELAY_250_MS = 0x30 /* 250ms */ }; enum aes2501_col_scan_rate { - AES2501_COLSCAN_SRATE_32_US = 0x00, /* 32us */ - AES2501_COLSCAN_SRATE_64_US = 0x01, /* 64us */ - AES2501_COLSCAN_SRATE_128_US = 0x02, /* 128us */ - AES2501_COLSCAN_SRATE_256_US = 0x03, /* 256us */ - AES2501_COLSCAN_SRATE_512_US = 0x04, /* 512us */ - AES2501_COLSCAN_SRATE_1024_US = 0x05, /* 1024us */ - AES2501_COLSCAN_SRATE_2048_US = 0x06, /* 2048us */ + AES2501_COLSCAN_SRATE_32_US = 0x00, /* 32us */ + AES2501_COLSCAN_SRATE_64_US = 0x01, /* 64us */ + AES2501_COLSCAN_SRATE_128_US = 0x02, /* 128us */ + AES2501_COLSCAN_SRATE_256_US = 0x03, /* 256us */ + AES2501_COLSCAN_SRATE_512_US = 0x04, /* 512us */ + AES2501_COLSCAN_SRATE_1024_US = 0x05, /* 1024us */ + AES2501_COLSCAN_SRATE_2048_US = 0x06, /* 2048us */ }; enum aes2501_mesure_drive { - AES2501_MEASDRV_MDRIVE_0_325 = 0x00, /* 0.325 Vpp */ - AES2501_MEASDRV_MDRIVE_0_65 = 0x01, /* 0.65 Vpp */ - AES2501_MEASDRV_MDRIVE_1_3 = 0x02, /* 1.3 Vpp */ - AES2501_MEASDRV_MDRIVE_2_6 = 0x03 /* 2.6 Vpp */ + AES2501_MEASDRV_MDRIVE_0_325 = 0x00, /* 0.325 Vpp */ + AES2501_MEASDRV_MDRIVE_0_65 = 0x01, /* 0.65 Vpp */ + AES2501_MEASDRV_MDRIVE_1_3 = 0x02, /* 1.3 Vpp */ + AES2501_MEASDRV_MDRIVE_2_6 = 0x03 /* 2.6 Vpp */ }; /* Select (1=square | 0=sine) wave drive during measure */ -#define AES2501_MEASDRV_SQUARE 0x20 +#define AES2501_MEASDRV_SQUARE 0x20 /* 0 = use measure drive setting, 1 = when sine wave is selected */ -#define AES2501_MEASDRV_MEASURE_SQUARE 0x10 +#define AES2501_MEASDRV_MEASURE_SQUARE 0x10 enum aes2501_measure_freq { - AES2501_MEASFREQ_125K = 0x01, /* 125 kHz */ - AES2501_MEASFREQ_250K = 0x02, /* 250 kHz */ - AES2501_MEASFREQ_500K = 0x03, /* 500 kHz */ - AES2501_MEASFREQ_1M = 0x04, /* 1 MHz */ - AES2501_MEASFREQ_2M = 0x05 /* 2 MHz */ + AES2501_MEASFREQ_125K = 0x01, /* 125 kHz */ + AES2501_MEASFREQ_250K = 0x02, /* 250 kHz */ + AES2501_MEASFREQ_500K = 0x03, /* 500 kHz */ + AES2501_MEASFREQ_1M = 0x04, /* 1 MHz */ + AES2501_MEASFREQ_2M = 0x05 /* 2 MHz */ }; -#define DEMODPHASE_NONE 0x00 -#define DEMODPHASE_180_00 0x40 /* 180 degrees */ -#define DEMODPHASE_2_81 0x01 /* 2.8125 degrees */ +#define DEMODPHASE_NONE 0x00 +#define DEMODPHASE_180_00 0x40 /* 180 degrees */ +#define DEMODPHASE_2_81 0x01 /* 2.8125 degrees */ #define AES2501_REG_DEMODPHASE1 0x8d -#define DEMODPHASE_1_40 0x40 /* 1.40625 degrees */ -#define DEMODPHASE_0_02 0x01 /* 0.02197256 degrees */ +#define DEMODPHASE_1_40 0x40 /* 1.40625 degrees */ +#define DEMODPHASE_0_02 0x01 /* 0.02197256 degrees */ enum aes2501_sensor_gain1 { - AES2501_CHANGAIN_STAGE1_2X = 0x00, /* 2x */ - AES2501_CHANGAIN_STAGE1_4X = 0x01, /* 4x */ - AES2501_CHANGAIN_STAGE1_8X = 0x02, /* 8x */ - AES2501_CHANGAIN_STAGE1_16X = 0x03 /* 16x */ + AES2501_CHANGAIN_STAGE1_2X = 0x00, /* 2x */ + AES2501_CHANGAIN_STAGE1_4X = 0x01, /* 4x */ + AES2501_CHANGAIN_STAGE1_8X = 0x02, /* 8x */ + AES2501_CHANGAIN_STAGE1_16X = 0x03 /* 16x */ }; enum aes2501_sensor_gain2 { - AES2501_CHANGAIN_STAGE2_2X = 0x00, /* 2x */ - AES2501_CHANGAIN_STAGE2_4X = 0x10, /* 4x */ - AES2501_CHANGAIN_STAGE2_8X = 0x20, /* 8x */ - AES2501_CHANGAIN_STAGE2_16X = 0x30 /* 16x */ + AES2501_CHANGAIN_STAGE2_2X = 0x00, /* 2x */ + AES2501_CHANGAIN_STAGE2_4X = 0x10, /* 4x */ + AES2501_CHANGAIN_STAGE2_8X = 0x20, /* 8x */ + AES2501_CHANGAIN_STAGE2_16X = 0x30 /* 16x */ }; -#define AES2501_DATFMT_EIGHT 0x40 /* 1 = 8-bit data, 0 = 4-bit data */ -#define AES2501_DATFMT_LOW_RES 0x20 -#define AES2501_DATFMT_BIN_IMG 0x10 +#define AES2501_DATFMT_EIGHT 0x40 /* 1 = 8-bit data, 0 = 4-bit data */ +#define AES2501_DATFMT_LOW_RES 0x20 +#define AES2501_DATFMT_BIN_IMG 0x10 /* don't send image or authentication messages when imaging */ -#define AES2501_IMAGCTRL_IMG_DATA_DISABLE 0x01 +#define AES2501_IMAGCTRL_IMG_DATA_DISABLE 0x01 /* send histogram when imaging */ -#define AES2501_IMAGCTRL_HISTO_DATA_ENABLE 0x02 +#define AES2501_IMAGCTRL_HISTO_DATA_ENABLE 0x02 /* send histogram at end of each row rather than each scan */ -#define AES2501_IMAGCTRL_HISTO_EACH_ROW 0x04 +#define AES2501_IMAGCTRL_HISTO_EACH_ROW 0x04 /* send full image array rather than 64x64 center */ -#define AES2501_IMAGCTRL_HISTO_FULL_ARRAY 0x08 +#define AES2501_IMAGCTRL_HISTO_FULL_ARRAY 0x08 /* return registers before data (rather than after) */ -#define AES2501_IMAGCTRL_REG_FIRST 0x10 +#define AES2501_IMAGCTRL_REG_FIRST 0x10 /* return test registers with register dump */ -#define AES2501_IMAGCTRL_TST_REG_ENABLE 0x20 +#define AES2501_IMAGCTRL_TST_REG_ENABLE 0x20 -#define AES2501_CHWORD1_IS_FINGER 0x01 /* If set, finger is present */ +#define AES2501_CHWORD1_IS_FINGER 0x01 /* If set, finger is present */ /* Enable the reading of the register in TREGD */ -#define AES2501_TREGC_ENABLE 0x01 +#define AES2501_TREGC_ENABLE 0x01 -#define AES2501_LPONT_MIN_VALUE 0x00 /* 0 ms */ -#define AES2501_LPONT_MAX_VALUE 0x1f /* About 16 ms */ +#define AES2501_LPONT_MIN_VALUE 0x00 /* 0 ms */ +#define AES2501_LPONT_MAX_VALUE 0x1f /* About 16 ms */ #define AES2501_ADREFHI_MIN_VALUE 0x28 #define AES2501_ADREFHI_MAX_VALUE 0x58 @@ -173,4 +173,4 @@ enum aes2501_sensor_gain2 { #define AES2501_SUM_HIGH_THRESH 1000 #define AES2501_SUM_LOW_THRESH 700 -#endif /* __AES2501_H */ +#endif /* __AES2501_H */ diff --git a/libfprint/drivers/aes2550.c b/libfprint/drivers/aes2550.c index b8fce05..80e54e8 100644 --- a/libfprint/drivers/aes2550.c +++ b/libfprint/drivers/aes2550.c @@ -27,11 +27,11 @@ #include "aes2550.h" #include "aeslib.h" -static void start_capture(FpImageDevice *dev); -static void complete_deactivation(FpImageDevice *dev); +static void start_capture (FpImageDevice *dev); +static void complete_deactivation (FpImageDevice *dev); -#define EP_IN (1 | FPI_USB_ENDPOINT_IN) -#define EP_OUT (2 | FPI_USB_ENDPOINT_OUT) +#define EP_IN (1 | FPI_USB_ENDPOINT_IN) +#define EP_OUT (2 | FPI_USB_ENDPOINT_OUT) #define BULK_TIMEOUT 4000 /* @@ -46,528 +46,583 @@ static void complete_deactivation(FpImageDevice *dev); * images returned from this driver vary in height. */ -#define FRAME_WIDTH 192 -#define FRAME_HEIGHT 8 -#define FRAME_SIZE (FRAME_WIDTH * FRAME_HEIGHT) -#define IMAGE_WIDTH (FRAME_WIDTH + (FRAME_WIDTH / 2)) +#define FRAME_WIDTH 192 +#define FRAME_HEIGHT 8 +#define FRAME_SIZE (FRAME_WIDTH * FRAME_HEIGHT) +#define IMAGE_WIDTH (FRAME_WIDTH + (FRAME_WIDTH / 2)) -struct _FpiDeviceAes2550 { - FpImageDevice parent; +struct _FpiDeviceAes2550 +{ + FpImageDevice parent; - GSList *strips; - size_t strips_len; - gboolean deactivating; - int heartbeat_cnt; + GSList *strips; + size_t strips_len; + gboolean deactivating; + int heartbeat_cnt; }; -G_DECLARE_FINAL_TYPE(FpiDeviceAes2550, fpi_device_aes2550, FPI, DEVICE_AES2550, - FpImageDevice); -G_DEFINE_TYPE(FpiDeviceAes2550, fpi_device_aes2550, FP_TYPE_IMAGE_DEVICE); +G_DECLARE_FINAL_TYPE (FpiDeviceAes2550, fpi_device_aes2550, FPI, DEVICE_AES2550, + FpImageDevice); +G_DEFINE_TYPE (FpiDeviceAes2550, fpi_device_aes2550, FP_TYPE_IMAGE_DEVICE); static struct fpi_frame_asmbl_ctx assembling_ctx = { - .frame_width = FRAME_WIDTH, - .frame_height = FRAME_HEIGHT, - .image_width = IMAGE_WIDTH, - .get_pixel = aes_get_pixel, + .frame_width = FRAME_WIDTH, + .frame_height = FRAME_HEIGHT, + .image_width = IMAGE_WIDTH, + .get_pixel = aes_get_pixel, }; /****** FINGER PRESENCE DETECTION ******/ static unsigned char finger_det_reqs[] = { - 0x80, AES2550_REG80_MASTER_RESET, - 0x95, (8 << AES2550_REG95_COL_SCANNED_OFS) | (1 << AES2550_REG95_EPIX_AVG_OFS), - 0xad, 0x00, - 0xbd, (0 << AES2550_REGBD_LPO_IN_15_8_OFS), - 0xbe, (0 << AES2550_REGBE_LPO_IN_7_0_OFS), - 0xcf, AES2550_REGCF_INTERFERENCE_CHK_EN, - AES2550_CMD_HEARTBEAT, 0x00, 0x01, 0x00, /* Heart beat off */ - AES2550_CMD_RUN_FD, + 0x80, AES2550_REG80_MASTER_RESET, + 0x95, (8 << AES2550_REG95_COL_SCANNED_OFS) | (1 << AES2550_REG95_EPIX_AVG_OFS), + 0xad, 0x00, + 0xbd, (0 << AES2550_REGBD_LPO_IN_15_8_OFS), + 0xbe, (0 << AES2550_REGBE_LPO_IN_7_0_OFS), + 0xcf, AES2550_REGCF_INTERFERENCE_CHK_EN, + AES2550_CMD_HEARTBEAT, 0x00, 0x01, 0x00, /* Heart beat off */ + AES2550_CMD_RUN_FD, }; -static void start_finger_detection(FpImageDevice *dev); +static void start_finger_detection (FpImageDevice *dev); -static void finger_det_data_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +finger_det_data_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpImageDevice *dev = FP_IMAGE_DEVICE(device); - unsigned char *data = transfer->buffer; + FpImageDevice *dev = FP_IMAGE_DEVICE (device); + unsigned char *data = transfer->buffer; - if (error) { - fpi_image_device_session_error(FP_IMAGE_DEVICE(device), error); - return; - } + if (error) + { + fpi_image_device_session_error (FP_IMAGE_DEVICE (device), error); + return; + } - fp_dbg("transfer completed, len: %.4x, data: %.2x %.2x", - (gint)transfer->actual_length, (int)data[0], (int)data[1]); + fp_dbg ("transfer completed, len: %.4x, data: %.2x %.2x", + (gint) transfer->actual_length, (int) data[0], (int) data[1]); - /* Check if we got 2 bytes, reg address 0x83 and its value */ - if ((transfer->actual_length >= 2) && (data[0] == 0x83) && (data[1] & AES2550_REG83_FINGER_PRESENT)) { - /* finger present, start capturing */ - fpi_image_device_report_finger_status(dev, TRUE); - start_capture(dev); - } else { - /* no finger, poll for a new histogram */ - start_finger_detection(dev); - } + /* Check if we got 2 bytes, reg address 0x83 and its value */ + if ((transfer->actual_length >= 2) && (data[0] == 0x83) && (data[1] & AES2550_REG83_FINGER_PRESENT)) + { + /* finger present, start capturing */ + fpi_image_device_report_finger_status (dev, TRUE); + start_capture (dev); + } + else + { + /* no finger, poll for a new histogram */ + start_finger_detection (dev); + } } -static void finger_det_reqs_cb(FpiUsbTransfer *t, FpDevice *device, - gpointer user_data, GError *error) +static void +finger_det_reqs_cb (FpiUsbTransfer *t, FpDevice *device, + gpointer user_data, GError *error) { - FpiUsbTransfer *transfer; - FpImageDevice *dev = user_data; + FpiUsbTransfer *transfer; + FpImageDevice *dev = user_data; - if (error) { - fpi_image_device_session_error(dev, error); - return; - } + if (error) + { + fpi_image_device_session_error (dev, error); + return; + } - transfer = fpi_usb_transfer_new (device); - /* 2 bytes of result */ - fpi_usb_transfer_fill_bulk (transfer, EP_IN, AES2550_EP_IN_BUF_SIZE); - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - finger_det_data_cb, NULL); - fpi_usb_transfer_unref(transfer); + transfer = fpi_usb_transfer_new (device); + /* 2 bytes of result */ + fpi_usb_transfer_fill_bulk (transfer, EP_IN, AES2550_EP_IN_BUF_SIZE); + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + finger_det_data_cb, NULL); + fpi_usb_transfer_unref (transfer); } -static void start_finger_detection(FpImageDevice *dev) +static void +start_finger_detection (FpImageDevice *dev) { - FpiDeviceAes2550 *self = FPI_DEVICE_AES2550(dev); - FpiUsbTransfer *transfer; - G_DEBUG_HERE(); + FpiDeviceAes2550 *self = FPI_DEVICE_AES2550 (dev); + FpiUsbTransfer *transfer; - if (self->deactivating) { - complete_deactivation(dev); - return; - } + G_DEBUG_HERE (); - transfer = fpi_usb_transfer_new(FP_DEVICE(dev)); - transfer->short_is_error = TRUE; - fpi_usb_transfer_fill_bulk_full(transfer, EP_OUT, finger_det_reqs, - sizeof(finger_det_reqs), NULL); - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - finger_det_reqs_cb, NULL); - fpi_usb_transfer_unref(transfer); + if (self->deactivating) + { + complete_deactivation (dev); + return; + } + + transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); + transfer->short_is_error = TRUE; + fpi_usb_transfer_fill_bulk_full (transfer, EP_OUT, finger_det_reqs, + sizeof (finger_det_reqs), NULL); + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + finger_det_reqs_cb, NULL); + fpi_usb_transfer_unref (transfer); } /****** CAPTURE ******/ static unsigned char capture_reqs[] = { - 0x80, AES2550_REG80_MASTER_RESET, - 0x80, (1 << AES2550_REG80_SENSOR_MODE_OFS) | (AES2550_REG80_HGC_ENABLE), - 0x85, AES2550_REG85_FLUSH_PER_FRAME, - 0x8f, AES2550_REG8F_AUTH_DISABLE | AES2550_REG8F_EHISTO_DISABLE, - 0xbf, AES2550_REGBF_RSR_DIR_UPDOWN_MOTION | AES2550_REGBF_RSR_LEVEL_SUPER_RSR, - 0xcf, (3 << AES2550_REGCF_INTERFERENCE_AVG_OFFS) | AES2550_REGCF_INTERFERENCE_AVG_EN, - 0xdc, (1 << AES2550_REGDC_BP_NUM_REF_SWEEP_OFS), - AES2550_CMD_HEARTBEAT, 0x00, 0x01, 0x03, /* Heart beat cmd, 3 * 16 cycles without sending image */ - AES2550_CMD_GET_ENROLL_IMG, + 0x80, AES2550_REG80_MASTER_RESET, + 0x80, (1 << AES2550_REG80_SENSOR_MODE_OFS) | (AES2550_REG80_HGC_ENABLE), + 0x85, AES2550_REG85_FLUSH_PER_FRAME, + 0x8f, AES2550_REG8F_AUTH_DISABLE | AES2550_REG8F_EHISTO_DISABLE, + 0xbf, AES2550_REGBF_RSR_DIR_UPDOWN_MOTION | AES2550_REGBF_RSR_LEVEL_SUPER_RSR, + 0xcf, (3 << AES2550_REGCF_INTERFERENCE_AVG_OFFS) | AES2550_REGCF_INTERFERENCE_AVG_EN, + 0xdc, (1 << AES2550_REGDC_BP_NUM_REF_SWEEP_OFS), + AES2550_CMD_HEARTBEAT, 0x00, 0x01, 0x03, /* Heart beat cmd, 3 * 16 cycles without sending image */ + AES2550_CMD_GET_ENROLL_IMG, }; static unsigned char capture_set_idle_reqs[] = { - 0x80, AES2550_REG80_MASTER_RESET, - AES2550_CMD_HEARTBEAT, 0x00, 0x01, 0x00, /* Heart beat off */ - AES2550_CMD_SET_IDLE_MODE, + 0x80, AES2550_REG80_MASTER_RESET, + AES2550_CMD_HEARTBEAT, 0x00, 0x01, 0x00, /* Heart beat off */ + AES2550_CMD_SET_IDLE_MODE, }; enum capture_states { - CAPTURE_WRITE_REQS, - CAPTURE_READ_DATA, - CAPTURE_SET_IDLE, - CAPTURE_NUM_STATES, + CAPTURE_WRITE_REQS, + CAPTURE_READ_DATA, + CAPTURE_SET_IDLE, + CAPTURE_NUM_STATES, }; /* Returns number of processed bytes */ -static gboolean process_strip_data(FpiSsm *ssm, FpImageDevice *dev, - unsigned char *data) +static gboolean +process_strip_data (FpiSsm *ssm, FpImageDevice *dev, + unsigned char *data) { - unsigned char *stripdata; - FpiDeviceAes2550 *self = FPI_DEVICE_AES2550(dev); - struct fpi_frame *stripe; - int len; + unsigned char *stripdata; + FpiDeviceAes2550 *self = FPI_DEVICE_AES2550 (dev); + struct fpi_frame *stripe; + int len; - if (data[0] != AES2550_EDATA_MAGIC) { - fp_dbg("Bogus magic: %.2x\n", (int)(data[0])); - return FALSE; - } - len = data[1] * 256 + data[2]; - if (len != (AES2550_STRIP_SIZE - 3)) { - fp_dbg("Bogus frame len: %.4x\n", len); - } - stripe = g_malloc0(FRAME_WIDTH * FRAME_HEIGHT / 2 + sizeof(struct fpi_frame)); /* 4 bits per pixel */ - stripe->delta_x = (int8_t)data[6]; - stripe->delta_y = -(int8_t)data[7]; - stripdata = stripe->data; - memcpy(stripdata, data + 33, FRAME_WIDTH * FRAME_HEIGHT / 2); - self->strips = g_slist_prepend(self->strips, stripe); - self->strips_len++; + if (data[0] != AES2550_EDATA_MAGIC) + { + fp_dbg ("Bogus magic: %.2x\n", (int) (data[0])); + return FALSE; + } + len = data[1] * 256 + data[2]; + if (len != (AES2550_STRIP_SIZE - 3)) + fp_dbg ("Bogus frame len: %.4x\n", len); + stripe = g_malloc0 (FRAME_WIDTH * FRAME_HEIGHT / 2 + sizeof (struct fpi_frame)); /* 4 bits per pixel */ + stripe->delta_x = (int8_t) data[6]; + stripe->delta_y = -(int8_t) data[7]; + stripdata = stripe->data; + memcpy (stripdata, data + 33, FRAME_WIDTH * FRAME_HEIGHT / 2); + self->strips = g_slist_prepend (self->strips, stripe); + self->strips_len++; - fp_dbg("deltas: %dx%d", stripe->delta_x, stripe->delta_y); + fp_dbg ("deltas: %dx%d", stripe->delta_x, stripe->delta_y); - return TRUE; + return TRUE; } -static void capture_reqs_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +capture_reqs_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - if (!error) { - fpi_ssm_next_state(transfer->ssm); - } else { - fpi_ssm_mark_failed(transfer->ssm, error); - } + if (!error) + fpi_ssm_next_state (transfer->ssm); + else + fpi_ssm_mark_failed (transfer->ssm, error); } -static void capture_set_idle_reqs_cb(FpiUsbTransfer *transfer, - FpDevice *device, gpointer user_data, - GError *error) +static void +capture_set_idle_reqs_cb (FpiUsbTransfer *transfer, + FpDevice *device, gpointer user_data, + GError *error) { - FpImageDevice *dev = FP_IMAGE_DEVICE(device); - FpiDeviceAes2550 *self = FPI_DEVICE_AES2550(dev); + FpImageDevice *dev = FP_IMAGE_DEVICE (device); + FpiDeviceAes2550 *self = FPI_DEVICE_AES2550 (dev); - if (!error && self->strips_len) { - FpImage *img; + if (!error && self->strips_len) + { + FpImage *img; - self->strips = g_slist_reverse(self->strips); - img = fpi_assemble_frames(&assembling_ctx, self->strips); - g_slist_free_full(self->strips, g_free); - self->strips = NULL; - self->strips_len = 0; - fpi_image_device_image_captured(dev, img); - fpi_image_device_report_finger_status(dev, FALSE); - /* marking machine complete will re-trigger finger detection loop */ - fpi_ssm_mark_completed(transfer->ssm); - } else { - if (error) - fpi_ssm_mark_failed(transfer->ssm, error); - else - fpi_ssm_mark_failed(transfer->ssm, - fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); - } + self->strips = g_slist_reverse (self->strips); + img = fpi_assemble_frames (&assembling_ctx, self->strips); + g_slist_free_full (self->strips, g_free); + self->strips = NULL; + self->strips_len = 0; + fpi_image_device_image_captured (dev, img); + fpi_image_device_report_finger_status (dev, FALSE); + /* marking machine complete will re-trigger finger detection loop */ + fpi_ssm_mark_completed (transfer->ssm); + } + else + { + if (error) + fpi_ssm_mark_failed (transfer->ssm, error); + else + fpi_ssm_mark_failed (transfer->ssm, + fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + } } -static void capture_read_data_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +capture_read_data_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpImageDevice *dev = FP_IMAGE_DEVICE(device); - FpiDeviceAes2550 *self = FPI_DEVICE_AES2550(dev); - unsigned char *data = transfer->buffer; + FpImageDevice *dev = FP_IMAGE_DEVICE (device); + FpiDeviceAes2550 *self = FPI_DEVICE_AES2550 (dev); + unsigned char *data = transfer->buffer; - if (error) { - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } + if (error) + { + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } - fp_dbg("request completed, len: %.4x", (gint)transfer->actual_length); - if (transfer->actual_length >= 2) - fp_dbg("data: %.2x %.2x", (int)data[0], (int)data[1]); + fp_dbg ("request completed, len: %.4x", (gint) transfer->actual_length); + if (transfer->actual_length >= 2) + fp_dbg ("data: %.2x %.2x", (int) data[0], (int) data[1]); - switch (transfer->actual_length) { - case AES2550_STRIP_SIZE: - if (!process_strip_data(transfer->ssm, dev, data)) { - fp_dbg("Processing strip data failed"); - fpi_ssm_mark_failed(transfer->ssm, - fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); - return; - } - self->heartbeat_cnt = 0; - fpi_ssm_jump_to_state(transfer->ssm, CAPTURE_READ_DATA); - break; - case AES2550_HEARTBEAT_SIZE: - if (data[0] == AES2550_HEARTBEAT_MAGIC) { - /* No data for a long time => finger was removed or there's no movement */ - self->heartbeat_cnt++; - if (self->heartbeat_cnt == 3) { - /* Got 3 heartbeat message, that's enough to consider that finger was removed, - * assemble image and submit it to the library */ - fp_dbg("Got 3 heartbeats => finger removed"); - fpi_ssm_next_state(transfer->ssm); - } else { - fpi_ssm_jump_to_state(transfer->ssm, - CAPTURE_READ_DATA); - } - } - break; - default: - fp_dbg("Short frame %d, skip", - (gint)transfer->actual_length); - fpi_ssm_jump_to_state(transfer->ssm, CAPTURE_READ_DATA); - break; - } + switch (transfer->actual_length) + { + case AES2550_STRIP_SIZE: + if (!process_strip_data (transfer->ssm, dev, data)) + { + fp_dbg ("Processing strip data failed"); + fpi_ssm_mark_failed (transfer->ssm, + fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + return; + } + self->heartbeat_cnt = 0; + fpi_ssm_jump_to_state (transfer->ssm, CAPTURE_READ_DATA); + break; + + case AES2550_HEARTBEAT_SIZE: + if (data[0] == AES2550_HEARTBEAT_MAGIC) + { + /* No data for a long time => finger was removed or there's no movement */ + self->heartbeat_cnt++; + if (self->heartbeat_cnt == 3) + { + /* Got 3 heartbeat message, that's enough to consider that finger was removed, + * assemble image and submit it to the library */ + fp_dbg ("Got 3 heartbeats => finger removed"); + fpi_ssm_next_state (transfer->ssm); + } + else + { + fpi_ssm_jump_to_state (transfer->ssm, + CAPTURE_READ_DATA); + } + } + break; + + default: + fp_dbg ("Short frame %d, skip", + (gint) transfer->actual_length); + fpi_ssm_jump_to_state (transfer->ssm, CAPTURE_READ_DATA); + break; + } } -static void capture_run_state(FpiSsm *ssm, FpDevice *dev, void *user_data) +static void +capture_run_state (FpiSsm *ssm, FpDevice *dev, void *user_data) { - switch (fpi_ssm_get_cur_state(ssm)) { - case CAPTURE_WRITE_REQS: - { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(dev); + switch (fpi_ssm_get_cur_state (ssm)) + { + case CAPTURE_WRITE_REQS: + { + FpiUsbTransfer *transfer = fpi_usb_transfer_new (dev); - fpi_usb_transfer_fill_bulk_full(transfer, EP_OUT, capture_reqs, - sizeof(capture_reqs), NULL); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - capture_reqs_cb, NULL); - fpi_usb_transfer_unref(transfer); - } - break; - case CAPTURE_READ_DATA: - { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(dev); + fpi_usb_transfer_fill_bulk_full (transfer, EP_OUT, capture_reqs, + sizeof (capture_reqs), NULL); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + capture_reqs_cb, NULL); + fpi_usb_transfer_unref (transfer); + } + break; - fpi_usb_transfer_fill_bulk (transfer, EP_IN, AES2550_EP_IN_BUF_SIZE); - transfer->ssm = ssm; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - capture_read_data_cb, NULL); - fpi_usb_transfer_unref(transfer); - } - break; - case CAPTURE_SET_IDLE: - { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(dev); + case CAPTURE_READ_DATA: + { + FpiUsbTransfer *transfer = fpi_usb_transfer_new (dev); - fpi_usb_transfer_fill_bulk_full(transfer, EP_OUT, - capture_set_idle_reqs, - sizeof(capture_set_idle_reqs), - NULL); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - capture_set_idle_reqs_cb, NULL); - fpi_usb_transfer_unref(transfer); - } - break; - }; + fpi_usb_transfer_fill_bulk (transfer, EP_IN, AES2550_EP_IN_BUF_SIZE); + transfer->ssm = ssm; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + capture_read_data_cb, NULL); + fpi_usb_transfer_unref (transfer); + } + break; + + case CAPTURE_SET_IDLE: + { + FpiUsbTransfer *transfer = fpi_usb_transfer_new (dev); + + fpi_usb_transfer_fill_bulk_full (transfer, EP_OUT, + capture_set_idle_reqs, + sizeof (capture_set_idle_reqs), + NULL); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + capture_set_idle_reqs_cb, NULL); + fpi_usb_transfer_unref (transfer); + } + break; + } + ; } -static void capture_sm_complete(FpiSsm *ssm, FpDevice *_dev, void *user_data, - GError *error) +static void +capture_sm_complete (FpiSsm *ssm, FpDevice *_dev, void *user_data, + GError *error) { - FpImageDevice *dev = user_data; - FpiDeviceAes2550 *self = FPI_DEVICE_AES2550(_dev); + FpImageDevice *dev = user_data; + FpiDeviceAes2550 *self = FPI_DEVICE_AES2550 (_dev); - fp_dbg("Capture completed"); + fp_dbg ("Capture completed"); - if (self->deactivating) { - complete_deactivation(dev); - g_clear_pointer (&error, g_error_free); - } else if (error) { - fpi_image_device_session_error(dev, error); - } else { - start_finger_detection(dev); - } - fpi_ssm_free(ssm); + if (self->deactivating) + { + complete_deactivation (dev); + g_clear_pointer (&error, g_error_free); + } + else if (error) + { + fpi_image_device_session_error (dev, error); + } + else + { + start_finger_detection (dev); + } + fpi_ssm_free (ssm); } -static void start_capture(FpImageDevice *dev) +static void +start_capture (FpImageDevice *dev) { - FpiDeviceAes2550 *self = FPI_DEVICE_AES2550(dev); - FpiSsm *ssm; + FpiDeviceAes2550 *self = FPI_DEVICE_AES2550 (dev); + FpiSsm *ssm; - if (self->deactivating) { - complete_deactivation(dev); - return; - } + if (self->deactivating) + { + complete_deactivation (dev); + return; + } - self->heartbeat_cnt = 0; - ssm = fpi_ssm_new(FP_DEVICE(dev), capture_run_state, - CAPTURE_NUM_STATES, dev); - G_DEBUG_HERE(); - fpi_ssm_start(ssm, capture_sm_complete); + self->heartbeat_cnt = 0; + ssm = fpi_ssm_new (FP_DEVICE (dev), capture_run_state, + CAPTURE_NUM_STATES, dev); + G_DEBUG_HERE (); + fpi_ssm_start (ssm, capture_sm_complete); } /****** INITIALIZATION/DEINITIALIZATION ******/ static unsigned char init_reqs[] = { - 0x80, AES2550_REG80_MASTER_RESET, /* Master reset */ - 0x80, (1 << AES2550_REG80_SENSOR_MODE_OFS) | (AES2550_REG80_FORCE_FINGER_PRESENT), - 0x85, AES2550_REG85_FLUSH_PER_FRAME, - 0xa8, AES2550_REGA8_DIG_BIT_EN, - 0x81, AES2550_REG81_NSHOT, + 0x80, AES2550_REG80_MASTER_RESET, /* Master reset */ + 0x80, (1 << AES2550_REG80_SENSOR_MODE_OFS) | (AES2550_REG80_FORCE_FINGER_PRESENT), + 0x85, AES2550_REG85_FLUSH_PER_FRAME, + 0xa8, AES2550_REGA8_DIG_BIT_EN, + 0x81, AES2550_REG81_NSHOT, }; static unsigned char calibrate_reqs[] = { - 0x80, AES2550_REG80_MASTER_RESET, /* Master reset */ - AES2550_CMD_CALIBRATE, - AES2550_CMD_READ_CALIBRATION_DATA, + 0x80, AES2550_REG80_MASTER_RESET, /* Master reset */ + AES2550_CMD_CALIBRATE, + AES2550_CMD_READ_CALIBRATION_DATA, }; enum activate_states { - WRITE_INIT, - READ_DATA, - CALIBRATE, - READ_CALIB_TABLE, - ACTIVATE_NUM_STATES, + WRITE_INIT, + READ_DATA, + CALIBRATE, + READ_CALIB_TABLE, + ACTIVATE_NUM_STATES, }; -static void init_reqs_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +init_reqs_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - if (!error) { - fpi_ssm_next_state(transfer->ssm); - } else { - fpi_ssm_mark_failed(transfer->ssm, error); - } + if (!error) + fpi_ssm_next_state (transfer->ssm); + else + fpi_ssm_mark_failed (transfer->ssm, error); } -static void init_read_data_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +init_read_data_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - if (!error) { - fpi_ssm_next_state(transfer->ssm); - } else { - fpi_ssm_mark_failed(transfer->ssm, error); - } + if (!error) + fpi_ssm_next_state (transfer->ssm); + else + fpi_ssm_mark_failed (transfer->ssm, error); } /* TODO: use calibration table, datasheet is rather terse on that * need more info for implementation */ -static void calibrate_read_data_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +calibrate_read_data_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - if (!error) { - fpi_ssm_next_state(transfer->ssm); - } else { - fpi_ssm_mark_failed(transfer->ssm, error); - } + if (!error) + fpi_ssm_next_state (transfer->ssm); + else + fpi_ssm_mark_failed (transfer->ssm, error); } -static void activate_run_state(FpiSsm *ssm, FpDevice *dev, void *user_data) +static void +activate_run_state (FpiSsm *ssm, FpDevice *dev, void *user_data) { - switch (fpi_ssm_get_cur_state(ssm)) { - case WRITE_INIT: - { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(dev); + switch (fpi_ssm_get_cur_state (ssm)) + { + case WRITE_INIT: + { + FpiUsbTransfer *transfer = fpi_usb_transfer_new (dev); - fpi_usb_transfer_fill_bulk_full(transfer, EP_OUT, init_reqs, - sizeof(init_reqs), NULL); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - init_reqs_cb, NULL); - fpi_usb_transfer_unref(transfer); - } - break; - case READ_DATA: - { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(dev); + fpi_usb_transfer_fill_bulk_full (transfer, EP_OUT, init_reqs, + sizeof (init_reqs), NULL); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + init_reqs_cb, NULL); + fpi_usb_transfer_unref (transfer); + } + break; - fpi_usb_transfer_fill_bulk(transfer, EP_IN, AES2550_EP_IN_BUF_SIZE); - transfer->ssm = ssm; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - init_read_data_cb, NULL); - fpi_usb_transfer_unref(transfer); - } - break; - case CALIBRATE: - { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(dev); + case READ_DATA: + { + FpiUsbTransfer *transfer = fpi_usb_transfer_new (dev); - fpi_usb_transfer_fill_bulk_full(transfer, EP_OUT, - calibrate_reqs, - sizeof(calibrate_reqs), NULL); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - init_reqs_cb, NULL); - fpi_usb_transfer_unref(transfer); - } - break; - case READ_CALIB_TABLE: - { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(dev); + fpi_usb_transfer_fill_bulk (transfer, EP_IN, AES2550_EP_IN_BUF_SIZE); + transfer->ssm = ssm; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + init_read_data_cb, NULL); + fpi_usb_transfer_unref (transfer); + } + break; - fpi_usb_transfer_fill_bulk(transfer, EP_IN, AES2550_EP_IN_BUF_SIZE); - transfer->ssm = ssm; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - calibrate_read_data_cb, NULL); - fpi_usb_transfer_unref(transfer); - } - break; - } + case CALIBRATE: + { + FpiUsbTransfer *transfer = fpi_usb_transfer_new (dev); + + fpi_usb_transfer_fill_bulk_full (transfer, EP_OUT, + calibrate_reqs, + sizeof (calibrate_reqs), NULL); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + init_reqs_cb, NULL); + fpi_usb_transfer_unref (transfer); + } + break; + + case READ_CALIB_TABLE: + { + FpiUsbTransfer *transfer = fpi_usb_transfer_new (dev); + + fpi_usb_transfer_fill_bulk (transfer, EP_IN, AES2550_EP_IN_BUF_SIZE); + transfer->ssm = ssm; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + calibrate_read_data_cb, NULL); + fpi_usb_transfer_unref (transfer); + } + break; + } } -static void activate_sm_complete(FpiSsm *ssm, FpDevice *_dev, - void *user_data, GError *error) +static void +activate_sm_complete (FpiSsm *ssm, FpDevice *_dev, + void *user_data, GError *error) { - FpImageDevice *dev = user_data; + FpImageDevice *dev = user_data; - fpi_image_device_activate_complete(dev, error); + fpi_image_device_activate_complete (dev, error); - if (!error) - start_finger_detection(dev); - fpi_ssm_free(ssm); + if (!error) + start_finger_detection (dev); + fpi_ssm_free (ssm); } -static void dev_activate(FpImageDevice *dev) +static void +dev_activate (FpImageDevice *dev) { - FpiSsm *ssm = fpi_ssm_new(FP_DEVICE(dev), activate_run_state, - ACTIVATE_NUM_STATES, dev); - fpi_ssm_start(ssm, activate_sm_complete); + FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (dev), activate_run_state, + ACTIVATE_NUM_STATES, dev); + + fpi_ssm_start (ssm, activate_sm_complete); } -static void dev_deactivate(FpImageDevice *dev) +static void +dev_deactivate (FpImageDevice *dev) { - FpiDeviceAes2550 *self = FPI_DEVICE_AES2550(dev); + FpiDeviceAes2550 *self = FPI_DEVICE_AES2550 (dev); - self->deactivating = TRUE; + self->deactivating = TRUE; } -static void complete_deactivation(FpImageDevice *dev) +static void +complete_deactivation (FpImageDevice *dev) { - FpiDeviceAes2550 *self = FPI_DEVICE_AES2550(dev); - G_DEBUG_HERE(); + FpiDeviceAes2550 *self = FPI_DEVICE_AES2550 (dev); - self->deactivating = FALSE; - g_slist_free(self->strips); - self->strips = NULL; - self->strips_len = 0; - fpi_image_device_deactivate_complete(dev, NULL); + G_DEBUG_HERE (); + + self->deactivating = FALSE; + g_slist_free (self->strips); + self->strips = NULL; + self->strips_len = 0; + fpi_image_device_deactivate_complete (dev, NULL); } -static void dev_init(FpImageDevice *dev) +static void +dev_init (FpImageDevice *dev) { - GError *error = NULL; - /* TODO check that device has endpoints we're using */ + GError *error = NULL; - g_usb_device_claim_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), 0, 0, &error); + /* TODO check that device has endpoints we're using */ - fpi_image_device_open_complete(dev, error); + g_usb_device_claim_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), 0, 0, &error); + + fpi_image_device_open_complete (dev, error); } -static void dev_deinit(FpImageDevice *dev) +static void +dev_deinit (FpImageDevice *dev) { - GError *error = NULL; + GError *error = NULL; - g_usb_device_release_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), - 0, 0, &error); - fpi_image_device_close_complete(dev, error); + g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), + 0, 0, &error); + fpi_image_device_close_complete (dev, error); } -static const FpIdEntry id_table [ ] = { - { .vid = 0x08ff, .pid = 0x2550, - }, /* AES2550 */ - { .vid = 0x08ff, .pid = 0x2810, - }, /* AES2810 */ - { .vid = 0, .pid = 0, .driver_data = 0 }, +static const FpIdEntry id_table[] = { + { .vid = 0x08ff, .pid = 0x2550, },/* AES2550 */ + { .vid = 0x08ff, .pid = 0x2810, },/* AES2810 */ + { .vid = 0, .pid = 0, .driver_data = 0 }, }; -static void fpi_device_aes2550_init(FpiDeviceAes2550 *self) { +static void +fpi_device_aes2550_init (FpiDeviceAes2550 *self) +{ } -static void fpi_device_aes2550_class_init(FpiDeviceAes2550Class *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); - FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS(klass); +static void +fpi_device_aes2550_class_init (FpiDeviceAes2550Class *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); + FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); - dev_class->id = "aes2550"; - dev_class->full_name = "AuthenTec AES2550/AES2810"; - dev_class->type = FP_DEVICE_TYPE_USB; - dev_class->id_table = id_table; - dev_class->scan_type = FP_SCAN_TYPE_SWIPE; + dev_class->id = "aes2550"; + dev_class->full_name = "AuthenTec AES2550/AES2810"; + dev_class->type = FP_DEVICE_TYPE_USB; + dev_class->id_table = id_table; + dev_class->scan_type = FP_SCAN_TYPE_SWIPE; - img_class->img_open = dev_init; - img_class->img_close = dev_deinit; - img_class->activate = dev_activate; - img_class->deactivate = dev_deactivate; + img_class->img_open = dev_init; + img_class->img_close = dev_deinit; + img_class->activate = dev_activate; + img_class->deactivate = dev_deactivate; - img_class->img_width = FRAME_WIDTH + FRAME_WIDTH / 2; - img_class->img_height = -1; + img_class->img_width = FRAME_WIDTH + FRAME_WIDTH / 2; + img_class->img_height = -1; } diff --git a/libfprint/drivers/aes2550.h b/libfprint/drivers/aes2550.h index cd1e22d..8e4ca17 100644 --- a/libfprint/drivers/aes2550.h +++ b/libfprint/drivers/aes2550.h @@ -22,93 +22,93 @@ /* Registers bits */ -#define AES2550_REG80_MASTER_RESET (1 << 0) -#define AES2550_REG80_FORCE_FINGER_PRESENT (1 << 1) -#define AES2550_REG80_LPO_START (1 << 2) -#define AES2550_REG80_HGC_ENABLE (1 << 3) -#define AES2550_REG80_SENSOR_MODE_OFS (4) -#define AES2550_REG80_AUTO_RESTART_FD (1 << 6) -#define AES2550_REG80_EXT_REG_ENABLE (1 << 7) +#define AES2550_REG80_MASTER_RESET (1 << 0) +#define AES2550_REG80_FORCE_FINGER_PRESENT (1 << 1) +#define AES2550_REG80_LPO_START (1 << 2) +#define AES2550_REG80_HGC_ENABLE (1 << 3) +#define AES2550_REG80_SENSOR_MODE_OFS (4) +#define AES2550_REG80_AUTO_RESTART_FD (1 << 6) +#define AES2550_REG80_EXT_REG_ENABLE (1 << 7) -#define AES2550_REG81_CONT_SCAN (1 << 0) -#define AES2550_REG81_READ_REG (1 << 1) -#define AES2550_REG81_NSHOT (1 << 2) -#define AES2550_REG81_RUN_FD (1 << 3) -#define AES2550_REG81_READ_ID (1 << 4) -#define AES2550_REG81_RUN_CAL (1 << 5) -#define AES2550_REG81_RUN_TIMER (1 << 6) -#define AES2550_REG81_RUN_BIST (1 << 7) +#define AES2550_REG81_CONT_SCAN (1 << 0) +#define AES2550_REG81_READ_REG (1 << 1) +#define AES2550_REG81_NSHOT (1 << 2) +#define AES2550_REG81_RUN_FD (1 << 3) +#define AES2550_REG81_READ_ID (1 << 4) +#define AES2550_REG81_RUN_CAL (1 << 5) +#define AES2550_REG81_RUN_TIMER (1 << 6) +#define AES2550_REG81_RUN_BIST (1 << 7) -#define AES2550_REG83_FINGER_PRESENT (1 << 7) +#define AES2550_REG83_FINGER_PRESENT (1 << 7) -#define AES2550_REG85_FLUSH_PER_FRAME (1 << 7) +#define AES2550_REG85_FLUSH_PER_FRAME (1 << 7) -#define AES2550_REG8F_EDATA_DISABLE (1 << 1) -#define AES2550_REG8F_AUTH_DISABLE (1 << 2) -#define AES2550_REG8F_EHISTO_DISABLE (1 << 3) -#define AES2550_REG8F_HISTO64 (1 << 4) -#define AES2550_REG8F_SINGLE_REG_ENABLE (1 << 6) +#define AES2550_REG8F_EDATA_DISABLE (1 << 1) +#define AES2550_REG8F_AUTH_DISABLE (1 << 2) +#define AES2550_REG8F_EHISTO_DISABLE (1 << 3) +#define AES2550_REG8F_HISTO64 (1 << 4) +#define AES2550_REG8F_SINGLE_REG_ENABLE (1 << 6) -#define AES2550_REG95_COL_SCANNED_OFS (0) -#define AES2550_REG95_EPIX_AVG_OFS (4) +#define AES2550_REG95_COL_SCANNED_OFS (0) +#define AES2550_REG95_EPIX_AVG_OFS (4) -#define AES2550_REGA8_DIG_BIT_DATA_OFS (0) -#define AES2550_REGA8_DIG_BIT_EN (1 << 4) -#define AES2550_REGA8_FIXED_BIT_DATA (1 << 5) -#define AES2550_REGA8_INVERT_BIT_DATA (1 << 6) +#define AES2550_REGA8_DIG_BIT_DATA_OFS (0) +#define AES2550_REGA8_DIG_BIT_EN (1 << 4) +#define AES2550_REGA8_FIXED_BIT_DATA (1 << 5) +#define AES2550_REGA8_INVERT_BIT_DATA (1 << 6) -#define AES2550_REGAD_LPFD_AVG_OFS (0) -#define AES2550_REGAD_DETECT_FGROFF (1 << 4) -#define AES2550_REGAD_ADVRANGE_2V (1 << 6) +#define AES2550_REGAD_LPFD_AVG_OFS (0) +#define AES2550_REGAD_DETECT_FGROFF (1 << 4) +#define AES2550_REGAD_ADVRANGE_2V (1 << 6) -#define AES2550_REGB1_ATE_CONT_IMAGE (1 << 1) -#define AES2550_REGB1_ANALOG_RESET (1 << 2) -#define AES2550_REGB1_ANALOG_PD (1 << 3) -#define AES2550_REGB1_TEST_EMBD_WORD (1 << 4) -#define AES2550_REGB1_ORIG_EMBD_WORD (1 << 5) -#define AES2550_REGB1_RESET_UHSM (1 << 6) -#define AES2550_REGB1_RESET_SENSOR (1 << 7) +#define AES2550_REGB1_ATE_CONT_IMAGE (1 << 1) +#define AES2550_REGB1_ANALOG_RESET (1 << 2) +#define AES2550_REGB1_ANALOG_PD (1 << 3) +#define AES2550_REGB1_TEST_EMBD_WORD (1 << 4) +#define AES2550_REGB1_ORIG_EMBD_WORD (1 << 5) +#define AES2550_REGB1_RESET_UHSM (1 << 6) +#define AES2550_REGB1_RESET_SENSOR (1 << 7) -#define AES2550_REGBD_LPO_IN_15_8_OFS (0) -#define AES2550_REGBE_LPO_IN_7_0_OFS (0) +#define AES2550_REGBD_LPO_IN_15_8_OFS (0) +#define AES2550_REGBE_LPO_IN_7_0_OFS (0) -#define AES2550_REGBF_RSR_LEVEL_DISABLED (0 << 0) -#define AES2550_REGBF_RSR_LEVEL_LEADING_RSR (1 << 0) -#define AES2550_REGBF_RSR_LEVEL_SIMPLE_RSR (2 << 0) -#define AES2550_REGBF_RSR_LEVEL_SUPER_RSR (3 << 0) -#define AES2550_REGBF_RSR_DIR_DOWN_MOTION (0 << 2) -#define AES2550_REGBF_RSR_DIR_UP_MOTION (1 << 2) -#define AES2550_REGBF_RSR_DIR_UPDOWN_MOTION (2 << 2) -#define AES2550_REGBF_NOISE_FLOOR_MODE (1 << 4) -#define AES2550_REGBF_QUADRATURE_MODE (1 << 5) +#define AES2550_REGBF_RSR_LEVEL_DISABLED (0 << 0) +#define AES2550_REGBF_RSR_LEVEL_LEADING_RSR (1 << 0) +#define AES2550_REGBF_RSR_LEVEL_SIMPLE_RSR (2 << 0) +#define AES2550_REGBF_RSR_LEVEL_SUPER_RSR (3 << 0) +#define AES2550_REGBF_RSR_DIR_DOWN_MOTION (0 << 2) +#define AES2550_REGBF_RSR_DIR_UP_MOTION (1 << 2) +#define AES2550_REGBF_RSR_DIR_UPDOWN_MOTION (2 << 2) +#define AES2550_REGBF_NOISE_FLOOR_MODE (1 << 4) +#define AES2550_REGBF_QUADRATURE_MODE (1 << 5) -#define AES2550_REGCF_INTERFERENCE_CHK_EN (1 << 0) -#define AES2550_REGCF_INTERFERENCE_AVG_EN (1 << 1) -#define AES2550_REGCF_INTERFERENCE_AVG_OFFS (4) +#define AES2550_REGCF_INTERFERENCE_CHK_EN (1 << 0) +#define AES2550_REGCF_INTERFERENCE_AVG_EN (1 << 1) +#define AES2550_REGCF_INTERFERENCE_AVG_OFFS (4) -#define AES2550_REGDC_BP_NUM_REF_SWEEP_OFS (0) -#define AES2550_REGDC_DEBUG_CTRL2_OFS (3) +#define AES2550_REGDC_BP_NUM_REF_SWEEP_OFS (0) +#define AES2550_REGDC_DEBUG_CTRL2_OFS (3) -#define AES2550_REGDD_DEBUG_CTRL1_OFS (0) +#define AES2550_REGDD_DEBUG_CTRL1_OFS (0) /* Commands */ enum aes2550_cmds { - AES2550_CMD_SET_IDLE_MODE = 0x00, - AES2550_CMD_RUN_FD = 0x01, - AES2550_CMD_GET_ENROLL_IMG = 0x02, - AES2550_CMD_CALIBRATE = 0x06, - AES2550_CMD_READ_CALIBRATION_DATA = 0x10, - AES2550_CMD_HEARTBEAT = 0x70, + AES2550_CMD_SET_IDLE_MODE = 0x00, + AES2550_CMD_RUN_FD = 0x01, + AES2550_CMD_GET_ENROLL_IMG = 0x02, + AES2550_CMD_CALIBRATE = 0x06, + AES2550_CMD_READ_CALIBRATION_DATA = 0x10, + AES2550_CMD_HEARTBEAT = 0x70, }; /* Messages */ -#define AES2550_STRIP_SIZE (0x31e + 3) -#define AES2550_HEARTBEAT_SIZE (4 + 3) -#define AES2550_EDATA_MAGIC 0xe0 -#define AES2550_HEARTBEAT_MAGIC 0xdb +#define AES2550_STRIP_SIZE (0x31e + 3) +#define AES2550_HEARTBEAT_SIZE (4 + 3) +#define AES2550_EDATA_MAGIC 0xe0 +#define AES2550_HEARTBEAT_MAGIC 0xdb -#define AES2550_EP_IN_BUF_SIZE 8192 +#define AES2550_EP_IN_BUF_SIZE 8192 #endif diff --git a/libfprint/drivers/aes2660.c b/libfprint/drivers/aes2660.c index 3b05464..fb5aa7e 100644 --- a/libfprint/drivers/aes2660.c +++ b/libfprint/drivers/aes2660.c @@ -25,68 +25,73 @@ #include "aes2660.h" #define FRAME_WIDTH 192 -#define IMAGE_WIDTH (FRAME_WIDTH + (FRAME_WIDTH / 2)) +#define IMAGE_WIDTH (FRAME_WIDTH + (FRAME_WIDTH / 2)) -struct _FpiDeviceAes2660 { - FpiDeviceAesX660 parent; +struct _FpiDeviceAes2660 +{ + FpiDeviceAesX660 parent; }; -G_DECLARE_FINAL_TYPE(FpiDeviceAes2660, fpi_device_aes2660, FPI, - DEVICE_AES2660, FpiDeviceAesX660); -G_DEFINE_TYPE(FpiDeviceAes2660, fpi_device_aes2660, FPI_TYPE_DEVICE_AES_X660); +G_DECLARE_FINAL_TYPE (FpiDeviceAes2660, fpi_device_aes2660, FPI, + DEVICE_AES2660, FpiDeviceAesX660); +G_DEFINE_TYPE (FpiDeviceAes2660, fpi_device_aes2660, FPI_TYPE_DEVICE_AES_X660); static struct fpi_frame_asmbl_ctx assembling_ctx = { - .frame_width = FRAME_WIDTH, - .frame_height = AESX660_FRAME_HEIGHT, - .image_width = IMAGE_WIDTH, - .get_pixel = aes_get_pixel, + .frame_width = FRAME_WIDTH, + .frame_height = AESX660_FRAME_HEIGHT, + .image_width = IMAGE_WIDTH, + .get_pixel = aes_get_pixel, }; -static const FpIdEntry id_table [ ] = { - { .vid = 0x08ff, .pid = 0x2660, }, - { .vid = 0x08ff, .pid = 0x2680, }, - { .vid = 0x08ff, .pid = 0x2681, }, - { .vid = 0x08ff, .pid = 0x2682, }, - { .vid = 0x08ff, .pid = 0x2683, }, - { .vid = 0x08ff, .pid = 0x2684, }, - { .vid = 0x08ff, .pid = 0x2685, }, - { .vid = 0x08ff, .pid = 0x2686, }, - { .vid = 0x08ff, .pid = 0x2687, }, - { .vid = 0x08ff, .pid = 0x2688, }, - { .vid = 0x08ff, .pid = 0x2689, }, - { .vid = 0x08ff, .pid = 0x268a, }, - { .vid = 0x08ff, .pid = 0x268b, }, - { .vid = 0x08ff, .pid = 0x268c, }, - { .vid = 0x08ff, .pid = 0x268d, }, - { .vid = 0x08ff, .pid = 0x268e, }, - { .vid = 0x08ff, .pid = 0x268f, }, - { .vid = 0x08ff, .pid = 0x2691, }, - { .vid = 0, .pid = 0, .driver_data = 0 }, +static const FpIdEntry id_table[] = { + { .vid = 0x08ff, .pid = 0x2660, }, + { .vid = 0x08ff, .pid = 0x2680, }, + { .vid = 0x08ff, .pid = 0x2681, }, + { .vid = 0x08ff, .pid = 0x2682, }, + { .vid = 0x08ff, .pid = 0x2683, }, + { .vid = 0x08ff, .pid = 0x2684, }, + { .vid = 0x08ff, .pid = 0x2685, }, + { .vid = 0x08ff, .pid = 0x2686, }, + { .vid = 0x08ff, .pid = 0x2687, }, + { .vid = 0x08ff, .pid = 0x2688, }, + { .vid = 0x08ff, .pid = 0x2689, }, + { .vid = 0x08ff, .pid = 0x268a, }, + { .vid = 0x08ff, .pid = 0x268b, }, + { .vid = 0x08ff, .pid = 0x268c, }, + { .vid = 0x08ff, .pid = 0x268d, }, + { .vid = 0x08ff, .pid = 0x268e, }, + { .vid = 0x08ff, .pid = 0x268f, }, + { .vid = 0x08ff, .pid = 0x2691, }, + { .vid = 0, .pid = 0, .driver_data = 0 }, }; -static void fpi_device_aes2660_init(FpiDeviceAes2660 *self) { +static void +fpi_device_aes2660_init (FpiDeviceAes2660 *self) +{ } -static void fpi_device_aes2660_class_init(FpiDeviceAes2660Class *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); - FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS(klass); - FpiDeviceAesX660Class *aes_class = FPI_DEVICE_AES_X660_CLASS (klass); +static void +fpi_device_aes2660_class_init (FpiDeviceAes2660Class *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); + FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); + FpiDeviceAesX660Class *aes_class = FPI_DEVICE_AES_X660_CLASS (klass); - dev_class->id = "aes2660"; - dev_class->full_name = "AuthenTec AES2660"; - dev_class->type = FP_DEVICE_TYPE_USB; - dev_class->id_table = id_table; - dev_class->scan_type = FP_SCAN_TYPE_SWIPE; + dev_class->id = "aes2660"; + dev_class->full_name = "AuthenTec AES2660"; + dev_class->type = FP_DEVICE_TYPE_USB; + dev_class->id_table = id_table; + dev_class->scan_type = FP_SCAN_TYPE_SWIPE; - img_class->bz3_threshold = 20; + img_class->bz3_threshold = 20; - img_class->img_width = FRAME_WIDTH + FRAME_WIDTH / 2; - img_class->img_height = -1; + img_class->img_width = FRAME_WIDTH + FRAME_WIDTH / 2; + img_class->img_height = -1; - aes_class->init_seqs[0] = aes2660_init_1; - aes_class->init_seqs_len[0] = G_N_ELEMENTS(aes2660_init_1); - aes_class->init_seqs[1] = aes2660_init_2; - aes_class->init_seqs_len[1] = G_N_ELEMENTS(aes2660_init_2); - aes_class->start_imaging_cmd = (unsigned char *)aes2660_start_imaging_cmd; - aes_class->start_imaging_cmd_len = sizeof(aes2660_start_imaging_cmd); - aes_class->assembling_ctx = &assembling_ctx; + aes_class->init_seqs[0] = aes2660_init_1; + aes_class->init_seqs_len[0] = G_N_ELEMENTS (aes2660_init_1); + aes_class->init_seqs[1] = aes2660_init_2; + aes_class->init_seqs_len[1] = G_N_ELEMENTS (aes2660_init_2); + aes_class->start_imaging_cmd = (unsigned char *) aes2660_start_imaging_cmd; + aes_class->start_imaging_cmd_len = sizeof (aes2660_start_imaging_cmd); + aes_class->assembling_ctx = &assembling_ctx; } diff --git a/libfprint/drivers/aes2660.h b/libfprint/drivers/aes2660.h index c85bb0a..d59f4be 100644 --- a/libfprint/drivers/aes2660.h +++ b/libfprint/drivers/aes2660.h @@ -29,1936 +29,1936 @@ /* INIT1 */ static const unsigned char pkt13[] = { -0x44, 0x02, 0x00, 0x04, 0x00, -0x0d, -0x23, -0x42, 0xca, 0x00, -0x00, 0x20, 0x7f, /* .#B... . */ -0x97, 0x37, 0xcf, 0xdf, 0x96, 0x26, 0xcf, 0xdf, /* .7...&.. */ -0x96, 0xff, 0x96, 0x9f, 0x22, 0x6d, 0x2e, 0x6a, /* ...."m.j */ -0xbf, 0x62, 0x23, 0x23, 0x83, 0xdd, 0x97, 0x26, /* .b##...& */ -0xaf, 0xdd, 0x97, 0x37, 0xaf, 0xa9, 0xcf, 0x70, /* ...7...p */ -0x18, 0xa9, 0xaf, 0x02, 0xef, 0x5d, 0xaf, 0xc5, /* .....].. */ -0xef, 0x2f, 0xff, 0xff, 0x96, 0xdf, 0x96, 0x69, /* ./.....i */ -0xef, 0x20, 0xff, 0xff, 0x96, 0xdf, 0x96, 0x1a, /* . ...... */ -0x27, 0x0b, 0xef, 0x06, 0xaf, 0xf1, 0x81, 0x3a, /* '......: */ -0xff, 0x3f, 0x1d, 0xc1, 0x2e, 0xa3, 0xbf, 0xc2, /* .?...... */ -0x2e, 0x00, 0xdf, 0xff, 0x2d, 0x02, 0x5a, 0xbf, /* ....-.Z. */ -0x22, 0xc1, 0x2e, 0xa3, 0xbf, 0x3c, 0x23, 0x57, /* "....<#W */ -0x23, 0x02, 0x2e, 0x30, 0x80, 0x05, 0x27, 0x12, /* #..0..'. */ -0xef, 0x99, 0xaf, 0x10, 0xef, 0x9b, 0xaf, 0x10, /* ........ */ -0xef, 0x55, 0xaf, 0x3d, 0x23, 0x30, 0xef, 0x20, /* .U.=#0. */ -0xff, 0x1a, 0x27, 0x05, 0xef, 0x27, 0xff, 0x06, /* ..'..'.. */ -0x27, 0x05, 0x27, 0x3f, 0x80, 0x2b, 0x0d, 0x05, /* '.'?.+.. */ -0x27, 0xe5, 0x31, 0x05, 0x81, 0xe5, 0x39, 0x05, /* '.1...9. */ -0x27, 0xc8, 0x46, 0x0e, 0x5b, 0xd3, 0x45, 0xfd, /* '.F.[.E. */ -0x5a, 0x0f, 0x27, 0xd3, 0x45, 0xfa, 0x5a, 0x0f, /* Z.'.E.Z. */ -0x27, 0xd3, 0x45, 0xf7, 0x5a, 0x41, 0x2e, 0xa1, /* '.E.ZA.. */ -0xdf, 0x9f, 0x28, 0x41, 0x2e, 0xa1, 0xbf, 0x02, /* ..(A.... */ -0x2e, 0x57, 0x80, 0x05, 0x27, 0x9f, 0x22, 0xbf, /* .W..'.". */ -0x22, 0x1f, 0x20, 0xfd, 0x53, 0x3f, 0x20, 0x14, /* ". .S? . */ -0x1f, 0xfa, 0x55, 0x05, 0x27, 0x10, 0xef, 0xd0, /* ..U.'... */ -0x81, 0x65, 0xaf, 0x10, 0xef, 0xd0, 0x81 /* .e..... */ + 0x44, 0x02, 0x00, 0x04, 0x00, + 0x0d, + 0x23, + 0x42, 0xca, 0x00, + 0x00, 0x20, 0x7f, /* .#B... . */ + 0x97, 0x37, 0xcf, 0xdf, 0x96, 0x26, 0xcf, 0xdf, /* .7...&.. */ + 0x96, 0xff, 0x96, 0x9f, 0x22, 0x6d, 0x2e, 0x6a, /* ...."m.j */ + 0xbf, 0x62, 0x23, 0x23, 0x83, 0xdd, 0x97, 0x26, /* .b##...& */ + 0xaf, 0xdd, 0x97, 0x37, 0xaf, 0xa9, 0xcf, 0x70, /* ...7...p */ + 0x18, 0xa9, 0xaf, 0x02, 0xef, 0x5d, 0xaf, 0xc5, /* .....].. */ + 0xef, 0x2f, 0xff, 0xff, 0x96, 0xdf, 0x96, 0x69, /* ./.....i */ + 0xef, 0x20, 0xff, 0xff, 0x96, 0xdf, 0x96, 0x1a, /* . ...... */ + 0x27, 0x0b, 0xef, 0x06, 0xaf, 0xf1, 0x81, 0x3a, /* '......: */ + 0xff, 0x3f, 0x1d, 0xc1, 0x2e, 0xa3, 0xbf, 0xc2, /* .?...... */ + 0x2e, 0x00, 0xdf, 0xff, 0x2d, 0x02, 0x5a, 0xbf, /* ....-.Z. */ + 0x22, 0xc1, 0x2e, 0xa3, 0xbf, 0x3c, 0x23, 0x57, /* "....<#W */ + 0x23, 0x02, 0x2e, 0x30, 0x80, 0x05, 0x27, 0x12, /* #..0..'. */ + 0xef, 0x99, 0xaf, 0x10, 0xef, 0x9b, 0xaf, 0x10, /* ........ */ + 0xef, 0x55, 0xaf, 0x3d, 0x23, 0x30, 0xef, 0x20, /* .U.=#0. */ + 0xff, 0x1a, 0x27, 0x05, 0xef, 0x27, 0xff, 0x06, /* ..'..'.. */ + 0x27, 0x05, 0x27, 0x3f, 0x80, 0x2b, 0x0d, 0x05, /* '.'?.+.. */ + 0x27, 0xe5, 0x31, 0x05, 0x81, 0xe5, 0x39, 0x05, /* '.1...9. */ + 0x27, 0xc8, 0x46, 0x0e, 0x5b, 0xd3, 0x45, 0xfd, /* '.F.[.E. */ + 0x5a, 0x0f, 0x27, 0xd3, 0x45, 0xfa, 0x5a, 0x0f, /* Z.'.E.Z. */ + 0x27, 0xd3, 0x45, 0xf7, 0x5a, 0x41, 0x2e, 0xa1, /* '.E.ZA.. */ + 0xdf, 0x9f, 0x28, 0x41, 0x2e, 0xa1, 0xbf, 0x02, /* ..(A.... */ + 0x2e, 0x57, 0x80, 0x05, 0x27, 0x9f, 0x22, 0xbf, /* .W..'.". */ + 0x22, 0x1f, 0x20, 0xfd, 0x53, 0x3f, 0x20, 0x14, /* ". .S? . */ + 0x1f, 0xfa, 0x55, 0x05, 0x27, 0x10, 0xef, 0xd0, /* ..U.'... */ + 0x81, 0x65, 0xaf, 0x10, 0xef, 0xd0, 0x81 /* .e..... */ }; static const unsigned char pkt15[] = { -0x42, 0x48, 0x00, -0x64, 0x20, 0x9c, 0xaf, 0x10, /* BH.d ... */ -0xef, 0xd0, 0x81, 0x9a, 0xaf, 0x05, 0x27, 0x11, /* ......'. */ -0x00, 0x51, 0x87, 0x91, 0x81, 0xd1, 0x6c, 0xd2, /* .Q....l. */ -0x75, 0xe2, 0x80, 0xf2, 0x80, 0xf0, 0x57, 0xf4, /* u.....W. */ -0x7b, 0xf8, 0x7e, 0xfc, 0x8b, 0x10, 0xcf, 0x7c, /* {.~....| */ -0xff, 0x3f, 0x00, 0x20, 0xff, 0x00, 0x13, 0x1a, /* .?. .... */ -0x27, 0x07, 0x27, 0x05, 0x27, 0x01, 0x00, 0x11, /* '.'.'... */ -0x00, 0x21, 0x00, 0x31, 0x00, 0x31, 0x01, 0x32, /* .!.1.1.2 */ -0x01, 0x33, 0x01, 0x33, 0x03, 0x43, 0x03, 0x53, /* .3.3.C.S */ -0x03, 0x63, 0x03 /* .c. */ + 0x42, 0x48, 0x00, + 0x64, 0x20, 0x9c, 0xaf, 0x10, /* BH.d ... */ + 0xef, 0xd0, 0x81, 0x9a, 0xaf, 0x05, 0x27, 0x11, /* ......'. */ + 0x00, 0x51, 0x87, 0x91, 0x81, 0xd1, 0x6c, 0xd2, /* .Q....l. */ + 0x75, 0xe2, 0x80, 0xf2, 0x80, 0xf0, 0x57, 0xf4, /* u.....W. */ + 0x7b, 0xf8, 0x7e, 0xfc, 0x8b, 0x10, 0xcf, 0x7c, /* {.~....| */ + 0xff, 0x3f, 0x00, 0x20, 0xff, 0x00, 0x13, 0x1a, /* .?. .... */ + 0x27, 0x07, 0x27, 0x05, 0x27, 0x01, 0x00, 0x11, /* '.'.'... */ + 0x00, 0x21, 0x00, 0x31, 0x00, 0x31, 0x01, 0x32, /* .!.1.1.2 */ + 0x01, 0x33, 0x01, 0x33, 0x03, 0x43, 0x03, 0x53, /* .3.3.C.S */ + 0x03, 0x63, 0x03 /* .c. */ }; static const unsigned char pkt17[] = { -0x42, 0xca, 0x00, -0x87, 0x20, 0x51, 0x85, 0x44, /* B... Q.D */ -0x1e, 0x03, 0x55, 0xc8, 0x46, 0x01, 0x5b, 0xe4, /* ..U.F.[. */ -0x2f, 0xc9, 0x50, 0x49, 0x1e, 0x16, 0x55, 0xe4, /* /.PI..U. */ -0x2f, 0xc5, 0x50, 0x02, 0xef, 0x02, 0x2e, 0x62, /* /.P....b */ -0x82, 0xfe, 0xcf, 0x08, 0xaf, 0xfe, 0xcf, 0x09, /* ........ */ -0xaf, 0xfe, 0xcf, 0x0b, 0xaf, 0x55, 0x81, 0x02, /* .....U.. */ -0xcf, 0x0f, 0x1c, 0x40, 0x18, 0x08, 0x42, 0x00, /* ...@..B. */ -0x5b, 0x20, 0x18, 0x3d, 0x23, 0x02, 0xaf, 0x10, /* [ .=#... */ -0xef, 0x55, 0xaf, 0x05, 0x27, 0x4a, 0x1e, 0x01, /* .U..'J.. */ -0x55, 0xe4, 0x2f, 0xac, 0x50, 0x4e, 0x1e, 0x01, /* U./.PN.. */ -0x55, 0x00, 0x2e, 0x0d, 0x7b, 0x4f, 0x1e, 0x01, /* U...{O.. */ -0x55, 0x02, 0x2e, 0xbd, 0x71, 0x51, 0x1e, 0x1a, /* U...qQ.. */ -0x55, 0xf9, 0xcf, 0x67, 0xaf, 0xcf, 0x1c, 0xf9, /* U..g.... */ -0xaf, 0xff, 0x86, 0xbf, 0x22, 0x09, 0xbf, 0xfe, /* ...."... */ -0xdf, 0x00, 0x2e, 0xd7, 0x8b, 0x01, 0xef, 0x3b, /* .......; */ -0xaf, 0x01, 0x2e, 0x63, 0x84, 0x3b, 0x80, 0x3b, /* ...c.;.; */ -0xcf, 0x1f, 0x99, 0x01, 0x2e, 0x07, 0x85, 0x00, /* ........ */ -0x2e, 0xa7, 0x8a, 0xbf, 0x22, 0xc1, 0x2e, 0x49, /* ...."..I */ -0xbf, 0x67, 0xcf, 0xf9, 0xaf, 0x05, 0x27, 0x54, /* .g....'T */ -0x1e, 0x32, 0x55, 0x04, 0xef, 0x20, 0x80, 0xe4, /* .2U.. .. */ -0x2f, 0x81, 0x5a, 0x23, 0x81, 0xfe, 0xcf, 0xfe, /* /.Z#.... */ -0xdf, 0xff, 0x96, 0xdf, 0x96, 0xfe, 0xcf, 0xfe, /* ........ */ -0xdf, 0xff, 0x96, 0xdf, 0x96, 0xdf, 0x22, 0x01, /* ......". */ -0x55, 0xff, 0x22, 0x06, 0x54, 0xc1, 0x97, 0x83, /* U.".T... */ -0x03, 0x0e, 0x52, 0x02, 0x5e, 0xc0, 0x97, 0x82, /* ..R.^... */ -0x03, 0x0a, 0x52, 0xc2, 0x97 /* ..R.. */ + 0x42, 0xca, 0x00, + 0x87, 0x20, 0x51, 0x85, 0x44, /* B... Q.D */ + 0x1e, 0x03, 0x55, 0xc8, 0x46, 0x01, 0x5b, 0xe4, /* ..U.F.[. */ + 0x2f, 0xc9, 0x50, 0x49, 0x1e, 0x16, 0x55, 0xe4, /* /.PI..U. */ + 0x2f, 0xc5, 0x50, 0x02, 0xef, 0x02, 0x2e, 0x62, /* /.P....b */ + 0x82, 0xfe, 0xcf, 0x08, 0xaf, 0xfe, 0xcf, 0x09, /* ........ */ + 0xaf, 0xfe, 0xcf, 0x0b, 0xaf, 0x55, 0x81, 0x02, /* .....U.. */ + 0xcf, 0x0f, 0x1c, 0x40, 0x18, 0x08, 0x42, 0x00, /* ...@..B. */ + 0x5b, 0x20, 0x18, 0x3d, 0x23, 0x02, 0xaf, 0x10, /* [ .=#... */ + 0xef, 0x55, 0xaf, 0x05, 0x27, 0x4a, 0x1e, 0x01, /* .U..'J.. */ + 0x55, 0xe4, 0x2f, 0xac, 0x50, 0x4e, 0x1e, 0x01, /* U./.PN.. */ + 0x55, 0x00, 0x2e, 0x0d, 0x7b, 0x4f, 0x1e, 0x01, /* U...{O.. */ + 0x55, 0x02, 0x2e, 0xbd, 0x71, 0x51, 0x1e, 0x1a, /* U...qQ.. */ + 0x55, 0xf9, 0xcf, 0x67, 0xaf, 0xcf, 0x1c, 0xf9, /* U..g.... */ + 0xaf, 0xff, 0x86, 0xbf, 0x22, 0x09, 0xbf, 0xfe, /* ...."... */ + 0xdf, 0x00, 0x2e, 0xd7, 0x8b, 0x01, 0xef, 0x3b, /* .......; */ + 0xaf, 0x01, 0x2e, 0x63, 0x84, 0x3b, 0x80, 0x3b, /* ...c.;.; */ + 0xcf, 0x1f, 0x99, 0x01, 0x2e, 0x07, 0x85, 0x00, /* ........ */ + 0x2e, 0xa7, 0x8a, 0xbf, 0x22, 0xc1, 0x2e, 0x49, /* ...."..I */ + 0xbf, 0x67, 0xcf, 0xf9, 0xaf, 0x05, 0x27, 0x54, /* .g....'T */ + 0x1e, 0x32, 0x55, 0x04, 0xef, 0x20, 0x80, 0xe4, /* .2U.. .. */ + 0x2f, 0x81, 0x5a, 0x23, 0x81, 0xfe, 0xcf, 0xfe, /* /.Z#.... */ + 0xdf, 0xff, 0x96, 0xdf, 0x96, 0xfe, 0xcf, 0xfe, /* ........ */ + 0xdf, 0xff, 0x96, 0xdf, 0x96, 0xdf, 0x22, 0x01, /* ......". */ + 0x55, 0xff, 0x22, 0x06, 0x54, 0xc1, 0x97, 0x83, /* U.".T... */ + 0x03, 0x0e, 0x52, 0x02, 0x5e, 0xc0, 0x97, 0x82, /* ..R.^... */ + 0x03, 0x0a, 0x52, 0xc2, 0x97 /* ..R.. */ }; static const unsigned char pkt19[] = { -0x42, 0xca, 0x00, -0xeb, 0x20, 0xc3, 0x9f, 0xcd, /* B... ... */ -0x80, 0x07, 0x80, 0x00, 0xef, 0xff, 0xaf, 0x00, /* ........ */ -0x2e, 0xa7, 0x8a, 0x04, 0x0c, 0x29, 0x81, 0x05, /* .....).. */ -0x27, 0xc0, 0x97, 0xc1, 0x9f, 0xcd, 0x80, 0x07, /* '....... */ -0x80, 0x01, 0xef, 0xff, 0xaf, 0x00, 0x2e, 0xa9, /* ........ */ -0x8a, 0xc2, 0x97, 0xc3, 0x9f, 0x80, 0x01, 0x41, /* .......A */ -0x01, 0x9f, 0x90, 0xff, 0x90, 0x02, 0x2e, 0xe3, /* ........ */ -0x70, 0x55, 0x1e, 0x16, 0x55, 0x54, 0x85, 0xe4, /* pU..UT.. */ -0x2f, 0x4d, 0x5b, 0x07, 0xef, 0x20, 0x80, 0xe4, /* /M[.. .. */ -0x2f, 0x49, 0x5a, 0xfe, 0xcf, 0x0a, 0xaf, 0xfe, /* /IZ..... */ -0xcf, 0xfe, 0xcf, 0x41, 0x2e, 0x44, 0xbf, 0xfe, /* ...A.D.. */ -0xcf, 0x41, 0x2e, 0x45, 0xbf, 0xfe, 0xcf, 0x52, /* .A.E...R */ -0xaf, 0xfe, 0xcf, 0x53, 0xaf, 0xfe, 0xcf, 0x5a, /* ...S...Z */ -0xaf, 0x05, 0x27, 0x58, 0x1e, 0x0d, 0x55, 0x02, /* ..'X..U. */ -0x44, 0x01, 0x5a, 0x00, 0x2e, 0x54, 0x79, 0xfe, /* D.Z..Ty. */ -0xcf, 0x75, 0xaf, 0xfe, 0xdf, 0x76, 0xbf, 0x41, /* .u...v.A */ -0x2e, 0xa4, 0xdf, 0xdf, 0x29, 0x41, 0x2e, 0xa4, /* ....)A.. */ -0xbf, 0x05, 0x27, 0x59, 0x1e, 0x03, 0x55, 0xfe, /* ..'Y..U. */ -0xcf, 0x10, 0xaf, 0x01, 0x2e, 0x94, 0x76, 0x63, /* ......vc */ -0x1e, 0x1a, 0x55, 0x54, 0x85, 0xe4, 0x2f, 0x1e, /* ..UT../. */ -0x5b, 0x0c, 0xef, 0x20, 0x80, 0xe4, 0x2f, 0x1a, /* [.. ../. */ -0x5a, 0xf0, 0xef, 0x00, 0xff, 0x19, 0x27, 0x08, /* Z.....'. */ -0xef, 0x06, 0xaf, 0xfe, 0xcf, 0x5f, 0x9f, 0x06, /* ....._.. */ -0x25, 0xfb, 0x55, 0xfe, 0xcf, 0xfe, 0xcf, 0x41, /* %.U....A */ -0x2e, 0x40, 0xbf, 0xfe, 0xcf, 0x41, 0x2e, 0x41, /* .@...A.A */ -0xbf, 0xfe, 0xcf, 0x41, 0x2e /* ...A. */ + 0x42, 0xca, 0x00, + 0xeb, 0x20, 0xc3, 0x9f, 0xcd, /* B... ... */ + 0x80, 0x07, 0x80, 0x00, 0xef, 0xff, 0xaf, 0x00, /* ........ */ + 0x2e, 0xa7, 0x8a, 0x04, 0x0c, 0x29, 0x81, 0x05, /* .....).. */ + 0x27, 0xc0, 0x97, 0xc1, 0x9f, 0xcd, 0x80, 0x07, /* '....... */ + 0x80, 0x01, 0xef, 0xff, 0xaf, 0x00, 0x2e, 0xa9, /* ........ */ + 0x8a, 0xc2, 0x97, 0xc3, 0x9f, 0x80, 0x01, 0x41, /* .......A */ + 0x01, 0x9f, 0x90, 0xff, 0x90, 0x02, 0x2e, 0xe3, /* ........ */ + 0x70, 0x55, 0x1e, 0x16, 0x55, 0x54, 0x85, 0xe4, /* pU..UT.. */ + 0x2f, 0x4d, 0x5b, 0x07, 0xef, 0x20, 0x80, 0xe4, /* /M[.. .. */ + 0x2f, 0x49, 0x5a, 0xfe, 0xcf, 0x0a, 0xaf, 0xfe, /* /IZ..... */ + 0xcf, 0xfe, 0xcf, 0x41, 0x2e, 0x44, 0xbf, 0xfe, /* ...A.D.. */ + 0xcf, 0x41, 0x2e, 0x45, 0xbf, 0xfe, 0xcf, 0x52, /* .A.E...R */ + 0xaf, 0xfe, 0xcf, 0x53, 0xaf, 0xfe, 0xcf, 0x5a, /* ...S...Z */ + 0xaf, 0x05, 0x27, 0x58, 0x1e, 0x0d, 0x55, 0x02, /* ..'X..U. */ + 0x44, 0x01, 0x5a, 0x00, 0x2e, 0x54, 0x79, 0xfe, /* D.Z..Ty. */ + 0xcf, 0x75, 0xaf, 0xfe, 0xdf, 0x76, 0xbf, 0x41, /* .u...v.A */ + 0x2e, 0xa4, 0xdf, 0xdf, 0x29, 0x41, 0x2e, 0xa4, /* ....)A.. */ + 0xbf, 0x05, 0x27, 0x59, 0x1e, 0x03, 0x55, 0xfe, /* ..'Y..U. */ + 0xcf, 0x10, 0xaf, 0x01, 0x2e, 0x94, 0x76, 0x63, /* ......vc */ + 0x1e, 0x1a, 0x55, 0x54, 0x85, 0xe4, 0x2f, 0x1e, /* ..UT../. */ + 0x5b, 0x0c, 0xef, 0x20, 0x80, 0xe4, 0x2f, 0x1a, /* [.. ../. */ + 0x5a, 0xf0, 0xef, 0x00, 0xff, 0x19, 0x27, 0x08, /* Z.....'. */ + 0xef, 0x06, 0xaf, 0xfe, 0xcf, 0x5f, 0x9f, 0x06, /* ....._.. */ + 0x25, 0xfb, 0x55, 0xfe, 0xcf, 0xfe, 0xcf, 0x41, /* %.U....A */ + 0x2e, 0x40, 0xbf, 0xfe, 0xcf, 0x41, 0x2e, 0x41, /* .@...A.A */ + 0xbf, 0xfe, 0xcf, 0x41, 0x2e /* ...A. */ }; static const unsigned char pkt21[] = { -0x42, 0xca, 0x00, -0x4f, 0x21, 0x42, 0xbf, 0x05, /* B..O!B.. */ -0x27, 0x64, 0x1e, 0x31, 0x55, 0xb0, 0xef, 0x00, /* 'd.1U... */ -0xff, 0x19, 0x27, 0x0b, 0xef, 0x06, 0xaf, 0xfe, /* ..'..... */ -0xcf, 0x5f, 0x9f, 0x06, 0x25, 0xfb, 0x55, 0xfe, /* ._..%.U. */ -0xcf, 0x56, 0xaf, 0xfe, 0xcf, 0xae, 0xdf, 0x1f, /* .V...... */ -0x1c, 0xe0, 0x1d, 0x5f, 0x02, 0xae, 0xbf, 0xfe, /* ..._.... */ -0xcf, 0x41, 0x2e, 0x54, 0xbf, 0xfe, 0xcf, 0x41, /* .A.T...A */ -0x2e, 0x77, 0xbf, 0xfe, 0xcf, 0x41, 0x2e, 0x55, /* .w...A.U */ -0xbf, 0xfe, 0xcf, 0x41, 0x2e, 0x78, 0xbf, 0xfe, /* ...A.x.. */ -0xcf, 0xbb, 0xaf, 0xfe, 0xcf, 0xbc, 0xaf, 0xfe, /* ........ */ -0xcf, 0xbd, 0xaf, 0xfe, 0xcf, 0xbe, 0xaf, 0xfe, /* ........ */ -0xcf, 0x83, 0xaf, 0xfe, 0xcf, 0x84, 0xaf, 0xfe, /* ........ */ -0xcf, 0x81, 0xaf, 0xfe, 0xcf, 0x82, 0xaf, 0xfe, /* ........ */ -0xcf, 0x24, 0xaf, 0xfe, 0xcf, 0x02, 0x33, 0x05, /* .$....3. */ -0x27, 0x66, 0x1e, 0x0b, 0x55, 0xc5, 0xef, 0x2f, /* 'f..U../ */ -0xff, 0x1a, 0x27, 0x0b, 0xef, 0x06, 0xaf, 0xfe, /* ..'..... */ -0xcf, 0xfe, 0xdf, 0x06, 0x27, 0x01, 0x0e, 0x06, /* ....'... */ -0x25, 0xf9, 0x55, 0x05, 0x27, 0x73, 0x1e, 0x02, /* %.U.'s.. */ -0x55, 0x02, 0x2e, 0x5a, 0x88, 0x05, 0x27, 0x7d, /* U..Z..'} */ -0x1e, 0x0c, 0x55, 0x02, 0x2e, 0xb7, 0x81, 0xe3, /* ..U..... */ -0x2f, 0xb9, 0x5a, 0xfe, 0xcf, 0xfe, 0xdf, 0x1b, /* /.Z..... */ -0x27, 0xfe, 0xcf, 0x36, 0x03, 0xfe, 0xdf, 0x3f, /* '..6...? */ -0x02, 0x9f, 0x9d, 0x05, 0x27, 0x7e, 0x1e, 0x0c, /* ....'~.. */ -0x55, 0x02, 0x2e, 0xb7, 0x81, 0xe3, 0x2f, 0xaa, /* U...../. */ -0x5a, 0xfe, 0xcf, 0xfe, 0xdf, 0x1b, 0x27, 0x07, /* Z.....'. */ -0x80, 0xf6, 0x97, 0xff, 0xaf /* ..... */ + 0x42, 0xca, 0x00, + 0x4f, 0x21, 0x42, 0xbf, 0x05, /* B..O!B.. */ + 0x27, 0x64, 0x1e, 0x31, 0x55, 0xb0, 0xef, 0x00, /* 'd.1U... */ + 0xff, 0x19, 0x27, 0x0b, 0xef, 0x06, 0xaf, 0xfe, /* ..'..... */ + 0xcf, 0x5f, 0x9f, 0x06, 0x25, 0xfb, 0x55, 0xfe, /* ._..%.U. */ + 0xcf, 0x56, 0xaf, 0xfe, 0xcf, 0xae, 0xdf, 0x1f, /* .V...... */ + 0x1c, 0xe0, 0x1d, 0x5f, 0x02, 0xae, 0xbf, 0xfe, /* ..._.... */ + 0xcf, 0x41, 0x2e, 0x54, 0xbf, 0xfe, 0xcf, 0x41, /* .A.T...A */ + 0x2e, 0x77, 0xbf, 0xfe, 0xcf, 0x41, 0x2e, 0x55, /* .w...A.U */ + 0xbf, 0xfe, 0xcf, 0x41, 0x2e, 0x78, 0xbf, 0xfe, /* ...A.x.. */ + 0xcf, 0xbb, 0xaf, 0xfe, 0xcf, 0xbc, 0xaf, 0xfe, /* ........ */ + 0xcf, 0xbd, 0xaf, 0xfe, 0xcf, 0xbe, 0xaf, 0xfe, /* ........ */ + 0xcf, 0x83, 0xaf, 0xfe, 0xcf, 0x84, 0xaf, 0xfe, /* ........ */ + 0xcf, 0x81, 0xaf, 0xfe, 0xcf, 0x82, 0xaf, 0xfe, /* ........ */ + 0xcf, 0x24, 0xaf, 0xfe, 0xcf, 0x02, 0x33, 0x05, /* .$....3. */ + 0x27, 0x66, 0x1e, 0x0b, 0x55, 0xc5, 0xef, 0x2f, /* 'f..U../ */ + 0xff, 0x1a, 0x27, 0x0b, 0xef, 0x06, 0xaf, 0xfe, /* ..'..... */ + 0xcf, 0xfe, 0xdf, 0x06, 0x27, 0x01, 0x0e, 0x06, /* ....'... */ + 0x25, 0xf9, 0x55, 0x05, 0x27, 0x73, 0x1e, 0x02, /* %.U.'s.. */ + 0x55, 0x02, 0x2e, 0x5a, 0x88, 0x05, 0x27, 0x7d, /* U..Z..'} */ + 0x1e, 0x0c, 0x55, 0x02, 0x2e, 0xb7, 0x81, 0xe3, /* ..U..... */ + 0x2f, 0xb9, 0x5a, 0xfe, 0xcf, 0xfe, 0xdf, 0x1b, /* /.Z..... */ + 0x27, 0xfe, 0xcf, 0x36, 0x03, 0xfe, 0xdf, 0x3f, /* '..6...? */ + 0x02, 0x9f, 0x9d, 0x05, 0x27, 0x7e, 0x1e, 0x0c, /* ....'~.. */ + 0x55, 0x02, 0x2e, 0xb7, 0x81, 0xe3, 0x2f, 0xaa, /* U...../. */ + 0x5a, 0xfe, 0xcf, 0xfe, 0xdf, 0x1b, 0x27, 0x07, /* Z.....'. */ + 0x80, 0xf6, 0x97, 0xff, 0xaf /* ..... */ }; static const unsigned char pkt23[] = { -0x42, 0xca, 0x00, -0xb3, 0x21, 0x00, 0x2e, 0xa7, /* B...!... */ -0x8a, 0x05, 0x27, 0x61, 0x74, 0xff, 0x96, 0xc6, /* ..'at... */ -0x2e, 0x01, 0xdf, 0x3f, 0x2c, 0xdd, 0x9f, 0x05, /* ...?,... */ -0x27, 0x01, 0xef, 0x20, 0x80, 0xe3, 0x2f, 0x96, /* '.. ../. */ -0x5a, 0xfe, 0xcf, 0xdf, 0x22, 0xe9, 0x2f, 0xf0, /* Z..."./. */ -0x54, 0x01, 0xff, 0x85, 0xef, 0xff, 0x96, 0xdf, /* T....... */ -0x96, 0x34, 0xff, 0x8d, 0xef, 0x19, 0x27, 0x03, /* .4....'. */ -0xcf, 0x7f, 0x1c, 0x5f, 0x9f, 0xdd, 0x97, 0x5f, /* ..._..._ */ -0x9f, 0xdd, 0x97, 0x5f, 0x9f, 0x05, 0xef, 0x06, /* ..._.... */ -0xaf, 0x9f, 0x22, 0x5f, 0x9f, 0x06, 0x25, 0xfc, /* .."_..%. */ -0x55, 0x5f, 0x9f, 0x06, 0x25, 0xfc, 0x55, 0x20, /* U_..%.U */ -0xef, 0x08, 0xaf, 0x09, 0x23, 0x01, 0x2e, 0x06, /* ....#... */ -0x82, 0x51, 0x81, 0x03, 0xef, 0xfc, 0xaf, 0x84, /* .Q...... */ -0xef, 0xaa, 0xaf, 0x08, 0xef, 0xe3, 0xaf, 0x9f, /* ........ */ -0x22, 0xe2, 0xaf, 0x21, 0xef, 0x41, 0x2e, 0x47, /* "..!.A.G */ -0xbf, 0x27, 0xef, 0xf4, 0xaf, 0x2d, 0xff, 0xa7, /* .'...-.. */ -0xef, 0xe1, 0xbf, 0xe0, 0xaf, 0x08, 0xef, 0x10, /* ........ */ -0xaf, 0x01, 0x2e, 0x94, 0x86, 0xed, 0x80, 0x01, /* ........ */ -0x2e, 0x18, 0x87, 0x01, 0x2e, 0x1a, 0x87, 0x9b, /* ........ */ -0x22, 0x9b, 0x22, 0x34, 0xff, 0x95, 0xef, 0x19, /* "."4.... */ -0x27, 0x2d, 0xff, 0xa7, 0xef, 0x1a, 0x27, 0xc0, /* '-....'. */ -0xef, 0x06, 0xaf, 0xdc, 0x97, 0x5f, 0x9f, 0x06, /* ....._.. */ -0xdf, 0xc0, 0x1f, 0x03, 0x54, 0xdf, 0x22, 0x01, /* ....T.". */ -0x54, 0x00, 0x2e, 0xb9, 0x8b, 0x06, 0x25, 0xf4, /* T.....%. */ -0x55, 0x34, 0xff, 0x91, 0xef, 0x19, 0x27, 0xdd, /* U4....'. */ -0x97, 0xdd, 0x9f, 0x5f, 0x9f /* ..._. */ + 0x42, 0xca, 0x00, + 0xb3, 0x21, 0x00, 0x2e, 0xa7, /* B...!... */ + 0x8a, 0x05, 0x27, 0x61, 0x74, 0xff, 0x96, 0xc6, /* ..'at... */ + 0x2e, 0x01, 0xdf, 0x3f, 0x2c, 0xdd, 0x9f, 0x05, /* ...?,... */ + 0x27, 0x01, 0xef, 0x20, 0x80, 0xe3, 0x2f, 0x96, /* '.. ../. */ + 0x5a, 0xfe, 0xcf, 0xdf, 0x22, 0xe9, 0x2f, 0xf0, /* Z..."./. */ + 0x54, 0x01, 0xff, 0x85, 0xef, 0xff, 0x96, 0xdf, /* T....... */ + 0x96, 0x34, 0xff, 0x8d, 0xef, 0x19, 0x27, 0x03, /* .4....'. */ + 0xcf, 0x7f, 0x1c, 0x5f, 0x9f, 0xdd, 0x97, 0x5f, /* ..._..._ */ + 0x9f, 0xdd, 0x97, 0x5f, 0x9f, 0x05, 0xef, 0x06, /* ..._.... */ + 0xaf, 0x9f, 0x22, 0x5f, 0x9f, 0x06, 0x25, 0xfc, /* .."_..%. */ + 0x55, 0x5f, 0x9f, 0x06, 0x25, 0xfc, 0x55, 0x20, /* U_..%.U */ + 0xef, 0x08, 0xaf, 0x09, 0x23, 0x01, 0x2e, 0x06, /* ....#... */ + 0x82, 0x51, 0x81, 0x03, 0xef, 0xfc, 0xaf, 0x84, /* .Q...... */ + 0xef, 0xaa, 0xaf, 0x08, 0xef, 0xe3, 0xaf, 0x9f, /* ........ */ + 0x22, 0xe2, 0xaf, 0x21, 0xef, 0x41, 0x2e, 0x47, /* "..!.A.G */ + 0xbf, 0x27, 0xef, 0xf4, 0xaf, 0x2d, 0xff, 0xa7, /* .'...-.. */ + 0xef, 0xe1, 0xbf, 0xe0, 0xaf, 0x08, 0xef, 0x10, /* ........ */ + 0xaf, 0x01, 0x2e, 0x94, 0x86, 0xed, 0x80, 0x01, /* ........ */ + 0x2e, 0x18, 0x87, 0x01, 0x2e, 0x1a, 0x87, 0x9b, /* ........ */ + 0x22, 0x9b, 0x22, 0x34, 0xff, 0x95, 0xef, 0x19, /* "."4.... */ + 0x27, 0x2d, 0xff, 0xa7, 0xef, 0x1a, 0x27, 0xc0, /* '-....'. */ + 0xef, 0x06, 0xaf, 0xdc, 0x97, 0x5f, 0x9f, 0x06, /* ....._.. */ + 0xdf, 0xc0, 0x1f, 0x03, 0x54, 0xdf, 0x22, 0x01, /* ....T.". */ + 0x54, 0x00, 0x2e, 0xb9, 0x8b, 0x06, 0x25, 0xf4, /* T.....%. */ + 0x55, 0x34, 0xff, 0x91, 0xef, 0x19, 0x27, 0xdd, /* U4....'. */ + 0x97, 0xdd, 0x9f, 0x5f, 0x9f /* ..._. */ }; static const unsigned char pkt25[] = { -0x42, 0xb2, 0x00, -0x17, 0x22, 0x7f, 0x9f, 0xfd, /* B..."... */ -0x0d, 0xdf, 0x22, 0x01, 0x55, 0xff, 0x22, 0x01, /* ..".U.". */ -0x54, 0x01, 0xef, 0x1f, 0x98, 0x2f, 0xef, 0x41, /* T..../.A */ -0x2e, 0x47, 0xbf, 0x11, 0xef, 0xf4, 0xaf, 0x2d, /* .G.....- */ -0xff, 0xa7, 0xef, 0xe1, 0xbf, 0xe0, 0xaf, 0x01, /* ........ */ -0x2e, 0x18, 0x87, 0x01, 0x2e, 0x1a, 0x87, 0x9b, /* ........ */ -0x22, 0x9b, 0x22, 0x35, 0xff, 0x55, 0xef, 0x19, /* "."5.U.. */ -0x27, 0x2d, 0xff, 0xa7, 0xef, 0x1a, 0x27, 0xc0, /* '-....'. */ -0xef, 0x06, 0xaf, 0xdc, 0x97, 0xff, 0x1a, 0x5f, /* ......._ */ -0x9f, 0x06, 0xdf, 0xc0, 0x1f, 0x03, 0x54, 0xdf, /* ......T. */ -0x22, 0x01, 0x54, 0x00, 0x2e, 0xb9, 0x8b, 0x06, /* ".T..... */ -0x25, 0xf3, 0x55, 0x34, 0xff, 0x93, 0xef, 0x19, /* %.U4.... */ -0x27, 0xdd, 0x97, 0xdd, 0x9f, 0x5f, 0x9f, 0x7f, /* '...._.. */ -0x9f, 0xfb, 0x0d, 0xdf, 0x22, 0x01, 0x54, 0x01, /* ....".T. */ -0xef, 0x1f, 0x98, 0xff, 0x22, 0x01, 0x54, 0x01, /* ....".T. */ -0xef, 0x1f, 0x98, 0x34, 0xff, 0x8d, 0xef, 0x19, /* ...4.... */ -0x27, 0x01, 0x2e, 0x0c, 0x85, 0x00, 0x2e, 0xa7, /* '....... */ -0x8a, 0x55, 0x81, 0x02, 0xef, 0xfc, 0xaf, 0x88, /* .U...... */ -0xef, 0xaa, 0xaf, 0x00, 0xef, 0x41, 0x2e, 0x47, /* .....A.G */ -0xbf, 0x05, 0x27, 0xf9, 0x35, 0xc1, 0x2e, 0x4e, /* ..'.5..N */ -0xdf, 0x0f, 0x1d, 0x09, 0x27, 0x5f, 0x02, 0xc1, /* ....'_.. */ -0x2e, 0x4e, 0xbf, 0x05, 0x27, 0x9f, 0x22, 0x02, /* .N..'.". */ -0x2e, 0xa6, 0x85, 0x05, 0x27 /* ....' */ + 0x42, 0xb2, 0x00, + 0x17, 0x22, 0x7f, 0x9f, 0xfd, /* B..."... */ + 0x0d, 0xdf, 0x22, 0x01, 0x55, 0xff, 0x22, 0x01, /* ..".U.". */ + 0x54, 0x01, 0xef, 0x1f, 0x98, 0x2f, 0xef, 0x41, /* T..../.A */ + 0x2e, 0x47, 0xbf, 0x11, 0xef, 0xf4, 0xaf, 0x2d, /* .G.....- */ + 0xff, 0xa7, 0xef, 0xe1, 0xbf, 0xe0, 0xaf, 0x01, /* ........ */ + 0x2e, 0x18, 0x87, 0x01, 0x2e, 0x1a, 0x87, 0x9b, /* ........ */ + 0x22, 0x9b, 0x22, 0x35, 0xff, 0x55, 0xef, 0x19, /* "."5.U.. */ + 0x27, 0x2d, 0xff, 0xa7, 0xef, 0x1a, 0x27, 0xc0, /* '-....'. */ + 0xef, 0x06, 0xaf, 0xdc, 0x97, 0xff, 0x1a, 0x5f, /* ......._ */ + 0x9f, 0x06, 0xdf, 0xc0, 0x1f, 0x03, 0x54, 0xdf, /* ......T. */ + 0x22, 0x01, 0x54, 0x00, 0x2e, 0xb9, 0x8b, 0x06, /* ".T..... */ + 0x25, 0xf3, 0x55, 0x34, 0xff, 0x93, 0xef, 0x19, /* %.U4.... */ + 0x27, 0xdd, 0x97, 0xdd, 0x9f, 0x5f, 0x9f, 0x7f, /* '...._.. */ + 0x9f, 0xfb, 0x0d, 0xdf, 0x22, 0x01, 0x54, 0x01, /* ....".T. */ + 0xef, 0x1f, 0x98, 0xff, 0x22, 0x01, 0x54, 0x01, /* ....".T. */ + 0xef, 0x1f, 0x98, 0x34, 0xff, 0x8d, 0xef, 0x19, /* ...4.... */ + 0x27, 0x01, 0x2e, 0x0c, 0x85, 0x00, 0x2e, 0xa7, /* '....... */ + 0x8a, 0x55, 0x81, 0x02, 0xef, 0xfc, 0xaf, 0x88, /* .U...... */ + 0xef, 0xaa, 0xaf, 0x00, 0xef, 0x41, 0x2e, 0x47, /* .....A.G */ + 0xbf, 0x05, 0x27, 0xf9, 0x35, 0xc1, 0x2e, 0x4e, /* ..'.5..N */ + 0xdf, 0x0f, 0x1d, 0x09, 0x27, 0x5f, 0x02, 0xc1, /* ....'_.. */ + 0x2e, 0x4e, 0xbf, 0x05, 0x27, 0x9f, 0x22, 0x02, /* .N..'.". */ + 0x2e, 0xa6, 0x85, 0x05, 0x27 /* ....' */ }; static const unsigned char pkt27[] = { -0x42, 0xca, 0x00, -0x6f, 0x22, 0x51, 0x85, 0x01, /* B..o"Q.. */ -0x1e, 0x38, 0x55, 0x26, 0x40, 0x12, 0x5b, 0x26, /* .8U&@.[& */ -0x42, 0x2e, 0x5a, 0x26, 0x41, 0x0e, 0x5a, 0x26, /* B.Z&A.Z& */ -0xcf, 0x40, 0x1a, 0x26, 0xaf, 0x9f, 0x2d, 0x27, /* .@.&..-' */ -0x5a, 0x07, 0x80, 0x01, 0xef, 0xff, 0xaf, 0x26, /* Z......& */ -0x43, 0x01, 0x5b, 0x74, 0x25, 0x00, 0x55, 0x26, /* C.[t%.U& */ -0x32, 0x00, 0x2e, 0xa7, 0x7a, 0x02, 0x2e, 0xc0, /* 2...z... */ -0x85, 0x26, 0x40, 0x08, 0x5b, 0x41, 0x2e, 0x52, /* .&@.[A.R */ -0xdf, 0xdf, 0x2d, 0x04, 0x5b, 0x26, 0x43, 0x01, /* ..-.[&C. */ -0x5b, 0x74, 0x25, 0x00, 0x55, 0x26, 0x32, 0x41, /* [t%.U&2A */ -0x2e, 0x53, 0xdf, 0xc1, 0x2e, 0x79, 0xdf, 0xff, /* .S...y.. */ -0x96, 0xdf, 0x96, 0x41, 0x2e, 0x55, 0xdf, 0xc1, /* ...A.U.. */ -0x2e, 0x78, 0xdf, 0x9d, 0x01, 0x5d, 0x01, 0xff, /* .x...].. */ -0x22, 0x00, 0x54, 0xff, 0xef, 0x2e, 0xaf, 0x05, /* ".T..... */ -0x27, 0x07, 0x80, 0x9f, 0x22, 0xff, 0xaf, 0x00, /* '..."... */ -0x2e, 0xa7, 0x8a, 0x05, 0x27, 0x03, 0x1e, 0x3f, /* ....'..? */ -0x55, 0x02, 0x2e, 0xad, 0x85, 0xa1, 0xcf, 0xfe, /* U....... */ -0x1c, 0xa1, 0xaf, 0xed, 0x80, 0x31, 0x81, 0x02, /* .....1.. */ -0x2e, 0x51, 0x83, 0xff, 0x96, 0xdf, 0x96, 0xa1, /* .Q...... */ -0xcf, 0x01, 0x18, 0xa1, 0xaf, 0xed, 0x80, 0x64, /* .......d */ -0xef, 0xbf, 0x22, 0xa9, 0x80, 0x31, 0x81, 0x02, /* .."..1.. */ -0x2e, 0x51, 0x83, 0xff, 0x96, 0xdf, 0x96, 0x9b, /* .Q...... */ -0x22, 0x14, 0x1e, 0x03, 0x53, 0xff, 0x22, 0x01, /* "...S.". */ -0x55, 0x00, 0x20, 0x0a, 0x50, 0xc3, 0x97, 0xc4, /* U. .P... */ -0x9f, 0x81, 0x01, 0x42, 0x01, 0x03, 0x52, 0xfa, /* ...B..R. */ -0x1e, 0x03, 0x53, 0xff, 0x22 /* ..S." */ + 0x42, 0xca, 0x00, + 0x6f, 0x22, 0x51, 0x85, 0x01, /* B..o"Q.. */ + 0x1e, 0x38, 0x55, 0x26, 0x40, 0x12, 0x5b, 0x26, /* .8U&@.[& */ + 0x42, 0x2e, 0x5a, 0x26, 0x41, 0x0e, 0x5a, 0x26, /* B.Z&A.Z& */ + 0xcf, 0x40, 0x1a, 0x26, 0xaf, 0x9f, 0x2d, 0x27, /* .@.&..-' */ + 0x5a, 0x07, 0x80, 0x01, 0xef, 0xff, 0xaf, 0x26, /* Z......& */ + 0x43, 0x01, 0x5b, 0x74, 0x25, 0x00, 0x55, 0x26, /* C.[t%.U& */ + 0x32, 0x00, 0x2e, 0xa7, 0x7a, 0x02, 0x2e, 0xc0, /* 2...z... */ + 0x85, 0x26, 0x40, 0x08, 0x5b, 0x41, 0x2e, 0x52, /* .&@.[A.R */ + 0xdf, 0xdf, 0x2d, 0x04, 0x5b, 0x26, 0x43, 0x01, /* ..-.[&C. */ + 0x5b, 0x74, 0x25, 0x00, 0x55, 0x26, 0x32, 0x41, /* [t%.U&2A */ + 0x2e, 0x53, 0xdf, 0xc1, 0x2e, 0x79, 0xdf, 0xff, /* .S...y.. */ + 0x96, 0xdf, 0x96, 0x41, 0x2e, 0x55, 0xdf, 0xc1, /* ...A.U.. */ + 0x2e, 0x78, 0xdf, 0x9d, 0x01, 0x5d, 0x01, 0xff, /* .x...].. */ + 0x22, 0x00, 0x54, 0xff, 0xef, 0x2e, 0xaf, 0x05, /* ".T..... */ + 0x27, 0x07, 0x80, 0x9f, 0x22, 0xff, 0xaf, 0x00, /* '..."... */ + 0x2e, 0xa7, 0x8a, 0x05, 0x27, 0x03, 0x1e, 0x3f, /* ....'..? */ + 0x55, 0x02, 0x2e, 0xad, 0x85, 0xa1, 0xcf, 0xfe, /* U....... */ + 0x1c, 0xa1, 0xaf, 0xed, 0x80, 0x31, 0x81, 0x02, /* .....1.. */ + 0x2e, 0x51, 0x83, 0xff, 0x96, 0xdf, 0x96, 0xa1, /* .Q...... */ + 0xcf, 0x01, 0x18, 0xa1, 0xaf, 0xed, 0x80, 0x64, /* .......d */ + 0xef, 0xbf, 0x22, 0xa9, 0x80, 0x31, 0x81, 0x02, /* .."..1.. */ + 0x2e, 0x51, 0x83, 0xff, 0x96, 0xdf, 0x96, 0x9b, /* .Q...... */ + 0x22, 0x14, 0x1e, 0x03, 0x53, 0xff, 0x22, 0x01, /* "...S.". */ + 0x55, 0x00, 0x20, 0x0a, 0x50, 0xc3, 0x97, 0xc4, /* U. .P... */ + 0x9f, 0x81, 0x01, 0x42, 0x01, 0x03, 0x52, 0xfa, /* ...B..R. */ + 0x1e, 0x03, 0x53, 0xff, 0x22 /* ..S." */ }; static const unsigned char pkt29[] = { -0x42, 0xca, 0x00, -0xd3, 0x22, 0x01, 0x55, 0x00, /* B...".U. */ -0x20, 0xf2, 0x50, 0x00, 0x2e, 0xd8, 0x8d, 0x03, /* .P..... */ -0xcf, 0x7f, 0x1c, 0xff, 0xaf, 0x05, 0xef, 0xff, /* ........ */ -0xaf, 0x00, 0xef, 0xff, 0xaf, 0xdd, 0x97, 0xff, /* ........ */ -0xaf, 0xc2, 0x97, 0xff, 0xaf, 0xc3, 0x97, 0xff, /* ........ */ -0xaf, 0xc0, 0x97, 0xff, 0xaf, 0xc1, 0x97, 0xff, /* ........ */ -0xaf, 0x04, 0x0c, 0x00, 0x2e, 0xa7, 0x8a, 0x05, /* ........ */ -0x27, 0x06, 0x1e, 0x01, 0x55, 0x0f, 0x27, 0x0f, /* '...U.'. */ -0x27, 0x0a, 0x1e, 0x08, 0x55, 0x02, 0x2e, 0xf6, /* '...U... */ -0x82, 0xa8, 0x77, 0x3b, 0x30, 0x07, 0x35, 0xff, /* ..w;0.5. */ -0xff, 0xc2, 0xbf, 0x0d, 0x27, 0x0c, 0x27, 0x0d, /* ....'.'. */ -0x1e, 0x02, 0x55, 0x54, 0x85, 0xf5, 0x5b, 0xbd, /* ..UT..[. */ -0x77, 0x12, 0x1e, 0x07, 0x55, 0xdc, 0xef, 0x05, /* w...U... */ -0xff, 0x1a, 0x27, 0x56, 0xdf, 0x3f, 0x20, 0x59, /* ..'V.? Y */ -0x80, 0x3c, 0xaf, 0x05, 0x27, 0x13, 0x1e, 0x01, /* .<..'... */ -0x55, 0x3c, 0x23, 0x05, 0x27, 0x1f, 0x1e, 0x06, /* U<#.'... */ -0x55, 0x37, 0x35, 0x08, 0xef, 0x40, 0x2e, 0xf0, /* U75..@.. */ -0xbf, 0x40, 0x2e, 0xf6, 0xbf, 0x05, 0x27, 0x20, /* .@....' */ -0x1e, 0x06, 0x55, 0x37, 0x3d, 0x16, 0xef, 0x40, /* ..U7=..@ */ -0x2e, 0xf0, 0xbf, 0x40, 0x2e, 0xf6, 0xbf, 0x05, /* ...@.... */ -0x27, 0x2e, 0x1e, 0x0c, 0x55, 0x02, 0x2e, 0x57, /* '...U..W */ -0x80, 0x41, 0x2e, 0xa1, 0xdf, 0xdf, 0x2a, 0x41, /* .A....*A */ -0x2e, 0xa1, 0xbf, 0x02, 0x2e, 0x57, 0x80, 0x9b, /* .....W.. */ -0x22, 0xdf, 0x2f, 0xd3, 0x50, 0x05, 0x27, 0x2f, /* "./.P.'/ */ -0x1e, 0x0c, 0x55, 0x02, 0x2e, 0x57, 0x80, 0x41, /* ..U..W.A */ -0x2e, 0xa1, 0xdf, 0xdf, 0x2a /* ....* */ + 0x42, 0xca, 0x00, + 0xd3, 0x22, 0x01, 0x55, 0x00, /* B...".U. */ + 0x20, 0xf2, 0x50, 0x00, 0x2e, 0xd8, 0x8d, 0x03, /* .P..... */ + 0xcf, 0x7f, 0x1c, 0xff, 0xaf, 0x05, 0xef, 0xff, /* ........ */ + 0xaf, 0x00, 0xef, 0xff, 0xaf, 0xdd, 0x97, 0xff, /* ........ */ + 0xaf, 0xc2, 0x97, 0xff, 0xaf, 0xc3, 0x97, 0xff, /* ........ */ + 0xaf, 0xc0, 0x97, 0xff, 0xaf, 0xc1, 0x97, 0xff, /* ........ */ + 0xaf, 0x04, 0x0c, 0x00, 0x2e, 0xa7, 0x8a, 0x05, /* ........ */ + 0x27, 0x06, 0x1e, 0x01, 0x55, 0x0f, 0x27, 0x0f, /* '...U.'. */ + 0x27, 0x0a, 0x1e, 0x08, 0x55, 0x02, 0x2e, 0xf6, /* '...U... */ + 0x82, 0xa8, 0x77, 0x3b, 0x30, 0x07, 0x35, 0xff, /* ..w;0.5. */ + 0xff, 0xc2, 0xbf, 0x0d, 0x27, 0x0c, 0x27, 0x0d, /* ....'.'. */ + 0x1e, 0x02, 0x55, 0x54, 0x85, 0xf5, 0x5b, 0xbd, /* ..UT..[. */ + 0x77, 0x12, 0x1e, 0x07, 0x55, 0xdc, 0xef, 0x05, /* w...U... */ + 0xff, 0x1a, 0x27, 0x56, 0xdf, 0x3f, 0x20, 0x59, /* ..'V.? Y */ + 0x80, 0x3c, 0xaf, 0x05, 0x27, 0x13, 0x1e, 0x01, /* .<..'... */ + 0x55, 0x3c, 0x23, 0x05, 0x27, 0x1f, 0x1e, 0x06, /* U<#.'... */ + 0x55, 0x37, 0x35, 0x08, 0xef, 0x40, 0x2e, 0xf0, /* U75..@.. */ + 0xbf, 0x40, 0x2e, 0xf6, 0xbf, 0x05, 0x27, 0x20, /* .@....' */ + 0x1e, 0x06, 0x55, 0x37, 0x3d, 0x16, 0xef, 0x40, /* ..U7=..@ */ + 0x2e, 0xf0, 0xbf, 0x40, 0x2e, 0xf6, 0xbf, 0x05, /* ...@.... */ + 0x27, 0x2e, 0x1e, 0x0c, 0x55, 0x02, 0x2e, 0x57, /* '...U..W */ + 0x80, 0x41, 0x2e, 0xa1, 0xdf, 0xdf, 0x2a, 0x41, /* .A....*A */ + 0x2e, 0xa1, 0xbf, 0x02, 0x2e, 0x57, 0x80, 0x9b, /* .....W.. */ + 0x22, 0xdf, 0x2f, 0xd3, 0x50, 0x05, 0x27, 0x2f, /* "./.P.'/ */ + 0x1e, 0x0c, 0x55, 0x02, 0x2e, 0x57, 0x80, 0x41, /* ..U..W.A */ + 0x2e, 0xa1, 0xdf, 0xdf, 0x2a /* ....* */ }; static const unsigned char pkt31[] = { -0x42, 0x88, 0x00, -0x37, 0x23, 0x41, 0x2e, 0xa1, /* B..7#A.. */ -0xbf, 0x02, 0x2e, 0x57, 0x80, 0x08, 0x18, 0x41, /* ...W...A */ -0x2e, 0xa1, 0xbf, 0x05, 0x27, 0x30, 0x1e, 0x0e, /* ....'0.. */ -0x55, 0x7e, 0xef, 0xff, 0xaf, 0x02, 0xef, 0xff, /* U~...... */ -0xaf, 0x00, 0xef, 0xff, 0xaf, 0xff, 0xef, 0x1f, /* ........ */ -0xff, 0x1a, 0x27, 0x07, 0x27, 0xff, 0xaf, 0xff, /* ..'.'... */ -0xbf, 0x00, 0x2e, 0xa7, 0x8a, 0x05, 0x27, 0xf7, /* ......'. */ -0x74, 0xc9, 0xcf, 0xf3, 0x1c, 0x04, 0x18, 0xc9, /* t....... */ -0xaf, 0x23, 0x81, 0x10, 0xff, 0xff, 0xef, 0xc1, /* .#...... */ -0x2e, 0x7c, 0xbf, 0x41, 0x2e, 0x7b, 0xbf, 0x02, /* .|.A.{.. */ -0xef, 0x41, 0x2e, 0x7a, 0xbf, 0xc9, 0x31, 0x18, /* .A.z..1. */ -0xef, 0xc0, 0xaf, 0x04, 0x27, 0x41, 0x2e, 0x7a, /* ....'A.z */ -0xdf, 0xdf, 0x2d, 0x08, 0x5b, 0x01, 0xef, 0x41, /* ..-.[..A */ -0x2e, 0x7a, 0xbf, 0xc0, 0x23, 0x18, 0xef, 0xc1, /* .z..#... */ -0xaf, 0xcb, 0xcf, 0xcc, 0xdf, 0x05, 0x27, 0xc9, /* ......'. */ -0x30, 0x01, 0xef, 0x41, 0x2e, 0x7a, 0xbf, 0xc0, /* 0..A.z.. */ -0x23, 0x18, 0xef, 0xc1, 0xaf, 0x9f, 0x22, 0xbf, /* #.....". */ -0x22, 0x05, 0x27 /* ".' */ + 0x42, 0x88, 0x00, + 0x37, 0x23, 0x41, 0x2e, 0xa1, /* B..7#A.. */ + 0xbf, 0x02, 0x2e, 0x57, 0x80, 0x08, 0x18, 0x41, /* ...W...A */ + 0x2e, 0xa1, 0xbf, 0x05, 0x27, 0x30, 0x1e, 0x0e, /* ....'0.. */ + 0x55, 0x7e, 0xef, 0xff, 0xaf, 0x02, 0xef, 0xff, /* U~...... */ + 0xaf, 0x00, 0xef, 0xff, 0xaf, 0xff, 0xef, 0x1f, /* ........ */ + 0xff, 0x1a, 0x27, 0x07, 0x27, 0xff, 0xaf, 0xff, /* ..'.'... */ + 0xbf, 0x00, 0x2e, 0xa7, 0x8a, 0x05, 0x27, 0xf7, /* ......'. */ + 0x74, 0xc9, 0xcf, 0xf3, 0x1c, 0x04, 0x18, 0xc9, /* t....... */ + 0xaf, 0x23, 0x81, 0x10, 0xff, 0xff, 0xef, 0xc1, /* .#...... */ + 0x2e, 0x7c, 0xbf, 0x41, 0x2e, 0x7b, 0xbf, 0x02, /* .|.A.{.. */ + 0xef, 0x41, 0x2e, 0x7a, 0xbf, 0xc9, 0x31, 0x18, /* .A.z..1. */ + 0xef, 0xc0, 0xaf, 0x04, 0x27, 0x41, 0x2e, 0x7a, /* ....'A.z */ + 0xdf, 0xdf, 0x2d, 0x08, 0x5b, 0x01, 0xef, 0x41, /* ..-.[..A */ + 0x2e, 0x7a, 0xbf, 0xc0, 0x23, 0x18, 0xef, 0xc1, /* .z..#... */ + 0xaf, 0xcb, 0xcf, 0xcc, 0xdf, 0x05, 0x27, 0xc9, /* ......'. */ + 0x30, 0x01, 0xef, 0x41, 0x2e, 0x7a, 0xbf, 0xc0, /* 0..A.z.. */ + 0x23, 0x18, 0xef, 0xc1, 0xaf, 0x9f, 0x22, 0xbf, /* #.....". */ + 0x22, 0x05, 0x27 /* ".' */ }; static const unsigned char pkt33[] = { -0x42, 0xca, 0x00, -0x7a, 0x23, 0x9b, 0x22, 0xff, /* B..z#.". */ -0x86, 0x02, 0x2e, 0x96, 0x83, 0xc2, 0x85, 0x00, /* ........ */ -0xef, 0x41, 0x2e, 0x76, 0xbf, 0x56, 0x87, 0x02, /* .A.v.V.. */ -0x2e, 0xed, 0x83, 0x78, 0x86, 0x02, 0x33, 0x07, /* ...x..3. */ -0x80, 0xdd, 0x97, 0xff, 0xaf, 0x00, 0x2e, 0xa7, /* ........ */ -0x8a, 0x05, 0x27, 0x6c, 0xcf, 0x6d, 0xdf, 0xbf, /* ..'l.m.. */ -0x01, 0x6c, 0xaf, 0x6d, 0x26, 0x00, 0x2e, 0x2c, /* .l.m&.., */ -0x55, 0x00, 0x2e, 0x47, 0x50, 0x9f, 0x22, 0x6b, /* U..GP."k */ -0xaf, 0x62, 0xaf, 0x6d, 0x2e, 0x6a, 0xbf, 0x01, /* .b.m.j.. */ -0x2e, 0x3f, 0x84, 0x00, 0xef, 0x41, 0x2e, 0x44, /* .?...A.D */ -0xbf, 0xbf, 0xef, 0x41, 0x2e, 0x45, 0xbf, 0x80, /* ...A.E.. */ -0xef, 0x0a, 0xaf, 0x01, 0x2e, 0x06, 0x82, 0x80, /* ........ */ -0x82, 0x84, 0x82, 0x6b, 0xcf, 0x10, 0xaf, 0x01, /* ...k.... */ -0x2e, 0x94, 0x86, 0x40, 0xef, 0x6d, 0xaf, 0x80, /* ...@.m.. */ -0xef, 0x6c, 0xaf, 0x01, 0x2e, 0xf9, 0x81, 0xed, /* .l...... */ -0x80, 0x01, 0x2e, 0x18, 0x87, 0x01, 0x2e, 0x1a, /* ........ */ -0x87, 0x07, 0x87, 0xff, 0x2f, 0xd1, 0x5a, 0x6c, /* ..../.Zl */ -0xcf, 0x6d, 0xdf, 0x3f, 0x00, 0x6c, 0xaf, 0x6d, /* .m.?.l.m */ -0x26, 0x03, 0x54, 0x6d, 0xdf, 0x0c, 0x82, 0x6d, /* &.Tm...m */ -0xbf, 0xeb, 0x50, 0x6b, 0xcf, 0x08, 0x1e, 0x11, /* ..Pk.... */ -0x5f, 0x6c, 0x24, 0x02, 0x53, 0xff, 0xef, 0x6c, /* _l$.S..l */ -0xaf, 0x10, 0x50, 0x6c, 0x24, 0x02, 0x53, 0xff, /* ..Pl$.S. */ -0xef, 0x6c, 0xaf, 0x0b, 0x50, 0x6b, 0xcf, 0x0a, /* .l..Pk.. */ -0x1e, 0x08, 0x55, 0x6c, 0x24, 0x02, 0x53, 0xff, /* ..Ul$.S. */ -0xef, 0x6c, 0xaf, 0x03, 0x50, 0x6c, 0x24, 0x01, /* .l..Pl$. */ -0x53, 0xff, 0xef, 0x6c, 0xaf /* S..l. */ + 0x42, 0xca, 0x00, + 0x7a, 0x23, 0x9b, 0x22, 0xff, /* B..z#.". */ + 0x86, 0x02, 0x2e, 0x96, 0x83, 0xc2, 0x85, 0x00, /* ........ */ + 0xef, 0x41, 0x2e, 0x76, 0xbf, 0x56, 0x87, 0x02, /* .A.v.V.. */ + 0x2e, 0xed, 0x83, 0x78, 0x86, 0x02, 0x33, 0x07, /* ...x..3. */ + 0x80, 0xdd, 0x97, 0xff, 0xaf, 0x00, 0x2e, 0xa7, /* ........ */ + 0x8a, 0x05, 0x27, 0x6c, 0xcf, 0x6d, 0xdf, 0xbf, /* ..'l.m.. */ + 0x01, 0x6c, 0xaf, 0x6d, 0x26, 0x00, 0x2e, 0x2c, /* .l.m&.., */ + 0x55, 0x00, 0x2e, 0x47, 0x50, 0x9f, 0x22, 0x6b, /* U..GP."k */ + 0xaf, 0x62, 0xaf, 0x6d, 0x2e, 0x6a, 0xbf, 0x01, /* .b.m.j.. */ + 0x2e, 0x3f, 0x84, 0x00, 0xef, 0x41, 0x2e, 0x44, /* .?...A.D */ + 0xbf, 0xbf, 0xef, 0x41, 0x2e, 0x45, 0xbf, 0x80, /* ...A.E.. */ + 0xef, 0x0a, 0xaf, 0x01, 0x2e, 0x06, 0x82, 0x80, /* ........ */ + 0x82, 0x84, 0x82, 0x6b, 0xcf, 0x10, 0xaf, 0x01, /* ...k.... */ + 0x2e, 0x94, 0x86, 0x40, 0xef, 0x6d, 0xaf, 0x80, /* ...@.m.. */ + 0xef, 0x6c, 0xaf, 0x01, 0x2e, 0xf9, 0x81, 0xed, /* .l...... */ + 0x80, 0x01, 0x2e, 0x18, 0x87, 0x01, 0x2e, 0x1a, /* ........ */ + 0x87, 0x07, 0x87, 0xff, 0x2f, 0xd1, 0x5a, 0x6c, /* ..../.Zl */ + 0xcf, 0x6d, 0xdf, 0x3f, 0x00, 0x6c, 0xaf, 0x6d, /* .m.?.l.m */ + 0x26, 0x03, 0x54, 0x6d, 0xdf, 0x0c, 0x82, 0x6d, /* &.Tm...m */ + 0xbf, 0xeb, 0x50, 0x6b, 0xcf, 0x08, 0x1e, 0x11, /* ..Pk.... */ + 0x5f, 0x6c, 0x24, 0x02, 0x53, 0xff, 0xef, 0x6c, /* _l$.S..l */ + 0xaf, 0x10, 0x50, 0x6c, 0x24, 0x02, 0x53, 0xff, /* ..Pl$.S. */ + 0xef, 0x6c, 0xaf, 0x0b, 0x50, 0x6b, 0xcf, 0x0a, /* .l..Pk.. */ + 0x1e, 0x08, 0x55, 0x6c, 0x24, 0x02, 0x53, 0xff, /* ..Ul$.S. */ + 0xef, 0x6c, 0xaf, 0x03, 0x50, 0x6c, 0x24, 0x01, /* .l..Pl$. */ + 0x53, 0xff, 0xef, 0x6c, 0xaf /* S..l. */ }; static const unsigned char pkt35[] = { -0x42, 0xca, 0x00, -0xde, 0x23, 0x6b, 0xcf, 0xdf, /* B...#k.. */ -0x96, 0xb0, 0xef, 0x00, 0xff, 0x1d, 0x00, 0x00, /* ........ */ -0x13, 0x1b, 0x27, 0x6c, 0xcf, 0x9f, 0x9d, 0x6b, /* ..'l...k */ -0xcf, 0x1f, 0x20, 0x6b, 0xaf, 0x0a, 0x1e, 0xbc, /* .. k.... */ -0x5f, 0x05, 0x27, 0x01, 0x2e, 0x3f, 0x84, 0x55, /* _.'..?.U */ -0x82, 0x01, 0x2e, 0x06, 0x82, 0x73, 0x23, 0x0a, /* .....s#. */ -0xef, 0x10, 0xaf, 0x01, 0x2e, 0x94, 0x86, 0x80, /* ........ */ -0xef, 0x01, 0x2e, 0xf9, 0x81, 0xed, 0x80, 0x08, /* ........ */ -0xef, 0x06, 0xaf, 0x01, 0x2e, 0x18, 0x87, 0x01, /* ........ */ -0x2e, 0x1a, 0x87, 0x06, 0x25, 0xf9, 0x55, 0x02, /* ....%.U. */ -0x2e, 0x52, 0x84, 0x4e, 0x23, 0x40, 0xcf, 0xe0, /* .R.N#@.. */ -0xaf, 0x41, 0xdf, 0xe1, 0xbf, 0x41, 0x2e, 0x4e, /* .A...A.N */ -0xdf, 0xf7, 0x1c, 0x41, 0x2e, 0x4e, 0xbf, 0x01, /* ...A.N.. */ -0x2e, 0x18, 0x87, 0x01, 0x2e, 0x1a, 0x87, 0x45, /* .......E */ -0x82, 0x4e, 0x24, 0x4e, 0xcf, 0x20, 0x1e, 0x03, /* .N$N. .. */ -0x55, 0x01, 0xef, 0x1f, 0x90, 0x02, 0x2e, 0x87, /* U....... */ -0x73, 0x40, 0x2e, 0x8f, 0xdf, 0xdf, 0x22, 0xe5, /* s@....". */ -0x55, 0x4e, 0x86, 0x4e, 0x23, 0x4e, 0xcf, 0x52, /* UN.N#N.R */ -0x86, 0x59, 0x86, 0x3f, 0x9f, 0x4e, 0xcf, 0x52, /* .Y.?.N.R */ -0x86, 0x5f, 0x86, 0x1f, 0x9f, 0x4e, 0x24, 0x4e, /* ._...N$N */ -0xcf, 0x04, 0x1e, 0xf3, 0x55, 0xf8, 0x0f, 0x08, /* ....U... */ -0xef, 0x06, 0xaf, 0xf6, 0x97, 0xbc, 0x03, 0x01, /* ........ */ -0x5f, 0xff, 0x0f, 0xfc, 0x97, 0x06, 0x25, 0xf9, /* _.....%. */ -0x55, 0xf8, 0x0f, 0x08, 0xff, 0x06, 0xbf, 0xf6, /* U....... */ -0x9f, 0xdf, 0x01, 0xa1, 0x27, 0x7f, 0x21, 0x3f, /* ....'.!? */ -0x9f, 0x06, 0x25, 0xf8, 0x55 /* ..%.U */ + 0x42, 0xca, 0x00, + 0xde, 0x23, 0x6b, 0xcf, 0xdf, /* B...#k.. */ + 0x96, 0xb0, 0xef, 0x00, 0xff, 0x1d, 0x00, 0x00, /* ........ */ + 0x13, 0x1b, 0x27, 0x6c, 0xcf, 0x9f, 0x9d, 0x6b, /* ..'l...k */ + 0xcf, 0x1f, 0x20, 0x6b, 0xaf, 0x0a, 0x1e, 0xbc, /* .. k.... */ + 0x5f, 0x05, 0x27, 0x01, 0x2e, 0x3f, 0x84, 0x55, /* _.'..?.U */ + 0x82, 0x01, 0x2e, 0x06, 0x82, 0x73, 0x23, 0x0a, /* .....s#. */ + 0xef, 0x10, 0xaf, 0x01, 0x2e, 0x94, 0x86, 0x80, /* ........ */ + 0xef, 0x01, 0x2e, 0xf9, 0x81, 0xed, 0x80, 0x08, /* ........ */ + 0xef, 0x06, 0xaf, 0x01, 0x2e, 0x18, 0x87, 0x01, /* ........ */ + 0x2e, 0x1a, 0x87, 0x06, 0x25, 0xf9, 0x55, 0x02, /* ....%.U. */ + 0x2e, 0x52, 0x84, 0x4e, 0x23, 0x40, 0xcf, 0xe0, /* .R.N#@.. */ + 0xaf, 0x41, 0xdf, 0xe1, 0xbf, 0x41, 0x2e, 0x4e, /* .A...A.N */ + 0xdf, 0xf7, 0x1c, 0x41, 0x2e, 0x4e, 0xbf, 0x01, /* ...A.N.. */ + 0x2e, 0x18, 0x87, 0x01, 0x2e, 0x1a, 0x87, 0x45, /* .......E */ + 0x82, 0x4e, 0x24, 0x4e, 0xcf, 0x20, 0x1e, 0x03, /* .N$N. .. */ + 0x55, 0x01, 0xef, 0x1f, 0x90, 0x02, 0x2e, 0x87, /* U....... */ + 0x73, 0x40, 0x2e, 0x8f, 0xdf, 0xdf, 0x22, 0xe5, /* s@....". */ + 0x55, 0x4e, 0x86, 0x4e, 0x23, 0x4e, 0xcf, 0x52, /* UN.N#N.R */ + 0x86, 0x59, 0x86, 0x3f, 0x9f, 0x4e, 0xcf, 0x52, /* .Y.?.N.R */ + 0x86, 0x5f, 0x86, 0x1f, 0x9f, 0x4e, 0x24, 0x4e, /* ._...N$N */ + 0xcf, 0x04, 0x1e, 0xf3, 0x55, 0xf8, 0x0f, 0x08, /* ....U... */ + 0xef, 0x06, 0xaf, 0xf6, 0x97, 0xbc, 0x03, 0x01, /* ........ */ + 0x5f, 0xff, 0x0f, 0xfc, 0x97, 0x06, 0x25, 0xf9, /* _.....%. */ + 0x55, 0xf8, 0x0f, 0x08, 0xff, 0x06, 0xbf, 0xf6, /* U....... */ + 0x9f, 0xdf, 0x01, 0xa1, 0x27, 0x7f, 0x21, 0x3f, /* ....'.!? */ + 0x9f, 0x06, 0x25, 0xf8, 0x55 /* ..%.U */ }; static const unsigned char pkt37[] = { -0x42, 0xb2, 0x00, -0x42, 0x24, 0xf8, 0x0f, 0x04, /* B..B$... */ -0xef, 0x06, 0xaf, 0xbb, 0xef, 0x00, 0xff, 0x1a, /* ........ */ -0x27, 0xfc, 0x9f, 0xfc, 0x97, 0x09, 0x27, 0x5f, /* '.....'_ */ -0x02, 0x3f, 0x97, 0x06, 0x25, 0xf8, 0x55, 0x81, /* .?..%.U. */ -0xcf, 0x24, 0xaf, 0x05, 0x27, 0x0a, 0xef, 0x73, /* .$..'..s */ -0x43, 0x02, 0x5b, 0x73, 0xcf, 0x09, 0x27, 0x0f, /* C.[s..'. */ -0x1c, 0x81, 0xaf, 0x73, 0xcf, 0x09, 0x27, 0x30, /* ...s..'0 */ -0x1c, 0xfc, 0xdf, 0xcf, 0x1d, 0x5f, 0x02, 0xfc, /* ....._.. */ -0xbf, 0x81, 0xcf, 0x10, 0xaf, 0x01, 0x2e, 0x94, /* ........ */ -0x86, 0x80, 0x82, 0x01, 0x2e, 0x34, 0x81, 0x40, /* .....4.@ */ -0xef, 0x6b, 0xaf, 0x80, 0xef, 0x82, 0xaf, 0x01, /* .k...... */ -0x2e, 0xf9, 0x81, 0xed, 0x80, 0x01, 0x2e, 0x18, /* ........ */ -0x87, 0x01, 0x2e, 0x1a, 0x87, 0x16, 0x82, 0x01, /* ........ */ -0x2e, 0x2f, 0x89, 0x0a, 0x5b, 0x73, 0x43, 0x19, /* ./..[sC. */ -0x5a, 0x81, 0xcf, 0x5e, 0xdf, 0xbf, 0x03, 0x15, /* Z..^.... */ -0x5f, 0x5f, 0x20, 0x81, 0xaf, 0xdf, 0x22, 0x11, /* __ ...". */ -0x54, 0xde, 0x50, 0x40, 0x2e, 0x8f, 0xdf, 0x1f, /* T.P@.... */ -0x2c, 0x00, 0x2e, 0x0c, 0x5a, 0x5f, 0x2c, 0x09, /* ,...Z_,. */ -0x5b, 0x82, 0xcf, 0x6b, 0xdf, 0x3f, 0x00, 0x82, /* [..k.?.. */ -0xaf, 0x6b, 0x26, 0xe7, 0x54, 0x6b, 0xdf, 0x0c, /* .k&.Tk.. */ -0x82, 0x6b, 0xbf, 0xd8, 0x50, 0x05, 0x27, 0x82, /* .k..P.'. */ -0xcf, 0x6b, 0xdf, 0xbf, 0x01, 0x82, 0xaf, 0x6b, /* .k.....k */ -0x26, 0xf4, 0x55, 0xdb, 0x50 /* &.U.P */ + 0x42, 0xb2, 0x00, + 0x42, 0x24, 0xf8, 0x0f, 0x04, /* B..B$... */ + 0xef, 0x06, 0xaf, 0xbb, 0xef, 0x00, 0xff, 0x1a, /* ........ */ + 0x27, 0xfc, 0x9f, 0xfc, 0x97, 0x09, 0x27, 0x5f, /* '.....'_ */ + 0x02, 0x3f, 0x97, 0x06, 0x25, 0xf8, 0x55, 0x81, /* .?..%.U. */ + 0xcf, 0x24, 0xaf, 0x05, 0x27, 0x0a, 0xef, 0x73, /* .$..'..s */ + 0x43, 0x02, 0x5b, 0x73, 0xcf, 0x09, 0x27, 0x0f, /* C.[s..'. */ + 0x1c, 0x81, 0xaf, 0x73, 0xcf, 0x09, 0x27, 0x30, /* ...s..'0 */ + 0x1c, 0xfc, 0xdf, 0xcf, 0x1d, 0x5f, 0x02, 0xfc, /* ....._.. */ + 0xbf, 0x81, 0xcf, 0x10, 0xaf, 0x01, 0x2e, 0x94, /* ........ */ + 0x86, 0x80, 0x82, 0x01, 0x2e, 0x34, 0x81, 0x40, /* .....4.@ */ + 0xef, 0x6b, 0xaf, 0x80, 0xef, 0x82, 0xaf, 0x01, /* .k...... */ + 0x2e, 0xf9, 0x81, 0xed, 0x80, 0x01, 0x2e, 0x18, /* ........ */ + 0x87, 0x01, 0x2e, 0x1a, 0x87, 0x16, 0x82, 0x01, /* ........ */ + 0x2e, 0x2f, 0x89, 0x0a, 0x5b, 0x73, 0x43, 0x19, /* ./..[sC. */ + 0x5a, 0x81, 0xcf, 0x5e, 0xdf, 0xbf, 0x03, 0x15, /* Z..^.... */ + 0x5f, 0x5f, 0x20, 0x81, 0xaf, 0xdf, 0x22, 0x11, /* __ ...". */ + 0x54, 0xde, 0x50, 0x40, 0x2e, 0x8f, 0xdf, 0x1f, /* T.P@.... */ + 0x2c, 0x00, 0x2e, 0x0c, 0x5a, 0x5f, 0x2c, 0x09, /* ,...Z_,. */ + 0x5b, 0x82, 0xcf, 0x6b, 0xdf, 0x3f, 0x00, 0x82, /* [..k.?.. */ + 0xaf, 0x6b, 0x26, 0xe7, 0x54, 0x6b, 0xdf, 0x0c, /* .k&.Tk.. */ + 0x82, 0x6b, 0xbf, 0xd8, 0x50, 0x05, 0x27, 0x82, /* .k..P.'. */ + 0xcf, 0x6b, 0xdf, 0xbf, 0x01, 0x82, 0xaf, 0x6b, /* .k.....k */ + 0x26, 0xf4, 0x55, 0xdb, 0x50 /* &.U.P */ }; static const unsigned char pkt39[] = { -0x42, 0xca, 0x00, -0x9a, 0x24, 0xfa, 0xcf, 0xdf, /* B...$... */ -0x96, 0x37, 0xcf, 0xdf, 0x96, 0x08, 0xcf, 0xdf, /* .7...... */ -0x96, 0x3d, 0xcf, 0xdf, 0x96, 0x77, 0xcf, 0xdf, /* .=...w.. */ -0x96, 0x01, 0x2e, 0x08, 0x82, 0xdd, 0x97, 0x77, /* .......w */ -0xaf, 0xdd, 0x97, 0x3d, 0xaf, 0xdd, 0x97, 0x08, /* ...=.... */ -0xaf, 0xdd, 0x97, 0x37, 0xaf, 0xdd, 0x97, 0xfa, /* ...7.... */ -0xaf, 0x9f, 0x22, 0x6d, 0x2e, 0x6d, 0xbf, 0xfb, /* .."m.m.. */ -0x39, 0x08, 0x45, 0x00, 0x5a, 0xfb, 0x31, 0x0a, /* 9.E.Z.1. */ -0x42, 0x00, 0x5b, 0xa2, 0x39, 0x02, 0xcf, 0x5c, /* B.[.9..\ */ -0xaf, 0xe1, 0xef, 0x95, 0xaf, 0x9f, 0x22, 0x61, /* ......"a */ -0xaf, 0x62, 0xaf, 0x69, 0xaf, 0x6a, 0xaf, 0x16, /* .b.i.j.. */ -0xaf, 0x96, 0xaf, 0x29, 0xaf, 0x28, 0xaf, 0xc1, /* ...).(.. */ -0x2e, 0x49, 0xdf, 0x3f, 0x2d, 0x03, 0x5b, 0xa0, /* .I.?-.[. */ -0xcf, 0x8f, 0x1c, 0x20, 0x18, 0xa0, 0xaf, 0xa1, /* ... .... */ -0xcf, 0xdf, 0x1c, 0xa1, 0xaf, 0xed, 0x80, 0x02, /* ........ */ -0x47, 0x06, 0x5a, 0x0a, 0x41, 0x04, 0x5a, 0x0a, /* G.Z.A.Z. */ -0xdf, 0x30, 0x1d, 0x30, 0x1f, 0x00, 0x54, 0x01, /* .0.0..T. */ -0xef, 0x44, 0xaf, 0x09, 0xef, 0x60, 0xaf, 0xa7, /* .D...`.. */ -0xef, 0x40, 0xaf, 0x2d, 0xef, 0x41, 0xaf, 0x0a, /* .@.-.A.. */ -0x40, 0x06, 0x5a, 0x10, 0xcf, 0x27, 0xaf, 0xe2, /* @.Z..'.. */ -0x23, 0x6e, 0x23, 0x08, 0xef, 0xe3, 0xaf, 0x6f, /* #n#....o */ -0xaf, 0xe2, 0x23, 0x08, 0xef, 0xe3, 0xaf, 0x79, /* ..#....y */ -0x82, 0x4d, 0xaf, 0xdf, 0x96, 0x64, 0xdf, 0x8b, /* .M...d.. */ -0x82, 0x93, 0xbf, 0xdd, 0x97, 0x77, 0xff, 0x8b, /* .....w.. */ -0x82, 0x94, 0xbf, 0x9e, 0x23, 0xe4, 0x23, 0x9f, /* ....#.#. */ -0x22, 0x6d, 0x2e, 0x6b, 0xbf /* "m.k. */ + 0x42, 0xca, 0x00, + 0x9a, 0x24, 0xfa, 0xcf, 0xdf, /* B...$... */ + 0x96, 0x37, 0xcf, 0xdf, 0x96, 0x08, 0xcf, 0xdf, /* .7...... */ + 0x96, 0x3d, 0xcf, 0xdf, 0x96, 0x77, 0xcf, 0xdf, /* .=...w.. */ + 0x96, 0x01, 0x2e, 0x08, 0x82, 0xdd, 0x97, 0x77, /* .......w */ + 0xaf, 0xdd, 0x97, 0x3d, 0xaf, 0xdd, 0x97, 0x08, /* ...=.... */ + 0xaf, 0xdd, 0x97, 0x37, 0xaf, 0xdd, 0x97, 0xfa, /* ...7.... */ + 0xaf, 0x9f, 0x22, 0x6d, 0x2e, 0x6d, 0xbf, 0xfb, /* .."m.m.. */ + 0x39, 0x08, 0x45, 0x00, 0x5a, 0xfb, 0x31, 0x0a, /* 9.E.Z.1. */ + 0x42, 0x00, 0x5b, 0xa2, 0x39, 0x02, 0xcf, 0x5c, /* B.[.9..\ */ + 0xaf, 0xe1, 0xef, 0x95, 0xaf, 0x9f, 0x22, 0x61, /* ......"a */ + 0xaf, 0x62, 0xaf, 0x69, 0xaf, 0x6a, 0xaf, 0x16, /* .b.i.j.. */ + 0xaf, 0x96, 0xaf, 0x29, 0xaf, 0x28, 0xaf, 0xc1, /* ...).(.. */ + 0x2e, 0x49, 0xdf, 0x3f, 0x2d, 0x03, 0x5b, 0xa0, /* .I.?-.[. */ + 0xcf, 0x8f, 0x1c, 0x20, 0x18, 0xa0, 0xaf, 0xa1, /* ... .... */ + 0xcf, 0xdf, 0x1c, 0xa1, 0xaf, 0xed, 0x80, 0x02, /* ........ */ + 0x47, 0x06, 0x5a, 0x0a, 0x41, 0x04, 0x5a, 0x0a, /* G.Z.A.Z. */ + 0xdf, 0x30, 0x1d, 0x30, 0x1f, 0x00, 0x54, 0x01, /* .0.0..T. */ + 0xef, 0x44, 0xaf, 0x09, 0xef, 0x60, 0xaf, 0xa7, /* .D...`.. */ + 0xef, 0x40, 0xaf, 0x2d, 0xef, 0x41, 0xaf, 0x0a, /* .@.-.A.. */ + 0x40, 0x06, 0x5a, 0x10, 0xcf, 0x27, 0xaf, 0xe2, /* @.Z..'.. */ + 0x23, 0x6e, 0x23, 0x08, 0xef, 0xe3, 0xaf, 0x6f, /* #n#....o */ + 0xaf, 0xe2, 0x23, 0x08, 0xef, 0xe3, 0xaf, 0x79, /* ..#....y */ + 0x82, 0x4d, 0xaf, 0xdf, 0x96, 0x64, 0xdf, 0x8b, /* .M...d.. */ + 0x82, 0x93, 0xbf, 0xdd, 0x97, 0x77, 0xff, 0x8b, /* .....w.. */ + 0x82, 0x94, 0xbf, 0x9e, 0x23, 0xe4, 0x23, 0x9f, /* ....#.#. */ + 0x22, 0x6d, 0x2e, 0x6b, 0xbf /* "m.k. */ }; static const unsigned char pkt41[] = { -0x42, 0x12, 0x00, -0xfe, 0x24, 0x6d, 0x2e, 0x6a, /* B...$m.j */ -0xbf, 0x6d, 0x2e, 0x6c, 0xbf, 0xa5, 0xcf, 0xf3, /* .m.l.... */ -0x1c, 0xa5, 0xaf, 0x05, 0x27 /* ....' */ + 0x42, 0x12, 0x00, + 0xfe, 0x24, 0x6d, 0x2e, 0x6a, /* B...$m.j */ + 0xbf, 0x6d, 0x2e, 0x6c, 0xbf, 0xa5, 0xcf, 0xf3, /* .m.l.... */ + 0x1c, 0xa5, 0xaf, 0x05, 0x27 /* ....' */ }; static const unsigned char pkt43[] = { -0x42, 0xca, 0x00, -0x06, 0x25, 0xfe, 0xcf, 0x58, /* B...%..X */ -0xaf, 0xfe, 0xcf, 0xfe, 0xdf, 0x02, 0x2e, 0x9d, /* ........ */ -0x85, 0xfe, 0xcf, 0x3c, 0xaf, 0x07, 0x3d, 0x58, /* ...<..=X */ -0x40, 0x4e, 0x5a, 0x3c, 0x26, 0x4c, 0x55, 0x37, /* @NZ<&LU7 */ -0x45, 0x4a, 0x5a, 0x02, 0x2e, 0x1b, 0x86, 0x47, /* EJZ....G */ -0x5a, 0x02, 0x2e, 0xad, 0x85, 0x00, 0x2e, 0xb9, /* Z....... */ -0x8d, 0xfe, 0xef, 0x16, 0x80, 0x02, 0xcf, 0xdf, /* ........ */ -0x96, 0x61, 0xef, 0xc0, 0xaf, 0x04, 0x27, 0xc1, /* .a....'. */ -0x46, 0x04, 0x5b, 0xc0, 0x3e, 0x40, 0xef, 0xc1, /* F.[.>@.. */ -0xaf, 0x01, 0x2e, 0x8d, 0x8b, 0xd0, 0x41, 0x07, /* ......A. */ -0x5b, 0x02, 0x2e, 0x5d, 0x85, 0xf2, 0x5b, 0xae, /* [..]..[. */ -0x87, 0xdd, 0x97, 0x1f, 0x2d, 0x06, 0x5b, 0x03, /* ....-.[. */ -0x50, 0x01, 0x0c, 0x02, 0xcf, 0xc0, 0x1c, 0x01, /* P....... */ -0x55, 0x02, 0x2e, 0x40, 0x85, 0xc0, 0x23, 0x20, /* U..@..# */ -0xef, 0xc1, 0xaf, 0x00, 0x2e, 0xd8, 0x8d, 0x05, /* ........ */ -0x27, 0x9b, 0x22, 0x37, 0x45, 0x05, 0x5a, 0x41, /* '."7E.ZA */ -0x2e, 0x52, 0xdf, 0xdf, 0x2d, 0x04, 0x5b, 0x00, /* .R..-.[. */ -0x28, 0x02, 0x50, 0x3b, 0x43, 0x00, 0x5b, 0x00, /* (.P;C.[. */ -0x28, 0xd3, 0xdf, 0xc6, 0x2e, 0x15, 0xbf, 0xd3, /* (....... */ -0x3c, 0x40, 0xef, 0x09, 0x80, 0xdd, 0x97, 0xff, /* <@...... */ -0xaf, 0x00, 0x2e, 0xa7, 0x8a, 0xc6, 0x2e, 0x15, /* ........ */ -0xdf, 0x10, 0x1d, 0xd3, 0xcf, 0x3f, 0x02, 0xd3, /* .....?.. */ -0xaf, 0x05, 0x27, 0xed, 0x83, 0x07, 0x45, 0x05, /* ..'...E. */ -0x27, 0x3d, 0x23, 0x07, 0x3d, 0x02, 0xcf, 0xdf, /* '=#.=... */ -0x96, 0x02, 0x2e, 0xad, 0x85, 0x02, 0x2e, 0x96, /* ........ */ -0x85, 0xfe, 0xef, 0x16, 0x80 /* ..... */ + 0x42, 0xca, 0x00, + 0x06, 0x25, 0xfe, 0xcf, 0x58, /* B...%..X */ + 0xaf, 0xfe, 0xcf, 0xfe, 0xdf, 0x02, 0x2e, 0x9d, /* ........ */ + 0x85, 0xfe, 0xcf, 0x3c, 0xaf, 0x07, 0x3d, 0x58, /* ...<..=X */ + 0x40, 0x4e, 0x5a, 0x3c, 0x26, 0x4c, 0x55, 0x37, /* @NZ<&LU7 */ + 0x45, 0x4a, 0x5a, 0x02, 0x2e, 0x1b, 0x86, 0x47, /* EJZ....G */ + 0x5a, 0x02, 0x2e, 0xad, 0x85, 0x00, 0x2e, 0xb9, /* Z....... */ + 0x8d, 0xfe, 0xef, 0x16, 0x80, 0x02, 0xcf, 0xdf, /* ........ */ + 0x96, 0x61, 0xef, 0xc0, 0xaf, 0x04, 0x27, 0xc1, /* .a....'. */ + 0x46, 0x04, 0x5b, 0xc0, 0x3e, 0x40, 0xef, 0xc1, /* F.[.>@.. */ + 0xaf, 0x01, 0x2e, 0x8d, 0x8b, 0xd0, 0x41, 0x07, /* ......A. */ + 0x5b, 0x02, 0x2e, 0x5d, 0x85, 0xf2, 0x5b, 0xae, /* [..]..[. */ + 0x87, 0xdd, 0x97, 0x1f, 0x2d, 0x06, 0x5b, 0x03, /* ....-.[. */ + 0x50, 0x01, 0x0c, 0x02, 0xcf, 0xc0, 0x1c, 0x01, /* P....... */ + 0x55, 0x02, 0x2e, 0x40, 0x85, 0xc0, 0x23, 0x20, /* U..@..# */ + 0xef, 0xc1, 0xaf, 0x00, 0x2e, 0xd8, 0x8d, 0x05, /* ........ */ + 0x27, 0x9b, 0x22, 0x37, 0x45, 0x05, 0x5a, 0x41, /* '."7E.ZA */ + 0x2e, 0x52, 0xdf, 0xdf, 0x2d, 0x04, 0x5b, 0x00, /* .R..-.[. */ + 0x28, 0x02, 0x50, 0x3b, 0x43, 0x00, 0x5b, 0x00, /* (.P;C.[. */ + 0x28, 0xd3, 0xdf, 0xc6, 0x2e, 0x15, 0xbf, 0xd3, /* (....... */ + 0x3c, 0x40, 0xef, 0x09, 0x80, 0xdd, 0x97, 0xff, /* <@...... */ + 0xaf, 0x00, 0x2e, 0xa7, 0x8a, 0xc6, 0x2e, 0x15, /* ........ */ + 0xdf, 0x10, 0x1d, 0xd3, 0xcf, 0x3f, 0x02, 0xd3, /* .....?.. */ + 0xaf, 0x05, 0x27, 0xed, 0x83, 0x07, 0x45, 0x05, /* ..'...E. */ + 0x27, 0x3d, 0x23, 0x07, 0x3d, 0x02, 0xcf, 0xdf, /* '=#.=... */ + 0x96, 0x02, 0x2e, 0xad, 0x85, 0x02, 0x2e, 0x96, /* ........ */ + 0x85, 0xfe, 0xef, 0x16, 0x80 /* ..... */ }; static const unsigned char pkt45[] = { -0x42, 0xca, 0x00, -0x6a, 0x25, 0x05, 0xef, 0xc0, /* B..j%... */ -0xaf, 0x04, 0x27, 0xd0, 0x41, 0x03, 0x5b, 0x02, /* ..'.A.[. */ -0x2e, 0x5d, 0x85, 0xf9, 0x5b, 0xbb, 0x50, 0x27, /* .]..[.P' */ -0x82, 0x04, 0xef, 0xc1, 0xaf, 0x9b, 0x22, 0x02, /* ......". */ -0x2e, 0xd1, 0x85, 0xdd, 0x97, 0xdf, 0x22, 0x02, /* ......". */ -0x55, 0x58, 0x40, 0x02, 0x5a, 0x0b, 0x50, 0x58, /* UX@.Z.PX */ -0x40, 0x09, 0x5a, 0xdd, 0x97, 0x1f, 0x2d, 0xb3, /* @.Z...-. */ -0x5a, 0x02, 0x2e, 0x1c, 0x86, 0xb2, 0x5b, 0x9b, /* Z.....[. */ -0x22, 0x02, 0x2e, 0x4c, 0x85, 0xae, 0x50, 0x02, /* "..L..P. */ -0x2e, 0x1c, 0x86, 0xd5, 0x5b, 0x02, 0x2e, 0x40, /* ....[..@ */ -0x85, 0x58, 0x41, 0x02, 0x5b, 0x01, 0x0c, 0x02, /* .XA.[... */ -0x2e, 0x3a, 0x75, 0xcd, 0x50, 0x41, 0x2e, 0x52, /* .:u.PA.R */ -0xdf, 0xed, 0x1c, 0x04, 0x18, 0x41, 0x2e, 0x52, /* .....A.R */ -0xbf, 0x05, 0x27, 0x1a, 0x27, 0x56, 0xdf, 0x59, /* ..'.'V.Y */ -0x80, 0xdf, 0x22, 0x00, 0x54, 0x01, 0x16, 0x3f, /* ..".T..? */ -0x1e, 0x00, 0x5f, 0x3f, 0xef, 0x1f, 0x22, 0x1f, /* .._?..". */ -0x22, 0xaf, 0xdf, 0x03, 0x1d, 0x5f, 0x02, 0xaf, /* "...._.. */ -0xbf, 0x05, 0x27, 0x00, 0x2e, 0xa1, 0x8d, 0xae, /* ..'..... */ -0xdf, 0xe0, 0x19, 0xae, 0xbf, 0x57, 0x40, 0x00, /* .....W@. */ -0x5b, 0xa1, 0x32, 0x57, 0x43, 0x00, 0x5b, 0xae, /* [.2WC.[. */ -0x3f, 0xed, 0x80, 0x05, 0x27, 0x41, 0x2e, 0x52, /* ?...'A.R */ -0xdf, 0x03, 0x18, 0x41, 0x2e, 0x52, 0xbf, 0x05, /* ...A.R.. */ -0x27, 0xd3, 0xdf, 0xff, 0x96, 0x9b, 0x22, 0x02, /* '.....". */ -0x2e, 0xd1, 0x85, 0xd3, 0x3c, 0x07, 0x80, 0xdd, /* ....<... */ -0x97, 0xff, 0xaf, 0x00, 0x2e, 0xa7, 0x8a, 0xdd, /* ........ */ -0x9f, 0x10, 0x1d, 0xd3, 0xcf /* ..... */ + 0x42, 0xca, 0x00, + 0x6a, 0x25, 0x05, 0xef, 0xc0, /* B..j%... */ + 0xaf, 0x04, 0x27, 0xd0, 0x41, 0x03, 0x5b, 0x02, /* ..'.A.[. */ + 0x2e, 0x5d, 0x85, 0xf9, 0x5b, 0xbb, 0x50, 0x27, /* .]..[.P' */ + 0x82, 0x04, 0xef, 0xc1, 0xaf, 0x9b, 0x22, 0x02, /* ......". */ + 0x2e, 0xd1, 0x85, 0xdd, 0x97, 0xdf, 0x22, 0x02, /* ......". */ + 0x55, 0x58, 0x40, 0x02, 0x5a, 0x0b, 0x50, 0x58, /* UX@.Z.PX */ + 0x40, 0x09, 0x5a, 0xdd, 0x97, 0x1f, 0x2d, 0xb3, /* @.Z...-. */ + 0x5a, 0x02, 0x2e, 0x1c, 0x86, 0xb2, 0x5b, 0x9b, /* Z.....[. */ + 0x22, 0x02, 0x2e, 0x4c, 0x85, 0xae, 0x50, 0x02, /* "..L..P. */ + 0x2e, 0x1c, 0x86, 0xd5, 0x5b, 0x02, 0x2e, 0x40, /* ....[..@ */ + 0x85, 0x58, 0x41, 0x02, 0x5b, 0x01, 0x0c, 0x02, /* .XA.[... */ + 0x2e, 0x3a, 0x75, 0xcd, 0x50, 0x41, 0x2e, 0x52, /* .:u.PA.R */ + 0xdf, 0xed, 0x1c, 0x04, 0x18, 0x41, 0x2e, 0x52, /* .....A.R */ + 0xbf, 0x05, 0x27, 0x1a, 0x27, 0x56, 0xdf, 0x59, /* ..'.'V.Y */ + 0x80, 0xdf, 0x22, 0x00, 0x54, 0x01, 0x16, 0x3f, /* ..".T..? */ + 0x1e, 0x00, 0x5f, 0x3f, 0xef, 0x1f, 0x22, 0x1f, /* .._?..". */ + 0x22, 0xaf, 0xdf, 0x03, 0x1d, 0x5f, 0x02, 0xaf, /* "...._.. */ + 0xbf, 0x05, 0x27, 0x00, 0x2e, 0xa1, 0x8d, 0xae, /* ..'..... */ + 0xdf, 0xe0, 0x19, 0xae, 0xbf, 0x57, 0x40, 0x00, /* .....W@. */ + 0x5b, 0xa1, 0x32, 0x57, 0x43, 0x00, 0x5b, 0xae, /* [.2WC.[. */ + 0x3f, 0xed, 0x80, 0x05, 0x27, 0x41, 0x2e, 0x52, /* ?...'A.R */ + 0xdf, 0x03, 0x18, 0x41, 0x2e, 0x52, 0xbf, 0x05, /* ...A.R.. */ + 0x27, 0xd3, 0xdf, 0xff, 0x96, 0x9b, 0x22, 0x02, /* '.....". */ + 0x2e, 0xd1, 0x85, 0xd3, 0x3c, 0x07, 0x80, 0xdd, /* ....<... */ + 0x97, 0xff, 0xaf, 0x00, 0x2e, 0xa7, 0x8a, 0xdd, /* ........ */ + 0x9f, 0x10, 0x1d, 0xd3, 0xcf /* ..... */ }; static const unsigned char pkt47[] = { -0x42, 0xb4, 0x00, -0xce, 0x25, 0x3f, 0x02, 0xd3, /* B...%?.. */ -0xaf, 0x05, 0x27, 0x37, 0x45, 0x10, 0x5a, 0x02, /* ..'7E.Z. */ -0x2e, 0x1b, 0x86, 0x0d, 0x5a, 0x02, 0x2e, 0xad, /* ....Z... */ -0x85, 0x00, 0x2e, 0xbf, 0x8d, 0x00, 0x2e, 0xd3, /* ........ */ -0x8d, 0x41, 0x2e, 0x52, 0xdf, 0xdf, 0x2d, 0x00, /* .A.R..-. */ -0x5b, 0x00, 0x28, 0x00, 0x2e, 0xd8, 0x8d, 0x05, /* [.(..... */ -0x27, 0xf9, 0xcf, 0xdf, 0x96, 0xf9, 0x3d, 0x01, /* '.....=. */ -0x2e, 0x06, 0x82, 0x2d, 0xff, 0xa7, 0xef, 0xe1, /* ...-.... */ -0xbf, 0xe0, 0xaf, 0x09, 0xef, 0x10, 0xaf, 0x01, /* ........ */ -0x2e, 0x94, 0x86, 0xed, 0x80, 0x01, 0x2e, 0x18, /* ........ */ -0x87, 0x01, 0x2e, 0x1a, 0x87, 0x00, 0x2e, 0x16, /* ........ */ -0x82, 0x5b, 0x82, 0x00, 0x2e, 0x2d, 0x82, 0x26, /* .[...-.& */ -0x37, 0x00, 0x5a, 0x0c, 0x50, 0xff, 0x96, 0xdf, /* 7.Z.P... */ -0x96, 0x79, 0xcf, 0x7a, 0xdf, 0xff, 0x96, 0xdf, /* .y.z.... */ -0x96, 0xc2, 0x97, 0xc3, 0x9f, 0x9d, 0x01, 0x5d, /* .......] */ -0x01, 0x07, 0x53, 0xdd, 0x97, 0xdd, 0x9f, 0x79, /* ..S....y */ -0xaf, 0x7a, 0xbf, 0x3b, 0x3b, 0xdd, 0x97, 0xf9, /* .z.;;... */ -0xaf, 0x05, 0x27, 0xff, 0x22, 0x01, 0x55, 0x32, /* ..'.".U2 */ -0x1e, 0xf3, 0x5f, 0x02, 0x0c, 0x02, 0x2e, 0x0e, /* .._..... */ -0x86, 0x3b, 0x33, 0x00, 0x28, 0x05, 0x27, 0x0d, /* .;3.(.'. */ -0x27, 0x3c, 0x26, 0x07, 0x54, 0x3c, 0xcf, 0x3d, /* '<&.T<.= */ -0xdf, 0x3f, 0x20, 0x3d, 0xbf, 0xdf, 0x03, 0x01, /* .? =.... */ -0x52, 0x3d, 0x23, 0x0c, 0x27, 0x0d, 0x27 /* R=#.'.' */ + 0x42, 0xb4, 0x00, + 0xce, 0x25, 0x3f, 0x02, 0xd3, /* B...%?.. */ + 0xaf, 0x05, 0x27, 0x37, 0x45, 0x10, 0x5a, 0x02, /* ..'7E.Z. */ + 0x2e, 0x1b, 0x86, 0x0d, 0x5a, 0x02, 0x2e, 0xad, /* ....Z... */ + 0x85, 0x00, 0x2e, 0xbf, 0x8d, 0x00, 0x2e, 0xd3, /* ........ */ + 0x8d, 0x41, 0x2e, 0x52, 0xdf, 0xdf, 0x2d, 0x00, /* .A.R..-. */ + 0x5b, 0x00, 0x28, 0x00, 0x2e, 0xd8, 0x8d, 0x05, /* [.(..... */ + 0x27, 0xf9, 0xcf, 0xdf, 0x96, 0xf9, 0x3d, 0x01, /* '.....=. */ + 0x2e, 0x06, 0x82, 0x2d, 0xff, 0xa7, 0xef, 0xe1, /* ...-.... */ + 0xbf, 0xe0, 0xaf, 0x09, 0xef, 0x10, 0xaf, 0x01, /* ........ */ + 0x2e, 0x94, 0x86, 0xed, 0x80, 0x01, 0x2e, 0x18, /* ........ */ + 0x87, 0x01, 0x2e, 0x1a, 0x87, 0x00, 0x2e, 0x16, /* ........ */ + 0x82, 0x5b, 0x82, 0x00, 0x2e, 0x2d, 0x82, 0x26, /* .[...-.& */ + 0x37, 0x00, 0x5a, 0x0c, 0x50, 0xff, 0x96, 0xdf, /* 7.Z.P... */ + 0x96, 0x79, 0xcf, 0x7a, 0xdf, 0xff, 0x96, 0xdf, /* .y.z.... */ + 0x96, 0xc2, 0x97, 0xc3, 0x9f, 0x9d, 0x01, 0x5d, /* .......] */ + 0x01, 0x07, 0x53, 0xdd, 0x97, 0xdd, 0x9f, 0x79, /* ..S....y */ + 0xaf, 0x7a, 0xbf, 0x3b, 0x3b, 0xdd, 0x97, 0xf9, /* .z.;;... */ + 0xaf, 0x05, 0x27, 0xff, 0x22, 0x01, 0x55, 0x32, /* ..'.".U2 */ + 0x1e, 0xf3, 0x5f, 0x02, 0x0c, 0x02, 0x2e, 0x0e, /* .._..... */ + 0x86, 0x3b, 0x33, 0x00, 0x28, 0x05, 0x27, 0x0d, /* .;3.(.'. */ + 0x27, 0x3c, 0x26, 0x07, 0x54, 0x3c, 0xcf, 0x3d, /* '<&.T<.= */ + 0xdf, 0x3f, 0x20, 0x3d, 0xbf, 0xdf, 0x03, 0x01, /* .? =.... */ + 0x52, 0x3d, 0x23, 0x0c, 0x27, 0x0d, 0x27 /* R=#.'.' */ }; static const unsigned char pkt49[] = { -0x42, 0x1a, 0x00, -0x27, 0x26, 0x09, 0x43, 0x04, /* B..'&.C. */ -0x5b, 0x00, 0xef, 0xf8, 0xaf, 0x32, 0xef, 0xfa, /* [....2.. */ -0xaf, 0x03, 0x50, 0x01, 0xef, 0xf8, 0xaf, 0x42, /* ..P....B */ -0xef, 0xfa, 0xaf, 0x05, 0x27 /* ....' */ + 0x42, 0x1a, 0x00, + 0x27, 0x26, 0x09, 0x43, 0x04, /* B..'&.C. */ + 0x5b, 0x00, 0xef, 0xf8, 0xaf, 0x32, 0xef, 0xfa, /* [....2.. */ + 0xaf, 0x03, 0x50, 0x01, 0xef, 0xf8, 0xaf, 0x42, /* ..P....B */ + 0xef, 0xfa, 0xaf, 0x05, 0x27 /* ....' */ }; static const unsigned char pkt51[] = { -0x42, 0x26, 0x00, -0x33, 0x26, 0xd3, 0x45, 0xfd, /* B&.3&.E. */ -0x5a, 0x0f, 0x27, 0xd3, 0x45, 0xfa, 0x5a, 0x0f, /* Z.'.E.Z. */ -0x27, 0xd3, 0x45, 0xf7, 0x5a, 0x0f, 0x27, 0x41, /* '.E.Z.'A */ -0x2e, 0xa1, 0xdf, 0x9f, 0x28, 0x41, 0x2e, 0xa1, /* ....(A.. */ -0xbf, 0x02, 0x2e, 0x57, 0x80, 0x00, 0x2e, 0xcb, /* ...W.... */ -0x7a /* z */ + 0x42, 0x26, 0x00, + 0x33, 0x26, 0xd3, 0x45, 0xfd, /* B&.3&.E. */ + 0x5a, 0x0f, 0x27, 0xd3, 0x45, 0xfa, 0x5a, 0x0f, /* Z.'.E.Z. */ + 0x27, 0xd3, 0x45, 0xf7, 0x5a, 0x0f, 0x27, 0x41, /* '.E.Z.'A */ + 0x2e, 0xa1, 0xdf, 0x9f, 0x28, 0x41, 0x2e, 0xa1, /* ....(A.. */ + 0xbf, 0x02, 0x2e, 0x57, 0x80, 0x00, 0x2e, 0xcb, /* ...W.... */ + 0x7a /* z */ }; static const unsigned char pkt53[] = { -0x42, 0x4e, 0x00, -0x45, 0x26, 0x07, 0x3d, 0x02, /* BN.E&.=. */ -0x5b, 0xae, 0x87, 0xc2, 0x23, 0xd3, 0x3c, 0x02, /* [...#.<. */ -0x44, 0xdc, 0x2f, 0x43, 0x5a, 0x02, 0x45, 0xdc, /* D./CZ.E. */ -0x2f, 0xa4, 0x5b, 0x58, 0x23, 0x3c, 0x26, 0x02, /* /.[X#<&. */ -0x55, 0x02, 0x2e, 0x0e, 0x85, 0x00, 0x50, 0x09, /* U.....P. */ -0x8f, 0x07, 0x45, 0xeb, 0x5a, 0x41, 0x2e, 0x53, /* ..E.ZA.S */ -0xdf, 0xc1, 0x2e, 0x79, 0xdf, 0xff, 0x96, 0xdf, /* ...y.... */ -0x96, 0x41, 0x2e, 0x55, 0xdf, 0xc1, 0x2e, 0x78, /* .A.U...x */ -0xdf, 0x9d, 0x01, 0x5d, 0x01, 0xff, 0x22, 0x00, /* ...]..". */ -0x54, 0xff, 0xef, 0x2e, 0xaf, 0xdc, 0x2f, 0x89, /* T...../. */ -0x50 /* P */ + 0x42, 0x4e, 0x00, + 0x45, 0x26, 0x07, 0x3d, 0x02, /* BN.E&.=. */ + 0x5b, 0xae, 0x87, 0xc2, 0x23, 0xd3, 0x3c, 0x02, /* [...#.<. */ + 0x44, 0xdc, 0x2f, 0x43, 0x5a, 0x02, 0x45, 0xdc, /* D./CZ.E. */ + 0x2f, 0xa4, 0x5b, 0x58, 0x23, 0x3c, 0x26, 0x02, /* /.[X#<&. */ + 0x55, 0x02, 0x2e, 0x0e, 0x85, 0x00, 0x50, 0x09, /* U.....P. */ + 0x8f, 0x07, 0x45, 0xeb, 0x5a, 0x41, 0x2e, 0x53, /* ..E.ZA.S */ + 0xdf, 0xc1, 0x2e, 0x79, 0xdf, 0xff, 0x96, 0xdf, /* ...y.... */ + 0x96, 0x41, 0x2e, 0x55, 0xdf, 0xc1, 0x2e, 0x78, /* .A.U...x */ + 0xdf, 0x9d, 0x01, 0x5d, 0x01, 0xff, 0x22, 0x00, /* ...]..". */ + 0x54, 0xff, 0xef, 0x2e, 0xaf, 0xdc, 0x2f, 0x89, /* T...../. */ + 0x50 /* P */ }; static const unsigned char pkt55[] = { -0x42, 0x86, 0x00, -0x6b, 0x26, 0xa5, 0xcf, 0xed, /* B..k&... */ -0x2e, 0x6a, 0xdf, 0xf3, 0x1c, 0x3f, 0x02, 0xa5, /* .j...?.. */ -0xaf, 0x4a, 0xcf, 0xdf, 0x96, 0x10, 0xcf, 0x5f, /* .J....._ */ -0xdf, 0xbf, 0x03, 0x02, 0x5f, 0x5f, 0xcf, 0x10, /* ....__.. */ -0xaf, 0x04, 0x50, 0x5e, 0xdf, 0xbf, 0x03, 0x01, /* ..P^.... */ -0x53, 0x5e, 0xcf, 0x10, 0xaf, 0x01, 0x2e, 0x40, /* S^.....@ */ -0x88, 0x01, 0x2e, 0xe1, 0x86, 0xdd, 0x97, 0x0a, /* ........ */ -0x40, 0x18, 0x5a, 0x62, 0xcf, 0xdf, 0x22, 0x22, /* @.Zb.."" */ -0x54, 0xed, 0x2e, 0x6a, 0xdf, 0x10, 0xef, 0x00, /* T..j.... */ -0x1f, 0x06, 0x54, 0x0c, 0xef, 0x04, 0x1f, 0x03, /* ..T..... */ -0x54, 0x0b, 0xef, 0x08, 0x1f, 0x00, 0x54, 0x05, /* T.....T. */ -0xef, 0x62, 0xdf, 0x76, 0x80, 0x12, 0x82, 0x12, /* .b.v.... */ -0x82, 0x80, 0x10, 0x01, 0x13, 0x4a, 0xcf, 0x3f, /* .....J.? */ -0x00, 0x00, 0x53, 0xff, 0xef, 0x4a, 0xdf, 0xed, /* ..S..J.. */ -0x2e, 0x6e, 0xbf, 0x4a, 0xaf, 0x6d, 0x2e, 0x6f, /* .n.J.m.o */ -0xbf, 0xdf, 0x96, 0xbf, 0x01, 0x6d, 0x2e, 0x6d, /* .....m.m */ -0xbf, 0xdd, 0x97, 0x01, 0x2e, 0xf9, 0x81, 0x05, /* ........ */ -0x27 /* ' */ + 0x42, 0x86, 0x00, + 0x6b, 0x26, 0xa5, 0xcf, 0xed, /* B..k&... */ + 0x2e, 0x6a, 0xdf, 0xf3, 0x1c, 0x3f, 0x02, 0xa5, /* .j...?.. */ + 0xaf, 0x4a, 0xcf, 0xdf, 0x96, 0x10, 0xcf, 0x5f, /* .J....._ */ + 0xdf, 0xbf, 0x03, 0x02, 0x5f, 0x5f, 0xcf, 0x10, /* ....__.. */ + 0xaf, 0x04, 0x50, 0x5e, 0xdf, 0xbf, 0x03, 0x01, /* ..P^.... */ + 0x53, 0x5e, 0xcf, 0x10, 0xaf, 0x01, 0x2e, 0x40, /* S^.....@ */ + 0x88, 0x01, 0x2e, 0xe1, 0x86, 0xdd, 0x97, 0x0a, /* ........ */ + 0x40, 0x18, 0x5a, 0x62, 0xcf, 0xdf, 0x22, 0x22, /* @.Zb.."" */ + 0x54, 0xed, 0x2e, 0x6a, 0xdf, 0x10, 0xef, 0x00, /* T..j.... */ + 0x1f, 0x06, 0x54, 0x0c, 0xef, 0x04, 0x1f, 0x03, /* ..T..... */ + 0x54, 0x0b, 0xef, 0x08, 0x1f, 0x00, 0x54, 0x05, /* T.....T. */ + 0xef, 0x62, 0xdf, 0x76, 0x80, 0x12, 0x82, 0x12, /* .b.v.... */ + 0x82, 0x80, 0x10, 0x01, 0x13, 0x4a, 0xcf, 0x3f, /* .....J.? */ + 0x00, 0x00, 0x53, 0xff, 0xef, 0x4a, 0xdf, 0xed, /* ..S..J.. */ + 0x2e, 0x6e, 0xbf, 0x4a, 0xaf, 0x6d, 0x2e, 0x6f, /* .n.J.m.o */ + 0xbf, 0xdf, 0x96, 0xbf, 0x01, 0x6d, 0x2e, 0x6d, /* .....m.m */ + 0xbf, 0xdd, 0x97, 0x01, 0x2e, 0xf9, 0x81, 0x05, /* ........ */ + 0x27 /* ' */ }; static const unsigned char pkt57[] = { -0x42, 0x16, 0x00, -0xad, 0x26, 0xd3, 0x45, 0x02, /* B...&.E. */ -0x5a, 0xd3, 0x45, 0x00, 0x5a, 0x05, 0x27, 0xd0, /* Z.E.Z.'. */ -0x41, 0xf8, 0x5b, 0xed, 0x83, 0xf6, 0x50, 0x05, /* A.[...P. */ -0x27 /* ' */ + 0x42, 0x16, 0x00, + 0xad, 0x26, 0xd3, 0x45, 0x02, /* B...&.E. */ + 0x5a, 0xd3, 0x45, 0x00, 0x5a, 0x05, 0x27, 0xd0, /* Z.E.Z.'. */ + 0x41, 0xf8, 0x5b, 0xed, 0x83, 0xf6, 0x50, 0x05, /* A.[...P. */ + 0x27 /* ' */ }; static const unsigned char pkt59[] = { -0x42, 0xca, 0x00, -0xb7, 0x26, 0xfd, 0x0c, 0x00, /* B...&... */ -0x2e, 0x3f, 0x8a, 0x39, 0x84, 0x05, 0xcf, 0xdf, /* .?.9.... */ -0x22, 0x00, 0x2e, 0xb4, 0x55, 0x04, 0xcf, 0x14, /* "...U... */ -0x1e, 0x00, 0x2e, 0xb0, 0x55, 0x00, 0x2e, 0xf5, /* ....U... */ -0x89, 0xbb, 0xef, 0x1f, 0x90, 0x91, 0xff, 0x7f, /* ........ */ -0x90, 0x14, 0xef, 0x00, 0x2e, 0x31, 0x8a, 0x14, /* .....1.. */ -0xef, 0x00, 0x2e, 0x39, 0x8a, 0x33, 0xef, 0x1f, /* ...9.3.. */ -0x90, 0x71, 0xff, 0x7f, 0x90, 0x18, 0xef, 0x00, /* .q...... */ -0x2e, 0x31, 0x8a, 0x00, 0x2e, 0xf5, 0x89, 0x40, /* .1.....@ */ -0xef, 0xfc, 0x9f, 0x5f, 0x20, 0xfc, 0x55, 0x01, /* ..._ .U. */ -0x2e, 0x67, 0x8d, 0x01, 0x2e, 0xfe, 0x8c, 0x00, /* .g...... */ -0x2e, 0xf5, 0x89, 0x02, 0x2e, 0x7a, 0x87, 0x0a, /* .....z.. */ -0xef, 0x00, 0x2e, 0x01, 0x8a, 0x02, 0x2e, 0x7a, /* .......z */ -0x87, 0x00, 0xff, 0x80, 0xef, 0x19, 0x27, 0x0a, /* ......'. */ -0xef, 0xdc, 0x9f, 0x7f, 0x9f, 0x5f, 0x20, 0xfb, /* ....._ . */ -0x55, 0x39, 0x84, 0x02, 0x2e, 0x7a, 0x87, 0x0a, /* U9...z.. */ -0xef, 0x00, 0x2e, 0x01, 0x8a, 0x02, 0x2e, 0x7a, /* .......z */ -0x87, 0x0a, 0xef, 0xdc, 0x9f, 0x7f, 0x9f, 0x5f, /* ......._ */ -0x20, 0xfb, 0x55, 0x02, 0x2e, 0x76, 0x87, 0x02, /* .U..v.. */ -0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ -0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ -0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ -0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ -0x2e, 0x44, 0x88, 0x9d, 0xef, 0x1f, 0x90, 0xda, /* .D...... */ -0xff, 0x7f, 0x90, 0x0f, 0xef, 0x00, 0x2e, 0x31, /* .......1 */ -0x8a, 0x80, 0xef, 0x1f, 0x9f /* ..... */ + 0x42, 0xca, 0x00, + 0xb7, 0x26, 0xfd, 0x0c, 0x00, /* B...&... */ + 0x2e, 0x3f, 0x8a, 0x39, 0x84, 0x05, 0xcf, 0xdf, /* .?.9.... */ + 0x22, 0x00, 0x2e, 0xb4, 0x55, 0x04, 0xcf, 0x14, /* "...U... */ + 0x1e, 0x00, 0x2e, 0xb0, 0x55, 0x00, 0x2e, 0xf5, /* ....U... */ + 0x89, 0xbb, 0xef, 0x1f, 0x90, 0x91, 0xff, 0x7f, /* ........ */ + 0x90, 0x14, 0xef, 0x00, 0x2e, 0x31, 0x8a, 0x14, /* .....1.. */ + 0xef, 0x00, 0x2e, 0x39, 0x8a, 0x33, 0xef, 0x1f, /* ...9.3.. */ + 0x90, 0x71, 0xff, 0x7f, 0x90, 0x18, 0xef, 0x00, /* .q...... */ + 0x2e, 0x31, 0x8a, 0x00, 0x2e, 0xf5, 0x89, 0x40, /* .1.....@ */ + 0xef, 0xfc, 0x9f, 0x5f, 0x20, 0xfc, 0x55, 0x01, /* ..._ .U. */ + 0x2e, 0x67, 0x8d, 0x01, 0x2e, 0xfe, 0x8c, 0x00, /* .g...... */ + 0x2e, 0xf5, 0x89, 0x02, 0x2e, 0x7a, 0x87, 0x0a, /* .....z.. */ + 0xef, 0x00, 0x2e, 0x01, 0x8a, 0x02, 0x2e, 0x7a, /* .......z */ + 0x87, 0x00, 0xff, 0x80, 0xef, 0x19, 0x27, 0x0a, /* ......'. */ + 0xef, 0xdc, 0x9f, 0x7f, 0x9f, 0x5f, 0x20, 0xfb, /* ....._ . */ + 0x55, 0x39, 0x84, 0x02, 0x2e, 0x7a, 0x87, 0x0a, /* U9...z.. */ + 0xef, 0x00, 0x2e, 0x01, 0x8a, 0x02, 0x2e, 0x7a, /* .......z */ + 0x87, 0x0a, 0xef, 0xdc, 0x9f, 0x7f, 0x9f, 0x5f, /* ......._ */ + 0x20, 0xfb, 0x55, 0x02, 0x2e, 0x76, 0x87, 0x02, /* .U..v.. */ + 0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ + 0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ + 0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ + 0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ + 0x2e, 0x44, 0x88, 0x9d, 0xef, 0x1f, 0x90, 0xda, /* .D...... */ + 0xff, 0x7f, 0x90, 0x0f, 0xef, 0x00, 0x2e, 0x31, /* .......1 */ + 0x8a, 0x80, 0xef, 0x1f, 0x9f /* ..... */ }; static const unsigned char pkt61[] = { -0x42, 0xca, 0x00, -0x1b, 0x27, 0x9f, 0x22, 0x1f, /* B...'.". */ -0x9f, 0x1f, 0x9f, 0x1f, 0x9f, 0x1f, 0x9f, 0x1f, /* ........ */ -0x9f, 0x1f, 0x9f, 0x03, 0xef, 0x1f, 0x9f, 0xb8, /* ........ */ -0xef, 0x1f, 0x9f, 0x00, 0x2e, 0xf5, 0x89, 0x40, /* .......@ */ -0xef, 0xfc, 0x9f, 0x5f, 0x20, 0xfc, 0x55, 0x01, /* ..._ .U. */ -0x2e, 0xfe, 0x8c, 0x00, 0x2e, 0xff, 0x89, 0x02, /* ........ */ -0x2e, 0xb3, 0x87, 0x02, 0x2e, 0x44, 0x88, 0x02, /* .....D.. */ -0x2e, 0x3f, 0x88, 0x02, 0x2e, 0x44, 0x88, 0x02, /* .?...D.. */ -0x2e, 0x3f, 0x88, 0x02, 0x2e, 0x44, 0x88, 0x02, /* .?...D.. */ -0x2e, 0x3f, 0x88, 0x02, 0x2e, 0x44, 0x88, 0x02, /* .?...D.. */ -0x2e, 0x3f, 0x88, 0x02, 0x2e, 0x44, 0x88, 0x02, /* .?...D.. */ -0x2e, 0xb3, 0x87, 0x14, 0xef, 0xfc, 0x9f, 0x5f, /* ......._ */ -0x20, 0xfc, 0x55, 0x01, 0xff, 0xab, 0xef, 0x19, /* .U..... */ -0x27, 0x02, 0x2e, 0xb3, 0x87, 0x11, 0xff, 0xbf, /* '....... */ -0x90, 0x51, 0xff, 0xc2, 0x97, 0xdf, 0x01, 0x7f, /* .Q...... */ -0x98, 0xfc, 0x9f, 0xbf, 0x98, 0x24, 0x28, 0xc2, /* .....$(. */ -0x9f, 0x7f, 0x20, 0xbf, 0x90, 0xf4, 0x55, 0x24, /* .. ...U$ */ -0x2a, 0x02, 0x2e, 0x7e, 0x87, 0x72, 0xef, 0xff, /* *..~.r.. */ -0xaf, 0x14, 0xef, 0xff, 0xaf, 0x00, 0xef, 0xff, /* ........ */ -0xaf, 0x00, 0xff, 0x80, 0xef, 0x19, 0x27, 0x14, /* ......'. */ -0xff, 0xfd, 0x97, 0xff, 0xaf, 0x7f, 0x20, 0xfb, /* ...... . */ -0x55, 0x00, 0x2e, 0xa9, 0x8a, 0x03, 0x0c, 0xd0, /* U....... */ -0xef, 0x07, 0xff, 0xa9, 0x80, 0x05, 0x27, 0x58, /* ......'X */ -0x85, 0x05, 0x27, 0x40, 0xef, 0x2d, 0xff, 0x1a, /* ..'@.-.. */ -0x27, 0x05, 0x27, 0x02, 0xef, 0x06, 0xff, 0x1a, /* '.'..... */ -0x27, 0x05, 0x27, 0x01, 0xff /* '.'.. */ + 0x42, 0xca, 0x00, + 0x1b, 0x27, 0x9f, 0x22, 0x1f, /* B...'.". */ + 0x9f, 0x1f, 0x9f, 0x1f, 0x9f, 0x1f, 0x9f, 0x1f, /* ........ */ + 0x9f, 0x1f, 0x9f, 0x03, 0xef, 0x1f, 0x9f, 0xb8, /* ........ */ + 0xef, 0x1f, 0x9f, 0x00, 0x2e, 0xf5, 0x89, 0x40, /* .......@ */ + 0xef, 0xfc, 0x9f, 0x5f, 0x20, 0xfc, 0x55, 0x01, /* ..._ .U. */ + 0x2e, 0xfe, 0x8c, 0x00, 0x2e, 0xff, 0x89, 0x02, /* ........ */ + 0x2e, 0xb3, 0x87, 0x02, 0x2e, 0x44, 0x88, 0x02, /* .....D.. */ + 0x2e, 0x3f, 0x88, 0x02, 0x2e, 0x44, 0x88, 0x02, /* .?...D.. */ + 0x2e, 0x3f, 0x88, 0x02, 0x2e, 0x44, 0x88, 0x02, /* .?...D.. */ + 0x2e, 0x3f, 0x88, 0x02, 0x2e, 0x44, 0x88, 0x02, /* .?...D.. */ + 0x2e, 0x3f, 0x88, 0x02, 0x2e, 0x44, 0x88, 0x02, /* .?...D.. */ + 0x2e, 0xb3, 0x87, 0x14, 0xef, 0xfc, 0x9f, 0x5f, /* ......._ */ + 0x20, 0xfc, 0x55, 0x01, 0xff, 0xab, 0xef, 0x19, /* .U..... */ + 0x27, 0x02, 0x2e, 0xb3, 0x87, 0x11, 0xff, 0xbf, /* '....... */ + 0x90, 0x51, 0xff, 0xc2, 0x97, 0xdf, 0x01, 0x7f, /* .Q...... */ + 0x98, 0xfc, 0x9f, 0xbf, 0x98, 0x24, 0x28, 0xc2, /* .....$(. */ + 0x9f, 0x7f, 0x20, 0xbf, 0x90, 0xf4, 0x55, 0x24, /* .. ...U$ */ + 0x2a, 0x02, 0x2e, 0x7e, 0x87, 0x72, 0xef, 0xff, /* *..~.r.. */ + 0xaf, 0x14, 0xef, 0xff, 0xaf, 0x00, 0xef, 0xff, /* ........ */ + 0xaf, 0x00, 0xff, 0x80, 0xef, 0x19, 0x27, 0x14, /* ......'. */ + 0xff, 0xfd, 0x97, 0xff, 0xaf, 0x7f, 0x20, 0xfb, /* ...... . */ + 0x55, 0x00, 0x2e, 0xa9, 0x8a, 0x03, 0x0c, 0xd0, /* U....... */ + 0xef, 0x07, 0xff, 0xa9, 0x80, 0x05, 0x27, 0x58, /* ......'X */ + 0x85, 0x05, 0x27, 0x40, 0xef, 0x2d, 0xff, 0x1a, /* ..'@.-.. */ + 0x27, 0x05, 0x27, 0x02, 0xef, 0x06, 0xff, 0x1a, /* '.'..... */ + 0x27, 0x05, 0x27, 0x01, 0xff /* '.'.. */ }; static const unsigned char pkt63[] = { -0x42, 0x72, 0x00, -0x7f, 0x27, 0xab, 0xef, 0x19, /* Br..'... */ -0x27, 0x08, 0xef, 0x1f, 0x98, 0xe4, 0x29, 0x00, /* '.....). */ -0xff, 0xff, 0x96, 0x20, 0xff, 0xff, 0x96, 0x00, /* ... .... */ -0xff, 0xff, 0x96, 0x40, 0xff, 0xff, 0x96, 0x00, /* ...@.... */ -0xff, 0xff, 0x96, 0x60, 0xff, 0xff, 0x96, 0x00, /* ...`.... */ -0xff, 0xff, 0x96, 0x00, 0xff, 0xff, 0x96, 0x01, /* ........ */ -0xff, 0xff, 0x96, 0x20, 0xff, 0xff, 0x96, 0x00, /* ... .... */ -0xff, 0xff, 0x96, 0x02, 0xff, 0xff, 0x96, 0x02, /* ........ */ -0xff, 0xff, 0x96, 0x82, 0xff, 0xff, 0x96, 0x02, /* ........ */ -0xff, 0xff, 0x96, 0x02, 0x2e, 0xaa, 0x87, 0x46, /* .......F */ -0x2e, 0x01, 0xdf, 0x9f, 0x28, 0x46, 0x2e, 0x01, /* ....(F.. */ -0xbf, 0x05, 0x27, 0x0f, 0xef, 0x5f, 0x98, 0xdd, /* ..'.._.. */ -0x9f, 0xbf, 0x98, 0x24, 0x28, 0x5f, 0x20, 0xf9, /* ...$(_ . */ -0x55, 0x24, 0x2a, 0x05, 0x27, 0x7f, 0xef, 0x2d, /* U$*.'..- */ -0xff, 0x1b, 0x27, 0x05, 0x27 /* ..'.' */ + 0x42, 0x72, 0x00, + 0x7f, 0x27, 0xab, 0xef, 0x19, /* Br..'... */ + 0x27, 0x08, 0xef, 0x1f, 0x98, 0xe4, 0x29, 0x00, /* '.....). */ + 0xff, 0xff, 0x96, 0x20, 0xff, 0xff, 0x96, 0x00, /* ... .... */ + 0xff, 0xff, 0x96, 0x40, 0xff, 0xff, 0x96, 0x00, /* ...@.... */ + 0xff, 0xff, 0x96, 0x60, 0xff, 0xff, 0x96, 0x00, /* ...`.... */ + 0xff, 0xff, 0x96, 0x00, 0xff, 0xff, 0x96, 0x01, /* ........ */ + 0xff, 0xff, 0x96, 0x20, 0xff, 0xff, 0x96, 0x00, /* ... .... */ + 0xff, 0xff, 0x96, 0x02, 0xff, 0xff, 0x96, 0x02, /* ........ */ + 0xff, 0xff, 0x96, 0x82, 0xff, 0xff, 0x96, 0x02, /* ........ */ + 0xff, 0xff, 0x96, 0x02, 0x2e, 0xaa, 0x87, 0x46, /* .......F */ + 0x2e, 0x01, 0xdf, 0x9f, 0x28, 0x46, 0x2e, 0x01, /* ....(F.. */ + 0xbf, 0x05, 0x27, 0x0f, 0xef, 0x5f, 0x98, 0xdd, /* ..'.._.. */ + 0x9f, 0xbf, 0x98, 0x24, 0x28, 0x5f, 0x20, 0xf9, /* ...$(_ . */ + 0x55, 0x24, 0x2a, 0x05, 0x27, 0x7f, 0xef, 0x2d, /* U$*.'..- */ + 0xff, 0x1b, 0x27, 0x05, 0x27 /* ..'.' */ }; static const unsigned char pkt65[] = { -0x42, 0xca, 0x00, -0xb7, 0x27, 0x00, 0x2e, 0x3f, /* B...'..? */ -0x8a, 0x23, 0x81, 0x02, 0x2e, 0x4d, 0x88, 0x05, /* .#...M.. */ -0xcf, 0xdf, 0x22, 0x35, 0x55, 0x04, 0xcf, 0x2a, /* .."5U..* */ -0x1e, 0x32, 0x55, 0xfe, 0xdf, 0xfe, 0xcf, 0x00, /* .2U..... */ -0x1f, 0x1d, 0x55, 0x00, 0x1e, 0x0e, 0x54, 0xc6, /* ..U...T. */ -0x2e, 0x00, 0xdf, 0x3f, 0x20, 0xbf, 0x03, 0x16, /* ...? ... */ -0x55, 0xc6, 0x2e, 0x01, 0xdf, 0x3f, 0x2c, 0x12, /* U....?,. */ -0x5b, 0x46, 0x2e, 0x00, 0xbf, 0x00, 0x2e, 0x25, /* [F.....% */ -0x8a, 0x02, 0x2e, 0xe1, 0x77, 0x00, 0xef, 0x46, /* ....w..F */ -0x2e, 0x00, 0xbf, 0x46, 0x2e, 0x01, 0xdf, 0x1f, /* ...F.... */ -0x28, 0x46, 0x2e, 0x01, 0xbf, 0x00, 0x2e, 0x06, /* (F...... */ -0x8a, 0x02, 0x2e, 0xf7, 0x87, 0x05, 0x27, 0x46, /* ......'F */ -0x2e, 0x01, 0xdf, 0x1f, 0x2a, 0x46, 0x2e, 0x01, /* ....*F.. */ -0xbf, 0x41, 0x2e, 0xb6, 0xdf, 0x01, 0xff, 0xab, /* .A...... */ -0xef, 0x19, 0x27, 0x42, 0xff, 0x7f, 0x98, 0x9f, /* ..'B.... */ -0x98, 0x24, 0x28, 0x56, 0x85, 0x24, 0x2a, 0x05, /* .$(V.$*. */ -0x27, 0x58, 0x85, 0x05, 0x27, 0xfd, 0x0c, 0x00, /* 'X..'... */ -0x2e, 0xf5, 0x89, 0x14, 0xef, 0x00, 0x2e, 0x39, /* .......9 */ -0x8a, 0x02, 0x2e, 0x3b, 0x88, 0x02, 0x2e, 0x44, /* ...;...D */ -0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, 0x2e, 0x44, /* ...?...D */ -0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, 0x2e, 0x44, /* ...?...D */ -0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, 0x2e, 0x44, /* ...?...D */ -0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, 0x2e, 0x44, /* ...?...D */ -0x88, 0x46, 0x2e, 0x00, 0xdf, 0x1f, 0x9f, 0xe2, /* .F...... */ -0xef, 0x1f, 0x90, 0xe0, 0xff, 0x7f, 0x90, 0x0e, /* ........ */ -0xef, 0x00, 0x2e, 0x31, 0x8a /* ...1. */ + 0x42, 0xca, 0x00, + 0xb7, 0x27, 0x00, 0x2e, 0x3f, /* B...'..? */ + 0x8a, 0x23, 0x81, 0x02, 0x2e, 0x4d, 0x88, 0x05, /* .#...M.. */ + 0xcf, 0xdf, 0x22, 0x35, 0x55, 0x04, 0xcf, 0x2a, /* .."5U..* */ + 0x1e, 0x32, 0x55, 0xfe, 0xdf, 0xfe, 0xcf, 0x00, /* .2U..... */ + 0x1f, 0x1d, 0x55, 0x00, 0x1e, 0x0e, 0x54, 0xc6, /* ..U...T. */ + 0x2e, 0x00, 0xdf, 0x3f, 0x20, 0xbf, 0x03, 0x16, /* ...? ... */ + 0x55, 0xc6, 0x2e, 0x01, 0xdf, 0x3f, 0x2c, 0x12, /* U....?,. */ + 0x5b, 0x46, 0x2e, 0x00, 0xbf, 0x00, 0x2e, 0x25, /* [F.....% */ + 0x8a, 0x02, 0x2e, 0xe1, 0x77, 0x00, 0xef, 0x46, /* ....w..F */ + 0x2e, 0x00, 0xbf, 0x46, 0x2e, 0x01, 0xdf, 0x1f, /* ...F.... */ + 0x28, 0x46, 0x2e, 0x01, 0xbf, 0x00, 0x2e, 0x06, /* (F...... */ + 0x8a, 0x02, 0x2e, 0xf7, 0x87, 0x05, 0x27, 0x46, /* ......'F */ + 0x2e, 0x01, 0xdf, 0x1f, 0x2a, 0x46, 0x2e, 0x01, /* ....*F.. */ + 0xbf, 0x41, 0x2e, 0xb6, 0xdf, 0x01, 0xff, 0xab, /* .A...... */ + 0xef, 0x19, 0x27, 0x42, 0xff, 0x7f, 0x98, 0x9f, /* ..'B.... */ + 0x98, 0x24, 0x28, 0x56, 0x85, 0x24, 0x2a, 0x05, /* .$(V.$*. */ + 0x27, 0x58, 0x85, 0x05, 0x27, 0xfd, 0x0c, 0x00, /* 'X..'... */ + 0x2e, 0xf5, 0x89, 0x14, 0xef, 0x00, 0x2e, 0x39, /* .......9 */ + 0x8a, 0x02, 0x2e, 0x3b, 0x88, 0x02, 0x2e, 0x44, /* ...;...D */ + 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, 0x2e, 0x44, /* ...?...D */ + 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, 0x2e, 0x44, /* ...?...D */ + 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, 0x2e, 0x44, /* ...?...D */ + 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, 0x2e, 0x44, /* ...?...D */ + 0x88, 0x46, 0x2e, 0x00, 0xdf, 0x1f, 0x9f, 0xe2, /* .F...... */ + 0xef, 0x1f, 0x90, 0xe0, 0xff, 0x7f, 0x90, 0x0e, /* ........ */ + 0xef, 0x00, 0x2e, 0x31, 0x8a /* ...1. */ }; static const unsigned char pkt67[] = { -0x42, 0xca, 0x00, -0x1b, 0x28, 0x80, 0xef, 0x1f, /* B...(... */ -0x9f, 0x9f, 0x22, 0x1f, 0x9f, 0x1f, 0x9f, 0x1f, /* .."..... */ -0x9f, 0x1f, 0x9f, 0x1f, 0x9f, 0x1f, 0x9f, 0x01, /* ........ */ -0xef, 0x1f, 0x9f, 0xb8, 0xef, 0x1f, 0x9f, 0x00, /* ........ */ -0x2e, 0xf5, 0x89, 0x40, 0xef, 0xfc, 0x9f, 0x5f, /* ...@..._ */ -0x20, 0xfc, 0x55, 0x03, 0x0c, 0x01, 0x2e, 0x67, /* .U....g */ -0x8d, 0x01, 0x2e, 0xfe, 0x8c, 0x00, 0x2e, 0xff, /* ........ */ -0x89, 0x00, 0x2e, 0xfb, 0x89, 0x14, 0xef, 0x00, /* ........ */ -0x2e, 0x01, 0x8a, 0x05, 0x27, 0x40, 0xef, 0x2d, /* ....'@.- */ -0xff, 0x1a, 0x27, 0x05, 0x27, 0x16, 0x27, 0x04, /* ..'.'.'. */ -0x10, 0x00, 0x13, 0x1a, 0x27, 0x05, 0x27, 0xd9, /* ....'.'. */ -0x9f, 0x3f, 0x9f, 0xd8, 0x9f, 0x3f, 0x9f, 0xd7, /* .?...?.. */ -0x9f, 0x3f, 0x9f, 0xd6, 0x9f, 0x3f, 0x9f, 0x05, /* .?...?.. */ -0x27, 0x7f, 0xef, 0x2d, 0xff, 0x46, 0x2e, 0x1d, /* '..-.F.. */ -0xbf, 0xc6, 0x2e, 0x1c, 0xbf, 0x93, 0xef, 0x2d, /* .......- */ -0xff, 0x46, 0x2e, 0x1f, 0xbf, 0xc6, 0x2e, 0x1e, /* .F...... */ -0xbf, 0x05, 0x27, 0x00, 0x2e, 0x3f, 0x8a, 0x23, /* ..'..?.# */ -0x81, 0x02, 0x2e, 0x4d, 0x88, 0x02, 0x2e, 0x60, /* ...M...` */ -0x89, 0x08, 0xef, 0xfe, 0xdf, 0x3f, 0x9f, 0x5f, /* .....?._ */ -0x20, 0xfb, 0x55, 0x28, 0xef, 0xfe, 0xdf, 0x5f, /* .U(..._ */ -0x20, 0xfc, 0x55, 0x00, 0x2e, 0xf5, 0x89, 0xfe, /* .U..... */ -0xdf, 0x00, 0x2e, 0xf5, 0x89, 0x14, 0xff, 0xfe, /* ........ */ -0xcf, 0x1f, 0x9f, 0x7f, 0x20, 0xfb, 0x55, 0x23, /* .... .U# */ -0xff, 0xfe, 0xcf, 0x7f, 0x20, 0xfc, 0x55, 0x02, /* .... .U. */ -0x2e, 0x64, 0x89, 0x00, 0x2e, 0xf5, 0x89, 0x14, /* .d...... */ -0xff, 0xfc, 0x97, 0x1f, 0x97 /* ..... */ + 0x42, 0xca, 0x00, + 0x1b, 0x28, 0x80, 0xef, 0x1f, /* B...(... */ + 0x9f, 0x9f, 0x22, 0x1f, 0x9f, 0x1f, 0x9f, 0x1f, /* .."..... */ + 0x9f, 0x1f, 0x9f, 0x1f, 0x9f, 0x1f, 0x9f, 0x01, /* ........ */ + 0xef, 0x1f, 0x9f, 0xb8, 0xef, 0x1f, 0x9f, 0x00, /* ........ */ + 0x2e, 0xf5, 0x89, 0x40, 0xef, 0xfc, 0x9f, 0x5f, /* ...@..._ */ + 0x20, 0xfc, 0x55, 0x03, 0x0c, 0x01, 0x2e, 0x67, /* .U....g */ + 0x8d, 0x01, 0x2e, 0xfe, 0x8c, 0x00, 0x2e, 0xff, /* ........ */ + 0x89, 0x00, 0x2e, 0xfb, 0x89, 0x14, 0xef, 0x00, /* ........ */ + 0x2e, 0x01, 0x8a, 0x05, 0x27, 0x40, 0xef, 0x2d, /* ....'@.- */ + 0xff, 0x1a, 0x27, 0x05, 0x27, 0x16, 0x27, 0x04, /* ..'.'.'. */ + 0x10, 0x00, 0x13, 0x1a, 0x27, 0x05, 0x27, 0xd9, /* ....'.'. */ + 0x9f, 0x3f, 0x9f, 0xd8, 0x9f, 0x3f, 0x9f, 0xd7, /* .?...?.. */ + 0x9f, 0x3f, 0x9f, 0xd6, 0x9f, 0x3f, 0x9f, 0x05, /* .?...?.. */ + 0x27, 0x7f, 0xef, 0x2d, 0xff, 0x46, 0x2e, 0x1d, /* '..-.F.. */ + 0xbf, 0xc6, 0x2e, 0x1c, 0xbf, 0x93, 0xef, 0x2d, /* .......- */ + 0xff, 0x46, 0x2e, 0x1f, 0xbf, 0xc6, 0x2e, 0x1e, /* .F...... */ + 0xbf, 0x05, 0x27, 0x00, 0x2e, 0x3f, 0x8a, 0x23, /* ..'..?.# */ + 0x81, 0x02, 0x2e, 0x4d, 0x88, 0x02, 0x2e, 0x60, /* ...M...` */ + 0x89, 0x08, 0xef, 0xfe, 0xdf, 0x3f, 0x9f, 0x5f, /* .....?._ */ + 0x20, 0xfb, 0x55, 0x28, 0xef, 0xfe, 0xdf, 0x5f, /* .U(..._ */ + 0x20, 0xfc, 0x55, 0x00, 0x2e, 0xf5, 0x89, 0xfe, /* .U..... */ + 0xdf, 0x00, 0x2e, 0xf5, 0x89, 0x14, 0xff, 0xfe, /* ........ */ + 0xcf, 0x1f, 0x9f, 0x7f, 0x20, 0xfb, 0x55, 0x23, /* .... .U# */ + 0xff, 0xfe, 0xcf, 0x7f, 0x20, 0xfc, 0x55, 0x02, /* .... .U. */ + 0x2e, 0x64, 0x89, 0x00, 0x2e, 0xf5, 0x89, 0x14, /* .d...... */ + 0xff, 0xfc, 0x97, 0x1f, 0x97 /* ..... */ }; static const unsigned char pkt69[] = { -0x42, 0xca, 0x00, -0x7f, 0x28, 0x7f, 0x20, 0xfb, /* B...(. . */ -0x55, 0x2c, 0xef, 0xbf, 0x22, 0x3f, 0x9f, 0x5f, /* U,.."?._ */ -0x20, 0xfc, 0x55, 0x00, 0x2e, 0xf5, 0x89, 0x40, /* .U....@ */ -0xef, 0xf6, 0x9f, 0x36, 0x1b, 0x3f, 0x9f, 0x5f, /* ...6.?._ */ -0x20, 0xfa, 0x55, 0x01, 0x2e, 0x67, 0x8d, 0x01, /* .U..g.. */ -0x2e, 0xfe, 0x8c, 0x00, 0x2e, 0xf5, 0x89, 0x02, /* ........ */ -0x2e, 0x5c, 0x89, 0xdc, 0x9f, 0x3f, 0x9f, 0xdc, /* .\...?.. */ -0x9f, 0x3f, 0x9f, 0xdc, 0x9f, 0x3f, 0x9f, 0xdc, /* .?...?.. */ -0x9f, 0x3f, 0x9f, 0xdc, 0x9f, 0x3f, 0x9f, 0xdc, /* .?...?.. */ -0x9f, 0x3f, 0x9f, 0xdc, 0x9f, 0x3f, 0x9f, 0xdc, /* .?...?.. */ -0x9f, 0x3f, 0x9f, 0x80, 0xff, 0x3f, 0x9f, 0x2f, /* .?...?./ */ -0xef, 0xbf, 0x22, 0x3f, 0x9f, 0x5f, 0x20, 0xfc, /* .."?._ . */ -0x55, 0x3f, 0x9f, 0x3f, 0x9f, 0x3f, 0x9f, 0x3f, /* U?.?.?.? */ -0x9f, 0x3f, 0x9f, 0x3f, 0x9f, 0x02, 0xff, 0x3f, /* .?.?...? */ -0x9f, 0x40, 0xff, 0x3f, 0x9f, 0x00, 0x2e, 0xf5, /* .@.?.... */ -0x89, 0x40, 0xef, 0xfc, 0x9f, 0x5f, 0x20, 0xfc, /* .@..._ . */ -0x55, 0x01, 0x2e, 0xfe, 0x8c, 0x00, 0x2e, 0xff, /* U....... */ -0x89, 0x00, 0x2e, 0xf5, 0x89, 0x14, 0xef, 0x00, /* ........ */ -0x2e, 0x01, 0x8a, 0x46, 0x2e, 0x18, 0xdf, 0xc6, /* ...F.... */ -0x2e, 0x17, 0xdf, 0x1a, 0x27, 0x02, 0x2e, 0x68, /* ....'..h */ -0x89, 0x14, 0xef, 0xfc, 0x9f, 0x5c, 0x1b, 0x3f, /* .....\.? */ -0x97, 0x5f, 0x20, 0xfa, 0x55, 0x2c, 0xef, 0x5c, /* ._ .U,.\ */ -0xff, 0x3f, 0x97, 0x5f, 0x20, 0xfc, 0x55, 0x00, /* .?._ .U. */ -0x2e, 0xff, 0x89, 0x02, 0x2e, 0x68, 0x89, 0x02, /* .....h.. */ -0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ -0x2e, 0x44, 0x88, 0x02, 0x2e /* .D... */ + 0x42, 0xca, 0x00, + 0x7f, 0x28, 0x7f, 0x20, 0xfb, /* B...(. . */ + 0x55, 0x2c, 0xef, 0xbf, 0x22, 0x3f, 0x9f, 0x5f, /* U,.."?._ */ + 0x20, 0xfc, 0x55, 0x00, 0x2e, 0xf5, 0x89, 0x40, /* .U....@ */ + 0xef, 0xf6, 0x9f, 0x36, 0x1b, 0x3f, 0x9f, 0x5f, /* ...6.?._ */ + 0x20, 0xfa, 0x55, 0x01, 0x2e, 0x67, 0x8d, 0x01, /* .U..g.. */ + 0x2e, 0xfe, 0x8c, 0x00, 0x2e, 0xf5, 0x89, 0x02, /* ........ */ + 0x2e, 0x5c, 0x89, 0xdc, 0x9f, 0x3f, 0x9f, 0xdc, /* .\...?.. */ + 0x9f, 0x3f, 0x9f, 0xdc, 0x9f, 0x3f, 0x9f, 0xdc, /* .?...?.. */ + 0x9f, 0x3f, 0x9f, 0xdc, 0x9f, 0x3f, 0x9f, 0xdc, /* .?...?.. */ + 0x9f, 0x3f, 0x9f, 0xdc, 0x9f, 0x3f, 0x9f, 0xdc, /* .?...?.. */ + 0x9f, 0x3f, 0x9f, 0x80, 0xff, 0x3f, 0x9f, 0x2f, /* .?...?./ */ + 0xef, 0xbf, 0x22, 0x3f, 0x9f, 0x5f, 0x20, 0xfc, /* .."?._ . */ + 0x55, 0x3f, 0x9f, 0x3f, 0x9f, 0x3f, 0x9f, 0x3f, /* U?.?.?.? */ + 0x9f, 0x3f, 0x9f, 0x3f, 0x9f, 0x02, 0xff, 0x3f, /* .?.?...? */ + 0x9f, 0x40, 0xff, 0x3f, 0x9f, 0x00, 0x2e, 0xf5, /* .@.?.... */ + 0x89, 0x40, 0xef, 0xfc, 0x9f, 0x5f, 0x20, 0xfc, /* .@..._ . */ + 0x55, 0x01, 0x2e, 0xfe, 0x8c, 0x00, 0x2e, 0xff, /* U....... */ + 0x89, 0x00, 0x2e, 0xf5, 0x89, 0x14, 0xef, 0x00, /* ........ */ + 0x2e, 0x01, 0x8a, 0x46, 0x2e, 0x18, 0xdf, 0xc6, /* ...F.... */ + 0x2e, 0x17, 0xdf, 0x1a, 0x27, 0x02, 0x2e, 0x68, /* ....'..h */ + 0x89, 0x14, 0xef, 0xfc, 0x9f, 0x5c, 0x1b, 0x3f, /* .....\.? */ + 0x97, 0x5f, 0x20, 0xfa, 0x55, 0x2c, 0xef, 0x5c, /* ._ .U,.\ */ + 0xff, 0x3f, 0x97, 0x5f, 0x20, 0xfc, 0x55, 0x00, /* .?._ .U. */ + 0x2e, 0xff, 0x89, 0x02, 0x2e, 0x68, 0x89, 0x02, /* .....h.. */ + 0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ + 0x2e, 0x44, 0x88, 0x02, 0x2e /* .D... */ }; static const unsigned char pkt71[] = { -0x42, 0xca, 0x00, -0xe3, 0x28, 0x3f, 0x88, 0x02, /* B...(?.. */ -0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ -0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ -0x2e, 0x44, 0x88, 0x00, 0x2e, 0xf5, 0x89, 0x40, /* .D.....@ */ -0xef, 0xfc, 0x9f, 0x5f, 0x20, 0xfc, 0x55, 0x01, /* ..._ .U. */ -0x2e, 0x67, 0x8d, 0x01, 0x2e, 0xfe, 0x8c, 0x46, /* .g.....F */ -0x2e, 0x18, 0xdf, 0xc6, 0x2e, 0x17, 0xdf, 0x1a, /* ........ */ -0x27, 0x02, 0x2e, 0x68, 0x89, 0x14, 0xef, 0xfc, /* '..h.... */ -0x9f, 0x3f, 0x97, 0x5f, 0x20, 0xfb, 0x55, 0x80, /* .?._ .U. */ -0xff, 0x3f, 0x97, 0x23, 0xef, 0xbf, 0x22, 0x3f, /* .?.#.."? */ -0x97, 0x5f, 0x20, 0xfc, 0x55, 0x3f, 0x97, 0x3f, /* ._ .U?.? */ -0x97, 0x3f, 0x97, 0x3f, 0x97, 0x3f, 0x97, 0x3f, /* .?.?.?.? */ -0x97, 0x02, 0xff, 0x3f, 0x97, 0xa0, 0xff, 0x3f, /* ...?...? */ -0x97, 0x00, 0x2e, 0xf5, 0x89, 0x40, 0xef, 0xfc, /* .....@.. */ -0x9f, 0x5f, 0x20, 0xfc, 0x55, 0x01, 0x2e, 0xfe, /* ._ .U... */ -0x8c, 0x00, 0x2e, 0xff, 0x89, 0x00, 0x2e, 0xf5, /* ........ */ -0x89, 0x14, 0xef, 0x00, 0x2e, 0x01, 0x8a, 0x00, /* ........ */ -0x2e, 0xff, 0x89, 0x02, 0x2e, 0x68, 0x89, 0x02, /* .....h.. */ -0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ -0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ -0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ -0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ -0x2e, 0x44, 0x88, 0x17, 0x27, 0x5f, 0x20, 0x1b, /* .D..'_ . */ -0x27, 0xf6, 0x97, 0x0f, 0x1c, 0x54, 0x10, 0x2d, /* '....T.- */ -0xff, 0x1b, 0x27, 0x73, 0xef, 0xff, 0xaf, 0x84, /* ..'s.... */ -0xef, 0xff, 0xaf, 0x00, 0xef /* ..... */ + 0x42, 0xca, 0x00, + 0xe3, 0x28, 0x3f, 0x88, 0x02, /* B...(?.. */ + 0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ + 0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ + 0x2e, 0x44, 0x88, 0x00, 0x2e, 0xf5, 0x89, 0x40, /* .D.....@ */ + 0xef, 0xfc, 0x9f, 0x5f, 0x20, 0xfc, 0x55, 0x01, /* ..._ .U. */ + 0x2e, 0x67, 0x8d, 0x01, 0x2e, 0xfe, 0x8c, 0x46, /* .g.....F */ + 0x2e, 0x18, 0xdf, 0xc6, 0x2e, 0x17, 0xdf, 0x1a, /* ........ */ + 0x27, 0x02, 0x2e, 0x68, 0x89, 0x14, 0xef, 0xfc, /* '..h.... */ + 0x9f, 0x3f, 0x97, 0x5f, 0x20, 0xfb, 0x55, 0x80, /* .?._ .U. */ + 0xff, 0x3f, 0x97, 0x23, 0xef, 0xbf, 0x22, 0x3f, /* .?.#.."? */ + 0x97, 0x5f, 0x20, 0xfc, 0x55, 0x3f, 0x97, 0x3f, /* ._ .U?.? */ + 0x97, 0x3f, 0x97, 0x3f, 0x97, 0x3f, 0x97, 0x3f, /* .?.?.?.? */ + 0x97, 0x02, 0xff, 0x3f, 0x97, 0xa0, 0xff, 0x3f, /* ...?...? */ + 0x97, 0x00, 0x2e, 0xf5, 0x89, 0x40, 0xef, 0xfc, /* .....@.. */ + 0x9f, 0x5f, 0x20, 0xfc, 0x55, 0x01, 0x2e, 0xfe, /* ._ .U... */ + 0x8c, 0x00, 0x2e, 0xff, 0x89, 0x00, 0x2e, 0xf5, /* ........ */ + 0x89, 0x14, 0xef, 0x00, 0x2e, 0x01, 0x8a, 0x00, /* ........ */ + 0x2e, 0xff, 0x89, 0x02, 0x2e, 0x68, 0x89, 0x02, /* .....h.. */ + 0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ + 0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ + 0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ + 0x2e, 0x44, 0x88, 0x02, 0x2e, 0x3f, 0x88, 0x02, /* .D...?.. */ + 0x2e, 0x44, 0x88, 0x17, 0x27, 0x5f, 0x20, 0x1b, /* .D..'_ . */ + 0x27, 0xf6, 0x97, 0x0f, 0x1c, 0x54, 0x10, 0x2d, /* '....T.- */ + 0xff, 0x1b, 0x27, 0x73, 0xef, 0xff, 0xaf, 0x84, /* ..'s.... */ + 0xef, 0xff, 0xaf, 0x00, 0xef /* ..... */ }; static const unsigned char pkt73[] = { -0x42, 0x4c, 0x00, -0x47, 0x29, 0xff, 0xaf, 0xfc, /* BL.G)... */ -0x97, 0xff, 0xaf, 0xfc, 0x97, 0xff, 0xaf, 0xfc, /* ........ */ -0x97, 0xff, 0xaf, 0xfc, 0x97, 0xff, 0xaf, 0x80, /* ........ */ -0xef, 0xfe, 0xdf, 0xff, 0xbf, 0x5f, 0x20, 0xfb, /* ....._ . */ -0x55, 0x10, 0xef, 0xfe, 0xdf, 0x5f, 0x20, 0xfc, /* U...._ . */ -0x55, 0x00, 0x2e, 0xa9, 0x8a, 0x05, 0x27, 0x69, /* U.....'i */ -0xef, 0x2d, 0xff, 0x1a, 0x27, 0x05, 0x27, 0x69, /* .-..'.'i */ -0xef, 0x2d, 0xff, 0x1b, 0x27, 0x05, 0x27, 0x54, /* .-..'.'T */ -0xef, 0x2d, 0xff, 0x1a, 0x27, 0x05, 0x27, 0x54, /* .-..'.'T */ -0xef, 0x2d, 0xff, 0x1b, 0x27, 0x05, 0x27 /* .-..'.' */ + 0x42, 0x4c, 0x00, + 0x47, 0x29, 0xff, 0xaf, 0xfc, /* BL.G)... */ + 0x97, 0xff, 0xaf, 0xfc, 0x97, 0xff, 0xaf, 0xfc, /* ........ */ + 0x97, 0xff, 0xaf, 0xfc, 0x97, 0xff, 0xaf, 0x80, /* ........ */ + 0xef, 0xfe, 0xdf, 0xff, 0xbf, 0x5f, 0x20, 0xfb, /* ....._ . */ + 0x55, 0x10, 0xef, 0xfe, 0xdf, 0x5f, 0x20, 0xfc, /* U...._ . */ + 0x55, 0x00, 0x2e, 0xa9, 0x8a, 0x05, 0x27, 0x69, /* U.....'i */ + 0xef, 0x2d, 0xff, 0x1a, 0x27, 0x05, 0x27, 0x69, /* .-..'.'i */ + 0xef, 0x2d, 0xff, 0x1b, 0x27, 0x05, 0x27, 0x54, /* .-..'.'T */ + 0xef, 0x2d, 0xff, 0x1a, 0x27, 0x05, 0x27, 0x54, /* .-..'.'T */ + 0xef, 0x2d, 0xff, 0x1b, 0x27, 0x05, 0x27 /* .-..'.' */ }; static const unsigned char pkt75[] = { -0x67, 0x05, 0x00, 0x00, 0x02, 0x2e, 0x00, 0x70, /* g......p */ -0x67, 0x05, 0x00, 0x02, 0x02, 0x2e, 0x87, 0x70, /* g......p */ -0x67, 0x05, 0x00, 0x01, 0x02, 0x2e, 0x6f, 0x72, /* g.....or */ -0x67, 0x05, 0x00, 0x03, 0x02, 0x2e, 0x7a, 0x73, /* g.....zs */ -0x67, 0x05, 0x00, 0x08, 0x02, 0x2e, 0x9a, 0x74, /* g......t */ -0x67, 0x05, 0x00, 0x07, 0x02, 0x2e, 0x06, 0x75, /* g......u */ -0x5a, 0x05, 0x00, 0x00, 0x55, 0x01, 0x27, 0x26, /* Z...U.'& */ -0x5a, 0x05, 0x00, 0x01, 0xc4, 0x0a, 0x33, 0x26, /* Z.....3& */ -0x5a, 0x05, 0x00, 0x02, 0xd9, 0x02, 0x45, 0x26, /* Z.....E& */ -0x5a, 0x05, 0x00, 0x03, 0x94, 0x16, 0x6b, 0x26, /* Z.....k& */ -0x5a, 0x05, 0x00, 0x04, 0xcc, 0x0a, 0xad, 0x26, /* Z......& */ -0x5a, 0x05, 0x00, 0x05, 0x3e, 0x0a, 0xb7, 0x26, /* Z...>..& */ -0x5a, 0x05, 0x00, 0x06, 0xf4, 0x09, 0xb7, 0x27, /* Z......' */ -0x0d, -0x42, 0x04, 0x00, -0x47, 0x29, 0xff, 0xaf /* .B..G).. */ + 0x67, 0x05, 0x00, 0x00, 0x02, 0x2e, 0x00, 0x70, /* g......p */ + 0x67, 0x05, 0x00, 0x02, 0x02, 0x2e, 0x87, 0x70, /* g......p */ + 0x67, 0x05, 0x00, 0x01, 0x02, 0x2e, 0x6f, 0x72, /* g.....or */ + 0x67, 0x05, 0x00, 0x03, 0x02, 0x2e, 0x7a, 0x73, /* g.....zs */ + 0x67, 0x05, 0x00, 0x08, 0x02, 0x2e, 0x9a, 0x74, /* g......t */ + 0x67, 0x05, 0x00, 0x07, 0x02, 0x2e, 0x06, 0x75, /* g......u */ + 0x5a, 0x05, 0x00, 0x00, 0x55, 0x01, 0x27, 0x26, /* Z...U.'& */ + 0x5a, 0x05, 0x00, 0x01, 0xc4, 0x0a, 0x33, 0x26, /* Z.....3& */ + 0x5a, 0x05, 0x00, 0x02, 0xd9, 0x02, 0x45, 0x26, /* Z.....E& */ + 0x5a, 0x05, 0x00, 0x03, 0x94, 0x16, 0x6b, 0x26, /* Z.....k& */ + 0x5a, 0x05, 0x00, 0x04, 0xcc, 0x0a, 0xad, 0x26, /* Z......& */ + 0x5a, 0x05, 0x00, 0x05, 0x3e, 0x0a, 0xb7, 0x26, /* Z...>..& */ + 0x5a, 0x05, 0x00, 0x06, 0xf4, 0x09, 0xb7, 0x27, /* Z......' */ + 0x0d, + 0x42, 0x04, 0x00, + 0x47, 0x29, 0xff, 0xaf /* .B..G).. */ }; /* INIT1 is over, 0x07 cmd returns * { 0x07, 0x05, 0x00, 0x91, 0x26, 0x21, 0x00, 0x3a } */ struct aesX660_cmd aes2660_init_1[] = { - { .cmd = pkt13, .len = sizeof(pkt13) }, - { .cmd = pkt15, .len = sizeof(pkt15) }, - { .cmd = pkt17, .len = sizeof(pkt17) }, - { .cmd = pkt19, .len = sizeof(pkt19) }, - { .cmd = pkt21, .len = sizeof(pkt21) }, - { .cmd = pkt23, .len = sizeof(pkt23) }, - { .cmd = pkt25, .len = sizeof(pkt25) }, - { .cmd = pkt27, .len = sizeof(pkt27) }, - { .cmd = pkt29, .len = sizeof(pkt29) }, - { .cmd = pkt31, .len = sizeof(pkt31) }, - { .cmd = pkt33, .len = sizeof(pkt33) }, - { .cmd = pkt35, .len = sizeof(pkt35) }, - { .cmd = pkt37, .len = sizeof(pkt37) }, - { .cmd = pkt39, .len = sizeof(pkt39) }, - { .cmd = pkt41, .len = sizeof(pkt41) }, - { .cmd = pkt43, .len = sizeof(pkt43) }, - { .cmd = pkt45, .len = sizeof(pkt45) }, - { .cmd = pkt47, .len = sizeof(pkt47) }, - { .cmd = pkt49, .len = sizeof(pkt49) }, - { .cmd = pkt51, .len = sizeof(pkt51) }, - { .cmd = pkt53, .len = sizeof(pkt53) }, - { .cmd = pkt55, .len = sizeof(pkt55) }, - { .cmd = pkt57, .len = sizeof(pkt57) }, - { .cmd = pkt59, .len = sizeof(pkt59) }, - { .cmd = pkt61, .len = sizeof(pkt61) }, - { .cmd = pkt63, .len = sizeof(pkt63) }, - { .cmd = pkt65, .len = sizeof(pkt65) }, - { .cmd = pkt67, .len = sizeof(pkt67) }, - { .cmd = pkt69, .len = sizeof(pkt69) }, - { .cmd = pkt71, .len = sizeof(pkt71) }, - { .cmd = pkt73, .len = sizeof(pkt73) }, - { .cmd = pkt75, .len = sizeof(pkt75) }, + { .cmd = pkt13, .len = sizeof (pkt13) }, + { .cmd = pkt15, .len = sizeof (pkt15) }, + { .cmd = pkt17, .len = sizeof (pkt17) }, + { .cmd = pkt19, .len = sizeof (pkt19) }, + { .cmd = pkt21, .len = sizeof (pkt21) }, + { .cmd = pkt23, .len = sizeof (pkt23) }, + { .cmd = pkt25, .len = sizeof (pkt25) }, + { .cmd = pkt27, .len = sizeof (pkt27) }, + { .cmd = pkt29, .len = sizeof (pkt29) }, + { .cmd = pkt31, .len = sizeof (pkt31) }, + { .cmd = pkt33, .len = sizeof (pkt33) }, + { .cmd = pkt35, .len = sizeof (pkt35) }, + { .cmd = pkt37, .len = sizeof (pkt37) }, + { .cmd = pkt39, .len = sizeof (pkt39) }, + { .cmd = pkt41, .len = sizeof (pkt41) }, + { .cmd = pkt43, .len = sizeof (pkt43) }, + { .cmd = pkt45, .len = sizeof (pkt45) }, + { .cmd = pkt47, .len = sizeof (pkt47) }, + { .cmd = pkt49, .len = sizeof (pkt49) }, + { .cmd = pkt51, .len = sizeof (pkt51) }, + { .cmd = pkt53, .len = sizeof (pkt53) }, + { .cmd = pkt55, .len = sizeof (pkt55) }, + { .cmd = pkt57, .len = sizeof (pkt57) }, + { .cmd = pkt59, .len = sizeof (pkt59) }, + { .cmd = pkt61, .len = sizeof (pkt61) }, + { .cmd = pkt63, .len = sizeof (pkt63) }, + { .cmd = pkt65, .len = sizeof (pkt65) }, + { .cmd = pkt67, .len = sizeof (pkt67) }, + { .cmd = pkt69, .len = sizeof (pkt69) }, + { .cmd = pkt71, .len = sizeof (pkt71) }, + { .cmd = pkt73, .len = sizeof (pkt73) }, + { .cmd = pkt75, .len = sizeof (pkt75) }, }; /* Second init sequence * INIT2 */ static const unsigned char pkt187[] = { -0x0d, -0x23, -0x42, 0xca, 0x00, -0x00, 0x20, 0x7f, /* .#B... . */ -0x97, 0x37, 0xcf, 0xdf, 0x96, 0x26, 0xcf, 0xdf, /* .7...&.. */ -0x96, 0xff, 0x96, 0x9f, 0x22, 0x6d, 0x2e, 0x6a, /* ...."m.j */ -0xbf, 0x62, 0x23, 0x23, 0x83, 0xdd, 0x97, 0x26, /* .b##...& */ -0xaf, 0xdd, 0x97, 0x37, 0xaf, 0xa9, 0xcf, 0x70, /* ...7...p */ -0x18, 0xa9, 0xaf, 0x02, 0xef, 0x5d, 0xaf, 0xc5, /* .....].. */ -0xef, 0x2f, 0xff, 0xff, 0x96, 0xdf, 0x96, 0x6a, /* ./.....j */ -0xef, 0x20, 0xff, 0xff, 0x96, 0xdf, 0x96, 0x1a, /* . ...... */ -0x27, 0x0b, 0xef, 0x06, 0xaf, 0xf1, 0x81, 0x3a, /* '......: */ -0xff, 0x3f, 0x1d, 0x40, 0x19, 0xc1, 0x2e, 0xa3, /* .?.@.... */ -0xbf, 0xc2, 0x2e, 0x00, 0xdf, 0xff, 0x2d, 0x02, /* ......-. */ -0x5a, 0xbf, 0x22, 0xc1, 0x2e, 0xa3, 0xbf, 0x3c, /* Z."....< */ -0x23, 0x57, 0x23, 0x02, 0x2e, 0x31, 0x80, 0x05, /* #W#..1.. */ -0x27, 0x12, 0xef, 0x99, 0xaf, 0x10, 0xef, 0x9b, /* '....... */ -0xaf, 0x10, 0xef, 0x55, 0xaf, 0x3d, 0x23, 0x31, /* ...U.=#1 */ -0xef, 0x20, 0xff, 0x1a, 0x27, 0x05, 0xef, 0x27, /* . ..'..' */ -0xff, 0x06, 0x27, 0x05, 0x27, 0x3f, 0x80, 0x2b, /* ..'.'?.+ */ -0x0d, 0x05, 0x27, 0xe5, 0x31, 0x05, 0x81, 0xe5, /* ..'.1... */ -0x39, 0x05, 0x27, 0xc8, 0x46, 0x0e, 0x5b, 0xd3, /* 9.'.F.[. */ -0x45, 0xfd, 0x5a, 0x0f, 0x27, 0xd3, 0x45, 0xfa, /* E.Z.'.E. */ -0x5a, 0x0f, 0x27, 0xd3, 0x45, 0xf7, 0x5a, 0x41, /* Z.'.E.ZA */ -0x2e, 0xa1, 0xdf, 0x9f, 0x28, 0x41, 0x2e, 0xa1, /* ....(A.. */ -0xbf, 0x02, 0x2e, 0x58, 0x80, 0x05, 0x27, 0x9f, /* ...X..'. */ -0x22, 0xbf, 0x22, 0x1f, 0x20, 0xfd, 0x53, 0x3f, /* ".". .S? */ -0x20, 0x14, 0x1f, 0xfa, 0x55, 0x05, 0x27, 0x10, /* ...U.'. */ -0xef, 0xd0, 0x81, 0x65, 0xaf, 0x10, 0xef /* ...e... */ + 0x0d, + 0x23, + 0x42, 0xca, 0x00, + 0x00, 0x20, 0x7f, /* .#B... . */ + 0x97, 0x37, 0xcf, 0xdf, 0x96, 0x26, 0xcf, 0xdf, /* .7...&.. */ + 0x96, 0xff, 0x96, 0x9f, 0x22, 0x6d, 0x2e, 0x6a, /* ...."m.j */ + 0xbf, 0x62, 0x23, 0x23, 0x83, 0xdd, 0x97, 0x26, /* .b##...& */ + 0xaf, 0xdd, 0x97, 0x37, 0xaf, 0xa9, 0xcf, 0x70, /* ...7...p */ + 0x18, 0xa9, 0xaf, 0x02, 0xef, 0x5d, 0xaf, 0xc5, /* .....].. */ + 0xef, 0x2f, 0xff, 0xff, 0x96, 0xdf, 0x96, 0x6a, /* ./.....j */ + 0xef, 0x20, 0xff, 0xff, 0x96, 0xdf, 0x96, 0x1a, /* . ...... */ + 0x27, 0x0b, 0xef, 0x06, 0xaf, 0xf1, 0x81, 0x3a, /* '......: */ + 0xff, 0x3f, 0x1d, 0x40, 0x19, 0xc1, 0x2e, 0xa3, /* .?.@.... */ + 0xbf, 0xc2, 0x2e, 0x00, 0xdf, 0xff, 0x2d, 0x02, /* ......-. */ + 0x5a, 0xbf, 0x22, 0xc1, 0x2e, 0xa3, 0xbf, 0x3c, /* Z."....< */ + 0x23, 0x57, 0x23, 0x02, 0x2e, 0x31, 0x80, 0x05, /* #W#..1.. */ + 0x27, 0x12, 0xef, 0x99, 0xaf, 0x10, 0xef, 0x9b, /* '....... */ + 0xaf, 0x10, 0xef, 0x55, 0xaf, 0x3d, 0x23, 0x31, /* ...U.=#1 */ + 0xef, 0x20, 0xff, 0x1a, 0x27, 0x05, 0xef, 0x27, /* . ..'..' */ + 0xff, 0x06, 0x27, 0x05, 0x27, 0x3f, 0x80, 0x2b, /* ..'.'?.+ */ + 0x0d, 0x05, 0x27, 0xe5, 0x31, 0x05, 0x81, 0xe5, /* ..'.1... */ + 0x39, 0x05, 0x27, 0xc8, 0x46, 0x0e, 0x5b, 0xd3, /* 9.'.F.[. */ + 0x45, 0xfd, 0x5a, 0x0f, 0x27, 0xd3, 0x45, 0xfa, /* E.Z.'.E. */ + 0x5a, 0x0f, 0x27, 0xd3, 0x45, 0xf7, 0x5a, 0x41, /* Z.'.E.ZA */ + 0x2e, 0xa1, 0xdf, 0x9f, 0x28, 0x41, 0x2e, 0xa1, /* ....(A.. */ + 0xbf, 0x02, 0x2e, 0x58, 0x80, 0x05, 0x27, 0x9f, /* ...X..'. */ + 0x22, 0xbf, 0x22, 0x1f, 0x20, 0xfd, 0x53, 0x3f, /* ".". .S? */ + 0x20, 0x14, 0x1f, 0xfa, 0x55, 0x05, 0x27, 0x10, /* ...U.'. */ + 0xef, 0xd0, 0x81, 0x65, 0xaf, 0x10, 0xef /* ...e... */ }; static const unsigned char pkt189[] = { -0x42, 0x4a, 0x00, -0x64, 0x20, 0xd0, 0x81, 0x9c, /* BJ.d ... */ -0xaf, 0x10, 0xef, 0xd0, 0x81, 0x9a, 0xaf, 0x05, /* ........ */ -0x27, 0x11, 0x00, 0x51, 0x87, 0x91, 0x81, 0xd1, /* '..Q.... */ -0x6c, 0xd2, 0x75, 0xe2, 0x80, 0xf2, 0x80, 0xf0, /* l.u..... */ -0x57, 0xf4, 0x7b, 0xf8, 0x7e, 0xfc, 0x8b, 0x10, /* W.{.~... */ -0xcf, 0x7d, 0xff, 0x3f, 0x00, 0x20, 0xff, 0x00, /* .}.?. .. */ -0x13, 0x1a, 0x27, 0x07, 0x27, 0x05, 0x27, 0x01, /* ..'.'.'. */ -0x00, 0x11, 0x00, 0x21, 0x00, 0x31, 0x00, 0x31, /* ...!.1.1 */ -0x01, 0x32, 0x01, 0x33, 0x01, 0x33, 0x03, 0x43, /* .2.3.3.C */ -0x03, 0x53, 0x03, 0x63, 0x03 /* .S.c. */ + 0x42, 0x4a, 0x00, + 0x64, 0x20, 0xd0, 0x81, 0x9c, /* BJ.d ... */ + 0xaf, 0x10, 0xef, 0xd0, 0x81, 0x9a, 0xaf, 0x05, /* ........ */ + 0x27, 0x11, 0x00, 0x51, 0x87, 0x91, 0x81, 0xd1, /* '..Q.... */ + 0x6c, 0xd2, 0x75, 0xe2, 0x80, 0xf2, 0x80, 0xf0, /* l.u..... */ + 0x57, 0xf4, 0x7b, 0xf8, 0x7e, 0xfc, 0x8b, 0x10, /* W.{.~... */ + 0xcf, 0x7d, 0xff, 0x3f, 0x00, 0x20, 0xff, 0x00, /* .}.?. .. */ + 0x13, 0x1a, 0x27, 0x07, 0x27, 0x05, 0x27, 0x01, /* ..'.'.'. */ + 0x00, 0x11, 0x00, 0x21, 0x00, 0x31, 0x00, 0x31, /* ...!.1.1 */ + 0x01, 0x32, 0x01, 0x33, 0x01, 0x33, 0x03, 0x43, /* .2.3.3.C */ + 0x03, 0x53, 0x03, 0x63, 0x03 /* .S.c. */ }; static const unsigned char pkt191[] = { -0x42, 0xca, 0x00, -0x88, 0x20, 0x51, 0x85, 0x44, /* B... Q.D */ -0x1e, 0x03, 0x55, 0xc8, 0x46, 0x01, 0x5b, 0xe4, /* ..U.F.[. */ -0x2f, 0xc8, 0x50, 0x49, 0x1e, 0x16, 0x55, 0x37, /* /.PI..U7 */ -0x39, 0x0f, 0x27, 0x02, 0xef, 0x02, 0x2e, 0x2f, /* 9.'..../ */ -0x81, 0xfe, 0xcf, 0x08, 0xaf, 0xfe, 0xcf, 0x09, /* ........ */ -0xaf, 0xfe, 0xcf, 0x0b, 0xaf, 0x55, 0x81, 0x02, /* .....U.. */ -0xcf, 0x0f, 0x1c, 0x40, 0x18, 0x08, 0x42, 0x00, /* ...@..B. */ -0x5b, 0x20, 0x18, 0x3d, 0x23, 0x02, 0xaf, 0x10, /* [ .=#... */ -0xef, 0x55, 0xaf, 0x05, 0x27, 0x4a, 0x1e, 0x01, /* .U..'J.. */ -0x55, 0xe4, 0x2f, 0xab, 0x50, 0x4e, 0x1e, 0x01, /* U./.PN.. */ -0x55, 0x00, 0x2e, 0x0d, 0x7b, 0x55, 0x1e, 0x16, /* U...{U.. */ -0x55, 0x54, 0x85, 0xe4, 0x2f, 0xa2, 0x5b, 0x07, /* UT../.[. */ -0xef, 0x20, 0x80, 0xe4, 0x2f, 0x9e, 0x5a, 0xfe, /* . ../.Z. */ -0xcf, 0x0a, 0xaf, 0xfe, 0xcf, 0xfe, 0xcf, 0x41, /* .......A */ -0x2e, 0x44, 0xbf, 0xfe, 0xcf, 0x41, 0x2e, 0x45, /* .D...A.E */ -0xbf, 0xfe, 0xcf, 0x52, 0xaf, 0xfe, 0xcf, 0x53, /* ...R...S */ -0xaf, 0xfe, 0xcf, 0x5a, 0xaf, 0x05, 0x27, 0x58, /* ...Z..'X */ -0x1e, 0x0d, 0x55, 0x02, 0x44, 0x01, 0x5a, 0x00, /* ..U.D.Z. */ -0x2e, 0x54, 0x79, 0xfe, 0xcf, 0x75, 0xaf, 0xfe, /* .Ty..u.. */ -0xdf, 0x76, 0xbf, 0x41, 0x2e, 0xa4, 0xdf, 0xdf, /* .v.A.... */ -0x29, 0x41, 0x2e, 0xa4, 0xbf, 0x05, 0x27, 0x59, /* )A....'Y */ -0x1e, 0x03, 0x55, 0xfe, 0xcf, 0x10, 0xaf, 0x01, /* ..U..... */ -0x2e, 0x94, 0x76, 0x63, 0x1e, 0x1a, 0x55, 0x54, /* ..vc..UT */ -0x85, 0xe4, 0x2f, 0x73, 0x5b, 0x0c, 0xef, 0x20, /* ../s[.. */ -0x80, 0xe4, 0x2f, 0x6f, 0x5a, 0xf0, 0xef, 0x00, /* ../oZ... */ -0xff, 0x19, 0x27, 0x08, 0xef /* ..'.. */ + 0x42, 0xca, 0x00, + 0x88, 0x20, 0x51, 0x85, 0x44, /* B... Q.D */ + 0x1e, 0x03, 0x55, 0xc8, 0x46, 0x01, 0x5b, 0xe4, /* ..U.F.[. */ + 0x2f, 0xc8, 0x50, 0x49, 0x1e, 0x16, 0x55, 0x37, /* /.PI..U7 */ + 0x39, 0x0f, 0x27, 0x02, 0xef, 0x02, 0x2e, 0x2f, /* 9.'..../ */ + 0x81, 0xfe, 0xcf, 0x08, 0xaf, 0xfe, 0xcf, 0x09, /* ........ */ + 0xaf, 0xfe, 0xcf, 0x0b, 0xaf, 0x55, 0x81, 0x02, /* .....U.. */ + 0xcf, 0x0f, 0x1c, 0x40, 0x18, 0x08, 0x42, 0x00, /* ...@..B. */ + 0x5b, 0x20, 0x18, 0x3d, 0x23, 0x02, 0xaf, 0x10, /* [ .=#... */ + 0xef, 0x55, 0xaf, 0x05, 0x27, 0x4a, 0x1e, 0x01, /* .U..'J.. */ + 0x55, 0xe4, 0x2f, 0xab, 0x50, 0x4e, 0x1e, 0x01, /* U./.PN.. */ + 0x55, 0x00, 0x2e, 0x0d, 0x7b, 0x55, 0x1e, 0x16, /* U...{U.. */ + 0x55, 0x54, 0x85, 0xe4, 0x2f, 0xa2, 0x5b, 0x07, /* UT../.[. */ + 0xef, 0x20, 0x80, 0xe4, 0x2f, 0x9e, 0x5a, 0xfe, /* . ../.Z. */ + 0xcf, 0x0a, 0xaf, 0xfe, 0xcf, 0xfe, 0xcf, 0x41, /* .......A */ + 0x2e, 0x44, 0xbf, 0xfe, 0xcf, 0x41, 0x2e, 0x45, /* .D...A.E */ + 0xbf, 0xfe, 0xcf, 0x52, 0xaf, 0xfe, 0xcf, 0x53, /* ...R...S */ + 0xaf, 0xfe, 0xcf, 0x5a, 0xaf, 0x05, 0x27, 0x58, /* ...Z..'X */ + 0x1e, 0x0d, 0x55, 0x02, 0x44, 0x01, 0x5a, 0x00, /* ..U.D.Z. */ + 0x2e, 0x54, 0x79, 0xfe, 0xcf, 0x75, 0xaf, 0xfe, /* .Ty..u.. */ + 0xdf, 0x76, 0xbf, 0x41, 0x2e, 0xa4, 0xdf, 0xdf, /* .v.A.... */ + 0x29, 0x41, 0x2e, 0xa4, 0xbf, 0x05, 0x27, 0x59, /* )A....'Y */ + 0x1e, 0x03, 0x55, 0xfe, 0xcf, 0x10, 0xaf, 0x01, /* ..U..... */ + 0x2e, 0x94, 0x76, 0x63, 0x1e, 0x1a, 0x55, 0x54, /* ..vc..UT */ + 0x85, 0xe4, 0x2f, 0x73, 0x5b, 0x0c, 0xef, 0x20, /* ../s[.. */ + 0x80, 0xe4, 0x2f, 0x6f, 0x5a, 0xf0, 0xef, 0x00, /* ../oZ... */ + 0xff, 0x19, 0x27, 0x08, 0xef /* ..'.. */ }; static const unsigned char pkt193[] = { -0x42, 0xa2, 0x00, -0xec, 0x20, 0x06, 0xaf, 0xfe, /* B... ... */ -0xcf, 0x5f, 0x9f, 0x06, 0x25, 0xfb, 0x55, 0xfe, /* ._..%.U. */ -0xcf, 0xfe, 0xcf, 0x41, 0x2e, 0x40, 0xbf, 0xfe, /* ...A.@.. */ -0xcf, 0x41, 0x2e, 0x41, 0xbf, 0xfe, 0xcf, 0x41, /* .A.A...A */ -0x2e, 0x42, 0xbf, 0x05, 0x27, 0x66, 0x1e, 0x0b, /* .B..'f.. */ -0x55, 0xc5, 0xef, 0x2f, 0xff, 0x1a, 0x27, 0x0b, /* U../..'. */ -0xef, 0x06, 0xaf, 0xfe, 0xcf, 0xfe, 0xdf, 0x06, /* ........ */ -0x27, 0x01, 0x0e, 0x06, 0x25, 0xf9, 0x55, 0x05, /* '...%.U. */ -0x27, 0x7d, 0x1e, 0x0c, 0x55, 0x02, 0x2e, 0x29, /* '}..U..) */ -0x81, 0xe4, 0x2f, 0x47, 0x5a, 0xfe, 0xcf, 0xfe, /* ../GZ... */ -0xdf, 0x1b, 0x27, 0xfe, 0xcf, 0x36, 0x03, 0xfe, /* ..'..6.. */ -0xdf, 0x3f, 0x02, 0x9f, 0x9d, 0x05, 0x27, 0x7e, /* .?....'~ */ -0x1e, 0x0c, 0x55, 0x02, 0x2e, 0x29, 0x81, 0xe4, /* ..U..).. */ -0x2f, 0x38, 0x5a, 0xfe, 0xcf, 0xfe, 0xdf, 0x1b, /* /8Z..... */ -0x27, 0x07, 0x80, 0xf6, 0x97, 0xff, 0xaf, 0x00, /* '....... */ -0x2e, 0xa7, 0x8a, 0x05, 0x27, 0x61, 0x74, 0xff, /* ....'at. */ -0x96, 0xc6, 0x2e, 0x01, 0xdf, 0x3f, 0x2c, 0xdd, /* .....?,. */ -0x9f, 0x05, 0x27, 0xf9, 0x35, 0xc1, 0x2e, 0x4e, /* ..'.5..N */ -0xdf, 0x0f, 0x1d, 0x09, 0x27, 0x5f, 0x02, 0xc1, /* ....'_.. */ -0x2e, 0x4e, 0xbf, 0x05, 0x27, 0x9f, 0x22, 0x02, /* .N..'.". */ -0x2e, 0xe7, 0x8c, 0x05, 0x27 /* ....' */ + 0x42, 0xa2, 0x00, + 0xec, 0x20, 0x06, 0xaf, 0xfe, /* B... ... */ + 0xcf, 0x5f, 0x9f, 0x06, 0x25, 0xfb, 0x55, 0xfe, /* ._..%.U. */ + 0xcf, 0xfe, 0xcf, 0x41, 0x2e, 0x40, 0xbf, 0xfe, /* ...A.@.. */ + 0xcf, 0x41, 0x2e, 0x41, 0xbf, 0xfe, 0xcf, 0x41, /* .A.A...A */ + 0x2e, 0x42, 0xbf, 0x05, 0x27, 0x66, 0x1e, 0x0b, /* .B..'f.. */ + 0x55, 0xc5, 0xef, 0x2f, 0xff, 0x1a, 0x27, 0x0b, /* U../..'. */ + 0xef, 0x06, 0xaf, 0xfe, 0xcf, 0xfe, 0xdf, 0x06, /* ........ */ + 0x27, 0x01, 0x0e, 0x06, 0x25, 0xf9, 0x55, 0x05, /* '...%.U. */ + 0x27, 0x7d, 0x1e, 0x0c, 0x55, 0x02, 0x2e, 0x29, /* '}..U..) */ + 0x81, 0xe4, 0x2f, 0x47, 0x5a, 0xfe, 0xcf, 0xfe, /* ../GZ... */ + 0xdf, 0x1b, 0x27, 0xfe, 0xcf, 0x36, 0x03, 0xfe, /* ..'..6.. */ + 0xdf, 0x3f, 0x02, 0x9f, 0x9d, 0x05, 0x27, 0x7e, /* .?....'~ */ + 0x1e, 0x0c, 0x55, 0x02, 0x2e, 0x29, 0x81, 0xe4, /* ..U..).. */ + 0x2f, 0x38, 0x5a, 0xfe, 0xcf, 0xfe, 0xdf, 0x1b, /* /8Z..... */ + 0x27, 0x07, 0x80, 0xf6, 0x97, 0xff, 0xaf, 0x00, /* '....... */ + 0x2e, 0xa7, 0x8a, 0x05, 0x27, 0x61, 0x74, 0xff, /* ....'at. */ + 0x96, 0xc6, 0x2e, 0x01, 0xdf, 0x3f, 0x2c, 0xdd, /* .....?,. */ + 0x9f, 0x05, 0x27, 0xf9, 0x35, 0xc1, 0x2e, 0x4e, /* ..'.5..N */ + 0xdf, 0x0f, 0x1d, 0x09, 0x27, 0x5f, 0x02, 0xc1, /* ....'_.. */ + 0x2e, 0x4e, 0xbf, 0x05, 0x27, 0x9f, 0x22, 0x02, /* .N..'.". */ + 0x2e, 0xe7, 0x8c, 0x05, 0x27 /* ....' */ }; static const unsigned char pkt195[] = { -0x42, 0xca, 0x00, -0x3c, 0x21, 0x51, 0x85, 0x01, /* B...Z. */ -0x27, 0x2d, 0x82, 0x40, 0x82, 0x12, 0x82, 0x12, /* '-.@.... */ -0x82, 0x9d, 0xbf, 0xff, 0x97, 0x08, 0x10, 0x09, /* ........ */ -0x27, 0x0f, 0x1c, 0x5c, 0x46, 0x03, 0x5b, 0x02, /* '..\F.[. */ -0x1e, 0x04, 0x53, 0x02, 0xef, 0x02, 0x50, 0x03, /* ..S...P. */ -0x1e, 0x00, 0x53, 0x03, 0xef, 0x69, 0xaf, 0x3f, /* ..S..i.? */ -0x80, 0x1b, 0x0d, 0xe1, 0x97, 0x0f, 0x1c, 0x69, /* .......i */ -0xdf, 0xdf, 0x01, 0x00, 0x53, 0x00, 0xff, 0xe0, /* ....S... */ -0x97, 0x76, 0x80, 0x04, 0x10, 0x07, 0x82, 0x0f, /* .v...... */ -0x1e, 0x00, 0x5f, 0x0f, 0xef, 0x6a, 0xaf, 0xc1, /* .._..j.. */ -0x2e, 0x47, 0xdf, 0xf0, 0x1d, 0x5f, 0x02, 0xc1, /* .G..._.. */ -0x2e, 0x47, 0xbf, 0x10, 0x0d, 0x05, 0x27, 0x01, /* .G....'. */ -0x2e, 0x1a, 0x87, 0xf7, 0xef, 0x16, 0x80, 0x52, /* .......R */ -0x80, 0x16, 0x82, 0x02, 0x2e, 0xb7, 0x85, 0x55, /* .......U */ -0x82, 0x02, 0x2e, 0x60, 0x80, 0x01, 0x2e, 0x84, /* ...`.... */ -0x83, 0x26, 0x40, 0x00, 0x5b, 0x3b, 0x33, 0x5c, /* .&@.[;3\ */ -0x47, 0x09, 0x5b, 0x6c, 0x38, 0x3b, 0x43, 0x00, /* G.[l8;C. */ -0x5b, 0x6c, 0x30, 0x41, 0x2e, 0x71, 0xdf, 0xc1, /* [l0A.q.. */ -0x2e, 0x72, 0xdf, 0xbf, 0x03, 0x01, 0x55, 0x01, /* .r....U. */ -0x2e, 0x98, 0x83, 0x01, 0x2e, 0x63, 0x84, 0x01, /* .....c.. */ -0x2e, 0x71, 0x87, 0x05, 0x27, 0x3b, 0x40, 0x01, /* .q..';@. */ -0x5b, 0x02, 0xef, 0x0c, 0xaf, 0x05, 0x27, 0x52, /* [.....'R */ -0xcf, 0xcb, 0xaf, 0x53, 0xdf /* ...S. */ + 0x42, 0xca, 0x00, + 0xc6, 0x26, 0x02, 0x2e, 0x22, /* B...&.." */ + 0x87, 0x09, 0x46, 0x02, 0x5b, 0x2d, 0x82, 0x90, /* ..F.[-.. */ + 0xaf, 0x91, 0xbf, 0x01, 0x2e, 0xbd, 0x84, 0x02, /* ........ */ + 0x2e, 0x14, 0x85, 0x0c, 0x3e, 0xe8, 0x5a, 0x05, /* ....>.Z. */ + 0x27, 0x2d, 0x82, 0x40, 0x82, 0x12, 0x82, 0x12, /* '-.@.... */ + 0x82, 0x9d, 0xbf, 0xff, 0x97, 0x08, 0x10, 0x09, /* ........ */ + 0x27, 0x0f, 0x1c, 0x5c, 0x46, 0x03, 0x5b, 0x02, /* '..\F.[. */ + 0x1e, 0x04, 0x53, 0x02, 0xef, 0x02, 0x50, 0x03, /* ..S...P. */ + 0x1e, 0x00, 0x53, 0x03, 0xef, 0x69, 0xaf, 0x3f, /* ..S..i.? */ + 0x80, 0x1b, 0x0d, 0xe1, 0x97, 0x0f, 0x1c, 0x69, /* .......i */ + 0xdf, 0xdf, 0x01, 0x00, 0x53, 0x00, 0xff, 0xe0, /* ....S... */ + 0x97, 0x76, 0x80, 0x04, 0x10, 0x07, 0x82, 0x0f, /* .v...... */ + 0x1e, 0x00, 0x5f, 0x0f, 0xef, 0x6a, 0xaf, 0xc1, /* .._..j.. */ + 0x2e, 0x47, 0xdf, 0xf0, 0x1d, 0x5f, 0x02, 0xc1, /* .G..._.. */ + 0x2e, 0x47, 0xbf, 0x10, 0x0d, 0x05, 0x27, 0x01, /* .G....'. */ + 0x2e, 0x1a, 0x87, 0xf7, 0xef, 0x16, 0x80, 0x52, /* .......R */ + 0x80, 0x16, 0x82, 0x02, 0x2e, 0xb7, 0x85, 0x55, /* .......U */ + 0x82, 0x02, 0x2e, 0x60, 0x80, 0x01, 0x2e, 0x84, /* ...`.... */ + 0x83, 0x26, 0x40, 0x00, 0x5b, 0x3b, 0x33, 0x5c, /* .&@.[;3\ */ + 0x47, 0x09, 0x5b, 0x6c, 0x38, 0x3b, 0x43, 0x00, /* G.[l8;C. */ + 0x5b, 0x6c, 0x30, 0x41, 0x2e, 0x71, 0xdf, 0xc1, /* [l0A.q.. */ + 0x2e, 0x72, 0xdf, 0xbf, 0x03, 0x01, 0x55, 0x01, /* .r....U. */ + 0x2e, 0x98, 0x83, 0x01, 0x2e, 0x63, 0x84, 0x01, /* .....c.. */ + 0x2e, 0x71, 0x87, 0x05, 0x27, 0x3b, 0x40, 0x01, /* .q..';@. */ + 0x5b, 0x02, 0xef, 0x0c, 0xaf, 0x05, 0x27, 0x52, /* [.....'R */ + 0xcf, 0xcb, 0xaf, 0x53, 0xdf /* ...S. */ }; static const unsigned char pkt229[] = { -0x42, 0xca, 0x00, -0x2a, 0x27, 0xcc, 0xbf, 0xdf, /* B..*'... */ -0x22, 0x01, 0x55, 0xff, 0x22, 0x01, 0x54, 0x0e, /* ".U.".T. */ -0xef, 0xc9, 0xaf, 0x05, 0x27, 0x0e, 0xcf, 0x6e, /* ....'..n */ -0x1c, 0x49, 0xdf, 0x10, 0x1d, 0x3f, 0x02, 0x49, /* .I...?.I */ -0xaf, 0x0d, 0x44, 0x06, 0x5a, 0x0a, 0x41, 0x03, /* ..D.Z.A. */ -0x5b, 0x49, 0x43, 0x02, 0x5a, 0x48, 0x26, 0x00, /* [IC.ZH&. */ -0x55, 0x49, 0x30, 0x9f, 0x2c, 0x05, 0x5a, 0xdf, /* UI0.,.Z. */ -0x2c, 0x4d, 0x5a, 0x0e, 0x41, 0x16, 0x5b, 0x0c, /* ,MZ.A.[. */ -0x46, 0x14, 0x5a, 0x9f, 0x22, 0x1c, 0xaf, 0x21, /* F.Z."..! */ -0xaf, 0x02, 0x2e, 0xb4, 0x87, 0x03, 0x5a, 0x9f, /* ......Z. */ -0x2c, 0x05, 0x5a, 0x9f, 0x22, 0x04, 0x50, 0x9f, /* ,.Z.".P. */ -0x22, 0x0e, 0x3e, 0x0e, 0x3d, 0x00, 0x5b, 0x5f, /* ".>.=.[_ */ -0xef, 0x1d, 0xaf, 0x49, 0xcf, 0x87, 0x1c, 0x01, /* ...I.... */ -0x18, 0x49, 0xaf, 0x34, 0x50, 0x20, 0x26, 0x08, /* .I.4P &. */ -0x55, 0x1f, 0xcf, 0x48, 0xdf, 0xff, 0x2d, 0x00, /* U..H..-. */ -0x5b, 0xff, 0x21, 0x3f, 0x00, 0x00, 0x53, 0xff, /* [.!?..S. */ -0xef, 0x1f, 0xaf, 0x47, 0xdf, 0x1c, 0xcf, 0x3f, /* ...G...? */ -0x00, 0x1c, 0xaf, 0x1d, 0xcf, 0x48, 0xdf, 0x3f, /* .....H.? */ -0x00, 0x1d, 0xaf, 0xff, 0x22, 0x1f, 0x54, 0xff, /* ....".T. */ -0x2d, 0x03, 0x5b, 0xff, 0x1e, 0x19, 0x5b, 0x60, /* -.[...[` */ -0x10, 0x02, 0x50, 0x60, 0x1e, 0x0a, 0x52, 0x60, /* ..P`..R` */ -0x16, 0x1d, 0xaf, 0x49, 0x30, 0x49, 0x3c, 0x12, /* ...I0I<. */ -0x5b, 0x21, 0xcf, 0x47, 0xdf, 0x3f, 0x00, 0x1c, /* [!.G.?.. */ -0xaf, 0x21, 0x23, 0x0c, 0x50, 0x59, 0x1e, 0x0a, /* .!#.PY.. */ -0x52, 0x49, 0x34, 0x01, 0x5a, 0x21, 0x23, 0x06, /* RI4.Z!#. */ -0x50, 0x21, 0xcf, 0x47, 0xdf /* P!.G. */ + 0x42, 0xca, 0x00, + 0x2a, 0x27, 0xcc, 0xbf, 0xdf, /* B..*'... */ + 0x22, 0x01, 0x55, 0xff, 0x22, 0x01, 0x54, 0x0e, /* ".U.".T. */ + 0xef, 0xc9, 0xaf, 0x05, 0x27, 0x0e, 0xcf, 0x6e, /* ....'..n */ + 0x1c, 0x49, 0xdf, 0x10, 0x1d, 0x3f, 0x02, 0x49, /* .I...?.I */ + 0xaf, 0x0d, 0x44, 0x06, 0x5a, 0x0a, 0x41, 0x03, /* ..D.Z.A. */ + 0x5b, 0x49, 0x43, 0x02, 0x5a, 0x48, 0x26, 0x00, /* [IC.ZH&. */ + 0x55, 0x49, 0x30, 0x9f, 0x2c, 0x05, 0x5a, 0xdf, /* UI0.,.Z. */ + 0x2c, 0x4d, 0x5a, 0x0e, 0x41, 0x16, 0x5b, 0x0c, /* ,MZ.A.[. */ + 0x46, 0x14, 0x5a, 0x9f, 0x22, 0x1c, 0xaf, 0x21, /* F.Z."..! */ + 0xaf, 0x02, 0x2e, 0xb4, 0x87, 0x03, 0x5a, 0x9f, /* ......Z. */ + 0x2c, 0x05, 0x5a, 0x9f, 0x22, 0x04, 0x50, 0x9f, /* ,.Z.".P. */ + 0x22, 0x0e, 0x3e, 0x0e, 0x3d, 0x00, 0x5b, 0x5f, /* ".>.=.[_ */ + 0xef, 0x1d, 0xaf, 0x49, 0xcf, 0x87, 0x1c, 0x01, /* ...I.... */ + 0x18, 0x49, 0xaf, 0x34, 0x50, 0x20, 0x26, 0x08, /* .I.4P &. */ + 0x55, 0x1f, 0xcf, 0x48, 0xdf, 0xff, 0x2d, 0x00, /* U..H..-. */ + 0x5b, 0xff, 0x21, 0x3f, 0x00, 0x00, 0x53, 0xff, /* [.!?..S. */ + 0xef, 0x1f, 0xaf, 0x47, 0xdf, 0x1c, 0xcf, 0x3f, /* ...G...? */ + 0x00, 0x1c, 0xaf, 0x1d, 0xcf, 0x48, 0xdf, 0x3f, /* .....H.? */ + 0x00, 0x1d, 0xaf, 0xff, 0x22, 0x1f, 0x54, 0xff, /* ....".T. */ + 0x2d, 0x03, 0x5b, 0xff, 0x1e, 0x19, 0x5b, 0x60, /* -.[...[` */ + 0x10, 0x02, 0x50, 0x60, 0x1e, 0x0a, 0x52, 0x60, /* ..P`..R` */ + 0x16, 0x1d, 0xaf, 0x49, 0x30, 0x49, 0x3c, 0x12, /* ...I0I<. */ + 0x5b, 0x21, 0xcf, 0x47, 0xdf, 0x3f, 0x00, 0x1c, /* [!.G.?.. */ + 0xaf, 0x21, 0x23, 0x0c, 0x50, 0x59, 0x1e, 0x0a, /* .!#.PY.. */ + 0x52, 0x49, 0x34, 0x01, 0x5a, 0x21, 0x23, 0x06, /* RI4.Z!#. */ + 0x50, 0x21, 0xcf, 0x47, 0xdf /* P!.G. */ }; static const unsigned char pkt231[] = { -0x42, 0xca, 0x00, -0x8e, 0x27, 0x3f, 0x00, 0x21, /* B...'?.! */ -0xaf, 0x01, 0x50, 0x06, 0x1e, 0xf4, 0x5f, 0x05, /* ..P..._. */ -0x27, 0x1e, 0x23, 0x0d, 0xcf, 0x06, 0x1c, 0x1a, /* '.#..... */ -0x54, 0x48, 0xcf, 0xdf, 0x2d, 0x00, 0x5b, 0xdf, /* TH..-.[. */ -0x21, 0x09, 0x27, 0x1f, 0x22, 0xbf, 0x22, 0x1a, /* !.'.".". */ -0x27, 0xc0, 0x2e, 0x96, 0xdf, 0x7f, 0x1f, 0x02, /* '....... */ -0x54, 0x3f, 0x20, 0xc0, 0x2e, 0x96, 0xbf, 0x59, /* T? ....Y */ -0x80, 0x40, 0x2e, 0x97, 0xbf, 0xc0, 0x2e, 0x95, /* .@...... */ -0xdf, 0x76, 0x80, 0x1e, 0xbf, 0x0c, 0x42, 0x02, /* .v....B. */ -0x5b, 0x9f, 0x22, 0x40, 0x2e, 0x96, 0xbf, 0x05, /* [."@.... */ -0x27, 0x0d, 0xcf, 0x06, 0x1c, 0x06, 0x1e, 0x00, /* '....... */ -0x54, 0x0d, 0x27, 0x0c, 0x27, 0x09, 0x46, 0x0d, /* T.'.'.F. */ -0x5b, 0x02, 0x2e, 0x38, 0x86, 0x07, 0x52, 0x0f, /* [..8..R. */ -0xcf, 0x01, 0x16, 0x02, 0x53, 0x02, 0x2e, 0xfe, /* ....S... */ -0x87, 0x04, 0x50, 0xf4, 0xaf, 0x02, 0x50, 0xf2, /* ..P...P. */ -0xcf, 0x02, 0x10, 0x0f, 0xaf, 0x05, 0x27, 0x5a, /* ......'Z */ -0xcf, 0xdf, 0x22, 0x10, 0x54, 0x3e, 0xdf, 0x3f, /* ..".T>.? */ -0x20, 0x3f, 0x1f, 0x0a, 0x52, 0xbf, 0x22, 0x3e, /* ?..R."> */ -0xbf, 0x3d, 0xdf, 0x3f, 0x20, 0xdf, 0x03, 0x02, /* .=.? ... */ -0x52, 0xbf, 0x22, 0x3d, 0xbf, 0x0c, 0x27, 0x3d, /* R."=..'= */ -0xbf, 0x0d, 0x27, 0x3e, 0xbf, 0x0d, 0x27, 0x0d, /* ..'>..'. */ -0x27, 0xbf, 0x22, 0x3e, 0xbf, 0x3d, 0xbf, 0x05, /* '.">.=.. */ -0x27, 0x0f, 0x1c, 0x69, 0xdf, 0xdf, 0x01, 0x00, /* '..i.... */ -0x53, 0x00, 0xff, 0x05, 0x27, 0x2d, 0x82, 0x40, /* S...'-.@ */ -0x82, 0x12, 0x82, 0x12, 0x82, 0x9d, 0xbf, 0xff, /* ........ */ -0x97, 0x08, 0x10, 0x09, 0x27 /* ....' */ + 0x42, 0xca, 0x00, + 0x8e, 0x27, 0x3f, 0x00, 0x21, /* B...'?.! */ + 0xaf, 0x01, 0x50, 0x06, 0x1e, 0xf4, 0x5f, 0x05, /* ..P..._. */ + 0x27, 0x1e, 0x23, 0x0d, 0xcf, 0x06, 0x1c, 0x1a, /* '.#..... */ + 0x54, 0x48, 0xcf, 0xdf, 0x2d, 0x00, 0x5b, 0xdf, /* TH..-.[. */ + 0x21, 0x09, 0x27, 0x1f, 0x22, 0xbf, 0x22, 0x1a, /* !.'.".". */ + 0x27, 0xc0, 0x2e, 0x96, 0xdf, 0x7f, 0x1f, 0x02, /* '....... */ + 0x54, 0x3f, 0x20, 0xc0, 0x2e, 0x96, 0xbf, 0x59, /* T? ....Y */ + 0x80, 0x40, 0x2e, 0x97, 0xbf, 0xc0, 0x2e, 0x95, /* .@...... */ + 0xdf, 0x76, 0x80, 0x1e, 0xbf, 0x0c, 0x42, 0x02, /* .v....B. */ + 0x5b, 0x9f, 0x22, 0x40, 0x2e, 0x96, 0xbf, 0x05, /* [."@.... */ + 0x27, 0x0d, 0xcf, 0x06, 0x1c, 0x06, 0x1e, 0x00, /* '....... */ + 0x54, 0x0d, 0x27, 0x0c, 0x27, 0x09, 0x46, 0x0d, /* T.'.'.F. */ + 0x5b, 0x02, 0x2e, 0x38, 0x86, 0x07, 0x52, 0x0f, /* [..8..R. */ + 0xcf, 0x01, 0x16, 0x02, 0x53, 0x02, 0x2e, 0xfe, /* ....S... */ + 0x87, 0x04, 0x50, 0xf4, 0xaf, 0x02, 0x50, 0xf2, /* ..P...P. */ + 0xcf, 0x02, 0x10, 0x0f, 0xaf, 0x05, 0x27, 0x5a, /* ......'Z */ + 0xcf, 0xdf, 0x22, 0x10, 0x54, 0x3e, 0xdf, 0x3f, /* ..".T>.? */ + 0x20, 0x3f, 0x1f, 0x0a, 0x52, 0xbf, 0x22, 0x3e, /* ?..R."> */ + 0xbf, 0x3d, 0xdf, 0x3f, 0x20, 0xdf, 0x03, 0x02, /* .=.? ... */ + 0x52, 0xbf, 0x22, 0x3d, 0xbf, 0x0c, 0x27, 0x3d, /* R."=..'= */ + 0xbf, 0x0d, 0x27, 0x3e, 0xbf, 0x0d, 0x27, 0x0d, /* ..'>..'. */ + 0x27, 0xbf, 0x22, 0x3e, 0xbf, 0x3d, 0xbf, 0x05, /* '.">.=.. */ + 0x27, 0x0f, 0x1c, 0x69, 0xdf, 0xdf, 0x01, 0x00, /* '..i.... */ + 0x53, 0x00, 0xff, 0x05, 0x27, 0x2d, 0x82, 0x40, /* S...'-.@ */ + 0x82, 0x12, 0x82, 0x12, 0x82, 0x9d, 0xbf, 0xff, /* ........ */ + 0x97, 0x08, 0x10, 0x09, 0x27 /* ....' */ }; static const unsigned char pkt233[] = { -0x42, 0x24, 0x00, -0xf2, 0x27, 0x0f, 0x1c, 0x5c, /* B$..'..\ */ -0x46, 0x03, 0x5b, 0x02, 0x1e, 0x04, 0x53, 0x02, /* F.[...S. */ -0xef, 0x02, 0x50, 0x03, 0x1e, 0x00, 0x53, 0x03, /* ..P...S. */ -0xef, 0x69, 0xaf, 0x05, 0x27, 0x14, 0xef, 0xf4, /* .i..'... */ -0xaf, 0x00, 0xef, 0xf5, 0xaf, 0x05, 0x27 /* ......' */ + 0x42, 0x24, 0x00, + 0xf2, 0x27, 0x0f, 0x1c, 0x5c, /* B$..'..\ */ + 0x46, 0x03, 0x5b, 0x02, 0x1e, 0x04, 0x53, 0x02, /* F.[...S. */ + 0xef, 0x02, 0x50, 0x03, 0x1e, 0x00, 0x53, 0x03, /* ..P...S. */ + 0xef, 0x69, 0xaf, 0x05, 0x27, 0x14, 0xef, 0xf4, /* .i..'... */ + 0xaf, 0x00, 0xef, 0xf5, 0xaf, 0x05, 0x27 /* ......' */ }; static const unsigned char pkt235[] = { -0x42, 0xca, 0x00, -0x03, 0x28, 0x0c, 0x42, 0x00, /* B...(.B. */ -0x5b, 0x18, 0x23, 0x00, 0xef, 0x0c, 0xaf, 0x0e, /* [.#..... */ -0xcf, 0xe0, 0x1c, 0x0e, 0xaf, 0x0a, 0x40, 0x02, /* ......@. */ -0x5a, 0x3b, 0x46, 0x00, 0x5a, 0x05, 0x27, 0x37, /* Z;F.Z.'7 */ -0x43, 0xfc, 0x5b, 0x08, 0xef, 0x0c, 0xaf, 0x0d, /* C.[..... */ -0x40, 0x0a, 0x5a, 0xee, 0xcf, 0x64, 0x1e, 0x01, /* @.Z..d.. */ -0x5e, 0x0c, 0x3b, 0x05, 0x27, 0x0d, 0x30, 0x0c, /* ^.;.'.0. */ -0x35, 0xbf, 0x22, 0xc0, 0x2e, 0x96, 0xbf, 0x05, /* 5."..... */ -0x27, 0x0e, 0x45, 0x02, 0x5b, 0x02, 0x2e, 0x30, /* '.E.[..0 */ -0x88, 0x01, 0x50, 0x02, 0x2e, 0x3a, 0x88, 0x0d, /* ..P..:.. */ -0x41, 0x24, 0x5a, 0x0d, 0x42, 0x14, 0x5a, 0x02, /* A$Z.B.Z. */ -0x2e, 0x2f, 0x79, 0x02, 0x2e, 0x8f, 0x88, 0x19, /* ./y..... */ -0xcf, 0xfe, 0x1e, 0x03, 0x5c, 0x0e, 0x3d, 0x0d, /* ....\.=. */ -0x39, 0x0d, 0x3b, 0x0c, 0x27, 0x0d, 0x27, 0x02, /* 9.;.'.'. */ -0x2e, 0xae, 0x88, 0x19, 0xcf, 0x02, 0x1e, 0xf9, /* ........ */ -0x5a, 0x0e, 0x3e, 0x0d, 0x3a, 0x0d, 0x33, 0x0c, /* Z.>.:.3. */ -0x27, 0xe4, 0x37, 0x02, 0x2e, 0x8b, 0x89, 0xe4, /* '.7..... */ -0x3f, 0x02, 0x2e, 0x80, 0x89, 0x0d, 0x45, 0x61, /* ?.....Ea */ -0x5b, 0x18, 0xcf, 0xdf, 0x22, 0x6b, 0x54, 0x0d, /* [..."kT. */ -0x3b, 0x02, 0x2e, 0xab, 0x78, 0x02, 0x2e, 0x8b, /* ;...x... */ -0x89, 0x02, 0x2e, 0x80, 0x89, 0x0d, 0x42, 0x07, /* ......B. */ -0x5a, 0x0d, 0x45, 0x53, 0x5b, 0x18, 0xcf, 0xdf, /* Z.ES[... */ -0x22, 0x5d, 0x54, 0x0d, 0x33, 0x02, 0x2e, 0xab, /* "]T.3... */ -0x78, 0x15, 0xcf, 0x1a, 0xaf, 0xe4, 0x37, 0x02, /* x.....7. */ -0x2e, 0x8b, 0x89, 0x15, 0xcf, 0x1b, 0xaf, 0xe4, /* ........ */ -0x3f, 0x0d, 0xcf, 0x60, 0x1c /* ?..`. */ + 0x42, 0xca, 0x00, + 0x03, 0x28, 0x0c, 0x42, 0x00, /* B...(.B. */ + 0x5b, 0x18, 0x23, 0x00, 0xef, 0x0c, 0xaf, 0x0e, /* [.#..... */ + 0xcf, 0xe0, 0x1c, 0x0e, 0xaf, 0x0a, 0x40, 0x02, /* ......@. */ + 0x5a, 0x3b, 0x46, 0x00, 0x5a, 0x05, 0x27, 0x37, /* Z;F.Z.'7 */ + 0x43, 0xfc, 0x5b, 0x08, 0xef, 0x0c, 0xaf, 0x0d, /* C.[..... */ + 0x40, 0x0a, 0x5a, 0xee, 0xcf, 0x64, 0x1e, 0x01, /* @.Z..d.. */ + 0x5e, 0x0c, 0x3b, 0x05, 0x27, 0x0d, 0x30, 0x0c, /* ^.;.'.0. */ + 0x35, 0xbf, 0x22, 0xc0, 0x2e, 0x96, 0xbf, 0x05, /* 5."..... */ + 0x27, 0x0e, 0x45, 0x02, 0x5b, 0x02, 0x2e, 0x30, /* '.E.[..0 */ + 0x88, 0x01, 0x50, 0x02, 0x2e, 0x3a, 0x88, 0x0d, /* ..P..:.. */ + 0x41, 0x24, 0x5a, 0x0d, 0x42, 0x14, 0x5a, 0x02, /* A$Z.B.Z. */ + 0x2e, 0x2f, 0x79, 0x02, 0x2e, 0x8f, 0x88, 0x19, /* ./y..... */ + 0xcf, 0xfe, 0x1e, 0x03, 0x5c, 0x0e, 0x3d, 0x0d, /* ....\.=. */ + 0x39, 0x0d, 0x3b, 0x0c, 0x27, 0x0d, 0x27, 0x02, /* 9.;.'.'. */ + 0x2e, 0xae, 0x88, 0x19, 0xcf, 0x02, 0x1e, 0xf9, /* ........ */ + 0x5a, 0x0e, 0x3e, 0x0d, 0x3a, 0x0d, 0x33, 0x0c, /* Z.>.:.3. */ + 0x27, 0xe4, 0x37, 0x02, 0x2e, 0x8b, 0x89, 0xe4, /* '.7..... */ + 0x3f, 0x02, 0x2e, 0x80, 0x89, 0x0d, 0x45, 0x61, /* ?.....Ea */ + 0x5b, 0x18, 0xcf, 0xdf, 0x22, 0x6b, 0x54, 0x0d, /* [..."kT. */ + 0x3b, 0x02, 0x2e, 0xab, 0x78, 0x02, 0x2e, 0x8b, /* ;...x... */ + 0x89, 0x02, 0x2e, 0x80, 0x89, 0x0d, 0x42, 0x07, /* ......B. */ + 0x5a, 0x0d, 0x45, 0x53, 0x5b, 0x18, 0xcf, 0xdf, /* Z.ES[... */ + 0x22, 0x5d, 0x54, 0x0d, 0x33, 0x02, 0x2e, 0xab, /* "]T.3... */ + 0x78, 0x15, 0xcf, 0x1a, 0xaf, 0xe4, 0x37, 0x02, /* x.....7. */ + 0x2e, 0x8b, 0x89, 0x15, 0xcf, 0x1b, 0xaf, 0xe4, /* ........ */ + 0x3f, 0x0d, 0xcf, 0x60, 0x1c /* ?..`. */ }; static const unsigned char pkt237[] = { -0x42, 0xca, 0x00, -0x67, 0x28, 0xdf, 0x22, 0x01, /* B..g(.". */ -0x55, 0x02, 0x2e, 0xdf, 0x78, 0x16, 0xcf, 0x13, /* U...x... */ -0xdf, 0x2a, 0x1e, 0x00, 0x2e, 0x04, 0x5f, 0x2a, /* .*...._* */ -0x1f, 0x00, 0x2e, 0x01, 0x5f, 0x02, 0x2e, 0xdf, /* ...._... */ -0x78, 0xbf, 0x03, 0x40, 0x54, 0x20, 0x52, 0x02, /* x..@T R. */ -0x2e, 0x80, 0x89, 0x9f, 0x22, 0x1a, 0xaf, 0x18, /* ...."... */ -0xcf, 0x12, 0xdf, 0xbf, 0x03, 0x00, 0x53, 0x29, /* ......S) */ -0x50, 0x02, 0x2e, 0x8f, 0x88, 0x02, 0x2e, 0x74, /* P......t */ -0x89, 0x9f, 0x22, 0x1b, 0xaf, 0x02, 0x2e, 0x2e, /* .."..... */ -0x88, 0x02, 0x2e, 0xab, 0x78, 0x0e, 0xcf, 0x9f, /* ....x... */ -0x1c, 0x0e, 0xaf, 0x05, 0x27, 0x0e, 0xcf, 0x5f, /* ....'.._ */ -0x2d, 0x05, 0x5a, 0x9f, 0x2b, 0x5f, 0x29, 0x0e, /* -.Z.+_). */ -0xaf, 0x5f, 0xff, 0x1d, 0xbf, 0x1c, 0x23, 0x05, /* ._....#. */ -0x27, 0x9f, 0x22, 0x1b, 0xaf, 0x18, 0xcf, 0xdf, /* '."..... */ -0x22, 0x0c, 0x54, 0x18, 0xcf, 0x12, 0xdf, 0xbf, /* ".T..... */ -0x03, 0x00, 0x53, 0x07, 0x50, 0x02, 0x2e, 0xae, /* ..S.P... */ -0x88, 0x02, 0x2e, 0x7a, 0x89, 0x9f, 0x22, 0x1a, /* ...z..". */ -0xaf, 0x02, 0x2e, 0x38, 0x88, 0x02, 0x2e, 0xbc, /* ...8.... */ -0x88, 0x05, 0x27, 0x0e, 0xcf, 0x9f, 0x2d, 0x05, /* ..'...-. */ -0x5a, 0x9f, 0x29, 0x5f, 0x2b, 0x0e, 0xaf, 0x00, /* Z.)_+... */ -0xff, 0x1d, 0xbf, 0x1c, 0x23, 0x05, 0x27, 0x02, /* ....#.'. */ -0x2e, 0x64, 0x89, 0x02, 0x2e, 0xc4, 0x78, 0x0d, /* .d....x. */ -0x45, 0x20, 0x5b, 0x02, 0x2e, 0x64, 0x89, 0x18, /* E [..d.. */ -0xcf, 0x12, 0xdf, 0xbf, 0x03, 0x6a, 0x53, 0x0d, /* .....jS. */ -0x44, 0x02, 0x5b, 0x0c, 0x35, 0x02, 0x2e, 0xd6, /* D.[.5... */ -0x78, 0x17, 0xcf, 0xdf, 0x22 /* x..." */ + 0x42, 0xca, 0x00, + 0x67, 0x28, 0xdf, 0x22, 0x01, /* B..g(.". */ + 0x55, 0x02, 0x2e, 0xdf, 0x78, 0x16, 0xcf, 0x13, /* U...x... */ + 0xdf, 0x2a, 0x1e, 0x00, 0x2e, 0x04, 0x5f, 0x2a, /* .*...._* */ + 0x1f, 0x00, 0x2e, 0x01, 0x5f, 0x02, 0x2e, 0xdf, /* ...._... */ + 0x78, 0xbf, 0x03, 0x40, 0x54, 0x20, 0x52, 0x02, /* x..@T R. */ + 0x2e, 0x80, 0x89, 0x9f, 0x22, 0x1a, 0xaf, 0x18, /* ...."... */ + 0xcf, 0x12, 0xdf, 0xbf, 0x03, 0x00, 0x53, 0x29, /* ......S) */ + 0x50, 0x02, 0x2e, 0x8f, 0x88, 0x02, 0x2e, 0x74, /* P......t */ + 0x89, 0x9f, 0x22, 0x1b, 0xaf, 0x02, 0x2e, 0x2e, /* .."..... */ + 0x88, 0x02, 0x2e, 0xab, 0x78, 0x0e, 0xcf, 0x9f, /* ....x... */ + 0x1c, 0x0e, 0xaf, 0x05, 0x27, 0x0e, 0xcf, 0x5f, /* ....'.._ */ + 0x2d, 0x05, 0x5a, 0x9f, 0x2b, 0x5f, 0x29, 0x0e, /* -.Z.+_). */ + 0xaf, 0x5f, 0xff, 0x1d, 0xbf, 0x1c, 0x23, 0x05, /* ._....#. */ + 0x27, 0x9f, 0x22, 0x1b, 0xaf, 0x18, 0xcf, 0xdf, /* '."..... */ + 0x22, 0x0c, 0x54, 0x18, 0xcf, 0x12, 0xdf, 0xbf, /* ".T..... */ + 0x03, 0x00, 0x53, 0x07, 0x50, 0x02, 0x2e, 0xae, /* ..S.P... */ + 0x88, 0x02, 0x2e, 0x7a, 0x89, 0x9f, 0x22, 0x1a, /* ...z..". */ + 0xaf, 0x02, 0x2e, 0x38, 0x88, 0x02, 0x2e, 0xbc, /* ...8.... */ + 0x88, 0x05, 0x27, 0x0e, 0xcf, 0x9f, 0x2d, 0x05, /* ..'...-. */ + 0x5a, 0x9f, 0x29, 0x5f, 0x2b, 0x0e, 0xaf, 0x00, /* Z.)_+... */ + 0xff, 0x1d, 0xbf, 0x1c, 0x23, 0x05, 0x27, 0x02, /* ....#.'. */ + 0x2e, 0x64, 0x89, 0x02, 0x2e, 0xc4, 0x78, 0x0d, /* .d....x. */ + 0x45, 0x20, 0x5b, 0x02, 0x2e, 0x64, 0x89, 0x18, /* E [..d.. */ + 0xcf, 0x12, 0xdf, 0xbf, 0x03, 0x6a, 0x53, 0x0d, /* .....jS. */ + 0x44, 0x02, 0x5b, 0x0c, 0x35, 0x02, 0x2e, 0xd6, /* D.[.5... */ + 0x78, 0x17, 0xcf, 0xdf, 0x22 /* x..." */ }; static const unsigned char pkt239[] = { -0x42, 0xca, 0x00, -0xcb, 0x28, 0x09, 0x55, 0x18, /* B...(.U. */ -0xcf, 0xdf, 0x22, 0x06, 0x55, 0x02, 0x2e, 0xdc, /* ..".U... */ -0x88, 0x0e, 0x3b, 0x0c, 0xdf, 0x24, 0x19, 0x0c, /* ..;..$.. */ -0xbf, 0x05, 0x27, 0x11, 0xcf, 0xff, 0x1e, 0x01, /* ..'..... */ -0x54, 0x1f, 0x20, 0x11, 0xaf, 0x05, 0x27, 0x1a, /* T. ...'. */ -0x23, 0x1b, 0x23, 0x05, 0x27, 0x02, 0x2e, 0xdc, /* #.#.'... */ -0x88, 0x02, 0x2e, 0xf2, 0x88, 0x02, 0x2e, 0x64, /* .......d */ -0x89, 0x02, 0x2e, 0xb4, 0x87, 0x37, 0x5a, 0x0a, /* .....7Z. */ -0xcf, 0xc0, 0x1c, 0xc0, 0x1e, 0x0e, 0x55, 0x9f, /* ......U. */ -0x22, 0x1f, 0xaf, 0x20, 0xaf, 0x19, 0xaf, 0x02, /* ".. .... */ -0x2e, 0x0f, 0x79, 0x0e, 0xcf, 0x05, 0x18, 0x0e, /* ..y..... */ -0xaf, 0x9f, 0x22, 0x47, 0xaf, 0x48, 0xaf, 0x17, /* .."G.H.. */ -0xaf, 0x18, 0xaf, 0x05, 0x27, 0x20, 0xcf, 0xdf, /* ....' .. */ -0x22, 0x06, 0x54, 0x05, 0x1e, 0x1b, 0x55, 0x1f, /* ".T...U. */ -0xdf, 0x80, 0x1f, 0x18, 0x5e, 0x02, 0x2e, 0x08, /* ....^... */ -0x79, 0x1f, 0xdf, 0x10, 0x1f, 0x13, 0x5e, 0x9f, /* y.....^. */ -0x22, 0x20, 0xaf, 0x1f, 0xaf, 0x0a, 0xcf, 0xc0, /* " ...... */ -0x1c, 0x80, 0x1e, 0x0a, 0x55, 0x0d, 0x41, 0x01, /* ....U.A. */ -0x5a, 0x0e, 0x35, 0x00, 0x50, 0x0e, 0x36, 0x0d, /* Z.5.P.6. */ -0xcf, 0x06, 0x18, 0x0d, 0xaf, 0x0e, 0x31, 0x9f, /* ......1. */ -0x22, 0x19, 0xaf, 0x02, 0x2e, 0x20, 0x79, 0x1f, /* ".... y. */ -0x20, 0x06, 0x1e, 0x00, 0x5e, 0x20, 0xaf, 0x0d, /* ...^ .. */ -0x47, 0x0c, 0x5b, 0x51, 0xef, 0x0c, 0xaf, 0x0e, /* G.[Q.... */ -0xcf, 0xfa, 0x1c, 0x0e, 0xaf, 0x20, 0xcf, 0xdf, /* ..... .. */ -0x22, 0x03, 0x54, 0x06, 0x1e, 0x01, 0x54, 0x5f, /* ".T...T_ */ -0x20, 0x20, 0xaf, 0x05, 0x27 /* ..' */ + 0x42, 0xca, 0x00, + 0xcb, 0x28, 0x09, 0x55, 0x18, /* B...(.U. */ + 0xcf, 0xdf, 0x22, 0x06, 0x55, 0x02, 0x2e, 0xdc, /* ..".U... */ + 0x88, 0x0e, 0x3b, 0x0c, 0xdf, 0x24, 0x19, 0x0c, /* ..;..$.. */ + 0xbf, 0x05, 0x27, 0x11, 0xcf, 0xff, 0x1e, 0x01, /* ..'..... */ + 0x54, 0x1f, 0x20, 0x11, 0xaf, 0x05, 0x27, 0x1a, /* T. ...'. */ + 0x23, 0x1b, 0x23, 0x05, 0x27, 0x02, 0x2e, 0xdc, /* #.#.'... */ + 0x88, 0x02, 0x2e, 0xf2, 0x88, 0x02, 0x2e, 0x64, /* .......d */ + 0x89, 0x02, 0x2e, 0xb4, 0x87, 0x37, 0x5a, 0x0a, /* .....7Z. */ + 0xcf, 0xc0, 0x1c, 0xc0, 0x1e, 0x0e, 0x55, 0x9f, /* ......U. */ + 0x22, 0x1f, 0xaf, 0x20, 0xaf, 0x19, 0xaf, 0x02, /* ".. .... */ + 0x2e, 0x0f, 0x79, 0x0e, 0xcf, 0x05, 0x18, 0x0e, /* ..y..... */ + 0xaf, 0x9f, 0x22, 0x47, 0xaf, 0x48, 0xaf, 0x17, /* .."G.H.. */ + 0xaf, 0x18, 0xaf, 0x05, 0x27, 0x20, 0xcf, 0xdf, /* ....' .. */ + 0x22, 0x06, 0x54, 0x05, 0x1e, 0x1b, 0x55, 0x1f, /* ".T...U. */ + 0xdf, 0x80, 0x1f, 0x18, 0x5e, 0x02, 0x2e, 0x08, /* ....^... */ + 0x79, 0x1f, 0xdf, 0x10, 0x1f, 0x13, 0x5e, 0x9f, /* y.....^. */ + 0x22, 0x20, 0xaf, 0x1f, 0xaf, 0x0a, 0xcf, 0xc0, /* " ...... */ + 0x1c, 0x80, 0x1e, 0x0a, 0x55, 0x0d, 0x41, 0x01, /* ....U.A. */ + 0x5a, 0x0e, 0x35, 0x00, 0x50, 0x0e, 0x36, 0x0d, /* Z.5.P.6. */ + 0xcf, 0x06, 0x18, 0x0d, 0xaf, 0x0e, 0x31, 0x9f, /* ......1. */ + 0x22, 0x19, 0xaf, 0x02, 0x2e, 0x20, 0x79, 0x1f, /* ".... y. */ + 0x20, 0x06, 0x1e, 0x00, 0x5e, 0x20, 0xaf, 0x0d, /* ...^ .. */ + 0x47, 0x0c, 0x5b, 0x51, 0xef, 0x0c, 0xaf, 0x0e, /* G.[Q.... */ + 0xcf, 0xfa, 0x1c, 0x0e, 0xaf, 0x20, 0xcf, 0xdf, /* ..... .. */ + 0x22, 0x03, 0x54, 0x06, 0x1e, 0x01, 0x54, 0x5f, /* ".T...T_ */ + 0x20, 0x20, 0xaf, 0x05, 0x27 /* ..' */ }; static const unsigned char pkt241[] = { -0x42, 0xca, 0x00, -0x2f, 0x29, 0x0d, 0x44, 0x0b, /* B../).D. */ -0x5a, 0x0d, 0xcf, 0x06, 0x1c, 0x08, 0x54, 0x0c, /* Z.....T. */ -0x30, 0x48, 0xcf, 0xdf, 0x2d, 0x02, 0x5a, 0x9f, /* 0H..-.Z. */ -0x22, 0x1d, 0xaf, 0x01, 0x50, 0x5f, 0xef, 0x1d, /* "...P_.. */ -0xaf, 0x0c, 0x31, 0x0d, 0x45, 0x13, 0x5b, 0x0a, /* ..1.E.[. */ -0xcf, 0x30, 0x1c, 0x0e, 0x55, 0x0d, 0xcf, 0x06, /* .0..U... */ -0x1c, 0x06, 0x1e, 0x0d, 0x54, 0x11, 0xcf, 0x07, /* ....T... */ -0x1e, 0x03, 0x53, 0x03, 0xef, 0x12, 0xaf, 0x02, /* ..S..... */ -0x2e, 0x54, 0x79, 0x05, 0xef, 0x12, 0xaf, 0x02, /* .Ty..... */ -0x2e, 0x54, 0x79, 0x01, 0xef, 0x12, 0xaf, 0x18, /* .Ty..... */ -0x23, 0x9f, 0x22, 0x11, 0xaf, 0x0d, 0xcf, 0x1f, /* #."..... */ -0x1c, 0x0d, 0xaf, 0x0c, 0xdf, 0x24, 0x19, 0x0c, /* .....$.. */ -0xbf, 0x0a, 0xdf, 0x30, 0x1d, 0x20, 0x1f, 0x01, /* ...0. .. */ -0x55, 0xf9, 0x1c, 0x0d, 0xaf, 0x05, 0x27, 0x17, /* U.....'. */ -0xdf, 0xff, 0x21, 0x47, 0xbf, 0x18, 0xdf, 0x02, /* ..!G.... */ -0x2e, 0xb4, 0x87, 0x03, 0x5b, 0x0e, 0x46, 0x04, /* ....[.F. */ -0x5a, 0x02, 0x2e, 0x71, 0x79, 0x0d, 0x43, 0x00, /* Z..qy.C. */ -0x5a, 0xff, 0x21, 0x48, 0xbf, 0x05, 0x27, 0x19, /* Z.!H..'. */ -0xcf, 0x80, 0x1e, 0x01, 0x54, 0x5f, 0x20, 0x19, /* ....T_ . */ -0xaf, 0x05, 0x27, 0x19, 0xcf, 0x7f, 0x1e, 0x01, /* ..'..... */ -0x54, 0x1f, 0x20, 0x19, 0xaf, 0x05, 0x27, 0x13, /* T. ...'. */ -0xcf, 0x16, 0xaf, 0x15, 0xcf, 0x18, 0xaf, 0x14, /* ........ */ -0xcf, 0x17, 0xaf, 0x0d, 0x3d, 0x0d, 0x46, 0x00, /* ....=.F. */ -0x5b, 0x0d, 0x35, 0x05, 0x27, 0x14, 0x23, 0x15, /* [.5.'.#. */ -0x23, 0xff, 0xef, 0x13, 0xaf, 0x02, 0x2e, 0x98, /* #....... */ -0x89, 0x0d, 0x3e, 0x13, 0xcf /* ..>.. */ + 0x42, 0xca, 0x00, + 0x2f, 0x29, 0x0d, 0x44, 0x0b, /* B../).D. */ + 0x5a, 0x0d, 0xcf, 0x06, 0x1c, 0x08, 0x54, 0x0c, /* Z.....T. */ + 0x30, 0x48, 0xcf, 0xdf, 0x2d, 0x02, 0x5a, 0x9f, /* 0H..-.Z. */ + 0x22, 0x1d, 0xaf, 0x01, 0x50, 0x5f, 0xef, 0x1d, /* "...P_.. */ + 0xaf, 0x0c, 0x31, 0x0d, 0x45, 0x13, 0x5b, 0x0a, /* ..1.E.[. */ + 0xcf, 0x30, 0x1c, 0x0e, 0x55, 0x0d, 0xcf, 0x06, /* .0..U... */ + 0x1c, 0x06, 0x1e, 0x0d, 0x54, 0x11, 0xcf, 0x07, /* ....T... */ + 0x1e, 0x03, 0x53, 0x03, 0xef, 0x12, 0xaf, 0x02, /* ..S..... */ + 0x2e, 0x54, 0x79, 0x05, 0xef, 0x12, 0xaf, 0x02, /* .Ty..... */ + 0x2e, 0x54, 0x79, 0x01, 0xef, 0x12, 0xaf, 0x18, /* .Ty..... */ + 0x23, 0x9f, 0x22, 0x11, 0xaf, 0x0d, 0xcf, 0x1f, /* #."..... */ + 0x1c, 0x0d, 0xaf, 0x0c, 0xdf, 0x24, 0x19, 0x0c, /* .....$.. */ + 0xbf, 0x0a, 0xdf, 0x30, 0x1d, 0x20, 0x1f, 0x01, /* ...0. .. */ + 0x55, 0xf9, 0x1c, 0x0d, 0xaf, 0x05, 0x27, 0x17, /* U.....'. */ + 0xdf, 0xff, 0x21, 0x47, 0xbf, 0x18, 0xdf, 0x02, /* ..!G.... */ + 0x2e, 0xb4, 0x87, 0x03, 0x5b, 0x0e, 0x46, 0x04, /* ....[.F. */ + 0x5a, 0x02, 0x2e, 0x71, 0x79, 0x0d, 0x43, 0x00, /* Z..qy.C. */ + 0x5a, 0xff, 0x21, 0x48, 0xbf, 0x05, 0x27, 0x19, /* Z.!H..'. */ + 0xcf, 0x80, 0x1e, 0x01, 0x54, 0x5f, 0x20, 0x19, /* ....T_ . */ + 0xaf, 0x05, 0x27, 0x19, 0xcf, 0x7f, 0x1e, 0x01, /* ..'..... */ + 0x54, 0x1f, 0x20, 0x19, 0xaf, 0x05, 0x27, 0x13, /* T. ...'. */ + 0xcf, 0x16, 0xaf, 0x15, 0xcf, 0x18, 0xaf, 0x14, /* ........ */ + 0xcf, 0x17, 0xaf, 0x0d, 0x3d, 0x0d, 0x46, 0x00, /* ....=.F. */ + 0x5b, 0x0d, 0x35, 0x05, 0x27, 0x14, 0x23, 0x15, /* [.5.'.#. */ + 0x23, 0xff, 0xef, 0x13, 0xaf, 0x02, 0x2e, 0x98, /* #....... */ + 0x89, 0x0d, 0x3e, 0x13, 0xcf /* ..>.. */ }; static const unsigned char pkt243[] = { -0x42, 0xc0, 0x00, -0x93, 0x29, 0x46, 0xff, 0xbf, /* B...)F.. */ -0x03, 0x00, 0x53, 0x0d, 0x36, 0x05, 0x27, 0x0d, /* ..S.6.'. */ -0xcf, 0x06, 0x1c, 0x06, 0x1e, 0x07, 0x55, 0xe4, /* ......U. */ -0x47, 0x02, 0x5a, 0x1a, 0xcf, 0x02, 0x2e, 0xa5, /* G.Z..... */ -0x79, 0x1b, 0xcf, 0x02, 0x2e, 0xa5, 0x79, 0x18, /* y.....y. */ -0xcf, 0x00, 0x1e, 0x04, 0x55, 0x5d, 0xef, 0x1b, /* ....U].. */ -0xff, 0x02, 0x2e, 0xc0, 0x79, 0x18, 0xcf, 0x01, /* ....y... */ -0x1e, 0x03, 0x55, 0x5e, 0xef, 0x1b, 0xff, 0x02, /* ..U^.... */ -0x2e, 0xc0, 0x79, 0x02, 0x1e, 0x03, 0x55, 0x61, /* ..y...Ua */ -0xef, 0x1b, 0xff, 0x02, 0x2e, 0xc0, 0x79, 0x03, /* ......y. */ -0x1e, 0x03, 0x55, 0x66, 0xef, 0x1b, 0xff, 0x02, /* ..Uf.... */ -0x2e, 0xc0, 0x79, 0x6d, 0xef, 0x1b, 0xff, 0x1a, /* ..ym.... */ -0x27, 0x07, 0x27, 0xe6, 0xaf, 0xe9, 0xbf, 0x7e, /* '.'....~ */ -0x81, 0xec, 0xcf, 0x13, 0xdf, 0xbf, 0x03, 0x19, /* ........ */ -0x54, 0x0a, 0x5e, 0x13, 0xaf, 0xe9, 0xcf, 0x0f, /* T.^..... */ -0x1c, 0x15, 0xaf, 0xe9, 0xcf, 0x09, 0x27, 0x0f, /* ......'. */ -0x1c, 0xdf, 0x2c, 0x00, 0x5b, 0xf0, 0x18, 0x14, /* ..,.[... */ -0xaf, 0x01, 0x0e, 0x07, 0x27, 0x88, 0x1f, 0xe8, /* ....'... */ -0x55, 0x0d, 0x3e, 0x13, 0xcf, 0x46, 0x1e, 0x04, /* U.>..F.. */ -0x53, 0x0d, 0x36, 0x13, 0xcf, 0x46, 0x1e, 0x00, /* S.6..F.. */ -0x5e, 0x0d, 0x36, 0x05, 0x27, 0xe9, 0xcf, 0x09, /* ^.6.'... */ -0x27, 0xdf, 0x2c, 0x00, 0x5b, 0xdf, 0x21, 0x0f, /* '.,.[.!. */ -0x1c, 0x14, 0xdf, 0xff, 0x2d, 0x00, 0x5b, 0xff, /* ....-.[. */ -0x21, 0xbf, 0x03, 0xe5, 0x53, 0xec, 0xcf, 0x02, /* !...S... */ -0x2e, 0xca, 0x79 /* ..y */ + 0x42, 0xc0, 0x00, + 0x93, 0x29, 0x46, 0xff, 0xbf, /* B...)F.. */ + 0x03, 0x00, 0x53, 0x0d, 0x36, 0x05, 0x27, 0x0d, /* ..S.6.'. */ + 0xcf, 0x06, 0x1c, 0x06, 0x1e, 0x07, 0x55, 0xe4, /* ......U. */ + 0x47, 0x02, 0x5a, 0x1a, 0xcf, 0x02, 0x2e, 0xa5, /* G.Z..... */ + 0x79, 0x1b, 0xcf, 0x02, 0x2e, 0xa5, 0x79, 0x18, /* y.....y. */ + 0xcf, 0x00, 0x1e, 0x04, 0x55, 0x5d, 0xef, 0x1b, /* ....U].. */ + 0xff, 0x02, 0x2e, 0xc0, 0x79, 0x18, 0xcf, 0x01, /* ....y... */ + 0x1e, 0x03, 0x55, 0x5e, 0xef, 0x1b, 0xff, 0x02, /* ..U^.... */ + 0x2e, 0xc0, 0x79, 0x02, 0x1e, 0x03, 0x55, 0x61, /* ..y...Ua */ + 0xef, 0x1b, 0xff, 0x02, 0x2e, 0xc0, 0x79, 0x03, /* ......y. */ + 0x1e, 0x03, 0x55, 0x66, 0xef, 0x1b, 0xff, 0x02, /* ..Uf.... */ + 0x2e, 0xc0, 0x79, 0x6d, 0xef, 0x1b, 0xff, 0x1a, /* ..ym.... */ + 0x27, 0x07, 0x27, 0xe6, 0xaf, 0xe9, 0xbf, 0x7e, /* '.'....~ */ + 0x81, 0xec, 0xcf, 0x13, 0xdf, 0xbf, 0x03, 0x19, /* ........ */ + 0x54, 0x0a, 0x5e, 0x13, 0xaf, 0xe9, 0xcf, 0x0f, /* T.^..... */ + 0x1c, 0x15, 0xaf, 0xe9, 0xcf, 0x09, 0x27, 0x0f, /* ......'. */ + 0x1c, 0xdf, 0x2c, 0x00, 0x5b, 0xf0, 0x18, 0x14, /* ..,.[... */ + 0xaf, 0x01, 0x0e, 0x07, 0x27, 0x88, 0x1f, 0xe8, /* ....'... */ + 0x55, 0x0d, 0x3e, 0x13, 0xcf, 0x46, 0x1e, 0x04, /* U.>..F.. */ + 0x53, 0x0d, 0x36, 0x13, 0xcf, 0x46, 0x1e, 0x00, /* S.6..F.. */ + 0x5e, 0x0d, 0x36, 0x05, 0x27, 0xe9, 0xcf, 0x09, /* ^.6.'... */ + 0x27, 0xdf, 0x2c, 0x00, 0x5b, 0xdf, 0x21, 0x0f, /* '.,.[.!. */ + 0x1c, 0x14, 0xdf, 0xff, 0x2d, 0x00, 0x5b, 0xff, /* ....-.[. */ + 0x21, 0xbf, 0x03, 0xe5, 0x53, 0xec, 0xcf, 0x02, /* !...S... */ + 0x2e, 0xca, 0x79 /* ..y */ }; static const unsigned char pkt245[] = { -0x42, 0x66, 0x00, -0x00, 0x2c, 0x01, 0x2e, 0x65, /* Bf..,..e */ -0x84, 0x08, 0x44, 0x2c, 0x5a, 0xff, 0x0d, 0x48, /* ..D,Z..H */ -0xef, 0x5f, 0x9a, 0x2a, 0xaf, 0x02, 0x2e, 0x75, /* ._.*...u */ -0x80, 0xdf, 0x96, 0x26, 0x40, 0x07, 0x5b, 0xa0, /* ...&@.[. */ -0xcf, 0x30, 0x1c, 0x04, 0x54, 0x20, 0x1e, 0x01, /* .0..T .. */ -0x55, 0x31, 0xff, 0x01, 0x50, 0x00, 0xff, 0x30, /* U1..P..0 */ -0x19, 0xbf, 0x9a, 0x2b, 0xbf, 0xa9, 0xcf, 0x70, /* ...+...p */ -0x1c, 0xa5, 0xdf, 0x0c, 0x1d, 0xff, 0x20, 0xff, /* ...... . */ -0x20, 0x5f, 0x02, 0xff, 0x9a, 0x2c, 0xbf, 0xdd, /* _...,.. */ -0x97, 0x1f, 0x9b, 0x2d, 0xaf, 0x29, 0xcf, 0x09, /* ...-.).. */ -0x27, 0x28, 0xdf, 0x3f, 0x02, 0x9f, 0x9c, 0x6a, /* '(.?...j */ -0xcf, 0x09, 0x27, 0x69, 0xdf, 0x3f, 0x02, 0xdf, /* ..'i.?.. */ -0x9c, 0x6d, 0x2e, 0x6d, 0xdf, 0x1f, 0x9d, 0x05, /* .m.m.... */ -0x27 /* ' */ + 0x42, 0x66, 0x00, + 0x00, 0x2c, 0x01, 0x2e, 0x65, /* Bf..,..e */ + 0x84, 0x08, 0x44, 0x2c, 0x5a, 0xff, 0x0d, 0x48, /* ..D,Z..H */ + 0xef, 0x5f, 0x9a, 0x2a, 0xaf, 0x02, 0x2e, 0x75, /* ._.*...u */ + 0x80, 0xdf, 0x96, 0x26, 0x40, 0x07, 0x5b, 0xa0, /* ...&@.[. */ + 0xcf, 0x30, 0x1c, 0x04, 0x54, 0x20, 0x1e, 0x01, /* .0..T .. */ + 0x55, 0x31, 0xff, 0x01, 0x50, 0x00, 0xff, 0x30, /* U1..P..0 */ + 0x19, 0xbf, 0x9a, 0x2b, 0xbf, 0xa9, 0xcf, 0x70, /* ...+...p */ + 0x1c, 0xa5, 0xdf, 0x0c, 0x1d, 0xff, 0x20, 0xff, /* ...... . */ + 0x20, 0x5f, 0x02, 0xff, 0x9a, 0x2c, 0xbf, 0xdd, /* _...,.. */ + 0x97, 0x1f, 0x9b, 0x2d, 0xaf, 0x29, 0xcf, 0x09, /* ...-.).. */ + 0x27, 0x28, 0xdf, 0x3f, 0x02, 0x9f, 0x9c, 0x6a, /* '(.?...j */ + 0xcf, 0x09, 0x27, 0x69, 0xdf, 0x3f, 0x02, 0xdf, /* ..'i.?.. */ + 0x9c, 0x6d, 0x2e, 0x6d, 0xdf, 0x1f, 0x9d, 0x05, /* .m.m.... */ + 0x27 /* ' */ }; static const unsigned char pkt247[] = { -0x42, 0x2c, 0x00, -0x32, 0x2c, 0x08, 0x44, 0x11, /* B,.2,.D. */ -0x5a, 0x3f, 0x80, 0x28, 0x0d, 0xe2, 0x97, 0xdf, /* Z?.(.... */ -0x96, 0xe1, 0x97, 0xdf, 0x96, 0x01, 0x2e, 0xbf, /* ........ */ -0x84, 0xfd, 0x0d, 0x29, 0xcf, 0x09, 0x27, 0x28, /* ...)..'( */ -0xdf, 0x3f, 0x02, 0x5f, 0x9f, 0xdd, 0x97, 0x5f, /* .?._..._ */ -0x9f, 0xdd, 0x97, 0x5f, 0x9f, 0x05, 0x27 /* ..._..' */ + 0x42, 0x2c, 0x00, + 0x32, 0x2c, 0x08, 0x44, 0x11, /* B,.2,.D. */ + 0x5a, 0x3f, 0x80, 0x28, 0x0d, 0xe2, 0x97, 0xdf, /* Z?.(.... */ + 0x96, 0xe1, 0x97, 0xdf, 0x96, 0x01, 0x2e, 0xbf, /* ........ */ + 0x84, 0xfd, 0x0d, 0x29, 0xcf, 0x09, 0x27, 0x28, /* ...)..'( */ + 0xdf, 0x3f, 0x02, 0x5f, 0x9f, 0xdd, 0x97, 0x5f, /* .?._..._ */ + 0x9f, 0xdd, 0x97, 0x5f, 0x9f, 0x05, 0x27 /* ..._..' */ }; static const unsigned char pkt249[] = { -0x42, 0xca, 0x00, -0x47, 0x2c, 0xfe, 0xcf, 0x58, /* B..G,..X */ -0xaf, 0xfe, 0xcf, 0xfe, 0xdf, 0x02, 0x2e, 0xde, /* ........ */ -0x8c, 0xfe, 0xcf, 0x3c, 0xaf, 0x07, 0x3d, 0x58, /* ...<..=X */ -0x40, 0x4e, 0x5a, 0x3c, 0x26, 0x4c, 0x55, 0x37, /* @NZ<&LU7 */ -0x45, 0x4a, 0x5a, 0x02, 0x2e, 0x5c, 0x8d, 0x47, /* EJZ..\.G */ -0x5a, 0x02, 0x2e, 0xee, 0x8c, 0x00, 0x2e, 0xb9, /* Z....... */ -0x8d, 0xfe, 0xef, 0x16, 0x80, 0x02, 0xcf, 0xdf, /* ........ */ -0x96, 0x61, 0xef, 0xc0, 0xaf, 0x04, 0x27, 0xc1, /* .a....'. */ -0x46, 0x04, 0x5b, 0xc0, 0x3e, 0x40, 0xef, 0xc1, /* F.[.>@.. */ -0xaf, 0x01, 0x2e, 0x8d, 0x8b, 0xd0, 0x41, 0x07, /* ......A. */ -0x5b, 0x02, 0x2e, 0x9e, 0x8c, 0xf2, 0x5b, 0xae, /* [.....[. */ -0x87, 0xdd, 0x97, 0x1f, 0x2d, 0x06, 0x5b, 0x03, /* ....-.[. */ -0x50, 0x01, 0x0c, 0x02, 0xcf, 0xc0, 0x1c, 0x01, /* P....... */ -0x55, 0x02, 0x2e, 0x81, 0x8c, 0xc0, 0x23, 0x20, /* U.....# */ -0xef, 0xc1, 0xaf, 0x00, 0x2e, 0xd8, 0x8d, 0x05, /* ........ */ -0x27, 0x9b, 0x22, 0x37, 0x45, 0x05, 0x5a, 0x41, /* '."7E.ZA */ -0x2e, 0x52, 0xdf, 0xdf, 0x2d, 0x04, 0x5b, 0x00, /* .R..-.[. */ -0x28, 0x02, 0x50, 0x3b, 0x43, 0x00, 0x5b, 0x00, /* (.P;C.[. */ -0x28, 0xd3, 0xdf, 0xc6, 0x2e, 0x15, 0xbf, 0xd3, /* (....... */ -0x3c, 0x40, 0xef, 0x09, 0x80, 0xdd, 0x97, 0xff, /* <@...... */ -0xaf, 0x00, 0x2e, 0xa7, 0x8a, 0xc6, 0x2e, 0x15, /* ........ */ -0xdf, 0x10, 0x1d, 0xd3, 0xcf, 0x3f, 0x02, 0xd3, /* .....?.. */ -0xaf, 0x05, 0x27, 0xed, 0x83, 0x07, 0x45, 0x05, /* ..'...E. */ -0x27, 0x3d, 0x23, 0x07, 0x3d, 0x02, 0xcf, 0xdf, /* '=#.=... */ -0x96, 0x02, 0x2e, 0xee, 0x8c, 0x02, 0x2e, 0xd7, /* ........ */ -0x8c, 0xfe, 0xef, 0x16, 0x80 /* ..... */ + 0x42, 0xca, 0x00, + 0x47, 0x2c, 0xfe, 0xcf, 0x58, /* B..G,..X */ + 0xaf, 0xfe, 0xcf, 0xfe, 0xdf, 0x02, 0x2e, 0xde, /* ........ */ + 0x8c, 0xfe, 0xcf, 0x3c, 0xaf, 0x07, 0x3d, 0x58, /* ...<..=X */ + 0x40, 0x4e, 0x5a, 0x3c, 0x26, 0x4c, 0x55, 0x37, /* @NZ<&LU7 */ + 0x45, 0x4a, 0x5a, 0x02, 0x2e, 0x5c, 0x8d, 0x47, /* EJZ..\.G */ + 0x5a, 0x02, 0x2e, 0xee, 0x8c, 0x00, 0x2e, 0xb9, /* Z....... */ + 0x8d, 0xfe, 0xef, 0x16, 0x80, 0x02, 0xcf, 0xdf, /* ........ */ + 0x96, 0x61, 0xef, 0xc0, 0xaf, 0x04, 0x27, 0xc1, /* .a....'. */ + 0x46, 0x04, 0x5b, 0xc0, 0x3e, 0x40, 0xef, 0xc1, /* F.[.>@.. */ + 0xaf, 0x01, 0x2e, 0x8d, 0x8b, 0xd0, 0x41, 0x07, /* ......A. */ + 0x5b, 0x02, 0x2e, 0x9e, 0x8c, 0xf2, 0x5b, 0xae, /* [.....[. */ + 0x87, 0xdd, 0x97, 0x1f, 0x2d, 0x06, 0x5b, 0x03, /* ....-.[. */ + 0x50, 0x01, 0x0c, 0x02, 0xcf, 0xc0, 0x1c, 0x01, /* P....... */ + 0x55, 0x02, 0x2e, 0x81, 0x8c, 0xc0, 0x23, 0x20, /* U.....# */ + 0xef, 0xc1, 0xaf, 0x00, 0x2e, 0xd8, 0x8d, 0x05, /* ........ */ + 0x27, 0x9b, 0x22, 0x37, 0x45, 0x05, 0x5a, 0x41, /* '."7E.ZA */ + 0x2e, 0x52, 0xdf, 0xdf, 0x2d, 0x04, 0x5b, 0x00, /* .R..-.[. */ + 0x28, 0x02, 0x50, 0x3b, 0x43, 0x00, 0x5b, 0x00, /* (.P;C.[. */ + 0x28, 0xd3, 0xdf, 0xc6, 0x2e, 0x15, 0xbf, 0xd3, /* (....... */ + 0x3c, 0x40, 0xef, 0x09, 0x80, 0xdd, 0x97, 0xff, /* <@...... */ + 0xaf, 0x00, 0x2e, 0xa7, 0x8a, 0xc6, 0x2e, 0x15, /* ........ */ + 0xdf, 0x10, 0x1d, 0xd3, 0xcf, 0x3f, 0x02, 0xd3, /* .....?.. */ + 0xaf, 0x05, 0x27, 0xed, 0x83, 0x07, 0x45, 0x05, /* ..'...E. */ + 0x27, 0x3d, 0x23, 0x07, 0x3d, 0x02, 0xcf, 0xdf, /* '=#.=... */ + 0x96, 0x02, 0x2e, 0xee, 0x8c, 0x02, 0x2e, 0xd7, /* ........ */ + 0x8c, 0xfe, 0xef, 0x16, 0x80 /* ..... */ }; static const unsigned char pkt251[] = { -0x42, 0xca, 0x00, -0xab, 0x2c, 0x05, 0xef, 0xc0, /* B...,... */ -0xaf, 0x04, 0x27, 0xd0, 0x41, 0x03, 0x5b, 0x02, /* ..'.A.[. */ -0x2e, 0x9e, 0x8c, 0xf9, 0x5b, 0xbb, 0x50, 0x27, /* ....[.P' */ -0x82, 0x04, 0xef, 0xc1, 0xaf, 0x9b, 0x22, 0x02, /* ......". */ -0x2e, 0x12, 0x8d, 0xdd, 0x97, 0xdf, 0x22, 0x02, /* ......". */ -0x55, 0x58, 0x40, 0x02, 0x5a, 0x0b, 0x50, 0x58, /* UX@.Z.PX */ -0x40, 0x09, 0x5a, 0xdd, 0x97, 0x1f, 0x2d, 0xb3, /* @.Z...-. */ -0x5a, 0x02, 0x2e, 0x5d, 0x8d, 0xb2, 0x5b, 0x9b, /* Z..]..[. */ -0x22, 0x02, 0x2e, 0x8d, 0x8c, 0xae, 0x50, 0x02, /* ".....P. */ -0x2e, 0x5d, 0x8d, 0xd5, 0x5b, 0x02, 0x2e, 0x81, /* .]..[... */ -0x8c, 0x58, 0x41, 0x02, 0x5b, 0x01, 0x0c, 0x02, /* .XA.[... */ -0x2e, 0x7b, 0x7c, 0xcd, 0x50, 0x41, 0x2e, 0x52, /* .{|.PA.R */ -0xdf, 0xed, 0x1c, 0x04, 0x18, 0x41, 0x2e, 0x52, /* .....A.R */ -0xbf, 0x05, 0x27, 0x1a, 0x27, 0x56, 0xdf, 0x59, /* ..'.'V.Y */ -0x80, 0xdf, 0x22, 0x00, 0x54, 0x01, 0x16, 0x3f, /* ..".T..? */ -0x1e, 0x00, 0x5f, 0x3f, 0xef, 0x1f, 0x22, 0x1f, /* .._?..". */ -0x22, 0xaf, 0xdf, 0x03, 0x1d, 0x5f, 0x02, 0xaf, /* "...._.. */ -0xbf, 0x05, 0x27, 0x00, 0x2e, 0xa1, 0x8d, 0xae, /* ..'..... */ -0xdf, 0xe0, 0x19, 0xae, 0xbf, 0x57, 0x40, 0x00, /* .....W@. */ -0x5b, 0xa1, 0x32, 0x57, 0x43, 0x00, 0x5b, 0xae, /* [.2WC.[. */ -0x3f, 0xed, 0x80, 0x05, 0x27, 0x41, 0x2e, 0x52, /* ?...'A.R */ -0xdf, 0x03, 0x18, 0x41, 0x2e, 0x52, 0xbf, 0x05, /* ...A.R.. */ -0x27, 0xd3, 0xdf, 0xff, 0x96, 0x9b, 0x22, 0x02, /* '.....". */ -0x2e, 0x12, 0x8d, 0xd3, 0x3c, 0x07, 0x80, 0xdd, /* ....<... */ -0x97, 0xff, 0xaf, 0x00, 0x2e, 0xa7, 0x8a, 0xdd, /* ........ */ -0x9f, 0x10, 0x1d, 0xd3, 0xcf /* ..... */ + 0x42, 0xca, 0x00, + 0xab, 0x2c, 0x05, 0xef, 0xc0, /* B...,... */ + 0xaf, 0x04, 0x27, 0xd0, 0x41, 0x03, 0x5b, 0x02, /* ..'.A.[. */ + 0x2e, 0x9e, 0x8c, 0xf9, 0x5b, 0xbb, 0x50, 0x27, /* ....[.P' */ + 0x82, 0x04, 0xef, 0xc1, 0xaf, 0x9b, 0x22, 0x02, /* ......". */ + 0x2e, 0x12, 0x8d, 0xdd, 0x97, 0xdf, 0x22, 0x02, /* ......". */ + 0x55, 0x58, 0x40, 0x02, 0x5a, 0x0b, 0x50, 0x58, /* UX@.Z.PX */ + 0x40, 0x09, 0x5a, 0xdd, 0x97, 0x1f, 0x2d, 0xb3, /* @.Z...-. */ + 0x5a, 0x02, 0x2e, 0x5d, 0x8d, 0xb2, 0x5b, 0x9b, /* Z..]..[. */ + 0x22, 0x02, 0x2e, 0x8d, 0x8c, 0xae, 0x50, 0x02, /* ".....P. */ + 0x2e, 0x5d, 0x8d, 0xd5, 0x5b, 0x02, 0x2e, 0x81, /* .]..[... */ + 0x8c, 0x58, 0x41, 0x02, 0x5b, 0x01, 0x0c, 0x02, /* .XA.[... */ + 0x2e, 0x7b, 0x7c, 0xcd, 0x50, 0x41, 0x2e, 0x52, /* .{|.PA.R */ + 0xdf, 0xed, 0x1c, 0x04, 0x18, 0x41, 0x2e, 0x52, /* .....A.R */ + 0xbf, 0x05, 0x27, 0x1a, 0x27, 0x56, 0xdf, 0x59, /* ..'.'V.Y */ + 0x80, 0xdf, 0x22, 0x00, 0x54, 0x01, 0x16, 0x3f, /* ..".T..? */ + 0x1e, 0x00, 0x5f, 0x3f, 0xef, 0x1f, 0x22, 0x1f, /* .._?..". */ + 0x22, 0xaf, 0xdf, 0x03, 0x1d, 0x5f, 0x02, 0xaf, /* "...._.. */ + 0xbf, 0x05, 0x27, 0x00, 0x2e, 0xa1, 0x8d, 0xae, /* ..'..... */ + 0xdf, 0xe0, 0x19, 0xae, 0xbf, 0x57, 0x40, 0x00, /* .....W@. */ + 0x5b, 0xa1, 0x32, 0x57, 0x43, 0x00, 0x5b, 0xae, /* [.2WC.[. */ + 0x3f, 0xed, 0x80, 0x05, 0x27, 0x41, 0x2e, 0x52, /* ?...'A.R */ + 0xdf, 0x03, 0x18, 0x41, 0x2e, 0x52, 0xbf, 0x05, /* ...A.R.. */ + 0x27, 0xd3, 0xdf, 0xff, 0x96, 0x9b, 0x22, 0x02, /* '.....". */ + 0x2e, 0x12, 0x8d, 0xd3, 0x3c, 0x07, 0x80, 0xdd, /* ....<... */ + 0x97, 0xff, 0xaf, 0x00, 0x2e, 0xa7, 0x8a, 0xdd, /* ........ */ + 0x9f, 0x10, 0x1d, 0xd3, 0xcf /* ..... */ }; static const unsigned char pkt253[] = { -0x42, 0xb4, 0x00, -0x0f, 0x2d, 0x3f, 0x02, 0xd3, /* B...-?.. */ -0xaf, 0x05, 0x27, 0x37, 0x45, 0x10, 0x5a, 0x02, /* ..'7E.Z. */ -0x2e, 0x5c, 0x8d, 0x0d, 0x5a, 0x02, 0x2e, 0xee, /* .\..Z... */ -0x8c, 0x00, 0x2e, 0xbf, 0x8d, 0x00, 0x2e, 0xd3, /* ........ */ -0x8d, 0x41, 0x2e, 0x52, 0xdf, 0xdf, 0x2d, 0x00, /* .A.R..-. */ -0x5b, 0x00, 0x28, 0x00, 0x2e, 0xd8, 0x8d, 0x05, /* [.(..... */ -0x27, 0xf9, 0xcf, 0xdf, 0x96, 0xf9, 0x3d, 0x01, /* '.....=. */ -0x2e, 0x06, 0x82, 0x2d, 0xff, 0xa7, 0xef, 0xe1, /* ...-.... */ -0xbf, 0xe0, 0xaf, 0x09, 0xef, 0x10, 0xaf, 0x01, /* ........ */ -0x2e, 0x94, 0x86, 0xed, 0x80, 0x01, 0x2e, 0x18, /* ........ */ -0x87, 0x01, 0x2e, 0x1a, 0x87, 0x00, 0x2e, 0x16, /* ........ */ -0x82, 0x5b, 0x82, 0x00, 0x2e, 0x2d, 0x82, 0x26, /* .[...-.& */ -0x37, 0x00, 0x5a, 0x0c, 0x50, 0xff, 0x96, 0xdf, /* 7.Z.P... */ -0x96, 0x79, 0xcf, 0x7a, 0xdf, 0xff, 0x96, 0xdf, /* .y.z.... */ -0x96, 0xc2, 0x97, 0xc3, 0x9f, 0x9d, 0x01, 0x5d, /* .......] */ -0x01, 0x07, 0x53, 0xdd, 0x97, 0xdd, 0x9f, 0x79, /* ..S....y */ -0xaf, 0x7a, 0xbf, 0x3b, 0x3b, 0xdd, 0x97, 0xf9, /* .z.;;... */ -0xaf, 0x05, 0x27, 0xff, 0x22, 0x01, 0x55, 0x32, /* ..'.".U2 */ -0x1e, 0xf3, 0x5f, 0x02, 0x0c, 0x02, 0x2e, 0x4f, /* .._....O */ -0x8d, 0x3b, 0x33, 0x00, 0x28, 0x05, 0x27, 0x0d, /* .;3.(.'. */ -0x27, 0x3c, 0x26, 0x07, 0x54, 0x3c, 0xcf, 0x3d, /* '<&.T<.= */ -0xdf, 0x3f, 0x20, 0x3d, 0xbf, 0xdf, 0x03, 0x01, /* .? =.... */ -0x52, 0x3d, 0x23, 0x0c, 0x27, 0x0d, 0x27 /* R=#.'.' */ + 0x42, 0xb4, 0x00, + 0x0f, 0x2d, 0x3f, 0x02, 0xd3, /* B...-?.. */ + 0xaf, 0x05, 0x27, 0x37, 0x45, 0x10, 0x5a, 0x02, /* ..'7E.Z. */ + 0x2e, 0x5c, 0x8d, 0x0d, 0x5a, 0x02, 0x2e, 0xee, /* .\..Z... */ + 0x8c, 0x00, 0x2e, 0xbf, 0x8d, 0x00, 0x2e, 0xd3, /* ........ */ + 0x8d, 0x41, 0x2e, 0x52, 0xdf, 0xdf, 0x2d, 0x00, /* .A.R..-. */ + 0x5b, 0x00, 0x28, 0x00, 0x2e, 0xd8, 0x8d, 0x05, /* [.(..... */ + 0x27, 0xf9, 0xcf, 0xdf, 0x96, 0xf9, 0x3d, 0x01, /* '.....=. */ + 0x2e, 0x06, 0x82, 0x2d, 0xff, 0xa7, 0xef, 0xe1, /* ...-.... */ + 0xbf, 0xe0, 0xaf, 0x09, 0xef, 0x10, 0xaf, 0x01, /* ........ */ + 0x2e, 0x94, 0x86, 0xed, 0x80, 0x01, 0x2e, 0x18, /* ........ */ + 0x87, 0x01, 0x2e, 0x1a, 0x87, 0x00, 0x2e, 0x16, /* ........ */ + 0x82, 0x5b, 0x82, 0x00, 0x2e, 0x2d, 0x82, 0x26, /* .[...-.& */ + 0x37, 0x00, 0x5a, 0x0c, 0x50, 0xff, 0x96, 0xdf, /* 7.Z.P... */ + 0x96, 0x79, 0xcf, 0x7a, 0xdf, 0xff, 0x96, 0xdf, /* .y.z.... */ + 0x96, 0xc2, 0x97, 0xc3, 0x9f, 0x9d, 0x01, 0x5d, /* .......] */ + 0x01, 0x07, 0x53, 0xdd, 0x97, 0xdd, 0x9f, 0x79, /* ..S....y */ + 0xaf, 0x7a, 0xbf, 0x3b, 0x3b, 0xdd, 0x97, 0xf9, /* .z.;;... */ + 0xaf, 0x05, 0x27, 0xff, 0x22, 0x01, 0x55, 0x32, /* ..'.".U2 */ + 0x1e, 0xf3, 0x5f, 0x02, 0x0c, 0x02, 0x2e, 0x4f, /* .._....O */ + 0x8d, 0x3b, 0x33, 0x00, 0x28, 0x05, 0x27, 0x0d, /* .;3.(.'. */ + 0x27, 0x3c, 0x26, 0x07, 0x54, 0x3c, 0xcf, 0x3d, /* '<&.T<.= */ + 0xdf, 0x3f, 0x20, 0x3d, 0xbf, 0xdf, 0x03, 0x01, /* .? =.... */ + 0x52, 0x3d, 0x23, 0x0c, 0x27, 0x0d, 0x27 /* R=#.'.' */ }; static const unsigned char pkt255[] = { -0x42, 0x1a, 0x00, -0x68, 0x2d, 0x09, 0x43, 0x04, /* B..h-.C. */ -0x5b, 0x00, 0xef, 0xf8, 0xaf, 0x32, 0xef, 0xfa, /* [....2.. */ -0xaf, 0x03, 0x50, 0x01, 0xef, 0xf8, 0xaf, 0x42, /* ..P....B */ -0xef, 0xfa, 0xaf, 0x05, 0x27 /* ....' */ + 0x42, 0x1a, 0x00, + 0x68, 0x2d, 0x09, 0x43, 0x04, /* B..h-.C. */ + 0x5b, 0x00, 0xef, 0xf8, 0xaf, 0x32, 0xef, 0xfa, /* [....2.. */ + 0xaf, 0x03, 0x50, 0x01, 0xef, 0xf8, 0xaf, 0x42, /* ..P....B */ + 0xef, 0xfa, 0xaf, 0x05, 0x27 /* ....' */ }; static const unsigned char pkt257[] = { -0x42, 0x26, 0x00, -0x74, 0x2d, 0xd3, 0x45, 0xfd, /* B&.t-.E. */ -0x5a, 0x0f, 0x27, 0xd3, 0x45, 0xfa, 0x5a, 0x0f, /* Z.'.E.Z. */ -0x27, 0xd3, 0x45, 0xf7, 0x5a, 0x0f, 0x27, 0x41, /* '.E.Z.'A */ -0x2e, 0xa1, 0xdf, 0x9f, 0x28, 0x41, 0x2e, 0xa1, /* ....(A.. */ -0xbf, 0x02, 0x2e, 0x58, 0x80, 0x00, 0x2e, 0xcb, /* ...X.... */ -0x7a /* z */ + 0x42, 0x26, 0x00, + 0x74, 0x2d, 0xd3, 0x45, 0xfd, /* B&.t-.E. */ + 0x5a, 0x0f, 0x27, 0xd3, 0x45, 0xfa, 0x5a, 0x0f, /* Z.'.E.Z. */ + 0x27, 0xd3, 0x45, 0xf7, 0x5a, 0x0f, 0x27, 0x41, /* '.E.Z.'A */ + 0x2e, 0xa1, 0xdf, 0x9f, 0x28, 0x41, 0x2e, 0xa1, /* ....(A.. */ + 0xbf, 0x02, 0x2e, 0x58, 0x80, 0x00, 0x2e, 0xcb, /* ...X.... */ + 0x7a /* z */ }; static const unsigned char pkt259[] = { -0x42, 0x16, 0x00, -0x86, 0x2d, 0xd3, 0x45, 0x02, /* B...-.E. */ -0x5a, 0xd3, 0x45, 0x00, 0x5a, 0x05, 0x27, 0xd0, /* Z.E.Z.'. */ -0x41, 0xf8, 0x5b, 0xed, 0x83, 0xf6, 0x50, 0x05, /* A.[...P. */ -0x27 /* ' */ + 0x42, 0x16, 0x00, + 0x86, 0x2d, 0xd3, 0x45, 0x02, /* B...-.E. */ + 0x5a, 0xd3, 0x45, 0x00, 0x5a, 0x05, 0x27, 0xd0, /* Z.E.Z.'. */ + 0x41, 0xf8, 0x5b, 0xed, 0x83, 0xf6, 0x50, 0x05, /* A.[...P. */ + 0x27 /* ' */ }; static const unsigned char pkt261[] = { -0x42, 0x4e, 0x00, -0x90, 0x2d, 0x07, 0x3d, 0x02, /* BN..-.=. */ -0x5b, 0xae, 0x87, 0xc2, 0x23, 0xd3, 0x3c, 0x02, /* [...#.<. */ -0x44, 0xd4, 0x2f, 0xf8, 0x5a, 0x02, 0x45, 0xd5, /* D./.Z.E. */ -0x2f, 0x59, 0x5b, 0x58, 0x23, 0x3c, 0x26, 0x02, /* /Y[X#<&. */ -0x55, 0x02, 0x2e, 0x4f, 0x8c, 0x00, 0x50, 0xff, /* U..O..P. */ -0x8e, 0x07, 0x45, 0xeb, 0x5a, 0x41, 0x2e, 0x53, /* ..E.ZA.S */ -0xdf, 0xc1, 0x2e, 0x79, 0xdf, 0xff, 0x96, 0xdf, /* ...y.... */ -0x96, 0x41, 0x2e, 0x55, 0xdf, 0xc1, 0x2e, 0x78, /* .A.U...x */ -0xdf, 0x9d, 0x01, 0x5d, 0x01, 0xff, 0x22, 0x00, /* ...]..". */ -0x54, 0xff, 0xef, 0x2e, 0xaf, 0xd5, 0x2f, 0x3e, /* T...../> */ -0x50 /* P */ + 0x42, 0x4e, 0x00, + 0x90, 0x2d, 0x07, 0x3d, 0x02, /* BN..-.=. */ + 0x5b, 0xae, 0x87, 0xc2, 0x23, 0xd3, 0x3c, 0x02, /* [...#.<. */ + 0x44, 0xd4, 0x2f, 0xf8, 0x5a, 0x02, 0x45, 0xd5, /* D./.Z.E. */ + 0x2f, 0x59, 0x5b, 0x58, 0x23, 0x3c, 0x26, 0x02, /* /Y[X#<&. */ + 0x55, 0x02, 0x2e, 0x4f, 0x8c, 0x00, 0x50, 0xff, /* U..O..P. */ + 0x8e, 0x07, 0x45, 0xeb, 0x5a, 0x41, 0x2e, 0x53, /* ..E.ZA.S */ + 0xdf, 0xc1, 0x2e, 0x79, 0xdf, 0xff, 0x96, 0xdf, /* ...y.... */ + 0x96, 0x41, 0x2e, 0x55, 0xdf, 0xc1, 0x2e, 0x78, /* .A.U...x */ + 0xdf, 0x9d, 0x01, 0x5d, 0x01, 0xff, 0x22, 0x00, /* ...]..". */ + 0x54, 0xff, 0xef, 0x2e, 0xaf, 0xd5, 0x2f, 0x3e, /* T...../> */ + 0x50 /* P */ }; static const unsigned char pkt263[] = { -0x42, 0xca, 0x00, -0xb6, 0x2d, 0xfa, 0xcf, 0xdf, /* B...-... */ -0x96, 0x37, 0xcf, 0xdf, 0x96, 0x08, 0xcf, 0xdf, /* .7...... */ -0x96, 0x3d, 0xcf, 0xdf, 0x96, 0x77, 0xcf, 0xdf, /* .=...w.. */ -0x96, 0x26, 0xcf, 0xdf, 0x96, 0x26, 0x23, 0x01, /* .&...&#. */ -0x2e, 0x08, 0x82, 0xdd, 0x97, 0x26, 0xaf, 0xdd, /* .....&.. */ -0x97, 0x77, 0xaf, 0xdd, 0x97, 0x3d, 0xaf, 0xdd, /* .w...=.. */ -0x97, 0x08, 0xaf, 0xdd, 0x97, 0x37, 0xaf, 0xdd, /* .....7.. */ -0x97, 0xfa, 0xaf, 0x9f, 0x22, 0x6d, 0x2e, 0x6d, /* ...."m.m */ -0xbf, 0x26, 0x40, 0x3a, 0x5b, 0x73, 0x43, 0x08, /* .&@:[sC. */ -0x5b, 0x73, 0xcf, 0x09, 0x27, 0x0f, 0x1c, 0x10, /* [s..'... */ -0xaf, 0x82, 0xcf, 0x01, 0x2e, 0xf9, 0x81, 0xed, /* ........ */ -0x80, 0x05, 0x50, 0x81, 0xcf, 0x10, 0xaf, 0x82, /* ..P..... */ -0xcf, 0x01, 0x2e, 0xf9, 0x81, 0xed, 0x80, 0xc8, /* ........ */ -0xef, 0x0f, 0xaf, 0x08, 0x31, 0x31, 0xef, 0x0a, /* ....11.. */ -0xaf, 0x9f, 0x22, 0x0d, 0xaf, 0x81, 0xcf, 0x10, /* .."..... */ -0xaf, 0x01, 0x2e, 0x94, 0x86, 0x82, 0xcf, 0x04, /* ........ */ -0x16, 0x01, 0x2e, 0xf9, 0x81, 0xed, 0x80, 0x10, /* ........ */ -0xcf, 0xb0, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x00, /* ...?.... */ -0x13, 0x1a, 0x27, 0xd6, 0x97, 0x82, 0xdf, 0xbf, /* ..'..... */ -0x01, 0x6d, 0x2e, 0x6d, 0xbf, 0x74, 0xcf, 0x02, /* .m.m.t.. */ -0x1e, 0x04, 0x55, 0xa0, 0xcf, 0xcf, 0x1c, 0x10, /* ..U..... */ -0x18, 0xa0, 0xaf, 0x05, 0x50, 0x01, 0x1e, 0x04, /* ....P... */ -0x55, 0xa0, 0xcf, 0xcf, 0x1c, 0x20, 0x18, 0xa0, /* U.... .. */ -0xaf, 0xed, 0x80, 0xfb, 0x39, 0x08, 0x45, 0x00, /* ....9.E. */ -0x5a, 0xfb, 0x31, 0x0a, 0x42, 0x00, 0x5b, 0xa2, /* Z.1.B.[. */ -0x39, 0x02, 0xcf, 0x5c, 0xaf /* 9..\. */ + 0x42, 0xca, 0x00, + 0xb6, 0x2d, 0xfa, 0xcf, 0xdf, /* B...-... */ + 0x96, 0x37, 0xcf, 0xdf, 0x96, 0x08, 0xcf, 0xdf, /* .7...... */ + 0x96, 0x3d, 0xcf, 0xdf, 0x96, 0x77, 0xcf, 0xdf, /* .=...w.. */ + 0x96, 0x26, 0xcf, 0xdf, 0x96, 0x26, 0x23, 0x01, /* .&...&#. */ + 0x2e, 0x08, 0x82, 0xdd, 0x97, 0x26, 0xaf, 0xdd, /* .....&.. */ + 0x97, 0x77, 0xaf, 0xdd, 0x97, 0x3d, 0xaf, 0xdd, /* .w...=.. */ + 0x97, 0x08, 0xaf, 0xdd, 0x97, 0x37, 0xaf, 0xdd, /* .....7.. */ + 0x97, 0xfa, 0xaf, 0x9f, 0x22, 0x6d, 0x2e, 0x6d, /* ...."m.m */ + 0xbf, 0x26, 0x40, 0x3a, 0x5b, 0x73, 0x43, 0x08, /* .&@:[sC. */ + 0x5b, 0x73, 0xcf, 0x09, 0x27, 0x0f, 0x1c, 0x10, /* [s..'... */ + 0xaf, 0x82, 0xcf, 0x01, 0x2e, 0xf9, 0x81, 0xed, /* ........ */ + 0x80, 0x05, 0x50, 0x81, 0xcf, 0x10, 0xaf, 0x82, /* ..P..... */ + 0xcf, 0x01, 0x2e, 0xf9, 0x81, 0xed, 0x80, 0xc8, /* ........ */ + 0xef, 0x0f, 0xaf, 0x08, 0x31, 0x31, 0xef, 0x0a, /* ....11.. */ + 0xaf, 0x9f, 0x22, 0x0d, 0xaf, 0x81, 0xcf, 0x10, /* .."..... */ + 0xaf, 0x01, 0x2e, 0x94, 0x86, 0x82, 0xcf, 0x04, /* ........ */ + 0x16, 0x01, 0x2e, 0xf9, 0x81, 0xed, 0x80, 0x10, /* ........ */ + 0xcf, 0xb0, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x00, /* ...?.... */ + 0x13, 0x1a, 0x27, 0xd6, 0x97, 0x82, 0xdf, 0xbf, /* ..'..... */ + 0x01, 0x6d, 0x2e, 0x6d, 0xbf, 0x74, 0xcf, 0x02, /* .m.m.t.. */ + 0x1e, 0x04, 0x55, 0xa0, 0xcf, 0xcf, 0x1c, 0x10, /* ..U..... */ + 0x18, 0xa0, 0xaf, 0x05, 0x50, 0x01, 0x1e, 0x04, /* ....P... */ + 0x55, 0xa0, 0xcf, 0xcf, 0x1c, 0x20, 0x18, 0xa0, /* U.... .. */ + 0xaf, 0xed, 0x80, 0xfb, 0x39, 0x08, 0x45, 0x00, /* ....9.E. */ + 0x5a, 0xfb, 0x31, 0x0a, 0x42, 0x00, 0x5b, 0xa2, /* Z.1.B.[. */ + 0x39, 0x02, 0xcf, 0x5c, 0xaf /* 9..\. */ }; static const unsigned char pkt265[] = { -0x42, 0x96, 0x00, -0x1a, 0x2e, 0xe1, 0xef, 0x95, /* B....... */ -0xaf, 0x9f, 0x22, 0x61, 0xaf, 0x62, 0xaf, 0x69, /* .."a.b.i */ -0xaf, 0x6a, 0xaf, 0x16, 0xaf, 0x96, 0xaf, 0x29, /* .j.....) */ -0xaf, 0x28, 0xaf, 0xc1, 0x2e, 0x49, 0xdf, 0x3f, /* .(...I.? */ -0x2d, 0x03, 0x5b, 0xa0, 0xcf, 0x8f, 0x1c, 0x20, /* -.[.... */ -0x18, 0xa0, 0xaf, 0xa1, 0xcf, 0xdf, 0x1c, 0xa1, /* ........ */ -0xaf, 0xed, 0x80, 0x02, 0x47, 0x06, 0x5a, 0x0a, /* ....G.Z. */ -0x41, 0x04, 0x5a, 0x0a, 0xdf, 0x30, 0x1d, 0x30, /* A.Z..0.0 */ -0x1f, 0x00, 0x54, 0x01, 0xef, 0x44, 0xaf, 0x09, /* ..T..D.. */ -0xef, 0x60, 0xaf, 0xa7, 0xef, 0x40, 0xaf, 0x2d, /* .`...@.- */ -0xef, 0x41, 0xaf, 0x0a, 0x40, 0x06, 0x5a, 0x10, /* .A..@.Z. */ -0xcf, 0x27, 0xaf, 0xe2, 0x23, 0x6e, 0x23, 0x08, /* .'..#n#. */ -0xef, 0xe3, 0xaf, 0x6f, 0xaf, 0xe2, 0x23, 0x08, /* ...o..#. */ -0xef, 0xe3, 0xaf, 0x79, 0x82, 0x4d, 0xaf, 0xdf, /* ...y.M.. */ -0x96, 0x64, 0xdf, 0x8b, 0x82, 0x93, 0xbf, 0xdd, /* .d...... */ -0x97, 0x77, 0xff, 0x8b, 0x82, 0x94, 0xbf, 0x9e, /* .w...... */ -0x23, 0xe4, 0x23, 0x9f, 0x22, 0x6d, 0x2e, 0x6b, /* #.#."m.k */ -0xbf, 0x6d, 0x2e, 0x6a, 0xbf, 0x6d, 0x2e, 0x6c, /* .m.j.m.l */ -0xbf, 0xa5, 0xcf, 0xf3, 0x1c, 0xa5, 0xaf, 0x05, /* ........ */ -0x27 /* ' */ + 0x42, 0x96, 0x00, + 0x1a, 0x2e, 0xe1, 0xef, 0x95, /* B....... */ + 0xaf, 0x9f, 0x22, 0x61, 0xaf, 0x62, 0xaf, 0x69, /* .."a.b.i */ + 0xaf, 0x6a, 0xaf, 0x16, 0xaf, 0x96, 0xaf, 0x29, /* .j.....) */ + 0xaf, 0x28, 0xaf, 0xc1, 0x2e, 0x49, 0xdf, 0x3f, /* .(...I.? */ + 0x2d, 0x03, 0x5b, 0xa0, 0xcf, 0x8f, 0x1c, 0x20, /* -.[.... */ + 0x18, 0xa0, 0xaf, 0xa1, 0xcf, 0xdf, 0x1c, 0xa1, /* ........ */ + 0xaf, 0xed, 0x80, 0x02, 0x47, 0x06, 0x5a, 0x0a, /* ....G.Z. */ + 0x41, 0x04, 0x5a, 0x0a, 0xdf, 0x30, 0x1d, 0x30, /* A.Z..0.0 */ + 0x1f, 0x00, 0x54, 0x01, 0xef, 0x44, 0xaf, 0x09, /* ..T..D.. */ + 0xef, 0x60, 0xaf, 0xa7, 0xef, 0x40, 0xaf, 0x2d, /* .`...@.- */ + 0xef, 0x41, 0xaf, 0x0a, 0x40, 0x06, 0x5a, 0x10, /* .A..@.Z. */ + 0xcf, 0x27, 0xaf, 0xe2, 0x23, 0x6e, 0x23, 0x08, /* .'..#n#. */ + 0xef, 0xe3, 0xaf, 0x6f, 0xaf, 0xe2, 0x23, 0x08, /* ...o..#. */ + 0xef, 0xe3, 0xaf, 0x79, 0x82, 0x4d, 0xaf, 0xdf, /* ...y.M.. */ + 0x96, 0x64, 0xdf, 0x8b, 0x82, 0x93, 0xbf, 0xdd, /* .d...... */ + 0x97, 0x77, 0xff, 0x8b, 0x82, 0x94, 0xbf, 0x9e, /* .w...... */ + 0x23, 0xe4, 0x23, 0x9f, 0x22, 0x6d, 0x2e, 0x6b, /* #.#."m.k */ + 0xbf, 0x6d, 0x2e, 0x6a, 0xbf, 0x6d, 0x2e, 0x6c, /* .m.j.m.l */ + 0xbf, 0xa5, 0xcf, 0xf3, 0x1c, 0xa5, 0xaf, 0x05, /* ........ */ + 0x27 /* ' */ }; static const unsigned char pkt267[] = { -0x42, 0x2c, 0x00, -0x64, 0x2e, 0xf9, 0x32, 0xf9, /* B,.d..2. */ -0x3a, 0xaf, 0xef, 0x00, 0xff, 0x1b, 0x27, 0xf6, /* :.....'. */ -0x97, 0xcf, 0xaf, 0x0f, 0xef, 0x06, 0xaf, 0xce, /* ........ */ -0x30, 0x0f, 0x27, 0x0f, 0x27, 0xfa, 0x97, 0xcf, /* 0.'.'... */ -0xaf, 0xce, 0x32, 0x06, 0x25, 0xf8, 0x55, 0xce, /* ..2.%.U. */ -0x43, 0xfd, 0x5b, 0xce, 0x31, 0x05, 0x27 /* C.[.1.' */ + 0x42, 0x2c, 0x00, + 0x64, 0x2e, 0xf9, 0x32, 0xf9, /* B,.d..2. */ + 0x3a, 0xaf, 0xef, 0x00, 0xff, 0x1b, 0x27, 0xf6, /* :.....'. */ + 0x97, 0xcf, 0xaf, 0x0f, 0xef, 0x06, 0xaf, 0xce, /* ........ */ + 0x30, 0x0f, 0x27, 0x0f, 0x27, 0xfa, 0x97, 0xcf, /* 0.'.'... */ + 0xaf, 0xce, 0x32, 0x06, 0x25, 0xf8, 0x55, 0xce, /* ..2.%.U. */ + 0x43, 0xfd, 0x5b, 0xce, 0x31, 0x05, 0x27 /* C.[.1.' */ }; static const unsigned char pkt269[] = { -0x42, 0x26, 0x00, -0x79, 0x2e, 0xbf, 0x22, 0xff, /* B&.y..". */ -0xef, 0x1b, 0x27, 0xdd, 0x97, 0xdd, 0x9f, 0x06, /* ..'..... */ -0xaf, 0x4e, 0xbf, 0xff, 0x22, 0x04, 0x54, 0xbd, /* .N..".T. */ -0x9d, 0x06, 0x25, 0xfc, 0x53, 0x4e, 0x25, 0xfa, /* ..%.SN%. */ -0x55, 0xbd, 0x9d, 0x06, 0x25, 0xfc, 0x55, 0x05, /* U...%.U. */ -0x27 /* ' */ + 0x42, 0x26, 0x00, + 0x79, 0x2e, 0xbf, 0x22, 0xff, /* B&.y..". */ + 0xef, 0x1b, 0x27, 0xdd, 0x97, 0xdd, 0x9f, 0x06, /* ..'..... */ + 0xaf, 0x4e, 0xbf, 0xff, 0x22, 0x04, 0x54, 0xbd, /* .N..".T. */ + 0x9d, 0x06, 0x25, 0xfc, 0x53, 0x4e, 0x25, 0xfa, /* ..%.SN%. */ + 0x55, 0xbd, 0x9d, 0x06, 0x25, 0xfc, 0x55, 0x05, /* U...%.U. */ + 0x27 /* ' */ }; static const unsigned char pkt271[] = { -0x42, 0x3c, 0x00, -0x8b, 0x2e, 0xbf, 0x22, 0xff, /* B<....". */ -0xef, 0x1b, 0x27, 0xdc, 0x99, 0x28, 0x28, 0x28, /* ..'..((( */ -0x2a, 0x68, 0x2c, 0xfd, 0x5b, 0xa9, 0x9d, 0x6a, /* *h,.[..j */ -0x28, 0x06, 0x25, 0xf6, 0x53, 0x4e, 0x25, 0xf4, /* (.%.SN%. */ -0x55, 0xdc, 0x99, 0x28, 0x28, 0x28, 0x2a, 0x68, /* U..(((*h */ -0x2c, 0xfd, 0x5b, 0xa9, 0x9d, 0x6a, 0x28, 0x06, /* ,.[..j(. */ -0x25, 0xf6, 0x55, 0x01, 0x2e, 0xe4, 0x85, 0xbf, /* %.U..... */ -0x22, 0xbf, 0x99, 0x7f, 0x99, 0x05, 0x27 /* ".....' */ + 0x42, 0x3c, 0x00, + 0x8b, 0x2e, 0xbf, 0x22, 0xff, /* B<....". */ + 0xef, 0x1b, 0x27, 0xdc, 0x99, 0x28, 0x28, 0x28, /* ..'..((( */ + 0x2a, 0x68, 0x2c, 0xfd, 0x5b, 0xa9, 0x9d, 0x6a, /* *h,.[..j */ + 0x28, 0x06, 0x25, 0xf6, 0x53, 0x4e, 0x25, 0xf4, /* (.%.SN%. */ + 0x55, 0xdc, 0x99, 0x28, 0x28, 0x28, 0x2a, 0x68, /* U..(((*h */ + 0x2c, 0xfd, 0x5b, 0xa9, 0x9d, 0x6a, 0x28, 0x06, /* ,.[..j(. */ + 0x25, 0xf6, 0x55, 0x01, 0x2e, 0xe4, 0x85, 0xbf, /* %.U..... */ + 0x22, 0xbf, 0x99, 0x7f, 0x99, 0x05, 0x27 /* ".....' */ }; static const unsigned char pkt273[] = { -0x67, 0x05, 0x00, 0x00, 0x02, 0x2e, 0x00, 0x70, /* g......p */ -0x67, 0x05, 0x00, 0x02, 0x02, 0x2e, 0x88, 0x70, /* g......p */ -0x67, 0x05, 0x00, 0x01, 0x02, 0x2e, 0x3c, 0x71, /* g.....id = "aes3500"; - dev_class->full_name = "AuthenTec AES3500"; - dev_class->id_table = id_table; + dev_class->id = "aes3500"; + dev_class->full_name = "AuthenTec AES3500"; + dev_class->id_table = id_table; - img_class->img_height = FRAME_WIDTH * ENLARGE_FACTOR; - img_class->img_width = FRAME_WIDTH * ENLARGE_FACTOR; + img_class->img_height = FRAME_WIDTH * ENLARGE_FACTOR; + img_class->img_width = FRAME_WIDTH * ENLARGE_FACTOR; - aes_class->data_buflen = DATA_BUFLEN; - aes_class->frame_width = FRAME_WIDTH; - aes_class->frame_size = FRAME_SIZE; - aes_class->frame_number = FRAME_NUMBER; - aes_class->enlarge_factor = ENLARGE_FACTOR; - aes_class->init_reqs = init_reqs; - aes_class->init_reqs_len = G_N_ELEMENTS(init_reqs); + aes_class->data_buflen = DATA_BUFLEN; + aes_class->frame_width = FRAME_WIDTH; + aes_class->frame_size = FRAME_SIZE; + aes_class->frame_number = FRAME_NUMBER; + aes_class->enlarge_factor = ENLARGE_FACTOR; + aes_class->init_reqs = init_reqs; + aes_class->init_reqs_len = G_N_ELEMENTS (init_reqs); } diff --git a/libfprint/drivers/aes3k.c b/libfprint/drivers/aes3k.c index 9c120bd..f73ac02 100644 --- a/libfprint/drivers/aes3k.c +++ b/libfprint/drivers/aes3k.c @@ -40,169 +40,188 @@ #include "aeslib.h" #include "aes3k.h" -typedef struct { - FpiUsbTransfer *img_trf; - gboolean deactivating; +typedef struct +{ + FpiUsbTransfer *img_trf; + gboolean deactivating; } FpiDeviceAes3kPrivate; -#define CTRL_TIMEOUT 1000 -#define EP_IN (1 | FPI_USB_ENDPOINT_IN) -#define EP_OUT (2 | FPI_USB_ENDPOINT_OUT) +#define CTRL_TIMEOUT 1000 +#define EP_IN (1 | FPI_USB_ENDPOINT_IN) +#define EP_OUT (2 | FPI_USB_ENDPOINT_OUT) -static void do_capture(FpImageDevice *dev); +static void do_capture (FpImageDevice *dev); -G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE(FpiDeviceAes3k, fpi_device_aes3k, FP_TYPE_IMAGE_DEVICE); +G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (FpiDeviceAes3k, fpi_device_aes3k, FP_TYPE_IMAGE_DEVICE); -static void aes3k_assemble_image(unsigned char *input, size_t width, size_t height, - unsigned char *output) +static void +aes3k_assemble_image (unsigned char *input, size_t width, size_t height, + unsigned char *output) { - size_t row, column; + size_t row, column; - for (column = 0; column < width; column++) { - for (row = 0; row < height; row += 2) { - output[width * row + column] = (*input & 0x0f) * 17; - output[width * (row + 1) + column] = ((*input & 0xf0) >> 4) * 17; - input++; - } - } + for (column = 0; column < width; column++) + { + for (row = 0; row < height; row += 2) + { + output[width * row + column] = (*input & 0x0f) * 17; + output[width * (row + 1) + column] = ((*input & 0xf0) >> 4) * 17; + input++; + } + } } -static void img_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +img_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpImageDevice *dev = FP_IMAGE_DEVICE (device); - FpiDeviceAes3k *self = FPI_DEVICE_AES3K (device); - FpiDeviceAes3kPrivate *priv = fpi_device_aes3k_get_instance_private (self); - FpiDeviceAes3kClass *cls = FPI_DEVICE_AES3K_GET_CLASS (self); - unsigned char *ptr = transfer->buffer; - FpImage *tmp; - FpImage *img; - int i; + FpImageDevice *dev = FP_IMAGE_DEVICE (device); + FpiDeviceAes3k *self = FPI_DEVICE_AES3K (device); + FpiDeviceAes3kPrivate *priv = fpi_device_aes3k_get_instance_private (self); + FpiDeviceAes3kClass *cls = FPI_DEVICE_AES3K_GET_CLASS (self); + unsigned char *ptr = transfer->buffer; + FpImage *tmp; + FpImage *img; + int i; - priv->img_trf = NULL; + priv->img_trf = NULL; - if (error) { - if (g_error_matches (error, - G_IO_ERROR, - G_IO_ERROR_CANCELLED)) { - /* Deactivation was completed. */ - g_error_free (error); - if (priv->deactivating) - fpi_image_device_deactivate_complete(dev, NULL); - return; - } + if (error) + { + if (g_error_matches (error, + G_IO_ERROR, + G_IO_ERROR_CANCELLED)) + { + /* Deactivation was completed. */ + g_error_free (error); + if (priv->deactivating) + fpi_image_device_deactivate_complete (dev, NULL); + return; + } - fpi_image_device_session_error (dev, error); - } + fpi_image_device_session_error (dev, error); + } - fpi_image_device_report_finger_status(dev, TRUE); + fpi_image_device_report_finger_status (dev, TRUE); - tmp = fp_image_new(cls->frame_width, cls->frame_width); - tmp->width = cls->frame_width; - tmp->height = cls->frame_width; - tmp->flags = FPI_IMAGE_COLORS_INVERTED | FPI_IMAGE_V_FLIPPED | FPI_IMAGE_H_FLIPPED; - for (i = 0; i < cls->frame_number; i++) { - fp_dbg("frame header byte %02x", *ptr); - ptr++; - aes3k_assemble_image(ptr, cls->frame_width, AES3K_FRAME_HEIGHT, tmp->data + (i * cls->frame_width * AES3K_FRAME_HEIGHT)); - ptr += cls->frame_size; - } + tmp = fp_image_new (cls->frame_width, cls->frame_width); + tmp->width = cls->frame_width; + tmp->height = cls->frame_width; + tmp->flags = FPI_IMAGE_COLORS_INVERTED | FPI_IMAGE_V_FLIPPED | FPI_IMAGE_H_FLIPPED; + for (i = 0; i < cls->frame_number; i++) + { + fp_dbg ("frame header byte %02x", *ptr); + ptr++; + aes3k_assemble_image (ptr, cls->frame_width, AES3K_FRAME_HEIGHT, tmp->data + (i * cls->frame_width * AES3K_FRAME_HEIGHT)); + ptr += cls->frame_size; + } - /* FIXME: this is an ugly hack to make the image big enough for NBIS - * to process reliably */ - img = fpi_image_resize(tmp, cls->enlarge_factor, cls->enlarge_factor); - g_object_unref (tmp); - fpi_image_device_image_captured(dev, img); + /* FIXME: this is an ugly hack to make the image big enough for NBIS + * to process reliably */ + img = fpi_image_resize (tmp, cls->enlarge_factor, cls->enlarge_factor); + g_object_unref (tmp); + fpi_image_device_image_captured (dev, img); - /* FIXME: rather than assuming finger has gone, we should poll regs until - * it really has, then restart the capture */ - fpi_image_device_report_finger_status(dev, FALSE); + /* FIXME: rather than assuming finger has gone, we should poll regs until + * it really has, then restart the capture */ + fpi_image_device_report_finger_status (dev, FALSE); - do_capture(dev); + do_capture (dev); } -static void do_capture(FpImageDevice *dev) +static void +do_capture (FpImageDevice *dev) { - FpiDeviceAes3k *self = FPI_DEVICE_AES3K (dev); - FpiDeviceAes3kPrivate *priv = fpi_device_aes3k_get_instance_private (self); - FpiDeviceAes3kClass *cls = FPI_DEVICE_AES3K_GET_CLASS (self); + FpiDeviceAes3k *self = FPI_DEVICE_AES3K (dev); + FpiDeviceAes3kPrivate *priv = fpi_device_aes3k_get_instance_private (self); + FpiDeviceAes3kClass *cls = FPI_DEVICE_AES3K_GET_CLASS (self); - priv->img_trf = fpi_usb_transfer_new (FP_DEVICE (dev)); - fpi_usb_transfer_fill_bulk(priv->img_trf, EP_IN, cls->data_buflen); - priv->img_trf->short_is_error = TRUE; - fpi_usb_transfer_submit(priv->img_trf, 0, - fpi_device_get_cancellable (FP_DEVICE (dev)), - img_cb, NULL); - fpi_usb_transfer_unref(priv->img_trf); + priv->img_trf = fpi_usb_transfer_new (FP_DEVICE (dev)); + fpi_usb_transfer_fill_bulk (priv->img_trf, EP_IN, cls->data_buflen); + priv->img_trf->short_is_error = TRUE; + fpi_usb_transfer_submit (priv->img_trf, 0, + fpi_device_get_cancellable (FP_DEVICE (dev)), + img_cb, NULL); + fpi_usb_transfer_unref (priv->img_trf); } -static void init_reqs_cb(FpImageDevice *dev, GError *result, void *user_data) +static void +init_reqs_cb (FpImageDevice *dev, GError *result, void *user_data) { - fpi_image_device_activate_complete (dev, result); - if (!result) - do_capture(dev); + fpi_image_device_activate_complete (dev, result); + if (!result) + do_capture (dev); } -static void aes3k_dev_activate(FpImageDevice *dev) +static void +aes3k_dev_activate (FpImageDevice *dev) { - FpiDeviceAes3k *self = FPI_DEVICE_AES3K (dev); - FpiDeviceAes3kPrivate *priv = fpi_device_aes3k_get_instance_private (self); - FpiDeviceAes3kClass *cls = FPI_DEVICE_AES3K_GET_CLASS (self); + FpiDeviceAes3k *self = FPI_DEVICE_AES3K (dev); + FpiDeviceAes3kPrivate *priv = fpi_device_aes3k_get_instance_private (self); + FpiDeviceAes3kClass *cls = FPI_DEVICE_AES3K_GET_CLASS (self); - priv->deactivating = FALSE; - aes_write_regv(dev, cls->init_reqs, cls->init_reqs_len, init_reqs_cb, NULL); + priv->deactivating = FALSE; + aes_write_regv (dev, cls->init_reqs, cls->init_reqs_len, init_reqs_cb, NULL); } -static void aes3k_dev_deactivate(FpImageDevice *dev) +static void +aes3k_dev_deactivate (FpImageDevice *dev) { - FpiDeviceAes3k *self = FPI_DEVICE_AES3K (dev); - FpiDeviceAes3kPrivate *priv = fpi_device_aes3k_get_instance_private (self); + FpiDeviceAes3k *self = FPI_DEVICE_AES3K (dev); + FpiDeviceAes3kPrivate *priv = fpi_device_aes3k_get_instance_private (self); - priv->deactivating = TRUE; - if (priv->img_trf) - return; - fpi_image_device_deactivate_complete(dev, NULL); + priv->deactivating = TRUE; + if (priv->img_trf) + return; + fpi_image_device_deactivate_complete (dev, NULL); } -static void fpi_device_aes3k_init(FpiDeviceAes3k *self) { -} - -static void aes3k_dev_init(FpImageDevice *dev) +static void +fpi_device_aes3k_init (FpiDeviceAes3k *self) { - GError *error = NULL; - - if (!g_usb_device_claim_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), 0, 0, &error)) { - fpi_image_device_open_complete(dev, error); - return; - } - - fpi_image_device_open_complete(dev, NULL); } -static void aes3k_dev_deinit(FpImageDevice *dev) +static void +aes3k_dev_init (FpImageDevice *dev) { - GError *error = NULL; + GError *error = NULL; - g_usb_device_release_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), - 0, 0, &error); - fpi_image_device_close_complete(dev, error); + if (!g_usb_device_claim_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), 0, 0, &error)) + { + fpi_image_device_open_complete (dev, error); + return; + } + + fpi_image_device_open_complete (dev, NULL); +} + +static void +aes3k_dev_deinit (FpImageDevice *dev) +{ + GError *error = NULL; + + g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), + 0, 0, &error); + fpi_image_device_close_complete (dev, error); } -static void fpi_device_aes3k_class_init(FpiDeviceAes3kClass *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); - FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS(klass); +static void +fpi_device_aes3k_class_init (FpiDeviceAes3kClass *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); + FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); - dev_class->type = FP_DEVICE_TYPE_USB; - dev_class->scan_type = FP_SCAN_TYPE_PRESS; + dev_class->type = FP_DEVICE_TYPE_USB; + dev_class->scan_type = FP_SCAN_TYPE_PRESS; - img_class->img_open = aes3k_dev_init; - img_class->img_close = aes3k_dev_deinit; - img_class->activate = aes3k_dev_activate; - img_class->deactivate = aes3k_dev_deactivate; + img_class->img_open = aes3k_dev_init; + img_class->img_close = aes3k_dev_deinit; + img_class->activate = aes3k_dev_activate; + img_class->deactivate = aes3k_dev_deactivate; - /* Extremely low due to low image quality. */ - img_class->bz3_threshold = 9; + /* Extremely low due to low image quality. */ + img_class->bz3_threshold = 9; - /* Everything else is set by the subclasses. */ + /* Everything else is set by the subclasses. */ } diff --git a/libfprint/drivers/aes3k.h b/libfprint/drivers/aes3k.h index ac491b7..539f4e1 100644 --- a/libfprint/drivers/aes3k.h +++ b/libfprint/drivers/aes3k.h @@ -38,22 +38,23 @@ #include "fpi-image-device.h" #include "aeslib.h" -#define AES3K_FRAME_HEIGHT 16 +#define AES3K_FRAME_HEIGHT 16 -G_DECLARE_DERIVABLE_TYPE(FpiDeviceAes3k, fpi_device_aes3k, FPI, - DEVICE_AES3K, FpImageDevice) +G_DECLARE_DERIVABLE_TYPE (FpiDeviceAes3k, fpi_device_aes3k, FPI, + DEVICE_AES3K, FpImageDevice) #define FPI_TYPE_DEVICE_AES3K (fpi_device_aes3k_get_type ()) -struct _FpiDeviceAes3kClass { - FpImageDeviceClass parent; +struct _FpiDeviceAes3kClass +{ + FpImageDeviceClass parent; - gsize frame_width; /* image size = frame_width x frame_width */ - gsize frame_size; /* 4 bits/pixel: frame_width x AES3K_FRAME_HEIGHT / 2 */ - gsize frame_number; /* number of frames */ - gsize enlarge_factor; + gsize frame_width; /* image size = frame_width x frame_width */ + gsize frame_size; /* 4 bits/pixel: frame_width x AES3K_FRAME_HEIGHT / 2 */ + gsize frame_number; /* number of frames */ + gsize enlarge_factor; - gsize data_buflen; /* buffer length of usb bulk transfer */ - struct aes_regwrite *init_reqs; /* initial values sent to device */ - gsize init_reqs_len; + gsize data_buflen; /* buffer length of usb bulk transfer */ + struct aes_regwrite *init_reqs; /* initial values sent to device */ + gsize init_reqs_len; }; diff --git a/libfprint/drivers/aes4000.c b/libfprint/drivers/aes4000.c index 0298489..0a801f6 100644 --- a/libfprint/drivers/aes4000.c +++ b/libfprint/drivers/aes4000.c @@ -28,123 +28,128 @@ #include "aes3k.h" -#define DATA_BUFLEN 0x1259 +#define DATA_BUFLEN 0x1259 /* image size = FRAME_WIDTH x FRAME_WIDTH */ -#define FRAME_WIDTH 96 -#define FRAME_SIZE (FRAME_WIDTH * AES3K_FRAME_HEIGHT / 2) -#define FRAME_NUMBER (FRAME_WIDTH / AES3K_FRAME_HEIGHT) -#define ENLARGE_FACTOR 3 +#define FRAME_WIDTH 96 +#define FRAME_SIZE (FRAME_WIDTH * AES3K_FRAME_HEIGHT / 2) +#define FRAME_NUMBER (FRAME_WIDTH / AES3K_FRAME_HEIGHT) +#define ENLARGE_FACTOR 3 static struct aes_regwrite init_reqs[] = { - /* master reset */ - { 0x80, 0x01 }, - { 0, 0 }, - { 0x80, 0x00 }, - { 0, 0 }, + /* master reset */ + { 0x80, 0x01 }, + { 0, 0 }, + { 0x80, 0x00 }, + { 0, 0 }, - { 0x81, 0x00 }, - { 0x80, 0x00 }, - { 0, 0 }, + { 0x81, 0x00 }, + { 0x80, 0x00 }, + { 0, 0 }, - /* scan reset */ - { 0x80, 0x02 }, - { 0, 0 }, - { 0x80, 0x00 }, - { 0, 0 }, + /* scan reset */ + { 0x80, 0x02 }, + { 0, 0 }, + { 0x80, 0x00 }, + { 0, 0 }, - /* disable register buffering */ - { 0x80, 0x04 }, - { 0, 0 }, - { 0x80, 0x00 }, - { 0, 0 }, + /* disable register buffering */ + { 0x80, 0x04 }, + { 0, 0 }, + { 0x80, 0x00 }, + { 0, 0 }, - { 0x81, 0x00 }, - { 0, 0 }, - /* windows driver reads registers now (81 02) */ - { 0x80, 0x00 }, - { 0x81, 0x00 }, + { 0x81, 0x00 }, + { 0, 0 }, + /* windows driver reads registers now (81 02) */ + { 0x80, 0x00 }, + { 0x81, 0x00 }, - /* set excitation bias current: 2mhz drive ring frequency, - * 4V drive ring voltage, 16.5mA excitation bias */ - { 0x82, 0x04 }, + /* set excitation bias current: 2mhz drive ring frequency, + * 4V drive ring voltage, 16.5mA excitation bias */ + { 0x82, 0x04 }, - /* continuously sample drive ring for finger detection, - * 62.50ms debounce delay */ - { 0x83, 0x13 }, + /* continuously sample drive ring for finger detection, + * 62.50ms debounce delay */ + { 0x83, 0x13 }, - { 0x84, 0x07 }, /* set calibration resistance to 12 kiloohms */ - { 0x85, 0x3d }, /* set calibration capacitance */ - { 0x86, 0x03 }, /* detect drive voltage */ - { 0x87, 0x01 }, /* set detection frequency to 125khz */ - { 0x88, 0x02 }, /* set column scan period */ - { 0x89, 0x02 }, /* set measure drive */ - { 0x8a, 0x33 }, /* set measure frequency and sense amplifier bias */ - { 0x8b, 0x33 }, /* set matrix pattern */ - { 0x8c, 0x0f }, /* set demodulation phase 1 */ - { 0x8d, 0x04 }, /* set demodulation phase 2 */ - { 0x8e, 0x23 }, /* set sensor gain */ - { 0x8f, 0x07 }, /* set image parameters */ - { 0x90, 0x00 }, /* carrier offset null */ - { 0x91, 0x1c }, /* set A/D reference high */ - { 0x92, 0x08 }, /* set A/D reference low */ - { 0x93, 0x00 }, /* set start row to 0 */ - { 0x94, 0x05 }, /* set end row to 5 */ - { 0x95, 0x00 }, /* set start column to 0 */ - { 0x96, 0x18 }, /* set end column to 24*4=96 */ - { 0x97, 0x04 }, /* data format and thresholds */ - { 0x98, 0x28 }, /* image data control */ - { 0x99, 0x00 }, /* disable general purpose outputs */ - { 0x9a, 0x0b }, /* set initial scan state */ - { 0x9b, 0x00 }, /* clear challenge word bits */ - { 0x9c, 0x00 }, /* clear challenge word bits */ - { 0x9d, 0x09 }, /* set some challenge word bits */ - { 0x9e, 0x53 }, /* clear challenge word bits */ - { 0x9f, 0x6b }, /* set some challenge word bits */ - { 0, 0 }, + { 0x84, 0x07 }, /* set calibration resistance to 12 kiloohms */ + { 0x85, 0x3d }, /* set calibration capacitance */ + { 0x86, 0x03 }, /* detect drive voltage */ + { 0x87, 0x01 }, /* set detection frequency to 125khz */ + { 0x88, 0x02 }, /* set column scan period */ + { 0x89, 0x02 }, /* set measure drive */ + { 0x8a, 0x33 }, /* set measure frequency and sense amplifier bias */ + { 0x8b, 0x33 }, /* set matrix pattern */ + { 0x8c, 0x0f }, /* set demodulation phase 1 */ + { 0x8d, 0x04 }, /* set demodulation phase 2 */ + { 0x8e, 0x23 }, /* set sensor gain */ + { 0x8f, 0x07 }, /* set image parameters */ + { 0x90, 0x00 }, /* carrier offset null */ + { 0x91, 0x1c }, /* set A/D reference high */ + { 0x92, 0x08 }, /* set A/D reference low */ + { 0x93, 0x00 }, /* set start row to 0 */ + { 0x94, 0x05 }, /* set end row to 5 */ + { 0x95, 0x00 }, /* set start column to 0 */ + { 0x96, 0x18 }, /* set end column to 24*4=96 */ + { 0x97, 0x04 }, /* data format and thresholds */ + { 0x98, 0x28 }, /* image data control */ + { 0x99, 0x00 }, /* disable general purpose outputs */ + { 0x9a, 0x0b }, /* set initial scan state */ + { 0x9b, 0x00 }, /* clear challenge word bits */ + { 0x9c, 0x00 }, /* clear challenge word bits */ + { 0x9d, 0x09 }, /* set some challenge word bits */ + { 0x9e, 0x53 }, /* clear challenge word bits */ + { 0x9f, 0x6b }, /* set some challenge word bits */ + { 0, 0 }, - { 0x80, 0x00 }, - { 0x81, 0x00 }, - { 0, 0 }, - { 0x81, 0x04 }, - { 0, 0 }, - { 0x81, 0x00 }, + { 0x80, 0x00 }, + { 0x81, 0x00 }, + { 0, 0 }, + { 0x81, 0x04 }, + { 0, 0 }, + { 0x81, 0x00 }, }; -struct _FpiDeviceAes4000 { - FpiDeviceAes3k parent; +struct _FpiDeviceAes4000 +{ + FpiDeviceAes3k parent; }; -G_DECLARE_FINAL_TYPE(FpiDeviceAes4000, fpi_device_aes4000, FPI, - DEVICE_AES4000, FpiDeviceAes3k); -G_DEFINE_TYPE(FpiDeviceAes4000, fpi_device_aes4000, FPI_TYPE_DEVICE_AES3K); +G_DECLARE_FINAL_TYPE (FpiDeviceAes4000, fpi_device_aes4000, FPI, + DEVICE_AES4000, FpiDeviceAes3k); +G_DEFINE_TYPE (FpiDeviceAes4000, fpi_device_aes4000, FPI_TYPE_DEVICE_AES3K); -static const FpIdEntry id_table [ ] = { - { .pid = 0x08ff, .vid = 0x5501 }, - { .vid = 0, .pid = 0, .driver_data = 0 }, +static const FpIdEntry id_table[] = { + { .pid = 0x08ff, .vid = 0x5501 }, + { .vid = 0, .pid = 0, .driver_data = 0 }, }; -static void fpi_device_aes4000_init(FpiDeviceAes4000 *self) { +static void +fpi_device_aes4000_init (FpiDeviceAes4000 *self) +{ } -static void fpi_device_aes4000_class_init(FpiDeviceAes4000Class *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); - FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS(klass); - FpiDeviceAes3kClass *aes_class = FPI_DEVICE_AES3K_CLASS (klass); +static void +fpi_device_aes4000_class_init (FpiDeviceAes4000Class *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); + FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); + FpiDeviceAes3kClass *aes_class = FPI_DEVICE_AES3K_CLASS (klass); - dev_class->id = "aes4000"; - dev_class->full_name = "AuthenTec AES4000"; - dev_class->id_table = id_table; + dev_class->id = "aes4000"; + dev_class->full_name = "AuthenTec AES4000"; + dev_class->id_table = id_table; - img_class->img_height = FRAME_WIDTH * ENLARGE_FACTOR; - img_class->img_width = FRAME_WIDTH * ENLARGE_FACTOR; + img_class->img_height = FRAME_WIDTH * ENLARGE_FACTOR; + img_class->img_width = FRAME_WIDTH * ENLARGE_FACTOR; - aes_class->data_buflen = DATA_BUFLEN; - aes_class->frame_width = FRAME_WIDTH; - aes_class->frame_size = FRAME_SIZE; - aes_class->frame_number = FRAME_NUMBER; - aes_class->enlarge_factor = ENLARGE_FACTOR; - aes_class->init_reqs = init_reqs; - aes_class->init_reqs_len = G_N_ELEMENTS(init_reqs); + aes_class->data_buflen = DATA_BUFLEN; + aes_class->frame_width = FRAME_WIDTH; + aes_class->frame_size = FRAME_SIZE; + aes_class->frame_number = FRAME_NUMBER; + aes_class->enlarge_factor = ENLARGE_FACTOR; + aes_class->init_reqs = init_reqs; + aes_class->init_reqs_len = G_N_ELEMENTS (init_reqs); } diff --git a/libfprint/drivers/aeslib.c b/libfprint/drivers/aeslib.c index 0e5557e..8f92d87 100644 --- a/libfprint/drivers/aeslib.c +++ b/libfprint/drivers/aeslib.c @@ -28,131 +28,145 @@ #include "fpi-assembling.h" #include "aeslib.h" -#define MAX_REGWRITES_PER_REQUEST 16 +#define MAX_REGWRITES_PER_REQUEST 16 -#define BULK_TIMEOUT 4000 -#define EP_IN (1 | FPI_USB_ENDPOINT_IN) -#define EP_OUT (2 | FPI_USB_ENDPOINT_OUT) +#define BULK_TIMEOUT 4000 +#define EP_IN (1 | FPI_USB_ENDPOINT_IN) +#define EP_OUT (2 | FPI_USB_ENDPOINT_OUT) -struct write_regv_data { - unsigned int num_regs; - const struct aes_regwrite *regs; - unsigned int offset; - aes_write_regv_cb callback; - void *user_data; +struct write_regv_data +{ + unsigned int num_regs; + const struct aes_regwrite *regs; + unsigned int offset; + aes_write_regv_cb callback; + void *user_data; }; -static void continue_write_regv(FpImageDevice *dev, struct write_regv_data *wdata); +static void continue_write_regv (FpImageDevice *dev, + struct write_regv_data *wdata); /* libusb bulk callback for regv write completion transfer. continues the * transaction */ -static void write_regv_trf_complete(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +write_regv_trf_complete (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - struct write_regv_data *wdata = user_data; + struct write_regv_data *wdata = user_data; - if (error) { - wdata->callback(FP_IMAGE_DEVICE (device), error, wdata->user_data); - g_free(wdata); - } else { - continue_write_regv(FP_IMAGE_DEVICE (device), wdata); - } + if (error) + { + wdata->callback (FP_IMAGE_DEVICE (device), error, wdata->user_data); + g_free (wdata); + } + else + { + continue_write_regv (FP_IMAGE_DEVICE (device), wdata); + } } /* write from wdata->offset to upper_bound (inclusive) of wdata->regs */ -static void do_write_regv(FpImageDevice *dev, struct write_regv_data *wdata, int upper_bound) +static void +do_write_regv (FpImageDevice *dev, struct write_regv_data *wdata, int upper_bound) { - unsigned int offset = wdata->offset; - unsigned int num = upper_bound - offset + 1; - size_t alloc_size = num * 2; - unsigned int i; - size_t data_offset = 0; - FpiUsbTransfer *transfer = fpi_usb_transfer_new(FP_DEVICE (dev)); + unsigned int offset = wdata->offset; + unsigned int num = upper_bound - offset + 1; + size_t alloc_size = num * 2; + unsigned int i; + size_t data_offset = 0; + FpiUsbTransfer *transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); - fpi_usb_transfer_fill_bulk (transfer, EP_OUT, alloc_size); + fpi_usb_transfer_fill_bulk (transfer, EP_OUT, alloc_size); - for (i = offset; i < offset + num; i++) { - const struct aes_regwrite *regwrite = &wdata->regs[i]; - transfer->buffer[data_offset++] = regwrite->reg; - transfer->buffer[data_offset++] = regwrite->value; - } + for (i = offset; i < offset + num; i++) + { + const struct aes_regwrite *regwrite = &wdata->regs[i]; + transfer->buffer[data_offset++] = regwrite->reg; + transfer->buffer[data_offset++] = regwrite->value; + } - transfer->short_is_error = TRUE; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - write_regv_trf_complete, wdata); - fpi_usb_transfer_unref (transfer); + transfer->short_is_error = TRUE; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + write_regv_trf_complete, wdata); + fpi_usb_transfer_unref (transfer); } /* write the next batch of registers to be written, or if there are no more, * indicate completion to the caller */ -static void continue_write_regv(FpImageDevice *dev, struct write_regv_data *wdata) +static void +continue_write_regv (FpImageDevice *dev, struct write_regv_data *wdata) { - unsigned int offset = wdata->offset; - unsigned int regs_remaining; - unsigned int limit; - unsigned int upper_bound; - int i; + unsigned int offset = wdata->offset; + unsigned int regs_remaining; + unsigned int limit; + unsigned int upper_bound; + int i; - /* skip all zeros and ensure there is still work to do */ - while (TRUE) { - if (offset >= wdata->num_regs) { - fp_dbg("all registers written"); - wdata->callback(dev, 0, wdata->user_data); - g_free(wdata); - return; - } - if (wdata->regs[offset].reg) - break; - offset++; - } + /* skip all zeros and ensure there is still work to do */ + while (TRUE) + { + if (offset >= wdata->num_regs) + { + fp_dbg ("all registers written"); + wdata->callback (dev, 0, wdata->user_data); + g_free (wdata); + return; + } + if (wdata->regs[offset].reg) + break; + offset++; + } - wdata->offset = offset; - regs_remaining = wdata->num_regs - offset; - limit = MIN(regs_remaining, MAX_REGWRITES_PER_REQUEST); - upper_bound = offset + limit - 1; + wdata->offset = offset; + regs_remaining = wdata->num_regs - offset; + limit = MIN (regs_remaining, MAX_REGWRITES_PER_REQUEST); + upper_bound = offset + limit - 1; - /* determine if we can write the entire of the regs at once, or if there - * is a zero dividing things up */ - for (i = offset; i <= upper_bound; i++) - if (!wdata->regs[i].reg) { - upper_bound = i - 1; - break; - } + /* determine if we can write the entire of the regs at once, or if there + * is a zero dividing things up */ + for (i = offset; i <= upper_bound; i++) + if (!wdata->regs[i].reg) + { + upper_bound = i - 1; + break; + } - do_write_regv(dev, wdata, upper_bound); + do_write_regv (dev, wdata, upper_bound); - wdata->offset = upper_bound + 1; + wdata->offset = upper_bound + 1; } /* write a load of registers to the device, combining multiple writes in a * single URB up to a limit. insert writes to non-existent register 0 to force * specific groups of writes to be separated by different URBs. */ -void aes_write_regv(FpImageDevice *dev, const struct aes_regwrite *regs, - unsigned int num_regs, aes_write_regv_cb callback, - void *user_data) +void +aes_write_regv (FpImageDevice *dev, const struct aes_regwrite *regs, + unsigned int num_regs, aes_write_regv_cb callback, + void *user_data) { - struct write_regv_data *wdata; + struct write_regv_data *wdata; - fp_dbg("write %d regs", num_regs); - wdata = g_malloc(sizeof(*wdata)); - wdata->num_regs = num_regs; - wdata->regs = regs; - wdata->offset = 0; - wdata->callback = callback; - wdata->user_data = user_data; - continue_write_regv(dev, wdata); + fp_dbg ("write %d regs", num_regs); + wdata = g_malloc (sizeof (*wdata)); + wdata->num_regs = num_regs; + wdata->regs = regs; + wdata->offset = 0; + wdata->callback = callback; + wdata->user_data = user_data; + continue_write_regv (dev, wdata); } -unsigned char aes_get_pixel(struct fpi_frame_asmbl_ctx *ctx, - struct fpi_frame *frame, - unsigned int x, - unsigned int y) +unsigned char +aes_get_pixel (struct fpi_frame_asmbl_ctx *ctx, + struct fpi_frame *frame, + unsigned int x, + unsigned int y) { - unsigned char ret; + unsigned char ret; - ret = frame->data[x * (ctx->frame_height >> 1) + (y >> 1)]; - ret = y % 2 ? ret >> 4 : ret & 0xf; - ret *= 17; + ret = frame->data[x * (ctx->frame_height >> 1) + (y >> 1)]; + ret = y % 2 ? ret >> 4 : ret & 0xf; + ret *= 17; - return ret; + return ret; } diff --git a/libfprint/drivers/aeslib.h b/libfprint/drivers/aeslib.h index 2a45e99..389b3e5 100644 --- a/libfprint/drivers/aeslib.h +++ b/libfprint/drivers/aeslib.h @@ -22,25 +22,28 @@ #include -struct aes_regwrite { - unsigned char reg; - unsigned char value; +struct aes_regwrite +{ + unsigned char reg; + unsigned char value; }; struct fpi_frame; struct fpi_frame_asmbl_ctx; -typedef void (*aes_write_regv_cb)(FpImageDevice *dev, GError *error, - void *user_data); +typedef void (*aes_write_regv_cb)(FpImageDevice *dev, + GError *error, + void *user_data); -void aes_write_regv(FpImageDevice *dev, const struct aes_regwrite *regs, - unsigned int num_regs, aes_write_regv_cb callback, - void *user_data); +void aes_write_regv (FpImageDevice *dev, + const struct aes_regwrite *regs, + unsigned int num_regs, + aes_write_regv_cb callback, + void *user_data); -unsigned char aes_get_pixel(struct fpi_frame_asmbl_ctx *ctx, - struct fpi_frame *frame, - unsigned int x, - unsigned int y); +unsigned char aes_get_pixel (struct fpi_frame_asmbl_ctx *ctx, + struct fpi_frame *frame, + unsigned int x, + unsigned int y); #endif - diff --git a/libfprint/drivers/aesx660.c b/libfprint/drivers/aesx660.c index b0cc402..385b1f6 100644 --- a/libfprint/drivers/aesx660.c +++ b/libfprint/drivers/aesx660.c @@ -27,659 +27,736 @@ #include "aeslib.h" #include "aesx660.h" -typedef struct { - GByteArray *stripe_packet; - GSList *strips; - size_t strips_len; - gboolean deactivating; - struct aesX660_cmd *init_seq; - size_t init_seq_len; - unsigned int init_cmd_idx; - unsigned int init_seq_idx; +typedef struct +{ + GByteArray *stripe_packet; + GSList *strips; + size_t strips_len; + gboolean deactivating; + struct aesX660_cmd *init_seq; + size_t init_seq_len; + unsigned int init_cmd_idx; + unsigned int init_seq_idx; } FpiDeviceAesX660Private; -G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE(FpiDeviceAesX660, fpi_device_aes_x660, FP_TYPE_IMAGE_DEVICE); +G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (FpiDeviceAesX660, fpi_device_aes_x660, FP_TYPE_IMAGE_DEVICE); -static void start_capture(FpImageDevice *dev); -static void complete_deactivation(FpImageDevice *dev); +static void start_capture (FpImageDevice *dev); +static void complete_deactivation (FpImageDevice *dev); -#define EP_IN (1 | FPI_USB_ENDPOINT_IN) -#define EP_OUT (2 | FPI_USB_ENDPOINT_OUT) -#define BULK_TIMEOUT 4000 -#define FRAME_HEIGHT AESX660_FRAME_HEIGHT +#define EP_IN (1 | FPI_USB_ENDPOINT_IN) +#define EP_OUT (2 | FPI_USB_ENDPOINT_OUT) +#define BULK_TIMEOUT 4000 +#define FRAME_HEIGHT AESX660_FRAME_HEIGHT -#define ID_LEN 8 -#define INIT_LEN 4 -#define CALIBRATE_DATA_LEN 4 -#define FINGER_DET_DATA_LEN 4 +#define ID_LEN 8 +#define INIT_LEN 4 +#define CALIBRATE_DATA_LEN 4 +#define FINGER_DET_DATA_LEN 4 static void -aesX660_send_cmd_timeout(FpiSsm *ssm, - FpDevice *_dev, - const unsigned char *cmd, - size_t cmd_len, - FpiUsbTransferCallback callback, - int timeout) +aesX660_send_cmd_timeout (FpiSsm *ssm, + FpDevice *_dev, + const unsigned char *cmd, + size_t cmd_len, + FpiUsbTransferCallback callback, + int timeout) { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(_dev); + FpiUsbTransfer *transfer = fpi_usb_transfer_new (_dev); - fpi_usb_transfer_fill_bulk_full(transfer, EP_OUT, (unsigned char *)cmd, - cmd_len, NULL); - transfer->ssm = ssm; - fpi_usb_transfer_submit(transfer, timeout, NULL, callback, NULL); - fpi_usb_transfer_unref(transfer); + fpi_usb_transfer_fill_bulk_full (transfer, EP_OUT, (unsigned char *) cmd, + cmd_len, NULL); + transfer->ssm = ssm; + fpi_usb_transfer_submit (transfer, timeout, NULL, callback, NULL); + fpi_usb_transfer_unref (transfer); } static void -aesX660_send_cmd(FpiSsm *ssm, - FpDevice *dev, - const unsigned char *cmd, - size_t cmd_len, - FpiUsbTransferCallback callback) +aesX660_send_cmd (FpiSsm *ssm, + FpDevice *dev, + const unsigned char *cmd, + size_t cmd_len, + FpiUsbTransferCallback callback) { - return aesX660_send_cmd_timeout(ssm, dev, cmd, cmd_len, callback, BULK_TIMEOUT); + return aesX660_send_cmd_timeout (ssm, dev, cmd, cmd_len, callback, BULK_TIMEOUT); } static void -aesX660_read_response(FpiSsm *ssm, - FpDevice *_dev, - gboolean short_is_error, - gboolean cancellable, - size_t buf_len, - FpiUsbTransferCallback callback) +aesX660_read_response (FpiSsm *ssm, + FpDevice *_dev, + gboolean short_is_error, + gboolean cancellable, + size_t buf_len, + FpiUsbTransferCallback callback) { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(_dev); - unsigned char *data; - GCancellable *cancel = NULL; + FpiUsbTransfer *transfer = fpi_usb_transfer_new (_dev); + unsigned char *data; + GCancellable *cancel = NULL; - if (cancellable) - cancel = fpi_device_get_cancellable (_dev); - data = g_malloc(buf_len); - fpi_usb_transfer_fill_bulk_full(transfer, EP_IN, data, buf_len, NULL); - transfer->ssm = ssm; - transfer->short_is_error = short_is_error; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, cancel, callback, NULL); - fpi_usb_transfer_unref(transfer); + if (cancellable) + cancel = fpi_device_get_cancellable (_dev); + data = g_malloc (buf_len); + fpi_usb_transfer_fill_bulk_full (transfer, EP_IN, data, buf_len, NULL); + transfer->ssm = ssm; + transfer->short_is_error = short_is_error; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, cancel, callback, NULL); + fpi_usb_transfer_unref (transfer); } -static void aesX660_send_cmd_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +aesX660_send_cmd_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - if (!error) { - fpi_ssm_next_state(transfer->ssm); - } else { - fpi_ssm_mark_failed(transfer->ssm, error); - } + if (!error) + fpi_ssm_next_state (transfer->ssm); + else + fpi_ssm_mark_failed (transfer->ssm, error); } -static void aesX660_read_calibrate_data_cb(FpiUsbTransfer *transfer, - FpDevice *device, - gpointer user_data, GError *error) +static void +aesX660_read_calibrate_data_cb (FpiUsbTransfer *transfer, + FpDevice *device, + gpointer user_data, GError *error) { - unsigned char *data = transfer->buffer; + unsigned char *data = transfer->buffer; - if (error) { - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } - /* Calibrate response was read correctly? */ - if (data[AESX660_RESPONSE_TYPE_OFFSET] != AESX660_CALIBRATE_RESPONSE) { - fp_dbg("Bogus calibrate response: %.2x\n", data[0]); - fpi_ssm_mark_failed(transfer->ssm, - fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Bogus calibrate response")); - return; - } + if (error) + { + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } + /* Calibrate response was read correctly? */ + if (data[AESX660_RESPONSE_TYPE_OFFSET] != AESX660_CALIBRATE_RESPONSE) + { + fp_dbg ("Bogus calibrate response: %.2x\n", data[0]); + fpi_ssm_mark_failed (transfer->ssm, + fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Bogus calibrate response")); + return; + } - fpi_ssm_next_state(transfer->ssm); + fpi_ssm_next_state (transfer->ssm); } /****** FINGER PRESENCE DETECTION ******/ enum finger_det_states { - FINGER_DET_SEND_LED_CMD, - FINGER_DET_SEND_FD_CMD, - FINGER_DET_READ_FD_DATA, - FINGER_DET_SET_IDLE, - FINGER_DET_NUM_STATES, + FINGER_DET_SEND_LED_CMD, + FINGER_DET_SEND_FD_CMD, + FINGER_DET_READ_FD_DATA, + FINGER_DET_SET_IDLE, + FINGER_DET_NUM_STATES, }; -static void finger_det_read_fd_data_cb(FpiUsbTransfer *transfer, - FpDevice *device, gpointer user_data, - GError *error) +static void +finger_det_read_fd_data_cb (FpiUsbTransfer *transfer, + FpDevice *device, gpointer user_data, + GError *error) { - FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (device); - FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); - unsigned char *data = transfer->buffer; + FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (device); + FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); + unsigned char *data = transfer->buffer; - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { - fpi_ssm_next_state(transfer->ssm); - return; - } + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + { + fpi_ssm_next_state (transfer->ssm); + return; + } - if (error) { - fp_dbg("Failed to read FD data\n"); - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } + if (error) + { + fp_dbg ("Failed to read FD data\n"); + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } - if (data[AESX660_RESPONSE_TYPE_OFFSET] != AESX660_FINGER_DET_RESPONSE) { - fp_dbg("Bogus FD response: %.2x\n", data[0]); - fpi_ssm_mark_failed(transfer->ssm, - fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Bogus FD response")); - return; - } + if (data[AESX660_RESPONSE_TYPE_OFFSET] != AESX660_FINGER_DET_RESPONSE) + { + fp_dbg ("Bogus FD response: %.2x\n", data[0]); + fpi_ssm_mark_failed (transfer->ssm, + fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Bogus FD response")); + return; + } - if (data[AESX660_FINGER_PRESENT_OFFSET] == AESX660_FINGER_PRESENT || priv->deactivating) { - /* Finger present or we're deactivating... */ - fpi_ssm_next_state(transfer->ssm); - } else { - fp_dbg("Wait for finger returned %.2x as result\n", - data[AESX660_FINGER_PRESENT_OFFSET]); - fpi_ssm_jump_to_state(transfer->ssm, FINGER_DET_SEND_FD_CMD); - } + if (data[AESX660_FINGER_PRESENT_OFFSET] == AESX660_FINGER_PRESENT || priv->deactivating) + { + /* Finger present or we're deactivating... */ + fpi_ssm_next_state (transfer->ssm); + } + else + { + fp_dbg ("Wait for finger returned %.2x as result\n", + data[AESX660_FINGER_PRESENT_OFFSET]); + fpi_ssm_jump_to_state (transfer->ssm, FINGER_DET_SEND_FD_CMD); + } } -static void finger_det_set_idle_cmd_cb(FpiUsbTransfer *transfer, - FpDevice *device, gpointer user_data, - GError *error) +static void +finger_det_set_idle_cmd_cb (FpiUsbTransfer *transfer, + FpDevice *device, gpointer user_data, + GError *error) { - if (!error) { - fpi_ssm_mark_completed(transfer->ssm); - } else { - fpi_ssm_mark_failed(transfer->ssm, error); - } + if (!error) + fpi_ssm_mark_completed (transfer->ssm); + else + fpi_ssm_mark_failed (transfer->ssm, error); } -static void finger_det_sm_complete(FpiSsm *ssm, FpDevice *_dev, - void *user_data, GError *error) +static void +finger_det_sm_complete (FpiSsm *ssm, FpDevice *_dev, + void *user_data, GError *error) { - FpImageDevice *dev = FP_IMAGE_DEVICE (_dev); - FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (_dev); - FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); + FpImageDevice *dev = FP_IMAGE_DEVICE (_dev); + FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (_dev); + FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); - fp_dbg("Finger detection completed"); - fpi_image_device_report_finger_status(dev, TRUE); - fpi_ssm_free(ssm); + fp_dbg ("Finger detection completed"); + fpi_image_device_report_finger_status (dev, TRUE); + fpi_ssm_free (ssm); - if (priv->deactivating) { - complete_deactivation(dev); - if (error) - g_error_free (error); - } else if (error) { - fpi_image_device_session_error(dev, error); - } else { - fpi_image_device_report_finger_status(dev, TRUE); - start_capture(dev); - } + if (priv->deactivating) + { + complete_deactivation (dev); + if (error) + g_error_free (error); + } + else if (error) + { + fpi_image_device_session_error (dev, error); + } + else + { + fpi_image_device_report_finger_status (dev, TRUE); + start_capture (dev); + } } -static void finger_det_run_state(FpiSsm *ssm, FpDevice *dev, void *user_data) +static void +finger_det_run_state (FpiSsm *ssm, FpDevice *dev, void *user_data) { - switch (fpi_ssm_get_cur_state(ssm)) { - case FINGER_DET_SEND_LED_CMD: - aesX660_send_cmd(ssm, dev, led_blink_cmd, sizeof(led_blink_cmd), - aesX660_send_cmd_cb); - break; - case FINGER_DET_SEND_FD_CMD: - aesX660_send_cmd_timeout(ssm, dev, wait_for_finger_cmd, sizeof(wait_for_finger_cmd), - aesX660_send_cmd_cb, 0); - break; - case FINGER_DET_READ_FD_DATA: - aesX660_read_response(ssm, dev, TRUE, TRUE, FINGER_DET_DATA_LEN, finger_det_read_fd_data_cb); - break; - case FINGER_DET_SET_IDLE: - aesX660_send_cmd(ssm, dev, set_idle_cmd, sizeof(set_idle_cmd), - finger_det_set_idle_cmd_cb); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case FINGER_DET_SEND_LED_CMD: + aesX660_send_cmd (ssm, dev, led_blink_cmd, sizeof (led_blink_cmd), + aesX660_send_cmd_cb); + break; + + case FINGER_DET_SEND_FD_CMD: + aesX660_send_cmd_timeout (ssm, dev, wait_for_finger_cmd, sizeof (wait_for_finger_cmd), + aesX660_send_cmd_cb, 0); + break; + + case FINGER_DET_READ_FD_DATA: + aesX660_read_response (ssm, dev, TRUE, TRUE, FINGER_DET_DATA_LEN, finger_det_read_fd_data_cb); + break; + + case FINGER_DET_SET_IDLE: + aesX660_send_cmd (ssm, dev, set_idle_cmd, sizeof (set_idle_cmd), + finger_det_set_idle_cmd_cb); + break; + } } -static void start_finger_detection(FpImageDevice *dev) +static void +start_finger_detection (FpImageDevice *dev) { - FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (dev); - FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); - FpiSsm *ssm; + FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (dev); + FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); + FpiSsm *ssm; - if (priv->deactivating) { - complete_deactivation(dev); - return; - } + if (priv->deactivating) + { + complete_deactivation (dev); + return; + } - ssm = fpi_ssm_new(FP_DEVICE(dev), finger_det_run_state, - FINGER_DET_NUM_STATES, dev); - fpi_ssm_start(ssm, finger_det_sm_complete); + ssm = fpi_ssm_new (FP_DEVICE (dev), finger_det_run_state, + FINGER_DET_NUM_STATES, dev); + fpi_ssm_start (ssm, finger_det_sm_complete); } /****** CAPTURE ******/ enum capture_states { - CAPTURE_SEND_LED_CMD, - CAPTURE_SEND_CAPTURE_CMD, - CAPTURE_READ_STRIPE_DATA, - CAPTURE_SET_IDLE, - CAPTURE_NUM_STATES, + CAPTURE_SEND_LED_CMD, + CAPTURE_SEND_CAPTURE_CMD, + CAPTURE_READ_STRIPE_DATA, + CAPTURE_SET_IDLE, + CAPTURE_NUM_STATES, }; /* Returns number of processed bytes */ -static int process_stripe_data(FpiSsm *ssm, FpiDeviceAesX660 *self, - unsigned char *data, gsize length) +static int +process_stripe_data (FpiSsm *ssm, FpiDeviceAesX660 *self, + unsigned char *data, gsize length) { - FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); - FpiDeviceAesX660Class *cls = FPI_DEVICE_AES_X660_GET_CLASS (self); - struct fpi_frame *stripe; - unsigned char *stripdata; + FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); + FpiDeviceAesX660Class *cls = FPI_DEVICE_AES_X660_GET_CLASS (self); + struct fpi_frame *stripe; + unsigned char *stripdata; - if (length < AESX660_IMAGE_OFFSET + cls->assembling_ctx->frame_width * FRAME_HEIGHT / 2) { - fp_warn ("Received stripe data is too short, got %zi expected %i bytes!", - length, - AESX660_IMAGE_OFFSET + cls->assembling_ctx->frame_width * FRAME_HEIGHT / 2); - return 0; - } + if (length < AESX660_IMAGE_OFFSET + cls->assembling_ctx->frame_width * FRAME_HEIGHT / 2) + { + fp_warn ("Received stripe data is too short, got %zi expected %i bytes!", + length, + AESX660_IMAGE_OFFSET + cls->assembling_ctx->frame_width * FRAME_HEIGHT / 2); + return 0; + } - stripe = g_malloc(cls->assembling_ctx->frame_width * FRAME_HEIGHT / 2 + sizeof(struct fpi_frame)); /* 4 bpp */ - stripdata = stripe->data; + stripe = g_malloc (cls->assembling_ctx->frame_width * FRAME_HEIGHT / 2 + sizeof (struct fpi_frame)); /* 4 bpp */ + stripdata = stripe->data; - fp_dbg("Processing frame %.2x %.2x", data[AESX660_IMAGE_OK_OFFSET], - data[AESX660_LAST_FRAME_OFFSET]); + fp_dbg ("Processing frame %.2x %.2x", data[AESX660_IMAGE_OK_OFFSET], + data[AESX660_LAST_FRAME_OFFSET]); - stripe->delta_x = (int8_t)data[AESX660_FRAME_DELTA_X_OFFSET]; - stripe->delta_y = -(int8_t)data[AESX660_FRAME_DELTA_Y_OFFSET]; - fp_dbg("Offset to previous frame: %d %d", stripe->delta_x, stripe->delta_y); + stripe->delta_x = (int8_t) data[AESX660_FRAME_DELTA_X_OFFSET]; + stripe->delta_y = -(int8_t) data[AESX660_FRAME_DELTA_Y_OFFSET]; + fp_dbg ("Offset to previous frame: %d %d", stripe->delta_x, stripe->delta_y); - if (data[AESX660_IMAGE_OK_OFFSET] == AESX660_IMAGE_OK) { - memcpy(stripdata, data + AESX660_IMAGE_OFFSET, cls->assembling_ctx->frame_width * FRAME_HEIGHT / 2); + if (data[AESX660_IMAGE_OK_OFFSET] == AESX660_IMAGE_OK) + { + memcpy (stripdata, data + AESX660_IMAGE_OFFSET, cls->assembling_ctx->frame_width * FRAME_HEIGHT / 2); - priv->strips = g_slist_prepend(priv->strips, stripe); - priv->strips_len++; - return (data[AESX660_LAST_FRAME_OFFSET] & AESX660_LAST_FRAME_BIT); - } + priv->strips = g_slist_prepend (priv->strips, stripe); + priv->strips_len++; + return data[AESX660_LAST_FRAME_OFFSET] & AESX660_LAST_FRAME_BIT; + } - g_free(stripe); - return 0; + g_free (stripe); + return 0; } -static void capture_set_idle_cmd_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +capture_set_idle_cmd_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpImageDevice *dev = FP_IMAGE_DEVICE (device); - FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (device); - FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); - FpiDeviceAesX660Class *cls = FPI_DEVICE_AES_X660_GET_CLASS (self); + FpImageDevice *dev = FP_IMAGE_DEVICE (device); + FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (device); + FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); + FpiDeviceAesX660Class *cls = FPI_DEVICE_AES_X660_GET_CLASS (self); - if (!error) { - FpImage *img; + if (!error) + { + FpImage *img; - priv->strips = g_slist_reverse(priv->strips); - img = fpi_assemble_frames(cls->assembling_ctx, priv->strips); - g_slist_foreach(priv->strips, (GFunc) g_free, NULL); - g_slist_free(priv->strips); - priv->strips = NULL; - priv->strips_len = 0; - fpi_image_device_image_captured(dev, img); - fpi_image_device_report_finger_status(dev, FALSE); - fpi_ssm_mark_completed(transfer->ssm); - } else { - fpi_ssm_mark_failed(transfer->ssm, error); - } + priv->strips = g_slist_reverse (priv->strips); + img = fpi_assemble_frames (cls->assembling_ctx, priv->strips); + g_slist_foreach (priv->strips, (GFunc) g_free, NULL); + g_slist_free (priv->strips); + priv->strips = NULL; + priv->strips_len = 0; + fpi_image_device_image_captured (dev, img); + fpi_image_device_report_finger_status (dev, FALSE); + fpi_ssm_mark_completed (transfer->ssm); + } + else + { + fpi_ssm_mark_failed (transfer->ssm, error); + } } -static void capture_read_stripe_data_cb(FpiUsbTransfer *transfer, - FpDevice *device, gpointer user_data, - GError *error) +static void +capture_read_stripe_data_cb (FpiUsbTransfer *transfer, + FpDevice *device, gpointer user_data, + GError *error) { - FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (device); - FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); - unsigned char *data = transfer->buffer; - int finger_missing = 0; - size_t actual_length = transfer->actual_length; + FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (device); + FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); + unsigned char *data = transfer->buffer; + int finger_missing = 0; + size_t actual_length = transfer->actual_length; - if (error) { - g_byte_array_set_size (priv->stripe_packet, 0); - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } + if (error) + { + g_byte_array_set_size (priv->stripe_packet, 0); + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } - fp_dbg("Got %lu bytes of data", actual_length); - while (actual_length) { - gssize payload_length; - gssize still_needed_len; - gssize copy_len; + fp_dbg ("Got %lu bytes of data", actual_length); + while (actual_length) + { + gssize payload_length; + gssize still_needed_len; + gssize copy_len; - still_needed_len = MAX (0, AESX660_HEADER_SIZE - (gssize) priv->stripe_packet->len); - copy_len = MIN (actual_length, still_needed_len); - g_byte_array_append (priv->stripe_packet, data, copy_len); - data += copy_len; - actual_length -= copy_len; + still_needed_len = MAX (0, AESX660_HEADER_SIZE - (gssize) priv->stripe_packet->len); + copy_len = MIN (actual_length, still_needed_len); + g_byte_array_append (priv->stripe_packet, data, copy_len); + data += copy_len; + actual_length -= copy_len; - /* Do we have a full header? */ - if (priv->stripe_packet->len < AESX660_HEADER_SIZE) - break; + /* Do we have a full header? */ + if (priv->stripe_packet->len < AESX660_HEADER_SIZE) + break; - payload_length = priv->stripe_packet->data[AESX660_RESPONSE_SIZE_LSB_OFFSET] + - (priv->stripe_packet->data[AESX660_RESPONSE_SIZE_MSB_OFFSET] << 8); - fp_dbg("Got frame, type %.2x payload of size %.4lx", - priv->stripe_packet->data[AESX660_RESPONSE_TYPE_OFFSET], - payload_length); + payload_length = priv->stripe_packet->data[AESX660_RESPONSE_SIZE_LSB_OFFSET] + + (priv->stripe_packet->data[AESX660_RESPONSE_SIZE_MSB_OFFSET] << 8); + fp_dbg ("Got frame, type %.2x payload of size %.4lx", + priv->stripe_packet->data[AESX660_RESPONSE_TYPE_OFFSET], + payload_length); - still_needed_len = MAX (0, AESX660_HEADER_SIZE + payload_length - (gssize) priv->stripe_packet->len); - copy_len = MIN (actual_length, still_needed_len); - g_byte_array_append (priv->stripe_packet, data, copy_len); - data += copy_len; - actual_length -= copy_len; + still_needed_len = MAX (0, AESX660_HEADER_SIZE + payload_length - (gssize) priv->stripe_packet->len); + copy_len = MIN (actual_length, still_needed_len); + g_byte_array_append (priv->stripe_packet, data, copy_len); + data += copy_len; + actual_length -= copy_len; - /* Do we have a full packet including the payload? */ - if (priv->stripe_packet->len < payload_length + AESX660_HEADER_SIZE) - break; + /* Do we have a full packet including the payload? */ + if (priv->stripe_packet->len < payload_length + AESX660_HEADER_SIZE) + break; - finger_missing |= process_stripe_data(transfer->ssm, - self, - priv->stripe_packet->data, - priv->stripe_packet->len); + finger_missing |= process_stripe_data (transfer->ssm, + self, + priv->stripe_packet->data, + priv->stripe_packet->len); - g_byte_array_set_size (priv->stripe_packet, 0); - } + g_byte_array_set_size (priv->stripe_packet, 0); + } - fp_dbg("finger %s\n", finger_missing ? "missing" : "present"); + fp_dbg ("finger %s\n", finger_missing ? "missing" : "present"); - if (finger_missing) { - fpi_ssm_next_state(transfer->ssm); - } else { - fpi_ssm_jump_to_state(transfer->ssm, CAPTURE_READ_STRIPE_DATA); - } + if (finger_missing) + fpi_ssm_next_state (transfer->ssm); + else + fpi_ssm_jump_to_state (transfer->ssm, CAPTURE_READ_STRIPE_DATA); } -static void capture_run_state(FpiSsm *ssm, FpDevice *_dev, void *user_data) +static void +capture_run_state (FpiSsm *ssm, FpDevice *_dev, void *user_data) { - FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (_dev); - FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); - FpiDeviceAesX660Class *cls = FPI_DEVICE_AES_X660_GET_CLASS (self); + FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (_dev); + FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); + FpiDeviceAesX660Class *cls = FPI_DEVICE_AES_X660_GET_CLASS (self); - switch (fpi_ssm_get_cur_state(ssm)) { - case CAPTURE_SEND_LED_CMD: - aesX660_send_cmd(ssm, _dev, led_solid_cmd, sizeof(led_solid_cmd), - aesX660_send_cmd_cb); - break; - case CAPTURE_SEND_CAPTURE_CMD: - g_byte_array_set_size (priv->stripe_packet, 0); - aesX660_send_cmd(ssm, _dev, cls->start_imaging_cmd, - cls->start_imaging_cmd_len, - aesX660_send_cmd_cb); - break; - case CAPTURE_READ_STRIPE_DATA: - aesX660_read_response(ssm, _dev, FALSE, FALSE, AESX660_BULK_TRANSFER_SIZE, - capture_read_stripe_data_cb); - break; - case CAPTURE_SET_IDLE: - fp_dbg("Got %lu frames\n", priv->strips_len); - aesX660_send_cmd(ssm, _dev, set_idle_cmd, sizeof(set_idle_cmd), - capture_set_idle_cmd_cb); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case CAPTURE_SEND_LED_CMD: + aesX660_send_cmd (ssm, _dev, led_solid_cmd, sizeof (led_solid_cmd), + aesX660_send_cmd_cb); + break; + + case CAPTURE_SEND_CAPTURE_CMD: + g_byte_array_set_size (priv->stripe_packet, 0); + aesX660_send_cmd (ssm, _dev, cls->start_imaging_cmd, + cls->start_imaging_cmd_len, + aesX660_send_cmd_cb); + break; + + case CAPTURE_READ_STRIPE_DATA: + aesX660_read_response (ssm, _dev, FALSE, FALSE, AESX660_BULK_TRANSFER_SIZE, + capture_read_stripe_data_cb); + break; + + case CAPTURE_SET_IDLE: + fp_dbg ("Got %lu frames\n", priv->strips_len); + aesX660_send_cmd (ssm, _dev, set_idle_cmd, sizeof (set_idle_cmd), + capture_set_idle_cmd_cb); + break; + } } -static void capture_sm_complete(FpiSsm *ssm, FpDevice *device, void *user_data, - GError *error) +static void +capture_sm_complete (FpiSsm *ssm, FpDevice *device, void *user_data, + GError *error) { - FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (device); - FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); + FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (device); + FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); - fp_dbg("Capture completed"); - fpi_ssm_free(ssm); + fp_dbg ("Capture completed"); + fpi_ssm_free (ssm); - if (priv->deactivating) { - complete_deactivation(FP_IMAGE_DEVICE (device)); - if (error) - g_error_free (error); - } else if (error) { - fpi_image_device_session_error (FP_IMAGE_DEVICE (device), error); - } else { - start_finger_detection(FP_IMAGE_DEVICE (device)); - } + if (priv->deactivating) + { + complete_deactivation (FP_IMAGE_DEVICE (device)); + if (error) + g_error_free (error); + } + else if (error) + { + fpi_image_device_session_error (FP_IMAGE_DEVICE (device), error); + } + else + { + start_finger_detection (FP_IMAGE_DEVICE (device)); + } } -static void start_capture(FpImageDevice *dev) +static void +start_capture (FpImageDevice *dev) { - FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (dev); - FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); - FpiSsm *ssm; + FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (dev); + FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); + FpiSsm *ssm; - if (priv->deactivating) { - complete_deactivation(dev); - return; - } + if (priv->deactivating) + { + complete_deactivation (dev); + return; + } - ssm = fpi_ssm_new(FP_DEVICE(dev), capture_run_state, - CAPTURE_NUM_STATES, dev); - G_DEBUG_HERE(); - fpi_ssm_start(ssm, capture_sm_complete); + ssm = fpi_ssm_new (FP_DEVICE (dev), capture_run_state, + CAPTURE_NUM_STATES, dev); + G_DEBUG_HERE (); + fpi_ssm_start (ssm, capture_sm_complete); } /****** INITIALIZATION/DEINITIALIZATION ******/ enum activate_states { - ACTIVATE_SET_IDLE, - ACTIVATE_SEND_READ_ID_CMD, - ACTIVATE_READ_ID, - ACTIVATE_SEND_CALIBRATE_CMD, - ACTIVATE_READ_CALIBRATE_DATA, - ACTIVATE_SEND_INIT_CMD, - ACTIVATE_READ_INIT_RESPONSE, - ACTIVATE_NUM_STATES, + ACTIVATE_SET_IDLE, + ACTIVATE_SEND_READ_ID_CMD, + ACTIVATE_READ_ID, + ACTIVATE_SEND_CALIBRATE_CMD, + ACTIVATE_READ_CALIBRATE_DATA, + ACTIVATE_SEND_INIT_CMD, + ACTIVATE_READ_INIT_RESPONSE, + ACTIVATE_NUM_STATES, }; -static void activate_read_id_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +activate_read_id_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (device); - FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); - FpiDeviceAesX660Class *cls = FPI_DEVICE_AES_X660_GET_CLASS (self); - unsigned char *data = transfer->buffer; + FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (device); + FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); + FpiDeviceAesX660Class *cls = FPI_DEVICE_AES_X660_GET_CLASS (self); + unsigned char *data = transfer->buffer; - if (error) { - fp_dbg("read_id cmd failed\n"); - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } - /* ID was read correctly */ - if (data[0] == 0x07) { - fp_dbg("Sensor device id: %.2x%2x, bcdDevice: %.2x.%.2x, init status: %.2x\n", - data[4], data[3], data[5], data[6], data[7]); - } else { - fp_dbg("Bogus read ID response: %.2x\n", data[AESX660_RESPONSE_TYPE_OFFSET]); - fpi_ssm_mark_failed(transfer->ssm, - fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Bogus read ID response")); - return; - } + if (error) + { + fp_dbg ("read_id cmd failed\n"); + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } + /* ID was read correctly */ + if (data[0] == 0x07) + { + fp_dbg ("Sensor device id: %.2x%2x, bcdDevice: %.2x.%.2x, init status: %.2x\n", + data[4], data[3], data[5], data[6], data[7]); + } + else + { + fp_dbg ("Bogus read ID response: %.2x\n", data[AESX660_RESPONSE_TYPE_OFFSET]); + fpi_ssm_mark_failed (transfer->ssm, + fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Bogus read ID response")); + return; + } - switch (priv->init_seq_idx) { - case 0: - priv->init_seq = cls->init_seqs[0]; - priv->init_seq_len = cls->init_seqs_len[0]; - priv->init_seq_idx = 1; - priv->init_cmd_idx = 0; - /* Do calibration only after 1st init sequence */ - fpi_ssm_jump_to_state(transfer->ssm, ACTIVATE_SEND_INIT_CMD); - break; - case 1: - priv->init_seq = cls->init_seqs[1]; - priv->init_seq_len = cls->init_seqs_len[1]; - priv->init_seq_idx = 2; - priv->init_cmd_idx = 0; - fpi_ssm_next_state(transfer->ssm); - break; - default: - fp_dbg("Failed to init device! init status: %.2x\n", data[7]); - fpi_ssm_mark_failed(transfer->ssm, - fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Failed to init device")); - break; - } + switch (priv->init_seq_idx) + { + case 0: + priv->init_seq = cls->init_seqs[0]; + priv->init_seq_len = cls->init_seqs_len[0]; + priv->init_seq_idx = 1; + priv->init_cmd_idx = 0; + /* Do calibration only after 1st init sequence */ + fpi_ssm_jump_to_state (transfer->ssm, ACTIVATE_SEND_INIT_CMD); + break; + + case 1: + priv->init_seq = cls->init_seqs[1]; + priv->init_seq_len = cls->init_seqs_len[1]; + priv->init_seq_idx = 2; + priv->init_cmd_idx = 0; + fpi_ssm_next_state (transfer->ssm); + break; + + default: + fp_dbg ("Failed to init device! init status: %.2x\n", data[7]); + fpi_ssm_mark_failed (transfer->ssm, + fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Failed to init device")); + break; + } } -static void activate_read_init_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +activate_read_init_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (device); - FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); - unsigned char *data = transfer->buffer; + FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (device); + FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); + unsigned char *data = transfer->buffer; - fp_dbg("read_init_cb\n"); + fp_dbg ("read_init_cb\n"); - if (error) { - fp_dbg("read_init transfer status: %s, actual_len: %d\n", error->message, - (gint)transfer->actual_length); - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } - /* ID was read correctly */ - if (data[0] != 0x42 || data[3] != 0x01) { - fp_dbg("Bogus read init response: %.2x %.2x\n", data[0], - data[3]); - fpi_ssm_mark_failed(transfer->ssm, - fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Bogus read init response")); - return; - } - priv->init_cmd_idx++; - if (priv->init_cmd_idx == priv->init_seq_len) { - if (priv->init_seq_idx < 2) - fpi_ssm_jump_to_state(transfer->ssm, - ACTIVATE_SEND_READ_ID_CMD); - else - fpi_ssm_mark_completed(transfer->ssm); - return; - } + if (error) + { + fp_dbg ("read_init transfer status: %s, actual_len: %d\n", error->message, + (gint) transfer->actual_length); + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } + /* ID was read correctly */ + if (data[0] != 0x42 || data[3] != 0x01) + { + fp_dbg ("Bogus read init response: %.2x %.2x\n", data[0], + data[3]); + fpi_ssm_mark_failed (transfer->ssm, + fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Bogus read init response")); + return; + } + priv->init_cmd_idx++; + if (priv->init_cmd_idx == priv->init_seq_len) + { + if (priv->init_seq_idx < 2) + fpi_ssm_jump_to_state (transfer->ssm, + ACTIVATE_SEND_READ_ID_CMD); + else + fpi_ssm_mark_completed (transfer->ssm); + return; + } - fpi_ssm_jump_to_state(transfer->ssm, ACTIVATE_SEND_INIT_CMD); + fpi_ssm_jump_to_state (transfer->ssm, ACTIVATE_SEND_INIT_CMD); } -static void activate_run_state(FpiSsm *ssm, FpDevice *_dev, void *user_data) +static void +activate_run_state (FpiSsm *ssm, FpDevice *_dev, void *user_data) { - FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (_dev); - FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); + FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (_dev); + FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); - switch (fpi_ssm_get_cur_state(ssm)) { - case ACTIVATE_SET_IDLE: - priv->init_seq_idx = 0; - fp_dbg("Activate: set idle\n"); - aesX660_send_cmd(ssm, _dev, set_idle_cmd, sizeof(set_idle_cmd), - aesX660_send_cmd_cb); - break; - case ACTIVATE_SEND_READ_ID_CMD: - fp_dbg("Activate: read ID\n"); - aesX660_send_cmd(ssm, _dev, read_id_cmd, sizeof(read_id_cmd), - aesX660_send_cmd_cb); - break; - case ACTIVATE_READ_ID: - aesX660_read_response(ssm, _dev, TRUE, FALSE, ID_LEN, activate_read_id_cb); - break; - case ACTIVATE_SEND_INIT_CMD: - fp_dbg("Activate: send init seq #%d cmd #%d\n", - priv->init_seq_idx, - priv->init_cmd_idx); - aesX660_send_cmd(ssm, _dev, - priv->init_seq[priv->init_cmd_idx].cmd, - priv->init_seq[priv->init_cmd_idx].len, - aesX660_send_cmd_cb); - break; - case ACTIVATE_READ_INIT_RESPONSE: - fp_dbg("Activate: read init response\n"); - aesX660_read_response(ssm, _dev, TRUE, FALSE, INIT_LEN, activate_read_init_cb); - break; - case ACTIVATE_SEND_CALIBRATE_CMD: - aesX660_send_cmd(ssm, _dev, calibrate_cmd, sizeof(calibrate_cmd), - aesX660_send_cmd_cb); - break; - case ACTIVATE_READ_CALIBRATE_DATA: - aesX660_read_response(ssm, _dev, TRUE, FALSE, CALIBRATE_DATA_LEN, aesX660_read_calibrate_data_cb); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case ACTIVATE_SET_IDLE: + priv->init_seq_idx = 0; + fp_dbg ("Activate: set idle\n"); + aesX660_send_cmd (ssm, _dev, set_idle_cmd, sizeof (set_idle_cmd), + aesX660_send_cmd_cb); + break; + + case ACTIVATE_SEND_READ_ID_CMD: + fp_dbg ("Activate: read ID\n"); + aesX660_send_cmd (ssm, _dev, read_id_cmd, sizeof (read_id_cmd), + aesX660_send_cmd_cb); + break; + + case ACTIVATE_READ_ID: + aesX660_read_response (ssm, _dev, TRUE, FALSE, ID_LEN, activate_read_id_cb); + break; + + case ACTIVATE_SEND_INIT_CMD: + fp_dbg ("Activate: send init seq #%d cmd #%d\n", + priv->init_seq_idx, + priv->init_cmd_idx); + aesX660_send_cmd (ssm, _dev, + priv->init_seq[priv->init_cmd_idx].cmd, + priv->init_seq[priv->init_cmd_idx].len, + aesX660_send_cmd_cb); + break; + + case ACTIVATE_READ_INIT_RESPONSE: + fp_dbg ("Activate: read init response\n"); + aesX660_read_response (ssm, _dev, TRUE, FALSE, INIT_LEN, activate_read_init_cb); + break; + + case ACTIVATE_SEND_CALIBRATE_CMD: + aesX660_send_cmd (ssm, _dev, calibrate_cmd, sizeof (calibrate_cmd), + aesX660_send_cmd_cb); + break; + + case ACTIVATE_READ_CALIBRATE_DATA: + aesX660_read_response (ssm, _dev, TRUE, FALSE, CALIBRATE_DATA_LEN, aesX660_read_calibrate_data_cb); + break; + } } -static void activate_sm_complete(FpiSsm *ssm, FpDevice *_dev, - void *user_data, GError *error) +static void +activate_sm_complete (FpiSsm *ssm, FpDevice *_dev, + void *user_data, GError *error) { - fpi_image_device_activate_complete (FP_IMAGE_DEVICE (_dev), error); - fpi_ssm_free(ssm); + fpi_image_device_activate_complete (FP_IMAGE_DEVICE (_dev), error); + fpi_ssm_free (ssm); - if (!error) - start_finger_detection(FP_IMAGE_DEVICE (_dev)); + if (!error) + start_finger_detection (FP_IMAGE_DEVICE (_dev)); } -static void aesX660_dev_activate(FpImageDevice *dev) +static void +aesX660_dev_activate (FpImageDevice *dev) { - FpiSsm *ssm = fpi_ssm_new(FP_DEVICE(dev), activate_run_state, - ACTIVATE_NUM_STATES, dev); - fpi_ssm_start(ssm, activate_sm_complete); + FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (dev), activate_run_state, + ACTIVATE_NUM_STATES, dev); + + fpi_ssm_start (ssm, activate_sm_complete); } -static void aesX660_dev_deactivate(FpImageDevice *dev) +static void +aesX660_dev_deactivate (FpImageDevice *dev) { - FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (dev); - FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); + FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (dev); + FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); - priv->deactivating = TRUE; + priv->deactivating = TRUE; } -static void aesX660_dev_init(FpImageDevice *dev) +static void +aesX660_dev_init (FpImageDevice *dev) { - FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (dev); - FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); - GError *error = NULL; + FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (dev); + FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); + GError *error = NULL; - g_usb_device_claim_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), 0, 0, &error); + g_usb_device_claim_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), 0, 0, &error); - priv->stripe_packet = g_byte_array_new (); + priv->stripe_packet = g_byte_array_new (); - fpi_image_device_open_complete(dev, error); + fpi_image_device_open_complete (dev, error); } -static void aesX660_dev_deinit(FpImageDevice *dev) +static void +aesX660_dev_deinit (FpImageDevice *dev) { - FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (dev); - FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); - GError *error = NULL; + FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (dev); + FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); + GError *error = NULL; - g_usb_device_release_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), - 0, 0, &error); + g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), + 0, 0, &error); - g_clear_pointer (&priv->stripe_packet, g_byte_array_unref); + g_clear_pointer (&priv->stripe_packet, g_byte_array_unref); - fpi_image_device_close_complete(dev, error); + fpi_image_device_close_complete (dev, error); } -static void complete_deactivation(FpImageDevice *dev) +static void +complete_deactivation (FpImageDevice *dev) { - FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (dev); - FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); + FpiDeviceAesX660 *self = FPI_DEVICE_AES_X660 (dev); + FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self); - G_DEBUG_HERE(); + G_DEBUG_HERE (); - priv->deactivating = FALSE; - g_slist_free(priv->strips); - priv->strips = NULL; - priv->strips_len = 0; - fpi_image_device_deactivate_complete(dev, NULL); + priv->deactivating = FALSE; + g_slist_free (priv->strips); + priv->strips = NULL; + priv->strips_len = 0; + fpi_image_device_deactivate_complete (dev, NULL); } -static void fpi_device_aes_x660_init(FpiDeviceAesX660 *self) { +static void +fpi_device_aes_x660_init (FpiDeviceAesX660 *self) +{ } -static void fpi_device_aes_x660_class_init(FpiDeviceAesX660Class *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); - FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS(klass); +static void +fpi_device_aes_x660_class_init (FpiDeviceAesX660Class *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); + FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); - dev_class->type = FP_DEVICE_TYPE_USB; - dev_class->scan_type = FP_SCAN_TYPE_SWIPE; + dev_class->type = FP_DEVICE_TYPE_USB; + dev_class->scan_type = FP_SCAN_TYPE_SWIPE; - img_class->img_open = aesX660_dev_init; - img_class->img_close = aesX660_dev_deinit; - img_class->activate = aesX660_dev_activate; - img_class->deactivate = aesX660_dev_deactivate; + img_class->img_open = aesX660_dev_init; + img_class->img_close = aesX660_dev_deinit; + img_class->activate = aesX660_dev_activate; + img_class->deactivate = aesX660_dev_deactivate; - /* Everything else is set by the subclasses. */ + /* Everything else is set by the subclasses. */ } diff --git a/libfprint/drivers/aesx660.h b/libfprint/drivers/aesx660.h index 4d6faf5..baf3671 100644 --- a/libfprint/drivers/aesx660.h +++ b/libfprint/drivers/aesx660.h @@ -42,69 +42,70 @@ #define AESX660_FRAME_HEIGHT 8 -G_DECLARE_DERIVABLE_TYPE(FpiDeviceAesX660, fpi_device_aes_x660, FPI, - DEVICE_AES_X660, FpImageDevice) +G_DECLARE_DERIVABLE_TYPE (FpiDeviceAesX660, fpi_device_aes_x660, FPI, + DEVICE_AES_X660, FpImageDevice) #define FPI_TYPE_DEVICE_AES_X660 (fpi_device_aes_x660_get_type ()) -struct _FpiDeviceAesX660Class { - FpImageDeviceClass parent; +struct _FpiDeviceAesX660Class +{ + FpImageDeviceClass parent; - struct aesX660_cmd *init_seqs[2]; - gsize init_seqs_len[2]; - guint8 *start_imaging_cmd; - gsize start_imaging_cmd_len; + struct aesX660_cmd *init_seqs[2]; + gsize init_seqs_len[2]; + guint8 *start_imaging_cmd; + gsize start_imaging_cmd_len; struct fpi_frame_asmbl_ctx *assembling_ctx; }; -struct aesX660_cmd { +struct aesX660_cmd +{ const guint8 *cmd; - gsize len; + gsize len; }; /* 0x77 cmd seems to control LED, this sequence * makes LED blink */ static const guint8 led_blink_cmd[] = { -0x77, 0x18, 0x00, -0x00, 0x3f, 0x00, 0xff, 0x00, -0x01, 0x01, 0x00, 0x00, 0x00, 0xf3, 0x01, 0x00, -0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xf3, -0x01, 0x00, 0x7f + 0x77, 0x18, 0x00, + 0x00, 0x3f, 0x00, 0xff, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0xf3, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xf3, + 0x01, 0x00, 0x7f }; /* This sequence makes LED light solid */ static const guint8 led_solid_cmd[] = { -0x77, 0x18, 0x00, 0x00, 0x3f, 0x00, 0xff, 0x00, -0x01, 0x01, 0x00, 0x00, 0x00, 0xe7, 0x03, 0x00, -0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7f + 0x77, 0x18, 0x00, 0x00, 0x3f, 0x00, 0xff, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0xe7, 0x03, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7f }; static const guint8 wait_for_finger_cmd[] = { -0x20, -0x40, 0x04, 0x00, 0x02, 0x1e, 0x00, 0x32 + 0x20, + 0x40, 0x04, 0x00, 0x02, 0x1e, 0x00, 0x32 }; /* 0x40 cmd response * -static const guint8 pkt1371[] = { -0x40, 0x01, 0x00, 0x01 -}; -*/ + static const guint8 pkt1371[] = { + 0x40, 0x01, 0x00, 0x01 + }; + */ static const guint8 set_idle_cmd[] = { - 0x0d, /* Reset or "set idle"? */ + 0x0d, /* Reset or "set idle"? */ }; static const guint8 read_id_cmd[] = { - 0x44, 0x02, 0x00, 0x08, 0x00, /* Max transfer size is 8 */ - 0x07, /* Read ID? */ + 0x44, 0x02, 0x00, 0x08, 0x00, /* Max transfer size is 8 */ + 0x07, /* Read ID? */ }; static const guint8 calibrate_cmd[] = { - 0x44, 0x02, 0x00, 0x04, 0x00, - 0x06, + 0x44, 0x02, 0x00, 0x04, 0x00, + 0x06, }; - diff --git a/libfprint/drivers/driver_ids.h b/libfprint/drivers/driver_ids.h index 012a3d0..4270842 100644 --- a/libfprint/drivers/driver_ids.h +++ b/libfprint/drivers/driver_ids.h @@ -21,27 +21,27 @@ #define __DRIVER_IDS enum { - UPEKTS_ID = 1, - URU4000_ID = 2, - AES4000_ID = 3, - AES2501_ID = 4, - UPEKTC_ID = 5, - AES1610_ID = 6, - /* FDU2000_ID = 7, */ - VCOM5S_ID = 8, - UPEKSONLY_ID = 9, - VFS101_ID = 10, - VFS301_ID = 11, - AES2550_ID = 12, - /* UPEKE2_ID = 13 */ - AES1660_ID = 14, - AES2660_ID = 15, - AES3500_ID = 16, - UPEKTC_IMG_ID = 17, - ETES603_ID = 18, - VFS5011_ID = 19, - VFS0050_ID = 20, - ELAN_ID = 21, + UPEKTS_ID = 1, + URU4000_ID = 2, + AES4000_ID = 3, + AES2501_ID = 4, + UPEKTC_ID = 5, + AES1610_ID = 6, + /* FDU2000_ID = 7, */ + VCOM5S_ID = 8, + UPEKSONLY_ID = 9, + VFS101_ID = 10, + VFS301_ID = 11, + AES2550_ID = 12, + /* UPEKE2_ID = 13 */ + AES1660_ID = 14, + AES2660_ID = 15, + AES3500_ID = 16, + UPEKTC_IMG_ID = 17, + ETES603_ID = 18, + VFS5011_ID = 19, + VFS0050_ID = 20, + ELAN_ID = 21, }; #endif diff --git a/libfprint/drivers/elan.c b/libfprint/drivers/elan.c index 9771bb5..0010086 100644 --- a/libfprint/drivers/elan.c +++ b/libfprint/drivers/elan.c @@ -41,120 +41,128 @@ #include "drivers_api.h" #include "elan.h" -unsigned char elan_get_pixel(struct fpi_frame_asmbl_ctx *ctx, - struct fpi_frame *frame, unsigned int x, - unsigned int y) +unsigned char +elan_get_pixel (struct fpi_frame_asmbl_ctx *ctx, + struct fpi_frame *frame, unsigned int x, + unsigned int y) { - return frame->data[x + y * ctx->frame_width]; + return frame->data[x + y * ctx->frame_width]; } static struct fpi_frame_asmbl_ctx assembling_ctx = { - .frame_width = 0, - .frame_height = 0, - .image_width = 0, - .get_pixel = elan_get_pixel, + .frame_width = 0, + .frame_height = 0, + .image_width = 0, + .get_pixel = elan_get_pixel, }; -struct _FpiDeviceElan { - FpImageDevice parent; +struct _FpiDeviceElan +{ + FpImageDevice parent; - /* device config */ - unsigned short dev_type; - unsigned short fw_ver; - void (*process_frame) (unsigned short *raw_frame, GSList ** frames); - /* end device config */ + /* device config */ + unsigned short dev_type; + unsigned short fw_ver; + void (*process_frame) (unsigned short *raw_frame, + GSList ** frames); + /* end device config */ - /* commands */ - const struct elan_cmd *cmd; - int cmd_timeout; - /* end commands */ + /* commands */ + const struct elan_cmd *cmd; + int cmd_timeout; + /* end commands */ - /* state */ - gboolean deactivating; - FpImageDeviceState dev_state; - FpImageDeviceState dev_state_next; - unsigned char *last_read; - unsigned char calib_atts_left; - unsigned char calib_status; - unsigned short *background; - unsigned char frame_width; - unsigned char frame_height; - unsigned char raw_frame_height; - int num_frames; - GSList *frames; - /* end state */ + /* state */ + gboolean deactivating; + FpImageDeviceState dev_state; + FpImageDeviceState dev_state_next; + unsigned char *last_read; + unsigned char calib_atts_left; + unsigned char calib_status; + unsigned short *background; + unsigned char frame_width; + unsigned char frame_height; + unsigned char raw_frame_height; + int num_frames; + GSList *frames; + /* end state */ }; -G_DECLARE_FINAL_TYPE(FpiDeviceElan, fpi_device_elan, FPI, DEVICE_ELAN, - FpImageDevice); -G_DEFINE_TYPE(FpiDeviceElan, fpi_device_elan, FP_TYPE_IMAGE_DEVICE); +G_DECLARE_FINAL_TYPE (FpiDeviceElan, fpi_device_elan, FPI, DEVICE_ELAN, + FpImageDevice); +G_DEFINE_TYPE (FpiDeviceElan, fpi_device_elan, FP_TYPE_IMAGE_DEVICE); -int cmp_short(const void *a, const void *b) +int +cmp_short (const void *a, const void *b) { - return (int)(*(short *)a - *(short *)b); + return (int) (*(short *) a - *(short *) b); } -static void elan_dev_reset_state(FpiDeviceElan *elandev) +static void +elan_dev_reset_state (FpiDeviceElan *elandev) { - G_DEBUG_HERE(); + G_DEBUG_HERE (); - elandev->cmd = NULL; - elandev->cmd_timeout = ELAN_CMD_TIMEOUT; + elandev->cmd = NULL; + elandev->cmd_timeout = ELAN_CMD_TIMEOUT; - elandev->calib_status = 0; + elandev->calib_status = 0; - g_free(elandev->last_read); - elandev->last_read = NULL; + g_free (elandev->last_read); + elandev->last_read = NULL; - g_slist_free_full(elandev->frames, g_free); - elandev->frames = NULL; - elandev->num_frames = 0; + g_slist_free_full (elandev->frames, g_free); + elandev->frames = NULL; + elandev->num_frames = 0; } -static void elan_save_frame(FpiDeviceElan *self, unsigned short *frame) +static void +elan_save_frame (FpiDeviceElan *self, unsigned short *frame) { - G_DEBUG_HERE(); + G_DEBUG_HERE (); - /* so far 3 types of readers by sensor dimensions and orientation have been - * seen in the wild: - * 1. 144x64. Raw images are in portrait orientation while readers themselves - * are placed (e.g. built into a touchpad) in landscape orientation. These - * need to be rotated before assembling. - * 2. 96x96 rotated. Like the first type but square. Likewise, need to be - * rotated before assembling. - * 3. 96x96 normal. Square and need NOT be rotated. So far there's only been - * 1 report of a 0c03 of this type. Hopefully this type can be identified - * by device id (and manufacturers don't just install the readers as they - * please). - * we also discard stripes of 'frame_margin' from bottom and top because - * assembling works bad for tall frames */ + /* so far 3 types of readers by sensor dimensions and orientation have been + * seen in the wild: + * 1. 144x64. Raw images are in portrait orientation while readers themselves + * are placed (e.g. built into a touchpad) in landscape orientation. These + * need to be rotated before assembling. + * 2. 96x96 rotated. Like the first type but square. Likewise, need to be + * rotated before assembling. + * 3. 96x96 normal. Square and need NOT be rotated. So far there's only been + * 1 report of a 0c03 of this type. Hopefully this type can be identified + * by device id (and manufacturers don't just install the readers as they + * please). + * we also discard stripes of 'frame_margin' from bottom and top because + * assembling works bad for tall frames */ - unsigned char frame_width = self->frame_width; - unsigned char frame_height = self->frame_height; - unsigned char raw_height = self->raw_frame_height; - unsigned char frame_margin = (raw_height - self->frame_height) / 2; - int frame_idx, raw_idx; + unsigned char frame_width = self->frame_width; + unsigned char frame_height = self->frame_height; + unsigned char raw_height = self->raw_frame_height; + unsigned char frame_margin = (raw_height - self->frame_height) / 2; + int frame_idx, raw_idx; - for (int y = 0; y < frame_height; y++) - for (int x = 0; x < frame_width; x++) { - if (self->dev_type & ELAN_NOT_ROTATED) - raw_idx = x + (y + frame_margin) * frame_width; - else - raw_idx = frame_margin + y + x * raw_height; - frame_idx = x + y * frame_width; - frame[frame_idx] = - ((unsigned short *) self->last_read)[raw_idx]; - } + for (int y = 0; y < frame_height; y++) + for (int x = 0; x < frame_width; x++) + { + if (self->dev_type & ELAN_NOT_ROTATED) + raw_idx = x + (y + frame_margin) * frame_width; + else + raw_idx = frame_margin + y + x * raw_height; + frame_idx = x + y * frame_width; + frame[frame_idx] = + ((unsigned short *) self->last_read)[raw_idx]; + } } -static void elan_save_background(FpiDeviceElan *elandev) +static void +elan_save_background (FpiDeviceElan *elandev) { - G_DEBUG_HERE(); + G_DEBUG_HERE (); - g_free(elandev->background); - elandev->background = - g_malloc(elandev->frame_width * elandev->frame_height * - sizeof(short)); - elan_save_frame(elandev, elandev->background); + g_free (elandev->background); + elandev->background = + g_malloc (elandev->frame_width * elandev->frame_height * + sizeof (short)); + elan_save_frame (elandev, elandev->background); } /* save a frame as part of the fingerprint image @@ -192,792 +200,904 @@ static void elan_save_background(FpiDeviceElan *elandev) * \ * ======== 0 \___> ======== 0 */ -static int elan_save_img_frame(FpiDeviceElan *elandev) +static int +elan_save_img_frame (FpiDeviceElan *elandev) { - G_DEBUG_HERE(); + G_DEBUG_HERE (); - unsigned int frame_size = elandev->frame_width * elandev->frame_height; - unsigned short *frame = g_malloc(frame_size * sizeof(short)); - elan_save_frame(elandev, frame); - unsigned int sum = 0; + unsigned int frame_size = elandev->frame_width * elandev->frame_height; + unsigned short *frame = g_malloc (frame_size * sizeof (short)); + elan_save_frame (elandev, frame); + unsigned int sum = 0; - for (int i = 0; i < frame_size; i++) { - if (elandev->background[i] > frame[i]) - frame[i] = 0; - else - frame[i] -= elandev->background[i]; - sum += frame[i]; - } + for (int i = 0; i < frame_size; i++) + { + if (elandev->background[i] > frame[i]) + frame[i] = 0; + else + frame[i] -= elandev->background[i]; + sum += frame[i]; + } - if (sum == 0) { - fp_dbg - ("frame darker than background; finger present during calibration?"); - return -1; - } + if (sum == 0) + { + fp_dbg + ("frame darker than background; finger present during calibration?"); + return -1; + } - elandev->frames = g_slist_prepend(elandev->frames, frame); - elandev->num_frames += 1; - return 0; -} - -static void elan_process_frame_linear(unsigned short *raw_frame, - GSList ** frames) -{ - unsigned int frame_size = - assembling_ctx.frame_width * assembling_ctx.frame_height; - struct fpi_frame *frame = - g_malloc(frame_size + sizeof(struct fpi_frame)); - - G_DEBUG_HERE(); - - unsigned short min = 0xffff, max = 0; - for (int i = 0; i < frame_size; i++) { - if (raw_frame[i] < min) - min = raw_frame[i]; - if (raw_frame[i] > max) - max = raw_frame[i]; - } - - g_assert(max != min); - - unsigned short px; - for (int i = 0; i < frame_size; i++) { - px = raw_frame[i]; - px = (px - min) * 0xff / (max - min); - frame->data[i] = (unsigned char)px; - } - - *frames = g_slist_prepend(*frames, frame); -} - -static void elan_process_frame_thirds(unsigned short *raw_frame, - GSList ** frames) -{ - G_DEBUG_HERE(); - - unsigned int frame_size = - assembling_ctx.frame_width * assembling_ctx.frame_height; - struct fpi_frame *frame = - g_malloc(frame_size + sizeof(struct fpi_frame)); - - unsigned short lvl0, lvl1, lvl2, lvl3; - unsigned short *sorted = g_malloc(frame_size * sizeof(short)); - memcpy(sorted, raw_frame, frame_size * sizeof(short)); - qsort(sorted, frame_size, sizeof(short), cmp_short); - lvl0 = sorted[0]; - lvl1 = sorted[frame_size * 3 / 10]; - lvl2 = sorted[frame_size * 65 / 100]; - lvl3 = sorted[frame_size - 1]; - g_free(sorted); - - unsigned short px; - for (int i = 0; i < frame_size; i++) { - px = raw_frame[i]; - if (lvl0 <= px && px < lvl1) - px = (px - lvl0) * 99 / (lvl1 - lvl0); - else if (lvl1 <= px && px < lvl2) - px = 99 + ((px - lvl1) * 56 / (lvl2 - lvl1)); - else // (lvl2 <= px && px <= lvl3) - px = 155 + ((px - lvl2) * 100 / (lvl3 - lvl2)); - frame->data[i] = (unsigned char)px; - } - - *frames = g_slist_prepend(*frames, frame); -} - -static void elan_submit_image(FpImageDevice *dev) -{ - FpiDeviceElan *self = FPI_DEVICE_ELAN(dev); - GSList *raw_frames; - GSList *frames = NULL; - FpImage *img; - - G_DEBUG_HERE(); - - raw_frames = g_slist_nth(self->frames, ELAN_SKIP_LAST_FRAMES); - - assembling_ctx.frame_width = self->frame_width; - assembling_ctx.frame_height = self->frame_height; - assembling_ctx.image_width = self->frame_width * 3 / 2; - g_slist_foreach(raw_frames, (GFunc) self->process_frame, &frames); - fpi_do_movement_estimation(&assembling_ctx, frames); - img = fpi_assemble_frames(&assembling_ctx, frames); - - fpi_image_device_image_captured(dev, img); -} - -static void elan_cmd_done(FpiSsm *ssm) -{ - G_DEBUG_HERE(); - fpi_ssm_next_state(ssm); -} - -static void elan_cmd_cb(FpiUsbTransfer *transfer, FpDevice *dev, - gpointer user_data, GError *error) -{ - FpiSsm *ssm = transfer->ssm; - FpiDeviceElan *self = FPI_DEVICE_ELAN (dev); - - G_DEBUG_HERE(); - - if (error) { - /* XXX: In the cancellation case we used to not - * mark the SSM as failed?! */ - fpi_ssm_mark_failed (transfer->ssm, error); - return; - } - - /* XXX: We used to reset the device in error cases! */ - if (transfer->endpoint & FPI_USB_ENDPOINT_IN) { - /* just finished receiving */ - self->last_read = g_memdup(transfer->buffer, transfer->actual_length); - elan_cmd_done(ssm); - } else { - /* just finished sending */ - G_DEBUG_HERE(); - elan_cmd_read(ssm, dev); - } -} - -static void elan_cmd_read(FpiSsm *ssm, FpDevice *dev) -{ - FpiDeviceElan *self = FPI_DEVICE_ELAN(dev); - FpiUsbTransfer *transfer; - GCancellable *cancellable = NULL; - int response_len = self->cmd->response_len; - - G_DEBUG_HERE(); - - if (self->cmd->response_len == ELAN_CMD_SKIP_READ) { - fp_dbg("skipping read, not expecting anything"); - elan_cmd_done(ssm); - return; - } - - if (self->dev_type == ELAN_0C42) { - /* ELAN_0C42 sends an extra byte in one byte responses */ - if (self->cmd->response_len == 1) - response_len = 2; - } - - if (self->cmd->cmd == get_image_cmd.cmd) - /* raw data has 2-byte "pixels" and the frame is vertical */ - response_len = - self->raw_frame_height * self->frame_width * 2; - - g_clear_pointer(&self->last_read, g_free); - - transfer = fpi_usb_transfer_new (dev); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - - fpi_usb_transfer_fill_bulk (transfer, - self->cmd->response_in, - response_len); - - if (!self->cmd->never_cancel) - cancellable = fpi_device_get_cancellable (dev); - - fpi_usb_transfer_submit (transfer, self->cmd_timeout, cancellable, elan_cmd_cb, NULL); - fpi_usb_transfer_unref (transfer); + elandev->frames = g_slist_prepend (elandev->frames, frame); + elandev->num_frames += 1; + return 0; } static void -elan_run_cmd(FpiSsm *ssm, - FpDevice *dev, - const struct elan_cmd *cmd, - int cmd_timeout) +elan_process_frame_linear (unsigned short *raw_frame, + GSList ** frames) { - FpiDeviceElan *self = FPI_DEVICE_ELAN(dev); - FpiUsbTransfer *transfer; - GCancellable *cancellable = NULL; + unsigned int frame_size = + assembling_ctx.frame_width * assembling_ctx.frame_height; + struct fpi_frame *frame = + g_malloc (frame_size + sizeof (struct fpi_frame)); - self->cmd = cmd; - if (cmd_timeout != -1) - self->cmd_timeout = cmd_timeout; + G_DEBUG_HERE (); - if (cmd->devices != ELAN_ALL_DEV && !(cmd->devices & self->dev_type)) { - fp_dbg("skipping command 0x%x 0x%x for this device (for devices 0x%x but device is 0x%x)", - cmd->cmd[0], cmd->cmd[1], cmd->devices, self->dev_type); - elan_cmd_done(ssm); - return; - } + unsigned short min = 0xffff, max = 0; + for (int i = 0; i < frame_size; i++) + { + if (raw_frame[i] < min) + min = raw_frame[i]; + if (raw_frame[i] > max) + max = raw_frame[i]; + } - transfer = fpi_usb_transfer_new (dev); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; + g_assert (max != min); - fpi_usb_transfer_fill_bulk_full (transfer, - ELAN_EP_CMD_OUT, - (guint8*) cmd->cmd, - ELAN_CMD_LEN, - NULL); + unsigned short px; + for (int i = 0; i < frame_size; i++) + { + px = raw_frame[i]; + px = (px - min) * 0xff / (max - min); + frame->data[i] = (unsigned char) px; + } - if (!self->cmd->never_cancel) - cancellable = fpi_device_get_cancellable (dev); + *frames = g_slist_prepend (*frames, frame); +} - fpi_usb_transfer_submit (transfer, - self->cmd_timeout, - cancellable, - elan_cmd_cb, - NULL); - fpi_usb_transfer_unref (transfer); +static void +elan_process_frame_thirds (unsigned short *raw_frame, + GSList ** frames) +{ + G_DEBUG_HERE (); + + unsigned int frame_size = + assembling_ctx.frame_width * assembling_ctx.frame_height; + struct fpi_frame *frame = + g_malloc (frame_size + sizeof (struct fpi_frame)); + + unsigned short lvl0, lvl1, lvl2, lvl3; + unsigned short *sorted = g_malloc (frame_size * sizeof (short)); + memcpy (sorted, raw_frame, frame_size * sizeof (short)); + qsort (sorted, frame_size, sizeof (short), cmp_short); + lvl0 = sorted[0]; + lvl1 = sorted[frame_size * 3 / 10]; + lvl2 = sorted[frame_size * 65 / 100]; + lvl3 = sorted[frame_size - 1]; + g_free (sorted); + + unsigned short px; + for (int i = 0; i < frame_size; i++) + { + px = raw_frame[i]; + if (lvl0 <= px && px < lvl1) + px = (px - lvl0) * 99 / (lvl1 - lvl0); + else if (lvl1 <= px && px < lvl2) + px = 99 + ((px - lvl1) * 56 / (lvl2 - lvl1)); + else // (lvl2 <= px && px <= lvl3) + px = 155 + ((px - lvl2) * 100 / (lvl3 - lvl2)); + frame->data[i] = (unsigned char) px; + } + + *frames = g_slist_prepend (*frames, frame); +} + +static void +elan_submit_image (FpImageDevice *dev) +{ + FpiDeviceElan *self = FPI_DEVICE_ELAN (dev); + GSList *raw_frames; + GSList *frames = NULL; + FpImage *img; + + G_DEBUG_HERE (); + + raw_frames = g_slist_nth (self->frames, ELAN_SKIP_LAST_FRAMES); + + assembling_ctx.frame_width = self->frame_width; + assembling_ctx.frame_height = self->frame_height; + assembling_ctx.image_width = self->frame_width * 3 / 2; + g_slist_foreach (raw_frames, (GFunc) self->process_frame, &frames); + fpi_do_movement_estimation (&assembling_ctx, frames); + img = fpi_assemble_frames (&assembling_ctx, frames); + + fpi_image_device_image_captured (dev, img); +} + +static void +elan_cmd_done (FpiSsm *ssm) +{ + G_DEBUG_HERE (); + fpi_ssm_next_state (ssm); +} + +static void +elan_cmd_cb (FpiUsbTransfer *transfer, FpDevice *dev, + gpointer user_data, GError *error) +{ + FpiSsm *ssm = transfer->ssm; + FpiDeviceElan *self = FPI_DEVICE_ELAN (dev); + + G_DEBUG_HERE (); + + if (error) + { + /* XXX: In the cancellation case we used to not + * mark the SSM as failed?! */ + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } + + /* XXX: We used to reset the device in error cases! */ + if (transfer->endpoint & FPI_USB_ENDPOINT_IN) + { + /* just finished receiving */ + self->last_read = g_memdup (transfer->buffer, transfer->actual_length); + elan_cmd_done (ssm); + } + else + { + /* just finished sending */ + G_DEBUG_HERE (); + elan_cmd_read (ssm, dev); + } +} + +static void +elan_cmd_read (FpiSsm *ssm, FpDevice *dev) +{ + FpiDeviceElan *self = FPI_DEVICE_ELAN (dev); + FpiUsbTransfer *transfer; + GCancellable *cancellable = NULL; + int response_len = self->cmd->response_len; + + G_DEBUG_HERE (); + + if (self->cmd->response_len == ELAN_CMD_SKIP_READ) + { + fp_dbg ("skipping read, not expecting anything"); + elan_cmd_done (ssm); + return; + } + + if (self->dev_type == ELAN_0C42) + { + /* ELAN_0C42 sends an extra byte in one byte responses */ + if (self->cmd->response_len == 1) + response_len = 2; + } + + if (self->cmd->cmd == get_image_cmd.cmd) + /* raw data has 2-byte "pixels" and the frame is vertical */ + response_len = + self->raw_frame_height * self->frame_width * 2; + + g_clear_pointer (&self->last_read, g_free); + + transfer = fpi_usb_transfer_new (dev); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + + fpi_usb_transfer_fill_bulk (transfer, + self->cmd->response_in, + response_len); + + if (!self->cmd->never_cancel) + cancellable = fpi_device_get_cancellable (dev); + + fpi_usb_transfer_submit (transfer, self->cmd_timeout, cancellable, elan_cmd_cb, NULL); + fpi_usb_transfer_unref (transfer); +} + +static void +elan_run_cmd (FpiSsm *ssm, + FpDevice *dev, + const struct elan_cmd *cmd, + int cmd_timeout) +{ + FpiDeviceElan *self = FPI_DEVICE_ELAN (dev); + FpiUsbTransfer *transfer; + GCancellable *cancellable = NULL; + + self->cmd = cmd; + if (cmd_timeout != -1) + self->cmd_timeout = cmd_timeout; + + if (cmd->devices != ELAN_ALL_DEV && !(cmd->devices & self->dev_type)) + { + fp_dbg ("skipping command 0x%x 0x%x for this device (for devices 0x%x but device is 0x%x)", + cmd->cmd[0], cmd->cmd[1], cmd->devices, self->dev_type); + elan_cmd_done (ssm); + return; + } + + transfer = fpi_usb_transfer_new (dev); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + + fpi_usb_transfer_fill_bulk_full (transfer, + ELAN_EP_CMD_OUT, + (guint8 *) cmd->cmd, + ELAN_CMD_LEN, + NULL); + + if (!self->cmd->never_cancel) + cancellable = fpi_device_get_cancellable (dev); + + fpi_usb_transfer_submit (transfer, + self->cmd_timeout, + cancellable, + elan_cmd_cb, + NULL); + fpi_usb_transfer_unref (transfer); } enum stop_capture_states { - STOP_CAPTURE, - STOP_CAPTURE_NUM_STATES, + STOP_CAPTURE, + STOP_CAPTURE_NUM_STATES, }; -static void stop_capture_run_state(FpiSsm *ssm, FpDevice *dev, - void *user_data) +static void +stop_capture_run_state (FpiSsm *ssm, FpDevice *dev, + void *user_data) { - G_DEBUG_HERE(); + G_DEBUG_HERE (); - switch (fpi_ssm_get_cur_state(ssm)) { - case STOP_CAPTURE: - elan_run_cmd(ssm, dev, &stop_cmd, - ELAN_CMD_TIMEOUT); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case STOP_CAPTURE: + elan_run_cmd (ssm, dev, &stop_cmd, + ELAN_CMD_TIMEOUT); + break; + } } -static void stop_capture_complete(FpiSsm *ssm, FpDevice *_dev, - void *user_data, GError *error) +static void +stop_capture_complete (FpiSsm *ssm, FpDevice *_dev, + void *user_data, GError *error) { - FpImageDevice *dev = user_data; - FpiDeviceElan *self = FPI_DEVICE_ELAN(dev); + FpImageDevice *dev = user_data; + FpiDeviceElan *self = FPI_DEVICE_ELAN (dev); - G_DEBUG_HERE(); + G_DEBUG_HERE (); - fpi_ssm_free(ssm); + fpi_ssm_free (ssm); - /* The device is inactive at this point. */ - self->dev_state = FP_IMAGE_DEVICE_STATE_INACTIVE; + /* The device is inactive at this point. */ + self->dev_state = FP_IMAGE_DEVICE_STATE_INACTIVE; - if (self->deactivating) { - /* Simply complete the pending deactivation. */ - self->deactivating = FALSE; - fpi_image_device_deactivate_complete (dev, error); - return; - } + if (self->deactivating) + { + /* Simply complete the pending deactivation. */ + self->deactivating = FALSE; + fpi_image_device_deactivate_complete (dev, error); + return; + } - if (!error) { - fpi_image_device_report_finger_status(dev, FALSE); - } else { - /* NOTE: We cannot get a cancellation error here. */ - fpi_image_device_session_error (dev, error); - } + if (!error) + fpi_image_device_report_finger_status (dev, FALSE); + else + /* NOTE: We cannot get a cancellation error here. */ + fpi_image_device_session_error (dev, error); } -static void elan_stop_capture(FpDevice *dev) +static void +elan_stop_capture (FpDevice *dev) { - FpiDeviceElan *self = FPI_DEVICE_ELAN(dev); + FpiDeviceElan *self = FPI_DEVICE_ELAN (dev); - G_DEBUG_HERE(); + G_DEBUG_HERE (); - elan_dev_reset_state(self); + elan_dev_reset_state (self); - FpiSsm *ssm = - fpi_ssm_new(dev, stop_capture_run_state, - STOP_CAPTURE_NUM_STATES, dev); - fpi_ssm_start(ssm, stop_capture_complete); + FpiSsm *ssm = + fpi_ssm_new (dev, stop_capture_run_state, + STOP_CAPTURE_NUM_STATES, dev); + fpi_ssm_start (ssm, stop_capture_complete); } enum capture_states { - CAPTURE_LED_ON, - CAPTURE_WAIT_FINGER, - CAPTURE_READ_DATA, - CAPTURE_CHECK_ENOUGH_FRAMES, - CAPTURE_NUM_STATES, + CAPTURE_LED_ON, + CAPTURE_WAIT_FINGER, + CAPTURE_READ_DATA, + CAPTURE_CHECK_ENOUGH_FRAMES, + CAPTURE_NUM_STATES, }; -static void capture_run_state(FpiSsm *ssm, FpDevice *dev, void *user_data) +static void +capture_run_state (FpiSsm *ssm, FpDevice *dev, void *user_data) { - FpImageDevice *idev = FP_IMAGE_DEVICE(dev); - FpiDeviceElan *self = FPI_DEVICE_ELAN(dev); - int r; + FpImageDevice *idev = FP_IMAGE_DEVICE (dev); + FpiDeviceElan *self = FPI_DEVICE_ELAN (dev); + int r; - switch (fpi_ssm_get_cur_state(ssm)) { - case CAPTURE_LED_ON: - elan_run_cmd(ssm, dev, &led_on_cmd, ELAN_CMD_TIMEOUT); - break; - case CAPTURE_WAIT_FINGER: - elan_run_cmd(ssm, dev, &pre_scan_cmd, -1); - break; - case CAPTURE_READ_DATA: - self->dev_state = FP_IMAGE_DEVICE_STATE_CAPTURE; + switch (fpi_ssm_get_cur_state (ssm)) + { + case CAPTURE_LED_ON: + elan_run_cmd (ssm, dev, &led_on_cmd, ELAN_CMD_TIMEOUT); + break; - /* 0x55 - finger present - * 0xff - device not calibrated (probably) */ - if (self->last_read && self->last_read[0] == 0x55) { - fpi_image_device_report_finger_status(idev, TRUE); - elan_run_cmd(ssm, dev, &get_image_cmd, ELAN_CMD_TIMEOUT); - } else { - fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); - } - break; - case CAPTURE_CHECK_ENOUGH_FRAMES: - r = elan_save_img_frame(self); - if (r < 0) - fpi_ssm_mark_failed(ssm, fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); - else if (self->num_frames < ELAN_MAX_FRAMES) { - /* quickly stop if finger is removed */ - self->cmd_timeout = ELAN_FINGER_TIMEOUT; - fpi_ssm_jump_to_state(ssm, CAPTURE_WAIT_FINGER); - } else { - fpi_ssm_next_state(ssm); - } - break; - } + case CAPTURE_WAIT_FINGER: + elan_run_cmd (ssm, dev, &pre_scan_cmd, -1); + break; + + case CAPTURE_READ_DATA: + self->dev_state = FP_IMAGE_DEVICE_STATE_CAPTURE; + + /* 0x55 - finger present + * 0xff - device not calibrated (probably) */ + if (self->last_read && self->last_read[0] == 0x55) + { + fpi_image_device_report_finger_status (idev, TRUE); + elan_run_cmd (ssm, dev, &get_image_cmd, ELAN_CMD_TIMEOUT); + } + else + { + fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + } + break; + + case CAPTURE_CHECK_ENOUGH_FRAMES: + r = elan_save_img_frame (self); + if (r < 0) + { + fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); + } + else if (self->num_frames < ELAN_MAX_FRAMES) + { + /* quickly stop if finger is removed */ + self->cmd_timeout = ELAN_FINGER_TIMEOUT; + fpi_ssm_jump_to_state (ssm, CAPTURE_WAIT_FINGER); + } + else + { + fpi_ssm_next_state (ssm); + } + break; + } } -static void capture_complete(FpiSsm *ssm, FpDevice *_dev, void *user_data, - GError *error) +static void +capture_complete (FpiSsm *ssm, FpDevice *_dev, void *user_data, + GError *error) { - FpImageDevice *dev = user_data; - FpiDeviceElan *self = FPI_DEVICE_ELAN(_dev); + FpImageDevice *dev = user_data; + FpiDeviceElan *self = FPI_DEVICE_ELAN (_dev); - G_DEBUG_HERE(); + G_DEBUG_HERE (); - /* XXX: cancellation was specially handled by doing nothing! */ + /* XXX: cancellation was specially handled by doing nothing! */ - /* either max frames captured or timed out waiting for the next frame */ - if (!error || - (g_error_matches (error, G_USB_DEVICE_ERROR, G_USB_DEVICE_ERROR_TIMED_OUT) && - fpi_ssm_get_cur_state(ssm) == CAPTURE_WAIT_FINGER)) { - if (self->num_frames >= ELAN_MIN_FRAMES) - elan_submit_image(dev); - else { - fp_dbg("swipe too short: want >= %d frames, got %d", - ELAN_MIN_FRAMES, self->num_frames); - fpi_image_device_retry_scan(dev, FP_DEVICE_RETRY_TOO_SHORT); - } - g_clear_error (&error); - } else { - fpi_image_device_session_error (dev, error); - } + /* either max frames captured or timed out waiting for the next frame */ + if (!error || + (g_error_matches (error, G_USB_DEVICE_ERROR, G_USB_DEVICE_ERROR_TIMED_OUT) && + fpi_ssm_get_cur_state (ssm) == CAPTURE_WAIT_FINGER)) + { + if (self->num_frames >= ELAN_MIN_FRAMES) + { + elan_submit_image (dev); + } + else + { + fp_dbg ("swipe too short: want >= %d frames, got %d", + ELAN_MIN_FRAMES, self->num_frames); + fpi_image_device_retry_scan (dev, FP_DEVICE_RETRY_TOO_SHORT); + } + g_clear_error (&error); + } + else + { + fpi_image_device_session_error (dev, error); + } - fpi_ssm_free(ssm); + fpi_ssm_free (ssm); } -static void elan_capture(FpDevice *dev) +static void +elan_capture (FpDevice *dev) { - FpiDeviceElan *self = FPI_DEVICE_ELAN(dev); + FpiDeviceElan *self = FPI_DEVICE_ELAN (dev); - G_DEBUG_HERE(); + G_DEBUG_HERE (); - elan_dev_reset_state(self); - FpiSsm *ssm = - fpi_ssm_new(dev, capture_run_state, CAPTURE_NUM_STATES, - dev); - fpi_ssm_start(ssm, capture_complete); + elan_dev_reset_state (self); + FpiSsm *ssm = + fpi_ssm_new (dev, capture_run_state, CAPTURE_NUM_STATES, + dev); + fpi_ssm_start (ssm, capture_complete); } /* this function needs to have elandev->background and elandev->last_read to be * the calibration mean */ -static int elan_need_calibration(FpiDeviceElan *elandev) +static int +elan_need_calibration (FpiDeviceElan *elandev) { - G_DEBUG_HERE(); + G_DEBUG_HERE (); - unsigned short calib_mean = - elandev->last_read[0] * 0xff + elandev->last_read[1]; - unsigned int bg_mean = 0, delta; - unsigned int frame_size = elandev->frame_width * elandev->frame_height; + unsigned short calib_mean = + elandev->last_read[0] * 0xff + elandev->last_read[1]; + unsigned int bg_mean = 0, delta; + unsigned int frame_size = elandev->frame_width * elandev->frame_height; - g_assert(frame_size != 0); + g_assert (frame_size != 0); - if (elandev->dev_type == ELAN_0C42) { - if (calib_mean > 5500 || - calib_mean < 2500) { - fp_dbg("Forcing needed recalibration"); - return 1; - } - } + if (elandev->dev_type == ELAN_0C42) + { + if (calib_mean > 5500 || + calib_mean < 2500) + { + fp_dbg ("Forcing needed recalibration"); + return 1; + } + } - for (int i = 0; i < frame_size; i++) - bg_mean += elandev->background[i]; - bg_mean /= frame_size; + for (int i = 0; i < frame_size; i++) + bg_mean += elandev->background[i]; + bg_mean /= frame_size; - delta = - bg_mean > calib_mean ? bg_mean - calib_mean : calib_mean - bg_mean; + delta = + bg_mean > calib_mean ? bg_mean - calib_mean : calib_mean - bg_mean; - fp_dbg("calibration mean: %d, bg mean: %d, delta: %d", calib_mean, - bg_mean, delta); + fp_dbg ("calibration mean: %d, bg mean: %d, delta: %d", calib_mean, + bg_mean, delta); - return delta > ELAN_CALIBRATION_MAX_DELTA ? 1 : 0; + return delta > ELAN_CALIBRATION_MAX_DELTA ? 1 : 0; } enum calibrate_states { - CALIBRATE_GET_BACKGROUND, - CALIBRATE_SAVE_BACKGROUND, - CALIBRATE_GET_MEAN, - CALIBRATE_CHECK_NEEDED, - CALIBRATE_GET_STATUS, - CALIBRATE_CHECK_STATUS, - CALIBRATE_REPEAT_STATUS, - CALIBRATE_NUM_STATES, + CALIBRATE_GET_BACKGROUND, + CALIBRATE_SAVE_BACKGROUND, + CALIBRATE_GET_MEAN, + CALIBRATE_CHECK_NEEDED, + CALIBRATE_GET_STATUS, + CALIBRATE_CHECK_STATUS, + CALIBRATE_REPEAT_STATUS, + CALIBRATE_NUM_STATES, }; -static gboolean elan_supports_calibration(FpiDeviceElan *elandev) +static gboolean +elan_supports_calibration (FpiDeviceElan *elandev) { - if (elandev->dev_type == ELAN_0C42) - return TRUE; + if (elandev->dev_type == ELAN_0C42) + return TRUE; - return elandev->fw_ver >= ELAN_MIN_CALIBRATION_FW; -} - -static void calibrate_run_state(FpiSsm *ssm, FpDevice *dev, void *user_data) -{ - FpiDeviceElan *self = FPI_DEVICE_ELAN(dev); - - G_DEBUG_HERE(); - - switch (fpi_ssm_get_cur_state(ssm)) { - case CALIBRATE_GET_BACKGROUND: - elan_run_cmd(ssm, dev, &get_image_cmd, ELAN_CMD_TIMEOUT); - break; - case CALIBRATE_SAVE_BACKGROUND: - elan_save_background(self); - if (!elan_supports_calibration(self)) { - fp_dbg("FW does not support calibration"); - fpi_ssm_mark_completed(ssm); - } else - fpi_ssm_next_state(ssm); - break; - case CALIBRATE_GET_MEAN: - elan_run_cmd(ssm, dev, &get_calib_mean_cmd, ELAN_CMD_TIMEOUT); - break; - case CALIBRATE_CHECK_NEEDED: - if (elan_need_calibration(self)) { - self->calib_status = 0; - fpi_ssm_next_state(ssm); - } else - fpi_ssm_mark_completed(ssm); - break; - case CALIBRATE_GET_STATUS: - self->calib_atts_left -= 1; - if (self->calib_atts_left) - elan_run_cmd(ssm, dev, &get_calib_status_cmd, - ELAN_CMD_TIMEOUT); - else { - fp_dbg("calibration failed"); - fpi_ssm_mark_failed(ssm, - fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, - "Callibration failed!")); - } - break; - case CALIBRATE_CHECK_STATUS: - /* 0x01 - retry, 0x03 - ok - * It appears that when reading the response soon after 0x4023 the device - * can return 0x03, and only after some time (up to 100 ms) the response - * changes to 0x01. It stays that way for some time and then changes back - * to 0x03. Because of this we don't just expect 0x03, we want to see 0x01 - * first. This is to make sure that a full calibration loop has completed */ - fp_dbg("calibration status: 0x%02x", self->last_read[0]); - if (self->calib_status == 0x01 - && self->last_read[0] == 0x03) { - self->calib_status = 0x03; - fpi_ssm_jump_to_state(ssm, CALIBRATE_GET_BACKGROUND); - } else { - GSource *timeout; - - if (self->calib_status == 0x00 - && self->last_read[0] == 0x01) - self->calib_status = 0x01; - timeout = fpi_device_add_timeout(dev, 50, - fpi_ssm_next_state_timeout_cb, - ssm); - g_source_set_name(timeout, "calibrate_run_state"); - } - break; - case CALIBRATE_REPEAT_STATUS: - fpi_ssm_jump_to_state(ssm, CALIBRATE_GET_STATUS); - break; - } -} - -static void calibrate_complete(FpiSsm *ssm, FpDevice *dev, void *user_data, - GError *error) -{ - FpiDeviceElan *self = FPI_DEVICE_ELAN(dev); - - G_DEBUG_HERE(); - - if (error) { - self->dev_state = FP_IMAGE_DEVICE_STATE_INACTIVE; - fpi_image_device_session_error (FP_IMAGE_DEVICE (dev), error); - } else { - self->dev_state = FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_ON; - elan_capture(dev); - } - - fpi_ssm_free(ssm); -} - -static void elan_calibrate(FpDevice *dev) -{ - FpiDeviceElan *self = FPI_DEVICE_ELAN(dev); - - G_DEBUG_HERE(); - - elan_dev_reset_state(self); - self->calib_atts_left = ELAN_CALIBRATION_ATTEMPTS; - - FpiSsm *ssm = fpi_ssm_new(FP_DEVICE(dev), calibrate_run_state, - CALIBRATE_NUM_STATES, dev); - fpi_ssm_start(ssm, calibrate_complete); -} - -enum activate_states { - ACTIVATE_GET_FW_VER, - ACTIVATE_SET_FW_VER, - ACTIVATE_GET_SENSOR_DIM, - ACTIVATE_SET_SENSOR_DIM, - ACTIVATE_CMD_1, - ACTIVATE_NUM_STATES, -}; - -static void activate_run_state(FpiSsm *ssm, FpDevice *dev, void *user_data) -{ - FpiDeviceElan *self = FPI_DEVICE_ELAN(dev); - - G_DEBUG_HERE(); - - switch (fpi_ssm_get_cur_state(ssm)) { - case ACTIVATE_GET_FW_VER: - elan_run_cmd(ssm, dev, &get_fw_ver_cmd, ELAN_CMD_TIMEOUT); - break; - case ACTIVATE_SET_FW_VER: - self->fw_ver = - (self->last_read[0] << 8 | self->last_read[1]); - fp_dbg("FW ver 0x%04hx", self->fw_ver); - fpi_ssm_next_state(ssm); - break; - case ACTIVATE_GET_SENSOR_DIM: - elan_run_cmd(ssm, dev, &get_sensor_dim_cmd, ELAN_CMD_TIMEOUT); - break; - case ACTIVATE_SET_SENSOR_DIM: - /* see elan_save_frame for details */ - if (self->dev_type & ELAN_NOT_ROTATED) { - self->frame_width = self->last_read[0]; - self->frame_height = self->raw_frame_height = - self->last_read[2]; - } else { - self->frame_width = self->last_read[2]; - self->frame_height = self->raw_frame_height = - self->last_read[0]; - } - /* Work-around sensors returning the sizes as zero-based index - * rather than the number of pixels. */ - if ((self->frame_width % 2 == 1) && - (self->frame_height % 2 == 1)) { - self->frame_width++; - self->frame_height++; - self->raw_frame_height = self->frame_height; - } - if (self->frame_height > ELAN_MAX_FRAME_HEIGHT) - self->frame_height = ELAN_MAX_FRAME_HEIGHT; - fp_dbg("sensor dimensions, WxH: %dx%d", self->frame_width, - self->raw_frame_height); - fpi_ssm_next_state(ssm); - break; - case ACTIVATE_CMD_1: - /* TODO: find out what this does, if we need it */ - elan_run_cmd(ssm, dev, &activate_cmd_1, ELAN_CMD_TIMEOUT); - break; - } -} - -static void activate_complete(FpiSsm *ssm, FpDevice *dev, void *user_data, - GError *error) -{ - FpImageDevice *idev = FP_IMAGE_DEVICE (dev); - - G_DEBUG_HERE(); - - fpi_image_device_activate_complete (idev, error); - - fpi_ssm_free(ssm); -} - -static void elan_activate(FpImageDevice *dev) -{ - FpiDeviceElan *self = FPI_DEVICE_ELAN(dev); - - G_DEBUG_HERE(); - elan_dev_reset_state(self); - - FpiSsm *ssm = - fpi_ssm_new(FP_DEVICE(dev), activate_run_state, - ACTIVATE_NUM_STATES, dev); - fpi_ssm_start(ssm, activate_complete); -} - -static void dev_init(FpImageDevice *dev) -{ - GError *error = NULL; - FpiDeviceElan *self; - - G_DEBUG_HERE(); - - if (!g_usb_device_claim_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), 0, 0, &error)) { - fpi_image_device_open_complete(dev, error); - return; - } - - self = FPI_DEVICE_ELAN(dev); - - /* common params */ - self->dev_type = fpi_device_get_driver_data (FP_DEVICE (dev)); - self->background = NULL; - self->process_frame = elan_process_frame_thirds; - - switch (self->dev_type) { - case ELAN_0907: - self->process_frame = elan_process_frame_linear; - break; - } - - fpi_image_device_open_complete(dev, NULL); -} - -static void dev_deinit(FpImageDevice *dev) -{ - GError *error = NULL; - FpiDeviceElan *self = FPI_DEVICE_ELAN(dev); - - G_DEBUG_HERE(); - - elan_dev_reset_state(self); - g_free(self->background); - g_usb_device_release_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), - 0, 0, &error); - fpi_image_device_close_complete(dev, error); -} - -static void dev_activate(FpImageDevice *dev) -{ - G_DEBUG_HERE(); - elan_activate(dev); -} - -static void elan_change_state(FpImageDevice *idev) -{ - FpDevice *dev = FP_DEVICE(idev); - FpiDeviceElan *self = FPI_DEVICE_ELAN(dev); - FpImageDeviceState next_state = self->dev_state_next; - - if (self->dev_state == next_state) { - fp_dbg("already in %d", next_state); - return; - } else { - fp_dbg("changing to %d", next_state); - } - - switch (next_state) { - break; - case FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_ON: - /* activation completed or another enroll stage started */ - elan_calibrate(dev); - break; - case FP_IMAGE_DEVICE_STATE_CAPTURE: - /* not used */ - break; - case FP_IMAGE_DEVICE_STATE_INACTIVE: - case FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF: - if (self->dev_state != FP_IMAGE_DEVICE_STATE_INACTIVE || - self->dev_state != FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF) - elan_stop_capture(dev); - } + return elandev->fw_ver >= ELAN_MIN_CALIBRATION_FW; } static void -elan_change_state_async(FpDevice *dev, - void *data) +calibrate_run_state (FpiSsm *ssm, FpDevice *dev, void *user_data) { - g_message ("state change dev: %p", dev); - elan_change_state(FP_IMAGE_DEVICE(dev)); + FpiDeviceElan *self = FPI_DEVICE_ELAN (dev); + + G_DEBUG_HERE (); + + switch (fpi_ssm_get_cur_state (ssm)) + { + case CALIBRATE_GET_BACKGROUND: + elan_run_cmd (ssm, dev, &get_image_cmd, ELAN_CMD_TIMEOUT); + break; + + case CALIBRATE_SAVE_BACKGROUND: + elan_save_background (self); + if (!elan_supports_calibration (self)) + { + fp_dbg ("FW does not support calibration"); + fpi_ssm_mark_completed (ssm); + } + else + { + fpi_ssm_next_state (ssm); + } + break; + + case CALIBRATE_GET_MEAN: + elan_run_cmd (ssm, dev, &get_calib_mean_cmd, ELAN_CMD_TIMEOUT); + break; + + case CALIBRATE_CHECK_NEEDED: + if (elan_need_calibration (self)) + { + self->calib_status = 0; + fpi_ssm_next_state (ssm); + } + else + { + fpi_ssm_mark_completed (ssm); + } + break; + + case CALIBRATE_GET_STATUS: + self->calib_atts_left -= 1; + if (self->calib_atts_left) + { + elan_run_cmd (ssm, dev, &get_calib_status_cmd, + ELAN_CMD_TIMEOUT); + } + else + { + fp_dbg ("calibration failed"); + fpi_ssm_mark_failed (ssm, + fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, + "Callibration failed!")); + } + break; + + case CALIBRATE_CHECK_STATUS: + /* 0x01 - retry, 0x03 - ok + * It appears that when reading the response soon after 0x4023 the device + * can return 0x03, and only after some time (up to 100 ms) the response + * changes to 0x01. It stays that way for some time and then changes back + * to 0x03. Because of this we don't just expect 0x03, we want to see 0x01 + * first. This is to make sure that a full calibration loop has completed */ + fp_dbg ("calibration status: 0x%02x", self->last_read[0]); + if (self->calib_status == 0x01 && + self->last_read[0] == 0x03) + { + self->calib_status = 0x03; + fpi_ssm_jump_to_state (ssm, CALIBRATE_GET_BACKGROUND); + } + else + { + GSource *timeout; + + if (self->calib_status == 0x00 && + self->last_read[0] == 0x01) + self->calib_status = 0x01; + timeout = fpi_device_add_timeout (dev, 50, + fpi_ssm_next_state_timeout_cb, + ssm); + g_source_set_name (timeout, "calibrate_run_state"); + } + break; + + case CALIBRATE_REPEAT_STATUS: + fpi_ssm_jump_to_state (ssm, CALIBRATE_GET_STATUS); + break; + } } -static void dev_change_state(FpImageDevice *dev, FpImageDeviceState state) +static void +calibrate_complete (FpiSsm *ssm, FpDevice *dev, void *user_data, + GError *error) { - FpiDeviceElan *self = FPI_DEVICE_ELAN(dev); - GSource *timeout; + FpiDeviceElan *self = FPI_DEVICE_ELAN (dev); - G_DEBUG_HERE(); + G_DEBUG_HERE (); - /* Inactive and await finger off are equivalent for the elan driver. */ - if (state == FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF) - state = FP_IMAGE_DEVICE_STATE_INACTIVE; + if (error) + { + self->dev_state = FP_IMAGE_DEVICE_STATE_INACTIVE; + fpi_image_device_session_error (FP_IMAGE_DEVICE (dev), error); + } + else + { + self->dev_state = FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_ON; + elan_capture (dev); + } - if (self->dev_state_next == state) { - fp_dbg ("change to state %d already queued", state); - } - - switch (state) { - case FP_IMAGE_DEVICE_STATE_INACTIVE: - case FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_ON: - case FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF: { - char *name; - - /* schedule state change instead of calling it directly to allow all actions - * related to the previous state to complete */ - self->dev_state_next = state; - timeout = fpi_device_add_timeout(FP_DEVICE(dev), 10, - elan_change_state_async, - NULL); - - name = g_strdup_printf ("dev_change_state to %d", state); - g_source_set_name(timeout, name); - g_free (name); - - break; - } - case FP_IMAGE_DEVICE_STATE_CAPTURE: - /* TODO MAYBE: split capture ssm into smaller ssms and use this state */ - self->dev_state = state; - self->dev_state_next = state; - break; - default: - g_assert_not_reached(); - } + fpi_ssm_free (ssm); } -static void dev_deactivate(FpImageDevice *dev) +static void +elan_calibrate (FpDevice *dev) { - FpiDeviceElan *self = FPI_DEVICE_ELAN(dev); - G_DEBUG_HERE(); + FpiDeviceElan *self = FPI_DEVICE_ELAN (dev); - if (self->dev_state == FP_IMAGE_DEVICE_STATE_INACTIVE) { - /* The device is inactive already, complete the operation immediately. */ - fpi_image_device_deactivate_complete (dev, NULL); - } else { - /* The device is not yet inactive, flag that we are deactivating (and - * need to signal back deactivation) and then ensure we will change - * to the inactive state eventually. */ - self->deactivating = TRUE; - dev_change_state (dev, FP_IMAGE_DEVICE_STATE_INACTIVE); - } + G_DEBUG_HERE (); + + elan_dev_reset_state (self); + self->calib_atts_left = ELAN_CALIBRATION_ATTEMPTS; + + FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (dev), calibrate_run_state, + CALIBRATE_NUM_STATES, dev); + fpi_ssm_start (ssm, calibrate_complete); } -static void fpi_device_elan_init(FpiDeviceElan *self) { +enum activate_states { + ACTIVATE_GET_FW_VER, + ACTIVATE_SET_FW_VER, + ACTIVATE_GET_SENSOR_DIM, + ACTIVATE_SET_SENSOR_DIM, + ACTIVATE_CMD_1, + ACTIVATE_NUM_STATES, +}; + +static void +activate_run_state (FpiSsm *ssm, FpDevice *dev, void *user_data) +{ + FpiDeviceElan *self = FPI_DEVICE_ELAN (dev); + + G_DEBUG_HERE (); + + switch (fpi_ssm_get_cur_state (ssm)) + { + case ACTIVATE_GET_FW_VER: + elan_run_cmd (ssm, dev, &get_fw_ver_cmd, ELAN_CMD_TIMEOUT); + break; + + case ACTIVATE_SET_FW_VER: + self->fw_ver = + (self->last_read[0] << 8 | self->last_read[1]); + fp_dbg ("FW ver 0x%04hx", self->fw_ver); + fpi_ssm_next_state (ssm); + break; + + case ACTIVATE_GET_SENSOR_DIM: + elan_run_cmd (ssm, dev, &get_sensor_dim_cmd, ELAN_CMD_TIMEOUT); + break; + + case ACTIVATE_SET_SENSOR_DIM: + /* see elan_save_frame for details */ + if (self->dev_type & ELAN_NOT_ROTATED) + { + self->frame_width = self->last_read[0]; + self->frame_height = self->raw_frame_height = + self->last_read[2]; + } + else + { + self->frame_width = self->last_read[2]; + self->frame_height = self->raw_frame_height = + self->last_read[0]; + } + /* Work-around sensors returning the sizes as zero-based index + * rather than the number of pixels. */ + if ((self->frame_width % 2 == 1) && + (self->frame_height % 2 == 1)) + { + self->frame_width++; + self->frame_height++; + self->raw_frame_height = self->frame_height; + } + if (self->frame_height > ELAN_MAX_FRAME_HEIGHT) + self->frame_height = ELAN_MAX_FRAME_HEIGHT; + fp_dbg ("sensor dimensions, WxH: %dx%d", self->frame_width, + self->raw_frame_height); + fpi_ssm_next_state (ssm); + break; + + case ACTIVATE_CMD_1: + /* TODO: find out what this does, if we need it */ + elan_run_cmd (ssm, dev, &activate_cmd_1, ELAN_CMD_TIMEOUT); + break; + } } -static void fpi_device_elan_class_init(FpiDeviceElanClass *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); - FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS(klass); - dev_class->id = "elan"; - dev_class->full_name = "ElanTech Fingerprint Sensor"; - dev_class->type = FP_DEVICE_TYPE_USB; - dev_class->id_table = elan_id_table; - dev_class->scan_type = FP_SCAN_TYPE_SWIPE; +static void +activate_complete (FpiSsm *ssm, FpDevice *dev, void *user_data, + GError *error) +{ + FpImageDevice *idev = FP_IMAGE_DEVICE (dev); - img_class->img_open = dev_init; - img_class->img_close = dev_deinit; - img_class->activate = dev_activate; - img_class->deactivate = dev_deactivate; - img_class->change_state = dev_change_state; + G_DEBUG_HERE (); - img_class->bz3_threshold = 24; + fpi_image_device_activate_complete (idev, error); + + fpi_ssm_free (ssm); +} + +static void +elan_activate (FpImageDevice *dev) +{ + FpiDeviceElan *self = FPI_DEVICE_ELAN (dev); + + G_DEBUG_HERE (); + elan_dev_reset_state (self); + + FpiSsm *ssm = + fpi_ssm_new (FP_DEVICE (dev), activate_run_state, + ACTIVATE_NUM_STATES, dev); + fpi_ssm_start (ssm, activate_complete); +} + +static void +dev_init (FpImageDevice *dev) +{ + GError *error = NULL; + FpiDeviceElan *self; + + G_DEBUG_HERE (); + + if (!g_usb_device_claim_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), 0, 0, &error)) + { + fpi_image_device_open_complete (dev, error); + return; + } + + self = FPI_DEVICE_ELAN (dev); + + /* common params */ + self->dev_type = fpi_device_get_driver_data (FP_DEVICE (dev)); + self->background = NULL; + self->process_frame = elan_process_frame_thirds; + + switch (self->dev_type) + { + case ELAN_0907: + self->process_frame = elan_process_frame_linear; + break; + } + + fpi_image_device_open_complete (dev, NULL); +} + +static void +dev_deinit (FpImageDevice *dev) +{ + GError *error = NULL; + FpiDeviceElan *self = FPI_DEVICE_ELAN (dev); + + G_DEBUG_HERE (); + + elan_dev_reset_state (self); + g_free (self->background); + g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), + 0, 0, &error); + fpi_image_device_close_complete (dev, error); +} + +static void +dev_activate (FpImageDevice *dev) +{ + G_DEBUG_HERE (); + elan_activate (dev); +} + +static void +elan_change_state (FpImageDevice *idev) +{ + FpDevice *dev = FP_DEVICE (idev); + FpiDeviceElan *self = FPI_DEVICE_ELAN (dev); + FpImageDeviceState next_state = self->dev_state_next; + + if (self->dev_state == next_state) + { + fp_dbg ("already in %d", next_state); + return; + } + else + { + fp_dbg ("changing to %d", next_state); + } + + switch (next_state) + { + break; + + case FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_ON: + /* activation completed or another enroll stage started */ + elan_calibrate (dev); + break; + + case FP_IMAGE_DEVICE_STATE_CAPTURE: + /* not used */ + break; + + case FP_IMAGE_DEVICE_STATE_INACTIVE: + case FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF: + if (self->dev_state != FP_IMAGE_DEVICE_STATE_INACTIVE || + self->dev_state != FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF) + elan_stop_capture (dev); + } +} + +static void +elan_change_state_async (FpDevice *dev, + void *data) +{ + g_message ("state change dev: %p", dev); + elan_change_state (FP_IMAGE_DEVICE (dev)); +} + +static void +dev_change_state (FpImageDevice *dev, FpImageDeviceState state) +{ + FpiDeviceElan *self = FPI_DEVICE_ELAN (dev); + GSource *timeout; + + G_DEBUG_HERE (); + + /* Inactive and await finger off are equivalent for the elan driver. */ + if (state == FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF) + state = FP_IMAGE_DEVICE_STATE_INACTIVE; + + if (self->dev_state_next == state) + fp_dbg ("change to state %d already queued", state); + + switch (state) + { + case FP_IMAGE_DEVICE_STATE_INACTIVE: + case FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_ON: + case FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF: { + char *name; + + /* schedule state change instead of calling it directly to allow all actions + * related to the previous state to complete */ + self->dev_state_next = state; + timeout = fpi_device_add_timeout (FP_DEVICE (dev), 10, + elan_change_state_async, + NULL); + + name = g_strdup_printf ("dev_change_state to %d", state); + g_source_set_name (timeout, name); + g_free (name); + + break; + } + + case FP_IMAGE_DEVICE_STATE_CAPTURE: + /* TODO MAYBE: split capture ssm into smaller ssms and use this state */ + self->dev_state = state; + self->dev_state_next = state; + break; + + default: + g_assert_not_reached (); + } +} + +static void +dev_deactivate (FpImageDevice *dev) +{ + FpiDeviceElan *self = FPI_DEVICE_ELAN (dev); + + G_DEBUG_HERE (); + + if (self->dev_state == FP_IMAGE_DEVICE_STATE_INACTIVE) + { + /* The device is inactive already, complete the operation immediately. */ + fpi_image_device_deactivate_complete (dev, NULL); + } + else + { + /* The device is not yet inactive, flag that we are deactivating (and + * need to signal back deactivation) and then ensure we will change + * to the inactive state eventually. */ + self->deactivating = TRUE; + dev_change_state (dev, FP_IMAGE_DEVICE_STATE_INACTIVE); + } +} + +static void +fpi_device_elan_init (FpiDeviceElan *self) +{ +} +static void +fpi_device_elan_class_init (FpiDeviceElanClass *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); + FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); + + dev_class->id = "elan"; + dev_class->full_name = "ElanTech Fingerprint Sensor"; + dev_class->type = FP_DEVICE_TYPE_USB; + dev_class->id_table = elan_id_table; + dev_class->scan_type = FP_SCAN_TYPE_SWIPE; + + img_class->img_open = dev_init; + img_class->img_close = dev_deinit; + img_class->activate = dev_activate; + img_class->deactivate = dev_deactivate; + img_class->change_state = dev_change_state; + + img_class->bz3_threshold = 24; } diff --git a/libfprint/drivers/elan.h b/libfprint/drivers/elan.h index 059f00a..169498a 100644 --- a/libfprint/drivers/elan.h +++ b/libfprint/drivers/elan.h @@ -71,155 +71,158 @@ #define ELAN_CMD_TIMEOUT 10000 #define ELAN_FINGER_TIMEOUT 200 -struct elan_cmd { - unsigned char cmd[ELAN_CMD_LEN]; - int response_len; - int response_in; - unsigned short devices; - gboolean never_cancel; +struct elan_cmd +{ + unsigned char cmd[ELAN_CMD_LEN]; + int response_len; + int response_in; + unsigned short devices; + gboolean never_cancel; }; static const struct elan_cmd get_sensor_dim_cmd = { - .cmd = {0x00, 0x0c}, - .response_len = 0x4, - .response_in = ELAN_EP_CMD_IN, - .devices = ELAN_ALL_DEV, + .cmd = {0x00, 0x0c}, + .response_len = 0x4, + .response_in = ELAN_EP_CMD_IN, + .devices = ELAN_ALL_DEV, }; static const struct elan_cmd get_fw_ver_cmd = { - .cmd = {0x40, 0x19}, - .response_len = 0x2, - .response_in = ELAN_EP_CMD_IN, - .devices = ELAN_ALL_DEV, + .cmd = {0x40, 0x19}, + .response_len = 0x2, + .response_in = ELAN_EP_CMD_IN, + .devices = ELAN_ALL_DEV, }; /* unknown, returns 0x0 0x1 on 0907 */ static const struct elan_cmd activate_cmd_1 = { - .cmd = {0x40, 0x2a}, - .response_len = 0x2, - .response_in = ELAN_EP_CMD_IN, - .devices = ELAN_0907, + .cmd = {0x40, 0x2a}, + .response_len = 0x2, + .response_in = ELAN_EP_CMD_IN, + .devices = ELAN_0907, }; static const struct elan_cmd get_image_cmd = { - .cmd = {0x00, 0x09}, - /* raw frame sizes are calculated from image dimensions reported by the - * device */ - .response_len = -1, - .response_in = ELAN_EP_IMG_IN, - .devices = ELAN_ALL_DEV, + .cmd = {0x00, 0x09}, + /* raw frame sizes are calculated from image dimensions reported by the + * device */ + .response_len = -1, + .response_in = ELAN_EP_IMG_IN, + .devices = ELAN_ALL_DEV, }; static const struct elan_cmd read_sensor_status_cmd = { - .cmd = {0x40, 0x13}, - .response_len = 0x1, - .response_in = ELAN_EP_CMD_IN, - .devices = ELAN_ALL_DEV, + .cmd = {0x40, 0x13}, + .response_len = 0x1, + .response_in = ELAN_EP_CMD_IN, + .devices = ELAN_ALL_DEV, }; static const struct elan_cmd get_calib_status_cmd = { - .cmd = {0x40, 0x23}, - .response_len = 0x1, - .response_in = ELAN_EP_CMD_IN, - .devices = ELAN_ALL_DEV, + .cmd = {0x40, 0x23}, + .response_len = 0x1, + .response_in = ELAN_EP_CMD_IN, + .devices = ELAN_ALL_DEV, }; static const struct elan_cmd get_calib_mean_cmd = { - .cmd = {0x40, 0x24}, - .response_len = 0x2, - .response_in = ELAN_EP_CMD_IN, - .devices = ELAN_ALL_DEV, + .cmd = {0x40, 0x24}, + .response_len = 0x2, + .response_in = ELAN_EP_CMD_IN, + .devices = ELAN_ALL_DEV, }; static const struct elan_cmd led_on_cmd = { - .cmd = {0x40, 0x31}, - .response_len = ELAN_CMD_SKIP_READ, - .response_in = ELAN_EP_CMD_IN, - .devices = ELAN_ALL_DEV, + .cmd = {0x40, 0x31}, + .response_len = ELAN_CMD_SKIP_READ, + .response_in = ELAN_EP_CMD_IN, + .devices = ELAN_ALL_DEV, }; /* wait for finger * subsequent read will not complete until finger is placed on the reader */ static const struct elan_cmd pre_scan_cmd = { - .cmd = {0x40, 0x3f}, - .response_len = 0x1, - .response_in = ELAN_EP_CMD_IN, - .devices = ELAN_ALL_DEV, + .cmd = {0x40, 0x3f}, + .response_len = 0x1, + .response_in = ELAN_EP_CMD_IN, + .devices = ELAN_ALL_DEV, }; /* led off, stop waiting for finger */ static const struct elan_cmd stop_cmd = { - .cmd = {0x00, 0x0b}, - .response_len = ELAN_CMD_SKIP_READ, - .response_in = ELAN_EP_CMD_IN, - .devices = ELAN_ALL_DEV, - .never_cancel = TRUE, + .cmd = {0x00, 0x0b}, + .response_len = ELAN_CMD_SKIP_READ, + .response_in = ELAN_EP_CMD_IN, + .devices = ELAN_ALL_DEV, + .never_cancel = TRUE, }; -static const FpIdEntry elan_id_table [ ] = { - {.vid = ELAN_VEND_ID, .pid = 0x0903, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0907, .driver_data = ELAN_0907}, - {.vid = ELAN_VEND_ID, .pid = 0x0c01, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c02, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c03, .driver_data = ELAN_0C03}, - {.vid = ELAN_VEND_ID, .pid = 0x0c04, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c05, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c06, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c07, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c08, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c09, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c0a, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c0b, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c0c, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c0d, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c0e, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c0f, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c10, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c11, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c12, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c13, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c14, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c15, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c16, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c17, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c18, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c19, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c1a, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c1b, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c1c, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c1d, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c1e, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c1f, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c20, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c21, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c22, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c23, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c24, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c25, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c26, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c27, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c28, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c29, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c2a, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c2b, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c2c, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c2d, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c2e, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c2f, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c30, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c31, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c32, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c33, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c42, .driver_data = ELAN_0C42}, - {.vid = 0, .pid = 0, .driver_data = 0}, +static const FpIdEntry elan_id_table[] = { + {.vid = ELAN_VEND_ID, .pid = 0x0903, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0907, .driver_data = ELAN_0907}, + {.vid = ELAN_VEND_ID, .pid = 0x0c01, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c02, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c03, .driver_data = ELAN_0C03}, + {.vid = ELAN_VEND_ID, .pid = 0x0c04, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c05, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c06, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c07, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c08, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c09, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c0a, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c0b, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c0c, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c0d, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c0e, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c0f, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c10, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c11, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c12, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c13, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c14, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c15, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c16, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c17, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c18, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c19, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c1a, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c1b, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c1c, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c1d, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c1e, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c1f, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c20, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c21, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c22, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c23, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c24, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c25, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c26, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c27, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c28, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c29, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c2a, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c2b, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c2c, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c2d, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c2e, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c2f, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c30, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c31, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c32, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c33, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c42, .driver_data = ELAN_0C42}, + {.vid = 0, .pid = 0, .driver_data = 0}, }; -static void elan_cmd_done(FpiSsm *ssm); -static void elan_cmd_read(FpiSsm *ssm, FpDevice *dev); +static void elan_cmd_done (FpiSsm *ssm); +static void elan_cmd_read (FpiSsm *ssm, + FpDevice *dev); -static void elan_calibrate(FpDevice *dev); -static void elan_capture(FpDevice *dev); +static void elan_calibrate (FpDevice *dev); +static void elan_capture (FpDevice *dev); -static void dev_change_state(FpImageDevice *dev, FpImageDeviceState state); +static void dev_change_state (FpImageDevice *dev, + FpImageDeviceState state); #endif diff --git a/libfprint/drivers/etes603.c b/libfprint/drivers/etes603.c index b7592a8..95b077f 100644 --- a/libfprint/drivers/etes603.c +++ b/libfprint/drivers/etes603.c @@ -39,418 +39,448 @@ #include "driver_ids.h" /* libusb defines */ -#define EP_IN 0x81 -#define EP_OUT 0x02 +#define EP_IN 0x81 +#define EP_OUT 0x02 /* Note that 1000 ms is usually enough but with CMD_READ_FE could be longer * since the sensor is waiting motion. */ -#define BULK_TIMEOUT 1000 +#define BULK_TIMEOUT 1000 /* es603 defines */ -#define FRAME_WIDTH 192 /* pixels per row */ -#define FRAME_HEIGHT 4 /* number of rows */ -#define FRAME_SIZE 384 /* size in bytes (4 bits per pixels) */ -#define FE_WIDTH 256 /* pixels per row for Fly-Estimation */ -#define FE_HEIGHT 500 /* number of rows for Fly-Estimation */ -#define FE_SIZE 64000 /* size in bytes (4 bits per pixels) */ +#define FRAME_WIDTH 192 /* pixels per row */ +#define FRAME_HEIGHT 4 /* number of rows */ +#define FRAME_SIZE 384 /* size in bytes (4 bits per pixels) */ +#define FE_WIDTH 256 /* pixels per row for Fly-Estimation */ +#define FE_HEIGHT 500 /* number of rows for Fly-Estimation */ +#define FE_SIZE 64000 /* size in bytes (4 bits per pixels) */ -#define GAIN_SMALL_INIT 0x23 /* Initial small gain */ -#define VRT_MAX 0x3F /* Maximum value for VRT */ -#define VRB_MAX 0x3A /* Maximum value for VRB */ -#define DTVRT_MAX 0x3A /* Maximum value for DTVRT */ -#define DCOFFSET_MIN 0x00 /* Minimum value for DCoffset */ -#define DCOFFSET_MAX 0x35 /* Maximum value for DCoffset */ +#define GAIN_SMALL_INIT 0x23 /* Initial small gain */ +#define VRT_MAX 0x3F /* Maximum value for VRT */ +#define VRB_MAX 0x3A /* Maximum value for VRB */ +#define DTVRT_MAX 0x3A /* Maximum value for DTVRT */ +#define DCOFFSET_MIN 0x00 /* Minimum value for DCoffset */ +#define DCOFFSET_MAX 0x35 /* Maximum value for DCoffset */ /* es603 commands */ -#define CMD_READ_REG 0x01 -#define CMD_WRITE_REG 0x02 -#define CMD_READ_FRAME 0x03 /* Read the sensor area */ -#define CMD_READ_FE 0x06 /* Read a fingerprint using Fly-Estimation */ -#define CMD_20 0x20 /* ? */ -#define CMD_25 0x25 /* ? */ -#define CMD_60 0x60 /* ? */ +#define CMD_READ_REG 0x01 +#define CMD_WRITE_REG 0x02 +#define CMD_READ_FRAME 0x03 /* Read the sensor area */ +#define CMD_READ_FE 0x06 /* Read a fingerprint using Fly-Estimation */ +#define CMD_20 0x20 /* ? */ +#define CMD_25 0x25 /* ? */ +#define CMD_60 0x60 /* ? */ -#define CMD_OK 0x01 /* Command successfully executed */ +#define CMD_OK 0x01 /* Command successfully executed */ /* es603 registers */ -#define REG_MAX 0x18 /* Maximum number of registers in one message */ -#define REG_MODE_CONTROL 0x02 /* Mode control */ -#define REG_03 0x03 /* Contact register? */ -#define REG_04 0x04 /* ? */ -#define REG_10 0x10 /* MVS FRMBUF control */ -#define REG_1A 0x1A /* ? */ +#define REG_MAX 0x18 /* Maximum number of registers in one message */ +#define REG_MODE_CONTROL 0x02 /* Mode control */ +#define REG_03 0x03 /* Contact register? */ +#define REG_04 0x04 /* ? */ +#define REG_10 0x10 /* MVS FRMBUF control */ +#define REG_1A 0x1A /* ? */ /* BEGIN init sensor */ -#define REG_20 0x20 /* (def: 0x00) */ -#define REG_21 0x21 /* Small gain (def: 0x23) */ -#define REG_22 0x22 /* Normal gain (def: 0x21) */ -#define REG_23 0x23 /* Large gain (def: 0x20) */ -#define REG_24 0x24 /* (def: 0x14) */ -#define REG_25 0x25 /* (def: 0x6A) */ -#define REG_26 0x26 /* VRB again? (def: 0x00) */ -#define REG_27 0x27 /* VRT again? (def: 0x00) */ -#define REG_28 0x28 /* (def: 0x00) */ -#define REG_29 0x29 /* (def: 0xC0) */ -#define REG_2A 0x2A /* (def: 0x50) */ -#define REG_2B 0x2B /* (def: 0x50) */ -#define REG_2C 0x2C /* (def: 0x4D) */ -#define REG_2D 0x2D /* (def: 0x03) */ -#define REG_2E 0x2E /* (def: 0x06) */ -#define REG_2F 0x2F /* (def: 0x06) */ -#define REG_30 0x30 /* (def: 0x10) */ -#define REG_31 0x31 /* (def: 0x02) */ -#define REG_32 0x32 /* (def: 0x14) */ -#define REG_33 0x33 /* (def: 0x34) */ -#define REG_34 0x34 /* (def: 0x01) */ -#define REG_35 0x35 /* (def: 0x08) */ -#define REG_36 0x36 /* (def: 0x03) */ -#define REG_37 0x37 /* (def: 0x21) */ +#define REG_20 0x20 /* (def: 0x00) */ +#define REG_21 0x21 /* Small gain (def: 0x23) */ +#define REG_22 0x22 /* Normal gain (def: 0x21) */ +#define REG_23 0x23 /* Large gain (def: 0x20) */ +#define REG_24 0x24 /* (def: 0x14) */ +#define REG_25 0x25 /* (def: 0x6A) */ +#define REG_26 0x26 /* VRB again? (def: 0x00) */ +#define REG_27 0x27 /* VRT again? (def: 0x00) */ +#define REG_28 0x28 /* (def: 0x00) */ +#define REG_29 0x29 /* (def: 0xC0) */ +#define REG_2A 0x2A /* (def: 0x50) */ +#define REG_2B 0x2B /* (def: 0x50) */ +#define REG_2C 0x2C /* (def: 0x4D) */ +#define REG_2D 0x2D /* (def: 0x03) */ +#define REG_2E 0x2E /* (def: 0x06) */ +#define REG_2F 0x2F /* (def: 0x06) */ +#define REG_30 0x30 /* (def: 0x10) */ +#define REG_31 0x31 /* (def: 0x02) */ +#define REG_32 0x32 /* (def: 0x14) */ +#define REG_33 0x33 /* (def: 0x34) */ +#define REG_34 0x34 /* (def: 0x01) */ +#define REG_35 0x35 /* (def: 0x08) */ +#define REG_36 0x36 /* (def: 0x03) */ +#define REG_37 0x37 /* (def: 0x21) */ /* END init sensor */ -#define REG_ENC1 0x41 /* Encryption 1 */ -#define REG_ENC2 0x42 -#define REG_ENC3 0x43 -#define REG_ENC4 0x44 -#define REG_ENC5 0x45 -#define REG_ENC6 0x46 -#define REG_ENC7 0x47 -#define REG_ENC8 0x48 /* Encryption 8 */ +#define REG_ENC1 0x41 /* Encryption 1 */ +#define REG_ENC2 0x42 +#define REG_ENC3 0x43 +#define REG_ENC4 0x44 +#define REG_ENC5 0x45 +#define REG_ENC6 0x46 +#define REG_ENC7 0x47 +#define REG_ENC8 0x48 /* Encryption 8 */ -#define REG_50 0x50 /* ? For contact detection */ -#define REG_51 0x51 /* ? */ -#define REG_59 0x59 /* ? */ -#define REG_5A 0x5A /* ? */ -#define REG_5B 0x5B /* ? */ +#define REG_50 0x50 /* ? For contact detection */ +#define REG_51 0x51 /* ? */ +#define REG_59 0x59 /* ? */ +#define REG_5A 0x5A /* ? */ +#define REG_5B 0x5B /* ? */ -#define REG_INFO0 0x70 /* Sensor model byte0 */ -#define REG_INFO1 0x71 /* Sensor model byte1 */ -#define REG_INFO2 0x72 /* Sensor model byte2 */ -#define REG_INFO3 0x73 /* Sensor model byte3 */ +#define REG_INFO0 0x70 /* Sensor model byte0 */ +#define REG_INFO1 0x71 /* Sensor model byte1 */ +#define REG_INFO2 0x72 /* Sensor model byte2 */ +#define REG_INFO3 0x73 /* Sensor model byte3 */ -#define REG_GAIN 0xE0 -#define REG_VRT 0xE1 -#define REG_VRB 0xE2 -#define REG_DTVRT 0xE3 /* used for contact detection */ -#define REG_VCO_CONTROL 0xE5 /* 0x13 (IDLE?), 0x14 (REALTIME) */ -#define REG_DCOFFSET 0xE6 +#define REG_GAIN 0xE0 +#define REG_VRT 0xE1 +#define REG_VRB 0xE2 +#define REG_DTVRT 0xE3 /* used for contact detection */ +#define REG_VCO_CONTROL 0xE5 /* 0x13 (IDLE?), 0x14 (REALTIME) */ +#define REG_DCOFFSET 0xE6 -#define REG_F0 0xF0 /* ? init:0x00 close:0x01 */ -#define REG_F2 0xF2 /* ? init:0x00 close:0x4E */ +#define REG_F0 0xF0 /* ? init:0x00 close:0x01 */ +#define REG_F2 0xF2 /* ? init:0x00 close:0x4E */ -#define REG_MODE_SLEEP 0x30 /* Sleep mode */ -#define REG_MODE_CONTACT 0x31 /* Contact mode */ -#define REG_MODE_SENSOR 0x33 /* Sensor mode */ -#define REG_MODE_FP 0x34 /* FingerPrint mode (Fly-Estimation®) */ +#define REG_MODE_SLEEP 0x30 /* Sleep mode */ +#define REG_MODE_CONTACT 0x31 /* Contact mode */ +#define REG_MODE_SENSOR 0x33 /* Sensor mode */ +#define REG_MODE_FP 0x34 /* FingerPrint mode (Fly-Estimation®) */ -#define REG_VCO_IDLE 0x13 -#define REG_VCO_RT 0x14 /* Realtime */ +#define REG_VCO_IDLE 0x13 +#define REG_VCO_RT 0x14 /* Realtime */ /* The size of the message header is 5 plus 1 for the command. */ -#define MSG_HDR_SIZE 6 +#define MSG_HDR_SIZE 6 /* This structure must be packed because it is a the raw message sent. */ -struct egis_msg { - guint8 magic[5]; /* out: 'EGIS' 0x09 / in: 'SIGE' 0x0A */ - guint8 cmd; - union { - struct { - guint8 nb; - guint8 regs[REG_MAX]; - } egis_readreg; - struct { - guint8 regs[REG_MAX]; - } sige_readreg; - struct { - guint8 nb; - struct { - guint8 reg; - guint8 val; - } regs[REG_MAX]; - } egis_writereg; - struct { - guint8 length_factor; - guint8 length; - guint8 use_gvv; - guint8 gain; - guint8 vrt; - guint8 vrb; - } egis_readf; - struct { - guint8 len[2]; - guint8 val[3]; - } egis_readfp; - struct { - guint8 val[5]; - } sige_misc; - guint8 padding[0x40-6]; /* Ensure size of 0x40 */ - }; +struct egis_msg +{ + guint8 magic[5]; /* out: 'EGIS' 0x09 / in: 'SIGE' 0x0A */ + guint8 cmd; + union + { + struct + { + guint8 nb; + guint8 regs[REG_MAX]; + } egis_readreg; + struct + { + guint8 regs[REG_MAX]; + } sige_readreg; + struct + { + guint8 nb; + struct + { + guint8 reg; + guint8 val; + } regs[REG_MAX]; + } egis_writereg; + struct + { + guint8 length_factor; + guint8 length; + guint8 use_gvv; + guint8 gain; + guint8 vrt; + guint8 vrb; + } egis_readf; + struct + { + guint8 len[2]; + guint8 val[3]; + } egis_readfp; + struct + { + guint8 val[5]; + } sige_misc; + guint8 padding[0x40 - 6]; /* Ensure size of 0x40 */ + }; } __attribute__((packed)); /* Structure to keep information between asynchronous functions. */ -struct _FpiDeviceEtes603 { - FpImageDevice parent; +struct _FpiDeviceEtes603 +{ + FpImageDevice parent; - guint8 regs[256]; - struct egis_msg *req; - size_t req_len; - struct egis_msg *ans; - size_t ans_len; + guint8 regs[256]; + struct egis_msg *req; + size_t req_len; + struct egis_msg *ans; + size_t ans_len; - guint8 *fp; - guint16 fp_height; + guint8 *fp; + guint16 fp_height; - guint8 tunedc_min; - guint8 tunedc_max; + guint8 tunedc_min; + guint8 tunedc_max; - /* Device parameters */ - guint8 gain; - guint8 dcoffset; - guint8 vrt; - guint8 vrb; + /* Device parameters */ + guint8 gain; + guint8 dcoffset; + guint8 vrt; + guint8 vrb; - unsigned int is_active; + unsigned int is_active; }; -G_DECLARE_FINAL_TYPE(FpiDeviceEtes603, fpi_device_etes603, FPI, DEVICE_ETES603, - FpImageDevice); -G_DEFINE_TYPE(FpiDeviceEtes603, fpi_device_etes603, FP_TYPE_IMAGE_DEVICE); +G_DECLARE_FINAL_TYPE (FpiDeviceEtes603, fpi_device_etes603, FPI, DEVICE_ETES603, + FpImageDevice); +G_DEFINE_TYPE (FpiDeviceEtes603, fpi_device_etes603, FP_TYPE_IMAGE_DEVICE); -static void m_start_fingerdetect(FpImageDevice *idev); +static void m_start_fingerdetect (FpImageDevice *idev); /* * Prepare the header of the message to be sent to the device. */ -static void msg_header_prepare(struct egis_msg *msg) +static void +msg_header_prepare (struct egis_msg *msg) { - msg->magic[0] = 'E'; - msg->magic[1] = 'G'; - msg->magic[2] = 'I'; - msg->magic[3] = 'S'; - msg->magic[4] = 0x09; + msg->magic[0] = 'E'; + msg->magic[1] = 'G'; + msg->magic[2] = 'I'; + msg->magic[3] = 'S'; + msg->magic[4] = 0x09; } /* * Check that the header of the received message is correct. */ -static int msg_header_check(struct egis_msg *msg) +static int +msg_header_check (struct egis_msg *msg) { - if (msg->magic[0] == 'S' && msg->magic[1] == 'I' - && msg->magic[2] == 'G' && msg->magic[3] == 'E' - && msg->magic[4] == 0x0A) - return 0; - return -1; + if (msg->magic[0] == 'S' && msg->magic[1] == 'I' && + msg->magic[2] == 'G' && msg->magic[3] == 'E' && + msg->magic[4] == 0x0A) + return 0; + return -1; } /* * Prepare message to ask for a frame. */ -static void msg_get_frame(FpiDeviceEtes603 *self, - guint8 use_gvv, guint8 gain, guint8 vrt, - guint8 vrb) +static void +msg_get_frame (FpiDeviceEtes603 *self, + guint8 use_gvv, guint8 gain, guint8 vrt, + guint8 vrb) { - struct egis_msg *msg = self->req; - msg_header_prepare(msg); - msg->cmd = CMD_READ_FRAME; - msg->egis_readf.length_factor = 0x01; - /* length should be 0xC0 */ - msg->egis_readf.length = FRAME_WIDTH; - msg->egis_readf.use_gvv = use_gvv; - /* if use_gvv is set, gain/vrt/vrb are used */ - msg->egis_readf.gain = gain; - msg->egis_readf.vrt = vrt; - msg->egis_readf.vrb = vrb; + struct egis_msg *msg = self->req; - self->req_len = MSG_HDR_SIZE + 6; - self->ans_len = FRAME_SIZE; + msg_header_prepare (msg); + msg->cmd = CMD_READ_FRAME; + msg->egis_readf.length_factor = 0x01; + /* length should be 0xC0 */ + msg->egis_readf.length = FRAME_WIDTH; + msg->egis_readf.use_gvv = use_gvv; + /* if use_gvv is set, gain/vrt/vrb are used */ + msg->egis_readf.gain = gain; + msg->egis_readf.vrt = vrt; + msg->egis_readf.vrb = vrb; + + self->req_len = MSG_HDR_SIZE + 6; + self->ans_len = FRAME_SIZE; } /* * Prepare message to ask for a fingerprint frame. */ -static void msg_get_fp(FpiDeviceEtes603 *self, guint8 len0, guint8 len1, - guint8 v2, guint8 v3, guint8 v4) +static void +msg_get_fp (FpiDeviceEtes603 *self, guint8 len0, guint8 len1, + guint8 v2, guint8 v3, guint8 v4) { - struct egis_msg *msg = self->req; - msg_header_prepare(msg); - msg->cmd = CMD_READ_FE; - /* Unknown values and always same on captured frames. - * 1st 2nd bytes is unsigned short for height, but only on value range - * 0x01 0xF4 (500), 0x02 0x00 (512), 0x02 0xF4 (756) are ok - */ - msg->egis_readfp.len[0] = len0; - msg->egis_readfp.len[1] = len1; - /* 3rd byte : ?? but changes frame size - * 4th byte : 0x00 -> can change width - * 5th byte : motion sensibility? - */ - msg->egis_readfp.val[0] = v2; - msg->egis_readfp.val[1] = v3; - msg->egis_readfp.val[2] = v4; + struct egis_msg *msg = self->req; - self->req_len = MSG_HDR_SIZE + 5; - self->ans_len = FE_SIZE; + msg_header_prepare (msg); + msg->cmd = CMD_READ_FE; + /* Unknown values and always same on captured frames. + * 1st 2nd bytes is unsigned short for height, but only on value range + * 0x01 0xF4 (500), 0x02 0x00 (512), 0x02 0xF4 (756) are ok + */ + msg->egis_readfp.len[0] = len0; + msg->egis_readfp.len[1] = len1; + /* 3rd byte : ?? but changes frame size + * 4th byte : 0x00 -> can change width + * 5th byte : motion sensibility? + */ + msg->egis_readfp.val[0] = v2; + msg->egis_readfp.val[1] = v3; + msg->egis_readfp.val[2] = v4; + + self->req_len = MSG_HDR_SIZE + 5; + self->ans_len = FE_SIZE; } /* * Prepare message to read registers from the sensor. * Variadic argument pattern: int reg, ... */ -static void msg_get_regs(FpiDeviceEtes603 *self, int n_args, ... ) +static void +msg_get_regs (FpiDeviceEtes603 *self, int n_args, ... ) { - struct egis_msg *msg = self->req; - va_list ap; - int i; + struct egis_msg *msg = self->req; + va_list ap; + int i; - g_assert(n_args > 0 && n_args <= REG_MAX); + g_assert (n_args > 0 && n_args <= REG_MAX); - msg_header_prepare(msg); - msg->cmd = CMD_READ_REG; - msg->egis_readreg.nb = n_args; - va_start(ap, n_args); - for (i = 0; i < n_args; i++) { - msg->egis_readreg.regs[i] = va_arg(ap, int); - } - va_end(ap); + msg_header_prepare (msg); + msg->cmd = CMD_READ_REG; + msg->egis_readreg.nb = n_args; + va_start (ap, n_args); + for (i = 0; i < n_args; i++) + msg->egis_readreg.regs[i] = va_arg (ap, int); + va_end (ap); - self->req_len = MSG_HDR_SIZE + 1 + n_args; - self->ans_len = MSG_HDR_SIZE + 1 + n_args; + self->req_len = MSG_HDR_SIZE + 1 + n_args; + self->ans_len = MSG_HDR_SIZE + 1 + n_args; } /* * Parse the result of read register command. */ -static int msg_parse_regs(FpiDeviceEtes603 *dev) +static int +msg_parse_regs (FpiDeviceEtes603 *dev) { - size_t i, n_args; - struct egis_msg *msg_req = dev->req; - struct egis_msg *msg_ans = dev->ans; - n_args = dev->ans_len - MSG_HDR_SIZE; + size_t i, n_args; + struct egis_msg *msg_req = dev->req; + struct egis_msg *msg_ans = dev->ans; - if (msg_header_check(msg_ans)) { - return -1; - } - if (msg_ans->cmd != CMD_OK) { - return -2; - } + n_args = dev->ans_len - MSG_HDR_SIZE; - for (i = 0; i < n_args; i++) { - int reg = msg_req->egis_readreg.regs[i]; - dev->regs[reg] = msg_ans->sige_readreg.regs[i]; - } - return 0; + if (msg_header_check (msg_ans)) + return -1; + if (msg_ans->cmd != CMD_OK) + return -2; + + for (i = 0; i < n_args; i++) + { + int reg = msg_req->egis_readreg.regs[i]; + dev->regs[reg] = msg_ans->sige_readreg.regs[i]; + } + return 0; } /* * Prepare message to write sensor's registers. * Variadic arguments are: int reg, int val, ... */ -static void msg_set_regs(FpiDeviceEtes603 *self, int n_args, ...) +static void +msg_set_regs (FpiDeviceEtes603 *self, int n_args, ...) { - struct egis_msg *msg = self->req; - va_list ap; - int i; + struct egis_msg *msg = self->req; + va_list ap; + int i; - g_assert(n_args != 0 && n_args % 2 == 0 && n_args <= REG_MAX * 2); + g_assert (n_args != 0 && n_args % 2 == 0 && n_args <= REG_MAX * 2); - msg_header_prepare(msg); - msg->cmd = CMD_WRITE_REG; - msg->egis_writereg.nb = n_args / 2; + msg_header_prepare (msg); + msg->cmd = CMD_WRITE_REG; + msg->egis_writereg.nb = n_args / 2; - va_start(ap, n_args); - for (i = 0; i < n_args / 2; i++) { - msg->egis_writereg.regs[i].reg = va_arg(ap, int); - msg->egis_writereg.regs[i].val = va_arg(ap, int); - } - va_end(ap); + va_start (ap, n_args); + for (i = 0; i < n_args / 2; i++) + { + msg->egis_writereg.regs[i].reg = va_arg (ap, int); + msg->egis_writereg.regs[i].val = va_arg (ap, int); + } + va_end (ap); - self->req_len = MSG_HDR_SIZE + 1 + n_args; - self->ans_len = MSG_HDR_SIZE + 1; + self->req_len = MSG_HDR_SIZE + 1 + n_args; + self->ans_len = MSG_HDR_SIZE + 1; } -static int msg_check_ok(FpiDeviceEtes603 *dev) +static int +msg_check_ok (FpiDeviceEtes603 *dev) { - struct egis_msg *msg = dev->ans; - if (msg_header_check(msg)) { - goto err; - } - if (msg->cmd != CMD_OK) { - goto err; - } - return 0; + struct egis_msg *msg = dev->ans; + + if (msg_header_check (msg)) + goto err; + if (msg->cmd != CMD_OK) + goto err; + return 0; err: - return -1; + return -1; } /* * Check the model of the sensor. */ -static int check_info(FpiDeviceEtes603 *dev) +static int +check_info (FpiDeviceEtes603 *dev) { - if (dev->regs[0x70] == 0x4A && dev->regs[0x71] == 0x44 - && dev->regs[0x72] == 0x49 && dev->regs[0x73] == 0x31) - return 0; - fp_err("unknown device parameters (REG_70:%02X REG_71:%02X " - "REG_FIRMWARE:%02X REG_VERSION:%02X)", - dev->regs[0x70], dev->regs[0x71], dev->regs[0x72], - dev->regs[0x73]); - return -1; + if (dev->regs[0x70] == 0x4A && dev->regs[0x71] == 0x44 && + dev->regs[0x72] == 0x49 && dev->regs[0x73] == 0x31) + return 0; + fp_err ("unknown device parameters (REG_70:%02X REG_71:%02X " + "REG_FIRMWARE:%02X REG_VERSION:%02X)", + dev->regs[0x70], dev->regs[0x71], dev->regs[0x72], + dev->regs[0x73]); + return -1; } -static void msg_get_cmd20(FpiDeviceEtes603 *dev) +static void +msg_get_cmd20 (FpiDeviceEtes603 *dev) { - struct egis_msg *msg = dev->req; - msg_header_prepare(msg); - msg->cmd = CMD_20; - dev->req_len = MSG_HDR_SIZE; + struct egis_msg *msg = dev->req; + + msg_header_prepare (msg); + msg->cmd = CMD_20; + dev->req_len = MSG_HDR_SIZE; } -static int msg_check_cmd20(FpiDeviceEtes603 *dev) +static int +msg_check_cmd20 (FpiDeviceEtes603 *dev) { - struct egis_msg *msg = dev->ans; - if (msg_header_check(msg)) { - fp_err("msg_header_check failed"); - return -1; - } - /* status or flashtype/flashinfo or ? */ - if (msg->cmd != 0x05 - || msg->sige_misc.val[0] != 0x00 - || msg->sige_misc.val[1] != 0x00) { - fp_warn("unexpected answer CMD_20 from device(%02X %02X %02X)", - msg->cmd, msg->sige_misc.val[0], msg->sige_misc.val[1]); - } + struct egis_msg *msg = dev->ans; - return 0; + if (msg_header_check (msg)) + { + fp_err ("msg_header_check failed"); + return -1; + } + /* status or flashtype/flashinfo or ? */ + if (msg->cmd != 0x05 || + msg->sige_misc.val[0] != 0x00 || + msg->sige_misc.val[1] != 0x00) + fp_warn ("unexpected answer CMD_20 from device(%02X %02X %02X)", + msg->cmd, msg->sige_misc.val[0], msg->sige_misc.val[1]); + + return 0; } -static void msg_get_cmd25(FpiDeviceEtes603 *dev) +static void +msg_get_cmd25 (FpiDeviceEtes603 *dev) { - struct egis_msg *msg = dev->req; - msg_header_prepare(msg); - msg->cmd = CMD_25; - dev->req_len = MSG_HDR_SIZE; + struct egis_msg *msg = dev->req; + + msg_header_prepare (msg); + msg->cmd = CMD_25; + dev->req_len = MSG_HDR_SIZE; } -static int msg_check_cmd25(FpiDeviceEtes603 *dev) +static int +msg_check_cmd25 (FpiDeviceEtes603 *dev) { - struct egis_msg *msg = dev->ans; - if (msg_header_check(msg)) { - fp_err("msg_header_check failed"); - goto err; - } - if (msg->cmd != CMD_OK) { - fp_err("CMD_OK failed"); - goto err; - } - /* flashtype or status or ? */ - if (msg->sige_misc.val[0] != 0x00) { - fp_warn("unexpected answer for CMD_25 (%02X)", - msg->sige_misc.val[0]); - } - return 0; + struct egis_msg *msg = dev->ans; + + if (msg_header_check (msg)) + { + fp_err ("msg_header_check failed"); + goto err; + } + if (msg->cmd != CMD_OK) + { + fp_err ("CMD_OK failed"); + goto err; + } + /* flashtype or status or ? */ + if (msg->sige_misc.val[0] != 0x00) + fp_warn ("unexpected answer for CMD_25 (%02X)", + msg->sige_misc.val[0]); + return 0; err: - return -1; + return -1; } -static void msg_set_mode_control(FpiDeviceEtes603 *self, guint8 mode) +static void +msg_set_mode_control (FpiDeviceEtes603 *self, guint8 mode) { - msg_set_regs(self, 2, REG_MODE_CONTROL, mode); + msg_set_regs (self, 2, REG_MODE_CONTROL, mode); } @@ -459,1013 +489,1177 @@ static void msg_set_mode_control(FpiDeviceEtes603 *self, guint8 mode) /* * Return the brightness of a 4bpp frame */ -static unsigned int process_get_brightness(guint8 *f, size_t s) +static unsigned int +process_get_brightness (guint8 *f, size_t s) { - unsigned int i, sum = 0; - for (i = 0; i < s; i++) { - sum += f[i] >> 4; - sum += f[i] & 0x0F; - } - return sum; + unsigned int i, sum = 0; + + for (i = 0; i < s; i++) + { + sum += f[i] >> 4; + sum += f[i] & 0x0F; + } + return sum; } /* * Return the histogram of a 4bpp frame */ -static void process_hist(guint8 *f, size_t s, float stat[5]) +static void +process_hist (guint8 *f, size_t s, float stat[5]) { - float hist[16]; - float black_mean, white_mean; - int i; - /* Clean histogram */ - for (i = 0; i < 16; i++) - hist[i] = 0.0; - for (i = 0; i < s; i++) { - hist[f[i] >> 4]++; - hist[f[i] & 0x0F]++; - } - /* histogram average */ - for (i = 0; i < 16; i++) { - hist[i] = hist[i] / (s * 2); - } - /* Average black/white pixels (full black and full white pixels - * are excluded). */ - black_mean = white_mean = 0.0; - for (i = 1; i < 8; i++) - black_mean += hist[i]; - for (i = 8; i < 15; i++) - white_mean += hist[i]; - stat[0] = hist[0]; - stat[1] = black_mean; - stat[2] = black_mean+white_mean; - stat[3] = white_mean; - stat[4] = hist[15]; - fp_dbg("fullb=%6f black=%6f grey=%6f white=%6f fullw=%6f", - hist[0], black_mean, black_mean+white_mean, white_mean, - hist[15]); + float hist[16]; + float black_mean, white_mean; + int i; + + /* Clean histogram */ + for (i = 0; i < 16; i++) + hist[i] = 0.0; + for (i = 0; i < s; i++) + { + hist[f[i] >> 4]++; + hist[f[i] & 0x0F]++; + } + /* histogram average */ + for (i = 0; i < 16; i++) + hist[i] = hist[i] / (s * 2); + /* Average black/white pixels (full black and full white pixels + * are excluded). */ + black_mean = white_mean = 0.0; + for (i = 1; i < 8; i++) + black_mean += hist[i]; + for (i = 8; i < 15; i++) + white_mean += hist[i]; + stat[0] = hist[0]; + stat[1] = black_mean; + stat[2] = black_mean + white_mean; + stat[3] = white_mean; + stat[4] = hist[15]; + fp_dbg ("fullb=%6f black=%6f grey=%6f white=%6f fullw=%6f", + hist[0], black_mean, black_mean + white_mean, white_mean, + hist[15]); } /* * Return true if the frame is almost empty. */ -static int process_frame_empty(guint8 *frame, size_t size) +static int +process_frame_empty (guint8 *frame, size_t size) { - unsigned int sum = process_get_brightness(frame, size); - /* Allow an average of 'threshold' luminosity per pixel */ - if (sum < size) - return 1; - return 0; + unsigned int sum = process_get_brightness (frame, size); + + /* Allow an average of 'threshold' luminosity per pixel */ + if (sum < size) + return 1; + return 0; } /* Transform 4 bits image to 8 bits image */ -static void process_4to8_bpp(guint8 *input, unsigned int input_size, - guint8 *output) +static void +process_4to8_bpp (guint8 *input, unsigned int input_size, + guint8 *output) { - unsigned int i, j = 0; - for (i = 0; i < input_size; i++, j += 2) { - /* 16 gray levels transform to 256 levels using << 4 */ - output[j] = input[i] & 0xF0; - output[j+1] = input[i] << 4; - } + unsigned int i, j = 0; + + for (i = 0; i < input_size; i++, j += 2) + { + /* 16 gray levels transform to 256 levels using << 4 */ + output[j] = input[i] & 0xF0; + output[j + 1] = input[i] << 4; + } } /* * Remove duplicated lines at the end of a fingerprint. */ -static void process_removefpi_end(FpiDeviceEtes603 *dev) +static void +process_removefpi_end (FpiDeviceEtes603 *dev) { - unsigned int i; - /* 2 last lines with Fly-Estimation are the empty pattern. */ - guint8 *pattern = dev->fp + (dev->fp_height - 2) * FE_WIDTH / 2; - for (i = 2; i < dev->fp_height; i+= 2) { - if (memcmp(pattern, pattern - (i * FE_WIDTH / 2), FE_WIDTH)) - break; - } - dev->fp_height -= i; - fp_dbg("Removing %d empty lines from image", i - 2); + unsigned int i; + /* 2 last lines with Fly-Estimation are the empty pattern. */ + guint8 *pattern = dev->fp + (dev->fp_height - 2) * FE_WIDTH / 2; + + for (i = 2; i < dev->fp_height; i += 2) + if (memcmp (pattern, pattern - (i * FE_WIDTH / 2), FE_WIDTH)) + break; + dev->fp_height -= i; + fp_dbg ("Removing %d empty lines from image", i - 2); } -static void reset_param(FpiDeviceEtes603 *dev) +static void +reset_param (FpiDeviceEtes603 *dev) { - dev->dcoffset = 0; - dev->vrt = 0; - dev->vrb = 0; - dev->gain = 0; + dev->dcoffset = 0; + dev->vrt = 0; + dev->vrb = 0; + dev->gain = 0; } /* Asynchronous stuff */ enum { - INIT_CHECK_INFO_REQ, - INIT_CHECK_INFO_ANS, - INIT_CMD20_REQ, - INIT_CMD20_ANS, - INIT_CMD25_REQ, - INIT_CMD25_ANS, - INIT_SENSOR_REQ, - INIT_SENSOR_ANS, - INIT_ENC_REQ, - INIT_ENC_ANS, - INIT_REGS_REQ, - INIT_REGS_ANS, - INIT_NUM_STATES + INIT_CHECK_INFO_REQ, + INIT_CHECK_INFO_ANS, + INIT_CMD20_REQ, + INIT_CMD20_ANS, + INIT_CMD25_REQ, + INIT_CMD25_ANS, + INIT_SENSOR_REQ, + INIT_SENSOR_ANS, + INIT_ENC_REQ, + INIT_ENC_ANS, + INIT_REGS_REQ, + INIT_REGS_ANS, + INIT_NUM_STATES }; enum { - TUNEDC_INIT, - TUNEDC_SET_DCOFFSET_REQ, - TUNEDC_SET_DCOFFSET_ANS, - TUNEDC_GET_FRAME_REQ, - TUNEDC_GET_FRAME_ANS, - TUNEDC_FINAL_SET_REG2122_REQ, - TUNEDC_FINAL_SET_REG2122_ANS, - TUNEDC_FINAL_SET_GAIN_REQ, - TUNEDC_FINAL_SET_GAIN_ANS, - TUNEDC_FINAL_SET_DCOFFSET_REQ, - TUNEDC_FINAL_SET_DCOFFSET_ANS, - TUNEDC_NUM_STATES + TUNEDC_INIT, + TUNEDC_SET_DCOFFSET_REQ, + TUNEDC_SET_DCOFFSET_ANS, + TUNEDC_GET_FRAME_REQ, + TUNEDC_GET_FRAME_ANS, + TUNEDC_FINAL_SET_REG2122_REQ, + TUNEDC_FINAL_SET_REG2122_ANS, + TUNEDC_FINAL_SET_GAIN_REQ, + TUNEDC_FINAL_SET_GAIN_ANS, + TUNEDC_FINAL_SET_DCOFFSET_REQ, + TUNEDC_FINAL_SET_DCOFFSET_ANS, + TUNEDC_NUM_STATES }; enum { - TUNEVRB_INIT, - TUNEVRB_GET_GAIN_REQ, - TUNEVRB_GET_GAIN_ANS, - TUNEVRB_GET_DCOFFSET_REQ, - TUNEVRB_GET_DCOFFSET_ANS, - TUNEVRB_SET_DCOFFSET_REQ, - TUNEVRB_SET_DCOFFSET_ANS, - TUNEVRB_FRAME_REQ, - TUNEVRB_FRAME_ANS, - TUNEVRB_FINAL_SET_DCOFFSET_REQ, - TUNEVRB_FINAL_SET_DCOFFSET_ANS, - TUNEVRB_FINAL_SET_REG2627_REQ, - TUNEVRB_FINAL_SET_REG2627_ANS, - TUNEVRB_FINAL_SET_GAINVRTVRB_REQ, - TUNEVRB_FINAL_SET_GAINVRTVRB_ANS, - TUNEVRB_FINAL_SET_MODE_SLEEP_REQ, - TUNEVRB_FINAL_SET_MODE_SLEEP_ANS, - TUNEVRB_NUM_STATES + TUNEVRB_INIT, + TUNEVRB_GET_GAIN_REQ, + TUNEVRB_GET_GAIN_ANS, + TUNEVRB_GET_DCOFFSET_REQ, + TUNEVRB_GET_DCOFFSET_ANS, + TUNEVRB_SET_DCOFFSET_REQ, + TUNEVRB_SET_DCOFFSET_ANS, + TUNEVRB_FRAME_REQ, + TUNEVRB_FRAME_ANS, + TUNEVRB_FINAL_SET_DCOFFSET_REQ, + TUNEVRB_FINAL_SET_DCOFFSET_ANS, + TUNEVRB_FINAL_SET_REG2627_REQ, + TUNEVRB_FINAL_SET_REG2627_ANS, + TUNEVRB_FINAL_SET_GAINVRTVRB_REQ, + TUNEVRB_FINAL_SET_GAINVRTVRB_ANS, + TUNEVRB_FINAL_SET_MODE_SLEEP_REQ, + TUNEVRB_FINAL_SET_MODE_SLEEP_ANS, + TUNEVRB_NUM_STATES }; enum { - FGR_FPA_INIT_SET_MODE_SLEEP_REQ, - FGR_FPA_INIT_SET_MODE_SLEEP_ANS, - FGR_FPA_INIT_SET_DCOFFSET_REQ, - FGR_FPA_INIT_SET_DCOFFSET_ANS, - FGR_FPA_INIT_SET_GAINVRTVRB_REQ, - FGR_FPA_INIT_SET_GAINVRTVRB_ANS, - FGR_FPA_INIT_SET_VCO_CONTROL_RT_REQ, - FGR_FPA_INIT_SET_VCO_CONTROL_RT_ANS, - FGR_FPA_INIT_SET_REG04_REQ, - FGR_FPA_INIT_SET_REG04_ANS, - FGR_FPA_INIT_SET_MODE_SENSOR_REQ, - FGR_FPA_INIT_SET_MODE_SENSOR_ANS, - FGR_FPA_GET_FRAME_REQ, - FGR_FPA_GET_FRAME_ANS, - FGR_NUM_STATES + FGR_FPA_INIT_SET_MODE_SLEEP_REQ, + FGR_FPA_INIT_SET_MODE_SLEEP_ANS, + FGR_FPA_INIT_SET_DCOFFSET_REQ, + FGR_FPA_INIT_SET_DCOFFSET_ANS, + FGR_FPA_INIT_SET_GAINVRTVRB_REQ, + FGR_FPA_INIT_SET_GAINVRTVRB_ANS, + FGR_FPA_INIT_SET_VCO_CONTROL_RT_REQ, + FGR_FPA_INIT_SET_VCO_CONTROL_RT_ANS, + FGR_FPA_INIT_SET_REG04_REQ, + FGR_FPA_INIT_SET_REG04_ANS, + FGR_FPA_INIT_SET_MODE_SENSOR_REQ, + FGR_FPA_INIT_SET_MODE_SENSOR_ANS, + FGR_FPA_GET_FRAME_REQ, + FGR_FPA_GET_FRAME_ANS, + FGR_NUM_STATES }; enum { - CAP_FP_INIT_SET_REG10_REQ, - CAP_FP_INIT_SET_REG10_ANS, - CAP_FP_INIT_SET_MODE_FP_REQ, - CAP_FP_INIT_SET_MODE_FP_ANS, - CAP_FP_GET_FP_REQ, - CAP_FP_GET_FP_ANS, - CAP_NUM_STATES + CAP_FP_INIT_SET_REG10_REQ, + CAP_FP_INIT_SET_REG10_ANS, + CAP_FP_INIT_SET_MODE_FP_REQ, + CAP_FP_INIT_SET_MODE_FP_ANS, + CAP_FP_GET_FP_REQ, + CAP_FP_GET_FP_ANS, + CAP_NUM_STATES }; enum { - EXIT_SET_REGS_REQ, - EXIT_SET_REGS_ANS, - EXIT_NUM_STATES + EXIT_SET_REGS_REQ, + EXIT_SET_REGS_ANS, + EXIT_NUM_STATES }; -static void async_tx(FpDevice *dev, unsigned int ep, void *cb, - FpiSsm *ssm) +static void +async_tx (FpDevice *dev, unsigned int ep, void *cb, + FpiSsm *ssm) { - FpiDeviceEtes603 *self = FPI_DEVICE_ETES603(dev); - FpiUsbTransfer *transfer = fpi_usb_transfer_new(dev); - unsigned char *buffer = NULL; - int length; + FpiDeviceEtes603 *self = FPI_DEVICE_ETES603 (dev); + FpiUsbTransfer *transfer = fpi_usb_transfer_new (dev); + unsigned char *buffer = NULL; + int length; - if (ep == EP_OUT) { - buffer = (unsigned char *) self->req; - length = self->req_len; - } else if (ep == EP_IN) { - buffer = (unsigned char *) self->ans; - length = self->ans_len; - } else { - g_assert_not_reached (); - } - transfer->ssm = ssm; - fpi_usb_transfer_fill_bulk_full(transfer, ep, buffer, length, NULL); - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, cb, NULL); - fpi_usb_transfer_unref(transfer); + if (ep == EP_OUT) + { + buffer = (unsigned char *) self->req; + length = self->req_len; + } + else if (ep == EP_IN) + { + buffer = (unsigned char *) self->ans; + length = self->ans_len; + } + else + { + g_assert_not_reached (); + } + transfer->ssm = ssm; + fpi_usb_transfer_fill_bulk_full (transfer, ep, buffer, length, NULL); + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, cb, NULL); + fpi_usb_transfer_unref (transfer); } -static void async_tx_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +async_tx_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpImageDevice *idev = FP_IMAGE_DEVICE(device); - FpiDeviceEtes603 *self = FPI_DEVICE_ETES603(idev); + FpImageDevice *idev = FP_IMAGE_DEVICE (device); + FpiDeviceEtes603 *self = FPI_DEVICE_ETES603 (idev); - if (error) { - fp_warn("transfer is not completed (result: %s)", - error->message); - fpi_ssm_mark_failed(transfer->ssm, error); - } else { - unsigned char endpoint = transfer->endpoint; - int actual_length = transfer->actual_length; - int length = transfer->length; + if (error) + { + fp_warn ("transfer is not completed (result: %s)", + error->message); + fpi_ssm_mark_failed (transfer->ssm, error); + } + else + { + unsigned char endpoint = transfer->endpoint; + int actual_length = transfer->actual_length; + int length = transfer->length; - if (endpoint == EP_OUT) { - if (length != actual_length) - fp_warn("length %d != actual_length %d", - length, actual_length); + if (endpoint == EP_OUT) + { + if (length != actual_length) + fp_warn ("length %d != actual_length %d", + length, actual_length); - /* Chained with the answer */ - async_tx(device, EP_IN, async_tx_cb, transfer->ssm); - } else if (endpoint == EP_IN) { - self->ans_len = actual_length; - fpi_ssm_next_state(transfer->ssm); - } - } + /* Chained with the answer */ + async_tx (device, EP_IN, async_tx_cb, transfer->ssm); + } + else if (endpoint == EP_IN) + { + self->ans_len = actual_length; + fpi_ssm_next_state (transfer->ssm); + } + } } -static void m_exit_state(FpiSsm *ssm, FpDevice *dev, void *user_data) +static void +m_exit_state (FpiSsm *ssm, FpDevice *dev, void *user_data) { - FpiDeviceEtes603 *self = FPI_DEVICE_ETES603(dev); + FpiDeviceEtes603 *self = FPI_DEVICE_ETES603 (dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case EXIT_SET_REGS_REQ: - msg_set_regs(self, 4, REG_VCO_CONTROL, REG_VCO_IDLE, - REG_MODE_CONTROL, REG_MODE_SLEEP); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case EXIT_SET_REGS_ANS: - if (msg_check_ok(self)) - goto err; - fpi_ssm_mark_completed(ssm); - break; - default: - g_assert_not_reached(); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case EXIT_SET_REGS_REQ: + msg_set_regs (self, 4, REG_VCO_CONTROL, REG_VCO_IDLE, + REG_MODE_CONTROL, REG_MODE_SLEEP); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; - return; + case EXIT_SET_REGS_ANS: + if (msg_check_ok (self)) + goto err; + fpi_ssm_mark_completed (ssm); + break; + + default: + g_assert_not_reached (); + break; + } + + return; err: - fpi_ssm_mark_failed(ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); } -static void m_exit_complete(FpiSsm *ssm, FpDevice *dev, void *user_data, - GError *error) +static void +m_exit_complete (FpiSsm *ssm, FpDevice *dev, void *user_data, + GError *error) { - FpImageDevice *idev = FP_IMAGE_DEVICE (dev); + FpImageDevice *idev = FP_IMAGE_DEVICE (dev); - if (error) { - fp_err("Error switching the device to idle state"); - } else { - fp_dbg("The device is now in idle state"); - } - fpi_image_device_deactivate_complete(idev, error); - fpi_ssm_free(ssm); + if (error) + fp_err ("Error switching the device to idle state"); + else + fp_dbg ("The device is now in idle state"); + fpi_image_device_deactivate_complete (idev, error); + fpi_ssm_free (ssm); } -static void m_exit_start(FpImageDevice *idev) +static void +m_exit_start (FpImageDevice *idev) { - FpiDeviceEtes603 *self = FPI_DEVICE_ETES603(idev); - FpiSsm *ssm = fpi_ssm_new(FP_DEVICE(idev), m_exit_state, - EXIT_NUM_STATES, idev); + FpiDeviceEtes603 *self = FPI_DEVICE_ETES603 (idev); + FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (idev), m_exit_state, + EXIT_NUM_STATES, idev); - self->is_active = FALSE; - fp_dbg("Switching device to idle mode"); - fpi_ssm_start(ssm, m_exit_complete); + self->is_active = FALSE; + fp_dbg ("Switching device to idle mode"); + fpi_ssm_start (ssm, m_exit_complete); } -static void m_capture_state(FpiSsm *ssm, FpDevice *dev, void *user_data) +static void +m_capture_state (FpiSsm *ssm, FpDevice *dev, void *user_data) { - FpImageDevice *idev = FP_IMAGE_DEVICE (dev); - FpiDeviceEtes603 *self = FPI_DEVICE_ETES603(dev); + FpImageDevice *idev = FP_IMAGE_DEVICE (dev); + FpiDeviceEtes603 *self = FPI_DEVICE_ETES603 (dev); - if (self->is_active == FALSE) { - fpi_ssm_mark_completed(ssm); - return; - } + if (self->is_active == FALSE) + { + fpi_ssm_mark_completed (ssm); + return; + } - switch (fpi_ssm_get_cur_state(ssm)) { - case CAP_FP_INIT_SET_REG10_REQ: - /* Reset fingerprint */ - fp_dbg("Capturing a fingerprint..."); - memset(self->fp, 0, FE_SIZE * 2); - self->fp_height = 0; - msg_set_regs(self, 2, REG_10, 0x92); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case CAP_FP_INIT_SET_REG10_ANS: - if (msg_check_ok(self)) - goto err; - fpi_ssm_next_state(ssm); - break; - case CAP_FP_INIT_SET_MODE_FP_REQ: - msg_set_mode_control(self, REG_MODE_FP); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case CAP_FP_INIT_SET_MODE_FP_ANS: - if (msg_check_ok(self)) - goto err; - fp_dbg("Capturing a 1st frame..."); - fpi_ssm_next_state(ssm); - break; - case CAP_FP_GET_FP_REQ: - msg_get_fp(self, 0x01, 0xF4, 0x02, 0x01, 0x64); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case CAP_FP_GET_FP_ANS: - memcpy(self->fp + self->fp_height * FE_WIDTH / 2, self->ans, - FE_SIZE); - self->fp_height += FE_HEIGHT; - if (self->fp_height <= FE_HEIGHT) { - /* 2 lines are at least removed each time */ - self->fp_height -= 2; - fp_dbg("Capturing a 2nd frame..."); - fpi_ssm_jump_to_state(ssm, CAP_FP_GET_FP_REQ); - } else { - FpImage *img; - unsigned int img_size; - /* Remove empty parts 2 times for the 2 frames */ - process_removefpi_end(self); - process_removefpi_end(self); - img_size = self->fp_height * FE_WIDTH; - img = fp_image_new(FE_WIDTH, self->fp_height); - /* Images received are white on black, so invert it. */ - /* TODO detect sweep direction */ - img->flags = FPI_IMAGE_COLORS_INVERTED | FPI_IMAGE_V_FLIPPED; - img->height = self->fp_height; - process_4to8_bpp(self->fp, img_size / 2, img->data); - fp_dbg("Sending the raw fingerprint image (%dx%d)", - img->width, img->height); - fpi_image_device_image_captured(idev, img); - fpi_image_device_report_finger_status(idev, FALSE); - fpi_ssm_mark_completed(ssm); - } - break; - default: - g_assert_not_reached(); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case CAP_FP_INIT_SET_REG10_REQ: + /* Reset fingerprint */ + fp_dbg ("Capturing a fingerprint..."); + memset (self->fp, 0, FE_SIZE * 2); + self->fp_height = 0; + msg_set_regs (self, 2, REG_10, 0x92); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; - return; + case CAP_FP_INIT_SET_REG10_ANS: + if (msg_check_ok (self)) + goto err; + fpi_ssm_next_state (ssm); + break; + + case CAP_FP_INIT_SET_MODE_FP_REQ: + msg_set_mode_control (self, REG_MODE_FP); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case CAP_FP_INIT_SET_MODE_FP_ANS: + if (msg_check_ok (self)) + goto err; + fp_dbg ("Capturing a 1st frame..."); + fpi_ssm_next_state (ssm); + break; + + case CAP_FP_GET_FP_REQ: + msg_get_fp (self, 0x01, 0xF4, 0x02, 0x01, 0x64); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case CAP_FP_GET_FP_ANS: + memcpy (self->fp + self->fp_height * FE_WIDTH / 2, self->ans, + FE_SIZE); + self->fp_height += FE_HEIGHT; + if (self->fp_height <= FE_HEIGHT) + { + /* 2 lines are at least removed each time */ + self->fp_height -= 2; + fp_dbg ("Capturing a 2nd frame..."); + fpi_ssm_jump_to_state (ssm, CAP_FP_GET_FP_REQ); + } + else + { + FpImage *img; + unsigned int img_size; + /* Remove empty parts 2 times for the 2 frames */ + process_removefpi_end (self); + process_removefpi_end (self); + img_size = self->fp_height * FE_WIDTH; + img = fp_image_new (FE_WIDTH, self->fp_height); + /* Images received are white on black, so invert it. */ + /* TODO detect sweep direction */ + img->flags = FPI_IMAGE_COLORS_INVERTED | FPI_IMAGE_V_FLIPPED; + img->height = self->fp_height; + process_4to8_bpp (self->fp, img_size / 2, img->data); + fp_dbg ("Sending the raw fingerprint image (%dx%d)", + img->width, img->height); + fpi_image_device_image_captured (idev, img); + fpi_image_device_report_finger_status (idev, FALSE); + fpi_ssm_mark_completed (ssm); + } + break; + + default: + g_assert_not_reached (); + break; + } + + return; err: - fpi_ssm_mark_failed(ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); } -static void m_capture_complete(FpiSsm *ssm, FpDevice *dev, void *user_data, - GError *error) +static void +m_capture_complete (FpiSsm *ssm, FpDevice *dev, void *user_data, + GError *error) { - FpImageDevice *idev = FP_IMAGE_DEVICE (dev); - FpiDeviceEtes603 *self = FPI_DEVICE_ETES603(dev); + FpImageDevice *idev = FP_IMAGE_DEVICE (dev); + FpiDeviceEtes603 *self = FPI_DEVICE_ETES603 (dev); - if (error) { - if (self->is_active) { - fp_err("Error while capturing fingerprint " - "(%s)", error->message); - fpi_image_device_session_error (idev, error); - } else { - g_error_free (error); - } - } - fpi_ssm_free(ssm); + if (error) + { + if (self->is_active) + { + fp_err ("Error while capturing fingerprint " + "(%s)", error->message); + fpi_image_device_session_error (idev, error); + } + else + { + g_error_free (error); + } + } + fpi_ssm_free (ssm); - if (self->is_active == TRUE) { - fp_dbg("Device is still active, restarting finger detection"); - m_start_fingerdetect(idev); - } else { - fp_dbg("And it's over."); - m_exit_start(idev); - } + if (self->is_active == TRUE) + { + fp_dbg ("Device is still active, restarting finger detection"); + m_start_fingerdetect (idev); + } + else + { + fp_dbg ("And it's over."); + m_exit_start (idev); + } } -static void m_finger_state(FpiSsm *ssm, FpDevice *dev, void *user_data) +static void +m_finger_state (FpiSsm *ssm, FpDevice *dev, void *user_data) { - FpiDeviceEtes603 *self = FPI_DEVICE_ETES603(dev); + FpiDeviceEtes603 *self = FPI_DEVICE_ETES603 (dev); - if (self->is_active == FALSE) { - fpi_ssm_mark_completed(ssm); - return; - } + if (self->is_active == FALSE) + { + fpi_ssm_mark_completed (ssm); + return; + } - switch (fpi_ssm_get_cur_state(ssm)) { - case FGR_FPA_INIT_SET_MODE_SLEEP_REQ: - msg_set_mode_control(self, REG_MODE_SLEEP); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case FGR_FPA_INIT_SET_MODE_SLEEP_ANS: - if (msg_check_ok(self)) - goto err; - fpi_ssm_next_state(ssm); - break; - case FGR_FPA_INIT_SET_DCOFFSET_REQ: - msg_set_regs(self, 2, REG_DCOFFSET, self->dcoffset); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case FGR_FPA_INIT_SET_DCOFFSET_ANS: - if (msg_check_ok(self)) - goto err; - fpi_ssm_next_state(ssm); - break; - case FGR_FPA_INIT_SET_GAINVRTVRB_REQ: - msg_set_regs(self, 6, REG_GAIN, self->gain, REG_VRT, - self->vrt, - REG_VRB, self->vrb); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case FGR_FPA_INIT_SET_GAINVRTVRB_ANS: - if (msg_check_ok(self)) - goto err; - fpi_ssm_next_state(ssm); - break; - case FGR_FPA_INIT_SET_VCO_CONTROL_RT_REQ: - msg_set_regs(self, 2, REG_VCO_CONTROL, REG_VCO_RT); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case FGR_FPA_INIT_SET_VCO_CONTROL_RT_ANS: - if (msg_check_ok(self)) - goto err; - fpi_ssm_next_state(ssm); - break; - case FGR_FPA_INIT_SET_REG04_REQ: - msg_set_regs(self, 2, REG_04, 0x00); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case FGR_FPA_INIT_SET_REG04_ANS: - if (msg_check_ok(self)) - goto err; - fpi_ssm_next_state(ssm); - break; - case FGR_FPA_INIT_SET_MODE_SENSOR_REQ: - msg_set_mode_control(self, REG_MODE_SENSOR); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case FGR_FPA_INIT_SET_MODE_SENSOR_ANS: - if (msg_check_ok(self)) - goto err; - fpi_ssm_next_state(ssm); - break; - case FGR_FPA_GET_FRAME_REQ: - msg_get_frame(self, 0x00, 0x00, 0x00, 0x00); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case FGR_FPA_GET_FRAME_ANS: - if (process_frame_empty((guint8 *) self->ans, FRAME_SIZE)) { - fpi_ssm_jump_to_state(ssm, FGR_FPA_GET_FRAME_REQ); - } else { - fpi_image_device_report_finger_status(FP_IMAGE_DEVICE (dev), TRUE); - fpi_ssm_mark_completed(ssm); - } - break; - default: - g_assert_not_reached(); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case FGR_FPA_INIT_SET_MODE_SLEEP_REQ: + msg_set_mode_control (self, REG_MODE_SLEEP); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; - return; + case FGR_FPA_INIT_SET_MODE_SLEEP_ANS: + if (msg_check_ok (self)) + goto err; + fpi_ssm_next_state (ssm); + break; + + case FGR_FPA_INIT_SET_DCOFFSET_REQ: + msg_set_regs (self, 2, REG_DCOFFSET, self->dcoffset); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case FGR_FPA_INIT_SET_DCOFFSET_ANS: + if (msg_check_ok (self)) + goto err; + fpi_ssm_next_state (ssm); + break; + + case FGR_FPA_INIT_SET_GAINVRTVRB_REQ: + msg_set_regs (self, 6, REG_GAIN, self->gain, REG_VRT, + self->vrt, + REG_VRB, self->vrb); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case FGR_FPA_INIT_SET_GAINVRTVRB_ANS: + if (msg_check_ok (self)) + goto err; + fpi_ssm_next_state (ssm); + break; + + case FGR_FPA_INIT_SET_VCO_CONTROL_RT_REQ: + msg_set_regs (self, 2, REG_VCO_CONTROL, REG_VCO_RT); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case FGR_FPA_INIT_SET_VCO_CONTROL_RT_ANS: + if (msg_check_ok (self)) + goto err; + fpi_ssm_next_state (ssm); + break; + + case FGR_FPA_INIT_SET_REG04_REQ: + msg_set_regs (self, 2, REG_04, 0x00); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case FGR_FPA_INIT_SET_REG04_ANS: + if (msg_check_ok (self)) + goto err; + fpi_ssm_next_state (ssm); + break; + + case FGR_FPA_INIT_SET_MODE_SENSOR_REQ: + msg_set_mode_control (self, REG_MODE_SENSOR); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case FGR_FPA_INIT_SET_MODE_SENSOR_ANS: + if (msg_check_ok (self)) + goto err; + fpi_ssm_next_state (ssm); + break; + + case FGR_FPA_GET_FRAME_REQ: + msg_get_frame (self, 0x00, 0x00, 0x00, 0x00); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case FGR_FPA_GET_FRAME_ANS: + if (process_frame_empty ((guint8 *) self->ans, FRAME_SIZE)) + { + fpi_ssm_jump_to_state (ssm, FGR_FPA_GET_FRAME_REQ); + } + else + { + fpi_image_device_report_finger_status (FP_IMAGE_DEVICE (dev), TRUE); + fpi_ssm_mark_completed (ssm); + } + break; + + default: + g_assert_not_reached (); + break; + } + + return; err: - fpi_ssm_mark_failed(ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); } -static void m_finger_complete(FpiSsm *ssm, FpDevice *dev, void *user_data, - GError *error) +static void +m_finger_complete (FpiSsm *ssm, FpDevice *dev, void *user_data, + GError *error) { - FpImageDevice *idev = FP_IMAGE_DEVICE (dev); - FpiDeviceEtes603 *self = FPI_DEVICE_ETES603(dev); + FpImageDevice *idev = FP_IMAGE_DEVICE (dev); + FpiDeviceEtes603 *self = FPI_DEVICE_ETES603 (dev); - if (!error) { - FpiSsm *ssm_cap; - ssm_cap = fpi_ssm_new(dev, m_capture_state, - CAP_NUM_STATES, NULL); - fpi_ssm_start(ssm_cap, m_capture_complete); - } else { - if (self->is_active) { - fp_err("Error while capturing fingerprint " - "(%s)", error->message); - fpi_image_device_session_error(idev, error); - } else { - m_exit_start(idev); - g_error_free (error); - } - self->is_active = FALSE; - } + if (!error) + { + FpiSsm *ssm_cap; + ssm_cap = fpi_ssm_new (dev, m_capture_state, + CAP_NUM_STATES, NULL); + fpi_ssm_start (ssm_cap, m_capture_complete); + } + else + { + if (self->is_active) + { + fp_err ("Error while capturing fingerprint " + "(%s)", error->message); + fpi_image_device_session_error (idev, error); + } + else + { + m_exit_start (idev); + g_error_free (error); + } + self->is_active = FALSE; + } - fpi_ssm_free(ssm); + fpi_ssm_free (ssm); } -static void m_start_fingerdetect(FpImageDevice *idev) +static void +m_start_fingerdetect (FpImageDevice *idev) { - FpiSsm *ssmf; - ssmf = fpi_ssm_new(FP_DEVICE(idev), m_finger_state, FGR_NUM_STATES, - idev); - fpi_ssm_start(ssmf, m_finger_complete); + FpiSsm *ssmf; + + ssmf = fpi_ssm_new (FP_DEVICE (idev), m_finger_state, FGR_NUM_STATES, + idev); + fpi_ssm_start (ssmf, m_finger_complete); } /* * Tune value of VRT and VRB for contrast and brightness. */ -static void m_tunevrb_state(FpiSsm *ssm, FpDevice *dev, void *user_data) +static void +m_tunevrb_state (FpiSsm *ssm, FpDevice *dev, void *user_data) { - FpiDeviceEtes603 *self = FPI_DEVICE_ETES603(dev); - float hist[5]; + FpiDeviceEtes603 *self = FPI_DEVICE_ETES603 (dev); + float hist[5]; - if (self->is_active == FALSE) { - fpi_ssm_mark_completed(ssm); - return; - } + if (self->is_active == FALSE) + { + fpi_ssm_mark_completed (ssm); + return; + } - switch (fpi_ssm_get_cur_state(ssm)) { - case TUNEVRB_INIT: - fp_dbg("Tuning of VRT/VRB"); - g_assert(self->dcoffset); - /* VRT(reg E1)=0x0A and VRB(reg E2)=0x10 are starting values */ - self->vrt = 0x0A; - self->vrb = 0x10; - fpi_ssm_next_state(ssm); - break; - case TUNEVRB_GET_GAIN_REQ: - msg_get_regs(self, 1, REG_GAIN); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case TUNEVRB_GET_GAIN_ANS: - if (msg_parse_regs(self)) - goto err; - fpi_ssm_next_state(ssm); - break; - case TUNEVRB_GET_DCOFFSET_REQ: - msg_get_regs(self, 1, REG_DCOFFSET); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case TUNEVRB_GET_DCOFFSET_ANS: - if (msg_parse_regs(self)) - goto err; - fpi_ssm_next_state(ssm); - break; - case TUNEVRB_SET_DCOFFSET_REQ: - /* Reduce DCoffset by 1 to allow tuning */ - msg_set_regs(self, 2, REG_DCOFFSET, self->dcoffset - 1); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case TUNEVRB_SET_DCOFFSET_ANS: - if (msg_check_ok(self)) - goto err; - fpi_ssm_next_state(ssm); - break; - case TUNEVRB_FRAME_REQ: - fp_dbg("Testing VRT=0x%02X VRB=0x%02X", self->vrt, self->vrb); - msg_get_frame(self, 0x01, self->gain, self->vrt, self->vrb); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case TUNEVRB_FRAME_ANS: - process_hist((guint8 *) self->ans, FRAME_SIZE, hist); - /* Note that this tuning could probably be improved */ - if (hist[0] + hist[1] > 0.95) { - if (self->vrt <= 0 || self->vrb <= 0) { - fp_dbg("Image is too dark, reducing DCOffset"); - self->dcoffset--; - fpi_ssm_jump_to_state(ssm, TUNEVRB_INIT); - } else { - self->vrt--; - self->vrb--; - fpi_ssm_jump_to_state(ssm, TUNEVRB_FRAME_REQ); - } - break; - } - if (hist[4] > 0.95) { - fp_dbg("Image is too bright, increasing DCOffset"); - self->dcoffset++; - fpi_ssm_jump_to_state(ssm, TUNEVRB_INIT); - break; - } - if (hist[4] + hist[3] > 0.4) { - if (self->vrt >= 2 * self->vrb - 0x0a) { - self->vrt++; self->vrb++; - } else { - self->vrt++; - } - /* Check maximum for vrt/vrb */ - /* TODO if maximum is reached, leave with an error? */ - if (self->vrt > VRT_MAX) - self->vrt = VRT_MAX; - if (self->vrb > VRB_MAX) - self->vrb = VRB_MAX; - fpi_ssm_jump_to_state(ssm, TUNEVRB_FRAME_REQ); - break; - } - fpi_ssm_next_state(ssm); - break; - case TUNEVRB_FINAL_SET_DCOFFSET_REQ: - fp_dbg("-> VRT=0x%02X VRB=0x%02X", self->vrt, self->vrb); - /* Reset the DCOffset */ - msg_set_regs(self, 2, REG_DCOFFSET, self->dcoffset); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case TUNEVRB_FINAL_SET_DCOFFSET_ANS: - if (msg_check_ok(self)) - goto err; - fpi_ssm_next_state(ssm); - break; - case TUNEVRB_FINAL_SET_REG2627_REQ: - /* In traces, REG_26/REG_27 are set. purpose? values? */ - msg_set_regs(self, 4, REG_26, 0x11, REG_27, 0x00); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case TUNEVRB_FINAL_SET_REG2627_ANS: - if (msg_check_ok(self)) - goto err; - fpi_ssm_next_state(ssm); - break; - case TUNEVRB_FINAL_SET_GAINVRTVRB_REQ: - /* Set Gain/VRT/VRB values found */ - msg_set_regs(self, 6, REG_GAIN, self->gain, REG_VRT, - self->vrt, - REG_VRB, self->vrb); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case TUNEVRB_FINAL_SET_GAINVRTVRB_ANS: - if (msg_check_ok(self)) - goto err; - /* In traces, Gain/VRT/VRB are read again. */ - fpi_ssm_next_state(ssm); - break; - case TUNEVRB_FINAL_SET_MODE_SLEEP_REQ: - msg_set_mode_control(self, REG_MODE_SLEEP); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case TUNEVRB_FINAL_SET_MODE_SLEEP_ANS: - if (msg_check_ok(self)) - goto err; - fpi_ssm_mark_completed(ssm); - break; - default: - g_assert_not_reached(); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case TUNEVRB_INIT: + fp_dbg ("Tuning of VRT/VRB"); + g_assert (self->dcoffset); + /* VRT(reg E1)=0x0A and VRB(reg E2)=0x10 are starting values */ + self->vrt = 0x0A; + self->vrb = 0x10; + fpi_ssm_next_state (ssm); + break; - return; + case TUNEVRB_GET_GAIN_REQ: + msg_get_regs (self, 1, REG_GAIN); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case TUNEVRB_GET_GAIN_ANS: + if (msg_parse_regs (self)) + goto err; + fpi_ssm_next_state (ssm); + break; + + case TUNEVRB_GET_DCOFFSET_REQ: + msg_get_regs (self, 1, REG_DCOFFSET); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case TUNEVRB_GET_DCOFFSET_ANS: + if (msg_parse_regs (self)) + goto err; + fpi_ssm_next_state (ssm); + break; + + case TUNEVRB_SET_DCOFFSET_REQ: + /* Reduce DCoffset by 1 to allow tuning */ + msg_set_regs (self, 2, REG_DCOFFSET, self->dcoffset - 1); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case TUNEVRB_SET_DCOFFSET_ANS: + if (msg_check_ok (self)) + goto err; + fpi_ssm_next_state (ssm); + break; + + case TUNEVRB_FRAME_REQ: + fp_dbg ("Testing VRT=0x%02X VRB=0x%02X", self->vrt, self->vrb); + msg_get_frame (self, 0x01, self->gain, self->vrt, self->vrb); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case TUNEVRB_FRAME_ANS: + process_hist ((guint8 *) self->ans, FRAME_SIZE, hist); + /* Note that this tuning could probably be improved */ + if (hist[0] + hist[1] > 0.95) + { + if (self->vrt <= 0 || self->vrb <= 0) + { + fp_dbg ("Image is too dark, reducing DCOffset"); + self->dcoffset--; + fpi_ssm_jump_to_state (ssm, TUNEVRB_INIT); + } + else + { + self->vrt--; + self->vrb--; + fpi_ssm_jump_to_state (ssm, TUNEVRB_FRAME_REQ); + } + break; + } + if (hist[4] > 0.95) + { + fp_dbg ("Image is too bright, increasing DCOffset"); + self->dcoffset++; + fpi_ssm_jump_to_state (ssm, TUNEVRB_INIT); + break; + } + if (hist[4] + hist[3] > 0.4) + { + if (self->vrt >= 2 * self->vrb - 0x0a) + { + self->vrt++; + self->vrb++; + } + else + { + self->vrt++; + } + /* Check maximum for vrt/vrb */ + /* TODO if maximum is reached, leave with an error? */ + if (self->vrt > VRT_MAX) + self->vrt = VRT_MAX; + if (self->vrb > VRB_MAX) + self->vrb = VRB_MAX; + fpi_ssm_jump_to_state (ssm, TUNEVRB_FRAME_REQ); + break; + } + fpi_ssm_next_state (ssm); + break; + + case TUNEVRB_FINAL_SET_DCOFFSET_REQ: + fp_dbg ("-> VRT=0x%02X VRB=0x%02X", self->vrt, self->vrb); + /* Reset the DCOffset */ + msg_set_regs (self, 2, REG_DCOFFSET, self->dcoffset); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case TUNEVRB_FINAL_SET_DCOFFSET_ANS: + if (msg_check_ok (self)) + goto err; + fpi_ssm_next_state (ssm); + break; + + case TUNEVRB_FINAL_SET_REG2627_REQ: + /* In traces, REG_26/REG_27 are set. purpose? values? */ + msg_set_regs (self, 4, REG_26, 0x11, REG_27, 0x00); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case TUNEVRB_FINAL_SET_REG2627_ANS: + if (msg_check_ok (self)) + goto err; + fpi_ssm_next_state (ssm); + break; + + case TUNEVRB_FINAL_SET_GAINVRTVRB_REQ: + /* Set Gain/VRT/VRB values found */ + msg_set_regs (self, 6, REG_GAIN, self->gain, REG_VRT, + self->vrt, + REG_VRB, self->vrb); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case TUNEVRB_FINAL_SET_GAINVRTVRB_ANS: + if (msg_check_ok (self)) + goto err; + /* In traces, Gain/VRT/VRB are read again. */ + fpi_ssm_next_state (ssm); + break; + + case TUNEVRB_FINAL_SET_MODE_SLEEP_REQ: + msg_set_mode_control (self, REG_MODE_SLEEP); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case TUNEVRB_FINAL_SET_MODE_SLEEP_ANS: + if (msg_check_ok (self)) + goto err; + fpi_ssm_mark_completed (ssm); + break; + + default: + g_assert_not_reached (); + break; + } + + return; err: - fpi_ssm_mark_failed(ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); } -static void m_tunevrb_complete(FpiSsm *ssm, FpDevice *dev, void *user_data, - GError *error) +static void +m_tunevrb_complete (FpiSsm *ssm, FpDevice *dev, void *user_data, + GError *error) { - FpiDeviceEtes603 *self = FPI_DEVICE_ETES603(dev); - FpImageDevice *idev = FP_IMAGE_DEVICE (dev); + FpiDeviceEtes603 *self = FPI_DEVICE_ETES603 (dev); + FpImageDevice *idev = FP_IMAGE_DEVICE (dev); - fpi_image_device_activate_complete(idev, error); - if (!error) { - fp_dbg("Tuning is done. Starting finger detection."); - m_start_fingerdetect(idev); - } + fpi_image_device_activate_complete (idev, error); + if (!error) + { + fp_dbg ("Tuning is done. Starting finger detection."); + m_start_fingerdetect (idev); + } - if (!self->is_active) - m_exit_start(idev); + if (!self->is_active) + m_exit_start (idev); - fpi_ssm_free(ssm); + fpi_ssm_free (ssm); } /* * This function tunes the DCoffset value and adjusts the gain value if * required. */ -static void m_tunedc_state(FpiSsm *ssm, FpDevice *dev, void *user_data) +static void +m_tunedc_state (FpiSsm *ssm, FpDevice *dev, void *user_data) { - FpiDeviceEtes603 *self = FPI_DEVICE_ETES603(dev); + FpiDeviceEtes603 *self = FPI_DEVICE_ETES603 (dev); - if (self->is_active == FALSE) { - fpi_ssm_mark_completed(ssm); - return; - } + if (self->is_active == FALSE) + { + fpi_ssm_mark_completed (ssm); + return; + } - /* TODO To get better results, tuning could be done 3 times as in - * captured traffic to make sure that the value is correct. */ - /* The default gain should work but it may reach a DCOffset limit so in - * this case we decrease the gain. */ - switch (fpi_ssm_get_cur_state(ssm)) { - case TUNEDC_INIT: - /* reg_e0 = 0x23 is sensor normal/small gain */ - self->gain = GAIN_SMALL_INIT; - self->tunedc_min = DCOFFSET_MIN; - self->tunedc_max = DCOFFSET_MAX; - fp_dbg("Tuning DCoffset"); - fpi_ssm_next_state(ssm); - break; - case TUNEDC_SET_DCOFFSET_REQ: - /* Dichotomic search to find at which value the frame becomes - * almost black. */ - self->dcoffset = (self->tunedc_max + self->tunedc_min) / 2; - fp_dbg("Testing DCoffset=0x%02X Gain=0x%02X", self->dcoffset, - self->gain); - msg_set_regs(self, 2, REG_DCOFFSET, self->dcoffset); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case TUNEDC_SET_DCOFFSET_ANS: - if (msg_check_ok(self)) - goto err; - fpi_ssm_next_state(ssm); - break; - case TUNEDC_GET_FRAME_REQ: - /* vrt:0x15 vrb:0x10 are constant in all tuning frames. */ - msg_get_frame(self, 0x01, self->gain, 0x15, 0x10); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case TUNEDC_GET_FRAME_ANS: - if (process_frame_empty((guint8 *) self->ans, FRAME_WIDTH)) - self->tunedc_max = self->dcoffset; - else - self->tunedc_min = self->dcoffset; - if (self->tunedc_min + 1 < self->tunedc_max) { - fpi_ssm_jump_to_state(ssm, TUNEDC_SET_DCOFFSET_REQ); - } else if (self->tunedc_max < DCOFFSET_MAX) { - self->dcoffset = self->tunedc_max + 1; - fpi_ssm_next_state(ssm); - } else { - self->gain--; - fpi_ssm_jump_to_state(ssm, TUNEDC_SET_DCOFFSET_REQ); - } - break; - case TUNEDC_FINAL_SET_REG2122_REQ: - fp_dbg("-> DCoffset=0x%02X Gain=0x%02X", self->dcoffset, - self->gain); - /* ??? how reg21 / reg22 are calculated */ - msg_set_regs(self, 4, REG_21, 0x23, REG_22, 0x21); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case TUNEDC_FINAL_SET_REG2122_ANS: - if (msg_check_ok(self)) - goto err; - fpi_ssm_next_state(ssm); - break; - case TUNEDC_FINAL_SET_GAIN_REQ: - msg_set_regs(self, 2, REG_GAIN, self->gain); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case TUNEDC_FINAL_SET_GAIN_ANS: - fpi_ssm_next_state(ssm); - break; - case TUNEDC_FINAL_SET_DCOFFSET_REQ: - msg_set_regs(self, 2, REG_DCOFFSET, self->dcoffset); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case TUNEDC_FINAL_SET_DCOFFSET_ANS: - /* In captured traffic, read GAIN, VRT, and VRB registers. */ - if (msg_check_ok(self)) - goto err; - fpi_ssm_mark_completed(ssm); - break; - default: - g_assert_not_reached(); - break; - } + /* TODO To get better results, tuning could be done 3 times as in + * captured traffic to make sure that the value is correct. */ + /* The default gain should work but it may reach a DCOffset limit so in + * this case we decrease the gain. */ + switch (fpi_ssm_get_cur_state (ssm)) + { + case TUNEDC_INIT: + /* reg_e0 = 0x23 is sensor normal/small gain */ + self->gain = GAIN_SMALL_INIT; + self->tunedc_min = DCOFFSET_MIN; + self->tunedc_max = DCOFFSET_MAX; + fp_dbg ("Tuning DCoffset"); + fpi_ssm_next_state (ssm); + break; - return; + case TUNEDC_SET_DCOFFSET_REQ: + /* Dichotomic search to find at which value the frame becomes + * almost black. */ + self->dcoffset = (self->tunedc_max + self->tunedc_min) / 2; + fp_dbg ("Testing DCoffset=0x%02X Gain=0x%02X", self->dcoffset, + self->gain); + msg_set_regs (self, 2, REG_DCOFFSET, self->dcoffset); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case TUNEDC_SET_DCOFFSET_ANS: + if (msg_check_ok (self)) + goto err; + fpi_ssm_next_state (ssm); + break; + + case TUNEDC_GET_FRAME_REQ: + /* vrt:0x15 vrb:0x10 are constant in all tuning frames. */ + msg_get_frame (self, 0x01, self->gain, 0x15, 0x10); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case TUNEDC_GET_FRAME_ANS: + if (process_frame_empty ((guint8 *) self->ans, FRAME_WIDTH)) + self->tunedc_max = self->dcoffset; + else + self->tunedc_min = self->dcoffset; + if (self->tunedc_min + 1 < self->tunedc_max) + { + fpi_ssm_jump_to_state (ssm, TUNEDC_SET_DCOFFSET_REQ); + } + else if (self->tunedc_max < DCOFFSET_MAX) + { + self->dcoffset = self->tunedc_max + 1; + fpi_ssm_next_state (ssm); + } + else + { + self->gain--; + fpi_ssm_jump_to_state (ssm, TUNEDC_SET_DCOFFSET_REQ); + } + break; + + case TUNEDC_FINAL_SET_REG2122_REQ: + fp_dbg ("-> DCoffset=0x%02X Gain=0x%02X", self->dcoffset, + self->gain); + /* ??? how reg21 / reg22 are calculated */ + msg_set_regs (self, 4, REG_21, 0x23, REG_22, 0x21); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case TUNEDC_FINAL_SET_REG2122_ANS: + if (msg_check_ok (self)) + goto err; + fpi_ssm_next_state (ssm); + break; + + case TUNEDC_FINAL_SET_GAIN_REQ: + msg_set_regs (self, 2, REG_GAIN, self->gain); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case TUNEDC_FINAL_SET_GAIN_ANS: + fpi_ssm_next_state (ssm); + break; + + case TUNEDC_FINAL_SET_DCOFFSET_REQ: + msg_set_regs (self, 2, REG_DCOFFSET, self->dcoffset); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case TUNEDC_FINAL_SET_DCOFFSET_ANS: + /* In captured traffic, read GAIN, VRT, and VRB registers. */ + if (msg_check_ok (self)) + goto err; + fpi_ssm_mark_completed (ssm); + break; + + default: + g_assert_not_reached (); + break; + } + + return; err: - fpi_ssm_mark_failed(ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); } -static void m_tunedc_complete(FpiSsm *ssm, FpDevice *dev, void *user_data, - GError *error) +static void +m_tunedc_complete (FpiSsm *ssm, FpDevice *dev, void *user_data, + GError *error) { - FpiDeviceEtes603 *self = FPI_DEVICE_ETES603(dev); - FpImageDevice *idev = FP_IMAGE_DEVICE (dev); + FpiDeviceEtes603 *self = FPI_DEVICE_ETES603 (dev); + FpImageDevice *idev = FP_IMAGE_DEVICE (dev); - if (!error) { - FpiSsm *ssm_tune; - ssm_tune = fpi_ssm_new(FP_DEVICE(idev), m_tunevrb_state, - TUNEVRB_NUM_STATES, idev); - fpi_ssm_start(ssm_tune, m_tunevrb_complete); - } else { - fp_err("Error while tuning DCOFFSET"); - reset_param(FPI_DEVICE_ETES603 (dev)); - fpi_image_device_session_error(idev, error); - } + if (!error) + { + FpiSsm *ssm_tune; + ssm_tune = fpi_ssm_new (FP_DEVICE (idev), m_tunevrb_state, + TUNEVRB_NUM_STATES, idev); + fpi_ssm_start (ssm_tune, m_tunevrb_complete); + } + else + { + fp_err ("Error while tuning DCOFFSET"); + reset_param (FPI_DEVICE_ETES603 (dev)); + fpi_image_device_session_error (idev, error); + } - if (!self->is_active) - m_exit_start(idev); + if (!self->is_active) + m_exit_start (idev); - fpi_ssm_free(ssm); + fpi_ssm_free (ssm); } -static void m_init_state(FpiSsm *ssm, FpDevice *dev, void *user_data) +static void +m_init_state (FpiSsm *ssm, FpDevice *dev, void *user_data) { - FpiDeviceEtes603 *self = FPI_DEVICE_ETES603(dev); + FpiDeviceEtes603 *self = FPI_DEVICE_ETES603 (dev); - if (self->is_active == FALSE) { - fpi_ssm_mark_completed(ssm); - return; - } + if (self->is_active == FALSE) + { + fpi_ssm_mark_completed (ssm); + return; + } - switch (fpi_ssm_get_cur_state(ssm)) { - case INIT_CHECK_INFO_REQ: - msg_get_regs(self, 4, REG_INFO0, REG_INFO1, REG_INFO2, - REG_INFO3); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case INIT_CHECK_INFO_ANS: - if (msg_parse_regs(self)) - goto err; - if (check_info(self)) - goto err; - fpi_ssm_next_state(ssm); - break; - case INIT_CMD20_REQ: - msg_get_cmd20(self); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case INIT_CMD20_ANS: - if (msg_check_cmd20(self)) - goto err; - fpi_ssm_next_state(ssm); - break; - case INIT_CMD25_REQ: - msg_get_cmd25(self); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case INIT_CMD25_ANS: - if (msg_check_cmd25(self)) - goto err; - fpi_ssm_next_state(ssm); - break; - case INIT_SENSOR_REQ: - /* In captured traffic, those are split. */ - msg_set_regs(self, 18, REG_MODE_CONTROL, REG_MODE_SLEEP, - REG_50, 0x0F, REG_GAIN, 0x04, REG_VRT, 0x08, - REG_VRB, 0x0D, REG_VCO_CONTROL, REG_VCO_RT, - REG_DCOFFSET, 0x36, REG_F0, 0x00, REG_F2, 0x00); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case INIT_SENSOR_ANS: - if (msg_check_ok(self)) - goto err; - fpi_ssm_next_state(ssm); - break; - case INIT_ENC_REQ: - /* Initialize encryption registers without encryption. */ - /* Set registers from 0x41 to 0x48 (0x8 regs) */ - msg_set_regs(self, 16, REG_ENC1, 0x12, REG_ENC2, 0x34, - REG_ENC3, 0x56, REG_ENC4, 0x78, REG_ENC5, 0x90, - REG_ENC6, 0xAB, REG_ENC7, 0xCD, REG_ENC8, 0xEF); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case INIT_ENC_ANS: - if (msg_check_ok(self)) - goto err; - fpi_ssm_next_state(ssm); - break; - case INIT_REGS_REQ: - /* Set register from 0x20 to 0x37 (0x18 regs) */ - msg_set_regs(self, 48, - REG_20, 0x00, REG_21, 0x23, REG_22, 0x21, REG_23, - 0x20, - REG_24, 0x14, REG_25, 0x6A, REG_26, 0x00, REG_27, - 0x00, - REG_28, 0x00, REG_29, 0xC0, REG_2A, 0x50, REG_2B, - 0x50, - REG_2C, 0x4D, REG_2D, 0x03, REG_2E, 0x06, REG_2F, - 0x06, - REG_30, 0x10, REG_31, 0x02, REG_32, 0x14, REG_33, - 0x34, - REG_34, 0x01, REG_35, 0x08, REG_36, 0x03, REG_37, - 0x21); - async_tx(dev, EP_OUT, async_tx_cb, ssm); - break; - case INIT_REGS_ANS: - if (msg_check_ok(self)) - goto err; - fpi_ssm_mark_completed(ssm); - break; - default: - g_assert_not_reached(); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case INIT_CHECK_INFO_REQ: + msg_get_regs (self, 4, REG_INFO0, REG_INFO1, REG_INFO2, + REG_INFO3); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; - return; + case INIT_CHECK_INFO_ANS: + if (msg_parse_regs (self)) + goto err; + if (check_info (self)) + goto err; + fpi_ssm_next_state (ssm); + break; + + case INIT_CMD20_REQ: + msg_get_cmd20 (self); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case INIT_CMD20_ANS: + if (msg_check_cmd20 (self)) + goto err; + fpi_ssm_next_state (ssm); + break; + + case INIT_CMD25_REQ: + msg_get_cmd25 (self); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case INIT_CMD25_ANS: + if (msg_check_cmd25 (self)) + goto err; + fpi_ssm_next_state (ssm); + break; + + case INIT_SENSOR_REQ: + /* In captured traffic, those are split. */ + msg_set_regs (self, 18, REG_MODE_CONTROL, REG_MODE_SLEEP, + REG_50, 0x0F, REG_GAIN, 0x04, REG_VRT, 0x08, + REG_VRB, 0x0D, REG_VCO_CONTROL, REG_VCO_RT, + REG_DCOFFSET, 0x36, REG_F0, 0x00, REG_F2, 0x00); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case INIT_SENSOR_ANS: + if (msg_check_ok (self)) + goto err; + fpi_ssm_next_state (ssm); + break; + + case INIT_ENC_REQ: + /* Initialize encryption registers without encryption. */ + /* Set registers from 0x41 to 0x48 (0x8 regs) */ + msg_set_regs (self, 16, REG_ENC1, 0x12, REG_ENC2, 0x34, + REG_ENC3, 0x56, REG_ENC4, 0x78, REG_ENC5, 0x90, + REG_ENC6, 0xAB, REG_ENC7, 0xCD, REG_ENC8, 0xEF); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case INIT_ENC_ANS: + if (msg_check_ok (self)) + goto err; + fpi_ssm_next_state (ssm); + break; + + case INIT_REGS_REQ: + /* Set register from 0x20 to 0x37 (0x18 regs) */ + msg_set_regs (self, 48, + REG_20, 0x00, REG_21, 0x23, REG_22, 0x21, REG_23, + 0x20, + REG_24, 0x14, REG_25, 0x6A, REG_26, 0x00, REG_27, + 0x00, + REG_28, 0x00, REG_29, 0xC0, REG_2A, 0x50, REG_2B, + 0x50, + REG_2C, 0x4D, REG_2D, 0x03, REG_2E, 0x06, REG_2F, + 0x06, + REG_30, 0x10, REG_31, 0x02, REG_32, 0x14, REG_33, + 0x34, + REG_34, 0x01, REG_35, 0x08, REG_36, 0x03, REG_37, + 0x21); + async_tx (dev, EP_OUT, async_tx_cb, ssm); + break; + + case INIT_REGS_ANS: + if (msg_check_ok (self)) + goto err; + fpi_ssm_mark_completed (ssm); + break; + + default: + g_assert_not_reached (); + break; + } + + return; err: - fpi_ssm_mark_failed(ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); } -static void m_init_complete(FpiSsm *ssm, FpDevice *dev, void *user_data, - GError *error) +static void +m_init_complete (FpiSsm *ssm, FpDevice *dev, void *user_data, + GError *error) { - FpImageDevice *idev = FP_IMAGE_DEVICE (dev); - if (!error) { - FpiSsm *ssm_tune; - ssm_tune = fpi_ssm_new(FP_DEVICE(idev), m_tunedc_state, - TUNEDC_NUM_STATES, idev); - fpi_ssm_start(ssm_tune, m_tunedc_complete); - } else { - fp_err("Error initializing the device"); - reset_param(FPI_DEVICE_ETES603 (dev)); - fpi_image_device_session_error (idev, error); - } - fpi_ssm_free(ssm); + FpImageDevice *idev = FP_IMAGE_DEVICE (dev); + + if (!error) + { + FpiSsm *ssm_tune; + ssm_tune = fpi_ssm_new (FP_DEVICE (idev), m_tunedc_state, + TUNEDC_NUM_STATES, idev); + fpi_ssm_start (ssm_tune, m_tunedc_complete); + } + else + { + fp_err ("Error initializing the device"); + reset_param (FPI_DEVICE_ETES603 (dev)); + fpi_image_device_session_error (idev, error); + } + fpi_ssm_free (ssm); } -static void dev_activate(FpImageDevice *idev) +static void +dev_activate (FpImageDevice *idev) { - FpiDeviceEtes603 *self = FPI_DEVICE_ETES603(idev); - FpiSsm *ssm; + FpiDeviceEtes603 *self = FPI_DEVICE_ETES603 (idev); + FpiSsm *ssm; - g_assert(self); + g_assert (self); - /* Reset info and data */ - self->is_active = TRUE; + /* Reset info and data */ + self->is_active = TRUE; - if (self->dcoffset == 0) { - fp_dbg("Tuning device..."); - ssm = fpi_ssm_new(FP_DEVICE(idev), m_init_state, - INIT_NUM_STATES, idev); - fpi_ssm_start(ssm, m_init_complete); - } else { - fp_dbg("Using previous tuning (DCOFFSET=0x%02X,VRT=0x%02X," - "VRB=0x%02X,GAIN=0x%02X).", self->dcoffset, self->vrt, - self->vrb, self->gain); - fpi_image_device_activate_complete(idev, NULL); - ssm = fpi_ssm_new(FP_DEVICE(idev), m_finger_state, - FGR_NUM_STATES, idev); - fpi_ssm_start(ssm, m_finger_complete); - } + if (self->dcoffset == 0) + { + fp_dbg ("Tuning device..."); + ssm = fpi_ssm_new (FP_DEVICE (idev), m_init_state, + INIT_NUM_STATES, idev); + fpi_ssm_start (ssm, m_init_complete); + } + else + { + fp_dbg ("Using previous tuning (DCOFFSET=0x%02X,VRT=0x%02X," + "VRB=0x%02X,GAIN=0x%02X).", self->dcoffset, self->vrt, + self->vrb, self->gain); + fpi_image_device_activate_complete (idev, NULL); + ssm = fpi_ssm_new (FP_DEVICE (idev), m_finger_state, + FGR_NUM_STATES, idev); + fpi_ssm_start (ssm, m_finger_complete); + } } -static void dev_deactivate(FpImageDevice *idev) +static void +dev_deactivate (FpImageDevice *idev) { - FpiDeviceEtes603 *self = FPI_DEVICE_ETES603(idev); + FpiDeviceEtes603 *self = FPI_DEVICE_ETES603 (idev); - fp_dbg("deactivating"); + fp_dbg ("deactivating"); - /* this can be called even if still activated. */ - if (self->is_active == TRUE) { - self->is_active = FALSE; - } else { - m_exit_start(idev); - } + /* this can be called even if still activated. */ + if (self->is_active == TRUE) + self->is_active = FALSE; + else + m_exit_start (idev); } -static void dev_open(FpImageDevice *idev) +static void +dev_open (FpImageDevice *idev) { - GError *error = NULL; - FpiDeviceEtes603 *self = FPI_DEVICE_ETES603(idev); + GError *error = NULL; + FpiDeviceEtes603 *self = FPI_DEVICE_ETES603 (idev); - if (!g_usb_device_claim_interface (fpi_device_get_usb_device(FP_DEVICE(idev)), 0, 0, &error)) { - fpi_image_device_open_complete(idev, error); - return; - } + if (!g_usb_device_claim_interface (fpi_device_get_usb_device (FP_DEVICE (idev)), 0, 0, &error)) + { + fpi_image_device_open_complete (idev, error); + return; + } - self->req = g_malloc(sizeof(struct egis_msg)); - self->ans = g_malloc(FE_SIZE); - self->fp = g_malloc(FE_SIZE * 4); + self->req = g_malloc (sizeof (struct egis_msg)); + self->ans = g_malloc (FE_SIZE); + self->fp = g_malloc (FE_SIZE * 4); - fpi_image_device_open_complete(idev, NULL); + fpi_image_device_open_complete (idev, NULL); } -static void dev_close(FpImageDevice *idev) +static void +dev_close (FpImageDevice *idev) { - GError *error = NULL; - FpiDeviceEtes603 *self = FPI_DEVICE_ETES603(idev); + GError *error = NULL; + FpiDeviceEtes603 *self = FPI_DEVICE_ETES603 (idev); - g_free(self->req); - g_free(self->ans); - g_free(self->fp); + g_free (self->req); + g_free (self->ans); + g_free (self->fp); - g_usb_device_release_interface(fpi_device_get_usb_device(FP_DEVICE(idev)), - 0, 0, &error); - fpi_image_device_close_complete(idev, error); + g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (idev)), + 0, 0, &error); + fpi_image_device_close_complete (idev, error); } -static const FpIdEntry id_table [ ] = { - /* EgisTec (aka Lightuning) ES603 */ - { .vid = 0x1c7a, .pid = 0x0603, }, - { .vid = 0, .pid = 0, .driver_data = 0 }, +static const FpIdEntry id_table[] = { + /* EgisTec (aka Lightuning) ES603 */ + { .vid = 0x1c7a, .pid = 0x0603, }, + { .vid = 0, .pid = 0, .driver_data = 0 }, }; -static void fpi_device_etes603_init(FpiDeviceEtes603 *self) { +static void +fpi_device_etes603_init (FpiDeviceEtes603 *self) +{ } -static void fpi_device_etes603_class_init(FpiDeviceEtes603Class *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); - FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS(klass); +static void +fpi_device_etes603_class_init (FpiDeviceEtes603Class *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); + FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); - dev_class->id = "etes603"; - dev_class->full_name = "EgisTec ES603"; - dev_class->type = FP_DEVICE_TYPE_USB; - dev_class->id_table = id_table; - dev_class->scan_type = FP_SCAN_TYPE_SWIPE; + dev_class->id = "etes603"; + dev_class->full_name = "EgisTec ES603"; + dev_class->type = FP_DEVICE_TYPE_USB; + dev_class->id_table = id_table; + dev_class->scan_type = FP_SCAN_TYPE_SWIPE; - img_class->img_open = dev_open; - img_class->img_close = dev_close; - img_class->activate = dev_activate; - img_class->deactivate = dev_deactivate; + img_class->img_open = dev_open; + img_class->img_close = dev_close; + img_class->activate = dev_activate; + img_class->deactivate = dev_deactivate; - img_class->img_width = 256; - img_class->img_height = -1; + img_class->img_width = 256; + img_class->img_height = -1; } - diff --git a/libfprint/drivers/synaptics/bmkt.h b/libfprint/drivers/synaptics/bmkt.h index de7f875..67c48f2 100644 --- a/libfprint/drivers/synaptics/bmkt.h +++ b/libfprint/drivers/synaptics/bmkt.h @@ -21,107 +21,107 @@ #define _BMKT_H_ /**< User ID maximum length allowed */ -#define BMKT_MAX_USER_ID_LEN 100 +#define BMKT_MAX_USER_ID_LEN 100 /**< Software Part Number length */ -#define BMKT_PART_NUM_LEN 10 +#define BMKT_PART_NUM_LEN 10 /**< Software supplier identification length */ -#define BMKT_SUPPLIER_ID_LEN 2 +#define BMKT_SUPPLIER_ID_LEN 2 /**< Maximum namber of templates for storing in internal flash of the fingerprint sensor */ -#define BMKT_MAX_NUM_TEMPLATES_INTERNAL_FLASH 15 +#define BMKT_MAX_NUM_TEMPLATES_INTERNAL_FLASH 15 #include #include "bmkt_response.h" /*! -******************************************************************************* -** Type definition for result -*/ + ******************************************************************************* + ** Type definition for result + */ /** No error; Operation successfully completed. */ -#define BMKT_SUCCESS 0 +#define BMKT_SUCCESS 0 /** Fingerprint system not initialized */ -#define BMKT_FP_SYSTEM_NOT_INITIALIZED 101 +#define BMKT_FP_SYSTEM_NOT_INITIALIZED 101 /** Fingerprint system busy performing another operation */ -#define BMKT_FP_SYSTEM_BUSY 102 +#define BMKT_FP_SYSTEM_BUSY 102 /** Operation not allowed */ -#define BMKT_OPERATION_DENIED 103 +#define BMKT_OPERATION_DENIED 103 /** System ran out of memory while performing operation */ -#define BMKT_OUT_OF_MEMORY 104 +#define BMKT_OUT_OF_MEMORY 104 /** Corrupt message, CRC check fail or truncated message */ -#define BMKT_CORRUPT_MESSAGE 110 +#define BMKT_CORRUPT_MESSAGE 110 /** One of the command parameters is outside the range of valid values */ -#define BMKT_INVALID_PARAM 111 +#define BMKT_INVALID_PARAM 111 /** Unrecognized message or message with invalid message ID */ -#define BMKT_UNRECOGNIZED_MESSAGE 112 +#define BMKT_UNRECOGNIZED_MESSAGE 112 /** Operation time out */ -#define BMKT_OP_TIME_OUT 113 +#define BMKT_OP_TIME_OUT 113 /** General error – cause of error cannot be determined */ -#define BMKT_GENERAL_ERROR 114 +#define BMKT_GENERAL_ERROR 114 -#define BMKT_SET_SECURITY_LEVEL_FAIL 120 -#define BMKT_GET_SECURITY_LEVEL_FAIL 121 +#define BMKT_SET_SECURITY_LEVEL_FAIL 120 +#define BMKT_GET_SECURITY_LEVEL_FAIL 121 /** Fingerprint sensor reset while operation was being performed */ -#define BMKT_SENSOR_RESET 201 +#define BMKT_SENSOR_RESET 201 /** Fingerprint sensor malfunctioned */ -#define BMKT_SENSOR_MALFUNCTION 202 +#define BMKT_SENSOR_MALFUNCTION 202 /** Fingerprint sensor cannot be accessed despite repeated attempts */ -#define BMKT_SENSOR_TAMPERED 203 +#define BMKT_SENSOR_TAMPERED 203 /** -* BMKT_SENSOR_NOT_INIT: -* Fingerprint sensor module not initialized yet – not ready for use -* (different from error code 101 which indicates that the entire system -* has not been initialized) -*/ -#define BMKT_SENSOR_NOT_INIT 204 + * BMKT_SENSOR_NOT_INIT: + * Fingerprint sensor module not initialized yet – not ready for use + * (different from error code 101 which indicates that the entire system + * has not been initialized) + */ +#define BMKT_SENSOR_NOT_INIT 204 /** Number of re-pairing operations exceeded limit or re-pairing has been disabled */ -#define BMKT_OWNERSHIP_RESET_MAX_EXCEEDED 205 +#define BMKT_OWNERSHIP_RESET_MAX_EXCEEDED 205 /** -* BMKT_SENSOR_STIMULUS_ERROR: -* There is a finger or debris on the sensor that needs to be removed -* before issuing this command -*/ -#define BMKT_SENSOR_STIMULUS_ERROR 213 + * BMKT_SENSOR_STIMULUS_ERROR: + * There is a finger or debris on the sensor that needs to be removed + * before issuing this command + */ +#define BMKT_SENSOR_STIMULUS_ERROR 213 /** -* BMKT_CORRUPT_TEMPLATE_DATA: -* One of the fingerprint templates stored on flash is corrupt. -* This error code is returned in case of failure in finding a fingerprint match -* during identify or verify operations while also detecting that one or more -* fingerprint templates stored on the flash has become corrupted -*/ -#define BMKT_CORRUPT_TEMPLATE_DATA 300 + * BMKT_CORRUPT_TEMPLATE_DATA: + * One of the fingerprint templates stored on flash is corrupt. + * This error code is returned in case of failure in finding a fingerprint match + * during identify or verify operations while also detecting that one or more + * fingerprint templates stored on the flash has become corrupted + */ +#define BMKT_CORRUPT_TEMPLATE_DATA 300 /** Failed to extract features from fingerprint image acquired by sensor */ -#define BMKT_FEATURE_EXTRACT_FAIL 301 +#define BMKT_FEATURE_EXTRACT_FAIL 301 /** Failed to generate fingerprint template */ -#define BMKT_ENROLL_FAIL 302 +#define BMKT_ENROLL_FAIL 302 /** Specified finger already enrolled for this user */ -#define BMKT_ENROLLMENT_EXISTS 303 +#define BMKT_ENROLLMENT_EXISTS 303 /** Invalid fingerprint image */ -#define BMKT_INVALID_FP_IMAGE 304 +#define BMKT_INVALID_FP_IMAGE 304 /** No matching user fingerprint template found in database */ -#define BMKT_FP_NO_MATCH 404 +#define BMKT_FP_NO_MATCH 404 /** Fingerprint database is full */ -#define BMKT_FP_DATABASE_FULL 501 +#define BMKT_FP_DATABASE_FULL 501 /** Fingerprint database is empty */ -#define BMKT_FP_DATABASE_EMPTY 502 +#define BMKT_FP_DATABASE_EMPTY 502 /** Cannot access fingerprint database */ -#define BMKT_FP_DATABASE_ACCESS_FAIL 503 +#define BMKT_FP_DATABASE_ACCESS_FAIL 503 /** Fingerprint template record does not exist */ -#define BMKT_FP_DATABASE_NO_RECORD_EXISTS 504 +#define BMKT_FP_DATABASE_NO_RECORD_EXISTS 504 /** Failed to read/write system parameters stored on flash */ -#define BMKT_FP_PARAM_ACCESS_FAIL 505 +#define BMKT_FP_PARAM_ACCESS_FAIL 505 /** Fingerprint is a spoof */ -#define BMKT_FP_SPOOF_ALERT 801 +#define BMKT_FP_SPOOF_ALERT 801 /** Anti-spoof module failure */ -#define BMKT_ANTI_SPOOF_MODULE_FAIL 802 +#define BMKT_ANTI_SPOOF_MODULE_FAIL 802 -#define BMKT_CORRUPT_UPDATE_IMAGE 901 -#define BMKT_SYSTEM_UPDATE_FAIL 902 +#define BMKT_CORRUPT_UPDATE_IMAGE 901 +#define BMKT_SYSTEM_UPDATE_FAIL 902 -#define BMKT_EVENT_NOT_SET 1000 -#define BMKT_SENSOR_NOT_READY 1001 -#define BMKT_TIMEOUT 1002 -#define BMKT_SENSOR_RESPONSE_PENDING 1003 +#define BMKT_EVENT_NOT_SET 1000 +#define BMKT_SENSOR_NOT_READY 1001 +#define BMKT_TIMEOUT 1002 +#define BMKT_SENSOR_RESPONSE_PENDING 1003 #ifdef __cplusplus @@ -129,104 +129,100 @@ extern "C" { #endif /** -* bmkt_mode: -* Fingerprint system operational mode values level 1 -*/ -typedef enum bmkt_mode -{ - BMKT_STATE_UNINIT = 0xFF, - BMKT_STATE_IDLE = 0x00, - BMKT_STATE_ENROLL = 0x10, - BMKT_STATE_IDENTIFY = 0x20, - BMKT_STATE_VERIFY = 0x30, - BMKT_STATE_DB_OPS = 0x40, - BMKT_STATE_SYS_TEST = 0x50, - BMKT_STATE_SYS_OPS = 0x60, + * bmkt_mode: + * Fingerprint system operational mode values level 1 + */ +typedef enum bmkt_mode { + BMKT_STATE_UNINIT = 0xFF, + BMKT_STATE_IDLE = 0x00, + BMKT_STATE_ENROLL = 0x10, + BMKT_STATE_IDENTIFY = 0x20, + BMKT_STATE_VERIFY = 0x30, + BMKT_STATE_DB_OPS = 0x40, + BMKT_STATE_SYS_TEST = 0x50, + BMKT_STATE_SYS_OPS = 0x60, } bmkt_mode_t; /** -* bmkt_mode_level2: -* Fingerprint system operational mode values level 2 -*/ -typedef enum bmkt_mode_level2 -{ - BMKT_STATE_L2_IDLE = 0x00, - BMKT_STATE_L2_STARTING = 0x11, - BMKT_STATE_L2_WAITING_FOR_FINGER = 0x12, - BMKT_STATE_L2_CAPTURE_IMAGE = 0x13, - BMKT_STATE_L2_CAPTURE_COMPLETE = 0x14, - BMKT_STATE_L2_EXTRACT_FEATURE = 0x15, - BMKT_STATE_L2_CREATE_TEMPLATE = 0x16, - BMKT_STATE_L2_READING_FROM_FLASH = 0x17, - BMKT_STATE_L2_WRITING_TO_FLASH = 0x18, - BMKT_STATE_L2_FINISHING = 0x19, - BMKT_STATE_L2_CANCELING_OP = 0x20, - BMKT_STATE_L2_MATCHING = 0x21, - BMKT_STATE_L2_TRANSMITTING_RESPONSE = 0x22, - BMKT_STATE_L2_READY_POWER_DOWN = 0xF0, + * bmkt_mode_level2: + * Fingerprint system operational mode values level 2 + */ +typedef enum bmkt_mode_level2 { + BMKT_STATE_L2_IDLE = 0x00, + BMKT_STATE_L2_STARTING = 0x11, + BMKT_STATE_L2_WAITING_FOR_FINGER = 0x12, + BMKT_STATE_L2_CAPTURE_IMAGE = 0x13, + BMKT_STATE_L2_CAPTURE_COMPLETE = 0x14, + BMKT_STATE_L2_EXTRACT_FEATURE = 0x15, + BMKT_STATE_L2_CREATE_TEMPLATE = 0x16, + BMKT_STATE_L2_READING_FROM_FLASH = 0x17, + BMKT_STATE_L2_WRITING_TO_FLASH = 0x18, + BMKT_STATE_L2_FINISHING = 0x19, + BMKT_STATE_L2_CANCELING_OP = 0x20, + BMKT_STATE_L2_MATCHING = 0x21, + BMKT_STATE_L2_TRANSMITTING_RESPONSE = 0x22, + BMKT_STATE_L2_READY_POWER_DOWN = 0xF0, } bmkt_mode_level2_t; /** -* bmkt_transport_type: -* Fingerprint system transport types -*/ -typedef enum bmkt_transport_type -{ - BMKT_TRANSPORT_TYPE_USB = 0, + * bmkt_transport_type: + * Fingerprint system transport types + */ +typedef enum bmkt_transport_type { + BMKT_TRANSPORT_TYPE_USB = 0, } bmkt_transport_type_t; /** -* bmkt_usb_config: -* Structure represcontainingenting USB configuration details -*/ + * bmkt_usb_config: + * Structure represcontainingenting USB configuration details + */ typedef struct bmkt_usb_config { - int product_id; /**< USB device product ID */ + int product_id; /**< USB device product ID */ } bmkt_usb_config_t; /** -* bmkt_transport_config_t: -* Union containing transport configuration details -*/ + * bmkt_transport_config_t: + * Union containing transport configuration details + */ typedef union { - bmkt_usb_config_t usb_config; + bmkt_usb_config_t usb_config; } bmkt_transport_config_t; /** -* bmkt_sensor_desc_t: -* Structure containing fingerprint system description -*/ + * bmkt_sensor_desc_t: + * Structure containing fingerprint system description + */ typedef struct bmkt_sensor_desc { - int product_id; - int flags; + int product_id; + int flags; } bmkt_sensor_desc_t; /** -* bmkt_finger_state_t: -* Finger state representation values. -*/ -typedef enum -{ - BMKT_FINGER_STATE_UNKNOWN = 0, - BMKT_FINGER_STATE_ON_SENSOR, - BMKT_FINGER_STATE_NOT_ON_SENSOR, + * bmkt_finger_state_t: + * Finger state representation values. + */ +typedef enum { + BMKT_FINGER_STATE_UNKNOWN = 0, + BMKT_FINGER_STATE_ON_SENSOR, + BMKT_FINGER_STATE_NOT_ON_SENSOR, } bmkt_finger_state_t; /** -* bmkt_finger_event_t: -* Structure containing finger state -*/ + * bmkt_finger_event_t: + * Structure containing finger state + */ typedef struct bmkt_finger_event { - bmkt_finger_state_t finger_state; + bmkt_finger_state_t finger_state; } bmkt_finger_event_t; typedef struct bmkt_user_id { - uint8_t user_id_len; - uint8_t user_id[BMKT_MAX_USER_ID_LEN]; + uint8_t user_id_len; + uint8_t user_id[BMKT_MAX_USER_ID_LEN]; } bmkt_user_id_t; #ifdef __cplusplus diff --git a/libfprint/drivers/synaptics/bmkt_message.c b/libfprint/drivers/synaptics/bmkt_message.c index 78dec26..59bd62c 100644 --- a/libfprint/drivers/synaptics/bmkt_message.c +++ b/libfprint/drivers/synaptics/bmkt_message.c @@ -20,395 +20,381 @@ #include "bmkt_response.h" #include "bmkt_message.h" -static uint8_t extract8(const uint8_t *buf, int *offset) +static uint8_t +extract8 (const uint8_t *buf, int *offset) { - uint8_t ret = 0; - int off = 0; - if (offset) - off = *offset; + uint8_t ret = 0; + int off = 0; - ret = *(buf + off); + if (offset) + off = *offset; - if (offset) - *offset += 1; + ret = *(buf + off); - return ret; + if (offset) + *offset += 1; + + return ret; } -static int parse_error_response(bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) +static int +parse_error_response (bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) { - if (msg_resp->payload_len != 2) - { - return BMKT_UNRECOGNIZED_MESSAGE; - } + if (msg_resp->payload_len != 2) + return BMKT_UNRECOGNIZED_MESSAGE; - resp->result = (msg_resp->payload[0] << 8) | msg_resp->payload[1]; + resp->result = (msg_resp->payload[0] << 8) | msg_resp->payload[1]; - return BMKT_SUCCESS; + return BMKT_SUCCESS; } -static int parse_init_ok(bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) +static int +parse_init_ok (bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) { - bmkt_init_resp_t *init_resp = &resp->response.init_resp; + bmkt_init_resp_t *init_resp = &resp->response.init_resp; - if (msg_resp->payload_len != 1) - { - return BMKT_UNRECOGNIZED_MESSAGE; - } + if (msg_resp->payload_len != 1) + return BMKT_UNRECOGNIZED_MESSAGE; - init_resp->finger_presence = extract8(msg_resp->payload, NULL); + init_resp->finger_presence = extract8 (msg_resp->payload, NULL); - return BMKT_SUCCESS; + return BMKT_SUCCESS; } -static int parse_fps_mode_report(bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) +static int +parse_fps_mode_report (bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) { - int offset = 0; - bmkt_fps_mode_resp_t *fps_mode_resp = &resp->response.fps_mode_resp; + int offset = 0; + bmkt_fps_mode_resp_t *fps_mode_resp = &resp->response.fps_mode_resp; - if (msg_resp->payload_len != sizeof(bmkt_fps_mode_resp_t)) - { - return BMKT_UNRECOGNIZED_MESSAGE; - } + if (msg_resp->payload_len != sizeof (bmkt_fps_mode_resp_t)) + return BMKT_UNRECOGNIZED_MESSAGE; - fps_mode_resp->mode = extract8(msg_resp->payload, &offset); - fps_mode_resp->level2_mode = extract8(msg_resp->payload, &offset); - fps_mode_resp->cmd_id = extract8(msg_resp->payload, &offset); - fps_mode_resp->finger_presence = extract8(msg_resp->payload, &offset); + fps_mode_resp->mode = extract8 (msg_resp->payload, &offset); + fps_mode_resp->level2_mode = extract8 (msg_resp->payload, &offset); + fps_mode_resp->cmd_id = extract8 (msg_resp->payload, &offset); + fps_mode_resp->finger_presence = extract8 (msg_resp->payload, &offset); - return BMKT_SUCCESS; + return BMKT_SUCCESS; } -static int parse_enroll_report(bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) +static int +parse_enroll_report (bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) { - bmkt_enroll_resp_t *enroll_resp = &resp->response.enroll_resp; + bmkt_enroll_resp_t *enroll_resp = &resp->response.enroll_resp; - if (msg_resp->payload_len != 1) - { - return BMKT_UNRECOGNIZED_MESSAGE; - } + if (msg_resp->payload_len != 1) + return BMKT_UNRECOGNIZED_MESSAGE; - enroll_resp->progress = extract8(msg_resp->payload, NULL); + enroll_resp->progress = extract8 (msg_resp->payload, NULL); - return BMKT_SUCCESS; + return BMKT_SUCCESS; } -static int parse_enroll_ok(bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) +static int +parse_enroll_ok (bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) { - bmkt_enroll_resp_t *enroll_resp = &resp->response.enroll_resp; + bmkt_enroll_resp_t *enroll_resp = &resp->response.enroll_resp; - if (msg_resp->payload_len < 1 || msg_resp->payload_len > (BMKT_MAX_USER_ID_LEN + 1)) - { - return BMKT_UNRECOGNIZED_MESSAGE; - } + if (msg_resp->payload_len < 1 || msg_resp->payload_len > (BMKT_MAX_USER_ID_LEN + 1)) + return BMKT_UNRECOGNIZED_MESSAGE; - enroll_resp->finger_id = msg_resp->payload[0]; - memcpy(enroll_resp->user_id, &msg_resp->payload[1], msg_resp->payload_len - 1); + enroll_resp->finger_id = msg_resp->payload[0]; + memcpy (enroll_resp->user_id, &msg_resp->payload[1], msg_resp->payload_len - 1); - return BMKT_SUCCESS; + return BMKT_SUCCESS; } -static int parse_auth_ok(bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) +static int +parse_auth_ok (bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) { - bmkt_identify_resp_t *id_resp = &resp->response.id_resp; + bmkt_identify_resp_t *id_resp = &resp->response.id_resp; - if (msg_resp->payload_len < 3 || msg_resp->payload_len > (BMKT_MAX_USER_ID_LEN + 3)) - { - return BMKT_UNRECOGNIZED_MESSAGE; - } + if (msg_resp->payload_len < 3 || msg_resp->payload_len > (BMKT_MAX_USER_ID_LEN + 3)) + return BMKT_UNRECOGNIZED_MESSAGE; - id_resp->match_result = (double)msg_resp->payload[0] + 0.01 * (double)msg_resp->payload[1]; - id_resp->finger_id = msg_resp->payload[2]; - memcpy(id_resp->user_id, &msg_resp->payload[3], msg_resp->payload_len - 3); + id_resp->match_result = (double) msg_resp->payload[0] + 0.01 * (double) msg_resp->payload[1]; + id_resp->finger_id = msg_resp->payload[2]; + memcpy (id_resp->user_id, &msg_resp->payload[3], msg_resp->payload_len - 3); - return BMKT_SUCCESS; + return BMKT_SUCCESS; } -static int parse_security_level_report(bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) +static int +parse_security_level_report (bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) { - bmkt_set_sec_level_resp_t *sec_level_resp = &resp->response.sec_level_resp; + bmkt_set_sec_level_resp_t *sec_level_resp = &resp->response.sec_level_resp; - if (msg_resp->payload_len != 1) - { - return BMKT_UNRECOGNIZED_MESSAGE; - } + if (msg_resp->payload_len != 1) + return BMKT_UNRECOGNIZED_MESSAGE; - sec_level_resp->sec_level = extract8(msg_resp->payload, NULL); + sec_level_resp->sec_level = extract8 (msg_resp->payload, NULL); - return BMKT_SUCCESS; + return BMKT_SUCCESS; } -static int parse_del_all_users_progress_report(bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) +static int +parse_del_all_users_progress_report (bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) { - bmkt_del_all_users_resp_t *del_all_users_resp = &resp->response.del_all_users_resp; + bmkt_del_all_users_resp_t *del_all_users_resp = &resp->response.del_all_users_resp; - if (msg_resp->payload_len != 1) - { - return BMKT_UNRECOGNIZED_MESSAGE; - } + if (msg_resp->payload_len != 1) + return BMKT_UNRECOGNIZED_MESSAGE; - del_all_users_resp->progress = extract8(msg_resp->payload, NULL); + del_all_users_resp->progress = extract8 (msg_resp->payload, NULL); - return BMKT_SUCCESS; + return BMKT_SUCCESS; } -static int parse_db_cap_report(bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) +static int +parse_db_cap_report (bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) { - bmkt_get_db_capacity_resp_t *db_cap_resp = &resp->response.db_cap_resp; - int offset = 0; + bmkt_get_db_capacity_resp_t *db_cap_resp = &resp->response.db_cap_resp; + int offset = 0; - if (msg_resp->payload_len < 2 || msg_resp->payload_len > 4) - { - return BMKT_UNRECOGNIZED_MESSAGE; - } + if (msg_resp->payload_len < 2 || msg_resp->payload_len > 4) + return BMKT_UNRECOGNIZED_MESSAGE; - db_cap_resp->total = extract8(msg_resp->payload, &offset); - db_cap_resp->empty = extract8(msg_resp->payload, &offset); + db_cap_resp->total = extract8 (msg_resp->payload, &offset); + db_cap_resp->empty = extract8 (msg_resp->payload, &offset); - if (msg_resp->payload_len == 4) - { - db_cap_resp->bad_slots = extract8(msg_resp->payload, &offset); - db_cap_resp->corrupt_templates = extract8(msg_resp->payload, &offset); - } + if (msg_resp->payload_len == 4) + { + db_cap_resp->bad_slots = extract8 (msg_resp->payload, &offset); + db_cap_resp->corrupt_templates = extract8 (msg_resp->payload, &offset); + } - return BMKT_SUCCESS; + return BMKT_SUCCESS; } -static int parse_get_enrolled_fingers_report(bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) +static int +parse_get_enrolled_fingers_report (bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) { - int offset = 0; - int i = 0; + int offset = 0; + int i = 0; - if (msg_resp->payload_len < 2) - { - return BMKT_UNRECOGNIZED_MESSAGE; - } - /* 2 bytes per finger so calculate the total number of fingers to process*/ - int num_fingers = (msg_resp->payload_len) / 2; + if (msg_resp->payload_len < 2) + return BMKT_UNRECOGNIZED_MESSAGE; + /* 2 bytes per finger so calculate the total number of fingers to process*/ + int num_fingers = (msg_resp->payload_len) / 2; - bmkt_enrolled_fingers_resp_t *get_enrolled_fingers_resp = &resp->response.enrolled_fingers_resp; + bmkt_enrolled_fingers_resp_t *get_enrolled_fingers_resp = &resp->response.enrolled_fingers_resp; - for (i = 0; i < num_fingers; i++) - { - get_enrolled_fingers_resp->fingers[i].finger_id = extract8(msg_resp->payload, &offset); - get_enrolled_fingers_resp->fingers[i].template_status = extract8(msg_resp->payload, &offset); + for (i = 0; i < num_fingers; i++) + { + get_enrolled_fingers_resp->fingers[i].finger_id = extract8 (msg_resp->payload, &offset); + get_enrolled_fingers_resp->fingers[i].template_status = extract8 (msg_resp->payload, &offset); - } - return BMKT_SUCCESS; + } + return BMKT_SUCCESS; } -static int parse_get_enrolled_users_report(bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) +static int +parse_get_enrolled_users_report (bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) { - int offset = 0; - int i = 0; + int offset = 0; + int i = 0; - /* the payload is 2 bytes + template data */ - if (msg_resp->payload_len < 2) - { - return BMKT_UNRECOGNIZED_MESSAGE; - } + /* the payload is 2 bytes + template data */ + if (msg_resp->payload_len < 2) + return BMKT_UNRECOGNIZED_MESSAGE; - bmkt_enroll_templates_resp_t *get_enroll_templates_resp = &resp->response.enroll_templates_resp; + bmkt_enroll_templates_resp_t *get_enroll_templates_resp = &resp->response.enroll_templates_resp; - get_enroll_templates_resp->total_query_messages = extract8(msg_resp->payload, &offset); - get_enroll_templates_resp->query_sequence = extract8(msg_resp->payload, &offset); + get_enroll_templates_resp->total_query_messages = extract8 (msg_resp->payload, &offset); + get_enroll_templates_resp->query_sequence = extract8 (msg_resp->payload, &offset); - int n = 0; - for (n = 0; n < BMKT_MAX_NUM_TEMPLATES_INTERNAL_FLASH; n++) - { - if (offset >= msg_resp->payload_len) - break; - get_enroll_templates_resp->templates[n].user_id_len = extract8(msg_resp->payload, &offset) - 2; - if(get_enroll_templates_resp->templates[n].user_id_len > BMKT_MAX_USER_ID_LEN) - { - return BMKT_UNRECOGNIZED_MESSAGE; - } - get_enroll_templates_resp->templates[n].template_status = extract8(msg_resp->payload, &offset); - get_enroll_templates_resp->templates[n].finger_id = extract8(msg_resp->payload, &offset); - for (i = 0; i < get_enroll_templates_resp->templates[n].user_id_len; i++) - { - get_enroll_templates_resp->templates[n].user_id[i] = extract8(msg_resp->payload, &offset); - } - get_enroll_templates_resp->templates[n].user_id[i] = '\0'; - } + int n = 0; + for (n = 0; n < BMKT_MAX_NUM_TEMPLATES_INTERNAL_FLASH; n++) + { + if (offset >= msg_resp->payload_len) + break; + get_enroll_templates_resp->templates[n].user_id_len = extract8 (msg_resp->payload, &offset) - 2; + if(get_enroll_templates_resp->templates[n].user_id_len > BMKT_MAX_USER_ID_LEN) + return BMKT_UNRECOGNIZED_MESSAGE; + get_enroll_templates_resp->templates[n].template_status = extract8 (msg_resp->payload, &offset); + get_enroll_templates_resp->templates[n].finger_id = extract8 (msg_resp->payload, &offset); + for (i = 0; i < get_enroll_templates_resp->templates[n].user_id_len; i++) + get_enroll_templates_resp->templates[n].user_id[i] = extract8 (msg_resp->payload, &offset); + get_enroll_templates_resp->templates[n].user_id[i] = '\0'; + } - return BMKT_SUCCESS; + return BMKT_SUCCESS; } -static int parse_get_version_report(bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) +static int +parse_get_version_report (bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) { - bmkt_get_version_resp_t *get_version_resp = &resp->response.get_version_resp; - int offset = 0; + bmkt_get_version_resp_t *get_version_resp = &resp->response.get_version_resp; + int offset = 0; - if (msg_resp->payload_len != 15) - { - return BMKT_UNRECOGNIZED_MESSAGE; - } + if (msg_resp->payload_len != 15) + return BMKT_UNRECOGNIZED_MESSAGE; - memcpy(get_version_resp->part, msg_resp->payload, BMKT_PART_NUM_LEN); - offset += BMKT_PART_NUM_LEN; - get_version_resp->year = extract8(msg_resp->payload, &offset); - get_version_resp->week = extract8(msg_resp->payload, &offset); - get_version_resp->patch = extract8(msg_resp->payload, &offset); - memcpy(get_version_resp->supplier_id, msg_resp->payload + offset, BMKT_SUPPLIER_ID_LEN); + memcpy (get_version_resp->part, msg_resp->payload, BMKT_PART_NUM_LEN); + offset += BMKT_PART_NUM_LEN; + get_version_resp->year = extract8 (msg_resp->payload, &offset); + get_version_resp->week = extract8 (msg_resp->payload, &offset); + get_version_resp->patch = extract8 (msg_resp->payload, &offset); + memcpy (get_version_resp->supplier_id, msg_resp->payload + offset, BMKT_SUPPLIER_ID_LEN); - return BMKT_SUCCESS; + return BMKT_SUCCESS; } -int bmkt_compose_message(uint8_t *cmd, int *cmd_len, uint8_t msg_id, uint8_t seq_num, - uint8_t payload_size, const uint8_t *payload) +int +bmkt_compose_message (uint8_t *cmd, int *cmd_len, uint8_t msg_id, uint8_t seq_num, + uint8_t payload_size, const uint8_t *payload) { - int message_len = BMKT_MESSAGE_HEADER_LEN + payload_size; + int message_len = BMKT_MESSAGE_HEADER_LEN + payload_size; - if (*cmd_len < message_len) - { - return BMKT_OUT_OF_MEMORY; - } + if (*cmd_len < message_len) + return BMKT_OUT_OF_MEMORY; - cmd[BMKT_MESSAGE_HEADER_ID_FIELD] = BMKT_MESSAGE_HEADER_ID; - cmd[BMKT_MESSAGE_SEQ_NUM_FIELD] = seq_num; - cmd[BMKT_MESSAGE_ID_FIELD] = msg_id; - cmd[BMKT_MESSAGE_PAYLOAD_LEN_FIELD] = payload_size; - memcpy(&cmd[BMKT_MESSAGE_PAYLOAD_FIELD], payload, payload_size); + cmd[BMKT_MESSAGE_HEADER_ID_FIELD] = BMKT_MESSAGE_HEADER_ID; + cmd[BMKT_MESSAGE_SEQ_NUM_FIELD] = seq_num; + cmd[BMKT_MESSAGE_ID_FIELD] = msg_id; + cmd[BMKT_MESSAGE_PAYLOAD_LEN_FIELD] = payload_size; + memcpy (&cmd[BMKT_MESSAGE_PAYLOAD_FIELD], payload, payload_size); - *cmd_len = message_len; + *cmd_len = message_len; - return BMKT_SUCCESS; + return BMKT_SUCCESS; } -int bmkt_parse_message_header(uint8_t *resp_buf, int resp_len, bmkt_msg_resp_t *msg_resp) +int +bmkt_parse_message_header (uint8_t *resp_buf, int resp_len, bmkt_msg_resp_t *msg_resp) { - if (resp_buf[BMKT_MESSAGE_HEADER_ID_FIELD] != BMKT_MESSAGE_HEADER_ID) - { - return BMKT_CORRUPT_MESSAGE; - } + if (resp_buf[BMKT_MESSAGE_HEADER_ID_FIELD] != BMKT_MESSAGE_HEADER_ID) + return BMKT_CORRUPT_MESSAGE; - msg_resp->seq_num = resp_buf[BMKT_MESSAGE_SEQ_NUM_FIELD]; - msg_resp->msg_id = resp_buf[BMKT_MESSAGE_ID_FIELD]; - msg_resp->payload_len = resp_buf[BMKT_MESSAGE_PAYLOAD_LEN_FIELD]; - if (msg_resp->payload_len > 0) - { - msg_resp->payload = &resp_buf[BMKT_MESSAGE_PAYLOAD_FIELD]; - } - else - { - msg_resp->payload = NULL; - } + msg_resp->seq_num = resp_buf[BMKT_MESSAGE_SEQ_NUM_FIELD]; + msg_resp->msg_id = resp_buf[BMKT_MESSAGE_ID_FIELD]; + msg_resp->payload_len = resp_buf[BMKT_MESSAGE_PAYLOAD_LEN_FIELD]; + if (msg_resp->payload_len > 0) + msg_resp->payload = &resp_buf[BMKT_MESSAGE_PAYLOAD_FIELD]; + else + msg_resp->payload = NULL; - return BMKT_SUCCESS; + return BMKT_SUCCESS; } -int bmkt_parse_message_payload(bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) +int +bmkt_parse_message_payload (bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp) { - int ret = BMKT_SUCCESS; + int ret = BMKT_SUCCESS; - memset(resp, 0, sizeof(bmkt_response_t)); + memset (resp, 0, sizeof (bmkt_response_t)); - resp->response_id = msg_resp->msg_id; + resp->response_id = msg_resp->msg_id; - switch(msg_resp->msg_id) - { - case BMKT_RSP_CONTINUOUS_IMAGE_CAPTURE_FAIL: - case BMKT_RSP_SENSOR_MODULE_TEST_FAIL: - case BMKT_RSP_FPS_INIT_FAIL: - case BMKT_RSP_FPS_MODE_FAIL: - case BMKT_RSP_SET_SECURITY_LEVEL_FAIL: - case BMKT_RSP_GET_SECURITY_LEVEL_FAIL: - case BMKT_RSP_CANCEL_OP_FAIL: - case BMKT_RSP_ENROLL_FAIL: - case BMKT_RSP_ID_FAIL: - case BMKT_RSP_VERIFY_FAIL: - case BMKT_RSP_QUERY_FAIL: - case BMKT_RSP_DEL_USER_FP_FAIL: - case BMKT_RSP_DEL_FULL_DB_FAIL: - case BMKT_RSP_REPEAT_LAST_BMKT_RSP_FAIL: - case BMKT_RSP_POWER_DOWN_FAIL: - case BMKT_RSP_GET_VERSION_FAIL: - case BMKT_RSP_DISABLE_PAIRING_FAIL: - case BMKT_RSP_QUERY_PAIRING_FAIL: - case BMKT_RSP_SENSOR_STATUS_FAIL: - case BMKT_RSP_RETRIEVE_FINAL_RESULT_FAIL: - ret = parse_error_response(msg_resp, resp); - resp->complete = 1; - break; + switch(msg_resp->msg_id) + { + case BMKT_RSP_CONTINUOUS_IMAGE_CAPTURE_FAIL: + case BMKT_RSP_SENSOR_MODULE_TEST_FAIL: + case BMKT_RSP_FPS_INIT_FAIL: + case BMKT_RSP_FPS_MODE_FAIL: + case BMKT_RSP_SET_SECURITY_LEVEL_FAIL: + case BMKT_RSP_GET_SECURITY_LEVEL_FAIL: + case BMKT_RSP_CANCEL_OP_FAIL: + case BMKT_RSP_ENROLL_FAIL: + case BMKT_RSP_ID_FAIL: + case BMKT_RSP_VERIFY_FAIL: + case BMKT_RSP_QUERY_FAIL: + case BMKT_RSP_DEL_USER_FP_FAIL: + case BMKT_RSP_DEL_FULL_DB_FAIL: + case BMKT_RSP_REPEAT_LAST_BMKT_RSP_FAIL: + case BMKT_RSP_POWER_DOWN_FAIL: + case BMKT_RSP_GET_VERSION_FAIL: + case BMKT_RSP_DISABLE_PAIRING_FAIL: + case BMKT_RSP_QUERY_PAIRING_FAIL: + case BMKT_RSP_SENSOR_STATUS_FAIL: + case BMKT_RSP_RETRIEVE_FINAL_RESULT_FAIL: + ret = parse_error_response (msg_resp, resp); + resp->complete = 1; + break; - case BMKT_RSP_FPS_INIT_OK: - ret = parse_init_ok(msg_resp, resp); - resp->complete = 1; - break; + case BMKT_RSP_FPS_INIT_OK: + ret = parse_init_ok (msg_resp, resp); + resp->complete = 1; + break; - case BMKT_RSP_CANCEL_OP_OK: - case BMKT_RSP_DEL_FULL_DB_OK: - case BMKT_RSP_DEL_USER_FP_OK: - /* responses with a payload of 0 - so the response indicates success */ - resp->result = BMKT_SUCCESS; - resp->complete = 1; - break; + case BMKT_RSP_CANCEL_OP_OK: + case BMKT_RSP_DEL_FULL_DB_OK: + case BMKT_RSP_DEL_USER_FP_OK: + /* responses with a payload of 0 + so the response indicates success */ + resp->result = BMKT_SUCCESS; + resp->complete = 1; + break; - case BMKT_RSP_FPS_MODE_REPORT: - // parse_fps_mode - ret = parse_fps_mode_report(msg_resp, resp); - resp->complete = 1; - break; + case BMKT_RSP_FPS_MODE_REPORT: + // parse_fps_mode + ret = parse_fps_mode_report (msg_resp, resp); + resp->complete = 1; + break; - case BMKT_RSP_GET_SECURITY_LEVEL_REPORT: - case BMKT_RSP_SET_SECURITY_LEVEL_REPORT: - /* parse security level result */ - ret = parse_security_level_report(msg_resp, resp); - resp->complete = 1; - break; + case BMKT_RSP_GET_SECURITY_LEVEL_REPORT: + case BMKT_RSP_SET_SECURITY_LEVEL_REPORT: + /* parse security level result */ + ret = parse_security_level_report (msg_resp, resp); + resp->complete = 1; + break; - case BMKT_RSP_DELETE_PROGRESS: - ret = parse_del_all_users_progress_report(msg_resp, resp); - break; + case BMKT_RSP_DELETE_PROGRESS: + ret = parse_del_all_users_progress_report (msg_resp, resp); + break; - case BMKT_RSP_CAPTURE_COMPLETE: - resp->result = BMKT_SUCCESS; - break; + case BMKT_RSP_CAPTURE_COMPLETE: + resp->result = BMKT_SUCCESS; + break; - case BMKT_RSP_ENROLL_READY: - resp->result = BMKT_SUCCESS; - break; + case BMKT_RSP_ENROLL_READY: + resp->result = BMKT_SUCCESS; + break; - case BMKT_RSP_ENROLL_REPORT: - ret = parse_enroll_report(msg_resp, resp); - break; + case BMKT_RSP_ENROLL_REPORT: + ret = parse_enroll_report (msg_resp, resp); + break; - case BMKT_RSP_ENROLL_OK: - resp->complete = 1; - ret = parse_enroll_ok(msg_resp, resp); - break; + case BMKT_RSP_ENROLL_OK: + resp->complete = 1; + ret = parse_enroll_ok (msg_resp, resp); + break; - case BMKT_RSP_ID_OK: - case BMKT_RSP_VERIFY_OK: - ret = parse_auth_ok(msg_resp, resp); - resp->complete = 1; - break; - case BMKT_RSP_GET_ENROLLED_FINGERS_REPORT: - ret = parse_get_enrolled_fingers_report(msg_resp, resp); - resp->complete = 1; - break; - case BMKT_RSP_DATABASE_CAPACITY_REPORT: - resp->complete = 1; - ret = parse_db_cap_report(msg_resp, resp); - break; - case BMKT_RSP_TEMPLATE_RECORDS_REPORT: - ret = parse_get_enrolled_users_report(msg_resp, resp); - break; - case BMKT_RSP_QUERY_RESPONSE_COMPLETE: - resp->complete = 1; - break; + case BMKT_RSP_ID_OK: + case BMKT_RSP_VERIFY_OK: + ret = parse_auth_ok (msg_resp, resp); + resp->complete = 1; + break; - case BMKT_RSP_VERSION_INFO: - ret = parse_get_version_report(msg_resp, resp); - resp->complete = 1; - break; - case BMKT_RSP_POWER_DOWN_READY: - resp->complete = 1; - break; - } + case BMKT_RSP_GET_ENROLLED_FINGERS_REPORT: + ret = parse_get_enrolled_fingers_report (msg_resp, resp); + resp->complete = 1; + break; - return ret; + case BMKT_RSP_DATABASE_CAPACITY_REPORT: + resp->complete = 1; + ret = parse_db_cap_report (msg_resp, resp); + break; + + case BMKT_RSP_TEMPLATE_RECORDS_REPORT: + ret = parse_get_enrolled_users_report (msg_resp, resp); + break; + + case BMKT_RSP_QUERY_RESPONSE_COMPLETE: + resp->complete = 1; + break; + + case BMKT_RSP_VERSION_INFO: + ret = parse_get_version_report (msg_resp, resp); + resp->complete = 1; + break; + + case BMKT_RSP_POWER_DOWN_READY: + resp->complete = 1; + break; + } + + return ret; } diff --git a/libfprint/drivers/synaptics/bmkt_message.h b/libfprint/drivers/synaptics/bmkt_message.h index 9366771..d41e3d2 100644 --- a/libfprint/drivers/synaptics/bmkt_message.h +++ b/libfprint/drivers/synaptics/bmkt_message.h @@ -21,66 +21,73 @@ #define BMKT_MESSAGE_H_ -#define BMKT_MESSAGE_HEADER_ID 0xFE -#define BMKT_MESSAGE_HEADER_LEN (4) -#define BMKT_MESSAGE_CRC32_LEN (4) -#define BMKT_MESSAGE_HEADER_ID_FIELD 0 -#define BMKT_MESSAGE_SEQ_NUM_FIELD 1 -#define BMKT_MESSAGE_ID_FIELD 2 -#define BMKT_MESSAGE_PAYLOAD_LEN_FIELD 3 -#define BMKT_MESSAGE_PAYLOAD_FIELD 4 +#define BMKT_MESSAGE_HEADER_ID 0xFE +#define BMKT_MESSAGE_HEADER_LEN (4) +#define BMKT_MESSAGE_CRC32_LEN (4) +#define BMKT_MESSAGE_HEADER_ID_FIELD 0 +#define BMKT_MESSAGE_SEQ_NUM_FIELD 1 +#define BMKT_MESSAGE_ID_FIELD 2 +#define BMKT_MESSAGE_PAYLOAD_LEN_FIELD 3 +#define BMKT_MESSAGE_PAYLOAD_FIELD 4 // Command messages -#define BMKT_CMD_CONTINUOUS_IMAGE_CAPTURE 0x01 -#define BMKT_CMD_CONTINUOUS_IMAGE_CAPTURE_STOP 0x04 -#define BMKT_CMD_SENSOR_MODULE_TEST 0x06 -#define BMKT_CMD_SENSOR_MODULE_TEST_START 0x08 -#define BMKT_CMD_NEXT_TEST_REPORT_CHUNK 0x0B -#define BMKT_CMD_FPS_INIT 0x11 -#define BMKT_CMD_GET_FPS_MODE 0x21 -#define BMKT_CMD_SET_SECURITY_LEVEL 0x31 -#define BMKT_CMD_GET_SECURITY_LEVEL 0x34 -#define BMKT_CMD_CANCEL_OP 0x41 -#define BMKT_CMD_ENROLL_USER 0x51 -#define BMKT_CMD_ENROLL_PAUSE 0x52 -#define BMKT_CMD_ENROLL_RESUME 0x53 -#define BMKT_CMD_ID_USER 0x61 -#define BMKT_CMD_VERIFY_USER 0x65 -#define BMKT_CMD_GET_TEMPLATE_RECORDS 0x71 -#define BMKT_CMD_GET_NEXT_QUERY_RESPONSE 0x72 -#define BMKT_CMD_GET_ENROLLED_FINGERS 0x73 -#define BMKT_CMD_GET_DATABASE_CAPACITY 0x74 -#define BMKT_CMD_DEL_USER_FP 0x81 -#define BMKT_CMD_DEL_FULL_DB 0x84 -#define BMKT_CMD_REPEAT_LAST_RSP 0x92 -#define BMKT_CMD_POWER_DOWN_NOTIFY 0xA1 -#define BMKT_CMD_GET_VERSION 0xB1 -#define BMKT_CMD_DISABLE_PAIRING 0xC2 -#define BMKT_CMD_QUERY_PAIRING 0xC5 -#define BMKT_CMD_SENSOR_STATUS 0xD1 -#define BMKT_CMD_ID_USER_IN_ORDER 0xE1 -#define BMKT_CMD_ID_NEXT_USER 0xE3 -#define BMKT_CMD_VERIFY_USER_IN_ORDER 0xF1 -#define BMKT_CMD_VERIFY_FINGERS_IN_ORDER 0xF2 -#define BMKT_CMD_GET_FINAL_RESULT 0xE4 +#define BMKT_CMD_CONTINUOUS_IMAGE_CAPTURE 0x01 +#define BMKT_CMD_CONTINUOUS_IMAGE_CAPTURE_STOP 0x04 +#define BMKT_CMD_SENSOR_MODULE_TEST 0x06 +#define BMKT_CMD_SENSOR_MODULE_TEST_START 0x08 +#define BMKT_CMD_NEXT_TEST_REPORT_CHUNK 0x0B +#define BMKT_CMD_FPS_INIT 0x11 +#define BMKT_CMD_GET_FPS_MODE 0x21 +#define BMKT_CMD_SET_SECURITY_LEVEL 0x31 +#define BMKT_CMD_GET_SECURITY_LEVEL 0x34 +#define BMKT_CMD_CANCEL_OP 0x41 +#define BMKT_CMD_ENROLL_USER 0x51 +#define BMKT_CMD_ENROLL_PAUSE 0x52 +#define BMKT_CMD_ENROLL_RESUME 0x53 +#define BMKT_CMD_ID_USER 0x61 +#define BMKT_CMD_VERIFY_USER 0x65 +#define BMKT_CMD_GET_TEMPLATE_RECORDS 0x71 +#define BMKT_CMD_GET_NEXT_QUERY_RESPONSE 0x72 +#define BMKT_CMD_GET_ENROLLED_FINGERS 0x73 +#define BMKT_CMD_GET_DATABASE_CAPACITY 0x74 +#define BMKT_CMD_DEL_USER_FP 0x81 +#define BMKT_CMD_DEL_FULL_DB 0x84 +#define BMKT_CMD_REPEAT_LAST_RSP 0x92 +#define BMKT_CMD_POWER_DOWN_NOTIFY 0xA1 +#define BMKT_CMD_GET_VERSION 0xB1 +#define BMKT_CMD_DISABLE_PAIRING 0xC2 +#define BMKT_CMD_QUERY_PAIRING 0xC5 +#define BMKT_CMD_SENSOR_STATUS 0xD1 +#define BMKT_CMD_ID_USER_IN_ORDER 0xE1 +#define BMKT_CMD_ID_NEXT_USER 0xE3 +#define BMKT_CMD_VERIFY_USER_IN_ORDER 0xF1 +#define BMKT_CMD_VERIFY_FINGERS_IN_ORDER 0xF2 +#define BMKT_CMD_GET_FINAL_RESULT 0xE4 -#define BMKT_EVT_FINGER_REPORT 0x91 +#define BMKT_EVT_FINGER_REPORT 0x91 -#define BMKT_EVT_FINGER_STATE_NOT_ON_SENSOR 0x00 -#define BMKT_EVT_FINGER_STATE_ON_SENSOR 0x01 +#define BMKT_EVT_FINGER_STATE_NOT_ON_SENSOR 0x00 +#define BMKT_EVT_FINGER_STATE_ON_SENSOR 0x01 typedef struct bmkt_msg_resp { - uint8_t msg_id; - uint8_t seq_num; - uint8_t payload_len; - uint8_t *payload; - int result; + uint8_t msg_id; + uint8_t seq_num; + uint8_t payload_len; + uint8_t *payload; + int result; } bmkt_msg_resp_t; -int bmkt_compose_message(uint8_t *cmd, int *cmd_len, uint8_t msg_id, uint8_t seq_num, - uint8_t payload_size, const uint8_t *payload); +int bmkt_compose_message (uint8_t *cmd, + int *cmd_len, + uint8_t msg_id, + uint8_t seq_num, + uint8_t payload_size, + const uint8_t *payload); -int bmkt_parse_message_header(uint8_t *resp_buf, int resp_len, bmkt_msg_resp_t *msg_resp); -int bmkt_parse_message_payload(bmkt_msg_resp_t *msg_resp, bmkt_response_t *resp); +int bmkt_parse_message_header (uint8_t *resp_buf, + int resp_len, + bmkt_msg_resp_t *msg_resp); +int bmkt_parse_message_payload (bmkt_msg_resp_t *msg_resp, + bmkt_response_t *resp); #endif /* BMKT_MESSAGE_H_ */ diff --git a/libfprint/drivers/synaptics/bmkt_response.h b/libfprint/drivers/synaptics/bmkt_response.h index 874bf97..cfd7703 100644 --- a/libfprint/drivers/synaptics/bmkt_response.h +++ b/libfprint/drivers/synaptics/bmkt_response.h @@ -24,466 +24,466 @@ #include "bmkt.h" /** List of response message IDs */ -#define BMKT_RSP_CONTINUOUS_IMAGE_CAPTURE_FAIL 0x02 -#define BMKT_RSP_CONTINUOUS_IMAGE_CAPTURE_READY 0x03 +#define BMKT_RSP_CONTINUOUS_IMAGE_CAPTURE_FAIL 0x02 +#define BMKT_RSP_CONTINUOUS_IMAGE_CAPTURE_READY 0x03 #define BMKT_RSP_CONTINUOUS_IMAGE_CAPTURE_STOPPED 0x05 -#define BMKT_RSP_SENSOR_MODULE_TEST_READY 0x07 -#define BMKT_RSP_SENSOR_MODULE_TEST_FAIL 0x09 -#define BMKT_RSP_SENSOR_MODULE_TEST_REPORT 0x0A -#define BMKT_RSP_NEXT_TEST_REPORT_CHUNK 0x0C +#define BMKT_RSP_SENSOR_MODULE_TEST_READY 0x07 +#define BMKT_RSP_SENSOR_MODULE_TEST_FAIL 0x09 +#define BMKT_RSP_SENSOR_MODULE_TEST_REPORT 0x0A +#define BMKT_RSP_NEXT_TEST_REPORT_CHUNK 0x0C /*! \addtogroup init -* Response IDs returned by fingerprint initialization operation -* @{ -*/ + * Response IDs returned by fingerprint initialization operation + * @{ + */ /** Failed to initialize fingerprint sensor module */ -#define BMKT_RSP_FPS_INIT_FAIL 0x12 +#define BMKT_RSP_FPS_INIT_FAIL 0x12 /** Successfully initialized fingerprint sensor module */ -#define BMKT_RSP_FPS_INIT_OK 0x13 +#define BMKT_RSP_FPS_INIT_OK 0x13 /*! @} */ /*! \addtogroup mode -* Response IDs returned by get fingerprint mode operation -* @{ -*/ + * Response IDs returned by get fingerprint mode operation + * @{ + */ /** Failed to get fingerprint sensor module’s current operational mode */ -#define BMKT_RSP_FPS_MODE_FAIL 0x22 +#define BMKT_RSP_FPS_MODE_FAIL 0x22 /** -* BMKT_RSP_FPS_MODE_REPORT: -* Response containing the current operational mode of the fingerprint sensor module -*
Payload data represented in \ref bmkt_fps_mode_resp_t struct -*/ -#define BMKT_RSP_FPS_MODE_REPORT 0x23 + * BMKT_RSP_FPS_MODE_REPORT: + * Response containing the current operational mode of the fingerprint sensor module + *
Payload data represented in \ref bmkt_fps_mode_resp_t struct + */ +#define BMKT_RSP_FPS_MODE_REPORT 0x23 /*! @} */ /*! \addtogroup setseclevel -* Response IDs returned by set security level operation -* @{ -*/ + * Response IDs returned by set security level operation + * @{ + */ /** Failed to set fingerprint sensor module security level */ -#define BMKT_RSP_SET_SECURITY_LEVEL_FAIL 0x32 +#define BMKT_RSP_SET_SECURITY_LEVEL_FAIL 0x32 /** -* BMKT_RSP_SET_SECURITY_LEVEL_REPORT: -* Security level of the fingerprint sensor module was set successfully -*
Contains payload data represented in \ref bmkt_set_sec_level_resp_t struct -*/ -#define BMKT_RSP_SET_SECURITY_LEVEL_REPORT 0x33 + * BMKT_RSP_SET_SECURITY_LEVEL_REPORT: + * Security level of the fingerprint sensor module was set successfully + *
Contains payload data represented in \ref bmkt_set_sec_level_resp_t struct + */ +#define BMKT_RSP_SET_SECURITY_LEVEL_REPORT 0x33 /*! @} */ /*! \addtogroup getseclevel -* Response IDs returned by get security level operation -* @{ -*/ + * Response IDs returned by get security level operation + * @{ + */ /** Failed to get fingerprint sensor module security level */ -#define BMKT_RSP_GET_SECURITY_LEVEL_FAIL 0x35 +#define BMKT_RSP_GET_SECURITY_LEVEL_FAIL 0x35 /** -* BMKT_RSP_GET_SECURITY_LEVEL_REPORT: -* Returns the current security level of the fingerprint sensor module -*
Contains payload data represented in \ref bmkt_set_sec_level_resp_t struct -*/ -#define BMKT_RSP_GET_SECURITY_LEVEL_REPORT 0x36 + * BMKT_RSP_GET_SECURITY_LEVEL_REPORT: + * Returns the current security level of the fingerprint sensor module + *
Contains payload data represented in \ref bmkt_set_sec_level_resp_t struct + */ +#define BMKT_RSP_GET_SECURITY_LEVEL_REPORT 0x36 /*! @} */ /*! \addtogroup cancelop -* Response IDs returned by cancel_operation operation -* @{ -*/ + * Response IDs returned by cancel_operation operation + * @{ + */ /** -* BMKT_RSP_CANCEL_OP_OK: -* Successfully canceled the current operation and returned -* fingerprint sensor module to idle mode -*/ -#define BMKT_RSP_CANCEL_OP_OK 0x42 + * BMKT_RSP_CANCEL_OP_OK: + * Successfully canceled the current operation and returned + * fingerprint sensor module to idle mode + */ +#define BMKT_RSP_CANCEL_OP_OK 0x42 /** Failed to cancel the current operation */ -#define BMKT_RSP_CANCEL_OP_FAIL 0x43 +#define BMKT_RSP_CANCEL_OP_FAIL 0x43 /*! @} */ /*! \addtogroup enrollment -* Response IDs returned by enrollment operation -* @{ -*/ + * Response IDs returned by enrollment operation + * @{ + */ /** -* BMKT_RSP_ENROLL_READY: -* Fingerprint enrollment session has begun and the user can place -* their finger on the sensor -*/ -#define BMKT_RSP_ENROLL_READY 0x54 + * BMKT_RSP_ENROLL_READY: + * Fingerprint enrollment session has begun and the user can place + * their finger on the sensor + */ +#define BMKT_RSP_ENROLL_READY 0x54 /** Progress of the currently on-going fingerprint enrollment session */ -#define BMKT_RSP_ENROLL_REPORT 0x55 +#define BMKT_RSP_ENROLL_REPORT 0x55 /** Enrollment has been paused */ -#define BMKT_RSP_ENROLL_PAUSED 0x56 +#define BMKT_RSP_ENROLL_PAUSED 0x56 /** Enrollment has been resume */ -#define BMKT_RSP_ENROLL_RESUMED 0x57 +#define BMKT_RSP_ENROLL_RESUMED 0x57 /** The current enrollment session has encountered an error */ -#define BMKT_RSP_ENROLL_FAIL 0x58 +#define BMKT_RSP_ENROLL_FAIL 0x58 /** -* BMKT_RSP_ENROLL_OK: -* User has been successfully enrolled into the fingerprint sensor module -*
Contains payload data represented in \ref bmkt_enroll_resp_t struct -*/ -#define BMKT_RSP_ENROLL_OK 0x59 + * BMKT_RSP_ENROLL_OK: + * User has been successfully enrolled into the fingerprint sensor module + *
Contains payload data represented in \ref bmkt_enroll_resp_t struct + */ +#define BMKT_RSP_ENROLL_OK 0x59 /** -* BMKT_RSP_CAPTURE_COMPLETE: -* Fingerprint image capture is complete and it is safe for the user -* to lift their finger off the sensor -*/ -#define BMKT_RSP_CAPTURE_COMPLETE 0x60 + * BMKT_RSP_CAPTURE_COMPLETE: + * Fingerprint image capture is complete and it is safe for the user + * to lift their finger off the sensor + */ +#define BMKT_RSP_CAPTURE_COMPLETE 0x60 /*! @} */ /*! \addtogroup identify -* Response IDs returned by identify operation. -* @{ -*/ + * Response IDs returned by identify operation. + * @{ + */ /* Fingerprint identification session has begun */ -#define BMKT_RSP_ID_READY 0x62 +#define BMKT_RSP_ID_READY 0x62 /* Identification has failed */ -#define BMKT_RSP_ID_FAIL 0x63 +#define BMKT_RSP_ID_FAIL 0x63 /** -* BMKT_RSP_ID_OK: -* User has been successfully identified -*
Contains payload data represented in \ref bmkt_auth_resp struct -*/ -#define BMKT_RSP_ID_OK 0x64 + * BMKT_RSP_ID_OK: + * User has been successfully identified + *
Contains payload data represented in \ref bmkt_auth_resp struct + */ +#define BMKT_RSP_ID_OK 0x64 /*! @} */ /*! \addtogroup verify -* Response IDs returned by identify operation. -* @{ -*/ + * Response IDs returned by identify operation. + * @{ + */ /** Fingerprint verification session has begun */ -#define BMKT_RSP_VERIFY_READY 0x66 +#define BMKT_RSP_VERIFY_READY 0x66 /** Verification has failed */ -#define BMKT_RSP_VERIFY_FAIL 0x67 +#define BMKT_RSP_VERIFY_FAIL 0x67 /** -* BMKT_RSP_VERIFY_OK: -* User’s identity has been successfully verified -*
Contains payload data represented in \ref bmkt_auth_resp struct -*/ -#define BMKT_RSP_VERIFY_OK 0x68 + * BMKT_RSP_VERIFY_OK: + * User’s identity has been successfully verified + *
Contains payload data represented in \ref bmkt_auth_resp struct + */ +#define BMKT_RSP_VERIFY_OK 0x68 /*! @} */ /** -* BMKT_RSP_TEMPLATE_RECORDS_REPORT: -* Response ID returned by get enrolled users templates record operation -*
Returns list of template records containing user IDs and corresponding finger IDs -*
Payload data represented in \ref bmkt_enroll_templates_resp_t struct -*/ -#define BMKT_RSP_TEMPLATE_RECORDS_REPORT 0x75 + * BMKT_RSP_TEMPLATE_RECORDS_REPORT: + * Response ID returned by get enrolled users templates record operation + *
Returns list of template records containing user IDs and corresponding finger IDs + *
Payload data represented in \ref bmkt_enroll_templates_resp_t struct + */ +#define BMKT_RSP_TEMPLATE_RECORDS_REPORT 0x75 /** -* BMKT_RSP_QUERY_RESPONSE_COMPLETE: -* Response ID returned by get next query response operation -*
Complete sequence of messages containing the template records query response has been sent -*/ -#define BMKT_RSP_QUERY_RESPONSE_COMPLETE 0x76 + * BMKT_RSP_QUERY_RESPONSE_COMPLETE: + * Response ID returned by get next query response operation + *
Complete sequence of messages containing the template records query response has been sent + */ +#define BMKT_RSP_QUERY_RESPONSE_COMPLETE 0x76 /** -* BMKT_RSP_GET_ENROLLED_FINGERS_REPORT: -* Response ID returned by get enrolled fingers operation -*
Returns list of IDs of enrolled fingers for a specific user, -* along with template record status corresponding to each enrolled finger -*
Contains payload data represented in \ref bmkt_enrolled_fingers_resp_t struct -*/ -#define BMKT_RSP_GET_ENROLLED_FINGERS_REPORT 0x77 + * BMKT_RSP_GET_ENROLLED_FINGERS_REPORT: + * Response ID returned by get enrolled fingers operation + *
Returns list of IDs of enrolled fingers for a specific user, + * along with template record status corresponding to each enrolled finger + *
Contains payload data represented in \ref bmkt_enrolled_fingers_resp_t struct + */ +#define BMKT_RSP_GET_ENROLLED_FINGERS_REPORT 0x77 /*! \addtogroup dbcapacity -* Response IDs returned by get database capacity operation -* @{ -*/ + * Response IDs returned by get database capacity operation + * @{ + */ /** -* BMKT_RSP_DATABASE_CAPACITY_REPORT: -* Response specifying total capacity of fingerprint template database and -* how much free capacity is remaining along with how many templates are corrupted and -* how many bad (permanently unusable) storage slots are there. -*
Payload data represented in \ref bmkt_get_db_capacity_resp_t struct -*/ -#define BMKT_RSP_DATABASE_CAPACITY_REPORT 0x78 + * BMKT_RSP_DATABASE_CAPACITY_REPORT: + * Response specifying total capacity of fingerprint template database and + * how much free capacity is remaining along with how many templates are corrupted and + * how many bad (permanently unusable) storage slots are there. + *
Payload data represented in \ref bmkt_get_db_capacity_resp_t struct + */ +#define BMKT_RSP_DATABASE_CAPACITY_REPORT 0x78 /** Failed to execute database query */ -#define BMKT_RSP_QUERY_FAIL 0x79 +#define BMKT_RSP_QUERY_FAIL 0x79 /*! @} */ /*! \addtogroup deluser -* Response IDs returned by delete fingerprint of specific user operation -* @{ -*/ + * Response IDs returned by delete fingerprint of specific user operation + * @{ + */ /** Failed to delete a user’s fingerprint template from the database */ -#define BMKT_RSP_DEL_USER_FP_FAIL 0x82 +#define BMKT_RSP_DEL_USER_FP_FAIL 0x82 /** -* BMKT_RSP_DEL_USER_FP_OK: -* Fingerprint template successfully deleted from the database. -* Returns the user ID and finger ID deleted. If value of finger ID is set equal to 0, -* then all fingerprint templates for that user have been deleted from the database -*
Payload data represented in \ref bmkt_del_user_resp_t struct -*/ -#define BMKT_RSP_DEL_USER_FP_OK 0x83 + * BMKT_RSP_DEL_USER_FP_OK: + * Fingerprint template successfully deleted from the database. + * Returns the user ID and finger ID deleted. If value of finger ID is set equal to 0, + * then all fingerprint templates for that user have been deleted from the database + *
Payload data represented in \ref bmkt_del_user_resp_t struct + */ +#define BMKT_RSP_DEL_USER_FP_OK 0x83 /*! @} */ /*! \addtogroup delfulldb -* Response IDs returned by delete entire fingerprint template DB operation -* @{ -*/ + * Response IDs returned by delete entire fingerprint template DB operation + * @{ + */ /** Failed to erase entire fingerprint template database */ -#define BMKT_RSP_DEL_FULL_DB_FAIL 0x85 +#define BMKT_RSP_DEL_FULL_DB_FAIL 0x85 /** Successfully erased entire fingerprint template database */ -#define BMKT_RSP_DEL_FULL_DB_OK 0x86 +#define BMKT_RSP_DEL_FULL_DB_OK 0x86 /** -* BMKT_RSP_DELETE_PROGRESS: -* Notify progress made during the on-going deletion of the full template database -*
Payload data represented in \ref bmkt_del_all_users_resp_t struct -*/ -#define BMKT_RSP_DELETE_PROGRESS 0x87 + * BMKT_RSP_DELETE_PROGRESS: + * Notify progress made during the on-going deletion of the full template database + *
Payload data represented in \ref bmkt_del_all_users_resp_t struct + */ +#define BMKT_RSP_DELETE_PROGRESS 0x87 /*! @} */ /** -* BMKT_RSP_REPEAT_LAST_BMKT_RSP_FAIL: -* Response ID returned by repeate last response operation -*
Failed to retrieve and re-send last response -*/ -#define BMKT_RSP_REPEAT_LAST_BMKT_RSP_FAIL 0x93 + * BMKT_RSP_REPEAT_LAST_BMKT_RSP_FAIL: + * Response ID returned by repeate last response operation + *
Failed to retrieve and re-send last response + */ +#define BMKT_RSP_REPEAT_LAST_BMKT_RSP_FAIL 0x93 /*! \addtogroup pwrdwn -* Response IDs returned by power down notify operation -* @{ -*/ + * Response IDs returned by power down notify operation + * @{ + */ /** Fingerprint sensor module is ready to be powered down */ -#define BMKT_RSP_POWER_DOWN_READY 0xA2 +#define BMKT_RSP_POWER_DOWN_READY 0xA2 /** Failed to go into power down mode */ -#define BMKT_RSP_POWER_DOWN_FAIL 0xA3 +#define BMKT_RSP_POWER_DOWN_FAIL 0xA3 /*! @} */ /*! \addtogroup versioninfo -* Response IDs returned by get version operation -* @{ -*/ + * Response IDs returned by get version operation + * @{ + */ /** -* BMKT_RSP_VERSION_INFO: -* System version information of the fingerprint sensor module -*
Payload data represented in \ref bmkt_get_version_resp_t struct -*/ -#define BMKT_RSP_VERSION_INFO 0xB2 + * BMKT_RSP_VERSION_INFO: + * System version information of the fingerprint sensor module + *
Payload data represented in \ref bmkt_get_version_resp_t struct + */ +#define BMKT_RSP_VERSION_INFO 0xB2 /* Failed to retrieve and send last response */ -#define BMKT_RSP_GET_VERSION_FAIL 0xB3 +#define BMKT_RSP_GET_VERSION_FAIL 0xB3 /*! @} */ /** -* BMKT_RSP_GENERAL_ERROR: -* Not tied to a specific command-response session. -*
Could be caused by corrupt or truncated command message -*/ -#define BMKT_RSP_GENERAL_ERROR 0xC1 -#define BMKT_RSP_DISABLE_PAIRING_FAIL 0xC3 -#define BMKT_RSP_DISABLE_PAIRING_OK 0xC4 -#define BMKT_RSP_QUERY_PAIRING_FAIL 0xC6 -#define BMKT_RSP_SENSOR_PAIRING_REPORT 0xC7 + * BMKT_RSP_GENERAL_ERROR: + * Not tied to a specific command-response session. + *
Could be caused by corrupt or truncated command message + */ +#define BMKT_RSP_GENERAL_ERROR 0xC1 +#define BMKT_RSP_DISABLE_PAIRING_FAIL 0xC3 +#define BMKT_RSP_DISABLE_PAIRING_OK 0xC4 +#define BMKT_RSP_QUERY_PAIRING_FAIL 0xC6 +#define BMKT_RSP_SENSOR_PAIRING_REPORT 0xC7 /*! \addtogroup versioninfo -* Response IDs returned by get sensor module status operation -* @{ -*/ + * Response IDs returned by get sensor module status operation + * @{ + */ /** -* BMKT_RSP_SENSOR_STATUS_REPORT: -* Response returning the current status of the sensor module -*
Payload data represented in bmkt_XXX struct -*/ -#define BMKT_RSP_SENSOR_STATUS_REPORT 0xD2 + * BMKT_RSP_SENSOR_STATUS_REPORT: + * Response returning the current status of the sensor module + *
Payload data represented in bmkt_XXX struct + */ +#define BMKT_RSP_SENSOR_STATUS_REPORT 0xD2 /** Failed to retrieve sensor status */ -#define BMKT_RSP_SENSOR_STATUS_FAIL 0xD3 +#define BMKT_RSP_SENSOR_STATUS_FAIL 0xD3 /*! @} */ /** -* BMKT_RSP_SEND_NEXT_USER_ID: -* Response ID returned by identify user in order operation -*
Notify to send the next batch of user IDs in the priority list -*/ -#define BMKT_RSP_SEND_NEXT_USER_ID 0xE2 + * BMKT_RSP_SEND_NEXT_USER_ID: + * Response ID returned by identify user in order operation + *
Notify to send the next batch of user IDs in the priority list + */ +#define BMKT_RSP_SEND_NEXT_USER_ID 0xE2 /** -* BMKT_RSP_RETRIEVE_FINAL_RESULT_FAIL: -* Response IDs returned by retrieve final result operation -*
Failed to retrieve and re-send cached final result -*/ -#define BMKT_RSP_RETRIEVE_FINAL_RESULT_FAIL 0xE5 + * BMKT_RSP_RETRIEVE_FINAL_RESULT_FAIL: + * Response IDs returned by retrieve final result operation + *
Failed to retrieve and re-send cached final result + */ +#define BMKT_RSP_RETRIEVE_FINAL_RESULT_FAIL 0xE5 /** -* Response payload data structure returned by sensor initialization operation. -*/ + * Response payload data structure returned by sensor initialization operation. + */ typedef struct bmkt_init_resp { - uint8_t finger_presence; /**< Indicates finger existence on the sensor during startup */ + uint8_t finger_presence; /**< Indicates finger existence on the sensor during startup */ } bmkt_init_resp_t; /** -* bmkt_enroll_resp: -* Response payload data structure returned by enrollment operation. -*/ + * bmkt_enroll_resp: + * Response payload data structure returned by enrollment operation. + */ typedef struct bmkt_enroll_resp { - int progress; /**< Shows current progress stutus [0-100] */ - uint8_t finger_id; /**< User's finger id [1-10] */ - uint8_t user_id[BMKT_MAX_USER_ID_LEN]; /**< User name to be enrolled */ + int progress; /**< Shows current progress stutus [0-100] */ + uint8_t finger_id; /**< User's finger id [1-10] */ + uint8_t user_id[BMKT_MAX_USER_ID_LEN]; /**< User name to be enrolled */ } bmkt_enroll_resp_t; /** -* bmkt_auth_resp: -* Response payload data structure returned by identify and verify operations. -*/ + * bmkt_auth_resp: + * Response payload data structure returned by identify and verify operations. + */ struct bmkt_auth_resp { - double match_result; /**< match result returned by matcher */ - uint8_t finger_id; /**< Matched templates's finger id */ - uint8_t user_id[BMKT_MAX_USER_ID_LEN]; /**< Matched template's user id */ + double match_result; /**< match result returned by matcher */ + uint8_t finger_id; /**< Matched templates's finger id */ + uint8_t user_id[BMKT_MAX_USER_ID_LEN]; /**< Matched template's user id */ }; typedef struct bmkt_auth_resp bmkt_verify_resp_t; /**< Returned by verify */ typedef struct bmkt_auth_resp bmkt_identify_resp_t; /**< Returned by identify */ /** -* bmkt_fps_mode_resp: -* Response payload data structure returned by get fingerprint mode operation. -*/ + * bmkt_fps_mode_resp: + * Response payload data structure returned by get fingerprint mode operation. + */ typedef struct bmkt_fps_mode_resp { - uint8_t mode; /**< One of the Level I bmkt_mode_t values */ - uint8_t level2_mode; /**< One of the Level II bmkt_mode_level2_t values */ - uint8_t cmd_id; /**< Message ID of command being executed when bmkt_get_fps_mode was called */ - uint8_t finger_presence; /**< Finger presence status value finger on sensor 1 / finger not on sensor 0 */ + uint8_t mode; /**< One of the Level I bmkt_mode_t values */ + uint8_t level2_mode; /**< One of the Level II bmkt_mode_level2_t values */ + uint8_t cmd_id; /**< Message ID of command being executed when bmkt_get_fps_mode was called */ + uint8_t finger_presence; /**< Finger presence status value finger on sensor 1 / finger not on sensor 0 */ } bmkt_fps_mode_resp_t; /** -* bmkt_get_version_resp: -* Response payload data structure returned by get version operation. -*/ + * bmkt_get_version_resp: + * Response payload data structure returned by get version operation. + */ typedef struct bmkt_get_version_resp { - uint8_t part[BMKT_PART_NUM_LEN]; /**< Software Part Number */ - uint8_t year; /**< Software Version Year */ - uint8_t week; /**< Software Version Week */ - uint8_t patch; /**< Software Version Patch Level */ - uint8_t supplier_id[BMKT_SUPPLIER_ID_LEN]; /**< Software Supplier Identification */ + uint8_t part[BMKT_PART_NUM_LEN]; /**< Software Part Number */ + uint8_t year; /**< Software Version Year */ + uint8_t week; /**< Software Version Week */ + uint8_t patch; /**< Software Version Patch Level */ + uint8_t supplier_id[BMKT_SUPPLIER_ID_LEN]; /**< Software Supplier Identification */ } bmkt_get_version_resp_t; /** -* bmkt_get_db_capacity_resp: -* Response payload data structure returned by get DB capacity operation. -*/ + * bmkt_get_db_capacity_resp: + * Response payload data structure returned by get DB capacity operation. + */ typedef struct bmkt_get_db_capacity_resp { - uint8_t total; /**< Total Available Capacity: Total number of template records that can be stored */ - uint8_t empty; /**< Free Capacity: Number of template records that can still be stored */ - uint8_t bad_slots; /**< Number of bad template storage slots */ - uint8_t corrupt_templates; /**< Number of corrupt templates */ + uint8_t total; /**< Total Available Capacity: Total number of template records that can be stored */ + uint8_t empty; /**< Free Capacity: Number of template records that can still be stored */ + uint8_t bad_slots; /**< Number of bad template storage slots */ + uint8_t corrupt_templates; /**< Number of corrupt templates */ } bmkt_get_db_capacity_resp_t; /** -* bmkt_sec_level: -* Security level values. -*/ -typedef enum bmkt_sec_level -{ - BMKT_SECURITY_LEVEL_LOW = 0x10, - BMKT_SECURITY_LEVEL_MEDIUM = 0x40, - BMKT_SECURITY_LEVEL_HIGH = 0x60, + * bmkt_sec_level: + * Security level values. + */ +typedef enum bmkt_sec_level { + BMKT_SECURITY_LEVEL_LOW = 0x10, + BMKT_SECURITY_LEVEL_MEDIUM = 0x40, + BMKT_SECURITY_LEVEL_HIGH = 0x60, } bmkt_sec_level_t; /** -* bmkt_set_sec_level_resp: -* Response payload data structure returned by get/set security level operations. -*/ + * bmkt_set_sec_level_resp: + * Response payload data structure returned by get/set security level operations. + */ typedef struct bmkt_set_sec_level_resp { - bmkt_sec_level_t sec_level; /**< One of the bmkt_sec_level_t values */ + bmkt_sec_level_t sec_level; /**< One of the bmkt_sec_level_t values */ } bmkt_set_sec_level_resp_t; /** -* bmkt_del_all_users_resp: -* Response payload data structure returned by delete all enrolled users operation. -*/ + * bmkt_del_all_users_resp: + * Response payload data structure returned by delete all enrolled users operation. + */ typedef struct bmkt_del_all_users_resp { - int progress; /**< Progress indicator as a percentage */ + int progress; /**< Progress indicator as a percentage */ } bmkt_del_all_users_resp_t; /** -* bmkt_del_user_resp: -* Response payload data structure returned by delete enrolled user operation. -*/ + * bmkt_del_user_resp: + * Response payload data structure returned by delete enrolled user operation. + */ typedef struct bmkt_del_user_resp { - int progress; /**< Progress indicator as a percentage */ + int progress; /**< Progress indicator as a percentage */ } bmkt_del_user_resp_t; /** -* bmkt_enroll_template: -* Structure of enrolled users template record data. -*/ + * bmkt_enroll_template: + * Structure of enrolled users template record data. + */ typedef struct bmkt_enroll_template { - uint8_t user_id_len; /**< Length of user_id string */ - uint8_t template_status; /**< Template record status */ - uint8_t finger_id; /**< ID of enrolled finger */ - uint8_t user_id[BMKT_MAX_USER_ID_LEN + 1]; /**< Name of the enrolled user */ + uint8_t user_id_len; /**< Length of user_id string */ + uint8_t template_status; /**< Template record status */ + uint8_t finger_id; /**< ID of enrolled finger */ + uint8_t user_id[BMKT_MAX_USER_ID_LEN + 1]; /**< Name of the enrolled user */ } bmkt_enroll_template_t; /** -* bmkt_enroll_templates_resp: -* Response payload data structure returned by get enrolled user list operation. -*/ + * bmkt_enroll_templates_resp: + * Response payload data structure returned by get enrolled user list operation. + */ typedef struct bmkt_enroll_templates_resp { - uint8_t total_query_messages; /**< Total query response messages */ - uint8_t query_sequence; /**< Query response sequence number */ - bmkt_enroll_template_t templates[BMKT_MAX_NUM_TEMPLATES_INTERNAL_FLASH]; /**< Enrolled user template records list */ + uint8_t total_query_messages; /**< Total query response messages */ + uint8_t query_sequence; /**< Query response sequence number */ + bmkt_enroll_template_t templates[BMKT_MAX_NUM_TEMPLATES_INTERNAL_FLASH]; /**< Enrolled user template records list */ } bmkt_enroll_templates_resp_t; /** -* bmkt_enrolled_fingers: -* Structure of template record status corresponding to each enrolled finger. -*/ + * bmkt_enrolled_fingers: + * Structure of template record status corresponding to each enrolled finger. + */ typedef struct bmkt_enrolled_fingers { - uint8_t finger_id; /**< ID of enrolled finger */ - uint8_t template_status; /**< Template record status of finger_id */ + uint8_t finger_id; /**< ID of enrolled finger */ + uint8_t template_status; /**< Template record status of finger_id */ } bmkt_enrolled_fingers_t; /** -* bmkt_enrolled_fingers_resp: -* Response payload data structure returned by get enrolled fingers operation. -*/ + * bmkt_enrolled_fingers_resp: + * Response payload data structure returned by get enrolled fingers operation. + */ typedef struct bmkt_enrolled_fingers_resp { - bmkt_enrolled_fingers_t fingers[10]; /**< List of enroled fingers, max number of supported fingers per user is 10 */ + bmkt_enrolled_fingers_t fingers[10]; /**< List of enroled fingers, max number of supported fingers per user is 10 */ } bmkt_enrolled_fingers_resp_t; /** -* bmkt_response_data_t: -* Union combining all response payload data types. -*/ -typedef union { - bmkt_init_resp_t init_resp; - bmkt_enroll_resp_t enroll_resp; - bmkt_verify_resp_t verify_resp; - bmkt_identify_resp_t id_resp; - bmkt_fps_mode_resp_t fps_mode_resp; - bmkt_get_version_resp_t get_version_resp; - bmkt_get_db_capacity_resp_t db_cap_resp; - bmkt_set_sec_level_resp_t sec_level_resp; - bmkt_del_all_users_resp_t del_all_users_resp; - bmkt_enroll_templates_resp_t enroll_templates_resp; - bmkt_del_user_resp_t del_user_resp; - bmkt_enrolled_fingers_resp_t enrolled_fingers_resp; + * bmkt_response_data_t: + * Union combining all response payload data types. + */ +typedef union +{ + bmkt_init_resp_t init_resp; + bmkt_enroll_resp_t enroll_resp; + bmkt_verify_resp_t verify_resp; + bmkt_identify_resp_t id_resp; + bmkt_fps_mode_resp_t fps_mode_resp; + bmkt_get_version_resp_t get_version_resp; + bmkt_get_db_capacity_resp_t db_cap_resp; + bmkt_set_sec_level_resp_t sec_level_resp; + bmkt_del_all_users_resp_t del_all_users_resp; + bmkt_enroll_templates_resp_t enroll_templates_resp; + bmkt_del_user_resp_t del_user_resp; + bmkt_enrolled_fingers_resp_t enrolled_fingers_resp; } bmkt_response_data_t; /** -* bmkt_response: -* Structure to abstract different response structure types in one API -* to be used in bmkt_resp_cb_t callback function. -*/ + * bmkt_response: + * Structure to abstract different response structure types in one API + * to be used in bmkt_resp_cb_t callback function. + */ typedef struct bmkt_response { - int response_id; /**< Response message ID, one of th BMKT_RSP_XXX */ - int result; /**< Operation execution result code */ - int complete; /**< Operation completion status 1: complete / 0: not completed */ - bmkt_response_data_t response; /**< Operation specific response union */ + int response_id; /**< Response message ID, one of th BMKT_RSP_XXX */ + int result; /**< Operation execution result code */ + int complete; /**< Operation completion status 1: complete / 0: not completed */ + bmkt_response_data_t response; /**< Operation specific response union */ } bmkt_response_t; #endif /* _BMKT_RESPONSE_H_ */ diff --git a/libfprint/drivers/synaptics/sensor.h b/libfprint/drivers/synaptics/sensor.h index b8ebdfb..922b1dd 100644 --- a/libfprint/drivers/synaptics/sensor.h +++ b/libfprint/drivers/synaptics/sensor.h @@ -20,61 +20,68 @@ #define _SENSOR_H_ #include "usb_transport.h" -#define BMKT_MAX_PENDING_SESSIONS 2 +#define BMKT_MAX_PENDING_SESSIONS 2 -typedef enum bmkt_sensor_state -{ - BMKT_SENSOR_STATE_UNINIT = 0, - BMKT_SENSOR_STATE_IDLE, - BMKT_SENSOR_STATE_INIT, - BMKT_SENSOR_STATE_EXIT, +typedef enum bmkt_sensor_state { + BMKT_SENSOR_STATE_UNINIT = 0, + BMKT_SENSOR_STATE_IDLE, + BMKT_SENSOR_STATE_INIT, + BMKT_SENSOR_STATE_EXIT, } bmkt_sensor_state_t; typedef struct bmkt_sensor_drv bmkt_sensor_drv_t; typedef struct bmkt_sensor_version { - uint32_t build_time; - uint32_t build_num; - uint8_t version_major; - uint8_t version_minor; - uint8_t target; - uint8_t product; - uint8_t silicon_rev; - uint8_t formal_release; - uint8_t platform; - uint8_t patch; - uint8_t serial_number[6]; - uint16_t security; - uint8_t iface; - uint8_t device_type; + uint32_t build_time; + uint32_t build_num; + uint8_t version_major; + uint8_t version_minor; + uint8_t target; + uint8_t product; + uint8_t silicon_rev; + uint8_t formal_release; + uint8_t platform; + uint8_t patch; + uint8_t serial_number[6]; + uint16_t security; + uint8_t iface; + uint8_t device_type; } bmkt_sensor_version_t; typedef struct bmkt_sensor { - bmkt_usb_transport_t usb_xport; - bmkt_sensor_version_t version; - bmkt_session_ctx_t pending_sessions[BMKT_MAX_PENDING_SESSIONS]; - int empty_session_idx; - int flags; - int seq_num; - bmkt_sensor_state_t sensor_state; - bmkt_event_cb_t finger_event_cb; - void *finger_cb_ctx; - bmkt_general_error_cb_t gen_err_cb; - void *gen_err_cb_ctx; - bmkt_op_state_t op_state; + bmkt_usb_transport_t usb_xport; + bmkt_sensor_version_t version; + bmkt_session_ctx_t pending_sessions[BMKT_MAX_PENDING_SESSIONS]; + int empty_session_idx; + int flags; + int seq_num; + bmkt_sensor_state_t sensor_state; + bmkt_event_cb_t finger_event_cb; + void *finger_cb_ctx; + bmkt_general_error_cb_t gen_err_cb; + void *gen_err_cb_ctx; + bmkt_op_state_t op_state; } bmkt_sensor_t; -int bmkt_sensor_open(bmkt_sensor_t *sensor, - bmkt_general_error_cb_t err_cb, void *err_cb_ctx); -int bmkt_sensor_close(bmkt_sensor_t *sensor); +int bmkt_sensor_open (bmkt_sensor_t *sensor, + bmkt_general_error_cb_t err_cb, + void *err_cb_ctx); +int bmkt_sensor_close (bmkt_sensor_t *sensor); -int bmkt_sensor_init_fps(bmkt_sensor_t *sensor); +int bmkt_sensor_init_fps (bmkt_sensor_t *sensor); -int bmkt_sensor_send_message(bmkt_sensor_t *sensor, uint8_t msg_id, uint8_t payload_size, - uint8_t *payload, bmkt_resp_cb_t resp_cb, void *resp_data); -int bmkt_sensor_handle_response(bmkt_sensor_t *sensor, uint8_t *resp_buf, int resp_len, bmkt_msg_resp_t *msg_resp); +int bmkt_sensor_send_message (bmkt_sensor_t *sensor, + uint8_t msg_id, + uint8_t payload_size, + uint8_t *payload, + bmkt_resp_cb_t resp_cb, + void *resp_data); +int bmkt_sensor_handle_response (bmkt_sensor_t *sensor, + uint8_t *resp_buf, + int resp_len, + bmkt_msg_resp_t *msg_resp); -int bmkt_sensor_send_async_read_command(bmkt_sensor_t *sensor); +int bmkt_sensor_send_async_read_command (bmkt_sensor_t *sensor); #endif /* _SENSOR_H_ */ diff --git a/libfprint/drivers/synaptics/synaptics.c b/libfprint/drivers/synaptics/synaptics.c index d5efa2a..b7a0fce 100644 --- a/libfprint/drivers/synaptics/synaptics.c +++ b/libfprint/drivers/synaptics/synaptics.c @@ -25,347 +25,386 @@ #include "synaptics.h" #include "bmkt_message.h" -G_DEFINE_TYPE(FpiDeviceSynaptics, fpi_device_synaptics, FP_TYPE_DEVICE) +G_DEFINE_TYPE (FpiDeviceSynaptics, fpi_device_synaptics, FP_TYPE_DEVICE) -static const FpIdEntry id_table [ ] = { - { .vid = SYNAPTICS_VENDOR_ID, .pid = 0xBD, }, +static const FpIdEntry id_table[] = { + { .vid = SYNAPTICS_VENDOR_ID, .pid = 0xBD, }, - { .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */ + { .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */ }; static void cmd_recieve_cb (FpiUsbTransfer *transfer, - FpDevice *device, - gpointer user_data, - GError *error) + FpDevice *device, + gpointer user_data, + GError *error) { - FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (device); - SynCmdMsgCallback callback = user_data; - int res; - bmkt_msg_resp_t msg_resp; - bmkt_response_t resp; + FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (device); + SynCmdMsgCallback callback = user_data; + int res; + bmkt_msg_resp_t msg_resp; + bmkt_response_t resp; - if (error) { - /* NOTE: assumes timeout should never happen for receiving. */ - fpi_ssm_mark_failed (transfer->ssm, error); - return; - } + if (error) + { + /* NOTE: assumes timeout should never happen for receiving. */ + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } - res = bmkt_parse_message_header(&transfer->buffer[SENSOR_FW_REPLY_HEADER_LEN], - transfer->actual_length - SENSOR_FW_REPLY_HEADER_LEN, - &msg_resp); - if (res != BMKT_SUCCESS) { - g_warning ("Corrupted message received"); - fpi_ssm_mark_failed (transfer->ssm, - fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); - return; - } + res = bmkt_parse_message_header (&transfer->buffer[SENSOR_FW_REPLY_HEADER_LEN], + transfer->actual_length - SENSOR_FW_REPLY_HEADER_LEN, + &msg_resp); + if (res != BMKT_SUCCESS) + { + g_warning ("Corrupted message received"); + fpi_ssm_mark_failed (transfer->ssm, + fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + return; + } - /* Special case events */ - if (msg_resp.msg_id == BMKT_EVT_FINGER_REPORT) { - if (msg_resp.payload_len != 1) { - g_warning ("Corrupted finger report received"); - fpi_ssm_mark_failed (transfer->ssm, - fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); - return; - } + /* Special case events */ + if (msg_resp.msg_id == BMKT_EVT_FINGER_REPORT) + { + if (msg_resp.payload_len != 1) + { + g_warning ("Corrupted finger report received"); + fpi_ssm_mark_failed (transfer->ssm, + fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + return; + } - if (msg_resp.payload[0] == 0x01) { - self->finger_on_sensor = TRUE; - } else { - self->finger_on_sensor = FALSE; - if (self->cmd_complete_on_removal) { - fpi_ssm_mark_completed (transfer->ssm); - return; - } - } + if (msg_resp.payload[0] == 0x01) + { + self->finger_on_sensor = TRUE; + } + else + { + self->finger_on_sensor = FALSE; + if (self->cmd_complete_on_removal) + { + fpi_ssm_mark_completed (transfer->ssm); + return; + } + } - fp_dbg ("Finger is now %s the sensor", self->finger_on_sensor ? "on" : "off"); + fp_dbg ("Finger is now %s the sensor", self->finger_on_sensor ? "on" : "off"); - /* XXX: Call callback!?! */ - } + /* XXX: Call callback!?! */ + } - res = bmkt_parse_message_payload (&msg_resp, &resp); - if (res != BMKT_SUCCESS) { - g_warning ("Could not parse message payload: %i", res); - fpi_ssm_mark_failed (transfer->ssm, - fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); - return; - } + res = bmkt_parse_message_payload (&msg_resp, &resp); + if (res != BMKT_SUCCESS) + { + g_warning ("Could not parse message payload: %i", res); + fpi_ssm_mark_failed (transfer->ssm, + fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + return; + } - /* Special cancellation handling */ - if (resp.response_id == BMKT_RSP_CANCEL_OP_OK || resp.response_id == BMKT_RSP_CANCEL_OP_FAIL) { - if (resp.response_id == BMKT_RSP_CANCEL_OP_OK) { - fp_dbg ("Received cancellation success resonse"); - fpi_ssm_mark_failed (transfer->ssm, - g_error_new_literal (G_IO_ERROR, - G_IO_ERROR_CANCELLED, - "Device reported cancellation of operation")); - } else { - fp_dbg ("Cancellation failed, this should not happen"); - fpi_ssm_mark_failed (transfer->ssm, - fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); - } - return; - } + /* Special cancellation handling */ + if (resp.response_id == BMKT_RSP_CANCEL_OP_OK || resp.response_id == BMKT_RSP_CANCEL_OP_FAIL) + { + if (resp.response_id == BMKT_RSP_CANCEL_OP_OK) + { + fp_dbg ("Received cancellation success resonse"); + fpi_ssm_mark_failed (transfer->ssm, + g_error_new_literal (G_IO_ERROR, + G_IO_ERROR_CANCELLED, + "Device reported cancellation of operation")); + } + else + { + fp_dbg ("Cancellation failed, this should not happen"); + fpi_ssm_mark_failed (transfer->ssm, + fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + } + return; + } - if (msg_resp.seq_num == 0) { - /* XXX: Should we really abort the command on general error? - * The original code did not! */ - if (msg_resp.msg_id == BMKT_RSP_GENERAL_ERROR) { - guint16 err; + if (msg_resp.seq_num == 0) + { + /* XXX: Should we really abort the command on general error? + * The original code did not! */ + if (msg_resp.msg_id == BMKT_RSP_GENERAL_ERROR) + { + guint16 err; - /* XXX: It is weird that this is big endian. */ - err = FP_READ_UINT16_BE(msg_resp.payload); + /* XXX: It is weird that this is big endian. */ + err = FP_READ_UINT16_BE (msg_resp.payload); - fp_warn("Received General Error %d from the sensor", (guint) err); - fpi_ssm_mark_failed (transfer->ssm, - fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Received general error from device")); - //fpi_ssm_jump_to_state (transfer->ssm, fpi_ssm_get_cur_state (transfer->ssm)); - return; - } else { - fp_dbg ("Received message with 0 sequence number 0x%02x, ignoring!", - msg_resp.msg_id); - fpi_ssm_next_state (transfer->ssm); - return; - } - } + fp_warn ("Received General Error %d from the sensor", (guint) err); + fpi_ssm_mark_failed (transfer->ssm, + fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Received general error from device")); + //fpi_ssm_jump_to_state (transfer->ssm, fpi_ssm_get_cur_state (transfer->ssm)); + return; + } + else + { + fp_dbg ("Received message with 0 sequence number 0x%02x, ignoring!", + msg_resp.msg_id); + fpi_ssm_next_state (transfer->ssm); + return; + } + } - /* We should only ever have one command running, and the sequence num needs - * to match. */ - if (msg_resp.seq_num != self->cmd_seq_num) { - fp_warn ("Got unexpected sequence number from device, %d instead of %d", - msg_resp.seq_num, - self->cmd_seq_num); - } + /* We should only ever have one command running, and the sequence num needs + * to match. */ + if (msg_resp.seq_num != self->cmd_seq_num) + { + fp_warn ("Got unexpected sequence number from device, %d instead of %d", + msg_resp.seq_num, + self->cmd_seq_num); + } - if (callback) - callback (self, &resp, NULL); + if (callback) + callback (self, &resp, NULL); - /* Callback may have queued a follow up command, then we need - * to restart the SSM. If not, we'll finish/wait for interrupt - * depending on resp.complete. */ - if (self->cmd_pending_transfer) - fpi_ssm_jump_to_state (transfer->ssm, SYNAPTICS_CMD_SEND_PENDING); - else if (!resp.complete) - fpi_ssm_next_state (transfer->ssm); /* SYNAPTICS_CMD_WAIT_INTERRUPT */ - else - fpi_ssm_mark_completed (transfer->ssm); + /* Callback may have queued a follow up command, then we need + * to restart the SSM. If not, we'll finish/wait for interrupt + * depending on resp.complete. */ + if (self->cmd_pending_transfer) + fpi_ssm_jump_to_state (transfer->ssm, SYNAPTICS_CMD_SEND_PENDING); + else if (!resp.complete) + fpi_ssm_next_state (transfer->ssm); /* SYNAPTICS_CMD_WAIT_INTERRUPT */ + else + fpi_ssm_mark_completed (transfer->ssm); } static void cmd_interrupt_cb (FpiUsbTransfer *transfer, - FpDevice *device, - gpointer user_data, - GError *error) + FpDevice *device, + gpointer user_data, + GError *error) { - g_debug ("interrupt transfer done"); - if (error) { - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { - g_error_free (error); - fpi_ssm_jump_to_state (transfer->ssm, SYNAPTICS_CMD_GET_RESP); - return; - } + g_debug ("interrupt transfer done"); + if (error) + { + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + { + g_error_free (error); + fpi_ssm_jump_to_state (transfer->ssm, SYNAPTICS_CMD_GET_RESP); + return; + } - fpi_ssm_mark_failed (transfer->ssm, error); - return; - } - g_clear_pointer (&error, g_error_free); + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } + g_clear_pointer (&error, g_error_free); - if (transfer->buffer[0] & USB_ASYNC_MESSAGE_PENDING || error) - fpi_ssm_next_state (transfer->ssm); - else - fpi_usb_transfer_submit (transfer, 1000, NULL, cmd_interrupt_cb, NULL); + if (transfer->buffer[0] & USB_ASYNC_MESSAGE_PENDING || error) + fpi_ssm_next_state (transfer->ssm); + else + fpi_usb_transfer_submit (transfer, 1000, NULL, cmd_interrupt_cb, NULL); } static void -synaptics_cmd_run_state(FpiSsm *ssm, - FpDevice *dev, - void *user_data) +synaptics_cmd_run_state (FpiSsm *ssm, + FpDevice *dev, + void *user_data) { - g_autoptr(FpiUsbTransfer) transfer = NULL; - FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (dev); + g_autoptr(FpiUsbTransfer) transfer = NULL; + FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case SYNAPTICS_CMD_SEND_PENDING: - if (self->cmd_pending_transfer) { - self->cmd_pending_transfer->ssm = ssm; - fpi_usb_transfer_submit (self->cmd_pending_transfer, - 1000, - NULL, - fpi_ssm_usb_transfer_cb, - NULL); - g_clear_pointer (&self->cmd_pending_transfer, fpi_usb_transfer_unref); - } else { - fpi_ssm_next_state (ssm); - } - break; + switch (fpi_ssm_get_cur_state (ssm)) + { + case SYNAPTICS_CMD_SEND_PENDING: + if (self->cmd_pending_transfer) + { + self->cmd_pending_transfer->ssm = ssm; + fpi_usb_transfer_submit (self->cmd_pending_transfer, + 1000, + NULL, + fpi_ssm_usb_transfer_cb, + NULL); + g_clear_pointer (&self->cmd_pending_transfer, fpi_usb_transfer_unref); + } + else + { + fpi_ssm_next_state (ssm); + } + break; - case SYNAPTICS_CMD_GET_RESP: - transfer = fpi_usb_transfer_new (dev); - transfer->ssm = ssm; - fpi_usb_transfer_fill_bulk (transfer, USB_EP_REPLY, MAX_TRANSFER_LEN); - fpi_usb_transfer_submit (transfer, - 5000, - NULL, - cmd_recieve_cb, - user_data); + case SYNAPTICS_CMD_GET_RESP: + transfer = fpi_usb_transfer_new (dev); + transfer->ssm = ssm; + fpi_usb_transfer_fill_bulk (transfer, USB_EP_REPLY, MAX_TRANSFER_LEN); + fpi_usb_transfer_submit (transfer, + 5000, + NULL, + cmd_recieve_cb, + user_data); - break; + break; - case SYNAPTICS_CMD_WAIT_INTERRUPT: - transfer = fpi_usb_transfer_new (dev); - transfer->ssm = ssm; - fpi_usb_transfer_fill_interrupt (transfer, USB_EP_INTERRUPT, USB_INTERRUPT_DATA_SIZE); - fpi_usb_transfer_submit (transfer, - 0, - self->interrupt_cancellable, - cmd_interrupt_cb, - NULL); + case SYNAPTICS_CMD_WAIT_INTERRUPT: + transfer = fpi_usb_transfer_new (dev); + transfer->ssm = ssm; + fpi_usb_transfer_fill_interrupt (transfer, USB_EP_INTERRUPT, USB_INTERRUPT_DATA_SIZE); + fpi_usb_transfer_submit (transfer, + 0, + self->interrupt_cancellable, + cmd_interrupt_cb, + NULL); - break; + break; - case SYNAPTICS_CMD_SEND_ASYNC: - transfer = fpi_usb_transfer_new (dev); - transfer->ssm = ssm; - fpi_usb_transfer_fill_bulk (transfer, USB_EP_REQUEST, SENSOR_FW_CMD_HEADER_LEN); - transfer->buffer[0] = SENSOR_CMD_ASYNCMSG_READ; - fpi_usb_transfer_submit (transfer, - 1000, - NULL, - fpi_ssm_usb_transfer_cb, - NULL); + case SYNAPTICS_CMD_SEND_ASYNC: + transfer = fpi_usb_transfer_new (dev); + transfer->ssm = ssm; + fpi_usb_transfer_fill_bulk (transfer, USB_EP_REQUEST, SENSOR_FW_CMD_HEADER_LEN); + transfer->buffer[0] = SENSOR_CMD_ASYNCMSG_READ; + fpi_usb_transfer_submit (transfer, + 1000, + NULL, + fpi_ssm_usb_transfer_cb, + NULL); - break; + break; - case SYNAPTICS_CMD_RESTART: - fpi_ssm_jump_to_state (ssm, SYNAPTICS_CMD_SEND_PENDING); - break; - } + case SYNAPTICS_CMD_RESTART: + fpi_ssm_jump_to_state (ssm, SYNAPTICS_CMD_SEND_PENDING); + break; + } } static void -cmd_ssm_done (FpiSsm *ssm, - FpDevice *dev, - void *user_data, - GError *error) +cmd_ssm_done (FpiSsm *ssm, + FpDevice *dev, + void *user_data, + GError *error) { - FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (dev); - SynCmdMsgCallback callback = user_data; + FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (dev); + SynCmdMsgCallback callback = user_data; - self->cmd_ssm = NULL; + self->cmd_ssm = NULL; - /* Notify about the SSM failure from here instead. */ - if (error) { - callback (self, NULL, error); - } else if (self->cmd_complete_on_removal) { - callback (self, NULL, self->cmd_complete_error); - self->cmd_complete_error = NULL; - } - self->cmd_complete_on_removal = FALSE; - g_clear_pointer (&self->cmd_complete_error, g_error_free); - fpi_ssm_free (ssm); + /* Notify about the SSM failure from here instead. */ + if (error) + { + callback (self, NULL, error); + } + else if (self->cmd_complete_on_removal) + { + callback (self, NULL, self->cmd_complete_error); + self->cmd_complete_error = NULL; + } + self->cmd_complete_on_removal = FALSE; + g_clear_pointer (&self->cmd_complete_error, g_error_free); + fpi_ssm_free (ssm); } static void cmd_forget_cb (FpiUsbTransfer *transfer, - FpDevice *device, - gpointer user_data, - GError *error) + FpDevice *device, + gpointer user_data, + GError *error) { - if (error) { - g_warning ("Async command sending failed: %s", error->message); - g_error_free (error); - } else { - g_debug ("Async command sent successfully"); - } + if (error) + { + g_warning ("Async command sending failed: %s", error->message); + g_error_free (error); + } + else + { + g_debug ("Async command sent successfully"); + } } static void synaptics_sensor_cmd (FpiDeviceSynaptics *self, - gint seq_num, - guint8 msg_id, - const guint8* payload, - gssize payload_len, - SynCmdMsgCallback callback) + gint seq_num, + guint8 msg_id, + const guint8 * payload, + gssize payload_len, + SynCmdMsgCallback callback) { - g_autoptr(FpiUsbTransfer) transfer = NULL; - guint8 real_seq_num; - gint msg_len; - gint res; + g_autoptr(FpiUsbTransfer) transfer = NULL; + guint8 real_seq_num; + gint msg_len; + gint res; - /* callback may be NULL in two cases: - * - seq_num == -1 - * - a state machine is already running, continued command */ - g_assert (payload || payload_len == 0); + /* callback may be NULL in two cases: + * - seq_num == -1 + * - a state machine is already running, continued command */ + g_assert (payload || payload_len == 0); - /* seq_num of 0 means a normal command, -1 means the current commands - * sequence number should not be udpated (i.e. second async command which - * may only be a cancellation currently). */ - if (seq_num <= 0) { - self->last_seq_num = MAX(1, self->last_seq_num + 1); - real_seq_num = self->last_seq_num; - if (seq_num == 0) - self->cmd_seq_num = self->last_seq_num; - } else { - real_seq_num = seq_num; - self->last_seq_num = real_seq_num; - } - g_debug ("sequence number is %d", real_seq_num); + /* seq_num of 0 means a normal command, -1 means the current commands + * sequence number should not be udpated (i.e. second async command which + * may only be a cancellation currently). */ + if (seq_num <= 0) + { + self->last_seq_num = MAX (1, self->last_seq_num + 1); + real_seq_num = self->last_seq_num; + if (seq_num == 0) + self->cmd_seq_num = self->last_seq_num; + } + else + { + real_seq_num = seq_num; + self->last_seq_num = real_seq_num; + } + g_debug ("sequence number is %d", real_seq_num); - /* We calculate the exact length here (we could also just create a larger - * buffer instead and check the result of bmkt_compose_message. */ - msg_len = BMKT_MESSAGE_HEADER_LEN + payload_len; + /* We calculate the exact length here (we could also just create a larger + * buffer instead and check the result of bmkt_compose_message. */ + msg_len = BMKT_MESSAGE_HEADER_LEN + payload_len; - /* Send out the command */ - transfer = fpi_usb_transfer_new (FP_DEVICE (self)); - transfer->short_is_error = TRUE; - fpi_usb_transfer_fill_bulk (transfer, - USB_EP_REQUEST, - msg_len + SENSOR_FW_CMD_HEADER_LEN); + /* Send out the command */ + transfer = fpi_usb_transfer_new (FP_DEVICE (self)); + transfer->short_is_error = TRUE; + fpi_usb_transfer_fill_bulk (transfer, + USB_EP_REQUEST, + msg_len + SENSOR_FW_CMD_HEADER_LEN); - /* MIS sensors send ACE commands encapsulated in FW commands*/ - transfer->buffer[0] = SENSOR_CMD_ACE_COMMAND; - res = bmkt_compose_message (&transfer->buffer[1], - &msg_len, msg_id, - real_seq_num, - payload_len, - payload); - g_assert (res == BMKT_SUCCESS); - g_assert (msg_len + SENSOR_FW_CMD_HEADER_LEN == transfer->length); + /* MIS sensors send ACE commands encapsulated in FW commands*/ + transfer->buffer[0] = SENSOR_CMD_ACE_COMMAND; + res = bmkt_compose_message (&transfer->buffer[1], + &msg_len, msg_id, + real_seq_num, + payload_len, + payload); + g_assert (res == BMKT_SUCCESS); + g_assert (msg_len + SENSOR_FW_CMD_HEADER_LEN == transfer->length); - /* Special case for async command sending (should only be used for - * cancellation). */ - if (seq_num == -1) { - g_assert(callback == NULL); + /* Special case for async command sending (should only be used for + * cancellation). */ + if (seq_num == -1) + { + g_assert (callback == NULL); - /* We just send and forget here. */ - fpi_usb_transfer_submit (transfer, 1000, NULL, cmd_forget_cb, NULL); - } else { - /* Command should be send using the state machine. */ - g_assert (self->cmd_pending_transfer == NULL); + /* We just send and forget here. */ + fpi_usb_transfer_submit (transfer, 1000, NULL, cmd_forget_cb, NULL); + } + else + { + /* Command should be send using the state machine. */ + g_assert (self->cmd_pending_transfer == NULL); - self->cmd_pending_transfer = g_steal_pointer (&transfer); + self->cmd_pending_transfer = g_steal_pointer (&transfer); - if (self->cmd_ssm) { - /* Continued command, we already have an SSM with a callback. - * There is nothing to do in this case, the command will be - * sent automatically. */ - g_assert (callback == NULL); - } else { - /* Start of a new command, create the state machine. */ - g_assert (callback != NULL); + if (self->cmd_ssm) + { + /* Continued command, we already have an SSM with a callback. + * There is nothing to do in this case, the command will be + * sent automatically. */ + g_assert (callback == NULL); + } + else + { + /* Start of a new command, create the state machine. */ + g_assert (callback != NULL); - self->cmd_ssm = fpi_ssm_new (FP_DEVICE (self), - synaptics_cmd_run_state, - SYNAPTICS_CMD_NUM_STATES, - callback); + self->cmd_ssm = fpi_ssm_new (FP_DEVICE (self), + synaptics_cmd_run_state, + SYNAPTICS_CMD_NUM_STATES, + callback); - fpi_ssm_start (self->cmd_ssm, cmd_ssm_done); - } - } + fpi_ssm_start (self->cmd_ssm, cmd_ssm_done); + } + } } static gboolean @@ -374,744 +413,798 @@ parse_print_data (GVariant *data, const guint8 **user_id, gssize *user_id_len) { - g_autoptr(GVariant) user_id_var = NULL; + g_autoptr(GVariant) user_id_var = NULL; - g_return_val_if_fail (data != NULL, FALSE); - g_return_val_if_fail (finger != NULL, FALSE); - g_return_val_if_fail (user_id != NULL, FALSE); - g_return_val_if_fail (user_id_len != NULL, FALSE); + g_return_val_if_fail (data != NULL, FALSE); + g_return_val_if_fail (finger != NULL, FALSE); + g_return_val_if_fail (user_id != NULL, FALSE); + g_return_val_if_fail (user_id_len != NULL, FALSE); - *user_id = NULL; - *user_id_len = 0; + *user_id = NULL; + *user_id_len = 0; - if (!g_variant_check_format_string (data, "(y@ay)", FALSE)) - return FALSE; + if (!g_variant_check_format_string (data, "(y@ay)", FALSE)) + return FALSE; - g_variant_get(data, - "(y@ay)", - finger, - &user_id_var); + g_variant_get (data, + "(y@ay)", + finger, + &user_id_var); - *user_id = g_variant_get_fixed_array (user_id_var, user_id_len, 1); + *user_id = g_variant_get_fixed_array (user_id_var, user_id_len, 1); - if (*user_id_len == 0 || *user_id_len > BMKT_MAX_USER_ID_LEN) - return FALSE; + if (*user_id_len == 0 || *user_id_len > BMKT_MAX_USER_ID_LEN) + return FALSE; - if (*user_id_len <= 0 || *user_id[0] == ' ') - return FALSE; + if (*user_id_len <= 0 || *user_id[0] == ' ') + return FALSE; - return TRUE; + return TRUE; } static void -list_msg_cb(FpiDeviceSynaptics *self, - bmkt_response_t *resp, - GError *error) +list_msg_cb (FpiDeviceSynaptics *self, + bmkt_response_t *resp, + GError *error) { - bmkt_enroll_templates_resp_t *get_enroll_templates_resp; + bmkt_enroll_templates_resp_t *get_enroll_templates_resp; - if (error) { - g_clear_pointer (&self->list_result, g_ptr_array_free); - fpi_device_list_complete (FP_DEVICE (self), NULL, error); - return; - } + if (error) + { + g_clear_pointer (&self->list_result, g_ptr_array_free); + fpi_device_list_complete (FP_DEVICE (self), NULL, error); + return; + } - get_enroll_templates_resp = &resp->response.enroll_templates_resp; + get_enroll_templates_resp = &resp->response.enroll_templates_resp; - switch (resp->response_id) - { - case BMKT_RSP_QUERY_FAIL: - if (resp->result == BMKT_FP_DATABASE_EMPTY) { - fp_info("Database is empty"); + switch (resp->response_id) + { + case BMKT_RSP_QUERY_FAIL: + if (resp->result == BMKT_FP_DATABASE_EMPTY) + { + fp_info ("Database is empty"); - fpi_device_list_complete (FP_DEVICE (self), - g_steal_pointer (&self->list_result), - NULL); - } else { - fp_info("Failed to query enrolled users: %d", resp->result); - g_clear_pointer (&self->list_result, g_ptr_array_free); - fpi_device_list_complete (FP_DEVICE (self), - NULL, - fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, - "Failed to query enrolled users")); - } - break; - case BMKT_RSP_QUERY_RESPONSE_COMPLETE: - fp_info("Query complete!"); + fpi_device_list_complete (FP_DEVICE (self), + g_steal_pointer (&self->list_result), + NULL); + } + else + { + fp_info ("Failed to query enrolled users: %d", resp->result); + g_clear_pointer (&self->list_result, g_ptr_array_free); + fpi_device_list_complete (FP_DEVICE (self), + NULL, + fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, + "Failed to query enrolled users")); + } + break; - fpi_device_list_complete (FP_DEVICE (self), - g_steal_pointer (&self->list_result), - NULL); + case BMKT_RSP_QUERY_RESPONSE_COMPLETE: + fp_info ("Query complete!"); - break; - case BMKT_RSP_TEMPLATE_RECORDS_REPORT: + fpi_device_list_complete (FP_DEVICE (self), + g_steal_pointer (&self->list_result), + NULL); - for (int n = 0; n < BMKT_MAX_NUM_TEMPLATES_INTERNAL_FLASH; n++) - { - GVariant *data = NULL; - GVariant *uid = NULL; - FpPrint *print; - gchar *userid; + break; - if (get_enroll_templates_resp->templates[n].user_id_len == 0) - continue; + case BMKT_RSP_TEMPLATE_RECORDS_REPORT: - fp_info("![query %d of %d] template %d: status=0x%x, userId=%s, fingerId=%d", - get_enroll_templates_resp->query_sequence, - get_enroll_templates_resp->total_query_messages, - n, - get_enroll_templates_resp->templates[n].template_status, - get_enroll_templates_resp->templates[n].user_id, - get_enroll_templates_resp->templates[n].finger_id); + for (int n = 0; n < BMKT_MAX_NUM_TEMPLATES_INTERNAL_FLASH; n++) + { + GVariant *data = NULL; + GVariant *uid = NULL; + FpPrint *print; + gchar *userid; - userid = get_enroll_templates_resp->templates[n].user_id; + if (get_enroll_templates_resp->templates[n].user_id_len == 0) + continue; - print = fp_print_new (FP_DEVICE (self)); - uid = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, - get_enroll_templates_resp->templates[n].user_id, - get_enroll_templates_resp->templates[n].user_id_len, - 1); - data = g_variant_new ("(y@ay)", - get_enroll_templates_resp->templates[n].finger_id, - uid); + fp_info ("![query %d of %d] template %d: status=0x%x, userId=%s, fingerId=%d", + get_enroll_templates_resp->query_sequence, + get_enroll_templates_resp->total_query_messages, + n, + get_enroll_templates_resp->templates[n].template_status, + get_enroll_templates_resp->templates[n].user_id, + get_enroll_templates_resp->templates[n].finger_id); - fpi_print_set_type (print, FP_PRINT_RAW); - fpi_print_set_device_stored (print, TRUE); - g_object_set (print, "fp-data", data, NULL); - g_object_set (print, "description", get_enroll_templates_resp->templates[n].user_id, NULL); + userid = get_enroll_templates_resp->templates[n].user_id; - /* The format has 24 bytes at the start and some dashes in the right places */ - if (g_str_has_prefix (userid, "FP1-") && strlen(userid) >= 24 && - userid[12] == '-' && userid[14] == '-' && userid[23] == '-') { - g_autofree gchar *copy = g_strdup(userid); - gint32 date_ymd; - GDate *date = NULL; - gint32 finger; - gchar *username; - /* Try to parse information from the string. */ + print = fp_print_new (FP_DEVICE (self)); + uid = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, + get_enroll_templates_resp->templates[n].user_id, + get_enroll_templates_resp->templates[n].user_id_len, + 1); + data = g_variant_new ("(y@ay)", + get_enroll_templates_resp->templates[n].finger_id, + uid); - copy[12] = '\0'; - date_ymd = g_ascii_strtod (copy + 4, NULL); - if (date_ymd > 0) - date = g_date_new_dmy (date_ymd % 100, - (date_ymd / 100) % 100, - date_ymd / 10000); - else - date = g_date_new (); + fpi_print_set_type (print, FP_PRINT_RAW); + fpi_print_set_device_stored (print, TRUE); + g_object_set (print, "fp-data", data, NULL); + g_object_set (print, "description", get_enroll_templates_resp->templates[n].user_id, NULL); - fp_print_set_enroll_date (print, date); - g_date_free (date); + /* The format has 24 bytes at the start and some dashes in the right places */ + if (g_str_has_prefix (userid, "FP1-") && strlen (userid) >= 24 && + userid[12] == '-' && userid[14] == '-' && userid[23] == '-') + { + g_autofree gchar *copy = g_strdup (userid); + gint32 date_ymd; + GDate *date = NULL; + gint32 finger; + gchar *username; + /* Try to parse information from the string. */ - copy[14] = '\0'; - finger = g_ascii_strtoll (copy + 13, NULL, 16); - fp_print_set_finger (print, finger); + copy[12] = '\0'; + date_ymd = g_ascii_strtod (copy + 4, NULL); + if (date_ymd > 0) + date = g_date_new_dmy (date_ymd % 100, + (date_ymd / 100) % 100, + date_ymd / 10000); + else + date = g_date_new (); - /* We ignore the next chunk, it is just random data. - * Then comes the username; nobody is the default if the metadata - * is unknown */ - username = copy + 24; - if (strlen(username) > 0 && g_strcmp0 (username, "nobody") != 0) - fp_print_set_username (print, username); - } + fp_print_set_enroll_date (print, date); + g_date_free (date); - g_ptr_array_add (self->list_result, g_object_ref_sink (print)); - } + copy[14] = '\0'; + finger = g_ascii_strtoll (copy + 13, NULL, 16); + fp_print_set_finger (print, finger); - synaptics_sensor_cmd (self, - self->cmd_seq_num, - BMKT_CMD_GET_NEXT_QUERY_RESPONSE, - NULL, - 0, - NULL); + /* We ignore the next chunk, it is just random data. + * Then comes the username; nobody is the default if the metadata + * is unknown */ + username = copy + 24; + if (strlen (username) > 0 && g_strcmp0 (username, "nobody") != 0) + fp_print_set_username (print, username); + } - break; - } + g_ptr_array_add (self->list_result, g_object_ref_sink (print)); + } + + synaptics_sensor_cmd (self, + self->cmd_seq_num, + BMKT_CMD_GET_NEXT_QUERY_RESPONSE, + NULL, + 0, + NULL); + + break; + } } static void -list(FpDevice *device) +list (FpDevice *device) { - FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (device); + FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (device); - G_DEBUG_HERE(); + G_DEBUG_HERE (); - self->list_result = g_ptr_array_new_with_free_func (g_object_unref); - synaptics_sensor_cmd (self, 0, BMKT_CMD_GET_TEMPLATE_RECORDS, NULL, 0, list_msg_cb); + self->list_result = g_ptr_array_new_with_free_func (g_object_unref); + synaptics_sensor_cmd (self, 0, BMKT_CMD_GET_TEMPLATE_RECORDS, NULL, 0, list_msg_cb); } static void -verify_msg_cb(FpiDeviceSynaptics *self, - bmkt_response_t *resp, - GError *error) +verify_msg_cb (FpiDeviceSynaptics *self, + bmkt_response_t *resp, + GError *error) { - FpDevice *device = FP_DEVICE (self); - bmkt_verify_resp_t *verify_resp; + FpDevice *device = FP_DEVICE (self); + bmkt_verify_resp_t *verify_resp; - if (error) { - fpi_device_verify_complete (device, FPI_MATCH_ERROR, NULL, error); - return; - } + if (error) + { + fpi_device_verify_complete (device, FPI_MATCH_ERROR, NULL, error); + return; + } - if (resp == NULL && self->cmd_complete_on_removal) { - fpi_device_verify_complete (device, - GPOINTER_TO_INT (self->cmd_complete_data), - NULL, - error); - return; - } + if (resp == NULL && self->cmd_complete_on_removal) + { + fpi_device_verify_complete (device, + GPOINTER_TO_INT (self->cmd_complete_data), + NULL, + error); + return; + } - verify_resp = &resp->response.verify_resp; + verify_resp = &resp->response.verify_resp; - switch (resp->response_id) - { - case BMKT_RSP_VERIFY_READY: - fp_info("Place Finger on the Sensor!"); - break; + switch (resp->response_id) + { + case BMKT_RSP_VERIFY_READY: + fp_info ("Place Finger on the Sensor!"); + break; - case BMKT_RSP_CAPTURE_COMPLETE: - fp_info("Fingerprint image capture complete!"); - break; + case BMKT_RSP_CAPTURE_COMPLETE: + fp_info ("Fingerprint image capture complete!"); + break; - case BMKT_RSP_VERIFY_FAIL: - if(resp->result == BMKT_SENSOR_STIMULUS_ERROR) { - fp_dbg ("delaying retry error until after finger removal!"); - self->cmd_complete_on_removal = TRUE; - self->cmd_complete_data = GINT_TO_POINTER (FPI_MATCH_ERROR); - self->cmd_complete_error = fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL); - } else if (resp->result == BMKT_FP_NO_MATCH) { - fp_dbg ("delaying match failure until after finger removal!"); - self->cmd_complete_on_removal = TRUE; - self->cmd_complete_data = GINT_TO_POINTER (FPI_MATCH_FAIL); - self->cmd_complete_error = NULL; - } else if (BMKT_FP_DATABASE_NO_RECORD_EXISTS) { - fp_info("Print is not in database"); - fpi_device_verify_complete (device, - FPI_MATCH_ERROR, - NULL, - fpi_device_error_new (FP_DEVICE_ERROR_DATA_NOT_FOUND)); - } else { - fp_warn("Verify has failed: %d", resp->result); - fpi_device_verify_complete (device, FPI_MATCH_FAIL, NULL, NULL); - } - break; + case BMKT_RSP_VERIFY_FAIL: + if(resp->result == BMKT_SENSOR_STIMULUS_ERROR) + { + fp_dbg ("delaying retry error until after finger removal!"); + self->cmd_complete_on_removal = TRUE; + self->cmd_complete_data = GINT_TO_POINTER (FPI_MATCH_ERROR); + self->cmd_complete_error = fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL); + } + else if (resp->result == BMKT_FP_NO_MATCH) + { + fp_dbg ("delaying match failure until after finger removal!"); + self->cmd_complete_on_removal = TRUE; + self->cmd_complete_data = GINT_TO_POINTER (FPI_MATCH_FAIL); + self->cmd_complete_error = NULL; + } + else if (BMKT_FP_DATABASE_NO_RECORD_EXISTS) + { + fp_info ("Print is not in database"); + fpi_device_verify_complete (device, + FPI_MATCH_ERROR, + NULL, + fpi_device_error_new (FP_DEVICE_ERROR_DATA_NOT_FOUND)); + } + else + { + fp_warn ("Verify has failed: %d", resp->result); + fpi_device_verify_complete (device, FPI_MATCH_FAIL, NULL, NULL); + } + break; - case BMKT_RSP_VERIFY_OK: - fp_info("Verify was successful! for user: %s finger: %d score: %f", - verify_resp->user_id, verify_resp->finger_id, verify_resp->match_result); - fpi_device_verify_complete (device, FPI_MATCH_SUCCESS, NULL, NULL); - break; - } + case BMKT_RSP_VERIFY_OK: + fp_info ("Verify was successful! for user: %s finger: %d score: %f", + verify_resp->user_id, verify_resp->finger_id, verify_resp->match_result); + fpi_device_verify_complete (device, FPI_MATCH_SUCCESS, NULL, NULL); + break; + } } static void -verify(FpDevice *device) +verify (FpDevice *device) { - FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (device); - FpPrint *print = NULL; - g_autoptr(GVariant) data = NULL; - guint8 finger; - const guint8 *user_id; - gsize user_id_len = 0; + FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (device); + FpPrint *print = NULL; - fpi_device_get_verify_data (device, &print); + g_autoptr(GVariant) data = NULL; + guint8 finger; + const guint8 *user_id; + gsize user_id_len = 0; - g_object_get (print, "fp-data", &data, NULL); - g_debug ("data is %p", data); - if (!parse_print_data (data, &finger, &user_id, &user_id_len)) { - fpi_device_verify_complete (device, - FPI_MATCH_ERROR, - NULL, - fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID)); - return; - } + fpi_device_get_verify_data (device, &print); - G_DEBUG_HERE(); + g_object_get (print, "fp-data", &data, NULL); + g_debug ("data is %p", data); + if (!parse_print_data (data, &finger, &user_id, &user_id_len)) + { + fpi_device_verify_complete (device, + FPI_MATCH_ERROR, + NULL, + fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID)); + return; + } - synaptics_sensor_cmd (self, 0, BMKT_CMD_VERIFY_USER, user_id, user_id_len, verify_msg_cb); + G_DEBUG_HERE (); + + synaptics_sensor_cmd (self, 0, BMKT_CMD_VERIFY_USER, user_id, user_id_len, verify_msg_cb); } static void -enroll_msg_cb(FpiDeviceSynaptics *self, - bmkt_response_t *resp, - GError *error) +enroll_msg_cb (FpiDeviceSynaptics *self, + bmkt_response_t *resp, + GError *error) { - FpDevice *device = FP_DEVICE (self); - bmkt_enroll_resp_t *enroll_resp; + FpDevice *device = FP_DEVICE (self); + bmkt_enroll_resp_t *enroll_resp; - if (error) { - fpi_device_enroll_complete (device, NULL, error); - return; - } + if (error) + { + fpi_device_enroll_complete (device, NULL, error); + return; + } - enroll_resp = &resp->response.enroll_resp; + enroll_resp = &resp->response.enroll_resp; - switch (resp->response_id) - { - case BMKT_RSP_ENROLL_READY: - { - self->enroll_stage = 0; - fp_info("Place Finger on the Sensor!"); - break; - } - case BMKT_RSP_CAPTURE_COMPLETE: - { - fp_info("Fingerprint image capture complete!"); - break; - } - case BMKT_RSP_ENROLL_REPORT: - { - gint done_stages; - fp_info("Enrollment is %d %% ", enroll_resp->progress); + switch (resp->response_id) + { + case BMKT_RSP_ENROLL_READY: + { + self->enroll_stage = 0; + fp_info ("Place Finger on the Sensor!"); + break; + } - done_stages = (enroll_resp->progress * ENROLL_SAMPLES + 99) / 100; - if (enroll_resp->progress < 100) - done_stages = MIN(done_stages, ENROLL_SAMPLES - 1); + case BMKT_RSP_CAPTURE_COMPLETE: + { + fp_info ("Fingerprint image capture complete!"); + break; + } - /* Emit a retry error if there has been no discernable - * progress. Some firmware revisions report more required - * touches. */ - if (self->enroll_stage == done_stages) - fpi_device_enroll_progress (device, - done_stages, - NULL, - fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL)); + case BMKT_RSP_ENROLL_REPORT: + { + gint done_stages; + fp_info ("Enrollment is %d %% ", enroll_resp->progress); - while (self->enroll_stage < done_stages) { - self->enroll_stage += 1; - fpi_device_enroll_progress (device, self->enroll_stage, NULL, NULL); - } - break; - } - case BMKT_RSP_ENROLL_PAUSED: - { - fp_info("Enrollment has been paused!"); - break; - } - case BMKT_RSP_ENROLL_RESUMED: - { - fp_info("Enrollment has been resumed!"); - break; - } - case BMKT_RSP_ENROLL_FAIL: - { - fp_info("Enrollment has failed!: %d", resp->result); - if (resp->result == BMKT_FP_DATABASE_FULL) - fpi_device_enroll_complete (device, - NULL, - fpi_device_error_new (FP_DEVICE_ERROR_DATA_FULL)); - else - fpi_device_enroll_complete (device, - NULL, - fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, - "Enrollment failed")); - break; - } - case BMKT_RSP_ENROLL_OK: - { - FpPrint *print = NULL; + done_stages = (enroll_resp->progress * ENROLL_SAMPLES + 99) / 100; + if (enroll_resp->progress < 100) + done_stages = MIN (done_stages, ENROLL_SAMPLES - 1); - fp_info("Enrollment was successful!"); + /* Emit a retry error if there has been no discernable + * progress. Some firmware revisions report more required + * touches. */ + if (self->enroll_stage == done_stages) + { + fpi_device_enroll_progress (device, + done_stages, + NULL, + fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL)); + } - fpi_device_get_enroll_data (device, &print); + while (self->enroll_stage < done_stages) + { + self->enroll_stage += 1; + fpi_device_enroll_progress (device, self->enroll_stage, NULL, NULL); + } + break; + } - fpi_device_enroll_complete (device, g_object_ref (print), NULL); - break; - } - } + case BMKT_RSP_ENROLL_PAUSED: + { + fp_info ("Enrollment has been paused!"); + break; + } + + case BMKT_RSP_ENROLL_RESUMED: + { + fp_info ("Enrollment has been resumed!"); + break; + } + + case BMKT_RSP_ENROLL_FAIL: + { + fp_info ("Enrollment has failed!: %d", resp->result); + if (resp->result == BMKT_FP_DATABASE_FULL) + { + fpi_device_enroll_complete (device, + NULL, + fpi_device_error_new (FP_DEVICE_ERROR_DATA_FULL)); + } + else + { + fpi_device_enroll_complete (device, + NULL, + fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, + "Enrollment failed")); + } + break; + } + + case BMKT_RSP_ENROLL_OK: + { + FpPrint *print = NULL; + + fp_info ("Enrollment was successful!"); + + fpi_device_get_enroll_data (device, &print); + + fpi_device_enroll_complete (device, g_object_ref (print), NULL); + break; + } + } } #define TEMPLATE_ID_SIZE 20 static void -enroll(FpDevice *device) +enroll (FpDevice *device) { - FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (device); - FpPrint *print = NULL; - GVariant *data = NULL; - GVariant *uid = NULL; - const gchar *username; - guint finger; - g_autofree gchar *user_id; - gssize user_id_len; - g_autofree guint8 *payload = NULL; - const GDate *date; - gint y, m, d; - gint32 rand_id = 0; + FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (device); + FpPrint *print = NULL; + GVariant *data = NULL; + GVariant *uid = NULL; + const gchar *username; + guint finger; + g_autofree gchar *user_id; + gssize user_id_len; + g_autofree guint8 *payload = NULL; + const GDate *date; + gint y, m, d; + gint32 rand_id = 0; - fpi_device_get_enroll_data (device, &print); + fpi_device_get_enroll_data (device, &print); - G_DEBUG_HERE(); + G_DEBUG_HERE (); - date = fp_print_get_enroll_date (print); - if (date && g_date_valid (date)) { - y = date->year; - m = date->month; - d = date->day; - } else { - y = 0; - m = 0; - d = 0; - } + date = fp_print_get_enroll_date (print); + if (date && g_date_valid (date)) + { + y = date->year; + m = date->month; + d = date->day; + } + else + { + y = 0; + m = 0; + d = 0; + } - username = fp_print_get_username (print); - if (!username) - username = "nobody"; + username = fp_print_get_username (print); + if (!username) + username = "nobody"; - if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0) - rand_id = 0; - else - rand_id = g_random_int(); + if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0) + rand_id = 0; + else + rand_id = g_random_int (); - user_id = g_strdup_printf ("FP1-%04d%02d%02d-%X-%08X-%s", - y, m, d, - fp_print_get_finger (print), - rand_id, - username); + user_id = g_strdup_printf ("FP1-%04d%02d%02d-%X-%08X-%s", + y, m, d, + fp_print_get_finger (print), + rand_id, + username); - user_id_len = strlen (user_id); - user_id_len = MIN(BMKT_MAX_USER_ID_LEN, user_id_len); + user_id_len = strlen (user_id); + user_id_len = MIN (BMKT_MAX_USER_ID_LEN, user_id_len); - /* We currently always use finger 1 from the devices piont of view */ - finger = 1; + /* We currently always use finger 1 from the devices piont of view */ + finger = 1; - uid = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, - user_id, - user_id_len, - 1); - data = g_variant_new ("(y@ay)", - finger, - uid); + uid = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, + user_id, + user_id_len, + 1); + data = g_variant_new ("(y@ay)", + finger, + uid); - fpi_print_set_type (print, FP_PRINT_RAW); - fpi_print_set_device_stored (print, TRUE); - g_object_set (print, "fp-data", data, NULL); - g_object_set (print, "description", user_id, NULL); + fpi_print_set_type (print, FP_PRINT_RAW); + fpi_print_set_device_stored (print, TRUE); + g_object_set (print, "fp-data", data, NULL); + g_object_set (print, "description", user_id, NULL); - g_debug("user_id: %s, finger: %d", user_id, finger); + g_debug ("user_id: %s, finger: %d", user_id, finger); - payload = g_malloc0(user_id_len + 2); + payload = g_malloc0 (user_id_len + 2); - /* Backup options are not supported for Prometheus */ - payload[0] = 0; - payload[1] = finger; - memcpy (payload + 2, user_id, user_id_len); + /* Backup options are not supported for Prometheus */ + payload[0] = 0; + payload[1] = finger; + memcpy (payload + 2, user_id, user_id_len); - synaptics_sensor_cmd (self, 0, BMKT_CMD_ENROLL_USER, payload, user_id_len + 2, enroll_msg_cb); + synaptics_sensor_cmd (self, 0, BMKT_CMD_ENROLL_USER, payload, user_id_len + 2, enroll_msg_cb); } static void -delete_msg_cb(FpiDeviceSynaptics *self, - bmkt_response_t *resp, - GError *error) +delete_msg_cb (FpiDeviceSynaptics *self, + bmkt_response_t *resp, + GError *error) { - FpDevice *device = FP_DEVICE (self); - bmkt_del_user_resp_t *del_user_resp; + FpDevice *device = FP_DEVICE (self); + bmkt_del_user_resp_t *del_user_resp; - if (error) { - fpi_device_delete_complete (device, error); - return; - } + if (error) + { + fpi_device_delete_complete (device, error); + return; + } - del_user_resp = &resp->response.del_user_resp; + del_user_resp = &resp->response.del_user_resp; - switch (resp->response_id) - { - case BMKT_RSP_DELETE_PROGRESS: - fp_info("Deleting Enrolled Users is %d%% complete", - del_user_resp->progress); - break; - case BMKT_RSP_DEL_USER_FP_FAIL: - fp_info("Failed to delete enrolled user: %d", resp->result); - if (resp->result == BMKT_FP_DATABASE_NO_RECORD_EXISTS) - fpi_device_delete_complete (device, - fpi_device_error_new (FP_DEVICE_ERROR_DATA_NOT_FOUND)); - else - fpi_device_delete_complete (device, - fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); - break; - case BMKT_RSP_DEL_USER_FP_OK: - fp_info("Successfully deleted enrolled user"); - fpi_device_delete_complete (device, NULL); - break; - } + switch (resp->response_id) + { + case BMKT_RSP_DELETE_PROGRESS: + fp_info ("Deleting Enrolled Users is %d%% complete", + del_user_resp->progress); + break; + + case BMKT_RSP_DEL_USER_FP_FAIL: + fp_info ("Failed to delete enrolled user: %d", resp->result); + if (resp->result == BMKT_FP_DATABASE_NO_RECORD_EXISTS) + fpi_device_delete_complete (device, + fpi_device_error_new (FP_DEVICE_ERROR_DATA_NOT_FOUND)); + else + fpi_device_delete_complete (device, + fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); + break; + + case BMKT_RSP_DEL_USER_FP_OK: + fp_info ("Successfully deleted enrolled user"); + fpi_device_delete_complete (device, NULL); + break; + } } static void -delete_print(FpDevice *device) +delete_print (FpDevice *device) { - FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (device); - FpPrint *print = NULL; - g_autoptr(GVariant) data = NULL; - guint8 finger; - const guint8 *user_id; - gsize user_id_len = 0; - g_autofree guint8 *payload = NULL; + FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (device); + FpPrint *print = NULL; - fpi_device_get_delete_data (device, &print); + g_autoptr(GVariant) data = NULL; + guint8 finger; + const guint8 *user_id; + gsize user_id_len = 0; + g_autofree guint8 *payload = NULL; - g_object_get (print, "fp-data", &data, NULL); - g_debug ("data is %p", data); - if (!parse_print_data (data, &finger, &user_id, &user_id_len)) { - fpi_device_delete_complete (device, - fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID)); - return; - } + fpi_device_get_delete_data (device, &print); - G_DEBUG_HERE(); + g_object_get (print, "fp-data", &data, NULL); + g_debug ("data is %p", data); + if (!parse_print_data (data, &finger, &user_id, &user_id_len)) + { + fpi_device_delete_complete (device, + fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID)); + return; + } - payload = g_malloc0 (1 + user_id_len); - payload[0] = finger; - memcpy (payload + 1, user_id, user_id_len); + G_DEBUG_HERE (); - synaptics_sensor_cmd (self, 0, BMKT_CMD_DEL_USER_FP, payload, user_id_len + 1, delete_msg_cb); + payload = g_malloc0 (1 + user_id_len); + payload[0] = finger; + memcpy (payload + 1, user_id, user_id_len); + + synaptics_sensor_cmd (self, 0, BMKT_CMD_DEL_USER_FP, payload, user_id_len + 1, delete_msg_cb); } static void -dev_probe(FpDevice *device) +dev_probe (FpDevice *device) { - FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (device); - GUsbDevice *usb_dev; - FpiUsbTransfer *transfer; - FpiByteReader reader; - GError *error = NULL; - guint16 status; - const guint8 *data; - gboolean read_ok = TRUE; - g_autofree gchar *serial = NULL; + FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (device); + GUsbDevice *usb_dev; + FpiUsbTransfer *transfer; + FpiByteReader reader; + GError *error = NULL; + guint16 status; + const guint8 *data; + gboolean read_ok = TRUE; + g_autofree gchar *serial = NULL; - G_DEBUG_HERE(); + G_DEBUG_HERE (); - /* Claim usb interface */ - usb_dev = fpi_device_get_usb_device(device); - if (!g_usb_device_open (usb_dev, &error)) { - fpi_device_probe_complete (device, NULL, NULL, error); - return; - } + /* Claim usb interface */ + usb_dev = fpi_device_get_usb_device (device); + if (!g_usb_device_open (usb_dev, &error)) + { + fpi_device_probe_complete (device, NULL, NULL, error); + return; + } - if (!g_usb_device_reset (fpi_device_get_usb_device (device), &error)) { - fpi_device_probe_complete (device, NULL, NULL, error); - return; - } + if (!g_usb_device_reset (fpi_device_get_usb_device (device), &error)) + { + fpi_device_probe_complete (device, NULL, NULL, error); + return; + } - if (!g_usb_device_claim_interface (fpi_device_get_usb_device(device), 0, 0, &error)) - goto err_close; + if (!g_usb_device_claim_interface (fpi_device_get_usb_device (device), 0, 0, &error)) + goto err_close; - /* TODO: Do not do this synchronous. */ - transfer = fpi_usb_transfer_new (device); - fpi_usb_transfer_fill_bulk (transfer, USB_EP_REQUEST, SENSOR_FW_CMD_HEADER_LEN); - transfer->short_is_error = TRUE; - transfer->buffer[0] = SENSOR_CMD_GET_VERSION; - if (!fpi_usb_transfer_submit_sync (transfer, 1000, &error)) - goto err_close; - fpi_usb_transfer_unref (transfer); + /* TODO: Do not do this synchronous. */ + transfer = fpi_usb_transfer_new (device); + fpi_usb_transfer_fill_bulk (transfer, USB_EP_REQUEST, SENSOR_FW_CMD_HEADER_LEN); + transfer->short_is_error = TRUE; + transfer->buffer[0] = SENSOR_CMD_GET_VERSION; + if (!fpi_usb_transfer_submit_sync (transfer, 1000, &error)) + goto err_close; + fpi_usb_transfer_unref (transfer); - transfer = fpi_usb_transfer_new (device); - fpi_usb_transfer_fill_bulk (transfer, USB_EP_REPLY, 40); - if (!fpi_usb_transfer_submit_sync (transfer, 1000, &error)) - goto err_close; + transfer = fpi_usb_transfer_new (device); + fpi_usb_transfer_fill_bulk (transfer, USB_EP_REPLY, 40); + if (!fpi_usb_transfer_submit_sync (transfer, 1000, &error)) + goto err_close; - fpi_byte_reader_init (&reader, transfer->buffer, transfer->actual_length); + fpi_byte_reader_init (&reader, transfer->buffer, transfer->actual_length); - if (!fpi_byte_reader_get_uint16_le (&reader, &status)) { - g_warning ("Transfer in response to version query was too short"); - error = fpi_device_error_new (FP_DEVICE_ERROR_PROTO); - goto err_close; - } - if (status != 0) { - g_warning ("Device responded with error: %d", status); - error = fpi_device_error_new (FP_DEVICE_ERROR_PROTO); - goto err_close; - } + if (!fpi_byte_reader_get_uint16_le (&reader, &status)) + { + g_warning ("Transfer in response to version query was too short"); + error = fpi_device_error_new (FP_DEVICE_ERROR_PROTO); + goto err_close; + } + if (status != 0) + { + g_warning ("Device responded with error: %d", status); + error = fpi_device_error_new (FP_DEVICE_ERROR_PROTO); + goto err_close; + } - read_ok &= fpi_byte_reader_get_uint32_le (&reader, &self->mis_version.build_time); - read_ok &= fpi_byte_reader_get_uint32_le (&reader, &self->mis_version.build_num); - read_ok &= fpi_byte_reader_get_uint8 (&reader, &self->mis_version.version_major); - read_ok &= fpi_byte_reader_get_uint8 (&reader, &self->mis_version.version_minor); - read_ok &= fpi_byte_reader_get_uint8 (&reader, &self->mis_version.target); - read_ok &= fpi_byte_reader_get_uint8 (&reader, &self->mis_version.product); + read_ok &= fpi_byte_reader_get_uint32_le (&reader, &self->mis_version.build_time); + read_ok &= fpi_byte_reader_get_uint32_le (&reader, &self->mis_version.build_num); + read_ok &= fpi_byte_reader_get_uint8 (&reader, &self->mis_version.version_major); + read_ok &= fpi_byte_reader_get_uint8 (&reader, &self->mis_version.version_minor); + read_ok &= fpi_byte_reader_get_uint8 (&reader, &self->mis_version.target); + read_ok &= fpi_byte_reader_get_uint8 (&reader, &self->mis_version.product); - read_ok &= fpi_byte_reader_get_uint8 (&reader, &self->mis_version.silicon_rev); - read_ok &= fpi_byte_reader_get_uint8 (&reader, &self->mis_version.formal_release); - read_ok &= fpi_byte_reader_get_uint8 (&reader, &self->mis_version.platform); - read_ok &= fpi_byte_reader_get_uint8 (&reader, &self->mis_version.patch); - if (fpi_byte_reader_get_data (&reader, sizeof(self->mis_version.serial_number), &data)) - memcpy (self->mis_version.serial_number, data, sizeof(self->mis_version.serial_number)); - else - read_ok = FALSE; - read_ok &= fpi_byte_reader_get_uint16_le (&reader, &self->mis_version.security); - read_ok &= fpi_byte_reader_get_uint8 (&reader, &self->mis_version.iface); - read_ok &= fpi_byte_reader_get_uint8 (&reader, &self->mis_version.device_type); + read_ok &= fpi_byte_reader_get_uint8 (&reader, &self->mis_version.silicon_rev); + read_ok &= fpi_byte_reader_get_uint8 (&reader, &self->mis_version.formal_release); + read_ok &= fpi_byte_reader_get_uint8 (&reader, &self->mis_version.platform); + read_ok &= fpi_byte_reader_get_uint8 (&reader, &self->mis_version.patch); + if (fpi_byte_reader_get_data (&reader, sizeof (self->mis_version.serial_number), &data)) + memcpy (self->mis_version.serial_number, data, sizeof (self->mis_version.serial_number)); + else + read_ok = FALSE; + read_ok &= fpi_byte_reader_get_uint16_le (&reader, &self->mis_version.security); + read_ok &= fpi_byte_reader_get_uint8 (&reader, &self->mis_version.iface); + read_ok &= fpi_byte_reader_get_uint8 (&reader, &self->mis_version.device_type); - if (!read_ok) { - g_warning ("Transfer in response to verison query was too short"); - error = fpi_device_error_new (FP_DEVICE_ERROR_PROTO); - goto err_close; - } + if (!read_ok) + { + g_warning ("Transfer in response to verison query was too short"); + error = fpi_device_error_new (FP_DEVICE_ERROR_PROTO); + goto err_close; + } - fp_dbg("Build Time: %d", self->mis_version.build_time); - fp_dbg("Build Num: %d", self->mis_version.build_num); - fp_dbg("Version: %d.%d", self->mis_version.version_major, self->mis_version.version_minor); - fp_dbg("Target: %d", self->mis_version.target); - fp_dbg("Product: %d", self->mis_version.product); + fp_dbg ("Build Time: %d", self->mis_version.build_time); + fp_dbg ("Build Num: %d", self->mis_version.build_num); + fp_dbg ("Version: %d.%d", self->mis_version.version_major, self->mis_version.version_minor); + fp_dbg ("Target: %d", self->mis_version.target); + fp_dbg ("Product: %d", self->mis_version.product); - fpi_usb_transfer_unref (transfer); + fpi_usb_transfer_unref (transfer); - /* We need at least firmware version 10.1, and for 10.1 build 2989158 */ - if (self->mis_version.version_major < 10 || - self->mis_version.version_minor < 1 || - (self->mis_version.version_major == 10 && - self->mis_version.version_minor == 1 && - self->mis_version.build_num < 2989158)) - { - fp_warn ("Firmware version %d.%d with build number %d is unsupported", - self->mis_version.version_major, - self->mis_version.version_minor, - self->mis_version.build_num); + /* We need at least firmware version 10.1, and for 10.1 build 2989158 */ + if (self->mis_version.version_major < 10 || + self->mis_version.version_minor < 1 || + (self->mis_version.version_major == 10 && + self->mis_version.version_minor == 1 && + self->mis_version.build_num < 2989158)) + { + fp_warn ("Firmware version %d.%d with build number %d is unsupported", + self->mis_version.version_major, + self->mis_version.version_minor, + self->mis_version.build_num); - error = fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, - "Unsupported firmware version"); - goto err_close; - } + error = fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, + "Unsupported firmware version"); + goto err_close; + } - /* This is the same as the serial_number from above, hex encoded and somewhat reordered */ - /* Should we add in more, e.g. the chip revision? */ - if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0) - serial = g_strdup ("emulated-device"); - else - serial = g_usb_device_get_string_descriptor (usb_dev, - g_usb_device_get_serial_number_index (usb_dev), - &error); + /* This is the same as the serial_number from above, hex encoded and somewhat reordered */ + /* Should we add in more, e.g. the chip revision? */ + if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0) + serial = g_strdup ("emulated-device"); + else + serial = g_usb_device_get_string_descriptor (usb_dev, + g_usb_device_get_serial_number_index (usb_dev), + &error); - g_usb_device_close (usb_dev, NULL); + g_usb_device_close (usb_dev, NULL); - fpi_device_probe_complete (device, serial, NULL, error); + fpi_device_probe_complete (device, serial, NULL, error); - return; + return; err_close: - g_usb_device_close (usb_dev, NULL); - fpi_device_probe_complete (device, NULL, NULL, error); + g_usb_device_close (usb_dev, NULL); + fpi_device_probe_complete (device, NULL, NULL, error); } static void -fps_init_msg_cb(FpiDeviceSynaptics *self, - bmkt_response_t *resp, - GError *error) +fps_init_msg_cb (FpiDeviceSynaptics *self, + bmkt_response_t *resp, + GError *error) { - if (error) { - fpi_device_open_complete (FP_DEVICE (self), error); - return; - } + if (error) + { + fpi_device_open_complete (FP_DEVICE (self), error); + return; + } - /* BMKT_OPERATION_DENIED is returned if the sensor is already initialized */ - if (resp->result == BMKT_SUCCESS || resp->result == BMKT_OPERATION_DENIED) { - fpi_device_open_complete (FP_DEVICE (self), NULL); - } else { - g_warning ("Initializing fingerprint sensor failed with %d!", resp->result); - fpi_device_open_complete (FP_DEVICE (self), - fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); - } + /* BMKT_OPERATION_DENIED is returned if the sensor is already initialized */ + if (resp->result == BMKT_SUCCESS || resp->result == BMKT_OPERATION_DENIED) + { + fpi_device_open_complete (FP_DEVICE (self), NULL); + } + else + { + g_warning ("Initializing fingerprint sensor failed with %d!", resp->result); + fpi_device_open_complete (FP_DEVICE (self), + fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); + } } static void -fps_deinit_cb(FpiDeviceSynaptics *self, - bmkt_response_t *resp, - GError *error) +fps_deinit_cb (FpiDeviceSynaptics *self, + bmkt_response_t *resp, + GError *error) { - /* Release usb interface */ - g_usb_device_release_interface(fpi_device_get_usb_device(FP_DEVICE (self)), 0, 0, &error); + /* Release usb interface */ + g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (self)), 0, 0, &error); - g_clear_object (&self->interrupt_cancellable); + g_clear_object (&self->interrupt_cancellable); - if (!error) { - switch (resp->response_id) { - case BMKT_RSP_POWER_DOWN_READY: - fp_info("Fingerprint sensor ready to be powered down"); - break; - case BMKT_RSP_POWER_DOWN_FAIL: - fp_info("Failed to go to power down mode: %d", resp->result); - error = fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, - "Power down failed"); + if (!error) + { + switch (resp->response_id) + { + case BMKT_RSP_POWER_DOWN_READY: + fp_info ("Fingerprint sensor ready to be powered down"); + break; - break; - } - } - fpi_device_close_complete(FP_DEVICE (self), error); + case BMKT_RSP_POWER_DOWN_FAIL: + fp_info ("Failed to go to power down mode: %d", resp->result); + error = fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, + "Power down failed"); + + break; + } + } + fpi_device_close_complete (FP_DEVICE (self), error); } static void dev_init (FpDevice *device) { - FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (device); - GError *error = NULL; + FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (device); + GError *error = NULL; - G_DEBUG_HERE(); + G_DEBUG_HERE (); - self->interrupt_cancellable = g_cancellable_new (); + self->interrupt_cancellable = g_cancellable_new (); - if (!g_usb_device_reset (fpi_device_get_usb_device (device), &error)) - goto error; + if (!g_usb_device_reset (fpi_device_get_usb_device (device), &error)) + goto error; - /* Claim usb interface */ - if (!g_usb_device_claim_interface (fpi_device_get_usb_device (device), 0, 0, &error)) - goto error; + /* Claim usb interface */ + if (!g_usb_device_claim_interface (fpi_device_get_usb_device (device), 0, 0, &error)) + goto error; - synaptics_sensor_cmd (self, 0, BMKT_CMD_FPS_INIT, NULL, 0, fps_init_msg_cb); + synaptics_sensor_cmd (self, 0, BMKT_CMD_FPS_INIT, NULL, 0, fps_init_msg_cb); - return; + return; error: - fpi_device_open_complete (FP_DEVICE (self), error); + fpi_device_open_complete (FP_DEVICE (self), error); } static void -dev_exit(FpDevice *device) +dev_exit (FpDevice *device) { - FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (device); + FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (device); - G_DEBUG_HERE(); + G_DEBUG_HERE (); - synaptics_sensor_cmd (self, 0, BMKT_CMD_POWER_DOWN_NOTIFY, NULL, 0, fps_deinit_cb); + synaptics_sensor_cmd (self, 0, BMKT_CMD_POWER_DOWN_NOTIFY, NULL, 0, fps_deinit_cb); } static void -cancel(FpDevice *dev) +cancel (FpDevice *dev) { - FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS(dev); + FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (dev); - /* We just send out a cancel command and hope for the best. */ - synaptics_sensor_cmd (self, -1, BMKT_CMD_CANCEL_OP, NULL, 0, NULL); + /* We just send out a cancel command and hope for the best. */ + synaptics_sensor_cmd (self, -1, BMKT_CMD_CANCEL_OP, NULL, 0, NULL); - /* Cancel any current interrupt transfer (resulting us to go into - * response reading mode again); then create a new cancellable - * for the next transfers. */ - g_cancellable_cancel (self->interrupt_cancellable); - g_clear_object (&self->interrupt_cancellable); - self->interrupt_cancellable = g_cancellable_new (); + /* Cancel any current interrupt transfer (resulting us to go into + * response reading mode again); then create a new cancellable + * for the next transfers. */ + g_cancellable_cancel (self->interrupt_cancellable); + g_clear_object (&self->interrupt_cancellable); + self->interrupt_cancellable = g_cancellable_new (); } static void -fpi_device_synaptics_init(FpiDeviceSynaptics *self) { +fpi_device_synaptics_init (FpiDeviceSynaptics *self) +{ } static void -fpi_device_synaptics_class_init(FpiDeviceSynapticsClass *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); +fpi_device_synaptics_class_init (FpiDeviceSynapticsClass *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); - dev_class->id = FP_COMPONENT; - dev_class->full_name = SYNAPTICS_DRIVER_FULLNAME; + dev_class->id = FP_COMPONENT; + dev_class->full_name = SYNAPTICS_DRIVER_FULLNAME; - dev_class->type = FP_DEVICE_TYPE_USB; - dev_class->scan_type = FP_SCAN_TYPE_PRESS; - dev_class->id_table = id_table; - dev_class->nr_enroll_stages = ENROLL_SAMPLES; + dev_class->type = FP_DEVICE_TYPE_USB; + dev_class->scan_type = FP_SCAN_TYPE_PRESS; + dev_class->id_table = id_table; + dev_class->nr_enroll_stages = ENROLL_SAMPLES; - dev_class->open = dev_init; - dev_class->close = dev_exit; - dev_class->probe = dev_probe; - dev_class->verify = verify; - dev_class->enroll = enroll; - dev_class->delete = delete_print; - dev_class->cancel = cancel; - dev_class->list = list; + dev_class->open = dev_init; + dev_class->close = dev_exit; + dev_class->probe = dev_probe; + dev_class->verify = verify; + dev_class->enroll = enroll; + dev_class->delete = delete_print; + dev_class->cancel = cancel; + dev_class->list = list; } diff --git a/libfprint/drivers/synaptics/synaptics.h b/libfprint/drivers/synaptics/synaptics.h index a0bc0b8..cce6be9 100644 --- a/libfprint/drivers/synaptics/synaptics.h +++ b/libfprint/drivers/synaptics/synaptics.h @@ -22,109 +22,109 @@ #include "fpi-device.h" #include "fpi-ssm.h" -#define SYNAPTICS_VENDOR_ID 0x06cb +#define SYNAPTICS_VENDOR_ID 0x06cb -G_DECLARE_FINAL_TYPE(FpiDeviceSynaptics, fpi_device_synaptics, FPI, DEVICE_SYNAPTICS, FpDevice) +G_DECLARE_FINAL_TYPE (FpiDeviceSynaptics, fpi_device_synaptics, FPI, DEVICE_SYNAPTICS, FpDevice) -#define MAX_TRANSFER_LEN 263 + 1 /* SPI Header */ + 2 /* VCSFW header */ +#define MAX_TRANSFER_LEN 263 + 1 /* SPI Header */ + 2 /* VCSFW header */ -#define USB_EP_REQUEST 0x01 -#define USB_EP_REPLY 0x81 -#define USB_EP_FINGERPRINT 0x82 -#define USB_EP_INTERRUPT 0x83 +#define USB_EP_REQUEST 0x01 +#define USB_EP_REPLY 0x81 +#define USB_EP_FINGERPRINT 0x82 +#define USB_EP_INTERRUPT 0x83 -#define USB_ASYNC_MESSAGE_PENDING 0x4 -#define USB_INTERRUPT_DATA_SIZE 7 +#define USB_ASYNC_MESSAGE_PENDING 0x4 +#define USB_INTERRUPT_DATA_SIZE 7 -#define SENSOR_CMD_GET_VERSION 1 -#define SENSOR_CMD_ACE_COMMAND 167 -#define SENSOR_CMD_ASYNCMSG_READ 168 +#define SENSOR_CMD_GET_VERSION 1 +#define SENSOR_CMD_ACE_COMMAND 167 +#define SENSOR_CMD_ASYNCMSG_READ 168 -#define SENSOR_FW_CMD_HEADER_LEN 1 -#define SENSOR_FW_REPLY_HEADER_LEN 2 +#define SENSOR_FW_CMD_HEADER_LEN 1 +#define SENSOR_FW_REPLY_HEADER_LEN 2 /* Number of enroll stages */ -#define ENROLL_SAMPLES 8 +#define ENROLL_SAMPLES 8 -#define SYNAPTICS_DRIVER_FULLNAME "Synaptics Sensors" +#define SYNAPTICS_DRIVER_FULLNAME "Synaptics Sensors" #include "bmkt.h" #include "bmkt_response.h" typedef struct bmkt_sensor_version { - uint32_t build_time; - uint32_t build_num; - uint8_t version_major; - uint8_t version_minor; - uint8_t target; - uint8_t product; - uint8_t silicon_rev; - uint8_t formal_release; - uint8_t platform; - uint8_t patch; - uint8_t serial_number[6]; - uint16_t security; - uint8_t iface; - uint8_t device_type; + uint32_t build_time; + uint32_t build_num; + uint8_t version_major; + uint8_t version_minor; + uint8_t target; + uint8_t product; + uint8_t silicon_rev; + uint8_t formal_release; + uint8_t platform; + uint8_t patch; + uint8_t serial_number[6]; + uint16_t security; + uint8_t iface; + uint8_t device_type; } bmkt_sensor_version_t; struct syna_enroll_resp_data { - int progress; + int progress; }; -typedef enum syna_state -{ - SYNA_STATE_UNINIT = 0, - SYNA_STATE_IDLE , - SYNA_STATE_ENROLL , - SYNA_STATE_IDENTIFY , - SYNA_STATE_IDENTIFY_DELAY_RESULT , - SYNA_STATE_VERIFY , - SYNA_STATE_VERIFY_DELAY_RESULT , - SYNA_STATE_DELETE , +typedef enum syna_state { + SYNA_STATE_UNINIT = 0, + SYNA_STATE_IDLE, + SYNA_STATE_ENROLL, + SYNA_STATE_IDENTIFY, + SYNA_STATE_IDENTIFY_DELAY_RESULT, + SYNA_STATE_VERIFY, + SYNA_STATE_VERIFY_DELAY_RESULT, + SYNA_STATE_DELETE, } syna_state_t; -typedef enum -{ - SYNAPTICS_CMD_SEND_PENDING = 0, - SYNAPTICS_CMD_GET_RESP, - SYNAPTICS_CMD_WAIT_INTERRUPT, - SYNAPTICS_CMD_SEND_ASYNC, - SYNAPTICS_CMD_RESTART, - SYNAPTICS_CMD_NUM_STATES, +typedef enum { + SYNAPTICS_CMD_SEND_PENDING = 0, + SYNAPTICS_CMD_GET_RESP, + SYNAPTICS_CMD_WAIT_INTERRUPT, + SYNAPTICS_CMD_SEND_ASYNC, + SYNAPTICS_CMD_RESTART, + SYNAPTICS_CMD_NUM_STATES, } SynapticsCmdState; -typedef void (*SynCmdMsgCallback) (FpiDeviceSynaptics *self, bmkt_response_t *resp, GError *error); +typedef void (*SynCmdMsgCallback) (FpiDeviceSynaptics *self, + bmkt_response_t *resp, + GError *error); struct _FpiDeviceSynaptics { - FpDevice parent; + FpDevice parent; - guint8 cmd_seq_num; - guint8 last_seq_num; - FpiSsm *cmd_ssm; - FpiUsbTransfer *cmd_pending_transfer; - gboolean cmd_complete_on_removal; - GError *cmd_complete_error; - void *cmd_complete_data; + guint8 cmd_seq_num; + guint8 last_seq_num; + FpiSsm *cmd_ssm; + FpiUsbTransfer *cmd_pending_transfer; + gboolean cmd_complete_on_removal; + GError *cmd_complete_error; + void *cmd_complete_data; - bmkt_sensor_version_t mis_version; + bmkt_sensor_version_t mis_version; - GCancellable *interrupt_cancellable; + GCancellable *interrupt_cancellable; - gint enroll_stage; - gboolean finger_on_sensor; - GPtrArray *list_result; + gint enroll_stage; + gboolean finger_on_sensor; + GPtrArray *list_result; - struct syna_enroll_resp_data enroll_resp_data; - syna_state_t state; + struct syna_enroll_resp_data enroll_resp_data; + syna_state_t state; }; #endif //__synaptics_h__ diff --git a/libfprint/drivers/upek_proto.c b/libfprint/drivers/upek_proto.c index 0ecc4b1..13c4d98 100644 --- a/libfprint/drivers/upek_proto.c +++ b/libfprint/drivers/upek_proto.c @@ -21,46 +21,47 @@ #include "upek_proto.h" static const uint16_t crc_table[256] = { - 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, - 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, - 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, - 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, - 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, - 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, - 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, - 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, - 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, - 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, - 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, - 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, - 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, - 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, - 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, - 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, - 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, - 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, - 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, - 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, - 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, - 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, - 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, - 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, - 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, - 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, - 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, - 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, - 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, - 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, - 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, - 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, + 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, + 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, + 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, + 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, + 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, + 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, + 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, + 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, + 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, + 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, + 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, + 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, + 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, + 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, + 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, + 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, + 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, + 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, + 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, + 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, + 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, + 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 }; uint16_t -udf_crc(unsigned char *buffer, size_t size) +udf_crc (unsigned char *buffer, size_t size) { - uint16_t crc = 0; - while (size--) - crc = (uint16_t) ((crc << 8) ^ - crc_table[((crc >> 8) & 0x00ff) ^ *buffer++]); - return crc; + uint16_t crc = 0; + + while (size--) + crc = (uint16_t) ((crc << 8) ^ + crc_table[((crc >> 8) & 0x00ff) ^ *buffer++]); + return crc; } diff --git a/libfprint/drivers/upek_proto.h b/libfprint/drivers/upek_proto.h index 2c3a617..9459748 100644 --- a/libfprint/drivers/upek_proto.h +++ b/libfprint/drivers/upek_proto.h @@ -21,4 +21,5 @@ #include #include -uint16_t udf_crc(unsigned char *buffer, size_t size); +uint16_t udf_crc (unsigned char *buffer, + size_t size); diff --git a/libfprint/drivers/upeksonly.c b/libfprint/drivers/upeksonly.c index a9e0f27..7d20696 100644 --- a/libfprint/drivers/upeksonly.c +++ b/libfprint/drivers/upeksonly.c @@ -28,7 +28,7 @@ #include "drivers_api.h" #include "upeksonly.h" -#define CTRL_TIMEOUT 1000 +#define CTRL_TIMEOUT 1000 #define NUM_BULK_TRANSFERS 24 #define MAX_ROWS 2048 #define MIN_ROWS 64 @@ -39,1372 +39,1540 @@ #define DIFF_THRESHOLD 13 enum { - UPEKSONLY_2016, - UPEKSONLY_1000, - UPEKSONLY_1001, + UPEKSONLY_2016, + UPEKSONLY_1000, + UPEKSONLY_1001, }; enum sonly_kill_transfers_action { - NOT_KILLING = 0, + NOT_KILLING = 0, - /* abort a SSM with an error code */ - ABORT_SSM, + /* abort a SSM with an error code */ + ABORT_SSM, - /* report an image session error */ - IMG_SESSION_ERROR, + /* report an image session error */ + IMG_SESSION_ERROR, - /* iterate a SSM to the next state */ - ITERATE_SSM, + /* iterate a SSM to the next state */ + ITERATE_SSM, - /* call a callback */ - EXEC_CALLBACK, + /* call a callback */ + EXEC_CALLBACK, }; enum sonly_fs { - AWAIT_FINGER, - FINGER_DETECTED, - FINGER_REMOVED, + AWAIT_FINGER, + FINGER_DETECTED, + FINGER_REMOVED, }; -struct _FpiDeviceUpeksonly { - FpImageDevice parent; +struct _FpiDeviceUpeksonly +{ + FpImageDevice parent; - gboolean capturing; - gboolean deactivating; - guint8 read_reg_result; + gboolean capturing; + gboolean deactivating; + guint8 read_reg_result; - int dev_model; - int img_width; + int dev_model; + int img_width; - FpiSsm *loopsm; + FpiSsm *loopsm; - /* Do we really need multiple concurrent transfers? */ - GCancellable *img_cancellable; - GPtrArray *img_transfers; - int num_flying; + /* Do we really need multiple concurrent transfers? */ + GCancellable *img_cancellable; + GPtrArray *img_transfers; + int num_flying; - GSList *rows; - size_t num_rows; - unsigned char *rowbuf; - int rowbuf_offset; + GSList *rows; + size_t num_rows; + unsigned char *rowbuf; + int rowbuf_offset; - int wraparounds; - int num_blank; - int num_nonblank; - enum sonly_fs finger_state; - int last_seqnum; + int wraparounds; + int num_blank; + int num_nonblank; + enum sonly_fs finger_state; + int last_seqnum; - enum sonly_kill_transfers_action killing_transfers; - GError *kill_error; - union { - FpiSsm *kill_ssm; - void (*kill_cb)(FpImageDevice *dev); - }; + enum sonly_kill_transfers_action killing_transfers; + GError *kill_error; + union + { + FpiSsm *kill_ssm; + void (*kill_cb)(FpImageDevice *dev); + }; - struct fpi_line_asmbl_ctx assembling_ctx; + struct fpi_line_asmbl_ctx assembling_ctx; }; -G_DECLARE_FINAL_TYPE(FpiDeviceUpeksonly, fpi_device_upeksonly, FPI, - DEVICE_UPEKSONLY, FpImageDevice); -G_DEFINE_TYPE(FpiDeviceUpeksonly, fpi_device_upeksonly, FP_TYPE_IMAGE_DEVICE); +G_DECLARE_FINAL_TYPE (FpiDeviceUpeksonly, fpi_device_upeksonly, FPI, + DEVICE_UPEKSONLY, FpImageDevice); +G_DEFINE_TYPE (FpiDeviceUpeksonly, fpi_device_upeksonly, FP_TYPE_IMAGE_DEVICE); /* Calculate squared standard deviation of sum of two lines */ -static int upeksonly_get_deviation2(struct fpi_line_asmbl_ctx *ctx, - GSList *line1, GSList *line2) +static int +upeksonly_get_deviation2 (struct fpi_line_asmbl_ctx *ctx, + GSList *line1, GSList *line2) { - unsigned char *buf1 = line1->data, *buf2 = line2->data; - int res = 0, mean = 0, i; + unsigned char *buf1 = line1->data, *buf2 = line2->data; + int res = 0, mean = 0, i; - g_assert (ctx->line_width > 0); + g_assert (ctx->line_width > 0); - for (i = 0; i < ctx->line_width; i+= 2) - mean += (int)buf1[i + 1] + (int)buf2[i]; + for (i = 0; i < ctx->line_width; i += 2) + mean += (int) buf1[i + 1] + (int) buf2[i]; - mean /= (ctx->line_width / 2); + mean /= (ctx->line_width / 2); - for (i = 0; i < ctx->line_width; i+= 2) { - int dev = (int)buf1[i + 1] + (int)buf2[i] - mean; - res += dev*dev; - } + for (i = 0; i < ctx->line_width; i += 2) + { + int dev = (int) buf1[i + 1] + (int) buf2[i] - mean; + res += dev * dev; + } - return res / (ctx->line_width / 2); + return res / (ctx->line_width / 2); } -static unsigned char upeksonly_get_pixel(struct fpi_line_asmbl_ctx *ctx, - GSList *row, - unsigned x) +static unsigned char +upeksonly_get_pixel (struct fpi_line_asmbl_ctx *ctx, + GSList *row, + unsigned x) { - unsigned char *buf; - unsigned offset; + unsigned char *buf; + unsigned offset; - /* The scans from this device are rolled right by two columns */ - if (x < ctx->line_width - 2) - offset = x + 2; - else if ((x > ctx->line_width - 2) && (x < ctx->line_width)) - offset = x - (ctx->line_width - 2); - else - return 0; - /* Each 2nd pixel is shifted 2 pixels down */ - if ((!(x & 1)) && g_slist_next(row) && g_slist_next(g_slist_next(row))) - buf = g_slist_next(g_slist_next(row))->data; - else - buf = row->data; + /* The scans from this device are rolled right by two columns */ + if (x < ctx->line_width - 2) + offset = x + 2; + else if ((x > ctx->line_width - 2) && (x < ctx->line_width)) + offset = x - (ctx->line_width - 2); + else + return 0; + /* Each 2nd pixel is shifted 2 pixels down */ + if ((!(x & 1)) && g_slist_next (row) && g_slist_next (g_slist_next (row))) + buf = g_slist_next (g_slist_next (row))->data; + else + buf = row->data; - return buf[offset]; + return buf[offset]; } /***** IMAGE PROCESSING *****/ -static void free_img_transfers(FpiDeviceUpeksonly *sdev) +static void +free_img_transfers (FpiDeviceUpeksonly *sdev) { - g_cancellable_cancel (sdev->img_cancellable); - g_clear_object (&sdev->img_cancellable); - g_clear_pointer (&sdev->img_transfers, g_ptr_array_unref); + g_cancellable_cancel (sdev->img_cancellable); + g_clear_object (&sdev->img_cancellable); + g_clear_pointer (&sdev->img_transfers, g_ptr_array_unref); } -static void last_transfer_killed(FpImageDevice *dev) +static void +last_transfer_killed (FpImageDevice *dev) { - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(dev); - switch (self->killing_transfers) { - case ABORT_SSM: - fp_dbg("abort ssm error %s", self->kill_error->message); - fpi_ssm_mark_failed(self->kill_ssm, g_steal_pointer (&self->kill_error)); - return; - case ITERATE_SSM: - fp_dbg("iterate ssm"); - fpi_ssm_next_state(self->kill_ssm); - return; - case IMG_SESSION_ERROR: - fp_dbg("session error %s", self->kill_error->message); - fpi_image_device_session_error(dev, g_steal_pointer (&self->kill_error)); - return; - default: - return; - } + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (dev); + + switch (self->killing_transfers) + { + case ABORT_SSM: + fp_dbg ("abort ssm error %s", self->kill_error->message); + fpi_ssm_mark_failed (self->kill_ssm, g_steal_pointer (&self->kill_error)); + return; + + case ITERATE_SSM: + fp_dbg ("iterate ssm"); + fpi_ssm_next_state (self->kill_ssm); + return; + + case IMG_SESSION_ERROR: + fp_dbg ("session error %s", self->kill_error->message); + fpi_image_device_session_error (dev, g_steal_pointer (&self->kill_error)); + return; + + default: + return; + } } -static void cancel_img_transfers(FpImageDevice *dev) +static void +cancel_img_transfers (FpImageDevice *dev) { - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(dev); + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (dev); - g_cancellable_cancel (self->img_cancellable); + g_cancellable_cancel (self->img_cancellable); - if (self->num_flying == 0) - last_transfer_killed(dev); + if (self->num_flying == 0) + last_transfer_killed (dev); } -static gboolean is_capturing(FpiDeviceUpeksonly *sdev) +static gboolean +is_capturing (FpiDeviceUpeksonly *sdev) { - return sdev->num_rows < MAX_ROWS && (sdev->finger_state != FINGER_REMOVED); + return sdev->num_rows < MAX_ROWS && (sdev->finger_state != FINGER_REMOVED); } -static void handoff_img(FpImageDevice *dev) +static void +handoff_img (FpImageDevice *dev) { - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(dev); - FpImage *img; + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (dev); + FpImage *img; - GSList *elem = self->rows; + GSList *elem = self->rows; - if (!elem) { - fp_err("no rows?"); - return; - } + if (!elem) + { + fp_err ("no rows?"); + return; + } - self->rows = g_slist_reverse(self->rows); + self->rows = g_slist_reverse (self->rows); - fp_dbg("%lu rows", self->num_rows); - img = fpi_assemble_lines(&self->assembling_ctx, self->rows, self->num_rows); + fp_dbg ("%lu rows", self->num_rows); + img = fpi_assemble_lines (&self->assembling_ctx, self->rows, self->num_rows); - g_slist_free_full(self->rows, g_free); - self->rows = NULL; + g_slist_free_full (self->rows, g_free); + self->rows = NULL; - fpi_image_device_image_captured(dev, img); - fpi_image_device_report_finger_status(dev, FALSE); + fpi_image_device_image_captured (dev, img); + fpi_image_device_report_finger_status (dev, FALSE); - self->killing_transfers = ITERATE_SSM; - self->kill_ssm = self->loopsm; - cancel_img_transfers(dev); + self->killing_transfers = ITERATE_SSM; + self->kill_ssm = self->loopsm; + cancel_img_transfers (dev); } -static void row_complete(FpImageDevice *dev) +static void +row_complete (FpImageDevice *dev) { - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(dev); - self->rowbuf_offset = -1; + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (dev); - if (self->num_rows > 0) { - unsigned char *lastrow = self->rows->data; - int std_sq_dev, mean_sq_diff; + self->rowbuf_offset = -1; - std_sq_dev = fpi_std_sq_dev(self->rowbuf, self->img_width); - mean_sq_diff = fpi_mean_sq_diff_norm(lastrow, self->rowbuf, - self->img_width); + if (self->num_rows > 0) + { + unsigned char *lastrow = self->rows->data; + int std_sq_dev, mean_sq_diff; - switch (self->finger_state) { - case AWAIT_FINGER: - if (self->deactivating) { - self->killing_transfers = ITERATE_SSM; - self->kill_ssm = self->loopsm; - cancel_img_transfers(dev); - } - fp_dbg("std_sq_dev: %d", std_sq_dev); - if (std_sq_dev > BLANK_THRESHOLD) { - self->num_nonblank++; - } else { - self->num_nonblank = 0; - } + std_sq_dev = fpi_std_sq_dev (self->rowbuf, self->img_width); + mean_sq_diff = fpi_mean_sq_diff_norm (lastrow, self->rowbuf, + self->img_width); - if (self->num_nonblank > FINGER_PRESENT_THRESHOLD) { - self->finger_state = FINGER_DETECTED; - fpi_image_device_report_finger_status(dev, - TRUE); - } else { - return; - } - break; - case FINGER_DETECTED: - case FINGER_REMOVED: - default: - break; - } + switch (self->finger_state) + { + case AWAIT_FINGER: + if (self->deactivating) + { + self->killing_transfers = ITERATE_SSM; + self->kill_ssm = self->loopsm; + cancel_img_transfers (dev); + } + fp_dbg ("std_sq_dev: %d", std_sq_dev); + if (std_sq_dev > BLANK_THRESHOLD) + self->num_nonblank++; + else + self->num_nonblank = 0; - if (std_sq_dev > BLANK_THRESHOLD) { - self->num_blank = 0; - } else { - self->num_blank++; - /* Don't consider the scan complete unless there's at least - * MIN_ROWS recorded or very long blank read occurred. - * - * Typical problem spot: one brief touch before starting the - * actual scan. Happens most commonly if scan is started - * from before the first joint resulting in a gap after the initial touch. - */ - if (self->num_blank > FINGER_REMOVED_THRESHOLD) { - self->finger_state = FINGER_REMOVED; - fp_dbg("detected finger removal. Blank rows: %d, Full rows: %lu", - self->num_blank, self->num_rows); - handoff_img(dev); - return; - } - } - fp_dbg("mean_sq_diff: %d, std_sq_dev: %d", mean_sq_diff, std_sq_dev); - fp_dbg("num_blank: %d", self->num_blank); - if (mean_sq_diff < DIFF_THRESHOLD) { - return; - } - } + if (self->num_nonblank > FINGER_PRESENT_THRESHOLD) + { + self->finger_state = FINGER_DETECTED; + fpi_image_device_report_finger_status (dev, + TRUE); + } + else + { + return; + } + break; - switch (self->finger_state) { - case AWAIT_FINGER: - if (!self->num_rows) { - self->rows = g_slist_prepend(self->rows, self->rowbuf); - self->num_rows++; - } else { - return; - } - break; - case FINGER_DETECTED: - case FINGER_REMOVED: - self->rows = g_slist_prepend(self->rows, self->rowbuf); - self->num_rows++; - break; - } - self->rowbuf = NULL; + case FINGER_DETECTED: + case FINGER_REMOVED: + default: + break; + } - if (self->num_rows >= MAX_ROWS) { - fp_dbg("row limit met"); - handoff_img(dev); - } + if (std_sq_dev > BLANK_THRESHOLD) + { + self->num_blank = 0; + } + else + { + self->num_blank++; + /* Don't consider the scan complete unless there's at least + * MIN_ROWS recorded or very long blank read occurred. + * + * Typical problem spot: one brief touch before starting the + * actual scan. Happens most commonly if scan is started + * from before the first joint resulting in a gap after the initial touch. + */ + if (self->num_blank > FINGER_REMOVED_THRESHOLD) + { + self->finger_state = FINGER_REMOVED; + fp_dbg ("detected finger removal. Blank rows: %d, Full rows: %lu", + self->num_blank, self->num_rows); + handoff_img (dev); + return; + } + } + fp_dbg ("mean_sq_diff: %d, std_sq_dev: %d", mean_sq_diff, std_sq_dev); + fp_dbg ("num_blank: %d", self->num_blank); + if (mean_sq_diff < DIFF_THRESHOLD) + return; + } + + switch (self->finger_state) + { + case AWAIT_FINGER: + if (!self->num_rows) + { + self->rows = g_slist_prepend (self->rows, self->rowbuf); + self->num_rows++; + } + else + { + return; + } + break; + + case FINGER_DETECTED: + case FINGER_REMOVED: + self->rows = g_slist_prepend (self->rows, self->rowbuf); + self->num_rows++; + break; + } + self->rowbuf = NULL; + + if (self->num_rows >= MAX_ROWS) + { + fp_dbg ("row limit met"); + handoff_img (dev); + } } /* add data to row buffer */ -static void add_to_rowbuf(FpImageDevice *dev, unsigned char *data, int size) +static void +add_to_rowbuf (FpImageDevice *dev, unsigned char *data, int size) { - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(dev); + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (dev); - memcpy(self->rowbuf + self->rowbuf_offset, data, size); - self->rowbuf_offset += size; - if (self->rowbuf_offset >= self->img_width) - row_complete(dev); + memcpy (self->rowbuf + self->rowbuf_offset, data, size); + self->rowbuf_offset += size; + if (self->rowbuf_offset >= self->img_width) + row_complete (dev); } -static void start_new_row(FpiDeviceUpeksonly *self, unsigned char *data, - int size) +static void +start_new_row (FpiDeviceUpeksonly *self, unsigned char *data, + int size) { - if (!self->rowbuf) - self->rowbuf = g_malloc(self->img_width); - memcpy(self->rowbuf, data, size); - self->rowbuf_offset = size; + if (!self->rowbuf) + self->rowbuf = g_malloc (self->img_width); + memcpy (self->rowbuf, data, size); + self->rowbuf_offset = size; } /* returns number of bytes left to be copied into rowbuf (capped to 62) * or -1 if we aren't capturing anything */ -static int rowbuf_remaining(FpiDeviceUpeksonly *sdev) +static int +rowbuf_remaining (FpiDeviceUpeksonly *sdev) { - int r; + int r; - if (sdev->rowbuf_offset == -1) - return -1; + if (sdev->rowbuf_offset == -1) + return -1; - r = sdev->img_width - sdev->rowbuf_offset; - if (r > 62) - r = 62; - return r; + r = sdev->img_width - sdev->rowbuf_offset; + if (r > 62) + r = 62; + return r; } -static void handle_packet(FpImageDevice *dev, unsigned char *data) +static void +handle_packet (FpImageDevice *dev, unsigned char *data) { - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(dev); - guint16 seqnum = data[0] << 8 | data[1]; - int abs_base_addr; - int for_rowbuf; - int next_row_addr; - int diff; - unsigned char dummy_data[62]; + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (dev); + guint16 seqnum = data[0] << 8 | data[1]; + int abs_base_addr; + int for_rowbuf; + int next_row_addr; + int diff; + unsigned char dummy_data[62]; - /* Init dummy data to something neutral */ - memset (dummy_data, 204, 62); + /* Init dummy data to something neutral */ + memset (dummy_data, 204, 62); - data += 2; /* skip sequence number */ - if (seqnum != self->last_seqnum + 1) { - if (seqnum != 0 && self->last_seqnum != 16383) { - int missing_data = seqnum - self->last_seqnum; - int i; - fp_warn("lost %d packets of data between %d and %d", missing_data, - self->last_seqnum, seqnum ); + data += 2; /* skip sequence number */ + if (seqnum != self->last_seqnum + 1) + { + if (seqnum != 0 && self->last_seqnum != 16383) + { + int missing_data = seqnum - self->last_seqnum; + int i; + fp_warn ("lost %d packets of data between %d and %d", missing_data, + self->last_seqnum, seqnum ); - /* Minimize distortions for readers that lose a lot of packets */ - for (i =1; i < missing_data; i++) { - abs_base_addr = (self->last_seqnum + 1) * 62; + /* Minimize distortions for readers that lose a lot of packets */ + for (i = 1; i < missing_data; i++) + { + abs_base_addr = (self->last_seqnum + 1) * 62; - /* If possible take the replacement data from last row */ - if (self->num_rows > 1) { - int row_left = self->img_width - self->rowbuf_offset; - unsigned char *last_row = g_slist_nth_data (self->rows, - 0); + /* If possible take the replacement data from last row */ + if (self->num_rows > 1) + { + int row_left = self->img_width - self->rowbuf_offset; + unsigned char *last_row = g_slist_nth_data (self->rows, + 0); - if (row_left >= 62) { - memcpy(dummy_data, - last_row + self->rowbuf_offset, - 62); - } else { - memcpy(dummy_data, - last_row + self->rowbuf_offset, - row_left); - memcpy(dummy_data + row_left, last_row , 62 - row_left); - } - } + if (row_left >= 62) + { + memcpy (dummy_data, + last_row + self->rowbuf_offset, + 62); + } + else + { + memcpy (dummy_data, + last_row + self->rowbuf_offset, + row_left); + memcpy (dummy_data + row_left, last_row, 62 - row_left); + } + } - fp_warn("adding dummy input for %d, i=%d", - self->last_seqnum + i, i); - for_rowbuf = rowbuf_remaining(self); - if (for_rowbuf != -1) { - add_to_rowbuf(dev, dummy_data, for_rowbuf); - /* row boundary */ - if (for_rowbuf < 62) { - start_new_row(self, - dummy_data + for_rowbuf, - 62 - for_rowbuf); - } - } else if (abs_base_addr % self->img_width == 0) { - start_new_row(self, dummy_data, 62); - } else { - /* does the data in the packet reside on a row boundary? - * if so capture it */ - next_row_addr = ((abs_base_addr / self->img_width) + 1) * self->img_width; - diff = next_row_addr - abs_base_addr; - if (diff < 62) - start_new_row(self, - dummy_data + diff, - 62 - diff); - } - self->last_seqnum = self->last_seqnum + 1; - } - } - } - if (seqnum <= self->last_seqnum) { - fp_dbg("detected wraparound"); - self->wraparounds++; - } + fp_warn ("adding dummy input for %d, i=%d", + self->last_seqnum + i, i); + for_rowbuf = rowbuf_remaining (self); + if (for_rowbuf != -1) + { + add_to_rowbuf (dev, dummy_data, for_rowbuf); + /* row boundary */ + if (for_rowbuf < 62) + { + start_new_row (self, + dummy_data + for_rowbuf, + 62 - for_rowbuf); + } + } + else if (abs_base_addr % self->img_width == 0) + { + start_new_row (self, dummy_data, 62); + } + else + { + /* does the data in the packet reside on a row boundary? + * if so capture it */ + next_row_addr = ((abs_base_addr / self->img_width) + 1) * self->img_width; + diff = next_row_addr - abs_base_addr; + if (diff < 62) + start_new_row (self, + dummy_data + diff, + 62 - diff); + } + self->last_seqnum = self->last_seqnum + 1; + } + } + } + if (seqnum <= self->last_seqnum) + { + fp_dbg ("detected wraparound"); + self->wraparounds++; + } - self->last_seqnum = seqnum; - seqnum += self->wraparounds * 16384; - abs_base_addr = seqnum * 62; + self->last_seqnum = seqnum; + seqnum += self->wraparounds * 16384; + abs_base_addr = seqnum * 62; - /* are we already capturing a row? if so append the data to the - * row buffer */ - for_rowbuf = rowbuf_remaining(self); - if (for_rowbuf != -1) { - add_to_rowbuf(dev, data, for_rowbuf); - /*row boundary*/ - if (for_rowbuf < 62) { - start_new_row(self, data + for_rowbuf, - 62 - for_rowbuf); - } - return; - } + /* are we already capturing a row? if so append the data to the + * row buffer */ + for_rowbuf = rowbuf_remaining (self); + if (for_rowbuf != -1) + { + add_to_rowbuf (dev, data, for_rowbuf); + /*row boundary*/ + if (for_rowbuf < 62) + start_new_row (self, data + for_rowbuf, + 62 - for_rowbuf); + return; + } - /* does the packet START on a boundary? if so we want it in full */ - if (abs_base_addr % self->img_width == 0) { - start_new_row(self, data, 62); - return; - } + /* does the packet START on a boundary? if so we want it in full */ + if (abs_base_addr % self->img_width == 0) + { + start_new_row (self, data, 62); + return; + } - /* does the data in the packet reside on a row boundary? - * if so capture it */ - next_row_addr = ((abs_base_addr / self->img_width) + 1) * self->img_width; - diff = next_row_addr - abs_base_addr; - if (diff < 62) - start_new_row(self, data + diff, 62 - diff); + /* does the data in the packet reside on a row boundary? + * if so capture it */ + next_row_addr = ((abs_base_addr / self->img_width) + 1) * self->img_width; + diff = next_row_addr - abs_base_addr; + if (diff < 62) + start_new_row (self, data + diff, 62 - diff); } -static void img_data_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +img_data_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpImageDevice *dev = FP_IMAGE_DEVICE (device); - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(dev); - int i; + FpImageDevice *dev = FP_IMAGE_DEVICE (device); + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (dev); + int i; - self->num_flying--; + self->num_flying--; - if (self->killing_transfers) { - if (self->num_flying == 0) - last_transfer_killed(dev); + if (self->killing_transfers) + { + if (self->num_flying == 0) + last_transfer_killed (dev); - /* don't care about error or success if we're terminating */ - g_clear_error (&error); - return; - } + /* don't care about error or success if we're terminating */ + g_clear_error (&error); + return; + } - if (error) { - fp_warn("bad status %s, terminating session", error->message); - self->killing_transfers = IMG_SESSION_ERROR; + if (error) + { + fp_warn ("bad status %s, terminating session", error->message); + self->killing_transfers = IMG_SESSION_ERROR; - /* This cannot really happen, but just in case. */ - if (!self->kill_error) - self->kill_error = error; - else - g_error_free (error); + /* This cannot really happen, but just in case. */ + if (!self->kill_error) + self->kill_error = error; + else + g_error_free (error); - cancel_img_transfers(dev); - return; - } + cancel_img_transfers (dev); + return; + } - /* there are 64 packets in the transfer buffer - * each packet is 64 bytes in length - * the first 2 bytes are a sequence number - * then there are 62 bytes for image data - */ - for (i = 0; i < 4096; i += 64) { - if (!is_capturing(self)) - return; - handle_packet(dev, transfer->buffer + i); - } + /* there are 64 packets in the transfer buffer + * each packet is 64 bytes in length + * the first 2 bytes are a sequence number + * then there are 62 bytes for image data + */ + for (i = 0; i < 4096; i += 64) + { + if (!is_capturing (self)) + return; + handle_packet (dev, transfer->buffer + i); + } - if (is_capturing(self)) { - fpi_usb_transfer_submit (transfer, - 0, - self->img_cancellable, - img_data_cb, - user_data); - self->num_flying++; - } + if (is_capturing (self)) + { + fpi_usb_transfer_submit (transfer, + 0, + self->img_cancellable, + img_data_cb, + user_data); + self->num_flying++; + } } /***** STATE MACHINE HELPERS *****/ -struct write_regs_data { - FpDevice *dev; - FpiSsm *ssm; - FpiUsbTransfer *transfer; - const struct sonly_regwrite *regs; - size_t num_regs; - size_t regs_written; +struct write_regs_data +{ + FpDevice *dev; + FpiSsm *ssm; + FpiUsbTransfer *transfer; + const struct sonly_regwrite *regs; + size_t num_regs; + size_t regs_written; }; -static void write_regs_finished(struct write_regs_data *wrdata, GError *error) +static void +write_regs_finished (struct write_regs_data *wrdata, GError *error) { - if (!error) - fpi_ssm_next_state(wrdata->ssm); - else - fpi_ssm_mark_failed(wrdata->ssm, error); + if (!error) + fpi_ssm_next_state (wrdata->ssm); + else + fpi_ssm_mark_failed (wrdata->ssm, error); } -static void write_regs_iterate(struct write_regs_data *wrdata); +static void write_regs_iterate (struct write_regs_data *wrdata); -static void write_regs_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +write_regs_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - struct write_regs_data *wrdata = user_data; - if (error) { - write_regs_finished(wrdata, error); - return; - } + struct write_regs_data *wrdata = user_data; - wrdata->regs_written++; - write_regs_iterate(wrdata); -} + if (error) + { + write_regs_finished (wrdata, error); + return; + } -static void write_regs_iterate(struct write_regs_data *wrdata) -{ - FpiUsbTransfer *transfer; - const struct sonly_regwrite *regwrite; - - if (wrdata->regs_written >= wrdata->num_regs) { - write_regs_finished(wrdata, NULL); - return; - } - - regwrite = &wrdata->regs[wrdata->regs_written]; - fp_dbg("set %02x=%02x", regwrite->reg, regwrite->value); - - transfer = fpi_usb_transfer_new(wrdata->dev); - fpi_usb_transfer_fill_control(transfer, - G_USB_DEVICE_DIRECTION_HOST_TO_DEVICE, - G_USB_DEVICE_REQUEST_TYPE_VENDOR, - G_USB_DEVICE_RECIPIENT_DEVICE, - 0x0c, - 0, - regwrite->reg, - 1); - transfer->short_is_error = TRUE; - transfer->ssm = wrdata->ssm; - fpi_usb_transfer_submit(transfer, CTRL_TIMEOUT, NULL, write_regs_cb, NULL); - fpi_usb_transfer_unref(transfer); - - transfer->buffer[0] = regwrite->value; + wrdata->regs_written++; + write_regs_iterate (wrdata); } static void -sm_write_regs(FpiSsm *ssm, - FpDevice *dev, - const struct sonly_regwrite *regs, - size_t num_regs) +write_regs_iterate (struct write_regs_data *wrdata) { - struct write_regs_data *wrdata = g_malloc(sizeof(*wrdata)); + FpiUsbTransfer *transfer; + const struct sonly_regwrite *regwrite; - wrdata->ssm = ssm; - wrdata->regs = regs; - wrdata->num_regs = num_regs; - wrdata->regs_written = 0; - wrdata->dev = dev; + if (wrdata->regs_written >= wrdata->num_regs) + { + write_regs_finished (wrdata, NULL); + return; + } - write_regs_iterate(wrdata); + regwrite = &wrdata->regs[wrdata->regs_written]; + fp_dbg ("set %02x=%02x", regwrite->reg, regwrite->value); + + transfer = fpi_usb_transfer_new (wrdata->dev); + fpi_usb_transfer_fill_control (transfer, + G_USB_DEVICE_DIRECTION_HOST_TO_DEVICE, + G_USB_DEVICE_REQUEST_TYPE_VENDOR, + G_USB_DEVICE_RECIPIENT_DEVICE, + 0x0c, + 0, + regwrite->reg, + 1); + transfer->short_is_error = TRUE; + transfer->ssm = wrdata->ssm; + fpi_usb_transfer_submit (transfer, CTRL_TIMEOUT, NULL, write_regs_cb, NULL); + fpi_usb_transfer_unref (transfer); + + transfer->buffer[0] = regwrite->value; } -static void sm_write_reg_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +sm_write_regs (FpiSsm *ssm, + FpDevice *dev, + const struct sonly_regwrite *regs, + size_t num_regs) { - if (error) - fpi_ssm_mark_failed(transfer->ssm, error); - else - fpi_ssm_next_state(transfer->ssm); + struct write_regs_data *wrdata = g_malloc (sizeof (*wrdata)); + + wrdata->ssm = ssm; + wrdata->regs = regs; + wrdata->num_regs = num_regs; + wrdata->regs_written = 0; + wrdata->dev = dev; + + write_regs_iterate (wrdata); +} + +static void +sm_write_reg_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) +{ + if (error) + fpi_ssm_mark_failed (transfer->ssm, error); + else + fpi_ssm_next_state (transfer->ssm); } static void -sm_write_reg(FpiSsm *ssm, - FpImageDevice *dev, - guint8 reg, - guint8 value) +sm_write_reg (FpiSsm *ssm, + FpImageDevice *dev, + guint8 reg, + guint8 value) { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(FP_DEVICE (dev)); + FpiUsbTransfer *transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); - fp_dbg("set %02x=%02x", reg, value); - fpi_usb_transfer_fill_control(transfer, - G_USB_DEVICE_DIRECTION_HOST_TO_DEVICE, - G_USB_DEVICE_REQUEST_TYPE_VENDOR, - G_USB_DEVICE_RECIPIENT_DEVICE, - 0x0c, - 0, - reg, - 1); - transfer->short_is_error = TRUE; - transfer->ssm = ssm; - fpi_usb_transfer_submit(transfer, CTRL_TIMEOUT, NULL, sm_write_reg_cb, NULL); - fpi_usb_transfer_unref(transfer); + fp_dbg ("set %02x=%02x", reg, value); + fpi_usb_transfer_fill_control (transfer, + G_USB_DEVICE_DIRECTION_HOST_TO_DEVICE, + G_USB_DEVICE_REQUEST_TYPE_VENDOR, + G_USB_DEVICE_RECIPIENT_DEVICE, + 0x0c, + 0, + reg, + 1); + transfer->short_is_error = TRUE; + transfer->ssm = ssm; + fpi_usb_transfer_submit (transfer, CTRL_TIMEOUT, NULL, sm_write_reg_cb, NULL); + fpi_usb_transfer_unref (transfer); - transfer->buffer[0] = value; -} - -static void sm_read_reg_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) -{ - FpImageDevice *dev = FP_IMAGE_DEVICE(device); - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(dev); - - if (error) { - fpi_ssm_mark_failed(transfer->ssm, error); - } else { - self->read_reg_result = transfer->buffer[0]; - fp_dbg("read reg result = %02x", self->read_reg_result); - fpi_ssm_next_state(transfer->ssm); - } - - g_free(transfer->buffer); + transfer->buffer[0] = value; } static void -sm_read_reg(FpiSsm *ssm, - FpImageDevice *dev, - guint8 reg) +sm_read_reg_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(FP_DEVICE(dev)); + FpImageDevice *dev = FP_IMAGE_DEVICE (device); + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (dev); - fp_dbg("read reg %02x", reg); - fpi_usb_transfer_fill_control(transfer, - G_USB_DEVICE_DIRECTION_DEVICE_TO_HOST, - G_USB_DEVICE_REQUEST_TYPE_VENDOR, - G_USB_DEVICE_RECIPIENT_DEVICE, - 0x0c, - 0, - reg, - 8); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_submit(transfer, - CTRL_TIMEOUT, - NULL, - sm_read_reg_cb, - NULL); - fpi_usb_transfer_unref(transfer); -} + if (error) + { + fpi_ssm_mark_failed (transfer->ssm, error); + } + else + { + self->read_reg_result = transfer->buffer[0]; + fp_dbg ("read reg result = %02x", self->read_reg_result); + fpi_ssm_next_state (transfer->ssm); + } -static void sm_await_intr_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) -{ - FpImageDevice *dev = FP_IMAGE_DEVICE(device); - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(dev); - - if (error) { - g_free(transfer->buffer); - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } - - fp_dbg("interrupt received: %02x %02x %02x %02x", - transfer->buffer[0], transfer->buffer[1], - transfer->buffer[2], transfer->buffer[3]); - g_free(transfer->buffer); - - self->finger_state = FINGER_DETECTED; - fpi_image_device_report_finger_status(dev, TRUE); - fpi_ssm_next_state(transfer->ssm); + g_free (transfer->buffer); } static void -sm_await_intr(FpiSsm *ssm, - FpImageDevice *dev) +sm_read_reg (FpiSsm *ssm, + FpImageDevice *dev, + guint8 reg) { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(FP_DEVICE(dev)); + FpiUsbTransfer *transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); - G_DEBUG_HERE(); + fp_dbg ("read reg %02x", reg); + fpi_usb_transfer_fill_control (transfer, + G_USB_DEVICE_DIRECTION_DEVICE_TO_HOST, + G_USB_DEVICE_REQUEST_TYPE_VENDOR, + G_USB_DEVICE_RECIPIENT_DEVICE, + 0x0c, + 0, + reg, + 8); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_submit (transfer, + CTRL_TIMEOUT, + NULL, + sm_read_reg_cb, + NULL); + fpi_usb_transfer_unref (transfer); +} - fpi_usb_transfer_fill_interrupt (transfer, 0x83, 4); - transfer->short_is_error = TRUE; - transfer->ssm = ssm; +static void +sm_await_intr_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) +{ + FpImageDevice *dev = FP_IMAGE_DEVICE (device); + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (dev); - /* NOTE: This was changed to be cancellable with the version 2 port! */ - fpi_usb_transfer_submit (transfer, - 0, - fpi_device_get_cancellable (FP_DEVICE (dev)), - sm_await_intr_cb, - NULL); - fpi_usb_transfer_unref (transfer); + if (error) + { + g_free (transfer->buffer); + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } + + fp_dbg ("interrupt received: %02x %02x %02x %02x", + transfer->buffer[0], transfer->buffer[1], + transfer->buffer[2], transfer->buffer[3]); + g_free (transfer->buffer); + + self->finger_state = FINGER_DETECTED; + fpi_image_device_report_finger_status (dev, TRUE); + fpi_ssm_next_state (transfer->ssm); +} + +static void +sm_await_intr (FpiSsm *ssm, + FpImageDevice *dev) +{ + FpiUsbTransfer *transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); + + G_DEBUG_HERE (); + + fpi_usb_transfer_fill_interrupt (transfer, 0x83, 4); + transfer->short_is_error = TRUE; + transfer->ssm = ssm; + + /* NOTE: This was changed to be cancellable with the version 2 port! */ + fpi_usb_transfer_submit (transfer, + 0, + fpi_device_get_cancellable (FP_DEVICE (dev)), + sm_await_intr_cb, + NULL); + fpi_usb_transfer_unref (transfer); } /***** AWAIT FINGER *****/ enum awfsm_2016_states { - AWFSM_2016_WRITEV_1, - AWFSM_2016_READ_01, - AWFSM_2016_WRITE_01, - AWFSM_2016_WRITEV_2, - AWFSM_2016_READ_13, - AWFSM_2016_WRITE_13, - AWFSM_2016_WRITEV_3, - AWFSM_2016_READ_07, - AWFSM_2016_WRITE_07, - AWFSM_2016_WRITEV_4, - AWFSM_2016_NUM_STATES, + AWFSM_2016_WRITEV_1, + AWFSM_2016_READ_01, + AWFSM_2016_WRITE_01, + AWFSM_2016_WRITEV_2, + AWFSM_2016_READ_13, + AWFSM_2016_WRITE_13, + AWFSM_2016_WRITEV_3, + AWFSM_2016_READ_07, + AWFSM_2016_WRITE_07, + AWFSM_2016_WRITEV_4, + AWFSM_2016_NUM_STATES, }; enum awfsm_1000_states { - AWFSM_1000_WRITEV_1, - AWFSM_1000_WRITEV_2, - AWFSM_1000_NUM_STATES, + AWFSM_1000_WRITEV_1, + AWFSM_1000_WRITEV_2, + AWFSM_1000_NUM_STATES, }; -static void awfsm_2016_run_state(FpiSsm *ssm, FpDevice *_dev, - void *user_data) +static void +awfsm_2016_run_state (FpiSsm *ssm, FpDevice *_dev, + void *user_data) { - FpImageDevice *dev = user_data; - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(_dev); + FpImageDevice *dev = user_data; + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (_dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case AWFSM_2016_WRITEV_1: - sm_write_regs(ssm, _dev, awfsm_2016_writev_1, G_N_ELEMENTS(awfsm_2016_writev_1)); - break; - case AWFSM_2016_READ_01: - sm_read_reg(ssm, dev, 0x01); - break; - case AWFSM_2016_WRITE_01: - if (self->read_reg_result != 0xc6) - sm_write_reg(ssm, dev, 0x01, 0x46); - else - sm_write_reg(ssm, dev, 0x01, 0xc6); - break; - case AWFSM_2016_WRITEV_2: - sm_write_regs(ssm, _dev, awfsm_2016_writev_2, G_N_ELEMENTS(awfsm_2016_writev_2)); - break; - case AWFSM_2016_READ_13: - sm_read_reg(ssm, dev, 0x13); - break; - case AWFSM_2016_WRITE_13: - if (self->read_reg_result != 0x45) - sm_write_reg(ssm, dev, 0x13, 0x05); - else - sm_write_reg(ssm, dev, 0x13, 0x45); - break; - case AWFSM_2016_WRITEV_3: - sm_write_regs(ssm, _dev, awfsm_2016_writev_3, G_N_ELEMENTS(awfsm_2016_writev_3)); - break; - case AWFSM_2016_READ_07: - sm_read_reg(ssm, dev, 0x07); - break; - case AWFSM_2016_WRITE_07: - if (self->read_reg_result != 0x10 && self->read_reg_result != 0x90) - fp_warn("odd reg7 value %x", self->read_reg_result); - sm_write_reg(ssm, dev, 0x07, self->read_reg_result); - break; - case AWFSM_2016_WRITEV_4: - sm_write_regs(ssm, _dev, awfsm_2016_writev_4, G_N_ELEMENTS(awfsm_2016_writev_4)); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case AWFSM_2016_WRITEV_1: + sm_write_regs (ssm, _dev, awfsm_2016_writev_1, G_N_ELEMENTS (awfsm_2016_writev_1)); + break; + + case AWFSM_2016_READ_01: + sm_read_reg (ssm, dev, 0x01); + break; + + case AWFSM_2016_WRITE_01: + if (self->read_reg_result != 0xc6) + sm_write_reg (ssm, dev, 0x01, 0x46); + else + sm_write_reg (ssm, dev, 0x01, 0xc6); + break; + + case AWFSM_2016_WRITEV_2: + sm_write_regs (ssm, _dev, awfsm_2016_writev_2, G_N_ELEMENTS (awfsm_2016_writev_2)); + break; + + case AWFSM_2016_READ_13: + sm_read_reg (ssm, dev, 0x13); + break; + + case AWFSM_2016_WRITE_13: + if (self->read_reg_result != 0x45) + sm_write_reg (ssm, dev, 0x13, 0x05); + else + sm_write_reg (ssm, dev, 0x13, 0x45); + break; + + case AWFSM_2016_WRITEV_3: + sm_write_regs (ssm, _dev, awfsm_2016_writev_3, G_N_ELEMENTS (awfsm_2016_writev_3)); + break; + + case AWFSM_2016_READ_07: + sm_read_reg (ssm, dev, 0x07); + break; + + case AWFSM_2016_WRITE_07: + if (self->read_reg_result != 0x10 && self->read_reg_result != 0x90) + fp_warn ("odd reg7 value %x", self->read_reg_result); + sm_write_reg (ssm, dev, 0x07, self->read_reg_result); + break; + + case AWFSM_2016_WRITEV_4: + sm_write_regs (ssm, _dev, awfsm_2016_writev_4, G_N_ELEMENTS (awfsm_2016_writev_4)); + break; + } } -static void awfsm_1000_run_state(FpiSsm *ssm, FpDevice *_dev, - void *user_data) +static void +awfsm_1000_run_state (FpiSsm *ssm, FpDevice *_dev, + void *user_data) { - switch (fpi_ssm_get_cur_state(ssm)) { - case AWFSM_1000_WRITEV_1: - sm_write_regs(ssm, _dev, awfsm_1000_writev_1, G_N_ELEMENTS(awfsm_1000_writev_1)); - break; - case AWFSM_1000_WRITEV_2: - sm_write_regs(ssm, _dev, awfsm_1000_writev_2, G_N_ELEMENTS(awfsm_1000_writev_2)); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case AWFSM_1000_WRITEV_1: + sm_write_regs (ssm, _dev, awfsm_1000_writev_1, G_N_ELEMENTS (awfsm_1000_writev_1)); + break; + + case AWFSM_1000_WRITEV_2: + sm_write_regs (ssm, _dev, awfsm_1000_writev_2, G_N_ELEMENTS (awfsm_1000_writev_2)); + break; + } } /***** CAPTURE MODE *****/ enum capsm_2016_states { - CAPSM_2016_INIT, - CAPSM_2016_WRITE_15, - CAPSM_2016_WRITE_30, - CAPSM_2016_FIRE_BULK, - CAPSM_2016_WRITEV, - CAPSM_2016_NUM_STATES, + CAPSM_2016_INIT, + CAPSM_2016_WRITE_15, + CAPSM_2016_WRITE_30, + CAPSM_2016_FIRE_BULK, + CAPSM_2016_WRITEV, + CAPSM_2016_NUM_STATES, }; enum capsm_1000_states { - CAPSM_1000_INIT, - CAPSM_1000_FIRE_BULK, - CAPSM_1000_WRITEV, - CAPSM_1000_NUM_STATES, + CAPSM_1000_INIT, + CAPSM_1000_FIRE_BULK, + CAPSM_1000_WRITEV, + CAPSM_1000_NUM_STATES, }; enum capsm_1001_states { - CAPSM_1001_INIT, - CAPSM_1001_FIRE_BULK, - CAPSM_1001_WRITEV_1, - CAPSM_1001_WRITEV_2, - CAPSM_1001_WRITEV_3, - CAPSM_1001_WRITEV_4, - CAPSM_1001_WRITEV_5, - CAPSM_1001_NUM_STATES, + CAPSM_1001_INIT, + CAPSM_1001_FIRE_BULK, + CAPSM_1001_WRITEV_1, + CAPSM_1001_WRITEV_2, + CAPSM_1001_WRITEV_3, + CAPSM_1001_WRITEV_4, + CAPSM_1001_WRITEV_5, + CAPSM_1001_NUM_STATES, }; static void -capsm_fire_bulk(FpiSsm *ssm, - FpDevice *dev) +capsm_fire_bulk (FpiSsm *ssm, + FpDevice *dev) { - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(dev); - int i; + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (dev); + int i; - g_assert (self->capturing == FALSE); + g_assert (self->capturing == FALSE); - g_clear_object (&self->img_cancellable); - self->img_cancellable = g_cancellable_new (); - for (i = 0; i < self->img_transfers->len; i++) { - fpi_usb_transfer_submit(g_ptr_array_index (self->img_transfers, i), - 0, - self->img_cancellable, - img_data_cb, - NULL); - self->num_flying++; - } - self->capturing = TRUE; - fpi_ssm_next_state(ssm); + g_clear_object (&self->img_cancellable); + self->img_cancellable = g_cancellable_new (); + for (i = 0; i < self->img_transfers->len; i++) + { + fpi_usb_transfer_submit (g_ptr_array_index (self->img_transfers, i), + 0, + self->img_cancellable, + img_data_cb, + NULL); + self->num_flying++; + } + self->capturing = TRUE; + fpi_ssm_next_state (ssm); } -static void capsm_2016_run_state(FpiSsm *ssm, FpDevice *_dev, - void *user_data) +static void +capsm_2016_run_state (FpiSsm *ssm, FpDevice *_dev, + void *user_data) { - FpImageDevice *dev = user_data; - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(_dev); + FpImageDevice *dev = user_data; + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (_dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case CAPSM_2016_INIT: - self->rowbuf_offset = -1; - self->num_rows = 0; - self->wraparounds = -1; - self->num_blank = 0; - self->num_nonblank = 0; - self->finger_state = FINGER_DETECTED; - self->last_seqnum = 16383; - self->killing_transfers = 0; - fpi_ssm_next_state(ssm); - break; - case CAPSM_2016_WRITE_15: - sm_write_reg(ssm, dev, 0x15, 0x20); - break; - case CAPSM_2016_WRITE_30: - sm_write_reg(ssm, dev, 0x30, 0xe0); - break; - case CAPSM_2016_FIRE_BULK: ; - capsm_fire_bulk (ssm, _dev); - break; - case CAPSM_2016_WRITEV: - sm_write_regs(ssm, _dev, capsm_2016_writev, G_N_ELEMENTS(capsm_2016_writev)); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case CAPSM_2016_INIT: + self->rowbuf_offset = -1; + self->num_rows = 0; + self->wraparounds = -1; + self->num_blank = 0; + self->num_nonblank = 0; + self->finger_state = FINGER_DETECTED; + self->last_seqnum = 16383; + self->killing_transfers = 0; + fpi_ssm_next_state (ssm); + break; + + case CAPSM_2016_WRITE_15: + sm_write_reg (ssm, dev, 0x15, 0x20); + break; + + case CAPSM_2016_WRITE_30: + sm_write_reg (ssm, dev, 0x30, 0xe0); + break; + + case CAPSM_2016_FIRE_BULK:; + capsm_fire_bulk (ssm, _dev); + break; + + case CAPSM_2016_WRITEV: + sm_write_regs (ssm, _dev, capsm_2016_writev, G_N_ELEMENTS (capsm_2016_writev)); + break; + } } -static void capsm_1000_run_state(FpiSsm *ssm, FpDevice *_dev, - void *user_data) +static void +capsm_1000_run_state (FpiSsm *ssm, FpDevice *_dev, + void *user_data) { - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(_dev); + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (_dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case CAPSM_1000_INIT: - self->rowbuf_offset = -1; - self->num_rows = 0; - self->wraparounds = -1; - self->num_blank = 0; - self->num_nonblank = 0; - self->finger_state = FINGER_DETECTED; - self->last_seqnum = 16383; - self->killing_transfers = 0; - fpi_ssm_next_state(ssm); - break; - case CAPSM_1000_FIRE_BULK: ; - capsm_fire_bulk (ssm, _dev); - break; - case CAPSM_1000_WRITEV: - sm_write_regs(ssm, _dev, capsm_1000_writev, G_N_ELEMENTS(capsm_1000_writev)); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case CAPSM_1000_INIT: + self->rowbuf_offset = -1; + self->num_rows = 0; + self->wraparounds = -1; + self->num_blank = 0; + self->num_nonblank = 0; + self->finger_state = FINGER_DETECTED; + self->last_seqnum = 16383; + self->killing_transfers = 0; + fpi_ssm_next_state (ssm); + break; + + case CAPSM_1000_FIRE_BULK:; + capsm_fire_bulk (ssm, _dev); + break; + + case CAPSM_1000_WRITEV: + sm_write_regs (ssm, _dev, capsm_1000_writev, G_N_ELEMENTS (capsm_1000_writev)); + break; + } } -static void capsm_1001_run_state(FpiSsm *ssm, FpDevice *_dev, - void *user_data) +static void +capsm_1001_run_state (FpiSsm *ssm, FpDevice *_dev, + void *user_data) { - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(_dev); + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (_dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case CAPSM_1001_INIT: - self->rowbuf_offset = -1; - self->num_rows = 0; - self->wraparounds = -1; - self->num_blank = 0; - self->num_nonblank = 0; - self->finger_state = AWAIT_FINGER; - self->last_seqnum = 16383; - self->killing_transfers = 0; - fpi_ssm_next_state(ssm); - break; - case CAPSM_1001_FIRE_BULK: ; - capsm_fire_bulk (ssm, _dev); - break; - case CAPSM_1001_WRITEV_1: - sm_write_regs(ssm, _dev, capsm_1001_writev_1, G_N_ELEMENTS(capsm_1001_writev_1)); - break; - case CAPSM_1001_WRITEV_2: - sm_write_regs(ssm, _dev, capsm_1001_writev_2, G_N_ELEMENTS(capsm_1001_writev_2)); - break; - case CAPSM_1001_WRITEV_3: - sm_write_regs(ssm, _dev, capsm_1001_writev_3, G_N_ELEMENTS(capsm_1001_writev_3)); - break; - case CAPSM_1001_WRITEV_4: - sm_write_regs(ssm, _dev, capsm_1001_writev_4, G_N_ELEMENTS(capsm_1001_writev_4)); - break; - case CAPSM_1001_WRITEV_5: - sm_write_regs(ssm, _dev, capsm_1001_writev_5, G_N_ELEMENTS(capsm_1001_writev_5)); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case CAPSM_1001_INIT: + self->rowbuf_offset = -1; + self->num_rows = 0; + self->wraparounds = -1; + self->num_blank = 0; + self->num_nonblank = 0; + self->finger_state = AWAIT_FINGER; + self->last_seqnum = 16383; + self->killing_transfers = 0; + fpi_ssm_next_state (ssm); + break; + + case CAPSM_1001_FIRE_BULK:; + capsm_fire_bulk (ssm, _dev); + break; + + case CAPSM_1001_WRITEV_1: + sm_write_regs (ssm, _dev, capsm_1001_writev_1, G_N_ELEMENTS (capsm_1001_writev_1)); + break; + + case CAPSM_1001_WRITEV_2: + sm_write_regs (ssm, _dev, capsm_1001_writev_2, G_N_ELEMENTS (capsm_1001_writev_2)); + break; + + case CAPSM_1001_WRITEV_3: + sm_write_regs (ssm, _dev, capsm_1001_writev_3, G_N_ELEMENTS (capsm_1001_writev_3)); + break; + + case CAPSM_1001_WRITEV_4: + sm_write_regs (ssm, _dev, capsm_1001_writev_4, G_N_ELEMENTS (capsm_1001_writev_4)); + break; + + case CAPSM_1001_WRITEV_5: + sm_write_regs (ssm, _dev, capsm_1001_writev_5, G_N_ELEMENTS (capsm_1001_writev_5)); + break; + } } /***** DEINITIALIZATION *****/ enum deinitsm_2016_states { - DEINITSM_2016_WRITEV, - DEINITSM_2016_NUM_STATES, + DEINITSM_2016_WRITEV, + DEINITSM_2016_NUM_STATES, }; enum deinitsm_1000_states { - DEINITSM_1000_WRITEV, - DEINITSM_1000_NUM_STATES, + DEINITSM_1000_WRITEV, + DEINITSM_1000_NUM_STATES, }; enum deinitsm_1001_states { - DEINITSM_1001_WRITEV, - DEINITSM_1001_NUM_STATES, + DEINITSM_1001_WRITEV, + DEINITSM_1001_NUM_STATES, }; -static void deinitsm_2016_run_state(FpiSsm *ssm, FpDevice *_dev, - void *user_data) +static void +deinitsm_2016_run_state (FpiSsm *ssm, FpDevice *_dev, + void *user_data) { - switch (fpi_ssm_get_cur_state(ssm)) { - case DEINITSM_2016_WRITEV: - sm_write_regs(ssm, _dev, deinitsm_2016_writev, G_N_ELEMENTS(deinitsm_2016_writev)); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case DEINITSM_2016_WRITEV: + sm_write_regs (ssm, _dev, deinitsm_2016_writev, G_N_ELEMENTS (deinitsm_2016_writev)); + break; + } } -static void deinitsm_1000_run_state(FpiSsm *ssm, FpDevice *_dev, - void *user_data) +static void +deinitsm_1000_run_state (FpiSsm *ssm, FpDevice *_dev, + void *user_data) { - switch (fpi_ssm_get_cur_state(ssm)) { - case DEINITSM_1000_WRITEV: - sm_write_regs(ssm, _dev, deinitsm_1000_writev, G_N_ELEMENTS(deinitsm_1000_writev)); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case DEINITSM_1000_WRITEV: + sm_write_regs (ssm, _dev, deinitsm_1000_writev, G_N_ELEMENTS (deinitsm_1000_writev)); + break; + } } -static void deinitsm_1001_run_state(FpiSsm *ssm, FpDevice *_dev, - void *user_data) +static void +deinitsm_1001_run_state (FpiSsm *ssm, FpDevice *_dev, + void *user_data) { - switch (fpi_ssm_get_cur_state(ssm)) { - case DEINITSM_1001_WRITEV: - sm_write_regs(ssm, _dev, deinitsm_1001_writev, G_N_ELEMENTS(deinitsm_1001_writev)); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case DEINITSM_1001_WRITEV: + sm_write_regs (ssm, _dev, deinitsm_1001_writev, G_N_ELEMENTS (deinitsm_1001_writev)); + break; + } } /***** INITIALIZATION *****/ enum initsm_2016_states { - INITSM_2016_WRITEV_1, - INITSM_2016_READ_09, - INITSM_2016_WRITE_09, - INITSM_2016_READ_13, - INITSM_2016_WRITE_13, - INITSM_2016_WRITE_04, - INITSM_2016_WRITE_05, - INITSM_2016_NUM_STATES, + INITSM_2016_WRITEV_1, + INITSM_2016_READ_09, + INITSM_2016_WRITE_09, + INITSM_2016_READ_13, + INITSM_2016_WRITE_13, + INITSM_2016_WRITE_04, + INITSM_2016_WRITE_05, + INITSM_2016_NUM_STATES, }; enum initsm_1000_states { - INITSM_1000_WRITEV_1, - INITSM_1000_NUM_STATES, + INITSM_1000_WRITEV_1, + INITSM_1000_NUM_STATES, }; enum initsm_1001_states { - INITSM_1001_WRITEV_1, - INITSM_1001_WRITEV_2, - INITSM_1001_WRITEV_3, - INITSM_1001_WRITEV_4, - INITSM_1001_WRITEV_5, - INITSM_1001_NUM_STATES, + INITSM_1001_WRITEV_1, + INITSM_1001_WRITEV_2, + INITSM_1001_WRITEV_3, + INITSM_1001_WRITEV_4, + INITSM_1001_WRITEV_5, + INITSM_1001_NUM_STATES, }; -static void initsm_2016_run_state(FpiSsm *ssm, FpDevice *_dev, - void *user_data) +static void +initsm_2016_run_state (FpiSsm *ssm, FpDevice *_dev, + void *user_data) { - FpImageDevice *dev = user_data; - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(_dev); + FpImageDevice *dev = user_data; + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (_dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case INITSM_2016_WRITEV_1: - sm_write_regs(ssm, _dev, initsm_2016_writev_1, G_N_ELEMENTS(initsm_2016_writev_1)); - break; - case INITSM_2016_READ_09: - sm_read_reg(ssm, dev, 0x09); - break; - case INITSM_2016_WRITE_09: - sm_write_reg(ssm, dev, 0x09, self->read_reg_result & ~0x08); - break; - case INITSM_2016_READ_13: - sm_read_reg(ssm, dev, 0x13); - break; - case INITSM_2016_WRITE_13: - sm_write_reg(ssm, dev, 0x13, self->read_reg_result & ~0x10); - break; - case INITSM_2016_WRITE_04: - sm_write_reg(ssm, dev, 0x04, 0x00); - break; - case INITSM_2016_WRITE_05: - sm_write_reg(ssm, dev, 0x05, 0x00); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case INITSM_2016_WRITEV_1: + sm_write_regs (ssm, _dev, initsm_2016_writev_1, G_N_ELEMENTS (initsm_2016_writev_1)); + break; + + case INITSM_2016_READ_09: + sm_read_reg (ssm, dev, 0x09); + break; + + case INITSM_2016_WRITE_09: + sm_write_reg (ssm, dev, 0x09, self->read_reg_result & ~0x08); + break; + + case INITSM_2016_READ_13: + sm_read_reg (ssm, dev, 0x13); + break; + + case INITSM_2016_WRITE_13: + sm_write_reg (ssm, dev, 0x13, self->read_reg_result & ~0x10); + break; + + case INITSM_2016_WRITE_04: + sm_write_reg (ssm, dev, 0x04, 0x00); + break; + + case INITSM_2016_WRITE_05: + sm_write_reg (ssm, dev, 0x05, 0x00); + break; + } } -static void initsm_1000_run_state(FpiSsm *ssm, FpDevice *_dev, - void *user_data) +static void +initsm_1000_run_state (FpiSsm *ssm, FpDevice *_dev, + void *user_data) { - switch (fpi_ssm_get_cur_state(ssm)) { - case INITSM_1000_WRITEV_1: - sm_write_regs(ssm, _dev, initsm_1000_writev_1, G_N_ELEMENTS(initsm_1000_writev_1)); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case INITSM_1000_WRITEV_1: + sm_write_regs (ssm, _dev, initsm_1000_writev_1, G_N_ELEMENTS (initsm_1000_writev_1)); + break; + } } -static void initsm_1001_run_state(FpiSsm *ssm, FpDevice *_dev, - void *user_data) +static void +initsm_1001_run_state (FpiSsm *ssm, FpDevice *_dev, + void *user_data) { - switch (fpi_ssm_get_cur_state(ssm)) { - case INITSM_1001_WRITEV_1: - sm_write_regs(ssm, _dev, initsm_1001_writev_1, G_N_ELEMENTS(initsm_1001_writev_1)); - break; - case INITSM_1001_WRITEV_2: - sm_write_regs(ssm, _dev, initsm_1001_writev_2, G_N_ELEMENTS(initsm_1001_writev_2)); - break; - case INITSM_1001_WRITEV_3: - sm_write_regs(ssm, _dev, initsm_1001_writev_3, G_N_ELEMENTS(initsm_1001_writev_3)); - break; - case INITSM_1001_WRITEV_4: - sm_write_regs(ssm, _dev, initsm_1001_writev_4, G_N_ELEMENTS(initsm_1001_writev_4)); - break; - case INITSM_1001_WRITEV_5: - sm_write_regs(ssm, _dev, initsm_1001_writev_5, G_N_ELEMENTS(initsm_1001_writev_5)); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case INITSM_1001_WRITEV_1: + sm_write_regs (ssm, _dev, initsm_1001_writev_1, G_N_ELEMENTS (initsm_1001_writev_1)); + break; + + case INITSM_1001_WRITEV_2: + sm_write_regs (ssm, _dev, initsm_1001_writev_2, G_N_ELEMENTS (initsm_1001_writev_2)); + break; + + case INITSM_1001_WRITEV_3: + sm_write_regs (ssm, _dev, initsm_1001_writev_3, G_N_ELEMENTS (initsm_1001_writev_3)); + break; + + case INITSM_1001_WRITEV_4: + sm_write_regs (ssm, _dev, initsm_1001_writev_4, G_N_ELEMENTS (initsm_1001_writev_4)); + break; + + case INITSM_1001_WRITEV_5: + sm_write_regs (ssm, _dev, initsm_1001_writev_5, G_N_ELEMENTS (initsm_1001_writev_5)); + break; + } } /***** CAPTURE LOOP *****/ enum loopsm_states { - LOOPSM_RUN_AWFSM, - LOOPSM_AWAIT_FINGER, - LOOPSM_RUN_CAPSM, - LOOPSM_CAPTURE, - LOOPSM_RUN_DEINITSM, - LOOPSM_FINAL, - LOOPSM_NUM_STATES, + LOOPSM_RUN_AWFSM, + LOOPSM_AWAIT_FINGER, + LOOPSM_RUN_CAPSM, + LOOPSM_CAPTURE, + LOOPSM_RUN_DEINITSM, + LOOPSM_FINAL, + LOOPSM_NUM_STATES, }; -static void loopsm_run_state(FpiSsm *ssm, FpDevice *_dev, void *user_data) +static void +loopsm_run_state (FpiSsm *ssm, FpDevice *_dev, void *user_data) { - FpImageDevice *dev = user_data; - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(_dev); + FpImageDevice *dev = user_data; + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (_dev); + + switch (fpi_ssm_get_cur_state (ssm)) + { + case LOOPSM_RUN_AWFSM:; + switch (self->dev_model) + { + case UPEKSONLY_1001: + if (self->deactivating) + fpi_ssm_mark_completed (ssm); + else + fpi_ssm_next_state (ssm); + break; + + default: + if (self->deactivating) + { + fpi_ssm_mark_completed (ssm); + } + else + { + FpiSsm *awfsm = NULL; + switch (self->dev_model) + { + case UPEKSONLY_2016: + awfsm = fpi_ssm_new (FP_DEVICE (dev), + awfsm_2016_run_state, + AWFSM_2016_NUM_STATES, + dev); + break; + + case UPEKSONLY_1000: + awfsm = fpi_ssm_new (FP_DEVICE (dev), + awfsm_1000_run_state, + AWFSM_1000_NUM_STATES, + dev); + break; + } + fpi_ssm_start_subsm (ssm, awfsm); + } + break; + } + break; + + case LOOPSM_AWAIT_FINGER: + switch (self->dev_model) + { + case UPEKSONLY_1001: + fpi_ssm_next_state (ssm); + break; + + default: + sm_await_intr (ssm, dev); + break; + } + break; + + case LOOPSM_RUN_CAPSM:; + FpiSsm *capsm = NULL; + switch (self->dev_model) + { + case UPEKSONLY_2016: + capsm = fpi_ssm_new (FP_DEVICE (dev), + capsm_2016_run_state, + CAPSM_2016_NUM_STATES, dev); + break; + + case UPEKSONLY_1000: + capsm = fpi_ssm_new (FP_DEVICE (dev), + capsm_1000_run_state, + CAPSM_1000_NUM_STATES, dev); + break; + + case UPEKSONLY_1001: + capsm = fpi_ssm_new (FP_DEVICE (dev), + capsm_1001_run_state, + CAPSM_1001_NUM_STATES, dev); + break; + } + fpi_ssm_start_subsm (ssm, capsm); + break; + + case LOOPSM_CAPTURE: + break; + + case LOOPSM_RUN_DEINITSM:; + FpiSsm *deinitsm = NULL; + switch (self->dev_model) + { + case UPEKSONLY_2016: + deinitsm = fpi_ssm_new (FP_DEVICE (dev), + deinitsm_2016_run_state, + DEINITSM_2016_NUM_STATES, dev); + break; + + case UPEKSONLY_1000: + deinitsm = fpi_ssm_new (FP_DEVICE (dev), + deinitsm_1000_run_state, + DEINITSM_1000_NUM_STATES, dev); + break; + + case UPEKSONLY_1001: + deinitsm = fpi_ssm_new (FP_DEVICE (dev), + deinitsm_1001_run_state, + DEINITSM_1001_NUM_STATES, dev); + break; + } + self->capturing = FALSE; + fpi_ssm_start_subsm (ssm, deinitsm); + break; + + case LOOPSM_FINAL: + fpi_ssm_jump_to_state (ssm, LOOPSM_RUN_AWFSM); + break; + } - switch (fpi_ssm_get_cur_state(ssm)) { - case LOOPSM_RUN_AWFSM: ; - switch (self->dev_model) { - case UPEKSONLY_1001: - if (self->deactivating) { - fpi_ssm_mark_completed(ssm); - } else { - fpi_ssm_next_state(ssm); - } - break; - default: - if (self->deactivating) { - fpi_ssm_mark_completed(ssm); - } else { - FpiSsm *awfsm = NULL; - switch (self->dev_model) { - case UPEKSONLY_2016: - awfsm = fpi_ssm_new(FP_DEVICE(dev), - awfsm_2016_run_state, - AWFSM_2016_NUM_STATES, - dev); - break; - case UPEKSONLY_1000: - awfsm = fpi_ssm_new(FP_DEVICE(dev), - awfsm_1000_run_state, - AWFSM_1000_NUM_STATES, - dev); - break; - } - fpi_ssm_start_subsm(ssm, awfsm); - } - break; - } - break; - case LOOPSM_AWAIT_FINGER: - switch (self->dev_model) { - case UPEKSONLY_1001: - fpi_ssm_next_state(ssm); - break; - default: - sm_await_intr(ssm, dev); - break; - } - break; - case LOOPSM_RUN_CAPSM: ; - FpiSsm *capsm = NULL; - switch (self->dev_model) { - case UPEKSONLY_2016: - capsm = fpi_ssm_new(FP_DEVICE(dev), - capsm_2016_run_state, - CAPSM_2016_NUM_STATES, dev); - break; - case UPEKSONLY_1000: - capsm = fpi_ssm_new(FP_DEVICE(dev), - capsm_1000_run_state, - CAPSM_1000_NUM_STATES, dev); - break; - case UPEKSONLY_1001: - capsm = fpi_ssm_new(FP_DEVICE(dev), - capsm_1001_run_state, - CAPSM_1001_NUM_STATES, dev); - break; - } - fpi_ssm_start_subsm(ssm, capsm); - break; - case LOOPSM_CAPTURE: - break; - case LOOPSM_RUN_DEINITSM: ; - FpiSsm *deinitsm = NULL; - switch (self->dev_model) { - case UPEKSONLY_2016: - deinitsm = fpi_ssm_new(FP_DEVICE(dev), - deinitsm_2016_run_state, - DEINITSM_2016_NUM_STATES, dev); - break; - case UPEKSONLY_1000: - deinitsm = fpi_ssm_new(FP_DEVICE(dev), - deinitsm_1000_run_state, - DEINITSM_1000_NUM_STATES, dev); - break; - case UPEKSONLY_1001: - deinitsm = fpi_ssm_new(FP_DEVICE(dev), - deinitsm_1001_run_state, - DEINITSM_1001_NUM_STATES, dev); - break; - } - self->capturing = FALSE; - fpi_ssm_start_subsm(ssm, deinitsm); - break; - case LOOPSM_FINAL: - fpi_ssm_jump_to_state(ssm, LOOPSM_RUN_AWFSM); - break; - } - } /***** DRIVER STUFF *****/ -static void deactivate_done(FpImageDevice *dev, GError *error) +static void +deactivate_done (FpImageDevice *dev, GError *error) { - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(dev); + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (dev); - G_DEBUG_HERE(); - free_img_transfers(self); - g_free(self->rowbuf); - self->rowbuf = NULL; + G_DEBUG_HERE (); + free_img_transfers (self); + g_free (self->rowbuf); + self->rowbuf = NULL; - g_slist_free_full (self->rows, g_free); - self->rows = NULL; + g_slist_free_full (self->rows, g_free); + self->rows = NULL; - fpi_image_device_deactivate_complete(dev, error); + fpi_image_device_deactivate_complete (dev, error); } -static void dev_deactivate(FpImageDevice *dev) +static void +dev_deactivate (FpImageDevice *dev) { - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(dev); + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (dev); - if (!self->capturing) { - deactivate_done(dev, NULL); - return; - } + if (!self->capturing) + { + deactivate_done (dev, NULL); + return; + } - self->deactivating = TRUE; - self->killing_transfers = ITERATE_SSM; - self->kill_ssm = self->loopsm; - cancel_img_transfers(dev); + self->deactivating = TRUE; + self->killing_transfers = ITERATE_SSM; + self->kill_ssm = self->loopsm; + cancel_img_transfers (dev); } -static void loopsm_complete(FpiSsm *ssm, FpDevice *_dev, void *user_data, GError *error) +static void +loopsm_complete (FpiSsm *ssm, FpDevice *_dev, void *user_data, GError *error) { - FpImageDevice *dev = user_data; - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(_dev); + FpImageDevice *dev = user_data; + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (_dev); - fpi_ssm_free(ssm); + fpi_ssm_free (ssm); - if (self->deactivating) { - deactivate_done(dev, error); - return; - } + if (self->deactivating) + { + deactivate_done (dev, error); + return; + } - if (error) { - fpi_image_device_session_error(dev, error); - return; - } + if (error) + { + fpi_image_device_session_error (dev, error); + return; + } } -static void initsm_complete(FpiSsm *ssm, FpDevice *_dev, void *user_data, - GError *error) +static void +initsm_complete (FpiSsm *ssm, FpDevice *_dev, void *user_data, + GError *error) { - FpImageDevice *dev = user_data; - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(_dev); + FpImageDevice *dev = user_data; + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (_dev); - fpi_ssm_free(ssm); - fpi_image_device_activate_complete(dev, error); - if (error) - return; + fpi_ssm_free (ssm); + fpi_image_device_activate_complete (dev, error); + if (error) + return; - self->loopsm = fpi_ssm_new(FP_DEVICE(dev), loopsm_run_state, - LOOPSM_NUM_STATES, dev); - fpi_ssm_start(self->loopsm, loopsm_complete); + self->loopsm = fpi_ssm_new (FP_DEVICE (dev), loopsm_run_state, + LOOPSM_NUM_STATES, dev); + fpi_ssm_start (self->loopsm, loopsm_complete); } -static void dev_activate(FpImageDevice *dev) +static void +dev_activate (FpImageDevice *dev) { - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY(dev); - FpiSsm *ssm = NULL; - int i; + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (dev); + FpiSsm *ssm = NULL; + int i; - self->deactivating = FALSE; - self->capturing = FALSE; + self->deactivating = FALSE; + self->capturing = FALSE; - self->img_transfers = g_ptr_array_new_full(NUM_BULK_TRANSFERS, (GDestroyNotify) fpi_usb_transfer_unref); - self->num_flying = 0; + self->img_transfers = g_ptr_array_new_full (NUM_BULK_TRANSFERS, (GDestroyNotify) fpi_usb_transfer_unref); + self->num_flying = 0; - for (i = 0; i < self->img_transfers->len; i++) { - FpiUsbTransfer *transfer; + for (i = 0; i < self->img_transfers->len; i++) + { + FpiUsbTransfer *transfer; - transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); - fpi_usb_transfer_fill_bulk (transfer, 0x81, 4096); + transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); + fpi_usb_transfer_fill_bulk (transfer, 0x81, 4096); - g_ptr_array_add (self->img_transfers, transfer); - } + g_ptr_array_add (self->img_transfers, transfer); + } - switch (self->dev_model) { - case UPEKSONLY_2016: - ssm = fpi_ssm_new(FP_DEVICE(dev), initsm_2016_run_state, - INITSM_2016_NUM_STATES, dev); - break; - case UPEKSONLY_1000: - ssm = fpi_ssm_new(FP_DEVICE(dev), initsm_1000_run_state, - INITSM_1000_NUM_STATES, dev); - break; - case UPEKSONLY_1001: - ssm = fpi_ssm_new(FP_DEVICE(dev), initsm_1001_run_state, - INITSM_1001_NUM_STATES, dev); - break; - } - fpi_ssm_start(ssm, initsm_complete); + switch (self->dev_model) + { + case UPEKSONLY_2016: + ssm = fpi_ssm_new (FP_DEVICE (dev), initsm_2016_run_state, + INITSM_2016_NUM_STATES, dev); + break; + + case UPEKSONLY_1000: + ssm = fpi_ssm_new (FP_DEVICE (dev), initsm_1000_run_state, + INITSM_1000_NUM_STATES, dev); + break; + + case UPEKSONLY_1001: + ssm = fpi_ssm_new (FP_DEVICE (dev), initsm_1001_run_state, + INITSM_1001_NUM_STATES, dev); + break; + } + fpi_ssm_start (ssm, initsm_complete); } -static void dev_init(FpImageDevice *dev); +static void dev_init (FpImageDevice *dev); -static void dev_deinit(FpImageDevice *dev) +static void +dev_deinit (FpImageDevice *dev) { - GError *error = NULL; + GError *error = NULL; - g_usb_device_release_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), - 0, 0, &error); - fpi_image_device_close_complete(dev, error); + g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), + 0, 0, &error); + fpi_image_device_close_complete (dev, error); } -static gint dev_discover(GUsbDevice *usb_device) +static gint +dev_discover (GUsbDevice *usb_device) { - guint16 pid = g_usb_device_get_pid (usb_device); - guint16 bcd = g_usb_device_get_release (usb_device); + guint16 pid = g_usb_device_get_pid (usb_device); + guint16 bcd = g_usb_device_get_release (usb_device); - if (pid == 0x2016) { - if (bcd == 1) /* Revision 1 is what we're interested in */ - return 1; - } - if (pid == 0x1000) { - if (bcd == 0x0033) /* Looking for revision 0.33 */ - return 1; - } + if (pid == 0x2016) + if (bcd == 1) /* Revision 1 is what we're interested in */ + return 1; + if (pid == 0x1000) + if (bcd == 0x0033) /* Looking for revision 0.33 */ + return 1; - if (pid == 0x1001) - return 1; + if (pid == 0x1001) + return 1; - return 0; + return 0; } -static const FpIdEntry id_table [ ] = { - { .vid = 0x147e, .pid = 0x2016, .driver_data = UPEKSONLY_2016 }, - { .vid = 0x147e, .pid = 0x1000, .driver_data = UPEKSONLY_1000 }, - { .vid = 0x147e, .pid = 0x1001, .driver_data = UPEKSONLY_1001 }, - { .vid = 0, .pid = 0, .driver_data = 0 }, +static const FpIdEntry id_table[] = { + { .vid = 0x147e, .pid = 0x2016, .driver_data = UPEKSONLY_2016 }, + { .vid = 0x147e, .pid = 0x1000, .driver_data = UPEKSONLY_1000 }, + { .vid = 0x147e, .pid = 0x1001, .driver_data = UPEKSONLY_1001 }, + { .vid = 0, .pid = 0, .driver_data = 0 }, }; -static void fpi_device_upeksonly_init(FpiDeviceUpeksonly *self) { -} -static void fpi_device_upeksonly_class_init(FpiDeviceUpeksonlyClass *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); - FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS(klass); - - dev_class->id = "upeksonly"; - dev_class->full_name = "UPEK TouchStrip Sensor-Only"; - dev_class->type = FP_DEVICE_TYPE_USB; - dev_class->id_table = id_table; - dev_class->scan_type = FP_SCAN_TYPE_SWIPE; - - dev_class->usb_discover = dev_discover; - - img_class->img_open = dev_init; - img_class->img_close = dev_deinit; - img_class->activate = dev_activate; - img_class->deactivate = dev_deactivate; - - img_class->img_width = -1; - img_class->img_height = -1; -} - -static void dev_init(FpImageDevice *dev) +static void +fpi_device_upeksonly_init (FpiDeviceUpeksonly *self) { - GError *error = NULL; - FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (dev); +} +static void +fpi_device_upeksonly_class_init (FpiDeviceUpeksonlyClass *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); + FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); - if (!g_usb_device_set_configuration (fpi_device_get_usb_device(FP_DEVICE(dev)), 1, &error)) { - fp_err("could not set configuration 1"); - fpi_image_device_open_complete(dev, error); - } + dev_class->id = "upeksonly"; + dev_class->full_name = "UPEK TouchStrip Sensor-Only"; + dev_class->type = FP_DEVICE_TYPE_USB; + dev_class->id_table = id_table; + dev_class->scan_type = FP_SCAN_TYPE_SWIPE; - if (!g_usb_device_claim_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), 0, 0, &error)) { - fpi_image_device_open_complete(dev, error); - return; - } + dev_class->usb_discover = dev_discover; - self->assembling_ctx.max_height = 1024; - self->assembling_ctx.resolution = 8; - self->assembling_ctx.median_filter_size = 25; - self->assembling_ctx.max_search_offset = 30; - self->assembling_ctx.get_deviation = upeksonly_get_deviation2; - self->assembling_ctx.get_pixel = upeksonly_get_pixel; + img_class->img_open = dev_init; + img_class->img_close = dev_deinit; + img_class->activate = dev_activate; + img_class->deactivate = dev_deactivate; - self = FPI_DEVICE_UPEKSONLY(dev); - self->dev_model = (int)fpi_device_get_driver_data (FP_DEVICE (dev)); - switch (self->dev_model) { - case UPEKSONLY_1000: - self->img_width = IMG_WIDTH_1000; - self->assembling_ctx.line_width = IMG_WIDTH_1000; - break; - case UPEKSONLY_1001: - self->img_width = IMG_WIDTH_1001; - self->assembling_ctx.line_width = IMG_WIDTH_1001; - - /* The sensor resolution is too low for the normal threshold. */ - fpi_image_device_set_bz3_threshold (dev, 25); - break; - case UPEKSONLY_2016: - self->img_width = IMG_WIDTH_2016; - self->assembling_ctx.line_width = IMG_WIDTH_2016; - break; - default: - g_assert_not_reached (); - } - fpi_image_device_open_complete(dev, NULL); + img_class->img_width = -1; + img_class->img_height = -1; } +static void +dev_init (FpImageDevice *dev) +{ + GError *error = NULL; + FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (dev); + if (!g_usb_device_set_configuration (fpi_device_get_usb_device (FP_DEVICE (dev)), 1, &error)) + { + fp_err ("could not set configuration 1"); + fpi_image_device_open_complete (dev, error); + } + + if (!g_usb_device_claim_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), 0, 0, &error)) + { + fpi_image_device_open_complete (dev, error); + return; + } + + self->assembling_ctx.max_height = 1024; + self->assembling_ctx.resolution = 8; + self->assembling_ctx.median_filter_size = 25; + self->assembling_ctx.max_search_offset = 30; + self->assembling_ctx.get_deviation = upeksonly_get_deviation2; + self->assembling_ctx.get_pixel = upeksonly_get_pixel; + + self = FPI_DEVICE_UPEKSONLY (dev); + self->dev_model = (int) fpi_device_get_driver_data (FP_DEVICE (dev)); + switch (self->dev_model) + { + case UPEKSONLY_1000: + self->img_width = IMG_WIDTH_1000; + self->assembling_ctx.line_width = IMG_WIDTH_1000; + break; + + case UPEKSONLY_1001: + self->img_width = IMG_WIDTH_1001; + self->assembling_ctx.line_width = IMG_WIDTH_1001; + + /* The sensor resolution is too low for the normal threshold. */ + fpi_image_device_set_bz3_threshold (dev, 25); + break; + + case UPEKSONLY_2016: + self->img_width = IMG_WIDTH_2016; + self->assembling_ctx.line_width = IMG_WIDTH_2016; + break; + + default: + g_assert_not_reached (); + } + fpi_image_device_open_complete (dev, NULL); +} diff --git a/libfprint/drivers/upeksonly.h b/libfprint/drivers/upeksonly.h index cd48a32..611afda 100644 --- a/libfprint/drivers/upeksonly.h +++ b/libfprint/drivers/upeksonly.h @@ -23,297 +23,298 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#define IMG_WIDTH_2016 288 -#define IMG_WIDTH_1000 288 -#define IMG_WIDTH_1001 216 +#define IMG_WIDTH_2016 288 +#define IMG_WIDTH_1000 288 +#define IMG_WIDTH_1001 216 -struct sonly_regwrite { - guint8 reg; - guint8 value; +struct sonly_regwrite +{ + guint8 reg; + guint8 value; }; /***** AWAIT FINGER *****/ static const struct sonly_regwrite awfsm_2016_writev_1[] = { - { 0x0a, 0x00 }, { 0x0a, 0x00 }, { 0x09, 0x20 }, { 0x03, 0x3b }, - { 0x00, 0x67 }, { 0x00, 0x67 }, + { 0x0a, 0x00 }, { 0x0a, 0x00 }, { 0x09, 0x20 }, { 0x03, 0x3b }, + { 0x00, 0x67 }, { 0x00, 0x67 }, }; static const struct sonly_regwrite awfsm_1000_writev_1[] = { - /* Initialize sensor settings */ - { 0x0a, 0x00 }, { 0x09, 0x20 }, { 0x03, 0x37 }, { 0x00, 0x5f }, - { 0x01, 0x6e }, { 0x01, 0xee }, { 0x0c, 0x13 }, { 0x0d, 0x0d }, - { 0x0e, 0x0e }, { 0x0f, 0x0d }, + /* Initialize sensor settings */ + { 0x0a, 0x00 }, { 0x09, 0x20 }, { 0x03, 0x37 }, { 0x00, 0x5f }, + { 0x01, 0x6e }, { 0x01, 0xee }, { 0x0c, 0x13 }, { 0x0d, 0x0d }, + { 0x0e, 0x0e }, { 0x0f, 0x0d }, - { 0x13, 0x05 }, { 0x13, 0x45 }, + { 0x13, 0x05 }, { 0x13, 0x45 }, - /* Initialize finger detection registers (not enabling yet) */ - { 0x30, 0xe0 }, { 0x15, 0x26 }, + /* Initialize finger detection registers (not enabling yet) */ + { 0x30, 0xe0 }, { 0x15, 0x26 }, - { 0x12, 0x01 }, { 0x20, 0x01 }, { 0x07, 0x10 }, - { 0x10, 0x00 }, { 0x11, 0xbf }, + { 0x12, 0x01 }, { 0x20, 0x01 }, { 0x07, 0x10 }, + { 0x10, 0x00 }, { 0x11, 0xbf }, }; static const struct sonly_regwrite awfsm_2016_writev_2[] = { - { 0x01, 0xc6 }, { 0x0c, 0x13 }, { 0x0d, 0x0d }, { 0x0e, 0x0e }, - { 0x0f, 0x0d }, { 0x0b, 0x00 }, + { 0x01, 0xc6 }, { 0x0c, 0x13 }, { 0x0d, 0x0d }, { 0x0e, 0x0e }, + { 0x0f, 0x0d }, { 0x0b, 0x00 }, }; static const struct sonly_regwrite awfsm_1000_writev_2[] = { - /* Enable finger detection */ - { 0x30, 0xe1 }, { 0x15, 0x06 }, { 0x15, 0x86 }, + /* Enable finger detection */ + { 0x30, 0xe1 }, { 0x15, 0x06 }, { 0x15, 0x86 }, }; static const struct sonly_regwrite awfsm_2016_writev_3[] = { - { 0x13, 0x45 }, { 0x30, 0xe0 }, { 0x12, 0x01 }, { 0x20, 0x01 }, - { 0x09, 0x20 }, { 0x0a, 0x00 }, { 0x30, 0xe0 }, { 0x20, 0x01 }, + { 0x13, 0x45 }, { 0x30, 0xe0 }, { 0x12, 0x01 }, { 0x20, 0x01 }, + { 0x09, 0x20 }, { 0x0a, 0x00 }, { 0x30, 0xe0 }, { 0x20, 0x01 }, }; static const struct sonly_regwrite awfsm_2016_writev_4[] = { - { 0x08, 0x00 }, { 0x10, 0x00 }, { 0x12, 0x01 }, { 0x11, 0xbf }, - { 0x12, 0x01 }, { 0x07, 0x10 }, { 0x07, 0x10 }, { 0x04, 0x00 },\ - { 0x05, 0x00 }, { 0x0b, 0x00 }, - - /* enter finger detection mode */ - { 0x15, 0x20 }, { 0x30, 0xe1 }, { 0x15, 0x24 }, { 0x15, 0x04 }, - { 0x15, 0x84 }, + { 0x08, 0x00 }, { 0x10, 0x00 }, { 0x12, 0x01 }, { 0x11, 0xbf }, + { 0x12, 0x01 }, { 0x07, 0x10 }, { 0x07, 0x10 }, { 0x04, 0x00 }, \ + { 0x05, 0x00 }, { 0x0b, 0x00 }, + + /* enter finger detection mode */ + { 0x15, 0x20 }, { 0x30, 0xe1 }, { 0x15, 0x24 }, { 0x15, 0x04 }, + { 0x15, 0x84 }, }; /***** CAPTURE MODE *****/ static const struct sonly_regwrite capsm_2016_writev[] = { - /* enter capture mode */ - { 0x09, 0x28 }, { 0x13, 0x55 }, { 0x0b, 0x80 }, { 0x04, 0x00 }, - { 0x05, 0x00 }, + /* enter capture mode */ + { 0x09, 0x28 }, { 0x13, 0x55 }, { 0x0b, 0x80 }, { 0x04, 0x00 }, + { 0x05, 0x00 }, }; static const struct sonly_regwrite capsm_1000_writev[] = { - { 0x08, 0x80 }, { 0x13, 0x55 }, { 0x0b, 0x80 }, /* Enter capture mode */ + { 0x08, 0x80 }, { 0x13, 0x55 }, { 0x0b, 0x80 }, /* Enter capture mode */ }; static const struct sonly_regwrite capsm_1001_writev_1[] = { - { 0x1a, 0x02 }, - { 0x4a, 0x9d }, - { 0x4e, 0x05 }, + { 0x1a, 0x02 }, + { 0x4a, 0x9d }, + { 0x4e, 0x05 }, }; static const struct sonly_regwrite capsm_1001_writev_2[] = { - { 0x4d, 0xc0 }, { 0x4e, 0x09 }, + { 0x4d, 0xc0 }, { 0x4e, 0x09 }, }; static const struct sonly_regwrite capsm_1001_writev_3[] = { - { 0x4a, 0x9c }, - { 0x1a, 0x00 }, - { 0x0b, 0x00 }, - { 0x04, 0x00 }, - { 0x05, 0x00 }, - { 0x1a, 0x02 }, - { 0x4a, 0x9d }, - { 0x4d, 0x40 }, { 0x4e, 0x09 }, + { 0x4a, 0x9c }, + { 0x1a, 0x00 }, + { 0x0b, 0x00 }, + { 0x04, 0x00 }, + { 0x05, 0x00 }, + { 0x1a, 0x02 }, + { 0x4a, 0x9d }, + { 0x4d, 0x40 }, { 0x4e, 0x09 }, }; static const struct sonly_regwrite capsm_1001_writev_4[] = { - { 0x4a, 0x9c }, - { 0x1a, 0x00 }, - { 0x1a, 0x02 }, - { 0x4a, 0x9d }, - { 0x4e, 0x08 }, + { 0x4a, 0x9c }, + { 0x1a, 0x00 }, + { 0x1a, 0x02 }, + { 0x4a, 0x9d }, + { 0x4e, 0x08 }, }; static const struct sonly_regwrite capsm_1001_writev_5[] = { - { 0x4a, 0x9c }, - { 0x1a, 0x00 }, - { 0x1a, 0x02 }, - { 0x00, 0x5f }, { 0x01, 0xee }, - { 0x03, 0x2c }, - { 0x07, 0x00 }, { 0x08, 0x00 }, { 0x09, 0x29 }, { 0x0a, 0x00 }, { 0x0b, 0x00 }, { 0x0c, 0x13 }, { 0x0d, 0x0d }, { 0x0e, 0x0e }, - { 0x0f, 0x0d }, { 0x10, 0x00 }, { 0x11, 0x8f }, { 0x12, 0x01 }, { 0x13, 0x45 }, - { 0x15, 0x26 }, - { 0x1e, 0x02 }, - { 0x20, 0x01 }, - { 0x25, 0x8f }, - { 0x27, 0x23 }, - { 0x30, 0xe0 }, - { 0x07, 0x10 }, - { 0x09, 0x21 }, - { 0x13, 0x75 }, - { 0x0b, 0x80 }, + { 0x4a, 0x9c }, + { 0x1a, 0x00 }, + { 0x1a, 0x02 }, + { 0x00, 0x5f }, { 0x01, 0xee }, + { 0x03, 0x2c }, + { 0x07, 0x00 }, { 0x08, 0x00 }, { 0x09, 0x29 }, { 0x0a, 0x00 }, { 0x0b, 0x00 }, { 0x0c, 0x13 }, { 0x0d, 0x0d }, { 0x0e, 0x0e }, + { 0x0f, 0x0d }, { 0x10, 0x00 }, { 0x11, 0x8f }, { 0x12, 0x01 }, { 0x13, 0x45 }, + { 0x15, 0x26 }, + { 0x1e, 0x02 }, + { 0x20, 0x01 }, + { 0x25, 0x8f }, + { 0x27, 0x23 }, + { 0x30, 0xe0 }, + { 0x07, 0x10 }, + { 0x09, 0x21 }, + { 0x13, 0x75 }, + { 0x0b, 0x80 }, }; /***** DEINITIALIZATION *****/ static const struct sonly_regwrite deinitsm_2016_writev[] = { - /* reset + enter low power mode */ - { 0x0b, 0x00 }, { 0x09, 0x20 }, { 0x13, 0x45 }, { 0x13, 0x45 }, + /* reset + enter low power mode */ + { 0x0b, 0x00 }, { 0x09, 0x20 }, { 0x13, 0x45 }, { 0x13, 0x45 }, }; static const struct sonly_regwrite deinitsm_1000_writev[] = { - { 0x15, 0x26 }, { 0x30, 0xe0 }, /* Disable finger detection */ + { 0x15, 0x26 }, { 0x30, 0xe0 }, /* Disable finger detection */ - { 0x0b, 0x00 }, { 0x13, 0x45 }, { 0x08, 0x00 }, /* Disable capture mode */ + { 0x0b, 0x00 }, { 0x13, 0x45 }, { 0x08, 0x00 }, /* Disable capture mode */ }; static const struct sonly_regwrite deinitsm_1001_writev[] = { - { 0x0b, 0x00 }, - { 0x13, 0x45 }, - { 0x09, 0x29 }, - { 0x1a, 0x00 }, + { 0x0b, 0x00 }, + { 0x13, 0x45 }, + { 0x09, 0x29 }, + { 0x1a, 0x00 }, }; /***** INITIALIZATION *****/ static const struct sonly_regwrite initsm_2016_writev_1[] = { - { 0x49, 0x00 }, - - /* BSAPI writes different values to register 0x3e each time. I initially - * thought this was some kind of clever authentication, but just blasting - * these sniffed values each time seems to work. */ - { 0x3e, 0x83 }, { 0x3e, 0x4f }, { 0x3e, 0x0f }, { 0x3e, 0xbf }, - { 0x3e, 0x45 }, { 0x3e, 0x35 }, { 0x3e, 0x1c }, { 0x3e, 0xae }, + { 0x49, 0x00 }, - { 0x44, 0x01 }, { 0x43, 0x06 }, { 0x43, 0x05 }, { 0x43, 0x04 }, - { 0x44, 0x00 }, { 0x0b, 0x00 }, + /* BSAPI writes different values to register 0x3e each time. I initially + * thought this was some kind of clever authentication, but just blasting + * these sniffed values each time seems to work. */ + { 0x3e, 0x83 }, { 0x3e, 0x4f }, { 0x3e, 0x0f }, { 0x3e, 0xbf }, + { 0x3e, 0x45 }, { 0x3e, 0x35 }, { 0x3e, 0x1c }, { 0x3e, 0xae }, + + { 0x44, 0x01 }, { 0x43, 0x06 }, { 0x43, 0x05 }, { 0x43, 0x04 }, + { 0x44, 0x00 }, { 0x0b, 0x00 }, }; static const struct sonly_regwrite initsm_1000_writev_1[] = { - { 0x49, 0x00 }, /* Encryption disabled */ + { 0x49, 0x00 }, /* Encryption disabled */ - /* Setting encryption key. Doesn't need to be random since we don't use any - * encryption. */ - { 0x3e, 0x7f }, { 0x3e, 0x7f }, { 0x3e, 0x7f }, { 0x3e, 0x7f }, - { 0x3e, 0x7f }, { 0x3e, 0x7f }, { 0x3e, 0x7f }, { 0x3e, 0x7f }, + /* Setting encryption key. Doesn't need to be random since we don't use any + * encryption. */ + { 0x3e, 0x7f }, { 0x3e, 0x7f }, { 0x3e, 0x7f }, { 0x3e, 0x7f }, + { 0x3e, 0x7f }, { 0x3e, 0x7f }, { 0x3e, 0x7f }, { 0x3e, 0x7f }, - { 0x04, 0x00 }, { 0x05, 0x00 }, + { 0x04, 0x00 }, { 0x05, 0x00 }, - { 0x0b, 0x00 }, { 0x08, 0x00 }, /* Initialize capture control registers */ + { 0x0b, 0x00 }, { 0x08, 0x00 }, /* Initialize capture control registers */ }; static const struct sonly_regwrite initsm_1001_writev_1[] = { - { 0x4a, 0x9d }, - { 0x4f, 0x06 }, - { 0x4f, 0x05 }, - { 0x4f, 0x04 }, - { 0x4a, 0x9c }, - { 0x3e, 0xa6 }, - { 0x3e, 0x01 }, - { 0x3e, 0x68 }, - { 0x3e, 0xfd }, - { 0x3e, 0x72 }, - { 0x3e, 0xef }, - { 0x3e, 0x5d }, - { 0x3e, 0xc5 }, - { 0x1a, 0x02 }, - { 0x4a, 0x9d }, - { 0x4c, 0x1f }, { 0x4d, 0xb8 }, { 0x4e, 0x00 }, + { 0x4a, 0x9d }, + { 0x4f, 0x06 }, + { 0x4f, 0x05 }, + { 0x4f, 0x04 }, + { 0x4a, 0x9c }, + { 0x3e, 0xa6 }, + { 0x3e, 0x01 }, + { 0x3e, 0x68 }, + { 0x3e, 0xfd }, + { 0x3e, 0x72 }, + { 0x3e, 0xef }, + { 0x3e, 0x5d }, + { 0x3e, 0xc5 }, + { 0x1a, 0x02 }, + { 0x4a, 0x9d }, + { 0x4c, 0x1f }, { 0x4d, 0xb8 }, { 0x4e, 0x00 }, }; static const struct sonly_regwrite initsm_1001_writev_2[] = { - { 0x4c, 0x03 }, { 0x4d, 0xb8 }, { 0x4e, 0x00 }, + { 0x4c, 0x03 }, { 0x4d, 0xb8 }, { 0x4e, 0x00 }, }; static const struct sonly_regwrite initsm_1001_writev_3[] = { - { 0x4a, 0x9c }, - { 0x1a, 0x00 }, - { 0x1a, 0x02 }, - { 0x4a, 0x9d }, - { 0x4c, 0xff }, { 0x4d, 0xc0 }, { 0x4e, 0x00 }, + { 0x4a, 0x9c }, + { 0x1a, 0x00 }, + { 0x1a, 0x02 }, + { 0x4a, 0x9d }, + { 0x4c, 0xff }, { 0x4d, 0xc0 }, { 0x4e, 0x00 }, }; static const struct sonly_regwrite initsm_1001_writev_4[] = { - { 0x4a, 0x9c }, - { 0x1a, 0x00 }, - { 0x09, 0x27 }, - { 0x1a, 0x02 }, - { 0x49, 0x01 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x0a }, - { 0x47, 0x00 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x0a }, - { 0x47, 0x00 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x0a }, - { 0x47, 0x00 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x02 }, - { 0x47, 0x0a }, - { 0x47, 0x00 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x47, 0x04 }, - { 0x49, 0x00 }, - { 0x3e, 0x90 }, - { 0x3e, 0xbd }, - { 0x3e, 0xbf }, - { 0x3e, 0x48 }, - { 0x3e, 0x2a }, - { 0x3e, 0xe3 }, - { 0x3e, 0xd2 }, - { 0x3e, 0x58 }, - { 0x09, 0x2f }, - { 0x1a, 0x00 }, - { 0x1a, 0x02 }, - { 0x4a, 0x9d }, - { 0x4d, 0x40 }, { 0x4e, 0x03 }, + { 0x4a, 0x9c }, + { 0x1a, 0x00 }, + { 0x09, 0x27 }, + { 0x1a, 0x02 }, + { 0x49, 0x01 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x0a }, + { 0x47, 0x00 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x0a }, + { 0x47, 0x00 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x0a }, + { 0x47, 0x00 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x02 }, + { 0x47, 0x0a }, + { 0x47, 0x00 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x47, 0x04 }, + { 0x49, 0x00 }, + { 0x3e, 0x90 }, + { 0x3e, 0xbd }, + { 0x3e, 0xbf }, + { 0x3e, 0x48 }, + { 0x3e, 0x2a }, + { 0x3e, 0xe3 }, + { 0x3e, 0xd2 }, + { 0x3e, 0x58 }, + { 0x09, 0x2f }, + { 0x1a, 0x00 }, + { 0x1a, 0x02 }, + { 0x4a, 0x9d }, + { 0x4d, 0x40 }, { 0x4e, 0x03 }, }; static const struct sonly_regwrite initsm_1001_writev_5[] = { - { 0x4a, 0x9c }, - { 0x1a, 0x00 }, + { 0x4a, 0x9c }, + { 0x1a, 0x00 }, }; diff --git a/libfprint/drivers/upektc.c b/libfprint/drivers/upektc.c index fb4c0f7..54bc9b2 100644 --- a/libfprint/drivers/upektc.c +++ b/libfprint/drivers/upektc.c @@ -29,412 +29,456 @@ #define UPEKET_EP_OUT (2 | FPI_USB_ENDPOINT_OUT) #define BULK_TIMEOUT 4000 -struct _FpiDeviceUpektc { - FpImageDevice parent; +struct _FpiDeviceUpektc +{ + FpImageDevice parent; - gboolean deactivating; - const struct setup_cmd *setup_commands; - size_t setup_commands_len; - int ep_in; - int ep_out; - int init_idx; - int sum_threshold; + gboolean deactivating; + const struct setup_cmd *setup_commands; + size_t setup_commands_len; + int ep_in; + int ep_out; + int init_idx; + int sum_threshold; }; -G_DECLARE_FINAL_TYPE(FpiDeviceUpektc, fpi_device_upektc, FPI, DEVICE_UPEKTC, - FpImageDevice); -G_DEFINE_TYPE(FpiDeviceUpektc, fpi_device_upektc, FP_TYPE_IMAGE_DEVICE); +G_DECLARE_FINAL_TYPE (FpiDeviceUpektc, fpi_device_upektc, FPI, DEVICE_UPEKTC, + FpImageDevice); +G_DEFINE_TYPE (FpiDeviceUpektc, fpi_device_upektc, FP_TYPE_IMAGE_DEVICE); enum upektc_driver_data { - UPEKTC_2015, - UPEKTC_3001, + UPEKTC_2015, + UPEKTC_3001, }; -static void start_capture(FpImageDevice *dev); -static void complete_deactivation(FpImageDevice *dev, GError *error); -static void start_finger_detection(FpImageDevice *dev); +static void start_capture (FpImageDevice *dev); +static void complete_deactivation (FpImageDevice *dev, + GError *error); +static void start_finger_detection (FpImageDevice *dev); /****** INITIALIZATION/DEINITIALIZATION ******/ enum activate_states { - WRITE_INIT, - READ_DATA, - ACTIVATE_NUM_STATES, + WRITE_INIT, + READ_DATA, + ACTIVATE_NUM_STATES, }; static void -upektc_next_init_cmd(FpiSsm *ssm, - FpImageDevice *dev) +upektc_next_init_cmd (FpiSsm *ssm, + FpImageDevice *dev) { - FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC(dev); + FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC (dev); - self->init_idx += 1; - if (self->init_idx == self->setup_commands_len) - fpi_ssm_mark_completed(ssm); - else - fpi_ssm_jump_to_state(ssm, WRITE_INIT); + self->init_idx += 1; + if (self->init_idx == self->setup_commands_len) + fpi_ssm_mark_completed (ssm); + else + fpi_ssm_jump_to_state (ssm, WRITE_INIT); } -static void write_init_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +write_init_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpImageDevice *dev = FP_IMAGE_DEVICE(device); - FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC(dev); + FpImageDevice *dev = FP_IMAGE_DEVICE (device); + FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC (dev); - if (!error) { - if (self->setup_commands[self->init_idx].response_len) - fpi_ssm_next_state(transfer->ssm); - else - upektc_next_init_cmd(transfer->ssm, dev); - } else { - fpi_ssm_mark_failed(transfer->ssm, error); - } + if (!error) + { + if (self->setup_commands[self->init_idx].response_len) + fpi_ssm_next_state (transfer->ssm); + else + upektc_next_init_cmd (transfer->ssm, dev); + } + else + { + fpi_ssm_mark_failed (transfer->ssm, error); + } } -static void read_init_data_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +read_init_data_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpImageDevice *dev = FP_IMAGE_DEVICE(device); + FpImageDevice *dev = FP_IMAGE_DEVICE (device); - if (!error) - upektc_next_init_cmd(transfer->ssm, dev); - else - fpi_ssm_mark_failed(transfer->ssm, error); + if (!error) + upektc_next_init_cmd (transfer->ssm, dev); + else + fpi_ssm_mark_failed (transfer->ssm, error); } -static void activate_run_state(FpiSsm *ssm, FpDevice *dev, void *user_data) +static void +activate_run_state (FpiSsm *ssm, FpDevice *dev, void *user_data) { - FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC(dev); + FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC (dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case WRITE_INIT: - { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(dev); + switch (fpi_ssm_get_cur_state (ssm)) + { + case WRITE_INIT: + { + FpiUsbTransfer *transfer = fpi_usb_transfer_new (dev); - fpi_usb_transfer_fill_bulk_full(transfer, - self->ep_out, - (unsigned char *) self->setup_commands[self->init_idx].cmd, - UPEKTC_CMD_LEN, - NULL); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - write_init_cb, NULL); - fpi_usb_transfer_unref(transfer); - } - break; - case READ_DATA: - { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(dev); + fpi_usb_transfer_fill_bulk_full (transfer, + self->ep_out, + (unsigned char *) self->setup_commands[self->init_idx].cmd, + UPEKTC_CMD_LEN, + NULL); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + write_init_cb, NULL); + fpi_usb_transfer_unref (transfer); + } + break; - fpi_usb_transfer_fill_bulk (transfer, - self->ep_in, - self->setup_commands[self->init_idx].response_len); - transfer->ssm = ssm; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - read_init_data_cb, NULL); - fpi_usb_transfer_unref(transfer); - } - break; - } + case READ_DATA: + { + FpiUsbTransfer *transfer = fpi_usb_transfer_new (dev); + + fpi_usb_transfer_fill_bulk (transfer, + self->ep_in, + self->setup_commands[self->init_idx].response_len); + transfer->ssm = ssm; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + read_init_data_cb, NULL); + fpi_usb_transfer_unref (transfer); + } + break; + } } -static void activate_sm_complete(FpiSsm *ssm, FpDevice *_dev, - void *user_data, GError *error) +static void +activate_sm_complete (FpiSsm *ssm, FpDevice *_dev, + void *user_data, GError *error) { - FpImageDevice *dev = FP_IMAGE_DEVICE(_dev); + FpImageDevice *dev = FP_IMAGE_DEVICE (_dev); - fpi_image_device_activate_complete(dev, error); + fpi_image_device_activate_complete (dev, error); - if (!error) - start_finger_detection(dev); - fpi_ssm_free(ssm); + if (!error) + start_finger_detection (dev); + fpi_ssm_free (ssm); } /****** FINGER PRESENCE DETECTION ******/ -static int finger_present(unsigned char *img, size_t len, int sum_threshold) +static int +finger_present (unsigned char *img, size_t len, int sum_threshold) { - int i, sum; + int i, sum; - sum = 0; + sum = 0; - for (i = 0; i < len; i++) { - if (img[i] < 160) { - sum++; - } - } + for (i = 0; i < len; i++) + if (img[i] < 160) + sum++; - fp_dbg("finger_present: sum is %d\n", sum); - return sum < sum_threshold ? 0 : 1; + fp_dbg ("finger_present: sum is %d\n", sum); + return sum < sum_threshold ? 0 : 1; } -static void finger_det_data_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +finger_det_data_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpImageDevice *dev = FP_IMAGE_DEVICE(device); - FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC(dev); + FpImageDevice *dev = FP_IMAGE_DEVICE (device); + FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC (dev); - if (error) { - fp_dbg("data transfer status %s\n", error->message); - fpi_image_device_session_error(dev, error); - return; - } + if (error) + { + fp_dbg ("data transfer status %s\n", error->message); + fpi_image_device_session_error (dev, error); + return; + } - if (finger_present(transfer->buffer, IMAGE_SIZE, self->sum_threshold)) { - /* finger present, start capturing */ - fpi_image_device_report_finger_status(dev, TRUE); - start_capture(dev); - } else { - /* no finger, poll for a new histogram */ - start_finger_detection(dev); - } + if (finger_present (transfer->buffer, IMAGE_SIZE, self->sum_threshold)) + { + /* finger present, start capturing */ + fpi_image_device_report_finger_status (dev, TRUE); + start_capture (dev); + } + else + { + /* no finger, poll for a new histogram */ + start_finger_detection (dev); + } } -static void finger_det_cmd_cb(FpiUsbTransfer *t, FpDevice *device, - gpointer user_data, GError *error) +static void +finger_det_cmd_cb (FpiUsbTransfer *t, FpDevice *device, + gpointer user_data, GError *error) { - FpiUsbTransfer *transfer; - FpImageDevice *dev = FP_IMAGE_DEVICE (device); - FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC(dev); + FpiUsbTransfer *transfer; + FpImageDevice *dev = FP_IMAGE_DEVICE (device); + FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC (dev); - if (error) { - fp_dbg("req transfer status %s\n", error->message); - fpi_image_device_session_error(dev, error); - return; - } + if (error) + { + fp_dbg ("req transfer status %s\n", error->message); + fpi_image_device_session_error (dev, error); + return; + } - transfer = fpi_usb_transfer_new (device); - transfer->short_is_error = TRUE; - fpi_usb_transfer_fill_bulk(transfer, self->ep_in, - IMAGE_SIZE); - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - finger_det_data_cb, NULL); - fpi_usb_transfer_unref(transfer); + transfer = fpi_usb_transfer_new (device); + transfer->short_is_error = TRUE; + fpi_usb_transfer_fill_bulk (transfer, self->ep_in, + IMAGE_SIZE); + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + finger_det_data_cb, NULL); + fpi_usb_transfer_unref (transfer); } -static void start_finger_detection(FpImageDevice *dev) +static void +start_finger_detection (FpImageDevice *dev) { - FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC(dev); - FpiUsbTransfer *transfer; - G_DEBUG_HERE(); + FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC (dev); + FpiUsbTransfer *transfer; - if (self->deactivating) { - complete_deactivation(dev, NULL); - return; - } + G_DEBUG_HERE (); - transfer = fpi_usb_transfer_new(FP_DEVICE(dev)); - transfer->short_is_error = TRUE; - fpi_usb_transfer_fill_bulk_full(transfer, self->ep_out, - (unsigned char *)scan_cmd, - UPEKTC_CMD_LEN, NULL); - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - finger_det_cmd_cb, NULL); - fpi_usb_transfer_unref(transfer); + if (self->deactivating) + { + complete_deactivation (dev, NULL); + return; + } + + transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); + transfer->short_is_error = TRUE; + fpi_usb_transfer_fill_bulk_full (transfer, self->ep_out, + (unsigned char *) scan_cmd, + UPEKTC_CMD_LEN, NULL); + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + finger_det_cmd_cb, NULL); + fpi_usb_transfer_unref (transfer); } /****** CAPTURE ******/ enum capture_states { - CAPTURE_WRITE_CMD, - CAPTURE_READ_DATA, - CAPTURE_NUM_STATES, + CAPTURE_WRITE_CMD, + CAPTURE_READ_DATA, + CAPTURE_NUM_STATES, }; -static void capture_cmd_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +capture_cmd_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - if (!error) { - fpi_ssm_next_state(transfer->ssm); - } else { - fpi_ssm_mark_failed(transfer->ssm, error); - } + if (!error) + fpi_ssm_next_state (transfer->ssm); + else + fpi_ssm_mark_failed (transfer->ssm, error); } -static void capture_read_data_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +capture_read_data_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpImageDevice *dev = FP_IMAGE_DEVICE(device); - FpImage *img; + FpImageDevice *dev = FP_IMAGE_DEVICE (device); + FpImage *img; - if (error) { - fp_dbg("request is not completed, %s", error->message); - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } + if (error) + { + fp_dbg ("request is not completed, %s", error->message); + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } - img = fp_image_new(IMAGE_WIDTH, IMAGE_HEIGHT); - memcpy(img->data, transfer->buffer, IMAGE_SIZE); - fpi_image_device_image_captured(dev, img); - fpi_image_device_report_finger_status(dev, FALSE); - fpi_ssm_mark_completed(transfer->ssm); + img = fp_image_new (IMAGE_WIDTH, IMAGE_HEIGHT); + memcpy (img->data, transfer->buffer, IMAGE_SIZE); + fpi_image_device_image_captured (dev, img); + fpi_image_device_report_finger_status (dev, FALSE); + fpi_ssm_mark_completed (transfer->ssm); } -static void capture_run_state(FpiSsm *ssm, FpDevice *_dev, void *user_data) +static void +capture_run_state (FpiSsm *ssm, FpDevice *_dev, void *user_data) { - FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC(_dev); + FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC (_dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case CAPTURE_WRITE_CMD: - { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(_dev); + switch (fpi_ssm_get_cur_state (ssm)) + { + case CAPTURE_WRITE_CMD: + { + FpiUsbTransfer *transfer = fpi_usb_transfer_new (_dev); - fpi_usb_transfer_fill_bulk_full(transfer, self->ep_out, - (unsigned char *)scan_cmd, - UPEKTC_CMD_LEN, NULL); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - capture_cmd_cb, NULL); - fpi_usb_transfer_unref(transfer); - } - break; - case CAPTURE_READ_DATA: - { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(_dev); + fpi_usb_transfer_fill_bulk_full (transfer, self->ep_out, + (unsigned char *) scan_cmd, + UPEKTC_CMD_LEN, NULL); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + capture_cmd_cb, NULL); + fpi_usb_transfer_unref (transfer); + } + break; - fpi_usb_transfer_fill_bulk(transfer, self->ep_in, - IMAGE_SIZE); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - capture_read_data_cb, NULL); - fpi_usb_transfer_unref(transfer); - } - break; - }; + case CAPTURE_READ_DATA: + { + FpiUsbTransfer *transfer = fpi_usb_transfer_new (_dev); + + fpi_usb_transfer_fill_bulk (transfer, self->ep_in, + IMAGE_SIZE); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + capture_read_data_cb, NULL); + fpi_usb_transfer_unref (transfer); + } + break; + } + ; } -static void capture_sm_complete(FpiSsm *ssm, FpDevice *_dev, void *user_data, - GError *error) +static void +capture_sm_complete (FpiSsm *ssm, FpDevice *_dev, void *user_data, + GError *error) { - FpImageDevice *dev = user_data; - FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC(_dev); + FpImageDevice *dev = user_data; + FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC (_dev); - fp_dbg("Capture completed"); - if (self->deactivating) - complete_deactivation(dev, error); - else if (error) - fpi_image_device_session_error(dev, error); - else - start_finger_detection(dev); + fp_dbg ("Capture completed"); + if (self->deactivating) + complete_deactivation (dev, error); + else if (error) + fpi_image_device_session_error (dev, error); + else + start_finger_detection (dev); - fpi_ssm_free(ssm); + fpi_ssm_free (ssm); } -static void start_capture(FpImageDevice *dev) +static void +start_capture (FpImageDevice *dev) { - FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC(dev); - FpiSsm *ssm; + FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC (dev); + FpiSsm *ssm; - if (self->deactivating) { - complete_deactivation(dev, NULL); - return; - } + if (self->deactivating) + { + complete_deactivation (dev, NULL); + return; + } - ssm = fpi_ssm_new(FP_DEVICE(dev), capture_run_state, - CAPTURE_NUM_STATES, dev); - G_DEBUG_HERE(); - fpi_ssm_start(ssm, capture_sm_complete); + ssm = fpi_ssm_new (FP_DEVICE (dev), capture_run_state, + CAPTURE_NUM_STATES, dev); + G_DEBUG_HERE (); + fpi_ssm_start (ssm, capture_sm_complete); } -static void dev_activate(FpImageDevice *dev) +static void +dev_activate (FpImageDevice *dev) { - FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC(dev); - FpiSsm *ssm = fpi_ssm_new(FP_DEVICE(dev), activate_run_state, - ACTIVATE_NUM_STATES, dev); - self->init_idx = 0; - fpi_ssm_start(ssm, activate_sm_complete); + FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC (dev); + FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (dev), activate_run_state, + ACTIVATE_NUM_STATES, dev); + + self->init_idx = 0; + fpi_ssm_start (ssm, activate_sm_complete); } -static void dev_deactivate(FpImageDevice *dev) +static void +dev_deactivate (FpImageDevice *dev) { - FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC(dev); + FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC (dev); - self->deactivating = TRUE; + self->deactivating = TRUE; } -static void complete_deactivation(FpImageDevice *dev, GError *error) +static void +complete_deactivation (FpImageDevice *dev, GError *error) { - FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC(dev); - G_DEBUG_HERE(); + FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC (dev); - self->deactivating = FALSE; - fpi_image_device_deactivate_complete(dev, error); + G_DEBUG_HERE (); + + self->deactivating = FALSE; + fpi_image_device_deactivate_complete (dev, error); } -static void dev_init(FpImageDevice *dev) +static void +dev_init (FpImageDevice *dev) { - GError *error = NULL; - FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC(dev); - guint64 driver_data = fpi_device_get_driver_data (FP_DEVICE (dev)); + GError *error = NULL; + FpiDeviceUpektc *self = FPI_DEVICE_UPEKTC (dev); + guint64 driver_data = fpi_device_get_driver_data (FP_DEVICE (dev)); - /* TODO check that device has endpoints we're using */ + /* TODO check that device has endpoints we're using */ - if (!g_usb_device_claim_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), 0, 0, &error)) { - fpi_image_device_open_complete(dev, error); - return; - } + if (!g_usb_device_claim_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), 0, 0, &error)) + { + fpi_image_device_open_complete (dev, error); + return; + } - switch (driver_data) { - case UPEKTC_2015: - self->ep_in = UPEKTC_EP_IN; - self->ep_out = UPEKTC_EP_OUT; - self->setup_commands = upektc_setup_commands; - self->setup_commands_len = G_N_ELEMENTS(upektc_setup_commands); - self->sum_threshold = UPEKTC_SUM_THRESHOLD; - break; - case UPEKTC_3001: - self->ep_in = UPEKET_EP_IN; - self->ep_out = UPEKET_EP_OUT; - self->setup_commands = upeket_setup_commands; - self->setup_commands_len = G_N_ELEMENTS(upeket_setup_commands); - self->sum_threshold = UPEKET_SUM_THRESHOLD; - break; - default: - fp_err("Device variant %lu is not known\n", driver_data); - g_assert_not_reached (); - fpi_image_device_open_complete(dev, fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); - return; - } - fpi_image_device_open_complete(dev, NULL); + switch (driver_data) + { + case UPEKTC_2015: + self->ep_in = UPEKTC_EP_IN; + self->ep_out = UPEKTC_EP_OUT; + self->setup_commands = upektc_setup_commands; + self->setup_commands_len = G_N_ELEMENTS (upektc_setup_commands); + self->sum_threshold = UPEKTC_SUM_THRESHOLD; + break; + + case UPEKTC_3001: + self->ep_in = UPEKET_EP_IN; + self->ep_out = UPEKET_EP_OUT; + self->setup_commands = upeket_setup_commands; + self->setup_commands_len = G_N_ELEMENTS (upeket_setup_commands); + self->sum_threshold = UPEKET_SUM_THRESHOLD; + break; + + default: + fp_err ("Device variant %lu is not known\n", driver_data); + g_assert_not_reached (); + fpi_image_device_open_complete (dev, fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); + return; + } + fpi_image_device_open_complete (dev, NULL); } -static void dev_deinit(FpImageDevice *dev) +static void +dev_deinit (FpImageDevice *dev) { - GError *error = NULL; + GError *error = NULL; - g_usb_device_release_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), - 0, 0, &error); - fpi_image_device_close_complete(dev, error); + g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), + 0, 0, &error); + fpi_image_device_close_complete (dev, error); } -static const FpIdEntry id_table [ ] = { - { .vid = 0x0483, .pid = 0x2015, .driver_data = UPEKTC_2015 }, - { .vid = 0x147e, .pid = 0x3001, .driver_data = UPEKTC_3001 }, - { .vid = 0, .pid = 0, .driver_data = 0 }, +static const FpIdEntry id_table[] = { + { .vid = 0x0483, .pid = 0x2015, .driver_data = UPEKTC_2015 }, + { .vid = 0x147e, .pid = 0x3001, .driver_data = UPEKTC_3001 }, + { .vid = 0, .pid = 0, .driver_data = 0 }, }; -static void fpi_device_upektc_init(FpiDeviceUpektc *self) { +static void +fpi_device_upektc_init (FpiDeviceUpektc *self) +{ } -static void fpi_device_upektc_class_init(FpiDeviceUpektcClass *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); - FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS(klass); +static void +fpi_device_upektc_class_init (FpiDeviceUpektcClass *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); + FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); - dev_class->id = "upektc"; - dev_class->full_name = "UPEK TouchChip/Eikon Touch 300"; - dev_class->type = FP_DEVICE_TYPE_USB; - dev_class->id_table = id_table; - dev_class->scan_type = FP_SCAN_TYPE_PRESS; + dev_class->id = "upektc"; + dev_class->full_name = "UPEK TouchChip/Eikon Touch 300"; + dev_class->type = FP_DEVICE_TYPE_USB; + dev_class->id_table = id_table; + dev_class->scan_type = FP_SCAN_TYPE_PRESS; - img_class->img_open = dev_init; - img_class->img_close = dev_deinit; - img_class->activate = dev_activate; - img_class->deactivate = dev_deactivate; + img_class->img_open = dev_init; + img_class->img_close = dev_deinit; + img_class->activate = dev_activate; + img_class->deactivate = dev_deactivate; - img_class->bz3_threshold = 30; + img_class->bz3_threshold = 30; - img_class->img_width = IMAGE_WIDTH; - img_class->img_height = IMAGE_HEIGHT; + img_class->img_width = IMAGE_WIDTH; + img_class->img_height = IMAGE_HEIGHT; } diff --git a/libfprint/drivers/upektc.h b/libfprint/drivers/upektc.h index 143916e..7ea919a 100644 --- a/libfprint/drivers/upektc.h +++ b/libfprint/drivers/upektc.h @@ -29,1911 +29,1912 @@ #define UPEKTC_SUM_THRESHOLD 10000 #define UPEKET_SUM_THRESHOLD 5000 -struct setup_cmd { - unsigned char cmd[0x40]; - int response_len; +struct setup_cmd +{ + unsigned char cmd[0x40]; + int response_len; }; static const struct setup_cmd upektc_setup_commands[] = { - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0xfe, 0x00, 0x01, - 0xc0, 0xbd, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0xf0, 0xfd, 0x7f, 0x00, 0x60, 0xfd, 0x7f, - 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xcc, 0xf8, 0x2f, 0x01, - 0x09, 0x48, 0xe7, 0x77, 0xf0, 0xfa, 0x2f, 0x01, - 0x09, 0x48, 0xe7, 0x77, 0xe0, 0x3a, 0xe6, 0x77 - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xf7, 0x00, 0x00, - 0xc8, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x58, 0xf9, 0x2f, 0x01, - 0xe9, 0x4f, 0x01, 0x10, 0xd8, 0xf8, 0x2f, 0x01, - 0x40, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0xfe, 0x00, 0x01, 0xc0, 0xbd, 0xf0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xf0, 0xfd, 0x7f - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0xf7, 0xcd, 0x00, - 0x2c, 0xf9, 0x2f, 0x01, 0x6d, 0x4f, 0x01, 0x10, - 0xac, 0xf8, 0x2f, 0x01, 0x40, 0x00, 0x00, 0x00, - 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0xfe, 0x16, 0x10, 0x03, 0xee, 0x00, 0x37, - 0x01, 0x09, 0x02, 0x0e, 0x03, 0x18, 0x03, 0x1a, - 0x03, 0x20, 0x10, 0x2f, 0x11, 0x3f, 0x12, 0x44, - 0x01, 0x01, 0x07, 0x08, 0x0c, 0x00, 0x6c, 0x6c - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, - 0x02, 0xfe, 0x16, 0x10, 0x03, 0xee, 0x00, 0x37, - 0x01, 0x09, 0x02, 0x0e, 0x03, 0x18, 0x03, 0x1a, - 0x03, 0x20, 0x10, 0x2f, 0x11, 0x3f, 0x12, 0x44, - 0x01, 0x01, 0x07, 0x08, 0x0c, 0x00, 0x6c, 0x6c, - 0x00, 0xf9, 0x2f, 0x01, 0x97, 0x40, 0x01, 0x10, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xfa, 0x45, 0x03, 0x10, 0x02, 0x00, 0x00, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8b, 0x00, 0x00, 0x00, 0x3a, 0x50, 0xf9, 0x2f, - 0x01, 0x18, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x88, 0xf9, 0x2f, - 0x01, 0x91, 0x99, 0x00, 0x10, 0xf8, 0x00, 0x00, - 0x00, 0xbe, 0x99, 0x00, 0x10, 0xa0, 0xa6, 0x04, - 0x10, 0x01, 0x9b, 0x00, 0x10, 0x18, 0x00, 0x00, - 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, - 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, - 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, - 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, - 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, - 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, - 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0x0d, 0xff, 0x36, - 0xdc, 0xf8, 0x2f, 0x01, 0xf1, 0x9d, 0x00, 0x10, - 0xfc, 0xf8, 0x2f, 0x01, 0x9d, 0xf8, 0x2f, 0x01, - 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x9e, 0xbf, 0x85, 0x85, 0x02, 0x05, 0x26, - 0x25, 0x4d, 0x13, 0x10, 0x00, 0x00, 0x00, 0x6c, - 0x00, 0x00, 0xcf, 0x00, 0x01, 0x00, 0x00, 0x1f, - 0x01, 0x01, 0x09, 0x09, 0x0f, 0x00, 0x6c, 0x6c - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x0c, 0x37, 0x6a, 0x3d, - 0x73, 0x3d, 0x71, 0x0e, 0x01, 0x0e, 0x81, 0x3d, - 0x51, 0xf8, 0x2f, 0x01, 0x3a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x9e, 0xbf, 0x85, - 0x85, 0x02, 0x05, 0x26, 0x25, 0x4d, 0x13, 0x10, - 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0xcf, 0x00, - 0x01, 0x00, 0x00, 0x1f, 0x01, 0x01, 0x09, 0x09, - 0x0f, 0x00, 0x6c, 0x6c, 0xf0, 0xf8, 0x2f, 0x01 - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, - 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, - 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, - 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8b, 0x00, 0x01, 0x7c, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, - 0x14, 0xf5, 0x2f, 0x01, 0xa0, 0x20, 0x14, 0x00, - 0x40, 0xf8, 0x2f, 0x01, 0x05, 0x90, 0xf6, 0x77, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x50, 0xf8, 0x2f, 0x01, 0x40, 0x39, 0xf4, 0x77, - 0xa8, 0x20, 0x14, 0x00, 0x1c, 0xf6, 0x2f, 0x01, - 0x2c, 0x20, 0xf4, 0x77, 0x80, 0x4d, 0xfb, 0x77 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8b, 0x00, 0x03, 0xc8, 0x3a, 0x01, 0x00, 0x00, - 0x1f, 0x01, 0x01, 0x09, 0x09, 0x0f, 0x00, 0x6c, - 0x6c, 0x6c, 0x6c, 0x40, 0x40, 0x40, 0x40, 0x40, - 0x40, 0x40, 0x40, 0x40, 0x40, 0x6c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x62, 0x62, 0x62, 0x62, - 0x62, 0x51, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x40, 0xf9, 0x2f, 0x01, 0x4f, 0x9d, 0x00, - 0x10, 0x3a, 0x00, 0x00, 0x00, 0x04, 0xf9, 0x01 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8b, 0x00, 0x04, 0x02, 0x06, 0x0b, 0x07, 0x13, - 0x0e, 0x55, 0x56, 0x01, 0x44, 0xf8, 0x2f, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc8, 0x01, 0x00, 0x00, - 0xc8, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x07, 0x00, 0x20, 0x00, 0x3a, 0x0e, 0x13, 0x07, - 0x0f, 0x14, 0x07, 0x10, 0x15, 0x07, 0x12, 0x16, - 0x07, 0x13, 0x17, 0x07, 0x14, 0x18, 0x07, 0x15, - 0x18, 0x07, 0x16, 0x19, 0x07, 0x17, 0x1a, 0x07, - 0x19, 0x1b, 0x07, 0x1a, 0x1c, 0x07, 0x1b, 0x1d, - 0x07, 0x1c, 0x1e, 0x07, 0x1d, 0x1f, 0x07, 0x1e, - 0x20, 0x07, 0x1f, 0x21, 0x07, 0x20, 0x22, 0x07, - 0x21, 0x23, 0x07, 0x23, 0x23, 0x07, 0x24, 0x55 - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x07, 0x00, 0x20, 0x3a, 0x26, 0x24, 0x07, 0x25, - 0x25, 0x07, 0x26, 0x25, 0x07, 0x27, 0x26, 0x07, - 0x28, 0x27, 0x07, 0x29, 0x27, 0x07, 0x2a, 0x28, - 0x07, 0x2b, 0x29, 0x07, 0x2d, 0x29, 0x07, 0x2e, - 0x2a, 0x07, 0x2f, 0x2b, 0x07, 0x30, 0x2b, 0x07, - 0x31, 0x2c, 0x07, 0x07, 0x1d, 0x1f, 0x07, 0x1e, - 0x20, 0x07, 0x1f, 0x21, 0x07, 0x20, 0x22, 0x07, - 0x21, 0x23, 0x07, 0x23, 0x23, 0x07, 0x24, 0x55 - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x06, 0x0e, 0x81, 0x0e, - 0x81, 0x09, 0x4d, 0x00, 0x07, 0x00, 0x20, 0x3a, - 0x26, 0x24, 0x07, 0x25, 0x25, 0x07, 0x26, 0x25, - 0x07, 0x27, 0x26, 0x07, 0x28, 0x27, 0x07, 0x29, - 0x27, 0x07, 0x2a, 0x28, 0x07, 0x2b, 0x29, 0x07, - 0x2d, 0x29, 0x07, 0x2e, 0x2a, 0x07, 0x2f, 0x2b, - 0x07, 0x30, 0x2b, 0x07, 0x31, 0x2c, 0x07, 0x07, - 0x1d, 0x1f, 0x07, 0x1e, 0x20, 0x07, 0x1f, 0x21 - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, - 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, - 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, - 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0x0e, 0x85, 0x36, - 0xd8, 0xf8, 0x2f, 0x01, 0xf1, 0x9d, 0x00, 0x10, - 0xf8, 0xf8, 0x2f, 0x01, 0x99, 0xf8, 0x2f, 0x01, - 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x9e, 0xbf, 0x85, 0x85, 0x02, 0x05, 0x26, - 0x25, 0x4d, 0x10, 0x10, 0x00, 0xff, 0x81, 0x6c, - 0x00, 0x00, 0xcf, 0x00, 0x01, 0x00, 0x00, 0x1f, - 0x01, 0x01, 0x09, 0x09, 0x0f, 0x00, 0x6c, 0x6c - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0x0d, 0x00, 0x00, - 0x02, 0x9e, 0xbf, 0x85, 0x85, 0x02, 0x05, 0x26, - 0x25, 0x4d, 0x10, 0x10, 0x00, 0xff, 0x81, 0x6c, - 0x00, 0x00, 0xcf, 0x00, 0x01, 0x00, 0x00, 0x1f, - 0x01, 0x01, 0x09, 0x09, 0x0f, 0x00, 0x6c, 0x6c, - 0xec, 0xf8, 0x2f, 0x01, 0x97, 0x40, 0x01, 0x10, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xfa, 0x45, 0x03, 0x10, 0x02, 0x00, 0x00, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xf7, 0xcf, 0x00, - 0x01, 0x00, 0x00, 0x1f, 0x01, 0x01, 0x09, 0x09, - 0x0f, 0x00, 0x6c, 0x6c, 0x6c, 0x6c, 0x40, 0x40, - 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, - 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x62, - 0x62, 0x62, 0x62, 0x62, 0x51, 0x6c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xf7, 0x00, 0x00, - 0x02, 0xf9, 0xbf, 0x85, 0x85, 0x02, 0x05, 0x26, - 0x25, 0x4d, 0x10, 0x10, 0x00, 0xff, 0x81, 0x6c, - 0x00, 0x00, 0xcf, 0x00, 0x01, 0x00, 0x00, 0x1f, - 0x01, 0x01, 0x09, 0x09, 0x0f, 0x00, 0x6c, 0x6c, - 0x6c, 0x6c, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, - 0x40, 0x40, 0x40, 0x40, 0x6c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x62, 0x62, 0x62, 0x62, 0x62 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0xf7, 0xf4, 0x00, - 0x14, 0xf9, 0x2f, 0x01, 0x6d, 0x4f, 0x01, 0x10, - 0x94, 0xf8, 0x2f, 0x01, 0x40, 0x00, 0x00, 0x00, - 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0xf9, 0xbf, 0x85, 0x85, 0x02, 0x05, 0x26, - 0x25, 0x4d, 0x10, 0x10, 0x00, 0xff, 0x81, 0x6c, - 0x00, 0x00, 0xcf, 0x00, 0x01, 0x00, 0x00, 0x1f, - 0x01, 0x01, 0x09, 0x09, 0x0f, 0x00, 0x6c, 0x6c - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0x20, 0x6c, 0x01, - 0x6d, 0x4f, 0x01, 0x10, 0x94, 0xf8, 0x2f, 0x01, - 0x40, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0xf9, 0xbf, 0x85, - 0x85, 0x02, 0x05, 0x26, 0x25, 0x4d, 0x10, 0x10, - 0x00, 0xff, 0x81, 0x6c, 0x00, 0x00, 0xcf, 0x00, - 0x01, 0x00, 0x00, 0x1f, 0x01, 0x01, 0x09, 0x09, - 0x0f, 0x00, 0x6c, 0x6c, 0xe8, 0xf8, 0x2f, 0x01 - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xf9, 0x81, 0x6c, - 0x00, 0x00, 0xcf, 0x00, 0x01, 0x00, 0x00, 0x1f, - 0x01, 0x01, 0x09, 0x09, 0x0f, 0x00, 0x6c, 0x6c, - 0xe8, 0xf8, 0x2f, 0x01, 0xec, 0xf8, 0x2f, 0x01, - 0x97, 0x40, 0x01, 0x10, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xfa, 0x45, 0x03, 0x10, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0xf9, 0x01, 0x00, - 0x1c, 0xf9, 0x2f, 0x01, 0x6d, 0x4f, 0x01, 0x10, - 0x9c, 0xf8, 0x2f, 0x01, 0x40, 0x00, 0x00, 0x00, - 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x6c, 0xbf, 0x85, 0x85, 0x02, 0x05, 0x26, - 0x25, 0x4d, 0x10, 0x10, 0x00, 0xff, 0x81, 0x6c, - 0x00, 0x00, 0xcf, 0x00, 0x01, 0x00, 0x00, 0x1f, - 0x01, 0x01, 0x09, 0x09, 0x0f, 0x00, 0x6c, 0x6c - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x12, 0x1c, 0x0c, 0x1b, - 0x08, 0x1a, 0x07, 0x30, 0x08, 0x09, 0x6d, 0x08, - 0x27, 0x00, 0x9e, 0x00, 0x1e, 0x23, 0x47, 0x01, - 0x40, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x6c, 0xbf, 0x85, - 0x85, 0x02, 0x05, 0x26, 0x25, 0x4d, 0x10, 0x10, - 0x00, 0xff, 0x81, 0x6c, 0x00, 0x00, 0xcf, 0x00, - 0x01, 0x00, 0x00, 0x1f, 0x01, 0x01, 0x09, 0x09 - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, - 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, - 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, - 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0x0d, 0xff, 0x36, - 0xdc, 0xf8, 0x2f, 0x01, 0xf1, 0x9d, 0x00, 0x10, - 0xfc, 0xf8, 0x2f, 0x01, 0x9d, 0xf8, 0x2f, 0x01, - 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x1e, 0x3f, 0x05, 0x05, 0x02, 0x05, 0x26, - 0x27, 0x6d, 0x10, 0x10, 0x00, 0xff, 0x85, 0x6c, - 0x00, 0x00, 0xcf, 0x00, 0x01, 0x00, 0x00, 0x1f, - 0x01, 0x01, 0x07, 0x08, 0x0c, 0x00, 0x6c, 0x6c - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x08, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xcf, - 0x00, 0x01, 0x00, 0x00, 0x1f, 0x01, 0x01, 0x10, - 0xfc, 0xf8, 0x2f, 0x01, 0x9d, 0xf8, 0x2f, 0x01, - 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x1e, 0x3f, 0x05, 0x05, 0x02, 0x05, 0x26, - 0x27, 0x6d, 0x10, 0x10, 0x00, 0xff, 0x85, 0x6c, - 0x00, 0x00, 0xcf, 0x00, 0x01, 0x00, 0x00, 0x1f, - 0x01, 0x01, 0x07, 0x08, 0x0c, 0x00, 0x6c, 0x6c - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x08, 0x0e, 0x85, 0x09, - 0xed, 0x09, 0x6d, 0x09, 0xed, 0x1e, 0x3f, 0x05, - 0x05, 0x02, 0x05, 0x26, 0x27, 0x6d, 0x10, 0x10, - 0x00, 0xff, 0x85, 0x6c, 0x00, 0x00, 0xcf, 0x00, - 0x01, 0x00, 0x00, 0x1f, 0x01, 0x01, 0x07, 0x08, - 0x0c, 0x00, 0x6c, 0x6c, 0xf0, 0xf8, 0x2f, 0x01, - 0x97, 0x40, 0x01, 0x10, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3e, 0xf9, 0x2f, 0x01 - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xf3, 0x6c, 0x6c, - 0xf0, 0xf8, 0x2f, 0x01, 0x97, 0x40, 0x01, 0x10, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3e, 0xf9, 0x2f, 0x01, 0x04, 0xf9, 0x2f, 0x01, - 0x97, 0x40, 0x01, 0x10, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x03, 0x10, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x84, 0x00, 0x00, 0x00, 0x32, 0x02, 0xa3, 0x04, - 0x10, 0x3b, 0xa3, 0x04, 0x10, 0x1a, 0xa3, 0x04, - 0x10, 0xf9, 0xa2, 0x04, 0x10, 0xd8, 0xa2, 0x00, - 0xb9, 0x19, 0xe2, 0x87, 0xba, 0x56, 0x78, 0x72, - 0x68, 0x9e, 0x7a, 0xf4, 0x65, 0x6d, 0xd9, 0xde, - 0xf6, 0x33, 0xa2, 0x04, 0x10, 0x12, 0xa2, 0x04, - 0x10, 0xf1, 0xa1, 0x04, 0x10, 0x04, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xb4, 0x2d, 0x6c, 0xe9 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x06, 0x1a, 0x07, 0x1b, - 0x08, 0x1c, 0x0c, 0x77, 0x21, 0xac, 0xe5, 0x77, - 0x00, 0x00, 0x00, 0x00, 0xaa, 0x4e, 0x01, 0x10, - 0x3c, 0x01, 0x00, 0x00, 0xc4, 0xf8, 0x2f, 0x01, - 0xdc, 0xf8, 0x2f, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x00, 0xb9, 0x19, 0xe2, 0x87, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00 - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x08, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xcf, - 0x00, 0x01, 0x00, 0x00, 0x1f, 0x01, 0x01, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc8, 0x01, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xcc, 0xf8, 0x2f, 0x01, 0x8b, 0x41, 0x01, 0x10, - 0x8c, 0xf8, 0x2f, 0x01, 0x40, 0x00, 0x00, 0x00 - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x04, 0x3d, 0x51, 0x0a, - 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xfc, 0xf9, 0x2f, 0x01, 0x31, 0x10, 0x01, 0x10, - 0xd0, 0xf9, 0x2f, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x1a, 0x07, 0x1b, 0x08, 0x1c, 0x0c, 0xc6, 0xf8, - 0x66, 0xbc, 0xc4, 0xbe, 0x0b, 0x25, 0xc5, 0x4c, - 0xf4, 0x03, 0x10, 0x2f, 0x11, 0x3f, 0x12, 0x44 - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, - 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, - 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, - 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x10, 0x36, - 0x88, 0xf9, 0x2f, 0x01, 0xf1, 0x9d, 0x00, 0x10, - 0xa8, 0xf9, 0x2f, 0x01, 0x49, 0xf9, 0x2f, 0x01, - 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x1e, 0x3f, 0x05, 0x05, 0x02, 0x05, 0x26, - 0x27, 0xed, 0x00, 0x10, 0x00, 0xff, 0x85, 0x6c, - 0x00, 0x00, 0xcf, 0x00, 0x01, 0x00, 0x00, 0x1f, - 0x01, 0x01, 0x07, 0x08, 0x0c, 0x00, 0x6c, 0x6c - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x8b, 0x00, 0x00, 0xbc, 0x3a, 0x40, 0xd3, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xd8, 0xf4, 0x2f, 0x01, 0x80, 0x69, 0x67, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xf0, 0xfd, - 0x7f, 0x00, 0x60, 0xfd, 0x7f, 0x3c, 0x01, 0x00, - 0x00, 0xa0, 0xf5, 0x2f, 0x01, 0x03, 0x01, 0x00, - 0x00, 0x9a, 0x11, 0xf4, 0x77, 0x9f, 0x11, 0xf4, - 0x77, 0x3c, 0x01, 0x00, 0x00, 0xa0, 0xf5, 0x01 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8b, 0x00, 0x00, 0xf6, 0x3a, 0x0b, 0x07, 0xa5, - 0x03, 0x2f, 0x63, 0x97, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8b, 0x00, 0x01, 0x30, 0x3a, 0x0b, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x12, 0xcd, 0xa6, 0x3c, - 0x36, 0xec, 0x6a, 0x73, 0x00, 0x64, 0x75, 0xdf, - 0x2e, 0x13, 0xec, 0xca, 0x3c, 0x03, 0x00, 0x00, - 0x06, 0xa5, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8b, 0x00, 0x01, 0x6a, 0x3a, 0x0b, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8b, 0x00, 0x01, 0xa4, 0x3a, 0x0b, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0xa5, 0x83, 0x1b, 0x8e, 0xac, 0x00, 0x00, - 0x0b, 0xa5, 0x08, 0x08, 0x03, 0x00, 0x00, 0x01, - 0x02, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x8d, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8b, 0x00, 0x01, 0xde, 0x3a, 0x0b, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8b, 0x00, 0x02, 0x18, 0x3a, 0x0b, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8b, 0x00, 0x02, 0x52, 0x3a, 0x0b, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8b, 0x00, 0x02, 0x8c, 0x3a, 0x0b, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8b, 0x00, 0x02, 0xc6, 0x2a, 0x0b, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc8, 0x01, 0x00, 0x00, - 0xc8, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xf1, 0x2f, 0x01, - 0x49, 0xf9, 0x2f, 0x01, 0x3a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x1e, 0x3f, 0x05, - 0x05, 0x02, 0x05, 0x26, 0x27, 0xed, 0x00, 0x10, - 0x00, 0xff, 0x85, 0x6c, 0x00, 0x00, 0xcf, 0x00, - 0x01, 0x00, 0x00, 0x1f, 0x01, 0x01, 0x07, 0x08, - 0x0c, 0x00, 0x6c, 0x6c, 0x9c, 0xf9, 0x2f, 0x01, - 0x97, 0x40, 0x01, 0x10, 0x03, 0x00, 0x00, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0xf1, 0x01, 0x00, - 0xb4, 0xf9, 0x2f, 0x01, 0x6d, 0x4f, 0x01, 0x10, - 0x34, 0xf9, 0x2f, 0x01, 0x40, 0x00, 0x00, 0x00, - 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x8b, 0x00, 0x01, 0x10, 0x3a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8b, 0x00, 0x01, 0x4a, 0x2e, 0x0b, 0x06, 0xa5, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc8, 0x01, 0x00, 0x00, - 0xc8, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xfb, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x88, 0xf9, 0x2f, 0x01, 0x97, 0x40, 0x01, 0x10, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xfa, 0x45, 0x03, 0x10, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0xfb, 0x0f, 0x00, - 0xc4, 0xf9, 0x2f, 0x01, 0x6d, 0x4f, 0x01, 0x10, - 0x44, 0xf9, 0x2f, 0x01, 0x40, 0x00, 0x00, 0x00, - 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, - .response_len = 0x00 - } + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0xfe, 0x00, 0x01, + 0xc0, 0xbd, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0xf0, 0xfd, 0x7f, 0x00, 0x60, 0xfd, 0x7f, + 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0xcc, 0xf8, 0x2f, 0x01, + 0x09, 0x48, 0xe7, 0x77, 0xf0, 0xfa, 0x2f, 0x01, + 0x09, 0x48, 0xe7, 0x77, 0xe0, 0x3a, 0xe6, 0x77 + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xf7, 0x00, 0x00, + 0xc8, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x58, 0xf9, 0x2f, 0x01, + 0xe9, 0x4f, 0x01, 0x10, 0xd8, 0xf8, 0x2f, 0x01, + 0x40, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x02, 0xfe, 0x00, 0x01, 0xc0, 0xbd, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xf0, 0xfd, 0x7f + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0xf7, 0xcd, 0x00, + 0x2c, 0xf9, 0x2f, 0x01, 0x6d, 0x4f, 0x01, 0x10, + 0xac, 0xf8, 0x2f, 0x01, 0x40, 0x00, 0x00, 0x00, + 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0xfe, 0x16, 0x10, 0x03, 0xee, 0x00, 0x37, + 0x01, 0x09, 0x02, 0x0e, 0x03, 0x18, 0x03, 0x1a, + 0x03, 0x20, 0x10, 0x2f, 0x11, 0x3f, 0x12, 0x44, + 0x01, 0x01, 0x07, 0x08, 0x0c, 0x00, 0x6c, 0x6c + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, + 0x02, 0xfe, 0x16, 0x10, 0x03, 0xee, 0x00, 0x37, + 0x01, 0x09, 0x02, 0x0e, 0x03, 0x18, 0x03, 0x1a, + 0x03, 0x20, 0x10, 0x2f, 0x11, 0x3f, 0x12, 0x44, + 0x01, 0x01, 0x07, 0x08, 0x0c, 0x00, 0x6c, 0x6c, + 0x00, 0xf9, 0x2f, 0x01, 0x97, 0x40, 0x01, 0x10, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfa, 0x45, 0x03, 0x10, 0x02, 0x00, 0x00, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8b, 0x00, 0x00, 0x00, 0x3a, 0x50, 0xf9, 0x2f, + 0x01, 0x18, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x88, 0xf9, 0x2f, + 0x01, 0x91, 0x99, 0x00, 0x10, 0xf8, 0x00, 0x00, + 0x00, 0xbe, 0x99, 0x00, 0x10, 0xa0, 0xa6, 0x04, + 0x10, 0x01, 0x9b, 0x00, 0x10, 0x18, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, + 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, + 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0x0d, 0xff, 0x36, + 0xdc, 0xf8, 0x2f, 0x01, 0xf1, 0x9d, 0x00, 0x10, + 0xfc, 0xf8, 0x2f, 0x01, 0x9d, 0xf8, 0x2f, 0x01, + 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x9e, 0xbf, 0x85, 0x85, 0x02, 0x05, 0x26, + 0x25, 0x4d, 0x13, 0x10, 0x00, 0x00, 0x00, 0x6c, + 0x00, 0x00, 0xcf, 0x00, 0x01, 0x00, 0x00, 0x1f, + 0x01, 0x01, 0x09, 0x09, 0x0f, 0x00, 0x6c, 0x6c + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x0c, 0x37, 0x6a, 0x3d, + 0x73, 0x3d, 0x71, 0x0e, 0x01, 0x0e, 0x81, 0x3d, + 0x51, 0xf8, 0x2f, 0x01, 0x3a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x9e, 0xbf, 0x85, + 0x85, 0x02, 0x05, 0x26, 0x25, 0x4d, 0x13, 0x10, + 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0xcf, 0x00, + 0x01, 0x00, 0x00, 0x1f, 0x01, 0x01, 0x09, 0x09, + 0x0f, 0x00, 0x6c, 0x6c, 0xf0, 0xf8, 0x2f, 0x01 + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, + 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8b, 0x00, 0x01, 0x7c, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, + 0x14, 0xf5, 0x2f, 0x01, 0xa0, 0x20, 0x14, 0x00, + 0x40, 0xf8, 0x2f, 0x01, 0x05, 0x90, 0xf6, 0x77, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x50, 0xf8, 0x2f, 0x01, 0x40, 0x39, 0xf4, 0x77, + 0xa8, 0x20, 0x14, 0x00, 0x1c, 0xf6, 0x2f, 0x01, + 0x2c, 0x20, 0xf4, 0x77, 0x80, 0x4d, 0xfb, 0x77 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8b, 0x00, 0x03, 0xc8, 0x3a, 0x01, 0x00, 0x00, + 0x1f, 0x01, 0x01, 0x09, 0x09, 0x0f, 0x00, 0x6c, + 0x6c, 0x6c, 0x6c, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x6c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x60, 0x62, 0x62, 0x62, 0x62, + 0x62, 0x51, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0xf9, 0x2f, 0x01, 0x4f, 0x9d, 0x00, + 0x10, 0x3a, 0x00, 0x00, 0x00, 0x04, 0xf9, 0x01 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8b, 0x00, 0x04, 0x02, 0x06, 0x0b, 0x07, 0x13, + 0x0e, 0x55, 0x56, 0x01, 0x44, 0xf8, 0x2f, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc8, 0x01, 0x00, 0x00, + 0xc8, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x07, 0x00, 0x20, 0x00, 0x3a, 0x0e, 0x13, 0x07, + 0x0f, 0x14, 0x07, 0x10, 0x15, 0x07, 0x12, 0x16, + 0x07, 0x13, 0x17, 0x07, 0x14, 0x18, 0x07, 0x15, + 0x18, 0x07, 0x16, 0x19, 0x07, 0x17, 0x1a, 0x07, + 0x19, 0x1b, 0x07, 0x1a, 0x1c, 0x07, 0x1b, 0x1d, + 0x07, 0x1c, 0x1e, 0x07, 0x1d, 0x1f, 0x07, 0x1e, + 0x20, 0x07, 0x1f, 0x21, 0x07, 0x20, 0x22, 0x07, + 0x21, 0x23, 0x07, 0x23, 0x23, 0x07, 0x24, 0x55 + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x07, 0x00, 0x20, 0x3a, 0x26, 0x24, 0x07, 0x25, + 0x25, 0x07, 0x26, 0x25, 0x07, 0x27, 0x26, 0x07, + 0x28, 0x27, 0x07, 0x29, 0x27, 0x07, 0x2a, 0x28, + 0x07, 0x2b, 0x29, 0x07, 0x2d, 0x29, 0x07, 0x2e, + 0x2a, 0x07, 0x2f, 0x2b, 0x07, 0x30, 0x2b, 0x07, + 0x31, 0x2c, 0x07, 0x07, 0x1d, 0x1f, 0x07, 0x1e, + 0x20, 0x07, 0x1f, 0x21, 0x07, 0x20, 0x22, 0x07, + 0x21, 0x23, 0x07, 0x23, 0x23, 0x07, 0x24, 0x55 + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x06, 0x0e, 0x81, 0x0e, + 0x81, 0x09, 0x4d, 0x00, 0x07, 0x00, 0x20, 0x3a, + 0x26, 0x24, 0x07, 0x25, 0x25, 0x07, 0x26, 0x25, + 0x07, 0x27, 0x26, 0x07, 0x28, 0x27, 0x07, 0x29, + 0x27, 0x07, 0x2a, 0x28, 0x07, 0x2b, 0x29, 0x07, + 0x2d, 0x29, 0x07, 0x2e, 0x2a, 0x07, 0x2f, 0x2b, + 0x07, 0x30, 0x2b, 0x07, 0x31, 0x2c, 0x07, 0x07, + 0x1d, 0x1f, 0x07, 0x1e, 0x20, 0x07, 0x1f, 0x21 + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, + 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0x0e, 0x85, 0x36, + 0xd8, 0xf8, 0x2f, 0x01, 0xf1, 0x9d, 0x00, 0x10, + 0xf8, 0xf8, 0x2f, 0x01, 0x99, 0xf8, 0x2f, 0x01, + 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x9e, 0xbf, 0x85, 0x85, 0x02, 0x05, 0x26, + 0x25, 0x4d, 0x10, 0x10, 0x00, 0xff, 0x81, 0x6c, + 0x00, 0x00, 0xcf, 0x00, 0x01, 0x00, 0x00, 0x1f, + 0x01, 0x01, 0x09, 0x09, 0x0f, 0x00, 0x6c, 0x6c + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0x0d, 0x00, 0x00, + 0x02, 0x9e, 0xbf, 0x85, 0x85, 0x02, 0x05, 0x26, + 0x25, 0x4d, 0x10, 0x10, 0x00, 0xff, 0x81, 0x6c, + 0x00, 0x00, 0xcf, 0x00, 0x01, 0x00, 0x00, 0x1f, + 0x01, 0x01, 0x09, 0x09, 0x0f, 0x00, 0x6c, 0x6c, + 0xec, 0xf8, 0x2f, 0x01, 0x97, 0x40, 0x01, 0x10, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfa, 0x45, 0x03, 0x10, 0x02, 0x00, 0x00, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xf7, 0xcf, 0x00, + 0x01, 0x00, 0x00, 0x1f, 0x01, 0x01, 0x09, 0x09, + 0x0f, 0x00, 0x6c, 0x6c, 0x6c, 0x6c, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x62, + 0x62, 0x62, 0x62, 0x62, 0x51, 0x6c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xf7, 0x00, 0x00, + 0x02, 0xf9, 0xbf, 0x85, 0x85, 0x02, 0x05, 0x26, + 0x25, 0x4d, 0x10, 0x10, 0x00, 0xff, 0x81, 0x6c, + 0x00, 0x00, 0xcf, 0x00, 0x01, 0x00, 0x00, 0x1f, + 0x01, 0x01, 0x09, 0x09, 0x0f, 0x00, 0x6c, 0x6c, + 0x6c, 0x6c, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x6c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x60, 0x62, 0x62, 0x62, 0x62, 0x62 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0xf7, 0xf4, 0x00, + 0x14, 0xf9, 0x2f, 0x01, 0x6d, 0x4f, 0x01, 0x10, + 0x94, 0xf8, 0x2f, 0x01, 0x40, 0x00, 0x00, 0x00, + 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0xf9, 0xbf, 0x85, 0x85, 0x02, 0x05, 0x26, + 0x25, 0x4d, 0x10, 0x10, 0x00, 0xff, 0x81, 0x6c, + 0x00, 0x00, 0xcf, 0x00, 0x01, 0x00, 0x00, 0x1f, + 0x01, 0x01, 0x09, 0x09, 0x0f, 0x00, 0x6c, 0x6c + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0x20, 0x6c, 0x01, + 0x6d, 0x4f, 0x01, 0x10, 0x94, 0xf8, 0x2f, 0x01, + 0x40, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0xf9, 0xbf, 0x85, + 0x85, 0x02, 0x05, 0x26, 0x25, 0x4d, 0x10, 0x10, + 0x00, 0xff, 0x81, 0x6c, 0x00, 0x00, 0xcf, 0x00, + 0x01, 0x00, 0x00, 0x1f, 0x01, 0x01, 0x09, 0x09, + 0x0f, 0x00, 0x6c, 0x6c, 0xe8, 0xf8, 0x2f, 0x01 + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xf9, 0x81, 0x6c, + 0x00, 0x00, 0xcf, 0x00, 0x01, 0x00, 0x00, 0x1f, + 0x01, 0x01, 0x09, 0x09, 0x0f, 0x00, 0x6c, 0x6c, + 0xe8, 0xf8, 0x2f, 0x01, 0xec, 0xf8, 0x2f, 0x01, + 0x97, 0x40, 0x01, 0x10, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfa, 0x45, 0x03, 0x10, + 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0xf9, 0x01, 0x00, + 0x1c, 0xf9, 0x2f, 0x01, 0x6d, 0x4f, 0x01, 0x10, + 0x9c, 0xf8, 0x2f, 0x01, 0x40, 0x00, 0x00, 0x00, + 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x6c, 0xbf, 0x85, 0x85, 0x02, 0x05, 0x26, + 0x25, 0x4d, 0x10, 0x10, 0x00, 0xff, 0x81, 0x6c, + 0x00, 0x00, 0xcf, 0x00, 0x01, 0x00, 0x00, 0x1f, + 0x01, 0x01, 0x09, 0x09, 0x0f, 0x00, 0x6c, 0x6c + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x12, 0x1c, 0x0c, 0x1b, + 0x08, 0x1a, 0x07, 0x30, 0x08, 0x09, 0x6d, 0x08, + 0x27, 0x00, 0x9e, 0x00, 0x1e, 0x23, 0x47, 0x01, + 0x40, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x6c, 0xbf, 0x85, + 0x85, 0x02, 0x05, 0x26, 0x25, 0x4d, 0x10, 0x10, + 0x00, 0xff, 0x81, 0x6c, 0x00, 0x00, 0xcf, 0x00, + 0x01, 0x00, 0x00, 0x1f, 0x01, 0x01, 0x09, 0x09 + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, + 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0x0d, 0xff, 0x36, + 0xdc, 0xf8, 0x2f, 0x01, 0xf1, 0x9d, 0x00, 0x10, + 0xfc, 0xf8, 0x2f, 0x01, 0x9d, 0xf8, 0x2f, 0x01, + 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x1e, 0x3f, 0x05, 0x05, 0x02, 0x05, 0x26, + 0x27, 0x6d, 0x10, 0x10, 0x00, 0xff, 0x85, 0x6c, + 0x00, 0x00, 0xcf, 0x00, 0x01, 0x00, 0x00, 0x1f, + 0x01, 0x01, 0x07, 0x08, 0x0c, 0x00, 0x6c, 0x6c + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x08, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xcf, + 0x00, 0x01, 0x00, 0x00, 0x1f, 0x01, 0x01, 0x10, + 0xfc, 0xf8, 0x2f, 0x01, 0x9d, 0xf8, 0x2f, 0x01, + 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x1e, 0x3f, 0x05, 0x05, 0x02, 0x05, 0x26, + 0x27, 0x6d, 0x10, 0x10, 0x00, 0xff, 0x85, 0x6c, + 0x00, 0x00, 0xcf, 0x00, 0x01, 0x00, 0x00, 0x1f, + 0x01, 0x01, 0x07, 0x08, 0x0c, 0x00, 0x6c, 0x6c + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x08, 0x0e, 0x85, 0x09, + 0xed, 0x09, 0x6d, 0x09, 0xed, 0x1e, 0x3f, 0x05, + 0x05, 0x02, 0x05, 0x26, 0x27, 0x6d, 0x10, 0x10, + 0x00, 0xff, 0x85, 0x6c, 0x00, 0x00, 0xcf, 0x00, + 0x01, 0x00, 0x00, 0x1f, 0x01, 0x01, 0x07, 0x08, + 0x0c, 0x00, 0x6c, 0x6c, 0xf0, 0xf8, 0x2f, 0x01, + 0x97, 0x40, 0x01, 0x10, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3e, 0xf9, 0x2f, 0x01 + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xf3, 0x6c, 0x6c, + 0xf0, 0xf8, 0x2f, 0x01, 0x97, 0x40, 0x01, 0x10, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3e, 0xf9, 0x2f, 0x01, 0x04, 0xf9, 0x2f, 0x01, + 0x97, 0x40, 0x01, 0x10, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x03, 0x10, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x84, 0x00, 0x00, 0x00, 0x32, 0x02, 0xa3, 0x04, + 0x10, 0x3b, 0xa3, 0x04, 0x10, 0x1a, 0xa3, 0x04, + 0x10, 0xf9, 0xa2, 0x04, 0x10, 0xd8, 0xa2, 0x00, + 0xb9, 0x19, 0xe2, 0x87, 0xba, 0x56, 0x78, 0x72, + 0x68, 0x9e, 0x7a, 0xf4, 0x65, 0x6d, 0xd9, 0xde, + 0xf6, 0x33, 0xa2, 0x04, 0x10, 0x12, 0xa2, 0x04, + 0x10, 0xf1, 0xa1, 0x04, 0x10, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x2d, 0x6c, 0xe9 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x06, 0x1a, 0x07, 0x1b, + 0x08, 0x1c, 0x0c, 0x77, 0x21, 0xac, 0xe5, 0x77, + 0x00, 0x00, 0x00, 0x00, 0xaa, 0x4e, 0x01, 0x10, + 0x3c, 0x01, 0x00, 0x00, 0xc4, 0xf8, 0x2f, 0x01, + 0xdc, 0xf8, 0x2f, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0xb9, 0x19, 0xe2, 0x87, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00 + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x08, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xcf, + 0x00, 0x01, 0x00, 0x00, 0x1f, 0x01, 0x01, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc8, 0x01, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xcc, 0xf8, 0x2f, 0x01, 0x8b, 0x41, 0x01, 0x10, + 0x8c, 0xf8, 0x2f, 0x01, 0x40, 0x00, 0x00, 0x00 + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x04, 0x3d, 0x51, 0x0a, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0xf9, 0x2f, 0x01, 0x31, 0x10, 0x01, 0x10, + 0xd0, 0xf9, 0x2f, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x07, 0x1b, 0x08, 0x1c, 0x0c, 0xc6, 0xf8, + 0x66, 0xbc, 0xc4, 0xbe, 0x0b, 0x25, 0xc5, 0x4c, + 0xf4, 0x03, 0x10, 0x2f, 0x11, 0x3f, 0x12, 0x44 + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, + 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x10, 0x36, + 0x88, 0xf9, 0x2f, 0x01, 0xf1, 0x9d, 0x00, 0x10, + 0xa8, 0xf9, 0x2f, 0x01, 0x49, 0xf9, 0x2f, 0x01, + 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x1e, 0x3f, 0x05, 0x05, 0x02, 0x05, 0x26, + 0x27, 0xed, 0x00, 0x10, 0x00, 0xff, 0x85, 0x6c, + 0x00, 0x00, 0xcf, 0x00, 0x01, 0x00, 0x00, 0x1f, + 0x01, 0x01, 0x07, 0x08, 0x0c, 0x00, 0x6c, 0x6c + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x8b, 0x00, 0x00, 0xbc, 0x3a, 0x40, 0xd3, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd8, 0xf4, 0x2f, 0x01, 0x80, 0x69, 0x67, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xf0, 0xfd, + 0x7f, 0x00, 0x60, 0xfd, 0x7f, 0x3c, 0x01, 0x00, + 0x00, 0xa0, 0xf5, 0x2f, 0x01, 0x03, 0x01, 0x00, + 0x00, 0x9a, 0x11, 0xf4, 0x77, 0x9f, 0x11, 0xf4, + 0x77, 0x3c, 0x01, 0x00, 0x00, 0xa0, 0xf5, 0x01 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8b, 0x00, 0x00, 0xf6, 0x3a, 0x0b, 0x07, 0xa5, + 0x03, 0x2f, 0x63, 0x97, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8b, 0x00, 0x01, 0x30, 0x3a, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x12, 0xcd, 0xa6, 0x3c, + 0x36, 0xec, 0x6a, 0x73, 0x00, 0x64, 0x75, 0xdf, + 0x2e, 0x13, 0xec, 0xca, 0x3c, 0x03, 0x00, 0x00, + 0x06, 0xa5, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8b, 0x00, 0x01, 0x6a, 0x3a, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8b, 0x00, 0x01, 0xa4, 0x3a, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0xa5, 0x83, 0x1b, 0x8e, 0xac, 0x00, 0x00, + 0x0b, 0xa5, 0x08, 0x08, 0x03, 0x00, 0x00, 0x01, + 0x02, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8d, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8b, 0x00, 0x01, 0xde, 0x3a, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8b, 0x00, 0x02, 0x18, 0x3a, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8b, 0x00, 0x02, 0x52, 0x3a, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8b, 0x00, 0x02, 0x8c, 0x3a, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8b, 0x00, 0x02, 0xc6, 0x2a, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc8, 0x01, 0x00, 0x00, + 0xc8, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xf1, 0x2f, 0x01, + 0x49, 0xf9, 0x2f, 0x01, 0x3a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x1e, 0x3f, 0x05, + 0x05, 0x02, 0x05, 0x26, 0x27, 0xed, 0x00, 0x10, + 0x00, 0xff, 0x85, 0x6c, 0x00, 0x00, 0xcf, 0x00, + 0x01, 0x00, 0x00, 0x1f, 0x01, 0x01, 0x07, 0x08, + 0x0c, 0x00, 0x6c, 0x6c, 0x9c, 0xf9, 0x2f, 0x01, + 0x97, 0x40, 0x01, 0x10, 0x03, 0x00, 0x00, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0xf1, 0x01, 0x00, + 0xb4, 0xf9, 0x2f, 0x01, 0x6d, 0x4f, 0x01, 0x10, + 0x34, 0xf9, 0x2f, 0x01, 0x40, 0x00, 0x00, 0x00, + 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x8b, 0x00, 0x01, 0x10, 0x3a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8b, 0x00, 0x01, 0x4a, 0x2e, 0x0b, 0x06, 0xa5, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc8, 0x01, 0x00, 0x00, + 0xc8, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xfb, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x88, 0xf9, 0x2f, 0x01, 0x97, 0x40, 0x01, 0x10, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfa, 0x45, 0x03, 0x10, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0xfb, 0x0f, 0x00, + 0xc4, 0xf9, 0x2f, 0x01, 0x6d, 0x4f, 0x01, 0x10, + 0x44, 0xf9, 0x2f, 0x01, 0x40, 0x00, 0x00, 0x00, + 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }, + .response_len = 0x00 + } }; static const struct setup_cmd upeket_setup_commands[] = { - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xF3, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0xfe, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xb8, 0x00, 0x00, 0x00, 0x98, 0xf1, 0x12, 0x00, - 0x03, 0xd4, 0xa9, 0x00, 0x64, 0x00, 0x00, 0x00, - 0x14, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x84, 0xf1, 0x12, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x90, 0xf1, 0x12, 0x00, - 0xac, 0x0d, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xf7, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x90, 0xf1, 0x12, 0x00, - 0x92, 0xc5, 0xa9, 0x00, 0x48, 0xf1, 0x12, 0x00, - 0x40, 0x00, 0x00, 0x00, 0xa2, 0xc5, 0xa9, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x02, 0xfe, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xb8, 0x00, 0x00, 0x00, 0x98, 0xf1, 0x12, 0x00, - 0x03, 0xd4, 0xa9, 0x00, 0x64, 0x00, 0x00, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0xf7, 0xcd, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xf8, 0xa9, 0x00, - 0x28, 0xf1, 0x12, 0x00, 0x40, 0x00, 0x00, 0x00, - 0xbb, 0xc4, 0xa9, 0x00, 0x02, 0xfa, 0x3f, 0x05, - 0x05, 0x02, 0x05, 0x23, 0x27, 0xe5, 0x13, 0x10, - 0x08, 0xff, 0x04, 0x6c, 0xc1, 0x41, 0x1c, 0x4c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0xf1, 0x12, 0x00, 0x89, 0xae, 0xa9, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8b, 0x00, 0x00, 0x00, 0x3a, 0x8c, 0xf1, 0x12, - 0x00, 0x64, 0xa8, 0xa7, 0x00, 0x84, 0xf1, 0x12, - 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf1, 0x12, - 0x00, 0x51, 0xa6, 0xa7, 0x00, 0xf8, 0x00, 0x00, - 0x00, 0x7e, 0xa6, 0xa7, 0x00, 0x24, 0x5a, 0xac, - 0x00, 0x01, 0xf1, 0x12, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x2f, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, - 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, - 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, - 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x7c, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, - 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, - 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, - 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0x0d, 0xff, 0x00, - 0x34, 0xf1, 0x12, 0x00, 0x40, 0x00, 0x00, 0x00, - 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xf1, 0x12, 0x00, 0x57, 0xcc, 0xa9, 0x00, - 0x34, 0xf1, 0x12, 0x00, 0x40, 0x00, 0x00, 0x00, - 0xbd, 0xcc, 0xa9, 0x00, 0x3a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, - 0x34, 0xf1, 0x12, 0x00, 0x3a, 0x00, 0x00, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x0a, 0x37, 0x6a, 0x3d, - 0x73, 0x3d, 0x71, 0x0e, 0x01, 0x0e, 0x81, 0x00, - 0x40, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x12, 0x00, - 0x57, 0xcc, 0xa9, 0x00, 0x34, 0xf1, 0x12, 0x00, - 0x40, 0x00, 0x00, 0x00, 0xbd, 0xcc, 0xa9, 0x00, - 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xb8, 0x00, 0x00, 0x00, 0x34, 0xf1, 0x12, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, - 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, - 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, - 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0x3d, 0x51, 0x0e, - 0x01, 0x0e, 0x81, 0x00, 0x40, 0x00, 0x00, 0x00, - 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xf1, 0x12, 0x00, 0x57, 0xcc, 0xa9, 0x00, - 0x34, 0xf1, 0x12, 0x00, 0x40, 0x00, 0x00, 0x00, - 0xbd, 0xcc, 0xa9, 0x00, 0x3a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, - 0x34, 0xf1, 0x12, 0x00, 0x3a, 0x00, 0x00, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, - 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, - 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, - 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x04, 0x78, 0x3A, 0x34, 0x00, 0x00, - 0xC0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x1A, 0x80, - 0x7C, 0x04, 0xF1, 0x12, 0x00, 0x18, 0x00, 0x00, - 0x00, 0x48, 0x00, 0x00, 0x00, 0xCC, 0xEF, 0x12, - 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xB0, 0xEF, 0x12, 0x00, 0x0C, 0x00, 0x0C, - 0x00, 0x84, 0x21, 0x15, 0x00, 0x48, 0x00, 0x00, - 0x00, 0x0C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x04, 0xB2, 0x3A, 0x0B, 0x88, 0x01, - 0xB4, 0x01, 0x20, 0x91, 0x04, 0x07, 0x02, 0x24, - 0x20, 0xE2, 0x15, 0x0D, 0x10, 0x0F, 0x10, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x12, 0x13, 0x13, 0x13, - 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x16, - 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, - 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x1A, 0x1A, - 0x1A, 0x1A, 0x1A, 0x1A, 0x1B, 0x1B, 0x1B, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x04, 0xEC, 0x3A, 0x0B, 0x1C, 0x1C, - 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1D, 0x1D, 0x1D, - 0x1E, 0x1D, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1E, 0x1F, 0x1F, 0x20, - 0x20, 0x1F, 0x20, 0x20, 0x20, 0x21, 0x20, 0x21, - 0x20, 0x21, 0x20, 0x20, 0x20, 0x21, 0x20, 0x21, - 0x20, 0x21, 0x21, 0x21, 0x21, 0x21, 0x22, 0x21, - 0x21, 0x22, 0x21, 0x22, 0x21, 0x22, 0x22, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x05, 0x26, 0x3A, 0x0B, 0x22, 0x22, - 0x22, 0x21, 0x22, 0x22, 0x22, 0x21, 0x22, 0x22, - 0x22, 0x21, 0x22, 0x21, 0x22, 0x21, 0x21, 0x21, - 0x22, 0x21, 0x21, 0x21, 0x21, 0x22, 0x22, 0x21, - 0x22, 0x22, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x20, 0x20, 0x21, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x05, 0x60, 0x3A, 0x0B, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, - 0x1F, 0x1F, 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, - 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1F, - 0x1E, 0x1E, 0x1E, 0x1E, 0x1D, 0x1D, 0x1D, 0x1D, - 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1C, 0x1D, 0x1D, - 0x1D, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, - 0x1B, 0x1B, 0x1C, 0x1C, 0x1B, 0x1B, 0x1B, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x05, 0x9A, 0x3A, 0x0B, 0x1B, 0x1B, - 0x1B, 0x1A, 0x1B, 0x1B, 0x1A, 0x1A, 0x1A, 0x1B, - 0x1B, 0x1B, 0x1B, 0x1A, 0x19, 0x1A, 0x1A, 0x1A, - 0x1A, 0x19, 0x1A, 0x1A, 0x1A, 0x19, 0x19, 0x19, - 0x19, 0x19, 0x19, 0x18, 0x19, 0x18, 0x18, 0x19, - 0x18, 0x17, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, - 0x17, 0x17, 0x17, 0x16, 0x17, 0x16, 0x16, 0x15, - 0x15, 0x16, 0x15, 0x16, 0x15, 0x15, 0x14, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x05, 0xD4, 0x2C, 0x0B, 0x14, 0x15, - 0x14, 0x14, 0x14, 0x13, 0x13, 0x13, 0x12, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x6E, 0x12, 0x00, 0x2B, 0xC5, 0xA9, 0x00, - 0x64, 0x00, 0x00, 0x00, 0x7C, 0xEF, 0x12, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x01, 0x68, 0x0A, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xD0, 0xFD, 0x7F, 0xDC, 0x6D, 0x12, 0x00, - 0x2A, 0x26, 0x80, 0x7C, 0x98, 0x6D, 0x12, 0x00, - 0x00, 0x26, 0x80, 0x7C, 0xB8, 0x00, 0x00, 0x00, - 0x0C, 0x80, 0x01, 0x10, 0x90, 0x3E, 0x94, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x03, 0xB4, 0x3A, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1E, 0x1E, 0x1E, - 0x1E, 0x1F, 0x1F, 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, - 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, - 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, 0x1D, 0x1D, 0x1D, - 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1C, 0x1D, - 0x1D, 0x1D, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x03, 0xEE, 0x06, 0x0B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x85, 0xB7, 0xA9, 0x00, - 0xB8, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00, - 0x18, 0x70, 0x12, 0x00, 0x2B, 0xC5, 0xA9, 0x00, - 0x64, 0x00, 0x00, 0x00, 0xD4, 0xF0, 0x12, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x07, 0x00, 0x20, 0x00, 0x3a, 0x32, 0x2b, 0x07, - 0x2e, 0x29, 0x07, 0x2b, 0x27, 0x07, 0x27, 0x25, - 0x07, 0x23, 0x23, 0x07, 0x20, 0x21, 0x07, 0x1c, - 0x1d, 0x07, 0x19, 0x1a, 0x07, 0x15, 0x17, 0x07, - 0x12, 0x15, 0x07, 0x0e, 0x14, 0x07, 0x12, 0x17, - 0x07, 0x15, 0x19, 0x07, 0x19, 0x1c, 0x07, 0x1c, - 0x1f, 0x07, 0x20, 0x23, 0x07, 0x23, 0x25, 0x07, - 0x27, 0x27, 0x07, 0x2b, 0x29, 0x07, 0x2e, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x07, 0x00, 0x20, 0x3a, 0x26, 0x2b, 0x07, 0x32, - 0x2d, 0x07, 0x32, 0x2f, 0x07, 0x2e, 0x2d, 0x07, - 0x2b, 0x2b, 0x07, 0x27, 0x29, 0x07, 0x23, 0x27, - 0x07, 0x20, 0x25, 0x07, 0x1c, 0x22, 0x07, 0x19, - 0x1e, 0x07, 0x15, 0x1b, 0x07, 0x12, 0x19, 0x07, - 0x0e, 0x16, 0x07, 0x07, 0x19, 0x1c, 0x07, 0x1c, - 0x1f, 0x07, 0x20, 0x23, 0x07, 0x23, 0x25, 0x07, - 0x27, 0x27, 0x07, 0x2b, 0x29, 0x07, 0x2e, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x06, 0x0e, 0x81, 0x0e, - 0x81, 0x09, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x26, 0x00, 0x00, 0x00, 0x07, 0x00, 0x20, 0x3a, - 0x26, 0x2b, 0x07, 0x32, 0x2d, 0x07, 0x32, 0x2f, - 0x07, 0x2e, 0x2d, 0x07, 0x2b, 0x2b, 0x07, 0x27, - 0x29, 0x07, 0x23, 0x27, 0x07, 0x20, 0x25, 0x07, - 0x1c, 0x22, 0x07, 0x19, 0x1e, 0x07, 0x15, 0x1b, - 0x07, 0x12, 0x19, 0x07, 0x0e, 0x16, 0x07, 0x07, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, - 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, - 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, - 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0x0e, 0x85, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x20, 0x3a, 0x26, 0x2b, 0x07, 0x32, - 0x2d, 0x07, 0x32, 0x2f, 0x07, 0x2e, 0x2d, 0x07, - 0x2b, 0x2b, 0x07, 0x29, 0x07, 0x23, 0x27, 0x07, - 0x20, 0x25, 0x07, 0x1c, 0x22, 0x07, 0x19, 0x1e, - 0x07, 0x15, 0x1b, 0x07, 0x12, 0x19, 0x07, 0x1f, - 0x0e, 0x16, 0x07, 0x07, 0x19, 0x1c, 0x07, 0x1c, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0x0d, 0x62, 0x62, - 0x51, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x3a, 0x41, 0x0e, 0x2b, 0x00, 0x00, 0x00, 0x00, - 0x78, 0xf1, 0x12, 0x00, 0x1a, 0xaa, 0xa7, 0x1f, - 0x00, 0x3a, 0x09, 0x00, 0x00, 0x00, 0x12, 0x41, - 0x0e, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x4c, 0xf1, 0x12, 0x00, 0x89, 0xae, - 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0x20, 0x6C, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x20, 0x3A, 0x26, 0x2B, 0x07, 0x32, - 0x2D, 0x07, 0x32, 0x2F, 0x07, 0x2E, 0x2D, 0x07, - 0x2B, 0x2B, 0x07, 0x27, 0x29, 0x07, 0x23, 0x27, - 0x07, 0x20, 0x25, 0x07, 0x1C, 0x22, 0x07, 0x19, - 0x1E, 0x07, 0x15, 0x1B, 0x07, 0x12, 0x19, 0x07, - 0x0E, 0x16, 0x07, 0x07, 0x19, 0x1C, 0x07, 0x1C, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xF9, 0x6C, 0x6C, - 0x6C, 0x6C, 0x40, 0x40, 0x2E, 0x6D, 0x64, 0xED, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4C, 0xF1, 0x12, 0x00, 0x89, 0xAE, 0xA9, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xE8, 0x3D, 0xAC, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x68, 0xF1, 0x12, 0x00, - 0x14, 0xAB, 0xA7, 0x00, 0x03, 0x00, 0x00, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0xF9, 0x00, 0x00, - 0x26, 0x00, 0x00, 0x00, 0x07, 0x00, 0x20, 0x3A, - 0x26, 0x2B, 0x07, 0x32, 0x2D, 0x07, 0x32, 0x2F, - 0x07, 0x2E, 0x2D, 0x07, 0x2B, 0x2B, 0x07, 0x27, - 0x29, 0x07, 0x23, 0x27, 0x07, 0x20, 0x25, 0x07, - 0x1C, 0x22, 0x07, 0x19, 0x1E, 0x07, 0x15, 0x1B, - 0x07, 0x12, 0x19, 0x07, 0x0E, 0x16, 0x07, 0x07, - 0x19, 0x1C, 0x07, 0x1C, 0xBA, 0xEC, 0x64, 0xED, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x16, 0x1C, 0x13, 0x1B, - 0x0B, 0x1A, 0x0A, 0x30, 0x08, 0x09, 0x6D, 0x08, - 0xA7, 0x00, 0x9E, 0x00, 0x1E, 0x0C, 0x08, 0x1D, - 0x04, 0x23, 0x42, 0x2F, 0x07, 0x2E, 0x2D, 0x07, - 0x2B, 0x2B, 0x07, 0x27, 0x29, 0x07, 0x23, 0x27, - 0x07, 0x20, 0x25, 0x07, 0x1C, 0x22, 0x07, 0x19, - 0x1E, 0x07, 0x15, 0x1B, 0x07, 0x12, 0x19, 0x07, - 0x0E, 0x16, 0x07, 0x07, 0x19, 0x1C, 0x07, 0x1C, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x01, 0x02, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, - 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, - 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, - 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3A, 0x3D, 0x3F, 0xFF, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0x0D, 0xFF, 0x30, - 0x08, 0x09, 0x6D, 0x08, 0xA7, 0x00, 0x9E, 0x00, - 0x1E, 0x0C, 0x08, 0x1D, 0x04, 0x23, 0x42, 0x2F, - 0x07, 0x2E, 0x2D, 0x07, 0x2B, 0x2B, 0x07, 0x27, - 0x29, 0x07, 0x23, 0x27, 0x07, 0x20, 0x25, 0x07, - 0x1C, 0x22, 0x07, 0x19, 0x1E, 0x07, 0x15, 0x1B, - 0x07, 0x12, 0x19, 0x07, 0x0E, 0x16, 0x07, 0x07, - 0x19, 0x1C, 0x07, 0x1C, 0xBA, 0xEC, 0x64, 0xED, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xF7, 0x64, 0xED, - 0x00, 0x00, 0x00, 0x00, 0x7C, 0xF1, 0x12, 0x00, - 0x1A, 0xAA, 0xA7, 0x00, 0x3A, 0x00, 0x00, 0x00, - 0x2A, 0x6D, 0x64, 0xED, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x50, 0xF1, 0x12, 0x00, - 0x89, 0xAE, 0xA9, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xE8, 0x3D, 0xAC, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xF7, 0xA9, 0x00, - 0x02, 0xFA, 0x3F, 0x05, 0x05, 0xC2, 0x85, 0xA6, - 0xA7, 0x6D, 0x10, 0x10, 0x08, 0xFF, 0x85, 0x6C, - 0x00, 0x00, 0xCF, 0x00, 0x01, 0x00, 0x00, 0x1F, - 0x01, 0x01, 0x0A, 0x0B, 0x13, 0x04, 0x6C, 0x6C, - 0x6C, 0x6C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x6C, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x42, 0x42, 0x42, 0x42, 0x42, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0xF7, 0xF3, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x02, 0x0D, 0xFF, 0x30, - 0x08, 0x09, 0x6D, 0x08, 0xA7, 0x00, 0x9E, 0x00, - 0x1E, 0x0C, 0x08, 0x1D, 0x04, 0x23, 0x42, 0x2F, - 0x07, 0x2E, 0x2D, 0x07, 0x2B, 0x2B, 0x07, 0x27, - 0x29, 0x07, 0x23, 0x27, 0x07, 0x20, 0x25, 0x07, - 0x1C, 0x22, 0x07, 0x19, 0x1E, 0x07, 0x15, 0x1B, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xE8, 0x3D, 0xAC, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5C, 0xF1, 0x12, 0x00, 0x14, 0xAB, 0xA7, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x5C, 0xF1, 0x12, 0x00, - 0x20, 0xAB, 0xA7, 0x00, 0x58, 0xF1, 0x12, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x99, 0xA9, 0xA7, 0x00, - 0xE8, 0x3D, 0xAC, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0xF0, 0x8F, 0x2F, - 0x07, 0x2E, 0x2D, 0x07, 0x2B, 0x2B, 0x07, 0x27, - 0x29, 0x07, 0x23, 0x27, 0x07, 0x20, 0x25, 0x07, - 0x1C, 0x22, 0x07, 0x19, 0x1E, 0x07, 0x15, 0x1B, - 0x07, 0x12, 0x19, 0x07, 0x82, 0xEC, 0x64, 0xED, - 0x24, 0xF1, 0x12, 0x00, 0xFA, 0xCB, 0xA9, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xEA, 0x3D, 0xAC, 0x00, 0xBD, 0xCC, 0xA9, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x08, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0xCF, - 0x00, 0x01, 0x00, 0x00, 0x1F, 0x01, 0x01, 0x00, - 0x0C, 0xCF, 0xA9, 0x00, 0x74, 0x70, 0x12, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x1C, 0xCF, 0xA9, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x02, 0xF0, 0x8F, 0x2F, - 0x07, 0x2E, 0x2D, 0x07, 0x2B, 0x2B, 0x07, 0x27, - 0x29, 0x07, 0x23, 0x27, 0x07, 0x20, 0x25, 0x07, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x06, 0x0E, 0x85, 0x09, - 0xED, 0x09, 0x6D, 0x2F, 0x07, 0x2E, 0x2D, 0x07, - 0x2B, 0x2B, 0x07, 0x27, 0x29, 0x07, 0x23, 0x27, - 0x07, 0x20, 0x25, 0x07, 0x1C, 0x22, 0x07, 0x19, - 0x8A, 0xEC, 0x64, 0xED, 0x1C, 0xF1, 0x12, 0x00, - 0xFA, 0xCB, 0xA9, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x72, 0xF1, 0x12, 0x00, - 0xBD, 0xCC, 0xA9, 0x00, 0x0A, 0x00, 0x00, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x01, 0x02, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, - 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, - 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, - 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3A, 0x3D, 0x3F, 0xFF, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0x09, 0xED, 0x2F, - 0x07, 0x2E, 0x2D, 0x07, 0x2B, 0x2B, 0x07, 0x27, - 0x29, 0x07, 0x23, 0x27, 0x07, 0x20, 0x25, 0x07, - 0x1C, 0x22, 0x07, 0x19, 0x8A, 0xEC, 0x64, 0xED, - 0x1C, 0xF1, 0x12, 0x00, 0xFA, 0xCB, 0xA9, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x72, 0xF1, 0x12, 0x00, 0xBD, 0xCC, 0xA9, 0x00, - 0x0A, 0x00, 0x00, 0x00, 0xBD, 0xCC, 0xA9, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xF3, 0x00, 0x00, - 0x8C, 0xF1, 0x12, 0x00, 0x1A, 0xAA, 0xA7, 0x00, - 0x3A, 0x00, 0x00, 0x00, 0x5A, 0x6D, 0x64, 0xED, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0xF1, 0x12, 0x00, 0x89, 0xAE, 0xA9, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xE8, 0x3D, 0xAC, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7C, 0xF1, 0x12, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x84, 0x00, 0x00, 0x00, 0x32, 0x02, 0xE0, 0xAD, - 0x00, 0xFC, 0xDF, 0xAD, 0x00, 0xDB, 0xDF, 0xAD, - 0x00, 0xBA, 0xDF, 0xAD, 0x00, 0x99, 0xDF, 0x6F, - 0x44, 0xC2, 0xE8, 0x20, 0x65, 0x73, 0x83, 0xAC, - 0xD7, 0x88, 0x6D, 0x59, 0x61, 0xE0, 0x3B, 0x3D, - 0xB7, 0xF4, 0xDE, 0xAD, 0x00, 0xD3, 0xDE, 0xAD, - 0x00, 0xB2, 0xDE, 0xAD, 0x00, 0x91, 0xDE, 0x00, - 0xA6, 0xEC, 0x64, 0xED, 0xA2, 0xEC, 0x64, 0xED, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x06, 0x1A, 0x0A, 0x1B, - 0x0B, 0x1C, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x92, 0xD5, 0x90, 0x7C, 0xBB, 0x9B, 0x80, 0x7C, - 0xB8, 0x00, 0x00, 0x00, 0xAC, 0x70, 0x12, 0x00, - 0x85, 0xB7, 0xA9, 0x00, 0xB8, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x08, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0xCF, - 0x00, 0x01, 0x00, 0x00, 0x1F, 0x01, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00, - 0x4C, 0x70, 0x12, 0x00, 0xEB, 0xC4, 0xA9, 0x00, - 0x64, 0x00, 0x00, 0x00, 0x68, 0x70, 0x12, 0x00, - 0x40, 0x00, 0x00, 0x00, 0xE8, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xB0, 0x70, 0x12, 0x00, - 0x0C, 0xCF, 0xA9, 0x00, 0x68, 0x70, 0x12, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0x0D, 0x00, 0x00, - 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1F, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, - 0xD0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0xA6, 0xB5, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x94, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x28, 0x6F, 0x44, 0xC2, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x04, 0x78, 0x3A, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xD0, 0xFD, 0x7F, 0x94, 0xF0, 0x12, - 0x00, 0x2A, 0x26, 0x80, 0x7C, 0x50, 0xF0, 0x12, - 0x00, 0x00, 0x26, 0x80, 0x7C, 0x08, 0x00, 0x00, - 0x00, 0x0C, 0x80, 0x01, 0x10, 0x90, 0x3E, 0x94, - 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x69, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x04, 0xB2, 0x3A, 0x0B, 0x88, 0x01, - 0xB4, 0x01, 0x20, 0x91, 0x04, 0x07, 0x02, 0x24, - 0x20, 0xE2, 0x15, 0x0D, 0x10, 0x0F, 0x10, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x12, 0x13, 0x13, 0x13, - 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x16, - 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, - 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x1A, 0x1A, - 0x1A, 0x1A, 0x1A, 0x1A, 0x1B, 0x1B, 0x1B, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x04, 0xEC, 0x3A, 0x0B, 0x1C, 0x1C, - 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1D, 0x1D, 0x1D, - 0x1E, 0x1D, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1E, 0x1F, 0x1F, 0x20, - 0x20, 0x1F, 0x20, 0x20, 0x20, 0x21, 0x20, 0x21, - 0x20, 0x21, 0x20, 0x20, 0x20, 0x21, 0x20, 0x21, - 0x20, 0x21, 0x21, 0x21, 0x21, 0x21, 0x22, 0x21, - 0x21, 0x22, 0x21, 0x22, 0x21, 0x22, 0x22, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x05, 0x26, 0x3A, 0x0B, 0x22, 0x22, - 0x22, 0x21, 0x22, 0x22, 0x22, 0x21, 0x22, 0x22, - 0x22, 0x21, 0x22, 0x21, 0x22, 0x21, 0x21, 0x21, - 0x22, 0x21, 0x21, 0x21, 0x21, 0x22, 0x22, 0x21, - 0x22, 0x22, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x20, 0x20, 0x21, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x05, 0x60, 0x3A, 0x0B, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, - 0x1F, 0x1F, 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, - 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1F, - 0x1E, 0x1E, 0x1E, 0x1E, 0x1D, 0x1D, 0x1D, 0x1D, - 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1C, 0x1D, 0x1D, - 0x1D, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, - 0x1B, 0x1B, 0x1C, 0x1C, 0x1B, 0x1B, 0x1B, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x05, 0x9A, 0x3A, 0x0B, 0x1B, 0x1B, - 0x1B, 0x1A, 0x1B, 0x1B, 0x1A, 0x1A, 0x1A, 0x1B, - 0x1B, 0x1B, 0x1B, 0x1A, 0x19, 0x1A, 0x1A, 0x1A, - 0x1A, 0x19, 0x1A, 0x1A, 0x1A, 0x19, 0x19, 0x19, - 0x19, 0x19, 0x19, 0x18, 0x19, 0x18, 0x18, 0x19, - 0x18, 0x17, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, - 0x17, 0x17, 0x17, 0x16, 0x17, 0x16, 0x16, 0x15, - 0x15, 0x16, 0x15, 0x16, 0x15, 0x15, 0x14, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x05, 0xD4, 0x2C, 0x0B, 0x14, 0x15, - 0x14, 0x14, 0x14, 0x13, 0x13, 0x13, 0x12, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x6F, 0x12, 0x00, 0x2B, 0xC5, 0xA9, 0x00, - 0x64, 0x00, 0x00, 0x00, 0x2C, 0xF0, 0x12, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xF7, 0x1C, 0x1C, - 0x1B, 0x1B, 0x1C, 0x1C, 0x1B, 0x1B, 0x1B, 0x1B, - 0x1B, 0x1B, 0x1B, 0x1A, 0x1B, 0x1B, 0x1A, 0x1A, - 0x1A, 0x1B, 0x1B, 0x1B, 0x1B, 0x1A, 0x19, 0x1A, - 0x1A, 0x1A, 0x1A, 0x19, 0x1A, 0x1A, 0x1A, 0x19, - 0x19, 0x19, 0x19, 0x19, 0x19, 0x18, 0x19, 0x18, - 0x18, 0x19, 0x18, 0x17, 0x18, 0x17, 0x17, 0x17, - 0x17, 0x17, 0x17, 0x17, 0x17, 0x16, 0x17, 0x16, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0xF7, 0xF3, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x04, 0x3D, 0x40, 0x0A, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xED, 0x64, 0xED, - 0xD4, 0xF1, 0x12, 0x00, 0xFA, 0xCB, 0xA9, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x01, 0x02, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, - 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, - 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, - 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3A, 0x3D, 0x3F, 0xFF, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0x0A, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0xED, 0x64, 0xED, 0xD4, 0xF1, 0x12, 0x00, - 0xFA, 0xCB, 0xA9, 0x00, 0x03, 0x00, 0x00, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x8B, 0x00, 0x00, 0xA8, 0x3A, 0x00, 0x00, 0x00, - 0x00, 0xDC, 0x00, 0xEA, 0x00, 0x20, 0xED, 0x12, - 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x00, 0xDC, 0xFD, - 0x7F, 0x20, 0xED, 0x12, 0x00, 0x05, 0x00, 0x00, - 0x00, 0xA0, 0x20, 0x15, 0x00, 0xC8, 0x00, 0x00, - 0x01, 0x43, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x44, - 0x00, 0x6F, 0x00, 0x63, 0x00, 0x75, 0x00, 0x6D, - 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x00, 0xE2, 0x3A, 0x0B, 0x07, 0xA5, - 0x03, 0x2F, 0x63, 0x97, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x01, 0x1C, 0x3A, 0x0B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x12, 0x75, 0xB3, 0x05, - 0xE2, 0xBC, 0x74, 0x68, 0xAD, 0xAC, 0x7B, 0xB1, - 0xF8, 0x52, 0xD5, 0x8F, 0xF7, 0x03, 0x00, 0x00, - 0x06, 0xA5, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x01, 0x56, 0x3A, 0x0B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x01, 0x90, 0x3A, 0x0B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0xA5, 0x00, 0x22, 0x8E, 0xA3, 0x00, 0x00, - 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4C, 0xA5, 0xC8, 0xC8, 0x41, 0x50, 0x52, 0x39, - 0x07, 0x01, 0x00, 0x5F, 0x00, 0x00, 0xFF, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x01, 0xCA, 0x3A, 0x0B, 0x01, 0x48, - 0x34, 0x33, 0x00, 0x00, 0x00, 0x00, 0x76, 0x3E, - 0x84, 0x10, 0x2E, 0x48, 0x54, 0x0D, 0x98, 0x4C, - 0x14, 0x12, 0x72, 0x7A, 0x88, 0x0F, 0x9F, 0x84, - 0x98, 0x03, 0x52, 0xA6, 0xA4, 0x0A, 0x6E, 0xA8, - 0x54, 0x0C, 0x13, 0xB6, 0xE8, 0x0A, 0x77, 0xC0, - 0x94, 0x04, 0x73, 0xC6, 0x14, 0x07, 0x80, 0xCA, - 0xA8, 0x08, 0x31, 0xD2, 0x44, 0x09, 0x1E, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x02, 0x04, 0x3A, 0x0B, 0x74, 0x09, - 0x7A, 0xE4, 0x78, 0x17, 0xA5, 0xE4, 0x24, 0x09, - 0x45, 0xE8, 0x68, 0x07, 0xBA, 0xEC, 0xE8, 0x05, - 0xC2, 0xF0, 0x58, 0x16, 0x78, 0xF6, 0x98, 0x15, - 0x7C, 0xFC, 0xB8, 0x19, 0xAD, 0xFC, 0x74, 0x09, - 0x8C, 0x02, 0x39, 0x0D, 0x36, 0x06, 0x99, 0x06, - 0x9B, 0x08, 0x09, 0x0B, 0xA1, 0x0C, 0x25, 0x19, - 0x57, 0x10, 0x29, 0x05, 0x1A, 0x1C, 0x45, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x02, 0x3E, 0x3A, 0x0B, 0x55, 0x1E, - 0x69, 0x16, 0xA4, 0x24, 0xB9, 0x09, 0x1C, 0x44, - 0x55, 0x08, 0x9C, 0x44, 0xC9, 0x0B, 0x9F, 0x4A, - 0xF9, 0x19, 0x4C, 0x4C, 0xF9, 0x13, 0x5E, 0x50, - 0x09, 0x13, 0xB7, 0x6A, 0x09, 0x0A, 0x7C, 0x7A, - 0x75, 0x0F, 0x0E, 0x7E, 0x95, 0x00, 0x81, 0xA6, - 0x99, 0x0E, 0xC0, 0xAE, 0xE5, 0x19, 0xA0, 0xCC, - 0x35, 0x0D, 0x63, 0xE2, 0x85, 0x1F, 0x8E, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x02, 0x78, 0x3A, 0x0B, 0x35, 0x1D, - 0xC1, 0xE8, 0xA9, 0x0C, 0x7A, 0x06, 0xCA, 0x0E, - 0xAD, 0x12, 0xD6, 0x1C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x02, 0xB2, 0x2A, 0x0B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x6C, 0x12, 0x00, 0x2B, 0xC5, 0xA9, 0x00, - 0x64, 0x00, 0x00, 0x00, 0xFC, 0xEC, 0x12, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xF1, 0x42, 0x42, - 0x40, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0xCE, 0x6D, 0x64, 0xED, 0x00, 0x00, 0x00, 0x00, - 0x30, 0xF2, 0x12, 0x00, 0x1A, 0xAA, 0xA7, 0x00, - 0x3A, 0x00, 0x00, 0x00, 0xF6, 0x6D, 0x64, 0xED, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0xF2, 0x12, 0x00, 0x89, 0xAE, 0xA9, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0xF1, 0x01, 0x00, - 0x1C, 0xCF, 0xA9, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x8B, 0x00, 0x00, 0xFC, 0x3A, 0x1E, 0xDC, 0x74, - 0x09, 0x7A, 0xE4, 0x78, 0x17, 0xA5, 0xE4, 0x24, - 0x09, 0x45, 0xE8, 0x68, 0x07, 0xBA, 0xEC, 0xE8, - 0x05, 0xC2, 0xF0, 0x58, 0x16, 0x78, 0xF6, 0x98, - 0x15, 0x7C, 0xFC, 0xB8, 0x19, 0xAD, 0xFC, 0x74, - 0x09, 0x8C, 0x02, 0x39, 0x0D, 0x36, 0x06, 0x99, - 0x06, 0x9B, 0x08, 0x09, 0x0B, 0xA1, 0x0C, 0x25, - 0x19, 0x57, 0x10, 0x29, 0x05, 0x1A, 0x1C, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x8B, 0x00, 0x01, 0x36, 0x2E, 0x0B, 0x06, 0xA5, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2B, 0xC5, 0xA9, 0x00, - 0x64, 0x00, 0x00, 0x00, 0xD8, 0xEE, 0x12, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xF0, 0xAC, 0x00, - 0xF0, 0xF1, 0x12, 0x00, 0x6A, 0xB1, 0xA7, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x06, 0xA5, 0x00, 0x01, - 0x00, 0x00, 0x12, 0x00, 0x14, 0xAB, 0xA7, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x0C, 0xF2, 0x12, 0x00, - 0x20, 0xAB, 0xA7, 0x00, 0x08, 0xF2, 0x12, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x99, 0xA9, 0xA7, 0x00, - 0xE8, 0x3D, 0xAC, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0xF0, 0x8F, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xED, 0x64, 0xED, - 0xD4, 0xF1, 0x12, 0x00, 0xFA, 0xCB, 0xA9, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xEA, 0x3D, 0xAC, 0x00, 0xBD, 0xCC, 0xA9, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xF7, 0x12, 0x00, - 0x88, 0xC4, 0xA9, 0x00, 0xD8, 0xF1, 0x12, 0x00, - 0x40, 0x00, 0x00, 0x00, 0xBB, 0xC4, 0xA9, 0x00, - 0x02, 0x00, 0x3F, 0x05, 0x0B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xEA, 0x6D, 0x64, 0xED, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xF2, 0x12, 0x00, - 0x89, 0xAE, 0xA9, 0x00, 0x03, 0x00, 0x00, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xF7, 0xA9, 0x00, - 0x02, 0xFA, 0x3F, 0x05, 0x0B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0xF7, 0xF3, 0x00, - 0x0C, 0xCF, 0xA9, 0x00, 0x24, 0x71, 0x12, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x1C, 0xCF, 0xA9, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x02, 0xF0, 0x8F, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x01, 0xFB, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF1, 0x12, 0x00, - 0x89, 0xAE, 0xA9, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xE8, 0x3D, 0xAC, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0C, 0xF2, 0x12, 0x00, 0x14, 0xAB, 0xA7, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x0C, 0xF2, 0x12, 0x00, - 0x20, 0xAB, 0xA7, 0x00, 0x08, 0xF2, 0x12, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0xFB, 0x0F, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x02, 0xF0, 0x8F, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xED, 0x64, 0xED, - 0xD4, 0xF1, 0x12, 0x00, 0xFA, 0xCB, 0xA9, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x01, 0x02, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, - 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, - 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, - 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3A, 0x3D, 0x3F, 0xFF, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0x07, 0xA4, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0xED, 0x64, 0xED, - 0xD4, 0xF1, 0x12, 0x00, 0xFA, 0xCB, 0xA9, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x42, 0xED, 0x64, 0xED, - 0xE4, 0xF1, 0x12, 0x00, 0xFA, 0xCB, 0xA9, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x08, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0xCF, - 0x00, 0x01, 0x00, 0x00, 0x1F, 0x01, 0x01, 0x00, - 0xEB, 0xC4, 0xA9, 0x00, 0x64, 0x00, 0x00, 0x00, - 0x24, 0x71, 0x12, 0x00, 0x40, 0x00, 0x00, 0x00, - 0xE8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x6C, 0x71, 0x12, 0x00, 0x0C, 0xCF, 0xA9, 0x00, - 0x24, 0x71, 0x12, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x1C, 0xCF, 0xA9, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x01, 0x02, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, - 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, - 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, - 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3A, 0x3D, 0x3F, 0xFF, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x01, 0x02, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, - 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, - 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, - 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3A, 0x3D, 0x3F, 0xFF, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x21, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x36, 0xED, 0x64, 0xED, - 0xB0, 0xF1, 0x12, 0x00, 0xFA, 0xCB, 0xA9, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0xF2, 0x12, 0x00, 0xBD, 0xCC, 0xA9, 0x00, - 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0xED, 0x64, 0xED, 0xFC, 0xF1, 0x12, 0x00, - 0x0A, 0x00, 0x00, 0x00, 0x06, 0xF2, 0x12, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x01, 0x02, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, - 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, - 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, - 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3A, 0x3D, 0x3F, 0xFF, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x01, 0x02, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, - 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, - 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, - 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3A, 0x3D, 0x3F, 0xFF, 0x00, - }, - .response_len = 0x40 - }, - { - .cmd = { - 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x36, 0xED, 0x64, 0xED, - 0xB0, 0xF1, 0x12, 0x00, 0xFA, 0xCB, 0xA9, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0xF2, 0x12, 0x00, 0xBD, 0xCC, 0xA9, 0x00, - 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0xED, 0x64, 0xED, 0xFC, 0xF1, 0x12, 0x00, - 0x0A, 0x00, 0x00, 0x00, 0x06, 0xF2, 0x12, 0x00, - }, - .response_len = 0x00 - }, - { - .cmd = { - 0x82, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x01, 0x02, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, - 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, - 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, - 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3A, 0x3D, 0x3F, 0xFF, 0x00, - }, - .response_len = 0x40 - }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xF3, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb8, 0x00, 0x00, 0x00, 0x98, 0xf1, 0x12, 0x00, + 0x03, 0xd4, 0xa9, 0x00, 0x64, 0x00, 0x00, 0x00, + 0x14, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x84, 0xf1, 0x12, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x90, 0xf1, 0x12, 0x00, + 0xac, 0x0d, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xf7, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x90, 0xf1, 0x12, 0x00, + 0x92, 0xc5, 0xa9, 0x00, 0x48, 0xf1, 0x12, 0x00, + 0x40, 0x00, 0x00, 0x00, 0xa2, 0xc5, 0xa9, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x02, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb8, 0x00, 0x00, 0x00, 0x98, 0xf1, 0x12, 0x00, + 0x03, 0xd4, 0xa9, 0x00, 0x64, 0x00, 0x00, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0xf7, 0xcd, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xf8, 0xa9, 0x00, + 0x28, 0xf1, 0x12, 0x00, 0x40, 0x00, 0x00, 0x00, + 0xbb, 0xc4, 0xa9, 0x00, 0x02, 0xfa, 0x3f, 0x05, + 0x05, 0x02, 0x05, 0x23, 0x27, 0xe5, 0x13, 0x10, + 0x08, 0xff, 0x04, 0x6c, 0xc1, 0x41, 0x1c, 0x4c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xf1, 0x12, 0x00, 0x89, 0xae, 0xa9, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8b, 0x00, 0x00, 0x00, 0x3a, 0x8c, 0xf1, 0x12, + 0x00, 0x64, 0xa8, 0xa7, 0x00, 0x84, 0xf1, 0x12, + 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf1, 0x12, + 0x00, 0x51, 0xa6, 0xa7, 0x00, 0xf8, 0x00, 0x00, + 0x00, 0x7e, 0xa6, 0xa7, 0x00, 0x24, 0x5a, 0xac, + 0x00, 0x01, 0xf1, 0x12, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x2f, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, + 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x7c, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, + 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0x0d, 0xff, 0x00, + 0x34, 0xf1, 0x12, 0x00, 0x40, 0x00, 0x00, 0x00, + 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf1, 0x12, 0x00, 0x57, 0xcc, 0xa9, 0x00, + 0x34, 0xf1, 0x12, 0x00, 0x40, 0x00, 0x00, 0x00, + 0xbd, 0xcc, 0xa9, 0x00, 0x3a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, + 0x34, 0xf1, 0x12, 0x00, 0x3a, 0x00, 0x00, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x0a, 0x37, 0x6a, 0x3d, + 0x73, 0x3d, 0x71, 0x0e, 0x01, 0x0e, 0x81, 0x00, + 0x40, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x12, 0x00, + 0x57, 0xcc, 0xa9, 0x00, 0x34, 0xf1, 0x12, 0x00, + 0x40, 0x00, 0x00, 0x00, 0xbd, 0xcc, 0xa9, 0x00, + 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb8, 0x00, 0x00, 0x00, 0x34, 0xf1, 0x12, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, + 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0x3d, 0x51, 0x0e, + 0x01, 0x0e, 0x81, 0x00, 0x40, 0x00, 0x00, 0x00, + 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf1, 0x12, 0x00, 0x57, 0xcc, 0xa9, 0x00, + 0x34, 0xf1, 0x12, 0x00, 0x40, 0x00, 0x00, 0x00, + 0xbd, 0xcc, 0xa9, 0x00, 0x3a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, + 0x34, 0xf1, 0x12, 0x00, 0x3a, 0x00, 0x00, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, + 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x04, 0x78, 0x3A, 0x34, 0x00, 0x00, + 0xC0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x1A, 0x80, + 0x7C, 0x04, 0xF1, 0x12, 0x00, 0x18, 0x00, 0x00, + 0x00, 0x48, 0x00, 0x00, 0x00, 0xCC, 0xEF, 0x12, + 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xB0, 0xEF, 0x12, 0x00, 0x0C, 0x00, 0x0C, + 0x00, 0x84, 0x21, 0x15, 0x00, 0x48, 0x00, 0x00, + 0x00, 0x0C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x04, 0xB2, 0x3A, 0x0B, 0x88, 0x01, + 0xB4, 0x01, 0x20, 0x91, 0x04, 0x07, 0x02, 0x24, + 0x20, 0xE2, 0x15, 0x0D, 0x10, 0x0F, 0x10, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x12, 0x13, 0x13, 0x13, + 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x16, + 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, + 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x1A, 0x1A, + 0x1A, 0x1A, 0x1A, 0x1A, 0x1B, 0x1B, 0x1B, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x04, 0xEC, 0x3A, 0x0B, 0x1C, 0x1C, + 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1D, 0x1D, 0x1D, + 0x1E, 0x1D, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, + 0x1F, 0x1F, 0x1F, 0x1F, 0x1E, 0x1F, 0x1F, 0x20, + 0x20, 0x1F, 0x20, 0x20, 0x20, 0x21, 0x20, 0x21, + 0x20, 0x21, 0x20, 0x20, 0x20, 0x21, 0x20, 0x21, + 0x20, 0x21, 0x21, 0x21, 0x21, 0x21, 0x22, 0x21, + 0x21, 0x22, 0x21, 0x22, 0x21, 0x22, 0x22, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x05, 0x26, 0x3A, 0x0B, 0x22, 0x22, + 0x22, 0x21, 0x22, 0x22, 0x22, 0x21, 0x22, 0x22, + 0x22, 0x21, 0x22, 0x21, 0x22, 0x21, 0x21, 0x21, + 0x22, 0x21, 0x21, 0x21, 0x21, 0x22, 0x22, 0x21, + 0x22, 0x22, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, + 0x21, 0x21, 0x21, 0x20, 0x20, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x1F, 0x1F, 0x1F, 0x1F, + 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x05, 0x60, 0x3A, 0x0B, 0x1F, 0x1F, + 0x1F, 0x1F, 0x1F, 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, + 0x1F, 0x1F, 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, + 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1F, + 0x1E, 0x1E, 0x1E, 0x1E, 0x1D, 0x1D, 0x1D, 0x1D, + 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1C, 0x1D, 0x1D, + 0x1D, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, + 0x1B, 0x1B, 0x1C, 0x1C, 0x1B, 0x1B, 0x1B, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x05, 0x9A, 0x3A, 0x0B, 0x1B, 0x1B, + 0x1B, 0x1A, 0x1B, 0x1B, 0x1A, 0x1A, 0x1A, 0x1B, + 0x1B, 0x1B, 0x1B, 0x1A, 0x19, 0x1A, 0x1A, 0x1A, + 0x1A, 0x19, 0x1A, 0x1A, 0x1A, 0x19, 0x19, 0x19, + 0x19, 0x19, 0x19, 0x18, 0x19, 0x18, 0x18, 0x19, + 0x18, 0x17, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x16, 0x17, 0x16, 0x16, 0x15, + 0x15, 0x16, 0x15, 0x16, 0x15, 0x15, 0x14, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x05, 0xD4, 0x2C, 0x0B, 0x14, 0x15, + 0x14, 0x14, 0x14, 0x13, 0x13, 0x13, 0x12, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x6E, 0x12, 0x00, 0x2B, 0xC5, 0xA9, 0x00, + 0x64, 0x00, 0x00, 0x00, 0x7C, 0xEF, 0x12, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x01, 0x68, 0x0A, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xD0, 0xFD, 0x7F, 0xDC, 0x6D, 0x12, 0x00, + 0x2A, 0x26, 0x80, 0x7C, 0x98, 0x6D, 0x12, 0x00, + 0x00, 0x26, 0x80, 0x7C, 0xB8, 0x00, 0x00, 0x00, + 0x0C, 0x80, 0x01, 0x10, 0x90, 0x3E, 0x94, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x03, 0xB4, 0x3A, 0x1F, 0x1F, 0x1F, + 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, + 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1E, 0x1E, 0x1E, + 0x1E, 0x1F, 0x1F, 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, + 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, + 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, 0x1D, 0x1D, 0x1D, + 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1C, 0x1D, + 0x1D, 0x1D, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x03, 0xEE, 0x06, 0x0B, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xB7, 0xA9, 0x00, + 0xB8, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00, + 0x18, 0x70, 0x12, 0x00, 0x2B, 0xC5, 0xA9, 0x00, + 0x64, 0x00, 0x00, 0x00, 0xD4, 0xF0, 0x12, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x07, 0x00, 0x20, 0x00, 0x3a, 0x32, 0x2b, 0x07, + 0x2e, 0x29, 0x07, 0x2b, 0x27, 0x07, 0x27, 0x25, + 0x07, 0x23, 0x23, 0x07, 0x20, 0x21, 0x07, 0x1c, + 0x1d, 0x07, 0x19, 0x1a, 0x07, 0x15, 0x17, 0x07, + 0x12, 0x15, 0x07, 0x0e, 0x14, 0x07, 0x12, 0x17, + 0x07, 0x15, 0x19, 0x07, 0x19, 0x1c, 0x07, 0x1c, + 0x1f, 0x07, 0x20, 0x23, 0x07, 0x23, 0x25, 0x07, + 0x27, 0x27, 0x07, 0x2b, 0x29, 0x07, 0x2e, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x07, 0x00, 0x20, 0x3a, 0x26, 0x2b, 0x07, 0x32, + 0x2d, 0x07, 0x32, 0x2f, 0x07, 0x2e, 0x2d, 0x07, + 0x2b, 0x2b, 0x07, 0x27, 0x29, 0x07, 0x23, 0x27, + 0x07, 0x20, 0x25, 0x07, 0x1c, 0x22, 0x07, 0x19, + 0x1e, 0x07, 0x15, 0x1b, 0x07, 0x12, 0x19, 0x07, + 0x0e, 0x16, 0x07, 0x07, 0x19, 0x1c, 0x07, 0x1c, + 0x1f, 0x07, 0x20, 0x23, 0x07, 0x23, 0x25, 0x07, + 0x27, 0x27, 0x07, 0x2b, 0x29, 0x07, 0x2e, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x06, 0x0e, 0x81, 0x0e, + 0x81, 0x09, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x26, 0x00, 0x00, 0x00, 0x07, 0x00, 0x20, 0x3a, + 0x26, 0x2b, 0x07, 0x32, 0x2d, 0x07, 0x32, 0x2f, + 0x07, 0x2e, 0x2d, 0x07, 0x2b, 0x2b, 0x07, 0x27, + 0x29, 0x07, 0x23, 0x27, 0x07, 0x20, 0x25, 0x07, + 0x1c, 0x22, 0x07, 0x19, 0x1e, 0x07, 0x15, 0x1b, + 0x07, 0x12, 0x19, 0x07, 0x0e, 0x16, 0x07, 0x07, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x01, 0x02, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, + 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0xff, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0x0e, 0x85, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x20, 0x3a, 0x26, 0x2b, 0x07, 0x32, + 0x2d, 0x07, 0x32, 0x2f, 0x07, 0x2e, 0x2d, 0x07, + 0x2b, 0x2b, 0x07, 0x29, 0x07, 0x23, 0x27, 0x07, + 0x20, 0x25, 0x07, 0x1c, 0x22, 0x07, 0x19, 0x1e, + 0x07, 0x15, 0x1b, 0x07, 0x12, 0x19, 0x07, 0x1f, + 0x0e, 0x16, 0x07, 0x07, 0x19, 0x1c, 0x07, 0x1c, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0x0d, 0x62, 0x62, + 0x51, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x3a, 0x41, 0x0e, 0x2b, 0x00, 0x00, 0x00, 0x00, + 0x78, 0xf1, 0x12, 0x00, 0x1a, 0xaa, 0xa7, 0x1f, + 0x00, 0x3a, 0x09, 0x00, 0x00, 0x00, 0x12, 0x41, + 0x0e, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0xf1, 0x12, 0x00, 0x89, 0xae, + 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0x20, 0x6C, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x20, 0x3A, 0x26, 0x2B, 0x07, 0x32, + 0x2D, 0x07, 0x32, 0x2F, 0x07, 0x2E, 0x2D, 0x07, + 0x2B, 0x2B, 0x07, 0x27, 0x29, 0x07, 0x23, 0x27, + 0x07, 0x20, 0x25, 0x07, 0x1C, 0x22, 0x07, 0x19, + 0x1E, 0x07, 0x15, 0x1B, 0x07, 0x12, 0x19, 0x07, + 0x0E, 0x16, 0x07, 0x07, 0x19, 0x1C, 0x07, 0x1C, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xF9, 0x6C, 0x6C, + 0x6C, 0x6C, 0x40, 0x40, 0x2E, 0x6D, 0x64, 0xED, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4C, 0xF1, 0x12, 0x00, 0x89, 0xAE, 0xA9, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE8, 0x3D, 0xAC, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x68, 0xF1, 0x12, 0x00, + 0x14, 0xAB, 0xA7, 0x00, 0x03, 0x00, 0x00, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0xF9, 0x00, 0x00, + 0x26, 0x00, 0x00, 0x00, 0x07, 0x00, 0x20, 0x3A, + 0x26, 0x2B, 0x07, 0x32, 0x2D, 0x07, 0x32, 0x2F, + 0x07, 0x2E, 0x2D, 0x07, 0x2B, 0x2B, 0x07, 0x27, + 0x29, 0x07, 0x23, 0x27, 0x07, 0x20, 0x25, 0x07, + 0x1C, 0x22, 0x07, 0x19, 0x1E, 0x07, 0x15, 0x1B, + 0x07, 0x12, 0x19, 0x07, 0x0E, 0x16, 0x07, 0x07, + 0x19, 0x1C, 0x07, 0x1C, 0xBA, 0xEC, 0x64, 0xED, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x16, 0x1C, 0x13, 0x1B, + 0x0B, 0x1A, 0x0A, 0x30, 0x08, 0x09, 0x6D, 0x08, + 0xA7, 0x00, 0x9E, 0x00, 0x1E, 0x0C, 0x08, 0x1D, + 0x04, 0x23, 0x42, 0x2F, 0x07, 0x2E, 0x2D, 0x07, + 0x2B, 0x2B, 0x07, 0x27, 0x29, 0x07, 0x23, 0x27, + 0x07, 0x20, 0x25, 0x07, 0x1C, 0x22, 0x07, 0x19, + 0x1E, 0x07, 0x15, 0x1B, 0x07, 0x12, 0x19, 0x07, + 0x0E, 0x16, 0x07, 0x07, 0x19, 0x1C, 0x07, 0x1C, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x01, 0x02, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, + 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, + 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, + 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3A, 0x3D, 0x3F, 0xFF, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0x0D, 0xFF, 0x30, + 0x08, 0x09, 0x6D, 0x08, 0xA7, 0x00, 0x9E, 0x00, + 0x1E, 0x0C, 0x08, 0x1D, 0x04, 0x23, 0x42, 0x2F, + 0x07, 0x2E, 0x2D, 0x07, 0x2B, 0x2B, 0x07, 0x27, + 0x29, 0x07, 0x23, 0x27, 0x07, 0x20, 0x25, 0x07, + 0x1C, 0x22, 0x07, 0x19, 0x1E, 0x07, 0x15, 0x1B, + 0x07, 0x12, 0x19, 0x07, 0x0E, 0x16, 0x07, 0x07, + 0x19, 0x1C, 0x07, 0x1C, 0xBA, 0xEC, 0x64, 0xED, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xF7, 0x64, 0xED, + 0x00, 0x00, 0x00, 0x00, 0x7C, 0xF1, 0x12, 0x00, + 0x1A, 0xAA, 0xA7, 0x00, 0x3A, 0x00, 0x00, 0x00, + 0x2A, 0x6D, 0x64, 0xED, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x50, 0xF1, 0x12, 0x00, + 0x89, 0xAE, 0xA9, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xE8, 0x3D, 0xAC, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xF7, 0xA9, 0x00, + 0x02, 0xFA, 0x3F, 0x05, 0x05, 0xC2, 0x85, 0xA6, + 0xA7, 0x6D, 0x10, 0x10, 0x08, 0xFF, 0x85, 0x6C, + 0x00, 0x00, 0xCF, 0x00, 0x01, 0x00, 0x00, 0x1F, + 0x01, 0x01, 0x0A, 0x0B, 0x13, 0x04, 0x6C, 0x6C, + 0x6C, 0x6C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x6C, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x42, 0x42, 0x42, 0x42, 0x42, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0xF7, 0xF3, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x02, 0x0D, 0xFF, 0x30, + 0x08, 0x09, 0x6D, 0x08, 0xA7, 0x00, 0x9E, 0x00, + 0x1E, 0x0C, 0x08, 0x1D, 0x04, 0x23, 0x42, 0x2F, + 0x07, 0x2E, 0x2D, 0x07, 0x2B, 0x2B, 0x07, 0x27, + 0x29, 0x07, 0x23, 0x27, 0x07, 0x20, 0x25, 0x07, + 0x1C, 0x22, 0x07, 0x19, 0x1E, 0x07, 0x15, 0x1B, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xE8, 0x3D, 0xAC, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5C, 0xF1, 0x12, 0x00, 0x14, 0xAB, 0xA7, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x5C, 0xF1, 0x12, 0x00, + 0x20, 0xAB, 0xA7, 0x00, 0x58, 0xF1, 0x12, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x99, 0xA9, 0xA7, 0x00, + 0xE8, 0x3D, 0xAC, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0xF0, 0x8F, 0x2F, + 0x07, 0x2E, 0x2D, 0x07, 0x2B, 0x2B, 0x07, 0x27, + 0x29, 0x07, 0x23, 0x27, 0x07, 0x20, 0x25, 0x07, + 0x1C, 0x22, 0x07, 0x19, 0x1E, 0x07, 0x15, 0x1B, + 0x07, 0x12, 0x19, 0x07, 0x82, 0xEC, 0x64, 0xED, + 0x24, 0xF1, 0x12, 0x00, 0xFA, 0xCB, 0xA9, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xEA, 0x3D, 0xAC, 0x00, 0xBD, 0xCC, 0xA9, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x08, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0xCF, + 0x00, 0x01, 0x00, 0x00, 0x1F, 0x01, 0x01, 0x00, + 0x0C, 0xCF, 0xA9, 0x00, 0x74, 0x70, 0x12, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x1C, 0xCF, 0xA9, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x02, 0xF0, 0x8F, 0x2F, + 0x07, 0x2E, 0x2D, 0x07, 0x2B, 0x2B, 0x07, 0x27, + 0x29, 0x07, 0x23, 0x27, 0x07, 0x20, 0x25, 0x07, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x06, 0x0E, 0x85, 0x09, + 0xED, 0x09, 0x6D, 0x2F, 0x07, 0x2E, 0x2D, 0x07, + 0x2B, 0x2B, 0x07, 0x27, 0x29, 0x07, 0x23, 0x27, + 0x07, 0x20, 0x25, 0x07, 0x1C, 0x22, 0x07, 0x19, + 0x8A, 0xEC, 0x64, 0xED, 0x1C, 0xF1, 0x12, 0x00, + 0xFA, 0xCB, 0xA9, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x72, 0xF1, 0x12, 0x00, + 0xBD, 0xCC, 0xA9, 0x00, 0x0A, 0x00, 0x00, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x01, 0x02, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, + 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, + 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, + 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3A, 0x3D, 0x3F, 0xFF, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0x09, 0xED, 0x2F, + 0x07, 0x2E, 0x2D, 0x07, 0x2B, 0x2B, 0x07, 0x27, + 0x29, 0x07, 0x23, 0x27, 0x07, 0x20, 0x25, 0x07, + 0x1C, 0x22, 0x07, 0x19, 0x8A, 0xEC, 0x64, 0xED, + 0x1C, 0xF1, 0x12, 0x00, 0xFA, 0xCB, 0xA9, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x72, 0xF1, 0x12, 0x00, 0xBD, 0xCC, 0xA9, 0x00, + 0x0A, 0x00, 0x00, 0x00, 0xBD, 0xCC, 0xA9, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xF3, 0x00, 0x00, + 0x8C, 0xF1, 0x12, 0x00, 0x1A, 0xAA, 0xA7, 0x00, + 0x3A, 0x00, 0x00, 0x00, 0x5A, 0x6D, 0x64, 0xED, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xF1, 0x12, 0x00, 0x89, 0xAE, 0xA9, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE8, 0x3D, 0xAC, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7C, 0xF1, 0x12, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x84, 0x00, 0x00, 0x00, 0x32, 0x02, 0xE0, 0xAD, + 0x00, 0xFC, 0xDF, 0xAD, 0x00, 0xDB, 0xDF, 0xAD, + 0x00, 0xBA, 0xDF, 0xAD, 0x00, 0x99, 0xDF, 0x6F, + 0x44, 0xC2, 0xE8, 0x20, 0x65, 0x73, 0x83, 0xAC, + 0xD7, 0x88, 0x6D, 0x59, 0x61, 0xE0, 0x3B, 0x3D, + 0xB7, 0xF4, 0xDE, 0xAD, 0x00, 0xD3, 0xDE, 0xAD, + 0x00, 0xB2, 0xDE, 0xAD, 0x00, 0x91, 0xDE, 0x00, + 0xA6, 0xEC, 0x64, 0xED, 0xA2, 0xEC, 0x64, 0xED, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x06, 0x1A, 0x0A, 0x1B, + 0x0B, 0x1C, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x92, 0xD5, 0x90, 0x7C, 0xBB, 0x9B, 0x80, 0x7C, + 0xB8, 0x00, 0x00, 0x00, 0xAC, 0x70, 0x12, 0x00, + 0x85, 0xB7, 0xA9, 0x00, 0xB8, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x08, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0xCF, + 0x00, 0x01, 0x00, 0x00, 0x1F, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00, + 0x4C, 0x70, 0x12, 0x00, 0xEB, 0xC4, 0xA9, 0x00, + 0x64, 0x00, 0x00, 0x00, 0x68, 0x70, 0x12, 0x00, + 0x40, 0x00, 0x00, 0x00, 0xE8, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xB0, 0x70, 0x12, 0x00, + 0x0C, 0xCF, 0xA9, 0x00, 0x68, 0x70, 0x12, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0x0D, 0x00, 0x00, + 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1F, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, + 0xD0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xA6, 0xB5, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x94, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x28, 0x6F, 0x44, 0xC2, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x04, 0x78, 0x3A, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xD0, 0xFD, 0x7F, 0x94, 0xF0, 0x12, + 0x00, 0x2A, 0x26, 0x80, 0x7C, 0x50, 0xF0, 0x12, + 0x00, 0x00, 0x26, 0x80, 0x7C, 0x08, 0x00, 0x00, + 0x00, 0x0C, 0x80, 0x01, 0x10, 0x90, 0x3E, 0x94, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x69, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x04, 0xB2, 0x3A, 0x0B, 0x88, 0x01, + 0xB4, 0x01, 0x20, 0x91, 0x04, 0x07, 0x02, 0x24, + 0x20, 0xE2, 0x15, 0x0D, 0x10, 0x0F, 0x10, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x12, 0x13, 0x13, 0x13, + 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x16, + 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, + 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x1A, 0x1A, + 0x1A, 0x1A, 0x1A, 0x1A, 0x1B, 0x1B, 0x1B, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x04, 0xEC, 0x3A, 0x0B, 0x1C, 0x1C, + 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1D, 0x1D, 0x1D, + 0x1E, 0x1D, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, + 0x1F, 0x1F, 0x1F, 0x1F, 0x1E, 0x1F, 0x1F, 0x20, + 0x20, 0x1F, 0x20, 0x20, 0x20, 0x21, 0x20, 0x21, + 0x20, 0x21, 0x20, 0x20, 0x20, 0x21, 0x20, 0x21, + 0x20, 0x21, 0x21, 0x21, 0x21, 0x21, 0x22, 0x21, + 0x21, 0x22, 0x21, 0x22, 0x21, 0x22, 0x22, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x05, 0x26, 0x3A, 0x0B, 0x22, 0x22, + 0x22, 0x21, 0x22, 0x22, 0x22, 0x21, 0x22, 0x22, + 0x22, 0x21, 0x22, 0x21, 0x22, 0x21, 0x21, 0x21, + 0x22, 0x21, 0x21, 0x21, 0x21, 0x22, 0x22, 0x21, + 0x22, 0x22, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, + 0x21, 0x21, 0x21, 0x20, 0x20, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x1F, 0x1F, 0x1F, 0x1F, + 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x05, 0x60, 0x3A, 0x0B, 0x1F, 0x1F, + 0x1F, 0x1F, 0x1F, 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, + 0x1F, 0x1F, 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, + 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1F, + 0x1E, 0x1E, 0x1E, 0x1E, 0x1D, 0x1D, 0x1D, 0x1D, + 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1C, 0x1D, 0x1D, + 0x1D, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, + 0x1B, 0x1B, 0x1C, 0x1C, 0x1B, 0x1B, 0x1B, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x05, 0x9A, 0x3A, 0x0B, 0x1B, 0x1B, + 0x1B, 0x1A, 0x1B, 0x1B, 0x1A, 0x1A, 0x1A, 0x1B, + 0x1B, 0x1B, 0x1B, 0x1A, 0x19, 0x1A, 0x1A, 0x1A, + 0x1A, 0x19, 0x1A, 0x1A, 0x1A, 0x19, 0x19, 0x19, + 0x19, 0x19, 0x19, 0x18, 0x19, 0x18, 0x18, 0x19, + 0x18, 0x17, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x16, 0x17, 0x16, 0x16, 0x15, + 0x15, 0x16, 0x15, 0x16, 0x15, 0x15, 0x14, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x05, 0xD4, 0x2C, 0x0B, 0x14, 0x15, + 0x14, 0x14, 0x14, 0x13, 0x13, 0x13, 0x12, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x6F, 0x12, 0x00, 0x2B, 0xC5, 0xA9, 0x00, + 0x64, 0x00, 0x00, 0x00, 0x2C, 0xF0, 0x12, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xF7, 0x1C, 0x1C, + 0x1B, 0x1B, 0x1C, 0x1C, 0x1B, 0x1B, 0x1B, 0x1B, + 0x1B, 0x1B, 0x1B, 0x1A, 0x1B, 0x1B, 0x1A, 0x1A, + 0x1A, 0x1B, 0x1B, 0x1B, 0x1B, 0x1A, 0x19, 0x1A, + 0x1A, 0x1A, 0x1A, 0x19, 0x1A, 0x1A, 0x1A, 0x19, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x18, 0x19, 0x18, + 0x18, 0x19, 0x18, 0x17, 0x18, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x16, 0x17, 0x16, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0xF7, 0xF3, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x04, 0x3D, 0x40, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x52, 0xED, 0x64, 0xED, + 0xD4, 0xF1, 0x12, 0x00, 0xFA, 0xCB, 0xA9, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x01, 0x02, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, + 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, + 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, + 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3A, 0x3D, 0x3F, 0xFF, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0x0A, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x52, 0xED, 0x64, 0xED, 0xD4, 0xF1, 0x12, 0x00, + 0xFA, 0xCB, 0xA9, 0x00, 0x03, 0x00, 0x00, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x8B, 0x00, 0x00, 0xA8, 0x3A, 0x00, 0x00, 0x00, + 0x00, 0xDC, 0x00, 0xEA, 0x00, 0x20, 0xED, 0x12, + 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x00, 0xDC, 0xFD, + 0x7F, 0x20, 0xED, 0x12, 0x00, 0x05, 0x00, 0x00, + 0x00, 0xA0, 0x20, 0x15, 0x00, 0xC8, 0x00, 0x00, + 0x01, 0x43, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x44, + 0x00, 0x6F, 0x00, 0x63, 0x00, 0x75, 0x00, 0x6D, + 0x00, 0x65, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x00, 0xE2, 0x3A, 0x0B, 0x07, 0xA5, + 0x03, 0x2F, 0x63, 0x97, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x01, 0x1C, 0x3A, 0x0B, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x12, 0x75, 0xB3, 0x05, + 0xE2, 0xBC, 0x74, 0x68, 0xAD, 0xAC, 0x7B, 0xB1, + 0xF8, 0x52, 0xD5, 0x8F, 0xF7, 0x03, 0x00, 0x00, + 0x06, 0xA5, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x01, 0x56, 0x3A, 0x0B, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x01, 0x90, 0x3A, 0x0B, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0xA5, 0x00, 0x22, 0x8E, 0xA3, 0x00, 0x00, + 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4C, 0xA5, 0xC8, 0xC8, 0x41, 0x50, 0x52, 0x39, + 0x07, 0x01, 0x00, 0x5F, 0x00, 0x00, 0xFF, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x01, 0xCA, 0x3A, 0x0B, 0x01, 0x48, + 0x34, 0x33, 0x00, 0x00, 0x00, 0x00, 0x76, 0x3E, + 0x84, 0x10, 0x2E, 0x48, 0x54, 0x0D, 0x98, 0x4C, + 0x14, 0x12, 0x72, 0x7A, 0x88, 0x0F, 0x9F, 0x84, + 0x98, 0x03, 0x52, 0xA6, 0xA4, 0x0A, 0x6E, 0xA8, + 0x54, 0x0C, 0x13, 0xB6, 0xE8, 0x0A, 0x77, 0xC0, + 0x94, 0x04, 0x73, 0xC6, 0x14, 0x07, 0x80, 0xCA, + 0xA8, 0x08, 0x31, 0xD2, 0x44, 0x09, 0x1E, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x02, 0x04, 0x3A, 0x0B, 0x74, 0x09, + 0x7A, 0xE4, 0x78, 0x17, 0xA5, 0xE4, 0x24, 0x09, + 0x45, 0xE8, 0x68, 0x07, 0xBA, 0xEC, 0xE8, 0x05, + 0xC2, 0xF0, 0x58, 0x16, 0x78, 0xF6, 0x98, 0x15, + 0x7C, 0xFC, 0xB8, 0x19, 0xAD, 0xFC, 0x74, 0x09, + 0x8C, 0x02, 0x39, 0x0D, 0x36, 0x06, 0x99, 0x06, + 0x9B, 0x08, 0x09, 0x0B, 0xA1, 0x0C, 0x25, 0x19, + 0x57, 0x10, 0x29, 0x05, 0x1A, 0x1C, 0x45, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x02, 0x3E, 0x3A, 0x0B, 0x55, 0x1E, + 0x69, 0x16, 0xA4, 0x24, 0xB9, 0x09, 0x1C, 0x44, + 0x55, 0x08, 0x9C, 0x44, 0xC9, 0x0B, 0x9F, 0x4A, + 0xF9, 0x19, 0x4C, 0x4C, 0xF9, 0x13, 0x5E, 0x50, + 0x09, 0x13, 0xB7, 0x6A, 0x09, 0x0A, 0x7C, 0x7A, + 0x75, 0x0F, 0x0E, 0x7E, 0x95, 0x00, 0x81, 0xA6, + 0x99, 0x0E, 0xC0, 0xAE, 0xE5, 0x19, 0xA0, 0xCC, + 0x35, 0x0D, 0x63, 0xE2, 0x85, 0x1F, 0x8E, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x02, 0x78, 0x3A, 0x0B, 0x35, 0x1D, + 0xC1, 0xE8, 0xA9, 0x0C, 0x7A, 0x06, 0xCA, 0x0E, + 0xAD, 0x12, 0xD6, 0x1C, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x02, 0xB2, 0x2A, 0x0B, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x6C, 0x12, 0x00, 0x2B, 0xC5, 0xA9, 0x00, + 0x64, 0x00, 0x00, 0x00, 0xFC, 0xEC, 0x12, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xF1, 0x42, 0x42, + 0x40, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0xCE, 0x6D, 0x64, 0xED, 0x00, 0x00, 0x00, 0x00, + 0x30, 0xF2, 0x12, 0x00, 0x1A, 0xAA, 0xA7, 0x00, + 0x3A, 0x00, 0x00, 0x00, 0xF6, 0x6D, 0x64, 0xED, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0xF2, 0x12, 0x00, 0x89, 0xAE, 0xA9, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0xF1, 0x01, 0x00, + 0x1C, 0xCF, 0xA9, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x02, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x8B, 0x00, 0x00, 0xFC, 0x3A, 0x1E, 0xDC, 0x74, + 0x09, 0x7A, 0xE4, 0x78, 0x17, 0xA5, 0xE4, 0x24, + 0x09, 0x45, 0xE8, 0x68, 0x07, 0xBA, 0xEC, 0xE8, + 0x05, 0xC2, 0xF0, 0x58, 0x16, 0x78, 0xF6, 0x98, + 0x15, 0x7C, 0xFC, 0xB8, 0x19, 0xAD, 0xFC, 0x74, + 0x09, 0x8C, 0x02, 0x39, 0x0D, 0x36, 0x06, 0x99, + 0x06, 0x9B, 0x08, 0x09, 0x0B, 0xA1, 0x0C, 0x25, + 0x19, 0x57, 0x10, 0x29, 0x05, 0x1A, 0x1C, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x8B, 0x00, 0x01, 0x36, 0x2E, 0x0B, 0x06, 0xA5, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2B, 0xC5, 0xA9, 0x00, + 0x64, 0x00, 0x00, 0x00, 0xD8, 0xEE, 0x12, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xF0, 0xAC, 0x00, + 0xF0, 0xF1, 0x12, 0x00, 0x6A, 0xB1, 0xA7, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0xA5, 0x00, 0x01, + 0x00, 0x00, 0x12, 0x00, 0x14, 0xAB, 0xA7, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x0C, 0xF2, 0x12, 0x00, + 0x20, 0xAB, 0xA7, 0x00, 0x08, 0xF2, 0x12, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x99, 0xA9, 0xA7, 0x00, + 0xE8, 0x3D, 0xAC, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0xF0, 0x8F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x52, 0xED, 0x64, 0xED, + 0xD4, 0xF1, 0x12, 0x00, 0xFA, 0xCB, 0xA9, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xEA, 0x3D, 0xAC, 0x00, 0xBD, 0xCC, 0xA9, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xF7, 0x12, 0x00, + 0x88, 0xC4, 0xA9, 0x00, 0xD8, 0xF1, 0x12, 0x00, + 0x40, 0x00, 0x00, 0x00, 0xBB, 0xC4, 0xA9, 0x00, + 0x02, 0x00, 0x3F, 0x05, 0x0B, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xEA, 0x6D, 0x64, 0xED, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xF2, 0x12, 0x00, + 0x89, 0xAE, 0xA9, 0x00, 0x03, 0x00, 0x00, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xF7, 0xA9, 0x00, + 0x02, 0xFA, 0x3F, 0x05, 0x0B, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0xF7, 0xF3, 0x00, + 0x0C, 0xCF, 0xA9, 0x00, 0x24, 0x71, 0x12, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x1C, 0xCF, 0xA9, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x02, 0xF0, 0x8F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x01, 0xFB, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF1, 0x12, 0x00, + 0x89, 0xAE, 0xA9, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xE8, 0x3D, 0xAC, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0C, 0xF2, 0x12, 0x00, 0x14, 0xAB, 0xA7, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x0C, 0xF2, 0x12, 0x00, + 0x20, 0xAB, 0xA7, 0x00, 0x08, 0xF2, 0x12, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0xFB, 0x0F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x02, 0xF0, 0x8F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x52, 0xED, 0x64, 0xED, + 0xD4, 0xF1, 0x12, 0x00, 0xFA, 0xCB, 0xA9, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x01, 0x02, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, + 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, + 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, + 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3A, 0x3D, 0x3F, 0xFF, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0x07, 0xA4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x52, 0xED, 0x64, 0xED, + 0xD4, 0xF1, 0x12, 0x00, 0xFA, 0xCB, 0xA9, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x42, 0xED, 0x64, 0xED, + 0xE4, 0xF1, 0x12, 0x00, 0xFA, 0xCB, 0xA9, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x08, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0xCF, + 0x00, 0x01, 0x00, 0x00, 0x1F, 0x01, 0x01, 0x00, + 0xEB, 0xC4, 0xA9, 0x00, 0x64, 0x00, 0x00, 0x00, + 0x24, 0x71, 0x12, 0x00, 0x40, 0x00, 0x00, 0x00, + 0xE8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6C, 0x71, 0x12, 0x00, 0x0C, 0xCF, 0xA9, 0x00, + 0x24, 0x71, 0x12, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x1C, 0xCF, 0xA9, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x01, 0x02, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, + 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, + 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, + 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3A, 0x3D, 0x3F, 0xFF, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x01, 0x02, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, + 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, + 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, + 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3A, 0x3D, 0x3F, 0xFF, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x21, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x36, 0xED, 0x64, 0xED, + 0xB0, 0xF1, 0x12, 0x00, 0xFA, 0xCB, 0xA9, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0xF2, 0x12, 0x00, 0xBD, 0xCC, 0xA9, 0x00, + 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x52, 0xED, 0x64, 0xED, 0xFC, 0xF1, 0x12, 0x00, + 0x0A, 0x00, 0x00, 0x00, 0x06, 0xF2, 0x12, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x01, 0x02, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, + 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, + 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, + 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3A, 0x3D, 0x3F, 0xFF, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x01, 0x02, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, + 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, + 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, + 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3A, 0x3D, 0x3F, 0xFF, 0x00, + }, + .response_len = 0x40 + }, + { + .cmd = { + 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x36, 0xED, 0x64, 0xED, + 0xB0, 0xF1, 0x12, 0x00, 0xFA, 0xCB, 0xA9, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0xF2, 0x12, 0x00, 0xBD, 0xCC, 0xA9, 0x00, + 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x52, 0xED, 0x64, 0xED, 0xFC, 0xF1, 0x12, 0x00, + 0x0A, 0x00, 0x00, 0x00, 0x06, 0xF2, 0x12, 0x00, + }, + .response_len = 0x00 + }, + { + .cmd = { + 0x82, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x01, 0x02, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, + 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, + 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, + 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3A, 0x3D, 0x3F, 0xFF, 0x00, + }, + .response_len = 0x40 + }, }; static const unsigned char scan_cmd[0x40] = { - 0x0e, 0x00, 0x03, 0xa8, 0x00, 0xb6, 0xbb, 0xbb, - 0xb8, 0xb7, 0xb8, 0xb5, 0xb8, 0xb9, 0xb8, 0xb9, - 0xbb, 0xbb, 0xbe, 0xbb, 0x4e, 0x16, 0xf4, 0x77, - 0xa8, 0x07, 0x32, 0x00, 0x6a, 0x16, 0xf4, 0x77, - 0x78, 0x24, 0x61, 0x00, 0xc8, 0x00, 0xec, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x3c, 0xf3, 0x2f, 0x01, - 0x05, 0x90, 0xf6, 0x77, 0x84, 0xf5, 0x2f, 0x01, - 0x05, 0x90, 0xf6, 0x00, 0xc8, 0x00, 0xec, 0x00 + 0x0e, 0x00, 0x03, 0xa8, 0x00, 0xb6, 0xbb, 0xbb, + 0xb8, 0xb7, 0xb8, 0xb5, 0xb8, 0xb9, 0xb8, 0xb9, + 0xbb, 0xbb, 0xbe, 0xbb, 0x4e, 0x16, 0xf4, 0x77, + 0xa8, 0x07, 0x32, 0x00, 0x6a, 0x16, 0xf4, 0x77, + 0x78, 0x24, 0x61, 0x00, 0xc8, 0x00, 0xec, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x3c, 0xf3, 0x2f, 0x01, + 0x05, 0x90, 0xf6, 0x77, 0x84, 0xf5, 0x2f, 0x01, + 0x05, 0x90, 0xf6, 0x00, 0xc8, 0x00, 0xec, 0x00 }; #endif diff --git a/libfprint/drivers/upektc_img.c b/libfprint/drivers/upektc_img.c index 33f7684..d3cc636 100644 --- a/libfprint/drivers/upektc_img.c +++ b/libfprint/drivers/upektc_img.c @@ -23,626 +23,687 @@ #include "upek_proto.h" #include "upektc_img.h" -static void start_capture(FpImageDevice *dev); -static void start_deactivation(FpImageDevice *dev); +static void start_capture (FpImageDevice *dev); +static void start_deactivation (FpImageDevice *dev); -#define EP_IN (1 | FPI_USB_ENDPOINT_IN) -#define EP_OUT (2 | FPI_USB_ENDPOINT_OUT) -#define CTRL_TIMEOUT 4000 -#define BULK_TIMEOUT 4000 +#define EP_IN (1 | FPI_USB_ENDPOINT_IN) +#define EP_OUT (2 | FPI_USB_ENDPOINT_OUT) +#define CTRL_TIMEOUT 4000 +#define BULK_TIMEOUT 4000 -#define IMAGE_WIDTH 144 -#define IMAGE_HEIGHT 384 -#define IMAGE_SIZE (IMAGE_WIDTH * IMAGE_HEIGHT) +#define IMAGE_WIDTH 144 +#define IMAGE_HEIGHT 384 +#define IMAGE_SIZE (IMAGE_WIDTH * IMAGE_HEIGHT) -#define MAX_CMD_SIZE 64 -#define MAX_RESPONSE_SIZE 2052 -#define SHORT_RESPONSE_SIZE 64 +#define MAX_CMD_SIZE 64 +#define MAX_RESPONSE_SIZE 2052 +#define SHORT_RESPONSE_SIZE 64 -struct _FpiDeviceUpektcImg { - FpImageDevice parent; +struct _FpiDeviceUpektcImg +{ + FpImageDevice parent; - unsigned char cmd[MAX_CMD_SIZE]; - unsigned char response[MAX_RESPONSE_SIZE]; - unsigned char *image_bits; - unsigned char seq; - size_t image_size; - size_t response_rest; - gboolean deactivating; + unsigned char cmd[MAX_CMD_SIZE]; + unsigned char response[MAX_RESPONSE_SIZE]; + unsigned char *image_bits; + unsigned char seq; + size_t image_size; + size_t response_rest; + gboolean deactivating; }; -G_DECLARE_FINAL_TYPE(FpiDeviceUpektcImg, fpi_device_upektc_img, FPI, - DEVICE_UPEKTC_IMG, FpImageDevice); -G_DEFINE_TYPE(FpiDeviceUpektcImg, fpi_device_upektc_img, FP_TYPE_IMAGE_DEVICE); +G_DECLARE_FINAL_TYPE (FpiDeviceUpektcImg, fpi_device_upektc_img, FPI, + DEVICE_UPEKTC_IMG, FpImageDevice); +G_DEFINE_TYPE (FpiDeviceUpektcImg, fpi_device_upektc_img, FP_TYPE_IMAGE_DEVICE); /****** HELPERS ******/ -static void upektc_img_cmd_fix_seq(unsigned char *cmd_buf, unsigned char seq) +static void +upektc_img_cmd_fix_seq (unsigned char *cmd_buf, unsigned char seq) { - uint8_t byte; + uint8_t byte; - byte = cmd_buf[5]; - byte &= 0x0f; - byte |= (seq << 4); - cmd_buf[5] = byte; -} - -static void upektc_img_cmd_update_crc(unsigned char *cmd_buf, size_t size) -{ - /* CRC does not cover Ciao prefix (4 bytes) and CRC location (2 bytes) */ - uint16_t crc = udf_crc(cmd_buf + 4, size - 6); - - cmd_buf[size - 2] = (crc & 0x00ff); - cmd_buf[size - 1] = (crc & 0xff00) >> 8; + byte = cmd_buf[5]; + byte &= 0x0f; + byte |= (seq << 4); + cmd_buf[5] = byte; } static void -upektc_img_submit_req(FpiSsm *ssm, - FpImageDevice *dev, - const unsigned char *buf, - size_t buf_size, - unsigned char seq, - FpiUsbTransferCallback cb) +upektc_img_cmd_update_crc (unsigned char *cmd_buf, size_t size) { - FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG(dev); - FpiUsbTransfer *transfer = fpi_usb_transfer_new(FP_DEVICE(dev)); + /* CRC does not cover Ciao prefix (4 bytes) and CRC location (2 bytes) */ + uint16_t crc = udf_crc (cmd_buf + 4, size - 6); - BUG_ON(buf_size > MAX_CMD_SIZE); - - memcpy(self->cmd, buf, buf_size); - upektc_img_cmd_fix_seq(self->cmd, seq); - upektc_img_cmd_update_crc(self->cmd, buf_size); - - fpi_usb_transfer_fill_bulk_full(transfer, EP_OUT, self->cmd, buf_size, - NULL); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, cb, NULL); - fpi_usb_transfer_unref(transfer); + cmd_buf[size - 2] = (crc & 0x00ff); + cmd_buf[size - 1] = (crc & 0xff00) >> 8; } static void -upektc_img_read_data(FpiSsm *ssm, - FpImageDevice *dev, - size_t buf_size, - size_t buf_offset, - FpiUsbTransferCallback cb) +upektc_img_submit_req (FpiSsm *ssm, + FpImageDevice *dev, + const unsigned char *buf, + size_t buf_size, + unsigned char seq, + FpiUsbTransferCallback cb) { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(FP_DEVICE(dev)); - FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG(dev); + FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG (dev); + FpiUsbTransfer *transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); - BUG_ON(buf_offset + buf_size > MAX_RESPONSE_SIZE); + BUG_ON (buf_size > MAX_CMD_SIZE); - fpi_usb_transfer_fill_bulk_full(transfer, EP_IN, - self->response + buf_offset, buf_size, - NULL); - transfer->ssm = ssm; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, cb, NULL); - fpi_usb_transfer_unref(transfer); + memcpy (self->cmd, buf, buf_size); + upektc_img_cmd_fix_seq (self->cmd, seq); + upektc_img_cmd_update_crc (self->cmd, buf_size); + + fpi_usb_transfer_fill_bulk_full (transfer, EP_OUT, self->cmd, buf_size, + NULL); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, cb, NULL); + fpi_usb_transfer_unref (transfer); +} + +static void +upektc_img_read_data (FpiSsm *ssm, + FpImageDevice *dev, + size_t buf_size, + size_t buf_offset, + FpiUsbTransferCallback cb) +{ + FpiUsbTransfer *transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); + FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG (dev); + + BUG_ON (buf_offset + buf_size > MAX_RESPONSE_SIZE); + + fpi_usb_transfer_fill_bulk_full (transfer, EP_IN, + self->response + buf_offset, buf_size, + NULL); + transfer->ssm = ssm; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, cb, NULL); + fpi_usb_transfer_unref (transfer); } /****** CAPTURE ******/ enum capture_states { - CAPTURE_INIT_CAPTURE, - CAPTURE_READ_DATA, - CAPTURE_READ_DATA_TERM, - CAPTURE_ACK_00_28, - CAPTURE_ACK_08, - CAPTURE_ACK_FRAME, - CAPTURE_ACK_00_28_TERM, - CAPTURE_NUM_STATES, + CAPTURE_INIT_CAPTURE, + CAPTURE_READ_DATA, + CAPTURE_READ_DATA_TERM, + CAPTURE_ACK_00_28, + CAPTURE_ACK_08, + CAPTURE_ACK_FRAME, + CAPTURE_ACK_00_28_TERM, + CAPTURE_NUM_STATES, }; -static void capture_reqs_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +capture_reqs_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - if (error) { - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } - switch (fpi_ssm_get_cur_state(transfer->ssm)) { - case CAPTURE_ACK_00_28_TERM: - fpi_ssm_jump_to_state(transfer->ssm, CAPTURE_READ_DATA_TERM); - break; - default: - fpi_ssm_jump_to_state(transfer->ssm, CAPTURE_READ_DATA); - break; - } + if (error) + { + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } + switch (fpi_ssm_get_cur_state (transfer->ssm)) + { + case CAPTURE_ACK_00_28_TERM: + fpi_ssm_jump_to_state (transfer->ssm, CAPTURE_READ_DATA_TERM); + break; + + default: + fpi_ssm_jump_to_state (transfer->ssm, CAPTURE_READ_DATA); + break; + } } -static int upektc_img_process_image_frame(unsigned char *image_buf, unsigned char *cmd_res) +static int +upektc_img_process_image_frame (unsigned char *image_buf, unsigned char *cmd_res) { - int offset = 8; - int len = ((cmd_res[5] & 0x0f) << 8) | (cmd_res[6]); + int offset = 8; + int len = ((cmd_res[5] & 0x0f) << 8) | (cmd_res[6]); - len -= 1; - if (cmd_res[7] == 0x2c) { - len -= 10; - offset += 10; - } - if (cmd_res[7] == 0x20) { - len -= 4; - } - memcpy(image_buf, cmd_res + offset, len); + len -= 1; + if (cmd_res[7] == 0x2c) + { + len -= 10; + offset += 10; + } + if (cmd_res[7] == 0x20) + len -= 4; + memcpy (image_buf, cmd_res + offset, len); - return len; + return len; } -static void capture_read_data_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +capture_read_data_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpImageDevice *dev = FP_IMAGE_DEVICE(device); - FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG(dev); - unsigned char *data = self->response; - FpImage *img; - size_t response_size; + FpImageDevice *dev = FP_IMAGE_DEVICE (device); + FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG (dev); + unsigned char *data = self->response; + FpImage *img; + size_t response_size; - if (error) { - fp_dbg("request is not completed, %s", error->message); - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } + if (error) + { + fp_dbg ("request is not completed, %s", error->message); + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } - if (self->deactivating) { - fp_dbg("Deactivate requested\n"); - fpi_ssm_mark_completed(transfer->ssm); - return; - } + if (self->deactivating) + { + fp_dbg ("Deactivate requested\n"); + fpi_ssm_mark_completed (transfer->ssm); + return; + } - fp_dbg("request completed, len: %.4x", (gint)transfer->actual_length); - if (transfer->actual_length == 0) { - fpi_ssm_jump_to_state(transfer->ssm, - fpi_ssm_get_cur_state(transfer->ssm)); - return; - } + fp_dbg ("request completed, len: %.4x", (gint) transfer->actual_length); + if (transfer->actual_length == 0) + { + fpi_ssm_jump_to_state (transfer->ssm, + fpi_ssm_get_cur_state (transfer->ssm)); + return; + } - if (fpi_ssm_get_cur_state(transfer->ssm) == CAPTURE_READ_DATA_TERM) { - fp_dbg("Terminating SSM\n"); - fpi_ssm_mark_completed(transfer->ssm); - return; - } + if (fpi_ssm_get_cur_state (transfer->ssm) == CAPTURE_READ_DATA_TERM) + { + fp_dbg ("Terminating SSM\n"); + fpi_ssm_mark_completed (transfer->ssm); + return; + } - if (!self->response_rest) { - response_size = ((data[5] & 0x0f) << 8) + data[6]; - response_size += 9; /* 7 bytes for header, 2 for CRC */ - if (response_size > transfer->actual_length) { - fp_dbg("response_size is %lu, actual_length is %d\n", - response_size, (gint)transfer->actual_length); - fp_dbg("Waiting for rest of transfer"); - BUG_ON(self->response_rest); - self->response_rest = response_size - transfer->actual_length; - fpi_ssm_jump_to_state(transfer->ssm, CAPTURE_READ_DATA); - return; - } - } - self->response_rest = 0; + if (!self->response_rest) + { + response_size = ((data[5] & 0x0f) << 8) + data[6]; + response_size += 9; /* 7 bytes for header, 2 for CRC */ + if (response_size > transfer->actual_length) + { + fp_dbg ("response_size is %lu, actual_length is %d\n", + response_size, (gint) transfer->actual_length); + fp_dbg ("Waiting for rest of transfer"); + BUG_ON (self->response_rest); + self->response_rest = response_size - transfer->actual_length; + fpi_ssm_jump_to_state (transfer->ssm, CAPTURE_READ_DATA); + return; + } + } + self->response_rest = 0; - switch (data[4]) { - case 0x00: - switch (data[7]) { - /* No finger */ - case 0x28: - fp_dbg("18th byte is %.2x\n", data[18]); - switch (data[18]) { - case 0x0c: - /* no finger */ - fpi_ssm_jump_to_state(transfer->ssm, - CAPTURE_ACK_00_28); - break; - case 0x00: - /* finger is present! */ - fpi_ssm_jump_to_state(transfer->ssm, - CAPTURE_ACK_00_28); - break; - case 0x1e: - /* short scan */ - fp_err("short scan, aborting\n"); - fpi_image_device_retry_scan(dev, - FP_DEVICE_RETRY_TOO_SHORT); - fpi_image_device_report_finger_status(dev, - FALSE); - fpi_ssm_jump_to_state(transfer->ssm, - CAPTURE_ACK_00_28_TERM); - break; - case 0x1d: - /* too much horisontal movement */ - fp_err("too much horisontal movement, aborting\n"); - fpi_image_device_retry_scan(dev, - FP_DEVICE_RETRY_CENTER_FINGER); - fpi_image_device_report_finger_status(dev, - FALSE); - fpi_ssm_jump_to_state(transfer->ssm, - CAPTURE_ACK_00_28_TERM); - break; - default: - /* some error happened, cancel scan */ - fp_err("something bad happened, stop scan\n"); - fpi_image_device_retry_scan(dev, - FP_DEVICE_RETRY); - fpi_image_device_report_finger_status(dev, - FALSE); - fpi_ssm_jump_to_state(transfer->ssm, - CAPTURE_ACK_00_28_TERM); - break; - } - break; - /* Image frame with additional info */ - case 0x2c: - fpi_image_device_report_finger_status(dev, - TRUE); - /* Plain image frame */ - case 0x24: - self->image_size += - upektc_img_process_image_frame(self->image_bits + self->image_size, - data); - fpi_ssm_jump_to_state(transfer->ssm, - CAPTURE_ACK_FRAME); - break; - /* Last image frame */ - case 0x20: - self->image_size += - upektc_img_process_image_frame(self->image_bits + self->image_size, - data); - BUG_ON(self->image_size != IMAGE_SIZE); - fp_dbg("Image size is %lu\n", - self->image_size); - img = fp_image_new(IMAGE_WIDTH, IMAGE_HEIGHT); - memcpy(img->data, self->image_bits, - IMAGE_SIZE); - fpi_image_device_image_captured(dev, img); - fpi_image_device_report_finger_status(dev, - FALSE); - fpi_ssm_mark_completed(transfer->ssm); - break; - default: - fp_err("Unknown response!\n"); - fpi_ssm_mark_failed(transfer->ssm, fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); - break; - } - break; - case 0x08: - fpi_ssm_jump_to_state(transfer->ssm, CAPTURE_ACK_08); - break; - default: - fp_err("Not handled response!\n"); - fpi_ssm_mark_failed(transfer->ssm, fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); - } + switch (data[4]) + { + case 0x00: + switch (data[7]) + { + /* No finger */ + case 0x28: + fp_dbg ("18th byte is %.2x\n", data[18]); + switch (data[18]) + { + case 0x0c: + /* no finger */ + fpi_ssm_jump_to_state (transfer->ssm, + CAPTURE_ACK_00_28); + break; + + case 0x00: + /* finger is present! */ + fpi_ssm_jump_to_state (transfer->ssm, + CAPTURE_ACK_00_28); + break; + + case 0x1e: + /* short scan */ + fp_err ("short scan, aborting\n"); + fpi_image_device_retry_scan (dev, + FP_DEVICE_RETRY_TOO_SHORT); + fpi_image_device_report_finger_status (dev, + FALSE); + fpi_ssm_jump_to_state (transfer->ssm, + CAPTURE_ACK_00_28_TERM); + break; + + case 0x1d: + /* too much horisontal movement */ + fp_err ("too much horisontal movement, aborting\n"); + fpi_image_device_retry_scan (dev, + FP_DEVICE_RETRY_CENTER_FINGER); + fpi_image_device_report_finger_status (dev, + FALSE); + fpi_ssm_jump_to_state (transfer->ssm, + CAPTURE_ACK_00_28_TERM); + break; + + default: + /* some error happened, cancel scan */ + fp_err ("something bad happened, stop scan\n"); + fpi_image_device_retry_scan (dev, + FP_DEVICE_RETRY); + fpi_image_device_report_finger_status (dev, + FALSE); + fpi_ssm_jump_to_state (transfer->ssm, + CAPTURE_ACK_00_28_TERM); + break; + } + break; + + /* Image frame with additional info */ + case 0x2c: + fpi_image_device_report_finger_status (dev, + TRUE); + + /* Plain image frame */ + case 0x24: + self->image_size += + upektc_img_process_image_frame (self->image_bits + self->image_size, + data); + fpi_ssm_jump_to_state (transfer->ssm, + CAPTURE_ACK_FRAME); + break; + + /* Last image frame */ + case 0x20: + self->image_size += + upektc_img_process_image_frame (self->image_bits + self->image_size, + data); + BUG_ON (self->image_size != IMAGE_SIZE); + fp_dbg ("Image size is %lu\n", + self->image_size); + img = fp_image_new (IMAGE_WIDTH, IMAGE_HEIGHT); + memcpy (img->data, self->image_bits, + IMAGE_SIZE); + fpi_image_device_image_captured (dev, img); + fpi_image_device_report_finger_status (dev, + FALSE); + fpi_ssm_mark_completed (transfer->ssm); + break; + + default: + fp_err ("Unknown response!\n"); + fpi_ssm_mark_failed (transfer->ssm, fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); + break; + } + break; + + case 0x08: + fpi_ssm_jump_to_state (transfer->ssm, CAPTURE_ACK_08); + break; + + default: + fp_err ("Not handled response!\n"); + fpi_ssm_mark_failed (transfer->ssm, fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); + } } -static void capture_run_state(FpiSsm *ssm, FpDevice *_dev, void *user_data) +static void +capture_run_state (FpiSsm *ssm, FpDevice *_dev, void *user_data) { - FpImageDevice *dev = user_data; - FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG(_dev); + FpImageDevice *dev = user_data; + FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG (_dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case CAPTURE_INIT_CAPTURE: - upektc_img_submit_req(ssm, dev, upek2020_init_capture, sizeof(upek2020_init_capture), - self->seq, capture_reqs_cb); - self->seq++; - break; - case CAPTURE_READ_DATA: - case CAPTURE_READ_DATA_TERM: - if (!self->response_rest) - upektc_img_read_data(ssm, dev, SHORT_RESPONSE_SIZE, 0, capture_read_data_cb); - else - upektc_img_read_data(ssm, dev, MAX_RESPONSE_SIZE - SHORT_RESPONSE_SIZE, - SHORT_RESPONSE_SIZE, capture_read_data_cb); - break; - case CAPTURE_ACK_00_28: - case CAPTURE_ACK_00_28_TERM: - upektc_img_submit_req(ssm, dev, upek2020_ack_00_28, sizeof(upek2020_ack_00_28), - self->seq, capture_reqs_cb); - self->seq++; - break; - case CAPTURE_ACK_08: - upektc_img_submit_req(ssm, dev, upek2020_ack_08, sizeof(upek2020_ack_08), - 0, capture_reqs_cb); - break; - case CAPTURE_ACK_FRAME: - upektc_img_submit_req(ssm, dev, upek2020_ack_frame, sizeof(upek2020_ack_frame), - self->seq, capture_reqs_cb); - self->seq++; - break; - }; + switch (fpi_ssm_get_cur_state (ssm)) + { + case CAPTURE_INIT_CAPTURE: + upektc_img_submit_req (ssm, dev, upek2020_init_capture, sizeof (upek2020_init_capture), + self->seq, capture_reqs_cb); + self->seq++; + break; + + case CAPTURE_READ_DATA: + case CAPTURE_READ_DATA_TERM: + if (!self->response_rest) + upektc_img_read_data (ssm, dev, SHORT_RESPONSE_SIZE, 0, capture_read_data_cb); + else + upektc_img_read_data (ssm, dev, MAX_RESPONSE_SIZE - SHORT_RESPONSE_SIZE, + SHORT_RESPONSE_SIZE, capture_read_data_cb); + break; + + case CAPTURE_ACK_00_28: + case CAPTURE_ACK_00_28_TERM: + upektc_img_submit_req (ssm, dev, upek2020_ack_00_28, sizeof (upek2020_ack_00_28), + self->seq, capture_reqs_cb); + self->seq++; + break; + + case CAPTURE_ACK_08: + upektc_img_submit_req (ssm, dev, upek2020_ack_08, sizeof (upek2020_ack_08), + 0, capture_reqs_cb); + break; + + case CAPTURE_ACK_FRAME: + upektc_img_submit_req (ssm, dev, upek2020_ack_frame, sizeof (upek2020_ack_frame), + self->seq, capture_reqs_cb); + self->seq++; + break; + } + ; } -static void capture_sm_complete(FpiSsm *ssm, FpDevice *_dev, void *user_data, GError *error_arg) +static void +capture_sm_complete (FpiSsm *ssm, FpDevice *_dev, void *user_data, GError *error_arg) { - FpImageDevice *dev = user_data; - FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG(_dev); - g_autoptr(GError) error = error_arg; + FpImageDevice *dev = user_data; + FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG (_dev); - fpi_ssm_free(ssm); + g_autoptr(GError) error = error_arg; - /* Note: We assume that the error is a cancellation in the deactivation case */ - if (self->deactivating) - start_deactivation(dev); - else if (error) - fpi_image_device_session_error (dev, g_steal_pointer (&error)); - else - start_capture(dev); + fpi_ssm_free (ssm); + + /* Note: We assume that the error is a cancellation in the deactivation case */ + if (self->deactivating) + start_deactivation (dev); + else if (error) + fpi_image_device_session_error (dev, g_steal_pointer (&error)); + else + start_capture (dev); } -static void start_capture(FpImageDevice *dev) +static void +start_capture (FpImageDevice *dev) { - FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG(dev); - FpiSsm *ssm; + FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG (dev); + FpiSsm *ssm; - self->image_size = 0; + self->image_size = 0; - ssm = fpi_ssm_new(FP_DEVICE(dev), capture_run_state, - CAPTURE_NUM_STATES, dev); - fpi_ssm_start(ssm, capture_sm_complete); + ssm = fpi_ssm_new (FP_DEVICE (dev), capture_run_state, + CAPTURE_NUM_STATES, dev); + fpi_ssm_start (ssm, capture_sm_complete); } /****** INITIALIZATION/DEINITIALIZATION ******/ enum deactivate_states { - DEACTIVATE_DEINIT, - DEACTIVATE_READ_DEINIT_DATA, - DEACTIVATE_NUM_STATES, + DEACTIVATE_DEINIT, + DEACTIVATE_READ_DEINIT_DATA, + DEACTIVATE_NUM_STATES, }; -static void deactivate_reqs_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +deactivate_reqs_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - if (!error) { - fpi_ssm_jump_to_state(transfer->ssm, CAPTURE_READ_DATA); - } else { - fpi_ssm_mark_failed(transfer->ssm, error); - } + if (!error) + fpi_ssm_jump_to_state (transfer->ssm, CAPTURE_READ_DATA); + else + fpi_ssm_mark_failed (transfer->ssm, error); } /* TODO: process response properly */ -static void deactivate_read_data_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +deactivate_read_data_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - if (!error) { - fpi_ssm_mark_completed(transfer->ssm); - } else { - fpi_ssm_mark_failed(transfer->ssm, error); - } + if (!error) + fpi_ssm_mark_completed (transfer->ssm); + else + fpi_ssm_mark_failed (transfer->ssm, error); } -static void deactivate_run_state(FpiSsm *ssm, FpDevice *_dev, - void *user_data) +static void +deactivate_run_state (FpiSsm *ssm, FpDevice *_dev, + void *user_data) { - FpImageDevice *dev = user_data; - FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG(_dev); + FpImageDevice *dev = user_data; + FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG (_dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case DEACTIVATE_DEINIT: - upektc_img_submit_req(ssm, dev, upek2020_deinit, sizeof(upek2020_deinit), - self->seq, deactivate_reqs_cb); - self->seq++; - break; - case DEACTIVATE_READ_DEINIT_DATA: - upektc_img_read_data(ssm, dev, SHORT_RESPONSE_SIZE, 0, deactivate_read_data_cb); - break; - }; + switch (fpi_ssm_get_cur_state (ssm)) + { + case DEACTIVATE_DEINIT: + upektc_img_submit_req (ssm, dev, upek2020_deinit, sizeof (upek2020_deinit), + self->seq, deactivate_reqs_cb); + self->seq++; + break; + + case DEACTIVATE_READ_DEINIT_DATA: + upektc_img_read_data (ssm, dev, SHORT_RESPONSE_SIZE, 0, deactivate_read_data_cb); + break; + } + ; } -static void deactivate_sm_complete(FpiSsm *ssm, FpDevice *_dev, - void *user_data, GError *error) +static void +deactivate_sm_complete (FpiSsm *ssm, FpDevice *_dev, + void *user_data, GError *error) { - FpImageDevice *dev = user_data; - FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG(_dev); + FpImageDevice *dev = user_data; + FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG (_dev); - fp_dbg("Deactivate completed"); - fpi_ssm_free(ssm); + fp_dbg ("Deactivate completed"); + fpi_ssm_free (ssm); - self->deactivating = FALSE; - fpi_image_device_deactivate_complete(dev, error); + self->deactivating = FALSE; + fpi_image_device_deactivate_complete (dev, error); } -static void start_deactivation(FpImageDevice *dev) +static void +start_deactivation (FpImageDevice *dev) { - FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG(dev); - FpiSsm *ssm; + FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG (dev); + FpiSsm *ssm; - self->image_size = 0; + self->image_size = 0; - ssm = fpi_ssm_new(FP_DEVICE(dev), deactivate_run_state, - DEACTIVATE_NUM_STATES, dev); - fpi_ssm_start(ssm, deactivate_sm_complete); + ssm = fpi_ssm_new (FP_DEVICE (dev), deactivate_run_state, + DEACTIVATE_NUM_STATES, dev); + fpi_ssm_start (ssm, deactivate_sm_complete); } enum activate_states { - ACTIVATE_CONTROL_REQ_1, - ACTIVATE_READ_CTRL_RESP_1, - ACTIVATE_INIT_1, - ACTIVATE_READ_INIT_1_RESP, - ACTIVATE_INIT_2, - ACTIVATE_READ_INIT_2_RESP, - ACTIVATE_CONTROL_REQ_2, - ACTIVATE_READ_CTRL_RESP_2, - ACTIVATE_INIT_3, - ACTIVATE_READ_INIT_3_RESP, - ACTIVATE_INIT_4, - ACTIVATE_READ_INIT_4_RESP, - ACTIVATE_NUM_STATES, + ACTIVATE_CONTROL_REQ_1, + ACTIVATE_READ_CTRL_RESP_1, + ACTIVATE_INIT_1, + ACTIVATE_READ_INIT_1_RESP, + ACTIVATE_INIT_2, + ACTIVATE_READ_INIT_2_RESP, + ACTIVATE_CONTROL_REQ_2, + ACTIVATE_READ_CTRL_RESP_2, + ACTIVATE_INIT_3, + ACTIVATE_READ_INIT_3_RESP, + ACTIVATE_INIT_4, + ACTIVATE_READ_INIT_4_RESP, + ACTIVATE_NUM_STATES, }; -static void init_reqs_ctrl_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +init_reqs_ctrl_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - if (!error) { - fpi_ssm_next_state(transfer->ssm); - } else { - fpi_ssm_mark_failed(transfer->ssm, error); - } + if (!error) + fpi_ssm_next_state (transfer->ssm); + else + fpi_ssm_mark_failed (transfer->ssm, error); } -static void init_reqs_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +init_reqs_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - if (!error) { - fpi_ssm_next_state(transfer->ssm); - } else { - fpi_ssm_mark_failed(transfer->ssm, error); - } + if (!error) + fpi_ssm_next_state (transfer->ssm); + else + fpi_ssm_mark_failed (transfer->ssm, error); } /* TODO: process response properly */ -static void init_read_data_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +init_read_data_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - if (!error) { - fpi_ssm_next_state(transfer->ssm); - } else { - fpi_ssm_mark_failed(transfer->ssm, error); - } + if (!error) + fpi_ssm_next_state (transfer->ssm); + else + fpi_ssm_mark_failed (transfer->ssm, error); } -static void activate_run_state(FpiSsm *ssm, FpDevice *dev, void *user_data) +static void +activate_run_state (FpiSsm *ssm, FpDevice *dev, void *user_data) { - FpiUsbTransfer *transfer; - FpImageDevice *idev = user_data; - FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG(dev); + FpiUsbTransfer *transfer; + FpImageDevice *idev = user_data; + FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG (dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case ACTIVATE_CONTROL_REQ_1: - case ACTIVATE_CONTROL_REQ_2: - { - transfer = fpi_usb_transfer_new(dev); + switch (fpi_ssm_get_cur_state (ssm)) + { + case ACTIVATE_CONTROL_REQ_1: + case ACTIVATE_CONTROL_REQ_2: + { + transfer = fpi_usb_transfer_new (dev); - fpi_usb_transfer_fill_control(transfer, - G_USB_DEVICE_DIRECTION_HOST_TO_DEVICE, - G_USB_DEVICE_REQUEST_TYPE_VENDOR, - G_USB_DEVICE_RECIPIENT_DEVICE, - 0x0c, 0x100, 0x0400, 1); - transfer->buffer[0] = '\0'; - transfer->ssm = ssm; - fpi_usb_transfer_submit(transfer, CTRL_TIMEOUT, NULL, - init_reqs_ctrl_cb, NULL); - fpi_usb_transfer_unref(transfer); - } - break; - case ACTIVATE_INIT_1: - upektc_img_submit_req(ssm, idev, upek2020_init_1, sizeof(upek2020_init_1), - 0, init_reqs_cb); - break; - case ACTIVATE_INIT_2: - upektc_img_submit_req(ssm, idev, upek2020_init_2, sizeof(upek2020_init_2), - 0, init_reqs_cb); - break; - case ACTIVATE_INIT_3: - upektc_img_submit_req(ssm, idev, upek2020_init_3, sizeof(upek2020_init_3), - 0, init_reqs_cb); - break; - case ACTIVATE_INIT_4: - upektc_img_submit_req(ssm, idev, upek2020_init_4, sizeof(upek2020_init_4), - self->seq, init_reqs_cb); - /* Seq should be updated after 4th init */ - self->seq++; - break; - case ACTIVATE_READ_CTRL_RESP_1: - case ACTIVATE_READ_CTRL_RESP_2: - case ACTIVATE_READ_INIT_1_RESP: - case ACTIVATE_READ_INIT_2_RESP: - case ACTIVATE_READ_INIT_3_RESP: - case ACTIVATE_READ_INIT_4_RESP: - upektc_img_read_data(ssm, idev, SHORT_RESPONSE_SIZE, 0, init_read_data_cb); - break; - } + fpi_usb_transfer_fill_control (transfer, + G_USB_DEVICE_DIRECTION_HOST_TO_DEVICE, + G_USB_DEVICE_REQUEST_TYPE_VENDOR, + G_USB_DEVICE_RECIPIENT_DEVICE, + 0x0c, 0x100, 0x0400, 1); + transfer->buffer[0] = '\0'; + transfer->ssm = ssm; + fpi_usb_transfer_submit (transfer, CTRL_TIMEOUT, NULL, + init_reqs_ctrl_cb, NULL); + fpi_usb_transfer_unref (transfer); + } + break; + + case ACTIVATE_INIT_1: + upektc_img_submit_req (ssm, idev, upek2020_init_1, sizeof (upek2020_init_1), + 0, init_reqs_cb); + break; + + case ACTIVATE_INIT_2: + upektc_img_submit_req (ssm, idev, upek2020_init_2, sizeof (upek2020_init_2), + 0, init_reqs_cb); + break; + + case ACTIVATE_INIT_3: + upektc_img_submit_req (ssm, idev, upek2020_init_3, sizeof (upek2020_init_3), + 0, init_reqs_cb); + break; + + case ACTIVATE_INIT_4: + upektc_img_submit_req (ssm, idev, upek2020_init_4, sizeof (upek2020_init_4), + self->seq, init_reqs_cb); + /* Seq should be updated after 4th init */ + self->seq++; + break; + + case ACTIVATE_READ_CTRL_RESP_1: + case ACTIVATE_READ_CTRL_RESP_2: + case ACTIVATE_READ_INIT_1_RESP: + case ACTIVATE_READ_INIT_2_RESP: + case ACTIVATE_READ_INIT_3_RESP: + case ACTIVATE_READ_INIT_4_RESP: + upektc_img_read_data (ssm, idev, SHORT_RESPONSE_SIZE, 0, init_read_data_cb); + break; + } } -static void activate_sm_complete(FpiSsm *ssm, FpDevice *_dev, - void *user_data, GError *error) +static void +activate_sm_complete (FpiSsm *ssm, FpDevice *_dev, + void *user_data, GError *error) { - FpImageDevice *dev = user_data; + FpImageDevice *dev = user_data; - fpi_ssm_free(ssm); - fpi_image_device_activate_complete(dev, error); + fpi_ssm_free (ssm); + fpi_image_device_activate_complete (dev, error); - if (!error) - start_capture(dev); + if (!error) + start_capture (dev); } -static void dev_activate(FpImageDevice *dev) +static void +dev_activate (FpImageDevice *dev) { - FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG(dev); - FpiSsm *ssm = fpi_ssm_new(FP_DEVICE(dev), activate_run_state, - ACTIVATE_NUM_STATES, dev); - self->seq = 0; - fpi_ssm_start(ssm, activate_sm_complete); + FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG (dev); + FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (dev), activate_run_state, + ACTIVATE_NUM_STATES, dev); + + self->seq = 0; + fpi_ssm_start (ssm, activate_sm_complete); } -static void dev_deactivate(FpImageDevice *dev) +static void +dev_deactivate (FpImageDevice *dev) { - FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG(dev); + FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG (dev); - self->deactivating = TRUE; + self->deactivating = TRUE; } -static void dev_init(FpImageDevice *dev) +static void +dev_init (FpImageDevice *dev) { - FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG(dev); - GError *error = NULL; - /* TODO check that device has endpoints we're using */ + FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG (dev); + GError *error = NULL; - if (!g_usb_device_claim_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), 0, 0, &error)) { - fpi_image_device_open_complete(dev, error); - return; - } + /* TODO check that device has endpoints we're using */ - self->image_bits = g_malloc0 (IMAGE_SIZE * 2); - fpi_image_device_open_complete(dev, NULL); + if (!g_usb_device_claim_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), 0, 0, &error)) + { + fpi_image_device_open_complete (dev, error); + return; + } + + self->image_bits = g_malloc0 (IMAGE_SIZE * 2); + fpi_image_device_open_complete (dev, NULL); } -static void dev_deinit(FpImageDevice *dev) +static void +dev_deinit (FpImageDevice *dev) { - FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG(dev); - GError *error = NULL; + FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG (dev); + GError *error = NULL; - g_clear_pointer (&self->image_bits, g_free); - g_usb_device_release_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), - 0, 0, &error); - fpi_image_device_close_complete(dev, error); + g_clear_pointer (&self->image_bits, g_free); + g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), + 0, 0, &error); + fpi_image_device_close_complete (dev, error); } static int -discover(GUsbDevice *usb_device) +discover (GUsbDevice *usb_device) { - gint16 pid = g_usb_device_get_pid (usb_device); - gint16 bcd = g_usb_device_get_release (usb_device); + gint16 pid = g_usb_device_get_pid (usb_device); + gint16 bcd = g_usb_device_get_release (usb_device); - if (pid == 0x2020 && bcd == 1) - return 100; - if (pid == 0x2016 && bcd == 2) - return 100; + if (pid == 0x2020 && bcd == 1) + return 100; + if (pid == 0x2016 && bcd == 2) + return 100; - return 0; + return 0; } -static const FpIdEntry id_table [ ] = { - { .vid = 0x147e, .pid = 0x2016, - }, - { .vid = 0x147e, .pid = 0x2020, - }, - { .vid = 0, .pid = 0, .driver_data = 0 }, +static const FpIdEntry id_table[] = { + { .vid = 0x147e, .pid = 0x2016, }, + { .vid = 0x147e, .pid = 0x2020, }, + { .vid = 0, .pid = 0, .driver_data = 0 }, }; -static void fpi_device_upektc_img_init(FpiDeviceUpektcImg *self) { +static void +fpi_device_upektc_img_init (FpiDeviceUpektcImg *self) +{ } -static void fpi_device_upektc_img_class_init(FpiDeviceUpektcImgClass *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); - FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS(klass); +static void +fpi_device_upektc_img_class_init (FpiDeviceUpektcImgClass *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); + FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); - dev_class->id = "upektc_img"; - dev_class->full_name = "Upek TouchChip Fingerprint Coprocessor"; - dev_class->type = FP_DEVICE_TYPE_USB; - dev_class->id_table = id_table; - dev_class->scan_type = FP_SCAN_TYPE_SWIPE; - dev_class->usb_discover = discover; + dev_class->id = "upektc_img"; + dev_class->full_name = "Upek TouchChip Fingerprint Coprocessor"; + dev_class->type = FP_DEVICE_TYPE_USB; + dev_class->id_table = id_table; + dev_class->scan_type = FP_SCAN_TYPE_SWIPE; + dev_class->usb_discover = discover; - img_class->img_open = dev_init; - img_class->img_close = dev_deinit; - img_class->activate = dev_activate; - img_class->deactivate = dev_deactivate; + img_class->img_open = dev_init; + img_class->img_close = dev_deinit; + img_class->activate = dev_activate; + img_class->deactivate = dev_deactivate; - img_class->bz3_threshold = 20; + img_class->bz3_threshold = 20; - img_class->img_width = IMAGE_WIDTH; - img_class->img_height = IMAGE_HEIGHT; + img_class->img_width = IMAGE_WIDTH; + img_class->img_height = IMAGE_HEIGHT; } diff --git a/libfprint/drivers/upektc_img.h b/libfprint/drivers/upektc_img.h index 6146557..9185aa8 100644 --- a/libfprint/drivers/upektc_img.h +++ b/libfprint/drivers/upektc_img.h @@ -21,124 +21,124 @@ #define __UPEKTC_IMG_H static const unsigned char upek2020_init_1[] = { -'C', 'i', 'a', 'o', -0x04, -0x00, 0x0d, -0x01, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -0x01, 0x00, 0x00, 0x00, -0xda, 0xc1 + 'C', 'i', 'a', 'o', + 0x04, + 0x00, 0x0d, + 0x01, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x00, 0x00, + 0xda, 0xc1 }; static const unsigned char upek2020_init_2[] = { -0x43, 0x69, 0x61, 0x6f, -0x07, -0x00, 0x01, -0x01, -0x3d, 0x72 + 0x43, 0x69, 0x61, 0x6f, + 0x07, + 0x00, 0x01, + 0x01, + 0x3d, 0x72 }; static const unsigned char upek2020_init_3[] = { -'C', 'i', 'a', 'o', -0x04, -0x00, 0x0d, -0x01, 0x00, 0xbc, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, -0x01, 0x00, 0x00, 0x00, -0x55, 0x2f + 'C', 'i', 'a', 'o', + 0x04, + 0x00, 0x0d, + 0x01, 0x00, 0xbc, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x00, 0x00, + 0x55, 0x2f }; static const unsigned char upek2020_init_4[] = { -'C', 'i', 'a', 'o', -0x00, -0x00, 0x07, -0x28, 0x04, 0x00, 0x00, 0x00, 0x06, 0x04, -0xc0, 0xd6 + 'C', 'i', 'a', 'o', + 0x00, + 0x00, 0x07, + 0x28, 0x04, 0x00, 0x00, 0x00, 0x06, 0x04, + 0xc0, 0xd6 }; static const unsigned char upek2020_deinit[] = { -'C', 'i', 'a', 'o', -0x07, -0x00, 0x01, -0x01, -0x3d, -0x72 + 'C', 'i', 'a', 'o', + 0x07, + 0x00, 0x01, + 0x01, + 0x3d, + 0x72 }; static const unsigned char upek2020_init_capture[] = { -'C', 'i', 'a', 'o', -0x00, -0x00, 0x0e, /* Seq = 7, len = 0x00e */ -0x28, /* CMD = 0x28 */ -0x0b, 0x00, /* Inner len = 0x000b */ -0x00, 0x00, -0x0e, /* SUBCMD = 0x0e */ -0x02, -0xfe, 0xff, 0xff, 0xff, /* timeout = -2 = 0xfffffffe = infinite time */ -0x02, -0x00, /* Wait for acceptable finger */ -0x02, -0x14, 0x9a /* CRC */ + 'C', 'i', 'a', 'o', + 0x00, + 0x00, 0x0e, /* Seq = 7, len = 0x00e */ + 0x28, /* CMD = 0x28 */ + 0x0b, 0x00, /* Inner len = 0x000b */ + 0x00, 0x00, + 0x0e, /* SUBCMD = 0x0e */ + 0x02, + 0xfe, 0xff, 0xff, 0xff, /* timeout = -2 = 0xfffffffe = infinite time */ + 0x02, + 0x00, /* Wait for acceptable finger */ + 0x02, + 0x14, 0x9a /* CRC */ }; #if 0 static const unsigned char finger_status[] = { -'C', 'i', 'a', 'o', -0x00, -0x70, 0x14, /* Seq = 7, len = 0x014 */ -0x28, /* CMD = 0x28 */ -0x11, 0x00, /* Inner len = 0x0011 */ -0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, -0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, -0x26, 0x03, /* CRC */ -0x00, 0x00, 0x00, /* Rest is garbage */ -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + 'C', 'i', 'a', 'o', + 0x00, + 0x70, 0x14, /* Seq = 7, len = 0x014 */ + 0x28, /* CMD = 0x28 */ + 0x11, 0x00, /* Inner len = 0x0011 */ + 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, + 0x26, 0x03, /* CRC */ + 0x00, 0x00, 0x00, /* Rest is garbage */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; #endif static const unsigned char upek2020_ack_00_28[] = { -'C', 'i', 'a', 'o', -0x00, -0x80, 0x08, /* Seq = 8, len = 0x008 */ -0x28, /* CMD = 0x28 */ -0x05, 0x00, /* Inner len = 0x0005 */ -0x00, 0x00, 0x00, 0x30, 0x01, -0x6a, 0xc4 /* CRC */ + 'C', 'i', 'a', 'o', + 0x00, + 0x80, 0x08, /* Seq = 8, len = 0x008 */ + 0x28, /* CMD = 0x28 */ + 0x05, 0x00, /* Inner len = 0x0005 */ + 0x00, 0x00, 0x00, 0x30, 0x01, + 0x6a, 0xc4 /* CRC */ }; #if 0 /* No seq should be tracked here */ static const unsigned char got_finger[] = { -'C', 'i', 'a', 'o', -0x08, -0x00, 0x00, /* Seq = 0, len = 0x000 */ -0xa1, 0xa9, /* CRC */ -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Rest is garbage */ -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + 'C', 'i', 'a', 'o', + 0x08, + 0x00, 0x00, /* Seq = 0, len = 0x000 */ + 0xa1, 0xa9, /* CRC */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Rest is garbage */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; #endif /* No seq should be put in there */ static const unsigned char upek2020_ack_08[] = { -'C', 'i', 'a', 'o', -0x09, -0x00, 0x00, /* Seq = 0, len = 0x0 */ -0x91, 0x9e /* CRC */ + 'C', 'i', 'a', 'o', + 0x09, + 0x00, 0x00, /* Seq = 0, len = 0x0 */ + 0x91, 0x9e /* CRC */ }; static const unsigned char upek2020_ack_frame[] = { -'C', 'i', 'a', 'o', -0x00, -0x50, 0x01, /* Seq = 5, len = 0x001 */ -0x30, -0xac, 0x5b /* CRC */ + 'C', 'i', 'a', 'o', + 0x00, + 0x50, 0x01, /* Seq = 5, len = 0x001 */ + 0x30, + 0xac, 0x5b /* CRC */ }; #endif diff --git a/libfprint/drivers/upekts.c b/libfprint/drivers/upekts.c index 09160d9..a3a0cad 100644 --- a/libfprint/drivers/upekts.c +++ b/libfprint/drivers/upekts.c @@ -37,26 +37,27 @@ #define MSG_READ_BUF_SIZE 0x40 #define MAX_DATA_IN_READ_BUF (MSG_READ_BUF_SIZE - 9) -struct _FpiDeviceUpekts { - FpDevice parent; +struct _FpiDeviceUpekts +{ + FpDevice parent; - gboolean enroll_passed; - gint enroll_stage; - gboolean first_verify_iteration; - guint8 seq; /* FIXME: improve/automate seq handling */ + gboolean enroll_passed; + gint enroll_stage; + gboolean first_verify_iteration; + guint8 seq; /* FIXME: improve/automate seq handling */ }; -G_DECLARE_FINAL_TYPE(FpiDeviceUpekts, fpi_device_upekts, FPI, - DEVICE_UPEKTS, FpDevice); -G_DEFINE_TYPE(FpiDeviceUpekts, fpi_device_upekts, FP_TYPE_DEVICE); +G_DECLARE_FINAL_TYPE (FpiDeviceUpekts, fpi_device_upekts, FPI, + DEVICE_UPEKTS, FpDevice); +G_DEFINE_TYPE (FpiDeviceUpekts, fpi_device_upekts, FP_TYPE_DEVICE); /* * MESSAGE FORMAT - * + * * Messages to and from the device have the same format. * * Byte-wise: - * 'C' 'i' 'a' 'o' A B L C1 C2 + * 'C' 'i' 'a' 'o' A B L C1 C2 * * Ciao prefixes all messages. The rightmost 4 bits of B become the uppermost * 4 bits of L, and when combined with the lower 8 bits listed as 'L', L is @@ -69,7 +70,7 @@ G_DEFINE_TYPE(FpiDeviceUpekts, fpi_device_upekts, FP_TYPE_DEVICE); * with B=0 and A incremented. * * When the driver sends a command to the device, A=0 and B is used as a - * sequence counter. It starts at 0, increments by 0x10 on each command, and + * sequence counter. It starts at 0, increments by 0x10 on each command, and * wraps around. * After each command is sent, the device responds with another message * indicating completion of the command including any data that was requested. @@ -78,7 +79,7 @@ G_DEFINE_TYPE(FpiDeviceUpekts, fpi_device_upekts, FP_TYPE_DEVICE); * When the driver is sending commands as above, and when the device is * responding, the seems to follow this structure: * - * 28 L1 L2 0 0 S + * 28 L1 L2 0 0 S * * Where the length of is L-3, and S is some kind of subcommand * code. L1 is the least significant bits of L, L2 is the most significant. In @@ -90,1304 +91,1489 @@ G_DEFINE_TYPE(FpiDeviceUpekts, fpi_device_upekts, FP_TYPE_DEVICE); #define CMD_SEQ_INCREMENT 0x10 -static FpiUsbTransfer *alloc_send_cmd_transfer(FpDevice *dev, - unsigned char seq_a, - unsigned char seq_b, - const unsigned char *data, - guint16 len) +static FpiUsbTransfer * +alloc_send_cmd_transfer (FpDevice *dev, + unsigned char seq_a, + unsigned char seq_b, + const unsigned char *data, + guint16 len) { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(dev); - guint16 crc; - const char *ciao = "Ciao"; + FpiUsbTransfer *transfer = fpi_usb_transfer_new (dev); + guint16 crc; + const char *ciao = "Ciao"; - /* 9 bytes extra for: 4 byte 'Ciao', 1 byte A, 1 byte B | lenHI, - * 1 byte lenLO, 2 byte CRC */ - size_t urblen = len + 9; + /* 9 bytes extra for: 4 byte 'Ciao', 1 byte A, 1 byte B | lenHI, + * 1 byte lenLO, 2 byte CRC */ + size_t urblen = len + 9; - if (!data && len > 0) { - fp_err("len>0 but no data?"); - return NULL; - } + if (!data && len > 0) + { + fp_err ("len>0 but no data?"); + return NULL; + } - fpi_usb_transfer_fill_bulk (transfer, EP_OUT, urblen); + fpi_usb_transfer_fill_bulk (transfer, EP_OUT, urblen); - /* Write header */ - memcpy(transfer->buffer, ciao, strlen(ciao)); - transfer->buffer[4] = seq_a; - transfer->buffer[5] = seq_b | ((len & 0xf00) >> 8); - transfer->buffer[6] = len & 0x00ff; + /* Write header */ + memcpy (transfer->buffer, ciao, strlen (ciao)); + transfer->buffer[4] = seq_a; + transfer->buffer[5] = seq_b | ((len & 0xf00) >> 8); + transfer->buffer[6] = len & 0x00ff; - /* Copy data */ - if (data) - memcpy(transfer->buffer + 7, data, len); + /* Copy data */ + if (data) + memcpy (transfer->buffer + 7, data, len); - /* Append CRC */ - crc = udf_crc(transfer->buffer + 4, urblen - 6); - transfer->buffer[urblen - 2] = crc & 0xff; - transfer->buffer[urblen - 1] = crc >> 8; + /* Append CRC */ + crc = udf_crc (transfer->buffer + 4, urblen - 6); + transfer->buffer[urblen - 2] = crc & 0xff; + transfer->buffer[urblen - 1] = crc >> 8; - return transfer; + return transfer; } -static FpiUsbTransfer *alloc_send_cmd28_transfer(FpDevice *dev, - unsigned char subcmd, - const unsigned char *data, - guint16 innerlen) +static FpiUsbTransfer * +alloc_send_cmd28_transfer (FpDevice *dev, + unsigned char subcmd, + const unsigned char *data, + guint16 innerlen) { - guint16 _innerlen = innerlen; - size_t len = innerlen + 6; - unsigned char *buf = g_malloc0(len); - FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS(dev); - guint8 seq = upekdev->seq + CMD_SEQ_INCREMENT; - FpiUsbTransfer *ret; + guint16 _innerlen = innerlen; + size_t len = innerlen + 6; + unsigned char *buf = g_malloc0 (len); + FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS (dev); + guint8 seq = upekdev->seq + CMD_SEQ_INCREMENT; + FpiUsbTransfer *ret; - fp_dbg("seq=%02x subcmd=%02x with %d bytes of data", seq, subcmd, innerlen); + fp_dbg ("seq=%02x subcmd=%02x with %d bytes of data", seq, subcmd, innerlen); - _innerlen = innerlen + 3; - buf[0] = 0x28; - buf[1] = _innerlen & 0x00ff; - buf[2] = (_innerlen & 0xff00) >> 8; - buf[5] = subcmd; - memcpy(buf + 6, data, innerlen); + _innerlen = innerlen + 3; + buf[0] = 0x28; + buf[1] = _innerlen & 0x00ff; + buf[2] = (_innerlen & 0xff00) >> 8; + buf[5] = subcmd; + memcpy (buf + 6, data, innerlen); - ret = alloc_send_cmd_transfer(dev, 0, seq, buf, len); - upekdev->seq = seq; + ret = alloc_send_cmd_transfer (dev, 0, seq, buf, len); + upekdev->seq = seq; - g_free(buf); - return ret; + g_free (buf); + return ret; } -static FpiUsbTransfer *alloc_send_cmdresponse_transfer(FpDevice *dev, - unsigned char seq, - const unsigned char *data, - guint8 len) +static FpiUsbTransfer * +alloc_send_cmdresponse_transfer (FpDevice *dev, + unsigned char seq, + const unsigned char *data, + guint8 len) { - fp_dbg("seq=%02x len=%d", seq, len); - return alloc_send_cmd_transfer(dev, seq, 0, data, len); + fp_dbg ("seq=%02x len=%d", seq, len); + return alloc_send_cmd_transfer (dev, seq, 0, data, len); } enum read_msg_type { - READ_MSG_CMD, - READ_MSG_RESPONSE, + READ_MSG_CMD, + READ_MSG_RESPONSE, }; -typedef void (*read_msg_cb_fn)(FpDevice *dev, enum read_msg_type type, - guint8 seq, unsigned char subcmd, - unsigned char *data, size_t data_len, - void *user_data, GError *error); +typedef void (*read_msg_cb_fn)(FpDevice *dev, + enum read_msg_type type, + guint8 seq, + unsigned char subcmd, + unsigned char *data, + size_t data_len, + void *user_data, + GError *error); -struct read_msg_data { - gssize buflen; - guint8 *buffer; - read_msg_cb_fn callback; - void *user_data; -}; - -static void __read_msg_async(FpDevice *dev, struct read_msg_data *udata); - -#define READ_MSG_DATA_CB_ERR(dev, udata, error) (udata)->callback(dev, \ - READ_MSG_CMD, 0, 0, NULL, 0, (udata)->user_data, error) - -static void busy_ack_sent_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +struct read_msg_data { - struct read_msg_data *udata = user_data; + gssize buflen; + guint8 *buffer; + read_msg_cb_fn callback; + void *user_data; +}; - if (error) { - READ_MSG_DATA_CB_ERR(device, udata, error); - g_free(udata->buffer); - g_free(udata); - } else { - __read_msg_async(device, udata); - } +static void __read_msg_async (FpDevice *dev, + struct read_msg_data *udata); + +#define READ_MSG_DATA_CB_ERR(dev, udata, error) (udata)->callback (dev, \ + READ_MSG_CMD, 0, 0, NULL, 0, (udata)->user_data, error) + +static void +busy_ack_sent_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) +{ + struct read_msg_data *udata = user_data; + + if (error) + { + READ_MSG_DATA_CB_ERR (device, udata, error); + g_free (udata->buffer); + g_free (udata); + } + else + { + __read_msg_async (device, udata); + } } -static void busy_ack_retry_read(FpDevice *device, struct read_msg_data *udata) +static void +busy_ack_retry_read (FpDevice *device, struct read_msg_data *udata) { - FpiUsbTransfer *transfer; + FpiUsbTransfer *transfer; - transfer = alloc_send_cmdresponse_transfer(device, 0x09, NULL, 0); - transfer->short_is_error = TRUE; + transfer = alloc_send_cmdresponse_transfer (device, 0x09, NULL, 0); + transfer->short_is_error = TRUE; - fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, busy_ack_sent_cb, udata); - fpi_usb_transfer_unref (transfer); + fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, busy_ack_sent_cb, udata); + fpi_usb_transfer_unref (transfer); } /* Returns 0 if message was handled, 1 if it was a device-busy message, and * negative on error. */ -static void __handle_incoming_msg(FpDevice *device, - struct read_msg_data *udata) +static void +__handle_incoming_msg (FpDevice *device, + struct read_msg_data *udata) { - GError *error = NULL; - guint8 *buf = udata->buffer; - guint16 len = ((buf[5] & 0xf) << 8) | buf[6]; - guint16 computed_crc = udf_crc(buf + 4, len + 3); - guint16 msg_crc = (buf[len + 8] << 8) | buf[len + 7]; - unsigned char *retdata = NULL; - unsigned char code_a, code_b; + GError *error = NULL; + guint8 *buf = udata->buffer; + guint16 len = ((buf[5] & 0xf) << 8) | buf[6]; + guint16 computed_crc = udf_crc (buf + 4, len + 3); + guint16 msg_crc = (buf[len + 8] << 8) | buf[len + 7]; + unsigned char *retdata = NULL; + unsigned char code_a, code_b; - if (computed_crc != msg_crc) { - fp_err("CRC failed, got %04x expected %04x", msg_crc, computed_crc); - error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "CRC check on message failed"); - goto err; - } + if (computed_crc != msg_crc) + { + fp_err ("CRC failed, got %04x expected %04x", msg_crc, computed_crc); + error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "CRC check on message failed"); + goto err; + } - code_a = buf[4]; - code_b = buf[5] & 0xf0; - len = ((buf[5] & 0xf) << 8) | buf[6]; - fp_dbg("A=%02x B=%02x len=%d", code_a, code_b, len); + code_a = buf[4]; + code_b = buf[5] & 0xf0; + len = ((buf[5] & 0xf) << 8) | buf[6]; + fp_dbg ("A=%02x B=%02x len=%d", code_a, code_b, len); - if (code_a && !code_b) { - /* device sends command to driver */ - fp_dbg("cmd %x from device to driver", code_a); + if (code_a && !code_b) + { + /* device sends command to driver */ + fp_dbg ("cmd %x from device to driver", code_a); - if (code_a == 0x08) { - fp_dbg("device busy, send busy-ack"); - busy_ack_retry_read(device, udata); - return; - } + if (code_a == 0x08) + { + fp_dbg ("device busy, send busy-ack"); + busy_ack_retry_read (device, udata); + return; + } - if (len > 0) { - retdata = g_malloc(len); - memcpy(retdata, buf + 7, len); - } - udata->callback(device, READ_MSG_CMD, code_a, 0, retdata, len, - udata->user_data, NULL); - goto done; - } else if (!code_a) { - /* device sends response to a previously executed command */ - unsigned char *innerbuf = buf + 7; - unsigned char _subcmd; - guint16 innerlen; + if (len > 0) + { + retdata = g_malloc (len); + memcpy (retdata, buf + 7, len); + } + udata->callback (device, READ_MSG_CMD, code_a, 0, retdata, len, + udata->user_data, NULL); + goto done; + } + else if (!code_a) + { + /* device sends response to a previously executed command */ + unsigned char *innerbuf = buf + 7; + unsigned char _subcmd; + guint16 innerlen; - if (len < 6) { - fp_warn("cmd response too short (%d)", len); - error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "CMD response too short"); - goto err; - } - if (innerbuf[0] != 0x28) { - fp_warn("cmd response without 28 byte?"); - error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "CMD response without 0x28 byte"); - goto err; - } + if (len < 6) + { + fp_warn ("cmd response too short (%d)", len); + error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "CMD response too short"); + goto err; + } + if (innerbuf[0] != 0x28) + { + fp_warn ("cmd response without 28 byte?"); + error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "CMD response without 0x28 byte"); + goto err; + } - /* not really sure what these 2 bytes are. on most people's hardware, - * these bytes are always 0. However, Alon Bar-Lev's hardware gives - * 0xfb 0xff during the READ28_OB initsm stage. so don't error out - * if they are different... */ - if (innerbuf[3] || innerbuf[4]) - fp_dbg("non-zero bytes in cmd response"); + /* not really sure what these 2 bytes are. on most people's hardware, + * these bytes are always 0. However, Alon Bar-Lev's hardware gives + * 0xfb 0xff during the READ28_OB initsm stage. so don't error out + * if they are different... */ + if (innerbuf[3] || innerbuf[4]) + fp_dbg ("non-zero bytes in cmd response"); - innerlen = innerbuf[1] | (innerbuf[2] << 8); - innerlen = innerlen - 3; - _subcmd = innerbuf[5]; - fp_dbg("device responds to subcmd %x with %d bytes", _subcmd, innerlen); - if (innerlen > 0) { - retdata = g_malloc(innerlen); - memcpy(retdata, innerbuf + 6, innerlen); - } - udata->callback(device, READ_MSG_RESPONSE, code_b, _subcmd, - retdata, innerlen, udata->user_data, NULL); - g_free(retdata); - goto done; - } else { - fp_err("don't know how to handle this message"); - error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Message cannot be processed"); - goto err; - } - g_assert_not_reached(); + innerlen = innerbuf[1] | (innerbuf[2] << 8); + innerlen = innerlen - 3; + _subcmd = innerbuf[5]; + fp_dbg ("device responds to subcmd %x with %d bytes", _subcmd, innerlen); + if (innerlen > 0) + { + retdata = g_malloc (innerlen); + memcpy (retdata, innerbuf + 6, innerlen); + } + udata->callback (device, READ_MSG_RESPONSE, code_b, _subcmd, + retdata, innerlen, udata->user_data, NULL); + g_free (retdata); + goto done; + } + else + { + fp_err ("don't know how to handle this message"); + error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Message cannot be processed"); + goto err; + } + g_assert_not_reached (); err: - READ_MSG_DATA_CB_ERR(device, udata, error); + READ_MSG_DATA_CB_ERR (device, udata, error); done: - g_free(udata->buffer); - g_free(udata); + g_free (udata->buffer); + g_free (udata); } -static void read_msg_extend_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +read_msg_extend_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - struct read_msg_data *udata = user_data; + struct read_msg_data *udata = user_data; - if (error) { - fp_err("extended msg read failed: %s", error->message); - READ_MSG_DATA_CB_ERR(device, udata, error); - g_free(udata->buffer); - g_free(udata); - return; - } + if (error) + { + fp_err ("extended msg read failed: %s", error->message); + READ_MSG_DATA_CB_ERR (device, udata, error); + g_free (udata->buffer); + g_free (udata); + return; + } - __handle_incoming_msg(device, udata); + __handle_incoming_msg (device, udata); } -static void read_msg_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +read_msg_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - struct read_msg_data *udata = user_data; - guint16 len; + struct read_msg_data *udata = user_data; + guint16 len; - if (error) { - fp_err("async msg read failed: %s", error->message); - goto err; - } - if (transfer->actual_length < 9) { - fp_err("async msg read too short (%d)", - (gint)transfer->actual_length); - error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Packet from device was too short"); - goto err; - } + if (error) + { + fp_err ("async msg read failed: %s", error->message); + goto err; + } + if (transfer->actual_length < 9) + { + fp_err ("async msg read too short (%d)", + (gint) transfer->actual_length); + error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Packet from device was too short"); + goto err; + } - if (strncmp(udata->buffer, "Ciao", 4) != 0) { - fp_err("no Ciao for you!!"); - error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Packet from device had incorrect header"); - goto err; - } + if (strncmp (udata->buffer, "Ciao", 4) != 0) + { + fp_err ("no Ciao for you!!"); + error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Packet from device had incorrect header"); + goto err; + } - len = ((udata->buffer[5] & 0xf) << 8) | udata->buffer[6]; - if (transfer->actual_length != MSG_READ_BUF_SIZE - && (len + 9) > transfer->actual_length) { - /* Check that the length claimed inside the message is in line with - * the amount of data that was transferred over USB. */ - fp_err("msg didn't include enough data, expected=%d recv=%d", - len + 9, (gint)transfer->actual_length); - error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Packet from device didn't include data"); - goto err; - } + len = ((udata->buffer[5] & 0xf) << 8) | udata->buffer[6]; + if (transfer->actual_length != MSG_READ_BUF_SIZE && + (len + 9) > transfer->actual_length) + { + /* Check that the length claimed inside the message is in line with + * the amount of data that was transferred over USB. */ + fp_err ("msg didn't include enough data, expected=%d recv=%d", + len + 9, (gint) transfer->actual_length); + error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Packet from device didn't include data"); + goto err; + } - /* We use a 64 byte buffer for reading messages. However, sometimes - * messages are longer, in which case we have to do another USB bulk read - * to read the remainder. This is handled below. */ - if (len > MAX_DATA_IN_READ_BUF) { - int needed = len - MAX_DATA_IN_READ_BUF; - FpiUsbTransfer *etransfer = fpi_usb_transfer_new(device); + /* We use a 64 byte buffer for reading messages. However, sometimes + * messages are longer, in which case we have to do another USB bulk read + * to read the remainder. This is handled below. */ + if (len > MAX_DATA_IN_READ_BUF) + { + int needed = len - MAX_DATA_IN_READ_BUF; + FpiUsbTransfer *etransfer = fpi_usb_transfer_new (device); - fp_dbg("didn't fit in buffer, need to extend by %d bytes", needed); - udata->buffer = g_realloc((gpointer) udata->buffer, len); - udata->buflen = len; + fp_dbg ("didn't fit in buffer, need to extend by %d bytes", needed); + udata->buffer = g_realloc ((gpointer) udata->buffer, len); + udata->buflen = len; - fpi_usb_transfer_fill_bulk_full(etransfer, EP_IN, - udata->buffer + MSG_READ_BUF_SIZE, - needed, NULL); - etransfer->short_is_error = TRUE; - fpi_usb_transfer_submit(etransfer, TIMEOUT, - NULL, - read_msg_extend_cb, udata); - fpi_usb_transfer_unref(etransfer); - return; - } + fpi_usb_transfer_fill_bulk_full (etransfer, EP_IN, + udata->buffer + MSG_READ_BUF_SIZE, + needed, NULL); + etransfer->short_is_error = TRUE; + fpi_usb_transfer_submit (etransfer, TIMEOUT, + NULL, + read_msg_extend_cb, udata); + fpi_usb_transfer_unref (etransfer); + return; + } - __handle_incoming_msg(device, udata); + __handle_incoming_msg (device, udata); - return; + return; err: - READ_MSG_DATA_CB_ERR(device, udata, error); - g_free(udata->buffer); - g_free(udata); + READ_MSG_DATA_CB_ERR (device, udata, error); + g_free (udata->buffer); + g_free (udata); } -static void __read_msg_async(FpDevice *device, struct read_msg_data *udata) +static void +__read_msg_async (FpDevice *device, struct read_msg_data *udata) { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(device); + FpiUsbTransfer *transfer = fpi_usb_transfer_new (device); - if (udata->buflen != MSG_READ_BUF_SIZE) { - udata->buffer = g_realloc (udata->buffer, MSG_READ_BUF_SIZE); - udata->buflen = MSG_READ_BUF_SIZE; - } + if (udata->buflen != MSG_READ_BUF_SIZE) + { + udata->buffer = g_realloc (udata->buffer, MSG_READ_BUF_SIZE); + udata->buflen = MSG_READ_BUF_SIZE; + } - fpi_usb_transfer_fill_bulk_full(transfer, EP_IN, udata->buffer, udata->buflen, NULL); - fpi_usb_transfer_submit(transfer, TIMEOUT, NULL, read_msg_cb, udata); - fpi_usb_transfer_unref(transfer); + fpi_usb_transfer_fill_bulk_full (transfer, EP_IN, udata->buffer, udata->buflen, NULL); + fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, read_msg_cb, udata); + fpi_usb_transfer_unref (transfer); } -static void read_msg_async(FpDevice *dev, - read_msg_cb_fn callback, - void *user_data) +static void +read_msg_async (FpDevice *dev, + read_msg_cb_fn callback, + void *user_data) { - struct read_msg_data *udata = g_new0(struct read_msg_data, 1); + struct read_msg_data *udata = g_new0 (struct read_msg_data, 1); - udata->buflen = 0; - udata->buffer = NULL; - udata->callback = callback; - udata->user_data = user_data; - __read_msg_async(dev, udata); + udata->buflen = 0; + udata->buffer = NULL; + udata->callback = callback; + udata->user_data = user_data; + __read_msg_async (dev, udata); } static const unsigned char init_resp03[] = { - 0x01, 0x00, 0xe8, 0x03, 0x00, 0x00, 0xff, 0x07 + 0x01, 0x00, 0xe8, 0x03, 0x00, 0x00, 0xff, 0x07 }; static const unsigned char init28_08[] = { - 0x04, 0x83, 0x00, 0x2c, 0x22, 0x23, 0x97, 0xc9, 0xa7, 0x15, 0xa0, 0x8a, - 0xab, 0x3c, 0xd0, 0xbf, 0xdb, 0xf3, 0x92, 0x6f, 0xae, 0x3b, 0x1e, 0x44, - 0xc4 + 0x04, 0x83, 0x00, 0x2c, 0x22, 0x23, 0x97, 0xc9, 0xa7, 0x15, 0xa0, 0x8a, + 0xab, 0x3c, 0xd0, 0xbf, 0xdb, 0xf3, 0x92, 0x6f, 0xae, 0x3b, 0x1e, 0x44, + 0xc4 }; static const unsigned char init28_0c[] = { - 0x04, 0x03, 0x00, 0x00, 0x00 + 0x04, 0x03, 0x00, 0x00, 0x00 }; static const unsigned char init28_0b[] = { - 0x04, 0x03, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00, 0x64, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0a, - 0x00, 0x64, 0x00, 0xf4, 0x01, 0x32, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00 + 0x04, 0x03, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00, 0x64, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0a, + 0x00, 0x64, 0x00, 0xf4, 0x01, 0x32, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00 }; /* device initialisation state machine */ enum initsm_states { - WRITE_CTRL400 = 0, - READ_MSG03, - SEND_RESP03, - READ_MSG05, - SEND28_06, - READ28_06, - SEND28_07, - READ28_07, - SEND28_08, - READ28_08, - SEND28_0C, - READ28_0C, - SEND28_0B, - READ28_0B, - INITSM_NUM_STATES, + WRITE_CTRL400 = 0, + READ_MSG03, + SEND_RESP03, + READ_MSG05, + SEND28_06, + READ28_06, + SEND28_07, + READ28_07, + SEND28_08, + READ28_08, + SEND28_0C, + READ28_0C, + SEND28_0B, + READ28_0B, + INITSM_NUM_STATES, }; static void -initsm_read_msg_response_cb(FpiSsm *ssm, - FpDevice *dev, - enum read_msg_type type, - guint8 seq, - unsigned char expect_subcmd, - unsigned char subcmd, - GError *error) +initsm_read_msg_response_cb (FpiSsm *ssm, + FpDevice *dev, + enum read_msg_type type, + guint8 seq, + unsigned char expect_subcmd, + unsigned char subcmd, + GError *error) { - FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS(dev); + FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS (dev); - if (error) { - fpi_ssm_mark_failed(ssm, error); - } else if (type != READ_MSG_RESPONSE) { - fp_err("expected response, got %d seq=%x in state %d", type, seq, - fpi_ssm_get_cur_state(ssm)); - fpi_ssm_mark_failed(ssm, - fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Unexpected message type")); - } else if (seq != upekdev->seq) { - fp_warn("expected response to subcmd 0x%02x, got response to %02x in " - "state %d", expect_subcmd, subcmd, - fpi_ssm_get_cur_state(ssm)); - fpi_ssm_mark_failed(ssm, - fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Unexpected response subcommand")); - } else if (seq != upekdev->seq) { - fp_err("expected response to cmd seq=%02x, got response to %02x " - "in state %d", upekdev->seq, seq, - fpi_ssm_get_cur_state(ssm)); - fpi_ssm_mark_failed(ssm, - fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Unexpected sequence number in response")); - } else { - fpi_ssm_next_state(ssm); - } -} - -static void read28_0b_cb(FpDevice *dev, enum read_msg_type type, - guint8 seq, unsigned char subcmd, - unsigned char *data, size_t data_len, - void *user_data, GError *error) -{ - initsm_read_msg_response_cb((FpiSsm *) user_data, dev, type, seq, - 0x0b, subcmd, error); -} - -static void read28_0c_cb(FpDevice *dev, enum read_msg_type type, - guint8 seq, unsigned char subcmd, - unsigned char *data, size_t data_len, - void *user_data, GError *error) -{ - initsm_read_msg_response_cb((FpiSsm *) user_data, dev, type, seq, - 0x0c, subcmd, error); -} - -static void read28_08_cb(FpDevice *dev, enum read_msg_type type, - guint8 seq, unsigned char subcmd, - unsigned char *data, size_t data_len, - void *user_data, GError *error) -{ - initsm_read_msg_response_cb((FpiSsm *) user_data, dev, type, seq, - 0x08, subcmd, error); -} - -static void read28_07_cb(FpDevice *dev, enum read_msg_type type, - guint8 seq, unsigned char subcmd, - unsigned char *data, size_t data_len, - void *user_data, GError *error) -{ - initsm_read_msg_response_cb((FpiSsm *) user_data, dev, type, seq, - 0x07, subcmd, error); -} - -static void read28_06_cb(FpDevice *dev, enum read_msg_type type, - guint8 seq, unsigned char subcmd, - unsigned char *data, size_t data_len, - void *user_data, GError *error) -{ - initsm_read_msg_response_cb((FpiSsm *) user_data, dev, type, seq, - 0x06, subcmd, error); + if (error) + { + fpi_ssm_mark_failed (ssm, error); + } + else if (type != READ_MSG_RESPONSE) + { + fp_err ("expected response, got %d seq=%x in state %d", type, seq, + fpi_ssm_get_cur_state (ssm)); + fpi_ssm_mark_failed (ssm, + fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Unexpected message type")); + } + else if (seq != upekdev->seq) + { + fp_warn ("expected response to subcmd 0x%02x, got response to %02x in " + "state %d", expect_subcmd, subcmd, + fpi_ssm_get_cur_state (ssm)); + fpi_ssm_mark_failed (ssm, + fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Unexpected response subcommand")); + } + else if (seq != upekdev->seq) + { + fp_err ("expected response to cmd seq=%02x, got response to %02x " + "in state %d", upekdev->seq, seq, + fpi_ssm_get_cur_state (ssm)); + fpi_ssm_mark_failed (ssm, + fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Unexpected sequence number in response")); + } + else + { + fpi_ssm_next_state (ssm); + } } static void -initsm_read_msg_cmd_cb(FpiSsm *ssm, - FpDevice *dev, - enum read_msg_type type, - guint8 seq, - guint8 expected_seq, - GError *error) +read28_0b_cb (FpDevice *dev, enum read_msg_type type, + guint8 seq, unsigned char subcmd, + unsigned char *data, size_t data_len, + void *user_data, GError *error) { - FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS(dev); - - if (error) { - fpi_ssm_mark_failed(ssm, error); - return; - } else if (type != READ_MSG_CMD) { - fp_err("expected command, got %d seq=%x in state %d", type, seq, - fpi_ssm_get_cur_state(ssm)); - fpi_ssm_mark_failed(ssm, - fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Expected command but got response")); - return; - } - upekdev->seq = seq; - if (seq != expected_seq) { - fp_err("expected seq=%x, got %x in state %d", expected_seq, seq, - fpi_ssm_get_cur_state(ssm)); - fpi_ssm_mark_failed(ssm, - fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Got unexpected sequence number")); - return; - } - - fpi_ssm_next_state(ssm); -} - -static void read_msg05_cb(FpDevice *dev, enum read_msg_type type, - guint8 seq, unsigned char subcmd, - unsigned char *data, size_t data_len, - void *user_data, GError *error) -{ - initsm_read_msg_cmd_cb((FpiSsm *) user_data, dev, type, 5, seq, error); -} - -static void read_msg03_cb(FpDevice *dev, enum read_msg_type type, - guint8 seq, unsigned char subcmd, - unsigned char *data, size_t data_len, - void *user_data, GError *error) -{ - initsm_read_msg_cmd_cb((FpiSsm *) user_data, dev, type, 3, seq, error); + initsm_read_msg_response_cb ((FpiSsm *) user_data, dev, type, seq, + 0x0b, subcmd, error); } static void -initsm_read_msg_handler(FpiSsm *ssm, - FpDevice *dev, - read_msg_cb_fn callback) +read28_0c_cb (FpDevice *dev, enum read_msg_type type, + guint8 seq, unsigned char subcmd, + unsigned char *data, size_t data_len, + void *user_data, GError *error) { - read_msg_async(dev, callback, ssm); + initsm_read_msg_response_cb ((FpiSsm *) user_data, dev, type, seq, + 0x0c, subcmd, error); } static void -initsm_send_msg28_handler(FpiSsm *ssm, - FpDevice *dev, - unsigned char subcmd, - const unsigned char *data, - guint16 innerlen) +read28_08_cb (FpDevice *dev, enum read_msg_type type, + guint8 seq, unsigned char subcmd, + unsigned char *data, size_t data_len, + void *user_data, GError *error) { - FpiUsbTransfer *transfer; - - transfer = alloc_send_cmd28_transfer(dev, subcmd, data, innerlen); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, fpi_ssm_usb_transfer_cb, NULL); - fpi_usb_transfer_unref (transfer); + initsm_read_msg_response_cb ((FpiSsm *) user_data, dev, type, seq, + 0x08, subcmd, error); } -static void initsm_run_state(FpiSsm *ssm, FpDevice *dev, void *user_data) +static void +read28_07_cb (FpDevice *dev, enum read_msg_type type, + guint8 seq, unsigned char subcmd, + unsigned char *data, size_t data_len, + void *user_data, GError *error) { - FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS(dev); - FpiUsbTransfer *transfer; - - switch (fpi_ssm_get_cur_state(ssm)) { - case WRITE_CTRL400: ; - transfer = fpi_usb_transfer_new(dev); - fpi_usb_transfer_fill_control(transfer, - G_USB_DEVICE_DIRECTION_HOST_TO_DEVICE, - G_USB_DEVICE_REQUEST_TYPE_VENDOR, - G_USB_DEVICE_RECIPIENT_DEVICE, - 0x0c, 0x100, 0x0400, 1); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_submit(transfer, TIMEOUT, NULL, fpi_ssm_usb_transfer_cb, NULL); - fpi_usb_transfer_unref(transfer); - break; - case READ_MSG03: - initsm_read_msg_handler(ssm, dev, read_msg03_cb); - break; - case SEND_RESP03: ; - transfer = alloc_send_cmd28_transfer(dev, ++upekdev->seq, init_resp03, sizeof(init_resp03)); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, fpi_ssm_usb_transfer_cb, NULL); - fpi_usb_transfer_unref (transfer); - break; - case READ_MSG05: - initsm_read_msg_handler(ssm, dev, read_msg05_cb); - break; - case SEND28_06: ; - unsigned char dummy28_06 = 0x04; - upekdev->seq = 0xf0; - initsm_send_msg28_handler(ssm, dev, 0x06, &dummy28_06, 1); - break; - case READ28_06: - initsm_read_msg_handler(ssm, dev, read28_06_cb); - break; - case SEND28_07: ; - unsigned char dummy28_07 = 0x04; - initsm_send_msg28_handler(ssm, dev, 0x07, &dummy28_07, 1); - break; - case READ28_07: - initsm_read_msg_handler(ssm, dev, read28_07_cb); - break; - case SEND28_08: - initsm_send_msg28_handler(ssm, dev, 0x08, init28_08, sizeof(init28_08)); - break; - case READ28_08: - initsm_read_msg_handler(ssm, dev, read28_08_cb); - break; - case SEND28_0C: - initsm_send_msg28_handler(ssm, dev, 0x0c, init28_0c, sizeof(init28_0c)); - break; - case READ28_0C: - initsm_read_msg_handler(ssm, dev, read28_0c_cb); - break; - case SEND28_0B: - initsm_send_msg28_handler(ssm, dev, 0x0b, init28_0b, sizeof(init28_0b)); - break; - case READ28_0B: - initsm_read_msg_handler(ssm, dev, read28_0b_cb); - break; - } + initsm_read_msg_response_cb ((FpiSsm *) user_data, dev, type, seq, + 0x07, subcmd, error); } -static FpiSsm *initsm_new(FpDevice *dev) +static void +read28_06_cb (FpDevice *dev, enum read_msg_type type, + guint8 seq, unsigned char subcmd, + unsigned char *data, size_t data_len, + void *user_data, GError *error) { - return fpi_ssm_new(dev, initsm_run_state, INITSM_NUM_STATES, NULL); + initsm_read_msg_response_cb ((FpiSsm *) user_data, dev, type, seq, + 0x06, subcmd, error); +} + +static void +initsm_read_msg_cmd_cb (FpiSsm *ssm, + FpDevice *dev, + enum read_msg_type type, + guint8 seq, + guint8 expected_seq, + GError *error) +{ + FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS (dev); + + if (error) + { + fpi_ssm_mark_failed (ssm, error); + return; + } + else if (type != READ_MSG_CMD) + { + fp_err ("expected command, got %d seq=%x in state %d", type, seq, + fpi_ssm_get_cur_state (ssm)); + fpi_ssm_mark_failed (ssm, + fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Expected command but got response")); + return; + } + upekdev->seq = seq; + if (seq != expected_seq) + { + fp_err ("expected seq=%x, got %x in state %d", expected_seq, seq, + fpi_ssm_get_cur_state (ssm)); + fpi_ssm_mark_failed (ssm, + fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Got unexpected sequence number")); + return; + } + + fpi_ssm_next_state (ssm); +} + +static void +read_msg05_cb (FpDevice *dev, enum read_msg_type type, + guint8 seq, unsigned char subcmd, + unsigned char *data, size_t data_len, + void *user_data, GError *error) +{ + initsm_read_msg_cmd_cb ((FpiSsm *) user_data, dev, type, 5, seq, error); +} + +static void +read_msg03_cb (FpDevice *dev, enum read_msg_type type, + guint8 seq, unsigned char subcmd, + unsigned char *data, size_t data_len, + void *user_data, GError *error) +{ + initsm_read_msg_cmd_cb ((FpiSsm *) user_data, dev, type, 3, seq, error); +} + +static void +initsm_read_msg_handler (FpiSsm *ssm, + FpDevice *dev, + read_msg_cb_fn callback) +{ + read_msg_async (dev, callback, ssm); +} + +static void +initsm_send_msg28_handler (FpiSsm *ssm, + FpDevice *dev, + unsigned char subcmd, + const unsigned char *data, + guint16 innerlen) +{ + FpiUsbTransfer *transfer; + + transfer = alloc_send_cmd28_transfer (dev, subcmd, data, innerlen); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, fpi_ssm_usb_transfer_cb, NULL); + fpi_usb_transfer_unref (transfer); +} + +static void +initsm_run_state (FpiSsm *ssm, FpDevice *dev, void *user_data) +{ + FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS (dev); + FpiUsbTransfer *transfer; + + switch (fpi_ssm_get_cur_state (ssm)) + { + case WRITE_CTRL400:; + transfer = fpi_usb_transfer_new (dev); + fpi_usb_transfer_fill_control (transfer, + G_USB_DEVICE_DIRECTION_HOST_TO_DEVICE, + G_USB_DEVICE_REQUEST_TYPE_VENDOR, + G_USB_DEVICE_RECIPIENT_DEVICE, + 0x0c, 0x100, 0x0400, 1); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, fpi_ssm_usb_transfer_cb, NULL); + fpi_usb_transfer_unref (transfer); + break; + + case READ_MSG03: + initsm_read_msg_handler (ssm, dev, read_msg03_cb); + break; + + case SEND_RESP03:; + transfer = alloc_send_cmd28_transfer (dev, ++upekdev->seq, init_resp03, sizeof (init_resp03)); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, fpi_ssm_usb_transfer_cb, NULL); + fpi_usb_transfer_unref (transfer); + break; + + case READ_MSG05: + initsm_read_msg_handler (ssm, dev, read_msg05_cb); + break; + + case SEND28_06:; + unsigned char dummy28_06 = 0x04; + upekdev->seq = 0xf0; + initsm_send_msg28_handler (ssm, dev, 0x06, &dummy28_06, 1); + break; + + case READ28_06: + initsm_read_msg_handler (ssm, dev, read28_06_cb); + break; + + case SEND28_07:; + unsigned char dummy28_07 = 0x04; + initsm_send_msg28_handler (ssm, dev, 0x07, &dummy28_07, 1); + break; + + case READ28_07: + initsm_read_msg_handler (ssm, dev, read28_07_cb); + break; + + case SEND28_08: + initsm_send_msg28_handler (ssm, dev, 0x08, init28_08, sizeof (init28_08)); + break; + + case READ28_08: + initsm_read_msg_handler (ssm, dev, read28_08_cb); + break; + + case SEND28_0C: + initsm_send_msg28_handler (ssm, dev, 0x0c, init28_0c, sizeof (init28_0c)); + break; + + case READ28_0C: + initsm_read_msg_handler (ssm, dev, read28_0c_cb); + break; + + case SEND28_0B: + initsm_send_msg28_handler (ssm, dev, 0x0b, init28_0b, sizeof (init28_0b)); + break; + + case READ28_0B: + initsm_read_msg_handler (ssm, dev, read28_0b_cb); + break; + } +} + +static FpiSsm * +initsm_new (FpDevice *dev) +{ + return fpi_ssm_new (dev, initsm_run_state, INITSM_NUM_STATES, NULL); } enum deinitsm_states { - SEND_RESP07 = 0, - READ_MSG01, - DEINITSM_NUM_STATES, + SEND_RESP07 = 0, + READ_MSG01, + DEINITSM_NUM_STATES, }; -static void read_msg01_cb(FpDevice *dev, enum read_msg_type type, - guint8 seq, unsigned char subcmd, - unsigned char *data, size_t data_len, - void *user_data, GError *error) +static void +read_msg01_cb (FpDevice *dev, enum read_msg_type type, + guint8 seq, unsigned char subcmd, + unsigned char *data, size_t data_len, + void *user_data, GError *error) { - FpiSsm *ssm = user_data; - FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS(dev); + FpiSsm *ssm = user_data; + FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS (dev); - if (error) { - fpi_ssm_mark_failed(ssm, error); - return; - } else if (type != READ_MSG_CMD) { - fp_err("expected command, got %d seq=%x", type, seq); - fpi_ssm_mark_failed(ssm, fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Expected command but got response")); - return; - } - upekdev->seq = seq; - if (seq != 1) { - fp_err("expected seq=1, got %x", seq); - fpi_ssm_mark_failed(ssm, fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Got wrong sequence number")); - return; - } + if (error) + { + fpi_ssm_mark_failed (ssm, error); + return; + } + else if (type != READ_MSG_CMD) + { + fp_err ("expected command, got %d seq=%x", type, seq); + fpi_ssm_mark_failed (ssm, fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Expected command but got response")); + return; + } + upekdev->seq = seq; + if (seq != 1) + { + fp_err ("expected seq=1, got %x", seq); + fpi_ssm_mark_failed (ssm, fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Got wrong sequence number")); + return; + } - fpi_ssm_next_state(ssm); + fpi_ssm_next_state (ssm); } -static void deinitsm_state_handler(FpiSsm *ssm, FpDevice *dev, - void *user_data) +static void +deinitsm_state_handler (FpiSsm *ssm, FpDevice *dev, + void *user_data) { - switch (fpi_ssm_get_cur_state(ssm)) { - case SEND_RESP07: ; - FpiUsbTransfer *transfer; - unsigned char dummy = 0; + switch (fpi_ssm_get_cur_state (ssm)) + { + case SEND_RESP07:; + FpiUsbTransfer *transfer; + unsigned char dummy = 0; - transfer = alloc_send_cmdresponse_transfer(dev, 0x07, &dummy, 1); - transfer->short_is_error = TRUE; - transfer->ssm = ssm; - fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, fpi_ssm_usb_transfer_cb, NULL); - fpi_usb_transfer_unref (transfer); - break; - case READ_MSG01: ; - read_msg_async(dev, read_msg01_cb, ssm); - break; - } + transfer = alloc_send_cmdresponse_transfer (dev, 0x07, &dummy, 1); + transfer->short_is_error = TRUE; + transfer->ssm = ssm; + fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, fpi_ssm_usb_transfer_cb, NULL); + fpi_usb_transfer_unref (transfer); + break; + + case READ_MSG01:; + read_msg_async (dev, read_msg01_cb, ssm); + break; + } } -static void initsm_done(FpiSsm *ssm, FpDevice *dev, void *user_data, GError *error) +static void +initsm_done (FpiSsm *ssm, FpDevice *dev, void *user_data, GError *error) { - if (error) - g_usb_device_release_interface (fpi_device_get_usb_device(dev), 0, 0, NULL); + if (error) + g_usb_device_release_interface (fpi_device_get_usb_device (dev), 0, 0, NULL); - fpi_device_open_complete (dev, error); + fpi_device_open_complete (dev, error); } -static FpiSsm *deinitsm_new(FpDevice *dev, void *user_data) +static FpiSsm * +deinitsm_new (FpDevice *dev, void *user_data) { - return fpi_ssm_new(dev, deinitsm_state_handler, DEINITSM_NUM_STATES, user_data); + return fpi_ssm_new (dev, deinitsm_state_handler, DEINITSM_NUM_STATES, user_data); } -static void dev_init(FpDevice *dev) +static void +dev_init (FpDevice *dev) { - FpiSsm *ssm; - GError *error = NULL; - FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS (dev); + FpiSsm *ssm; + GError *error = NULL; + FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS (dev); - if (!g_usb_device_claim_interface (fpi_device_get_usb_device(dev), 0, 0, &error)) { - fpi_device_open_complete (dev, error); - return; - } + if (!g_usb_device_claim_interface (fpi_device_get_usb_device (dev), 0, 0, &error)) + { + fpi_device_open_complete (dev, error); + return; + } - upekdev->seq = 0xf0; /* incremented to 0x00 before first cmd */ + upekdev->seq = 0xf0; /* incremented to 0x00 before first cmd */ - ssm = fpi_ssm_new(dev, initsm_run_state, INITSM_NUM_STATES, NULL); - fpi_ssm_start (ssm, initsm_done); + ssm = fpi_ssm_new (dev, initsm_run_state, INITSM_NUM_STATES, NULL); + fpi_ssm_start (ssm, initsm_done); } -static void deinitsm_done(FpiSsm *ssm, FpDevice *dev, void *user_data, GError *error) +static void +deinitsm_done (FpiSsm *ssm, FpDevice *dev, void *user_data, GError *error) { - g_usb_device_release_interface (fpi_device_get_usb_device(dev), 0, 0, NULL); + g_usb_device_release_interface (fpi_device_get_usb_device (dev), 0, 0, NULL); - fpi_device_close_complete (dev, error); + fpi_device_close_complete (dev, error); } -static void dev_exit(FpDevice *dev) +static void +dev_exit (FpDevice *dev) { - FpiSsm *ssm; + FpiSsm *ssm; - ssm = fpi_ssm_new(dev, deinitsm_state_handler, DEINITSM_NUM_STATES, NULL); - fpi_ssm_start (ssm, deinitsm_done); + ssm = fpi_ssm_new (dev, deinitsm_state_handler, DEINITSM_NUM_STATES, NULL); + fpi_ssm_start (ssm, deinitsm_done); } static const unsigned char enroll_init[] = { - 0x02, 0xc0, 0xd4, 0x01, 0x00, 0x04, 0x00, 0x08 + 0x02, 0xc0, 0xd4, 0x01, 0x00, 0x04, 0x00, 0x08 }; static const unsigned char scan_comp[] = { - 0x12, 0xff, 0xff, 0xff, 0xff /* scan completion, prefixes print data */ + 0x12, 0xff, 0xff, 0xff, 0xff /* scan completion, prefixes print data */ }; /* used for enrollment and verification */ static const unsigned char poll_data[] = { 0x30, 0x01 }; enum enroll_start_sm_states { - RUN_INITSM = 0, - ENROLL_INIT, - READ_ENROLL_MSG28, - ENROLL_START_NUM_STATES, + RUN_INITSM = 0, + ENROLL_INIT, + READ_ENROLL_MSG28, + ENROLL_START_NUM_STATES, }; -static void enroll_start_sm_cb_msg28(FpDevice *dev, - enum read_msg_type type, guint8 seq, - unsigned char subcmd, - unsigned char *data, size_t data_len, - void *user_data, - GError *error) +static void +enroll_start_sm_cb_msg28 (FpDevice *dev, + enum read_msg_type type, guint8 seq, + unsigned char subcmd, + unsigned char *data, size_t data_len, + void *user_data, + GError *error) { - FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS(dev); - FpiSsm *ssm = user_data; + FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS (dev); + FpiSsm *ssm = user_data; - if (error) { - fpi_ssm_mark_failed(ssm, error); - } - if (type != READ_MSG_RESPONSE) { - fp_err("expected response, got %d seq=%x", type, seq); - fpi_ssm_mark_failed(ssm, fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Unexpected response type")); - } else if (subcmd != 0) { - fp_warn("expected response to subcmd 0, got response to %02x", - subcmd); - fpi_ssm_mark_failed(ssm, fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Got response to wrong subcommand")); - } else if (seq != upekdev->seq) { - fp_err("expected response to cmd seq=%02x, got response to %02x", - upekdev->seq, seq); - fpi_ssm_mark_failed(ssm, fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Got response with wrong sequence number")); - } else { - fpi_ssm_next_state(ssm); - } + if (error) + fpi_ssm_mark_failed (ssm, error); + if (type != READ_MSG_RESPONSE) + { + fp_err ("expected response, got %d seq=%x", type, seq); + fpi_ssm_mark_failed (ssm, fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Unexpected response type")); + } + else if (subcmd != 0) + { + fp_warn ("expected response to subcmd 0, got response to %02x", + subcmd); + fpi_ssm_mark_failed (ssm, fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Got response to wrong subcommand")); + } + else if (seq != upekdev->seq) + { + fp_err ("expected response to cmd seq=%02x, got response to %02x", + upekdev->seq, seq); + fpi_ssm_mark_failed (ssm, fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Got response with wrong sequence number")); + } + else + { + fpi_ssm_next_state (ssm); + } } -static void enroll_start_sm_run_state(FpiSsm *ssm, FpDevice *dev, - void *user_data) +static void +enroll_start_sm_run_state (FpiSsm *ssm, FpDevice *dev, + void *user_data) { - switch (fpi_ssm_get_cur_state(ssm)) { - case RUN_INITSM: ; - FpiSsm *initsm = initsm_new(dev); - fpi_ssm_start_subsm(ssm, initsm); - break; - case ENROLL_INIT: ; - FpiUsbTransfer *transfer; - transfer = alloc_send_cmd28_transfer(dev, 0x02, enroll_init, sizeof(enroll_init)); - transfer->short_is_error = TRUE; - transfer->ssm = ssm; + switch (fpi_ssm_get_cur_state (ssm)) + { + case RUN_INITSM:; + FpiSsm *initsm = initsm_new (dev); + fpi_ssm_start_subsm (ssm, initsm); + break; - fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, fpi_ssm_usb_transfer_cb, NULL); - fpi_usb_transfer_unref (transfer); - break; - case READ_ENROLL_MSG28: ; - /* FIXME: protocol misunderstanding here. device receives response - * to subcmd 0 after submitting subcmd 2? */ - /* actually this is probably a poll response? does the above cmd - * include a 30 01 poll somewhere? */ - read_msg_async(dev, enroll_start_sm_cb_msg28, ssm); - break; - } + case ENROLL_INIT:; + FpiUsbTransfer *transfer; + transfer = alloc_send_cmd28_transfer (dev, 0x02, enroll_init, sizeof (enroll_init)); + transfer->short_is_error = TRUE; + transfer->ssm = ssm; + + fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, fpi_ssm_usb_transfer_cb, NULL); + fpi_usb_transfer_unref (transfer); + break; + + case READ_ENROLL_MSG28:; + /* FIXME: protocol misunderstanding here. device receives response + * to subcmd 0 after submitting subcmd 2? */ + /* actually this is probably a poll response? does the above cmd + * include a 30 01 poll somewhere? */ + read_msg_async (dev, enroll_start_sm_cb_msg28, ssm); + break; + } } -typedef struct { - FpPrint *print; - GError *error; +typedef struct +{ + FpPrint *print; + GError *error; } EnrollStopData; -static void enroll_stop_deinit_cb(FpiSsm *ssm, FpDevice *dev, - void *user_data, GError *error) +static void +enroll_stop_deinit_cb (FpiSsm *ssm, FpDevice *dev, + void *user_data, GError *error) { - EnrollStopData *data = user_data; + EnrollStopData *data = user_data; - /* don't really care about errors */ - if (error) { - fp_warn ("Error deinitializing: %s", error->message); - g_error_free (error); - } + /* don't really care about errors */ + if (error) + { + fp_warn ("Error deinitializing: %s", error->message); + g_error_free (error); + } - fpi_device_enroll_complete (dev, data->print, data->error); - g_free (data); - fpi_ssm_free(ssm); + fpi_device_enroll_complete (dev, data->print, data->error); + g_free (data); + fpi_ssm_free (ssm); } -static void do_enroll_stop(FpDevice *dev, FpPrint *print, GError *error) +static void +do_enroll_stop (FpDevice *dev, FpPrint *print, GError *error) { - EnrollStopData *data = g_new0(EnrollStopData, 1); - FpiSsm *ssm = deinitsm_new(dev, data); + EnrollStopData *data = g_new0 (EnrollStopData, 1); + FpiSsm *ssm = deinitsm_new (dev, data); - data->print = print; - data->error = error; + data->print = print; + data->error = error; - fpi_ssm_start(ssm, enroll_stop_deinit_cb); + fpi_ssm_start (ssm, enroll_stop_deinit_cb); } -static void enroll_iterate(FpDevice *dev); +static void enroll_iterate (FpDevice *dev); -static void e_handle_resp00(FpDevice *dev, unsigned char *data, - size_t data_len) +static void +e_handle_resp00 (FpDevice *dev, unsigned char *data, + size_t data_len) { - FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS(dev); - unsigned char status; + FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS (dev); + unsigned char status; - if (data_len != 14) { - fp_err("received 3001 poll response of %lu bytes?", data_len); - do_enroll_stop (dev, NULL, - fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "received 3001 response with wrong length")); - return; - } + if (data_len != 14) + { + fp_err ("received 3001 poll response of %lu bytes?", data_len); + do_enroll_stop (dev, NULL, + fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "received 3001 response with wrong length")); + return; + } - status = data[5]; - fp_dbg("poll result = %02x", status); + status = data[5]; + fp_dbg ("poll result = %02x", status); - switch (status) { - case 0x0c: - case 0x0d: - case 0x0e: - case 0x26: - case 0x27: - case 0x2e: - /* if we previously completed a non-last enrollment stage, we'll - * get this code to indicate successful stage completion */ - if (upekdev->enroll_passed) { - upekdev->enroll_passed = FALSE; - upekdev->enroll_stage += 1; + switch (status) + { + case 0x0c: + case 0x0d: + case 0x0e: + case 0x26: + case 0x27: + case 0x2e: + /* if we previously completed a non-last enrollment stage, we'll + * get this code to indicate successful stage completion */ + if (upekdev->enroll_passed) + { + upekdev->enroll_passed = FALSE; + upekdev->enroll_stage += 1; - fpi_device_enroll_progress (dev, upekdev->enroll_stage, NULL, NULL); - } - /* otherwise it just means "no news" so we poll again */ - break; - case 0x1c: /* FIXME what does this one mean? */ - case 0x0b: /* FIXME what does this one mean? */ - case 0x23: /* FIXME what does this one mean? */ - fpi_device_enroll_progress (dev, - upekdev->enroll_stage, - NULL, - fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL)); - break; - case 0x0f: /* scan taking too long, remove finger and try again */ - fpi_device_enroll_progress (dev, - upekdev->enroll_stage, - NULL, - fpi_device_retry_new (FP_DEVICE_RETRY_REMOVE_FINGER)); - break; - case 0x1e: /* swipe too short */ - fpi_device_enroll_progress (dev, - upekdev->enroll_stage, - NULL, - fpi_device_retry_new (FP_DEVICE_RETRY_TOO_SHORT)); - break; - case 0x24: /* finger not centered */ - fpi_device_enroll_progress (dev, - upekdev->enroll_stage, - NULL, - fpi_device_retry_new (FP_DEVICE_RETRY_CENTER_FINGER)); - break; - case 0x20: - /* finger scanned successfully */ - /* need to look at the next poll result to determine if enrollment is - * complete or not */ - upekdev->enroll_passed = TRUE; - break; - case 0x00: /* enrollment complete */ - /* we can now expect the enrollment data on the next poll, so we - * have nothing to do here */ - break; - default: - do_enroll_stop (dev, - NULL, - fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Unrecognised scan status code")); - /* Stop iteration. */ - return; - } - enroll_iterate(dev); + fpi_device_enroll_progress (dev, upekdev->enroll_stage, NULL, NULL); + } + /* otherwise it just means "no news" so we poll again */ + break; - /* FIXME: need to extend protocol research to handle the case when - * enrolment fails, e.g. you scan a different finger on each stage */ - /* FIXME: should do proper tracking of when we expect cmd0 results and - * cmd2 results and enforce it */ + case 0x1c: /* FIXME what does this one mean? */ + case 0x0b: /* FIXME what does this one mean? */ + case 0x23: /* FIXME what does this one mean? */ + fpi_device_enroll_progress (dev, + upekdev->enroll_stage, + NULL, + fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL)); + break; + + case 0x0f: /* scan taking too long, remove finger and try again */ + fpi_device_enroll_progress (dev, + upekdev->enroll_stage, + NULL, + fpi_device_retry_new (FP_DEVICE_RETRY_REMOVE_FINGER)); + break; + + case 0x1e: /* swipe too short */ + fpi_device_enroll_progress (dev, + upekdev->enroll_stage, + NULL, + fpi_device_retry_new (FP_DEVICE_RETRY_TOO_SHORT)); + break; + + case 0x24: /* finger not centered */ + fpi_device_enroll_progress (dev, + upekdev->enroll_stage, + NULL, + fpi_device_retry_new (FP_DEVICE_RETRY_CENTER_FINGER)); + break; + + case 0x20: + /* finger scanned successfully */ + /* need to look at the next poll result to determine if enrollment is + * complete or not */ + upekdev->enroll_passed = TRUE; + break; + + case 0x00: /* enrollment complete */ + /* we can now expect the enrollment data on the next poll, so we + * have nothing to do here */ + break; + + default: + do_enroll_stop (dev, + NULL, + fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Unrecognised scan status code")); + /* Stop iteration. */ + return; + } + enroll_iterate (dev); + + /* FIXME: need to extend protocol research to handle the case when + * enrolment fails, e.g. you scan a different finger on each stage */ + /* FIXME: should do proper tracking of when we expect cmd0 results and + * cmd2 results and enforce it */ } -static void e_handle_resp02(FpDevice *dev, unsigned char *data, - size_t data_len) +static void +e_handle_resp02 (FpDevice *dev, unsigned char *data, + size_t data_len) { - FpPrint *print = NULL; - GError *error = NULL; + FpPrint *print = NULL; + GError *error = NULL; - if (data_len < sizeof(scan_comp)) { - fp_err("fingerprint data too short (%lu bytes)", data_len); - error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, "fingerprint data too short"); - } else if (memcmp(data, scan_comp, sizeof(scan_comp)) != 0) { - fp_err("unrecognised data prefix %x %x %x %x %x", - data[0], data[1], data[2], data[3], data[4]); - error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, "fingerprint data has wrong prefix"); - } else { - GVariant *fp_data; - print = fp_print_new (dev); + if (data_len < sizeof (scan_comp)) + { + fp_err ("fingerprint data too short (%lu bytes)", data_len); + error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, "fingerprint data too short"); + } + else if (memcmp (data, scan_comp, sizeof (scan_comp)) != 0) + { + fp_err ("unrecognised data prefix %x %x %x %x %x", + data[0], data[1], data[2], data[3], data[4]); + error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, "fingerprint data has wrong prefix"); + } + else + { + GVariant *fp_data; + print = fp_print_new (dev); - fpi_device_get_enroll_data (dev, &print); + fpi_device_get_enroll_data (dev, &print); - fp_data = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, - data + sizeof(scan_comp), - data_len - sizeof(scan_comp), - 1); + fp_data = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, + data + sizeof (scan_comp), + data_len - sizeof (scan_comp), + 1); - g_object_set (print, "fp-data", fp_data, NULL); - g_object_ref (print); - } + g_object_set (print, "fp-data", fp_data, NULL); + g_object_ref (print); + } - do_enroll_stop (dev, print, error); + do_enroll_stop (dev, print, error); } -static void enroll_iterate_msg_cb(FpDevice *dev, - enum read_msg_type msgtype, guint8 seq, - unsigned char subcmd, - unsigned char *data, size_t data_len, - void *user_data, - GError *error) +static void +enroll_iterate_msg_cb (FpDevice *dev, + enum read_msg_type msgtype, guint8 seq, + unsigned char subcmd, + unsigned char *data, size_t data_len, + void *user_data, + GError *error) { - if (error) { - do_enroll_stop (dev, NULL, error); - return; - } else if (msgtype != READ_MSG_RESPONSE) { - fp_err("expected response, got %d seq=%x", msgtype, seq); - do_enroll_stop (dev, NULL, - fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Expected message response, not command")); - return; - } - if (subcmd == 0) { - e_handle_resp00(dev, data, data_len); - } else if (subcmd == 2) { - e_handle_resp02(dev, data, data_len); - } else { - fp_err("unexpected subcmd %d", subcmd); - do_enroll_stop (dev, NULL, - fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Unexpected subcommand")); - } + if (error) + { + do_enroll_stop (dev, NULL, error); + return; + } + else if (msgtype != READ_MSG_RESPONSE) + { + fp_err ("expected response, got %d seq=%x", msgtype, seq); + do_enroll_stop (dev, NULL, + fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Expected message response, not command")); + return; + } + if (subcmd == 0) + { + e_handle_resp00 (dev, data, data_len); + } + else if (subcmd == 2) + { + e_handle_resp02 (dev, data, data_len); + } + else + { + fp_err ("unexpected subcmd %d", subcmd); + do_enroll_stop (dev, NULL, + fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Unexpected subcommand")); + } } -static void enroll_iterate_cmd_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +enroll_iterate_cmd_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - if (error) { - do_enroll_stop(device, NULL, error); - } else { - read_msg_async(device, enroll_iterate_msg_cb, NULL); - } + if (error) + do_enroll_stop (device, NULL, error); + else + read_msg_async (device, enroll_iterate_msg_cb, NULL); } -static void enroll_iterate(FpDevice *dev) +static void +enroll_iterate (FpDevice *dev) { - FpiUsbTransfer *transfer; + FpiUsbTransfer *transfer; - if (fpi_device_action_is_cancelled (dev)) { - do_enroll_stop(dev, NULL, g_error_new_literal (G_IO_ERROR, G_IO_ERROR_CANCELLED, "Cancelled")); - return; - } + if (fpi_device_action_is_cancelled (dev)) + { + do_enroll_stop (dev, NULL, g_error_new_literal (G_IO_ERROR, G_IO_ERROR_CANCELLED, "Cancelled")); + return; + } - transfer = alloc_send_cmd28_transfer(dev, 0x00, - poll_data, sizeof(poll_data)); - transfer->short_is_error = TRUE; + transfer = alloc_send_cmd28_transfer (dev, 0x00, + poll_data, sizeof (poll_data)); + transfer->short_is_error = TRUE; - fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, enroll_iterate_cmd_cb, NULL); - fpi_usb_transfer_unref (transfer); + fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, enroll_iterate_cmd_cb, NULL); + fpi_usb_transfer_unref (transfer); } -static void enroll_started(FpiSsm *ssm, FpDevice *dev, void *user_data, - GError *error) +static void +enroll_started (FpiSsm *ssm, FpDevice *dev, void *user_data, + GError *error) { - if (error) { - do_enroll_stop (dev, NULL, error); - } else { - enroll_iterate(dev); - } + if (error) + do_enroll_stop (dev, NULL, error); + else + enroll_iterate (dev); - fpi_ssm_free(ssm); + fpi_ssm_free (ssm); } -static void enroll(FpDevice *dev) +static void +enroll (FpDevice *dev) { - FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS(dev); + FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS (dev); - /* do_init state machine first */ - FpiSsm *ssm = fpi_ssm_new(dev, enroll_start_sm_run_state, - ENROLL_START_NUM_STATES, NULL); + /* do_init state machine first */ + FpiSsm *ssm = fpi_ssm_new (dev, enroll_start_sm_run_state, + ENROLL_START_NUM_STATES, NULL); - upekdev->enroll_passed = FALSE; - upekdev->enroll_stage = 0; - fpi_ssm_start(ssm, enroll_started); + upekdev->enroll_passed = FALSE; + upekdev->enroll_stage = 0; + fpi_ssm_start (ssm, enroll_started); } -typedef struct { - FpiMatchResult res; - GError *error; +typedef struct +{ + FpiMatchResult res; + GError *error; } VerifyStopData; -static void verify_stop_deinit_cb(FpiSsm *ssm, FpDevice *dev, - void *user_data, GError *error) +static void +verify_stop_deinit_cb (FpiSsm *ssm, FpDevice *dev, + void *user_data, GError *error) { - VerifyStopData *data = user_data; + VerifyStopData *data = user_data; - if (error) { - fp_warn ("Error deinitializing: %s", error->message); - g_error_free (error); - } + if (error) + { + fp_warn ("Error deinitializing: %s", error->message); + g_error_free (error); + } - fpi_device_verify_complete (dev, data->res, NULL, data->error); - g_free (data); - fpi_ssm_free(ssm); + fpi_device_verify_complete (dev, data->res, NULL, data->error); + g_free (data); + fpi_ssm_free (ssm); } -static void do_verify_stop(FpDevice *dev, FpiMatchResult res, GError *error) +static void +do_verify_stop (FpDevice *dev, FpiMatchResult res, GError *error) { - VerifyStopData *data = g_new0(VerifyStopData, 1); - FpiSsm *ssm = deinitsm_new(dev, data); + VerifyStopData *data = g_new0 (VerifyStopData, 1); + FpiSsm *ssm = deinitsm_new (dev, data); - data->res = res; - data->error = error; + data->res = res; + data->error = error; - fpi_ssm_start(ssm, verify_stop_deinit_cb); + fpi_ssm_start (ssm, verify_stop_deinit_cb); } static const unsigned char verify_hdr[] = { - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xc0, 0xd4, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, - 0x00 + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xd4, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00 }; enum { - VERIFY_RUN_INITSM = 0, - VERIFY_INIT, - VERIFY_NUM_STATES, + VERIFY_RUN_INITSM = 0, + VERIFY_INIT, + VERIFY_NUM_STATES, }; -static void verify_start_sm_run_state(FpiSsm *ssm, FpDevice *dev, - void *user_data) +static void +verify_start_sm_run_state (FpiSsm *ssm, FpDevice *dev, + void *user_data) { - FpPrint *print; - g_autoptr(GVariant) fp_data = NULL; - FpiUsbTransfer *transfer; - gsize data_len; - const guint8 *data; - guint8 *msg; - gsize msg_len; + FpPrint *print; - switch (fpi_ssm_get_cur_state(ssm)) { - case VERIFY_RUN_INITSM: ; - FpiSsm *initsm = initsm_new(dev); - fpi_ssm_start_subsm(ssm, initsm); - break; - case VERIFY_INIT: - fpi_device_get_verify_data (dev, &print); - g_object_get (dev, "fp-data", &fp_data, NULL); + g_autoptr(GVariant) fp_data = NULL; + FpiUsbTransfer *transfer; + gsize data_len; + const guint8 *data; + guint8 *msg; + gsize msg_len; - data = g_variant_get_fixed_array (fp_data, &data_len, 1); + switch (fpi_ssm_get_cur_state (ssm)) + { + case VERIFY_RUN_INITSM:; + FpiSsm *initsm = initsm_new (dev); + fpi_ssm_start_subsm (ssm, initsm); + break; - msg_len = sizeof(verify_hdr) + data_len; - msg = g_malloc (msg_len); + case VERIFY_INIT: + fpi_device_get_verify_data (dev, &print); + g_object_get (dev, "fp-data", &fp_data, NULL); - memcpy(msg, verify_hdr, sizeof(verify_hdr)); - memcpy(msg + sizeof(verify_hdr), data, data_len); + data = g_variant_get_fixed_array (fp_data, &data_len, 1); - transfer = alloc_send_cmd28_transfer(dev, 0x03, data, data_len); + msg_len = sizeof (verify_hdr) + data_len; + msg = g_malloc (msg_len); - g_free(msg); + memcpy (msg, verify_hdr, sizeof (verify_hdr)); + memcpy (msg + sizeof (verify_hdr), data, data_len); - transfer->short_is_error = TRUE; - transfer->ssm = ssm; - fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, fpi_ssm_usb_transfer_cb, NULL); - fpi_usb_transfer_unref (transfer); + transfer = alloc_send_cmd28_transfer (dev, 0x03, data, data_len); - break; - } + g_free (msg); + + transfer->short_is_error = TRUE; + transfer->ssm = ssm; + fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, fpi_ssm_usb_transfer_cb, NULL); + fpi_usb_transfer_unref (transfer); + + break; + } } -static void verify_iterate(FpDevice *dev); +static void verify_iterate (FpDevice *dev); -static void v_handle_resp00(FpDevice *dev, unsigned char *data, - size_t data_len) +static void +v_handle_resp00 (FpDevice *dev, unsigned char *data, + size_t data_len) { - unsigned char status; - GError *error = NULL; + unsigned char status; + GError *error = NULL; - if (data_len != 14) { - fp_warn("received 3001 poll response of %lu bytes?", data_len); - error = fpi_device_error_new (FP_DEVICE_ERROR_PROTO); - goto out; - } + if (data_len != 14) + { + fp_warn ("received 3001 poll response of %lu bytes?", data_len); + error = fpi_device_error_new (FP_DEVICE_ERROR_PROTO); + goto out; + } - status = data[5]; - fp_dbg("poll result = %02x", status); + status = data[5]; + fp_dbg ("poll result = %02x", status); - /* These codes indicate that we're waiting for a finger scan, so poll - * again */ - switch (status) { - case 0x0c: /* no news, poll again */ - break; - case 0x20: - fp_dbg("processing scan for verification"); - break; - case 0x00: - fp_dbg("good image"); - break; - case 0x1c: /* FIXME what does this one mean? */ - case 0x0b: /* FIXME what does this one mean? */ - case 0x23: /* FIXME what does this one mean? */ - error = fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL); - break; - case 0x0f: /* scan taking too long, remove finger and try again */ - error = fpi_device_retry_new (FP_DEVICE_RETRY_REMOVE_FINGER); - break; - case 0x1e: /* swipe too short */ - error = fpi_device_retry_new (FP_DEVICE_RETRY_TOO_SHORT); - break; - case 0x24: /* finger not centered */ - error = fpi_device_retry_new (FP_DEVICE_RETRY_CENTER_FINGER); - break; - default: - fp_err("unrecognised verify status code %02x", status); - error = fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL); - } + /* These codes indicate that we're waiting for a finger scan, so poll + * again */ + switch (status) + { + case 0x0c: /* no news, poll again */ + break; + + case 0x20: + fp_dbg ("processing scan for verification"); + break; + + case 0x00: + fp_dbg ("good image"); + break; + + case 0x1c: /* FIXME what does this one mean? */ + case 0x0b: /* FIXME what does this one mean? */ + case 0x23: /* FIXME what does this one mean? */ + error = fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL); + break; + + case 0x0f: /* scan taking too long, remove finger and try again */ + error = fpi_device_retry_new (FP_DEVICE_RETRY_REMOVE_FINGER); + break; + + case 0x1e: /* swipe too short */ + error = fpi_device_retry_new (FP_DEVICE_RETRY_TOO_SHORT); + break; + + case 0x24: /* finger not centered */ + error = fpi_device_retry_new (FP_DEVICE_RETRY_CENTER_FINGER); + break; + + default: + fp_err ("unrecognised verify status code %02x", status); + error = fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL); + } out: - if (error) - do_verify_stop (dev, FPI_MATCH_ERROR, error); - else - verify_iterate(dev); + if (error) + do_verify_stop (dev, FPI_MATCH_ERROR, error); + else + verify_iterate (dev); } -static void v_handle_resp03(FpDevice *dev, unsigned char *data, - size_t data_len) +static void +v_handle_resp03 (FpDevice *dev, unsigned char *data, + size_t data_len) { - FpiMatchResult r; - GError *error = NULL; + FpiMatchResult r; + GError *error = NULL; - if (data_len < 2) { - fp_warn("verify result abnormally short!"); - r = FPI_MATCH_ERROR; - error = fpi_device_error_new (FP_DEVICE_ERROR_PROTO); - } else if (data[0] != 0x12) { - fp_warn("unexpected verify header byte %02x", data[0]); - r = FPI_MATCH_ERROR; - error = fpi_device_error_new (FP_DEVICE_ERROR_PROTO); - } else if (data[1] == 0x00) { - r = FPI_MATCH_FAIL; - } else if (data[1] == 0x01) { - r = FPI_MATCH_SUCCESS; - } else { - fp_warn("unrecognised verify result %02x", data[1]); - r = FPI_MATCH_ERROR; - error = fpi_device_error_new (FP_DEVICE_ERROR_PROTO); - } - do_verify_stop(dev, r, error); + if (data_len < 2) + { + fp_warn ("verify result abnormally short!"); + r = FPI_MATCH_ERROR; + error = fpi_device_error_new (FP_DEVICE_ERROR_PROTO); + } + else if (data[0] != 0x12) + { + fp_warn ("unexpected verify header byte %02x", data[0]); + r = FPI_MATCH_ERROR; + error = fpi_device_error_new (FP_DEVICE_ERROR_PROTO); + } + else if (data[1] == 0x00) + { + r = FPI_MATCH_FAIL; + } + else if (data[1] == 0x01) + { + r = FPI_MATCH_SUCCESS; + } + else + { + fp_warn ("unrecognised verify result %02x", data[1]); + r = FPI_MATCH_ERROR; + error = fpi_device_error_new (FP_DEVICE_ERROR_PROTO); + } + do_verify_stop (dev, r, error); } -static void verify_rd2800_cb(FpDevice *dev, enum read_msg_type msgtype, - guint8 seq, unsigned char subcmd, - unsigned char *data, size_t data_len, - void *user_data, - GError *error) +static void +verify_rd2800_cb (FpDevice *dev, enum read_msg_type msgtype, + guint8 seq, unsigned char subcmd, + unsigned char *data, size_t data_len, + void *user_data, + GError *error) { - FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS(dev); + FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS (dev); - if (error) { - do_verify_stop (dev, FPI_MATCH_ERROR, error); - return; - } + if (error) + { + do_verify_stop (dev, FPI_MATCH_ERROR, error); + return; + } - if (msgtype != READ_MSG_RESPONSE) { - fp_warn("expected response, got %d seq=%x", msgtype, seq); - do_verify_stop (dev, - FPI_MATCH_ERROR, - fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Expected message response")); - return; - } + if (msgtype != READ_MSG_RESPONSE) + { + fp_warn ("expected response, got %d seq=%x", msgtype, seq); + do_verify_stop (dev, + FPI_MATCH_ERROR, + fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Expected message response")); + return; + } - if (seq != upekdev->seq) { - fp_warn("expected response to cmd seq=%02x, got response to %02x", - upekdev->seq, seq); - do_verify_stop (dev, - FPI_MATCH_ERROR, - fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Response hat wrong command sequence")); - return; - } + if (seq != upekdev->seq) + { + fp_warn ("expected response to cmd seq=%02x, got response to %02x", + upekdev->seq, seq); + do_verify_stop (dev, + FPI_MATCH_ERROR, + fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Response hat wrong command sequence")); + return; + } - if (subcmd == 0) - v_handle_resp00(dev, data, data_len); - else if (subcmd == 3) - v_handle_resp03(dev, data, data_len); - else - do_verify_stop (dev, - FPI_MATCH_ERROR, - fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, - "Response had wrong subcommand type")); + if (subcmd == 0) + { + v_handle_resp00 (dev, data, data_len); + } + else if (subcmd == 3) + { + v_handle_resp03 (dev, data, data_len); + } + else + { + do_verify_stop (dev, + FPI_MATCH_ERROR, + fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Response had wrong subcommand type")); + } } -static void verify_wr2800_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +verify_wr2800_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - if (error) { - do_verify_stop (device, - FPI_MATCH_ERROR, - error); - } else { - read_msg_async(device, verify_rd2800_cb, NULL); - } + if (error) + { + do_verify_stop (device, + FPI_MATCH_ERROR, + error); + } + else + { + read_msg_async (device, verify_rd2800_cb, NULL); + } } -static void verify_iterate(FpDevice *dev) +static void +verify_iterate (FpDevice *dev) { - FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS(dev); + FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS (dev); - if (fpi_device_action_is_cancelled (dev)) { - do_verify_stop(dev, FPI_MATCH_ERROR, g_error_new_literal (G_IO_ERROR, G_IO_ERROR_CANCELLED, "Cancelled")); - return; - } + if (fpi_device_action_is_cancelled (dev)) + { + do_verify_stop (dev, FPI_MATCH_ERROR, g_error_new_literal (G_IO_ERROR, G_IO_ERROR_CANCELLED, "Cancelled")); + return; + } - /* FIXME: this doesn't flow well, should the first cmd be moved from - * verify init to here? */ - if (upekdev->first_verify_iteration) { - read_msg_async(dev, verify_rd2800_cb, NULL); - upekdev->first_verify_iteration = FALSE; - } else { - FpiUsbTransfer *transfer = alloc_send_cmd28_transfer(dev, - 0x00, poll_data, sizeof(poll_data)); - transfer->short_is_error = TRUE; + /* FIXME: this doesn't flow well, should the first cmd be moved from + * verify init to here? */ + if (upekdev->first_verify_iteration) + { + read_msg_async (dev, verify_rd2800_cb, NULL); + upekdev->first_verify_iteration = FALSE; + } + else + { + FpiUsbTransfer *transfer = alloc_send_cmd28_transfer (dev, + 0x00, poll_data, sizeof (poll_data)); + transfer->short_is_error = TRUE; - fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, verify_wr2800_cb, NULL); - fpi_usb_transfer_unref (transfer); - } + fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, verify_wr2800_cb, NULL); + fpi_usb_transfer_unref (transfer); + } } -static void verify_started(FpiSsm *ssm, FpDevice *dev, void *user_data, - GError *error) +static void +verify_started (FpiSsm *ssm, FpDevice *dev, void *user_data, + GError *error) { - FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS(dev); + FpiDeviceUpekts *upekdev = FPI_DEVICE_UPEKTS (dev); - if (error) { - do_verify_stop (dev, FPI_MATCH_ERROR, error); - return; - } + if (error) + { + do_verify_stop (dev, FPI_MATCH_ERROR, error); + return; + } - upekdev->first_verify_iteration = TRUE; - verify_iterate(dev); + upekdev->first_verify_iteration = TRUE; + verify_iterate (dev); - fpi_ssm_free(ssm); + fpi_ssm_free (ssm); } -static void verify(FpDevice *dev) +static void +verify (FpDevice *dev) { - FpiSsm *ssm = fpi_ssm_new(dev, verify_start_sm_run_state, - VERIFY_NUM_STATES, NULL); - fpi_ssm_start(ssm, verify_started); + FpiSsm *ssm = fpi_ssm_new (dev, verify_start_sm_run_state, + VERIFY_NUM_STATES, NULL); + + fpi_ssm_start (ssm, verify_started); } static const FpIdEntry id_table[] = { - { .vid = 0x0483, .pid = 0x2016, }, - { .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */ + { .vid = 0x0483, .pid = 0x2016, }, + { .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */ }; static void -fpi_device_upekts_init(FpiDeviceUpekts *self) { +fpi_device_upekts_init (FpiDeviceUpekts *self) +{ } static void -fpi_device_upekts_class_init(FpiDeviceUpektsClass *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); +fpi_device_upekts_class_init (FpiDeviceUpektsClass *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); - dev_class->id = FP_COMPONENT; - dev_class->full_name = "UPEK TouchStrip"; + dev_class->id = FP_COMPONENT; + dev_class->full_name = "UPEK TouchStrip"; - dev_class->type = FP_DEVICE_TYPE_USB; - dev_class->scan_type = FP_SCAN_TYPE_SWIPE; - dev_class->id_table = id_table; - dev_class->nr_enroll_stages = 3; + dev_class->type = FP_DEVICE_TYPE_USB; + dev_class->scan_type = FP_SCAN_TYPE_SWIPE; + dev_class->id_table = id_table; + dev_class->nr_enroll_stages = 3; - dev_class->open = dev_init; - dev_class->close = dev_exit; - dev_class->verify = verify; - dev_class->enroll = enroll; - /* dev_class->cancel = cancel; */ + dev_class->open = dev_init; + dev_class->close = dev_exit; + dev_class->verify = verify; + dev_class->enroll = enroll; + /* dev_class->cancel = cancel; */ } diff --git a/libfprint/drivers/uru4000.c b/libfprint/drivers/uru4000.c index 8962b92..599f5a3 100644 --- a/libfprint/drivers/uru4000.c +++ b/libfprint/drivers/uru4000.c @@ -25,184 +25,189 @@ #include "drivers_api.h" -#define EP_INTR (1 | FPI_USB_ENDPOINT_IN) -#define EP_DATA (2 | FPI_USB_ENDPOINT_IN) -#define USB_RQ 0x04 -#define CTRL_IN (LIBUSB_REQUEST_TYPE_VENDOR | FPI_USB_ENDPOINT_IN) -#define CTRL_OUT (LIBUSB_REQUEST_TYPE_VENDOR | FPI_USB_ENDPOINT_OUT) -#define CTRL_TIMEOUT 5000 -#define BULK_TIMEOUT 5000 -#define IRQ_LENGTH 64 -#define CR_LENGTH 16 +#define EP_INTR (1 | FPI_USB_ENDPOINT_IN) +#define EP_DATA (2 | FPI_USB_ENDPOINT_IN) +#define USB_RQ 0x04 +#define CTRL_IN (LIBUSB_REQUEST_TYPE_VENDOR | FPI_USB_ENDPOINT_IN) +#define CTRL_OUT (LIBUSB_REQUEST_TYPE_VENDOR | FPI_USB_ENDPOINT_OUT) +#define CTRL_TIMEOUT 5000 +#define BULK_TIMEOUT 5000 +#define IRQ_LENGTH 64 +#define CR_LENGTH 16 -#define IMAGE_HEIGHT 290 -#define IMAGE_WIDTH 384 +#define IMAGE_HEIGHT 290 +#define IMAGE_WIDTH 384 -#define ENC_THRESHOLD 5000 +#define ENC_THRESHOLD 5000 enum { - IRQDATA_SCANPWR_ON = 0x56aa, - IRQDATA_FINGER_ON = 0x0101, - IRQDATA_FINGER_OFF = 0x0200, - IRQDATA_DEATH = 0x0800, + IRQDATA_SCANPWR_ON = 0x56aa, + IRQDATA_FINGER_ON = 0x0101, + IRQDATA_FINGER_OFF = 0x0200, + IRQDATA_DEATH = 0x0800, }; enum { - REG_HWSTAT = 0x07, - REG_SCRAMBLE_DATA_INDEX = 0x33, - REG_SCRAMBLE_DATA_KEY = 0x34, - REG_MODE = 0x4e, - REG_DEVICE_INFO = 0xf0, - /* firmware starts at 0x100 */ - REG_RESPONSE = 0x2000, - REG_CHALLENGE = 0x2010, + REG_HWSTAT = 0x07, + REG_SCRAMBLE_DATA_INDEX = 0x33, + REG_SCRAMBLE_DATA_KEY = 0x34, + REG_MODE = 0x4e, + REG_DEVICE_INFO = 0xf0, + /* firmware starts at 0x100 */ + REG_RESPONSE = 0x2000, + REG_CHALLENGE = 0x2010, }; enum { - MODE_INIT = 0x00, - MODE_AWAIT_FINGER_ON = 0x10, - MODE_AWAIT_FINGER_OFF = 0x12, - MODE_CAPTURE = 0x20, - MODE_CAPTURE_AUX = 0x30, - MODE_OFF = 0x70, - MODE_READY = 0x80, + MODE_INIT = 0x00, + MODE_AWAIT_FINGER_ON = 0x10, + MODE_AWAIT_FINGER_OFF = 0x12, + MODE_CAPTURE = 0x20, + MODE_CAPTURE_AUX = 0x30, + MODE_OFF = 0x70, + MODE_READY = 0x80, }; enum { - MS_KBD, - MS_INTELLIMOUSE, - MS_STANDALONE, - MS_STANDALONE_V2, - DP_URU4000, - DP_URU4000B, + MS_KBD, + MS_INTELLIMOUSE, + MS_STANDALONE, + MS_STANDALONE_V2, + DP_URU4000, + DP_URU4000B, }; -static const struct uru4k_dev_profile { - const char *name; - gboolean auth_cr; - gboolean encryption; +static const struct uru4k_dev_profile +{ + const char *name; + gboolean auth_cr; + gboolean encryption; } uru4k_dev_info[] = { - [MS_KBD] = { - .name = "Microsoft Keyboard with Fingerprint Reader", - .auth_cr = FALSE, - }, - [MS_INTELLIMOUSE] = { - .name = "Microsoft Wireless IntelliMouse with Fingerprint Reader", - .auth_cr = FALSE, - }, - [MS_STANDALONE] = { - .name = "Microsoft Fingerprint Reader", - .auth_cr = FALSE, - }, - [MS_STANDALONE_V2] = { - .name = "Microsoft Fingerprint Reader v2", - .auth_cr = TRUE, - }, - [DP_URU4000] = { - .name = "Digital Persona U.are.U 4000", - .auth_cr = FALSE, - }, - [DP_URU4000B] = { - .name = "Digital Persona U.are.U 4000B", - .auth_cr = FALSE, - .encryption = TRUE, - }, + [MS_KBD] = { + .name = "Microsoft Keyboard with Fingerprint Reader", + .auth_cr = FALSE, + }, + [MS_INTELLIMOUSE] = { + .name = "Microsoft Wireless IntelliMouse with Fingerprint Reader", + .auth_cr = FALSE, + }, + [MS_STANDALONE] = { + .name = "Microsoft Fingerprint Reader", + .auth_cr = FALSE, + }, + [MS_STANDALONE_V2] = { + .name = "Microsoft Fingerprint Reader v2", + .auth_cr = TRUE, + }, + [DP_URU4000] = { + .name = "Digital Persona U.are.U 4000", + .auth_cr = FALSE, + }, + [DP_URU4000B] = { + .name = "Digital Persona U.are.U 4000B", + .auth_cr = FALSE, + .encryption = TRUE, + }, }; typedef void (*irq_cb_fn)(FpImageDevice *dev, - GError *error, - uint16_t type, - void *user_data); + GError *error, + uint16_t type, + void *user_data); typedef void (*irqs_stopped_cb_fn)(FpImageDevice *dev); -struct _FpiDeviceUru4000 { - FpImageDevice parent; +struct _FpiDeviceUru4000 +{ + FpImageDevice parent; - const struct uru4k_dev_profile *profile; - uint8_t interface; - FpImageDeviceState activate_state; - unsigned char last_reg_rd[16]; - unsigned char last_hwstat; + const struct uru4k_dev_profile *profile; + uint8_t interface; + FpImageDeviceState activate_state; + unsigned char last_reg_rd[16]; + unsigned char last_hwstat; - GCancellable *irq_cancellable; - FpiUsbTransfer *img_transfer; - void *img_data; - int img_data_actual_length; - uint16_t img_lines_done, img_block; - uint32_t img_enc_seed; + GCancellable *irq_cancellable; + FpiUsbTransfer *img_transfer; + void *img_data; + int img_data_actual_length; + uint16_t img_lines_done, img_block; + uint32_t img_enc_seed; - irq_cb_fn irq_cb; - void *irq_cb_data; - irqs_stopped_cb_fn irqs_stopped_cb; + irq_cb_fn irq_cb; + void *irq_cb_data; + irqs_stopped_cb_fn irqs_stopped_cb; - int rebootpwr_ctr; - int powerup_ctr; - unsigned char powerup_hwstat; + int rebootpwr_ctr; + int powerup_ctr; + unsigned char powerup_hwstat; - int scanpwr_irq_timeouts; - GSource *scanpwr_irq_timeout; + int scanpwr_irq_timeouts; + GSource *scanpwr_irq_timeout; - int fwfixer_offset; - unsigned char fwfixer_value; + int fwfixer_offset; + unsigned char fwfixer_value; - CK_MECHANISM_TYPE cipher; - PK11SlotInfo *slot; - PK11SymKey *symkey; - SECItem *param; + CK_MECHANISM_TYPE cipher; + PK11SlotInfo *slot; + PK11SymKey *symkey; + SECItem *param; }; -G_DECLARE_FINAL_TYPE(FpiDeviceUru4000, fpi_device_uru4000, FPI, DEVICE_URU4000, - FpImageDevice); -G_DEFINE_TYPE(FpiDeviceUru4000, fpi_device_uru4000, FP_TYPE_IMAGE_DEVICE); +G_DECLARE_FINAL_TYPE (FpiDeviceUru4000, fpi_device_uru4000, FPI, DEVICE_URU4000, + FpImageDevice); +G_DEFINE_TYPE (FpiDeviceUru4000, fpi_device_uru4000, FP_TYPE_IMAGE_DEVICE); /* For 2nd generation MS devices */ static const unsigned char crkey[] = { - 0x79, 0xac, 0x91, 0x79, 0x5c, 0xa1, 0x47, 0x8e, - 0x98, 0xe0, 0x0f, 0x3c, 0x59, 0x8f, 0x5f, 0x4b, + 0x79, 0xac, 0x91, 0x79, 0x5c, 0xa1, 0x47, 0x8e, + 0x98, 0xe0, 0x0f, 0x3c, 0x59, 0x8f, 0x5f, 0x4b, }; /***** REGISTER I/O *****/ -static void write_regs(FpImageDevice *dev, uint16_t first_reg, - uint16_t num_regs, unsigned char *values, - FpiUsbTransferCallback callback, - void *user_data) +static void +write_regs (FpImageDevice *dev, uint16_t first_reg, + uint16_t num_regs, unsigned char *values, + FpiUsbTransferCallback callback, + void *user_data) { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(FP_DEVICE(dev)); + FpiUsbTransfer *transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); - transfer->short_is_error = TRUE; - fpi_usb_transfer_fill_control(transfer, - G_USB_DEVICE_DIRECTION_HOST_TO_DEVICE, - G_USB_DEVICE_REQUEST_TYPE_STANDARD, - G_USB_DEVICE_RECIPIENT_DEVICE, - USB_RQ, first_reg, 0, - num_regs); - memcpy(transfer->buffer, values, num_regs); - fpi_usb_transfer_submit(transfer, CTRL_TIMEOUT, NULL, callback, user_data); - fpi_usb_transfer_unref(transfer); + transfer->short_is_error = TRUE; + fpi_usb_transfer_fill_control (transfer, + G_USB_DEVICE_DIRECTION_HOST_TO_DEVICE, + G_USB_DEVICE_REQUEST_TYPE_STANDARD, + G_USB_DEVICE_RECIPIENT_DEVICE, + USB_RQ, first_reg, 0, + num_regs); + memcpy (transfer->buffer, values, num_regs); + fpi_usb_transfer_submit (transfer, CTRL_TIMEOUT, NULL, callback, user_data); + fpi_usb_transfer_unref (transfer); } -static void write_reg(FpImageDevice *dev, uint16_t reg, - unsigned char value, - FpiUsbTransferCallback callback, - void *user_data) +static void +write_reg (FpImageDevice *dev, uint16_t reg, + unsigned char value, + FpiUsbTransferCallback callback, + void *user_data) { - write_regs(dev, reg, 1, &value, callback, user_data); + write_regs (dev, reg, 1, &value, callback, user_data); } -static void read_regs(FpImageDevice *dev, uint16_t first_reg, - uint16_t num_regs, - FpiUsbTransferCallback callback, - void *user_data) +static void +read_regs (FpImageDevice *dev, uint16_t first_reg, + uint16_t num_regs, + FpiUsbTransferCallback callback, + void *user_data) { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(FP_DEVICE(dev)); + FpiUsbTransfer *transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); - fpi_usb_transfer_fill_control(transfer, - G_USB_DEVICE_DIRECTION_DEVICE_TO_HOST, - G_USB_DEVICE_REQUEST_TYPE_STANDARD, - G_USB_DEVICE_RECIPIENT_DEVICE, - USB_RQ, first_reg, 0, num_regs); - fpi_usb_transfer_submit(transfer, CTRL_TIMEOUT, NULL, callback, user_data); - fpi_usb_transfer_unref(transfer); + fpi_usb_transfer_fill_control (transfer, + G_USB_DEVICE_DIRECTION_DEVICE_TO_HOST, + G_USB_DEVICE_REQUEST_TYPE_STANDARD, + G_USB_DEVICE_RECIPIENT_DEVICE, + USB_RQ, first_reg, 0, num_regs); + fpi_usb_transfer_submit (transfer, CTRL_TIMEOUT, NULL, callback, user_data); + fpi_usb_transfer_unref (transfer); } /* @@ -230,45 +235,49 @@ static void read_regs(FpImageDevice *dev, uint16_t first_reg, * an interrupt to the host. Maybe? */ -static void response_cb(FpiUsbTransfer *transfer, FpDevice *dev, void *user_data, GError *error) +static void +response_cb (FpiUsbTransfer *transfer, FpDevice *dev, void *user_data, GError *error) { - /* NOTE: We could use the SSM function instead if we attached the ssm to the transfer! */ - FpiSsm *ssm = user_data; + /* NOTE: We could use the SSM function instead if we attached the ssm to the transfer! */ + FpiSsm *ssm = user_data; - if (!error) - fpi_ssm_next_state(ssm); - else - fpi_ssm_mark_failed(ssm, error); + if (!error) + fpi_ssm_next_state (ssm); + else + fpi_ssm_mark_failed (ssm, error); } -static void challenge_cb(FpiUsbTransfer *transfer, FpDevice *dev, void *user_data, GError *error) +static void +challenge_cb (FpiUsbTransfer *transfer, FpDevice *dev, void *user_data, GError *error) { - FpiSsm *ssm = user_data; - FpiDeviceUru4000 *self = FPI_DEVICE_URU4000(dev); - unsigned char respdata[CR_LENGTH]; - PK11Context *ctx; - int outlen; + FpiSsm *ssm = user_data; + FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev); + unsigned char respdata[CR_LENGTH]; + PK11Context *ctx; + int outlen; - if (error) { - fpi_ssm_mark_failed(ssm, error); - return; - } + if (error) + { + fpi_ssm_mark_failed (ssm, error); + return; + } - /* submit response */ - /* produce response from challenge */ - ctx = PK11_CreateContextBySymKey(self->cipher, CKA_ENCRYPT, - self->symkey, self->param); - if (PK11_CipherOp(ctx, respdata, &outlen, CR_LENGTH, transfer->buffer, CR_LENGTH) != SECSuccess - || PK11_Finalize(ctx) != SECSuccess) { - fp_err("Failed to encrypt challenge data"); - error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, "Failed to encrypt challenge data"); - } - PK11_DestroyContext(ctx, PR_TRUE); + /* submit response */ + /* produce response from challenge */ + ctx = PK11_CreateContextBySymKey (self->cipher, CKA_ENCRYPT, + self->symkey, self->param); + if (PK11_CipherOp (ctx, respdata, &outlen, CR_LENGTH, transfer->buffer, CR_LENGTH) != SECSuccess || + PK11_Finalize (ctx) != SECSuccess) + { + fp_err ("Failed to encrypt challenge data"); + error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, "Failed to encrypt challenge data"); + } + PK11_DestroyContext (ctx, PR_TRUE); - if (!error) - write_regs(FP_IMAGE_DEVICE (dev), REG_RESPONSE, CR_LENGTH, respdata, response_cb, ssm); - else - fpi_ssm_mark_failed(ssm, error); + if (!error) + write_regs (FP_IMAGE_DEVICE (dev), REG_RESPONSE, CR_LENGTH, respdata, response_cb, ssm); + else + fpi_ssm_mark_failed (ssm, error); } /* @@ -277,476 +286,526 @@ static void challenge_cb(FpiUsbTransfer *transfer, FpDevice *dev, void *user_dat * driver. */ static void -sm_do_challenge_response(FpiSsm *ssm, - FpImageDevice *dev) +sm_do_challenge_response (FpiSsm *ssm, + FpImageDevice *dev) { - G_DEBUG_HERE(); - read_regs(dev, REG_CHALLENGE, CR_LENGTH, challenge_cb, ssm); + G_DEBUG_HERE (); + read_regs (dev, REG_CHALLENGE, CR_LENGTH, challenge_cb, ssm); } /***** INTERRUPT HANDLING *****/ #define IRQ_HANDLER_IS_RUNNING(urudev) ((urudev)->irq_cancellable) -static void start_irq_handler(FpImageDevice *dev); +static void start_irq_handler (FpImageDevice *dev); -static void irq_handler(FpiUsbTransfer *transfer, - FpDevice *dev, - void *user_data, - GError *error) +static void +irq_handler (FpiUsbTransfer *transfer, + FpDevice *dev, + void *user_data, + GError *error) { - FpImageDevice *imgdev = FP_IMAGE_DEVICE (dev); - FpiDeviceUru4000 *urudev = FPI_DEVICE_URU4000 (dev); - unsigned char *data = transfer->buffer; - uint16_t type; + FpImageDevice *imgdev = FP_IMAGE_DEVICE (dev); + FpiDeviceUru4000 *urudev = FPI_DEVICE_URU4000 (dev); + unsigned char *data = transfer->buffer; + uint16_t type; - g_clear_object (&urudev->irq_cancellable); + g_clear_object (&urudev->irq_cancellable); - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { - fp_dbg("cancelled"); - if (urudev->irqs_stopped_cb) - urudev->irqs_stopped_cb(imgdev); - urudev->irqs_stopped_cb = NULL; - return; - } else if (error) { - if (urudev->irq_cb) { - urudev->irq_cb(imgdev, error, 0, urudev->irq_cb_data); - } else { - fp_dbg("ignoring interrupt error: %s", error->message); - g_clear_error (&error); - } - return; - } + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + { + fp_dbg ("cancelled"); + if (urudev->irqs_stopped_cb) + urudev->irqs_stopped_cb (imgdev); + urudev->irqs_stopped_cb = NULL; + return; + } + else if (error) + { + if (urudev->irq_cb) + { + urudev->irq_cb (imgdev, error, 0, urudev->irq_cb_data); + } + else + { + fp_dbg ("ignoring interrupt error: %s", error->message); + g_clear_error (&error); + } + return; + } - type = GUINT16_FROM_BE(*((uint16_t *) data)); - fp_dbg("recv irq type %04x", type); + type = GUINT16_FROM_BE (*((uint16_t *) data)); + fp_dbg ("recv irq type %04x", type); - /* The 0800 interrupt seems to indicate imminent failure (0 bytes transfer) - * of the next scan. It still appears on occasion. */ - if (type == IRQDATA_DEATH) - fp_warn("oh no! got the interrupt OF DEATH! expect things to go bad"); + /* The 0800 interrupt seems to indicate imminent failure (0 bytes transfer) + * of the next scan. It still appears on occasion. */ + if (type == IRQDATA_DEATH) + fp_warn ("oh no! got the interrupt OF DEATH! expect things to go bad"); - if (urudev->irq_cb) - urudev->irq_cb(imgdev, NULL, type, urudev->irq_cb_data); - else - fp_dbg("ignoring interrupt"); + if (urudev->irq_cb) + urudev->irq_cb (imgdev, NULL, type, urudev->irq_cb_data); + else + fp_dbg ("ignoring interrupt"); - start_irq_handler(imgdev); + start_irq_handler (imgdev); } -static void start_irq_handler(FpImageDevice *dev) +static void +start_irq_handler (FpImageDevice *dev) { - FpiDeviceUru4000 *self = FPI_DEVICE_URU4000(dev); - FpiUsbTransfer *transfer; + FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev); + FpiUsbTransfer *transfer; - g_assert (self->irq_cancellable == NULL); - self->irq_cancellable = g_cancellable_new (); - transfer = fpi_usb_transfer_new(FP_DEVICE(dev)); - transfer->ssm = NULL; - transfer->short_is_error = TRUE; - fpi_usb_transfer_fill_bulk (transfer, - EP_INTR, - IRQ_LENGTH); - fpi_usb_transfer_submit(transfer, 0, self->irq_cancellable, irq_handler, NULL); - fpi_usb_transfer_unref(transfer); + g_assert (self->irq_cancellable == NULL); + self->irq_cancellable = g_cancellable_new (); + transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); + transfer->ssm = NULL; + transfer->short_is_error = TRUE; + fpi_usb_transfer_fill_bulk (transfer, + EP_INTR, + IRQ_LENGTH); + fpi_usb_transfer_submit (transfer, 0, self->irq_cancellable, irq_handler, NULL); + fpi_usb_transfer_unref (transfer); } -static void stop_irq_handler(FpImageDevice *dev, irqs_stopped_cb_fn cb) +static void +stop_irq_handler (FpImageDevice *dev, irqs_stopped_cb_fn cb) { - FpiDeviceUru4000 *self = FPI_DEVICE_URU4000(dev); + FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev); - if (self->irq_cancellable) { - g_cancellable_cancel (self->irq_cancellable); - self->irqs_stopped_cb = cb; - } + if (self->irq_cancellable) + { + g_cancellable_cancel (self->irq_cancellable); + self->irqs_stopped_cb = cb; + } } /***** STATE CHANGING *****/ -static void execute_state_change(FpImageDevice *dev); +static void execute_state_change (FpImageDevice *dev); -static void finger_presence_irq_cb(FpImageDevice *dev, - GError *error, - uint16_t type, - void *user_data) +static void +finger_presence_irq_cb (FpImageDevice *dev, + GError *error, + uint16_t type, + void *user_data) { - if (error) - fpi_image_device_session_error(dev, error); - else if (type == IRQDATA_FINGER_ON) - fpi_image_device_report_finger_status(dev, TRUE); - else if (type == IRQDATA_FINGER_OFF) - fpi_image_device_report_finger_status(dev, FALSE); - else - fp_warn("ignoring unexpected interrupt %04x", type); + if (error) + fpi_image_device_session_error (dev, error); + else if (type == IRQDATA_FINGER_ON) + fpi_image_device_report_finger_status (dev, TRUE); + else if (type == IRQDATA_FINGER_OFF) + fpi_image_device_report_finger_status (dev, FALSE); + else + fp_warn ("ignoring unexpected interrupt %04x", type); } -static void change_state_write_reg_cb(FpiUsbTransfer *transfer, - FpDevice *dev, - void *user_data, - GError *error) +static void +change_state_write_reg_cb (FpiUsbTransfer *transfer, + FpDevice *dev, + void *user_data, + GError *error) { - if (error) - fpi_image_device_session_error(FP_IMAGE_DEVICE (dev), error); + if (error) + fpi_image_device_session_error (FP_IMAGE_DEVICE (dev), error); } -static void dev_change_state(FpImageDevice *dev, FpImageDeviceState state) +static void +dev_change_state (FpImageDevice *dev, FpImageDeviceState state) { - FpiDeviceUru4000 *self = FPI_DEVICE_URU4000(dev); + FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev); - switch (state) { - case FP_IMAGE_DEVICE_STATE_INACTIVE: - case FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_ON: - case FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF: - case FP_IMAGE_DEVICE_STATE_CAPTURE: - break; - default: - g_assert_not_reached (); - } + switch (state) + { + case FP_IMAGE_DEVICE_STATE_INACTIVE: + case FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_ON: + case FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF: + case FP_IMAGE_DEVICE_STATE_CAPTURE: + break; - self->activate_state = state; - if (self->img_transfer != NULL) - return; + default: + g_assert_not_reached (); + } - execute_state_change(dev); + self->activate_state = state; + if (self->img_transfer != NULL) + return; + + execute_state_change (dev); } /***** GENERIC STATE MACHINE HELPER FUNCTIONS *****/ -static void sm_write_reg_cb(FpiUsbTransfer *transfer, - FpDevice *dev, - void *user_data, - GError *error) +static void +sm_write_reg_cb (FpiUsbTransfer *transfer, + FpDevice *dev, + void *user_data, + GError *error) { - FpiSsm *ssm = user_data; + FpiSsm *ssm = user_data; - if (error) - fpi_ssm_mark_failed(ssm, error); - else - fpi_ssm_next_state(ssm); + if (error) + fpi_ssm_mark_failed (ssm, error); + else + fpi_ssm_next_state (ssm); } static void -sm_write_regs(FpiSsm *ssm, - FpImageDevice *dev, - uint16_t first_reg, - uint16_t num_regs, - void *data) +sm_write_regs (FpiSsm *ssm, + FpImageDevice *dev, + uint16_t first_reg, + uint16_t num_regs, + void *data) { - write_regs(dev, first_reg, num_regs, data, sm_write_reg_cb, ssm); + write_regs (dev, first_reg, num_regs, data, sm_write_reg_cb, ssm); } static void -sm_write_reg(FpiSsm *ssm, - FpImageDevice *dev, - uint16_t reg, - unsigned char value) +sm_write_reg (FpiSsm *ssm, + FpImageDevice *dev, + uint16_t reg, + unsigned char value) { - sm_write_regs(ssm, dev, reg, 1, &value); -} - -static void sm_read_reg_cb(FpiUsbTransfer *transfer, - FpDevice *dev, - void *user_data, - GError *error) -{ - FpiSsm *ssm = user_data; - FpiDeviceUru4000 *self = FPI_DEVICE_URU4000(dev); - - if (error) { - fpi_ssm_mark_failed(ssm, error); - } else { - memcpy(self->last_reg_rd, transfer->buffer, transfer->actual_length); - fp_dbg("reg value %x", self->last_reg_rd[0]); - fpi_ssm_next_state(ssm); - } -} - -#define member_size(type, member) sizeof(((type *)0)->member) - -static void -sm_read_regs(FpiSsm *ssm, - FpImageDevice *dev, - uint16_t reg, - uint16_t num_regs) -{ - g_assert (num_regs <= member_size(FpiDeviceUru4000, last_reg_rd)); - - fp_dbg("read %d regs at %x", num_regs, reg); - read_regs(dev, reg, num_regs, sm_read_reg_cb, ssm); + sm_write_regs (ssm, dev, reg, 1, &value); } static void -sm_read_reg(FpiSsm *ssm, - FpImageDevice *dev, - uint16_t reg) +sm_read_reg_cb (FpiUsbTransfer *transfer, + FpDevice *dev, + void *user_data, + GError *error) { - sm_read_regs(ssm, dev, reg, 1); + FpiSsm *ssm = user_data; + FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev); + + if (error) + { + fpi_ssm_mark_failed (ssm, error); + } + else + { + memcpy (self->last_reg_rd, transfer->buffer, transfer->actual_length); + fp_dbg ("reg value %x", self->last_reg_rd[0]); + fpi_ssm_next_state (ssm); + } +} + +#define member_size(type, member) sizeof (((type *) 0)->member) + +static void +sm_read_regs (FpiSsm *ssm, + FpImageDevice *dev, + uint16_t reg, + uint16_t num_regs) +{ + g_assert (num_regs <= member_size (FpiDeviceUru4000, last_reg_rd)); + + fp_dbg ("read %d regs at %x", num_regs, reg); + read_regs (dev, reg, num_regs, sm_read_reg_cb, ssm); } static void -sm_set_hwstat(FpiSsm *ssm, - FpImageDevice *dev, - unsigned char value) +sm_read_reg (FpiSsm *ssm, + FpImageDevice *dev, + uint16_t reg) { - fp_dbg("set %02x", value); - sm_write_reg(ssm, dev, REG_HWSTAT, value); + sm_read_regs (ssm, dev, reg, 1); +} + +static void +sm_set_hwstat (FpiSsm *ssm, + FpImageDevice *dev, + unsigned char value) +{ + fp_dbg ("set %02x", value); + sm_write_reg (ssm, dev, REG_HWSTAT, value); } /***** IMAGING LOOP *****/ enum imaging_states { - IMAGING_CAPTURE, - IMAGING_SEND_INDEX, - IMAGING_READ_KEY, - IMAGING_DECODE, - IMAGING_REPORT_IMAGE, - IMAGING_NUM_STATES + IMAGING_CAPTURE, + IMAGING_SEND_INDEX, + IMAGING_READ_KEY, + IMAGING_DECODE, + IMAGING_REPORT_IMAGE, + IMAGING_NUM_STATES }; -struct uru4k_image { - uint8_t unknown_00[4]; - uint16_t num_lines; - uint8_t key_number; - uint8_t unknown_07[9]; - struct { - uint8_t flags; - uint8_t num_lines; - } block_info[15]; - uint8_t unknown_2E[18]; - uint8_t data[IMAGE_HEIGHT][IMAGE_WIDTH]; -}; - -static void image_transfer_cb(FpiUsbTransfer *transfer, FpDevice *dev, - gpointer user_data, GError *error) +struct uru4k_image { - FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev); - FpiSsm *ssm = transfer->ssm; + uint8_t unknown_00[4]; + uint16_t num_lines; + uint8_t key_number; + uint8_t unknown_07[9]; + struct + { + uint8_t flags; + uint8_t num_lines; + } block_info[15]; + uint8_t unknown_2E[18]; + uint8_t data[IMAGE_HEIGHT][IMAGE_WIDTH]; +}; - if (error) { - fp_dbg("error"); - fpi_ssm_mark_failed(ssm, error); - } else { - self->img_data = g_memdup(transfer->buffer, sizeof(struct uru4k_image)); - self->img_data_actual_length = transfer->actual_length; - fpi_ssm_next_state(ssm); - } +static void +image_transfer_cb (FpiUsbTransfer *transfer, FpDevice *dev, + gpointer user_data, GError *error) +{ + FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev); + FpiSsm *ssm = transfer->ssm; + + if (error) + { + fp_dbg ("error"); + fpi_ssm_mark_failed (ssm, error); + } + else + { + self->img_data = g_memdup (transfer->buffer, sizeof (struct uru4k_image)); + self->img_data_actual_length = transfer->actual_length; + fpi_ssm_next_state (ssm); + } } enum { - BLOCKF_CHANGE_KEY = 0x80, - BLOCKF_NO_KEY_UPDATE = 0x04, - BLOCKF_ENCRYPTED = 0x02, - BLOCKF_NOT_PRESENT = 0x01, + BLOCKF_CHANGE_KEY = 0x80, + BLOCKF_NO_KEY_UPDATE = 0x04, + BLOCKF_ENCRYPTED = 0x02, + BLOCKF_NOT_PRESENT = 0x01, }; -static uint32_t update_key(uint32_t key) +static uint32_t +update_key (uint32_t key) { - /* linear feedback shift register - * taps at bit positions 1 3 4 7 11 13 20 23 26 29 32 */ - uint32_t bit = key & 0x9248144d; - bit ^= bit << 16; - bit ^= bit << 8; - bit ^= bit << 4; - bit ^= bit << 2; - bit ^= bit << 1; - return (bit & 0x80000000) | (key >> 1); + /* linear feedback shift register + * taps at bit positions 1 3 4 7 11 13 20 23 26 29 32 */ + uint32_t bit = key & 0x9248144d; + + bit ^= bit << 16; + bit ^= bit << 8; + bit ^= bit << 4; + bit ^= bit << 2; + bit ^= bit << 1; + return (bit & 0x80000000) | (key >> 1); } -static uint32_t do_decode(uint8_t *data, int num_bytes, uint32_t key) +static uint32_t +do_decode (uint8_t *data, int num_bytes, uint32_t key) { - uint8_t xorbyte; - int i; + uint8_t xorbyte; + int i; - for (i = 0; i < num_bytes - 1; i++) { - /* calculate xor byte and update key */ - xorbyte = ((key >> 4) & 1) << 0; - xorbyte |= ((key >> 8) & 1) << 1; - xorbyte |= ((key >> 11) & 1) << 2; - xorbyte |= ((key >> 14) & 1) << 3; - xorbyte |= ((key >> 18) & 1) << 4; - xorbyte |= ((key >> 21) & 1) << 5; - xorbyte |= ((key >> 24) & 1) << 6; - xorbyte |= ((key >> 29) & 1) << 7; - key = update_key(key); + for (i = 0; i < num_bytes - 1; i++) + { + /* calculate xor byte and update key */ + xorbyte = ((key >> 4) & 1) << 0; + xorbyte |= ((key >> 8) & 1) << 1; + xorbyte |= ((key >> 11) & 1) << 2; + xorbyte |= ((key >> 14) & 1) << 3; + xorbyte |= ((key >> 18) & 1) << 4; + xorbyte |= ((key >> 21) & 1) << 5; + xorbyte |= ((key >> 24) & 1) << 6; + xorbyte |= ((key >> 29) & 1) << 7; + key = update_key (key); - /* decrypt data */ - data[i] = data[i+1] ^ xorbyte; - } + /* decrypt data */ + data[i] = data[i + 1] ^ xorbyte; + } - /* the final byte is implicitly zero */ - data[i] = 0; - return update_key(key); + /* the final byte is implicitly zero */ + data[i] = 0; + return update_key (key); } -static int calc_dev2(struct uru4k_image *img) +static int +calc_dev2 (struct uru4k_image *img) { - uint8_t *b[2] = { NULL, NULL }; - int res = 0, mean = 0, i, r, j, idx; + uint8_t *b[2] = { NULL, NULL }; + int res = 0, mean = 0, i, r, j, idx; - for (i = r = idx = 0; i < G_N_ELEMENTS(img->block_info) && idx < 2; i++) { - if (img->block_info[i].flags & BLOCKF_NOT_PRESENT) - continue; - for (j = 0; j < img->block_info[i].num_lines && idx < 2; j++) - b[idx++] = img->data[r++]; - } - if (!b[0] || !b[1]) { - fp_dbg("NULL! %p %p", b[0], b[1]); - return 0; - } - for (i = 0; i < IMAGE_WIDTH; i++) - mean += (int)b[0][i] + (int)b[1][i]; + for (i = r = idx = 0; i < G_N_ELEMENTS (img->block_info) && idx < 2; i++) + { + if (img->block_info[i].flags & BLOCKF_NOT_PRESENT) + continue; + for (j = 0; j < img->block_info[i].num_lines && idx < 2; j++) + b[idx++] = img->data[r++]; + } + if (!b[0] || !b[1]) + { + fp_dbg ("NULL! %p %p", b[0], b[1]); + return 0; + } + for (i = 0; i < IMAGE_WIDTH; i++) + mean += (int) b[0][i] + (int) b[1][i]; - mean /= IMAGE_WIDTH; + mean /= IMAGE_WIDTH; - for (i = 0; i < IMAGE_WIDTH; i++) { - int dev = (int)b[0][i] + (int)b[1][i] - mean; - res += dev * dev; - } + for (i = 0; i < IMAGE_WIDTH; i++) + { + int dev = (int) b[0][i] + (int) b[1][i] - mean; + res += dev * dev; + } - return res / IMAGE_WIDTH; + return res / IMAGE_WIDTH; } -static void imaging_run_state(FpiSsm *ssm, FpDevice *_dev, void *user_data) +static void +imaging_run_state (FpiSsm *ssm, FpDevice *_dev, void *user_data) { - FpImageDevice *dev = user_data; - FpiDeviceUru4000 *self = FPI_DEVICE_URU4000(_dev); - struct uru4k_image *img = self->img_data; - FpImage *fpimg; - uint32_t key; - uint8_t flags, num_lines; - int i, r, to, dev2; - unsigned char buf[5]; + FpImageDevice *dev = user_data; + FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (_dev); + struct uru4k_image *img = self->img_data; + FpImage *fpimg; + uint32_t key; + uint8_t flags, num_lines; + int i, r, to, dev2; + unsigned char buf[5]; - switch (fpi_ssm_get_cur_state(ssm)) { - case IMAGING_CAPTURE: - self->img_lines_done = 0; - self->img_block = 0; - fpi_usb_transfer_submit(self->img_transfer, 0, NULL, image_transfer_cb, NULL); + switch (fpi_ssm_get_cur_state (ssm)) + { + case IMAGING_CAPTURE: + self->img_lines_done = 0; + self->img_block = 0; + fpi_usb_transfer_submit (self->img_transfer, 0, NULL, image_transfer_cb, NULL); - break; - case IMAGING_SEND_INDEX: - fp_dbg("hw header lines %d", img->num_lines); + break; - if (img->num_lines >= IMAGE_HEIGHT || - self->img_data_actual_length < img->num_lines * IMAGE_WIDTH + 64) { - fp_err("bad captured image (%d lines) or size mismatch %d < %d", - img->num_lines, - self->img_data_actual_length, - img->num_lines * IMAGE_WIDTH + 64); - fpi_ssm_jump_to_state(ssm, IMAGING_CAPTURE); - return; - } - if (!self->profile->encryption) { - dev2 = calc_dev2(img); - fp_dbg("dev2: %d", dev2); - if (dev2 < ENC_THRESHOLD) { - fpi_ssm_jump_to_state(ssm, IMAGING_REPORT_IMAGE); - return; - } - fp_info("image seems to be encrypted"); - } - buf[0] = img->key_number; - buf[1] = self->img_enc_seed; - buf[2] = self->img_enc_seed >> 8; - buf[3] = self->img_enc_seed >> 16; - buf[4] = self->img_enc_seed >> 24; - sm_write_regs(ssm, dev, REG_SCRAMBLE_DATA_INDEX, 5, buf); - break; - case IMAGING_READ_KEY: - sm_read_regs(ssm, dev, REG_SCRAMBLE_DATA_KEY, 4); - break; - case IMAGING_DECODE: - key = self->last_reg_rd[0]; - key |= self->last_reg_rd[1] << 8; - key |= self->last_reg_rd[2] << 16; - key |= self->last_reg_rd[3] << 24; - key ^= self->img_enc_seed; + case IMAGING_SEND_INDEX: + fp_dbg ("hw header lines %d", img->num_lines); - fp_dbg("encryption id %02x -> key %08x", img->key_number, key); - while (self->img_block < G_N_ELEMENTS(img->block_info) && - self->img_lines_done < img->num_lines) { - flags = img->block_info[self->img_block].flags; - num_lines = img->block_info[self->img_block].num_lines; - if (num_lines == 0) - break; + if (img->num_lines >= IMAGE_HEIGHT || + self->img_data_actual_length < img->num_lines * IMAGE_WIDTH + 64) + { + fp_err ("bad captured image (%d lines) or size mismatch %d < %d", + img->num_lines, + self->img_data_actual_length, + img->num_lines * IMAGE_WIDTH + 64); + fpi_ssm_jump_to_state (ssm, IMAGING_CAPTURE); + return; + } + if (!self->profile->encryption) + { + dev2 = calc_dev2 (img); + fp_dbg ("dev2: %d", dev2); + if (dev2 < ENC_THRESHOLD) + { + fpi_ssm_jump_to_state (ssm, IMAGING_REPORT_IMAGE); + return; + } + fp_info ("image seems to be encrypted"); + } + buf[0] = img->key_number; + buf[1] = self->img_enc_seed; + buf[2] = self->img_enc_seed >> 8; + buf[3] = self->img_enc_seed >> 16; + buf[4] = self->img_enc_seed >> 24; + sm_write_regs (ssm, dev, REG_SCRAMBLE_DATA_INDEX, 5, buf); + break; - fp_dbg("%d %02x %d", self->img_block, flags, - num_lines); - if (flags & BLOCKF_CHANGE_KEY) { - fp_dbg("changing encryption keys.\n"); - img->block_info[self->img_block].flags &= ~BLOCKF_CHANGE_KEY; - img->key_number++; - self->img_enc_seed = rand(); - fpi_ssm_jump_to_state(ssm, IMAGING_SEND_INDEX); - return; - } - switch (flags & (BLOCKF_NO_KEY_UPDATE | BLOCKF_ENCRYPTED)) { - case BLOCKF_ENCRYPTED: - fp_dbg("decoding %d lines", num_lines); - key = do_decode(&img->data[self->img_lines_done][0], - IMAGE_WIDTH*num_lines, key); - break; - case 0: - fp_dbg("skipping %d lines", num_lines); - for (r = 0; r < IMAGE_WIDTH*num_lines; r++) - key = update_key(key); - break; - } - if ((flags & BLOCKF_NOT_PRESENT) == 0) - self->img_lines_done += num_lines; - self->img_block++; - } - fpi_ssm_next_state(ssm); - break; - case IMAGING_REPORT_IMAGE: - fpimg = fp_image_new (IMAGE_WIDTH, IMAGE_HEIGHT); + case IMAGING_READ_KEY: + sm_read_regs (ssm, dev, REG_SCRAMBLE_DATA_KEY, 4); + break; - to = r = 0; - for (i = 0; i < G_N_ELEMENTS(img->block_info) && r < img->num_lines; i++) { - flags = img->block_info[i].flags; - num_lines = img->block_info[i].num_lines; - if (num_lines == 0) - break; - memcpy(&fpimg->data[to], &img->data[r][0], - num_lines * IMAGE_WIDTH); - if (!(flags & BLOCKF_NOT_PRESENT)) - r += num_lines; - to += num_lines * IMAGE_WIDTH; - } + case IMAGING_DECODE: + key = self->last_reg_rd[0]; + key |= self->last_reg_rd[1] << 8; + key |= self->last_reg_rd[2] << 16; + key |= self->last_reg_rd[3] << 24; + key ^= self->img_enc_seed; - fpimg->flags = FPI_IMAGE_COLORS_INVERTED; - if (!self->profile->encryption) - fpimg->flags |= FPI_IMAGE_V_FLIPPED | FPI_IMAGE_H_FLIPPED; - fpi_image_device_image_captured(dev, fpimg); + fp_dbg ("encryption id %02x -> key %08x", img->key_number, key); + while (self->img_block < G_N_ELEMENTS (img->block_info) && + self->img_lines_done < img->num_lines) + { + flags = img->block_info[self->img_block].flags; + num_lines = img->block_info[self->img_block].num_lines; + if (num_lines == 0) + break; - if (self->activate_state == FP_IMAGE_DEVICE_STATE_CAPTURE) - fpi_ssm_jump_to_state(ssm, IMAGING_CAPTURE); - else - fpi_ssm_mark_completed(ssm); - break; - } + fp_dbg ("%d %02x %d", self->img_block, flags, + num_lines); + if (flags & BLOCKF_CHANGE_KEY) + { + fp_dbg ("changing encryption keys.\n"); + img->block_info[self->img_block].flags &= ~BLOCKF_CHANGE_KEY; + img->key_number++; + self->img_enc_seed = rand (); + fpi_ssm_jump_to_state (ssm, IMAGING_SEND_INDEX); + return; + } + switch (flags & (BLOCKF_NO_KEY_UPDATE | BLOCKF_ENCRYPTED)) + { + case BLOCKF_ENCRYPTED: + fp_dbg ("decoding %d lines", num_lines); + key = do_decode (&img->data[self->img_lines_done][0], + IMAGE_WIDTH * num_lines, key); + break; + + case 0: + fp_dbg ("skipping %d lines", num_lines); + for (r = 0; r < IMAGE_WIDTH * num_lines; r++) + key = update_key (key); + break; + } + if ((flags & BLOCKF_NOT_PRESENT) == 0) + self->img_lines_done += num_lines; + self->img_block++; + } + fpi_ssm_next_state (ssm); + break; + + case IMAGING_REPORT_IMAGE: + fpimg = fp_image_new (IMAGE_WIDTH, IMAGE_HEIGHT); + + to = r = 0; + for (i = 0; i < G_N_ELEMENTS (img->block_info) && r < img->num_lines; i++) + { + flags = img->block_info[i].flags; + num_lines = img->block_info[i].num_lines; + if (num_lines == 0) + break; + memcpy (&fpimg->data[to], &img->data[r][0], + num_lines * IMAGE_WIDTH); + if (!(flags & BLOCKF_NOT_PRESENT)) + r += num_lines; + to += num_lines * IMAGE_WIDTH; + } + + fpimg->flags = FPI_IMAGE_COLORS_INVERTED; + if (!self->profile->encryption) + fpimg->flags |= FPI_IMAGE_V_FLIPPED | FPI_IMAGE_H_FLIPPED; + fpi_image_device_image_captured (dev, fpimg); + + if (self->activate_state == FP_IMAGE_DEVICE_STATE_CAPTURE) + fpi_ssm_jump_to_state (ssm, IMAGING_CAPTURE); + else + fpi_ssm_mark_completed (ssm); + break; + } } -static void imaging_complete(FpiSsm *ssm, FpDevice *dev, void *user_data, - GError *error) +static void +imaging_complete (FpiSsm *ssm, FpDevice *dev, void *user_data, + GError *error) { - FpiDeviceUru4000 *self = FPI_DEVICE_URU4000(dev); - fpi_ssm_free(ssm); + FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev); - /* Report error before exiting imaging loop - the error handler - * can request state change, which needs to be postponed to end of - * this function. */ - if (error) - fpi_image_device_session_error(FP_IMAGE_DEVICE (dev), error); + fpi_ssm_free (ssm); - /* Freed by callback or cancellation */ - self->img_transfer = NULL; + /* Report error before exiting imaging loop - the error handler + * can request state change, which needs to be postponed to end of + * this function. */ + if (error) + fpi_image_device_session_error (FP_IMAGE_DEVICE (dev), error); - g_free(self->img_data); - self->img_data = NULL; - self->img_data_actual_length = 0; + /* Freed by callback or cancellation */ + self->img_transfer = NULL; - execute_state_change(FP_IMAGE_DEVICE (dev)); + g_free (self->img_data); + self->img_data = NULL; + self->img_data_actual_length = 0; + + execute_state_change (FP_IMAGE_DEVICE (dev)); } /***** INITIALIZATION *****/ @@ -768,54 +827,62 @@ static void imaging_complete(FpiSsm *ssm, FpDevice *dev, void *user_data, * and fails after 100 tries. */ enum rebootpwr_states { - REBOOTPWR_SET_HWSTAT = 0, - REBOOTPWR_GET_HWSTAT, - REBOOTPWR_CHECK_HWSTAT, - REBOOTPWR_PAUSE, - REBOOTPWR_NUM_STATES, + REBOOTPWR_SET_HWSTAT = 0, + REBOOTPWR_GET_HWSTAT, + REBOOTPWR_CHECK_HWSTAT, + REBOOTPWR_PAUSE, + REBOOTPWR_NUM_STATES, }; static void -rebootpwr_pause_cb(FpDevice *dev, - void *data) +rebootpwr_pause_cb (FpDevice *dev, + void *data) { - FpiSsm *ssm = data; - FpiDeviceUru4000 *self = FPI_DEVICE_URU4000(dev); + FpiSsm *ssm = data; + FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev); - if (!--self->rebootpwr_ctr) { - fp_err("could not reboot device power"); - fpi_ssm_mark_failed(ssm, - fpi_device_error_new_msg (FP_DEVICE_ERROR, - "Could not reboot device")); - } else { - fpi_ssm_jump_to_state(ssm, REBOOTPWR_GET_HWSTAT); - } + if (!--self->rebootpwr_ctr) + { + fp_err ("could not reboot device power"); + fpi_ssm_mark_failed (ssm, + fpi_device_error_new_msg (FP_DEVICE_ERROR, + "Could not reboot device")); + } + else + { + fpi_ssm_jump_to_state (ssm, REBOOTPWR_GET_HWSTAT); + } } -static void rebootpwr_run_state(FpiSsm *ssm, FpDevice *_dev, void *user_data) +static void +rebootpwr_run_state (FpiSsm *ssm, FpDevice *_dev, void *user_data) { - FpImageDevice *dev = user_data; - FpiDeviceUru4000 *self = FPI_DEVICE_URU4000(_dev); + FpImageDevice *dev = user_data; + FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (_dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case REBOOTPWR_SET_HWSTAT: - self->rebootpwr_ctr = 100; - sm_set_hwstat(ssm, dev, self->last_hwstat & 0xf); - break; - case REBOOTPWR_GET_HWSTAT: - sm_read_reg(ssm, dev, REG_HWSTAT); - break; - case REBOOTPWR_CHECK_HWSTAT: - self->last_hwstat = self->last_reg_rd[0]; - if (self->last_hwstat & 0x1) - fpi_ssm_mark_completed(ssm); - else - fpi_ssm_next_state(ssm); - break; - case REBOOTPWR_PAUSE: - fpi_device_add_timeout(_dev, 10, rebootpwr_pause_cb, ssm); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case REBOOTPWR_SET_HWSTAT: + self->rebootpwr_ctr = 100; + sm_set_hwstat (ssm, dev, self->last_hwstat & 0xf); + break; + + case REBOOTPWR_GET_HWSTAT: + sm_read_reg (ssm, dev, REG_HWSTAT); + break; + + case REBOOTPWR_CHECK_HWSTAT: + self->last_hwstat = self->last_reg_rd[0]; + if (self->last_hwstat & 0x1) + fpi_ssm_mark_completed (ssm); + else + fpi_ssm_next_state (ssm); + break; + + case REBOOTPWR_PAUSE: + fpi_device_add_timeout (_dev, 10, rebootpwr_pause_cb, ssm); + break; + } } /* After messing with the device firmware in its low-power state, we have to @@ -827,523 +894,587 @@ static void rebootpwr_run_state(FpiSsm *ssm, FpDevice *_dev, void *user_data) * * This is implemented as the powerup state machine below. Pseudo-code: - status = get_hwstat(); - for (i = 0; i < 100; i++) { - set_hwstat(status & 0xf); - if ((get_hwstat() & 0x80) == 0) - break; + status = get_hwstat(); + for (i = 0; i < 100; i++) { + set_hwstat(status & 0xf); + if ((get_hwstat() & 0x80) == 0) + break; - usleep(10000); - if (need_auth_cr) - auth_cr(); - } + usleep(10000); + if (need_auth_cr) + auth_cr(); + } - if (tmp & 0x80) - error("could not power up device"); + if (tmp & 0x80) + error("could not power up device"); */ enum powerup_states { - POWERUP_INIT = 0, - POWERUP_SET_HWSTAT, - POWERUP_GET_HWSTAT, - POWERUP_CHECK_HWSTAT, - POWERUP_PAUSE, - POWERUP_CHALLENGE_RESPONSE, - POWERUP_CHALLENGE_RESPONSE_SUCCESS, - POWERUP_NUM_STATES, + POWERUP_INIT = 0, + POWERUP_SET_HWSTAT, + POWERUP_GET_HWSTAT, + POWERUP_CHECK_HWSTAT, + POWERUP_PAUSE, + POWERUP_CHALLENGE_RESPONSE, + POWERUP_CHALLENGE_RESPONSE_SUCCESS, + POWERUP_NUM_STATES, }; static void -powerup_pause_cb(FpDevice *dev, - void *data) +powerup_pause_cb (FpDevice *dev, + void *data) { - FpiSsm *ssm = data; - FpiDeviceUru4000 *self = FPI_DEVICE_URU4000(dev); + FpiSsm *ssm = data; + FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev); - if (!--self->powerup_ctr) { - fp_err("could not power device up"); - fpi_ssm_mark_failed(ssm, - fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, - "could not power device up")); - } else if (!self->profile->auth_cr) { - fpi_ssm_jump_to_state(ssm, POWERUP_SET_HWSTAT); - } else { - fpi_ssm_next_state(ssm); - } + if (!--self->powerup_ctr) + { + fp_err ("could not power device up"); + fpi_ssm_mark_failed (ssm, + fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, + "could not power device up")); + } + else if (!self->profile->auth_cr) + { + fpi_ssm_jump_to_state (ssm, POWERUP_SET_HWSTAT); + } + else + { + fpi_ssm_next_state (ssm); + } } -static void powerup_run_state(FpiSsm *ssm, FpDevice *_dev, void *user_data) +static void +powerup_run_state (FpiSsm *ssm, FpDevice *_dev, void *user_data) { - FpImageDevice *dev = user_data; - FpiDeviceUru4000 *self = FPI_DEVICE_URU4000(_dev); + FpImageDevice *dev = user_data; + FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (_dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case POWERUP_INIT: - self->powerup_ctr = 100; - self->powerup_hwstat = self->last_hwstat & 0xf; - fpi_ssm_next_state(ssm); - break; - case POWERUP_SET_HWSTAT: - sm_set_hwstat(ssm, dev, self->powerup_hwstat); - break; - case POWERUP_GET_HWSTAT: - sm_read_reg(ssm, dev, REG_HWSTAT); - break; - case POWERUP_CHECK_HWSTAT: - self->last_hwstat = self->last_reg_rd[0]; - if ((self->last_reg_rd[0] & 0x80) == 0) - fpi_ssm_mark_completed(ssm); - else - fpi_ssm_next_state(ssm); - break; - case POWERUP_PAUSE: - fpi_device_add_timeout(_dev, 10, powerup_pause_cb, ssm); - break; - case POWERUP_CHALLENGE_RESPONSE: - sm_do_challenge_response(ssm, dev); - break; - case POWERUP_CHALLENGE_RESPONSE_SUCCESS: - fpi_ssm_jump_to_state(ssm, POWERUP_SET_HWSTAT); - break; - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case POWERUP_INIT: + self->powerup_ctr = 100; + self->powerup_hwstat = self->last_hwstat & 0xf; + fpi_ssm_next_state (ssm); + break; + + case POWERUP_SET_HWSTAT: + sm_set_hwstat (ssm, dev, self->powerup_hwstat); + break; + + case POWERUP_GET_HWSTAT: + sm_read_reg (ssm, dev, REG_HWSTAT); + break; + + case POWERUP_CHECK_HWSTAT: + self->last_hwstat = self->last_reg_rd[0]; + if ((self->last_reg_rd[0] & 0x80) == 0) + fpi_ssm_mark_completed (ssm); + else + fpi_ssm_next_state (ssm); + break; + + case POWERUP_PAUSE: + fpi_device_add_timeout (_dev, 10, powerup_pause_cb, ssm); + break; + + case POWERUP_CHALLENGE_RESPONSE: + sm_do_challenge_response (ssm, dev); + break; + + case POWERUP_CHALLENGE_RESPONSE_SUCCESS: + fpi_ssm_jump_to_state (ssm, POWERUP_SET_HWSTAT); + break; + } } /* * This is the main initialization state machine. As pseudo-code: - status = get_hwstat(); + status = get_hwstat(); - // correct device power state - if ((status & 0x84) == 0x84) - run_reboot_sm(); + // correct device power state + if ((status & 0x84) == 0x84) + run_reboot_sm(); - // power device down - if ((status & 0x80) == 0) - set_hwstat(status | 0x80); + // power device down + if ((status & 0x80) == 0) + set_hwstat(status | 0x80); - // power device up - run_powerup_sm(); - await_irq(IRQDATA_SCANPWR_ON); + // power device up + run_powerup_sm(); + await_irq(IRQDATA_SCANPWR_ON); */ enum init_states { - INIT_GET_HWSTAT = 0, - INIT_CHECK_HWSTAT_REBOOT, - INIT_REBOOT_POWER, - INIT_CHECK_HWSTAT_POWERDOWN, - INIT_POWERUP, - INIT_AWAIT_SCAN_POWER, - INIT_DONE, - INIT_GET_VERSION, - INIT_REPORT_VERSION, - INIT_NUM_STATES, + INIT_GET_HWSTAT = 0, + INIT_CHECK_HWSTAT_REBOOT, + INIT_REBOOT_POWER, + INIT_CHECK_HWSTAT_POWERDOWN, + INIT_POWERUP, + INIT_AWAIT_SCAN_POWER, + INIT_DONE, + INIT_GET_VERSION, + INIT_REPORT_VERSION, + INIT_NUM_STATES, }; -static void init_scanpwr_irq_cb(FpImageDevice *dev, GError *error, - uint16_t type, void *user_data) +static void +init_scanpwr_irq_cb (FpImageDevice *dev, GError *error, + uint16_t type, void *user_data) { - FpiSsm *ssm = user_data; - FpiDeviceUru4000 *urudev = FPI_DEVICE_URU4000 (dev); + FpiSsm *ssm = user_data; + FpiDeviceUru4000 *urudev = FPI_DEVICE_URU4000 (dev); - if (error) - fpi_ssm_mark_failed(ssm, error); - else if (type != IRQDATA_SCANPWR_ON) - fp_dbg("ignoring interrupt"); - else if (fpi_ssm_get_cur_state(ssm) != INIT_AWAIT_SCAN_POWER) { - fp_dbg("early scanpwr interrupt"); - urudev->scanpwr_irq_timeouts = -1; - } else { - fp_dbg("late scanpwr interrupt"); - fpi_ssm_next_state(ssm); - } + if (error) + { + fpi_ssm_mark_failed (ssm, error); + } + else if (type != IRQDATA_SCANPWR_ON) + { + fp_dbg ("ignoring interrupt"); + } + else if (fpi_ssm_get_cur_state (ssm) != INIT_AWAIT_SCAN_POWER) + { + fp_dbg ("early scanpwr interrupt"); + urudev->scanpwr_irq_timeouts = -1; + } + else + { + fp_dbg ("late scanpwr interrupt"); + fpi_ssm_next_state (ssm); + } } static void -init_scanpwr_timeout(FpDevice *dev, - void *user_data) +init_scanpwr_timeout (FpDevice *dev, + void *user_data) { - FpiSsm *ssm = user_data; - FpiDeviceUru4000 *self = FPI_DEVICE_URU4000(dev); + FpiSsm *ssm = user_data; + FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev); - fp_warn("powerup timed out"); - self->irq_cb = NULL; - self->scanpwr_irq_timeout = NULL; + fp_warn ("powerup timed out"); + self->irq_cb = NULL; + self->scanpwr_irq_timeout = NULL; - if (++self->scanpwr_irq_timeouts >= 3) { - fp_err("powerup timed out 3 times, giving up"); - fpi_ssm_mark_failed(ssm, - g_error_new_literal (G_USB_DEVICE_ERROR, - G_USB_DEVICE_ERROR_TIMED_OUT, - "Powerup timed out 3 times, giving up")); - } else { - fpi_ssm_jump_to_state(ssm, INIT_GET_HWSTAT); - } + if (++self->scanpwr_irq_timeouts >= 3) + { + fp_err ("powerup timed out 3 times, giving up"); + fpi_ssm_mark_failed (ssm, + g_error_new_literal (G_USB_DEVICE_ERROR, + G_USB_DEVICE_ERROR_TIMED_OUT, + "Powerup timed out 3 times, giving up")); + } + else + { + fpi_ssm_jump_to_state (ssm, INIT_GET_HWSTAT); + } } -static void init_run_state(FpiSsm *ssm, FpDevice *_dev, void *user_data) +static void +init_run_state (FpiSsm *ssm, FpDevice *_dev, void *user_data) { - FpImageDevice *dev = user_data; - FpiDeviceUru4000 *self = FPI_DEVICE_URU4000(_dev); + FpImageDevice *dev = user_data; + FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (_dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case INIT_GET_HWSTAT: - sm_read_reg(ssm, dev, REG_HWSTAT); - break; - case INIT_CHECK_HWSTAT_REBOOT: - self->last_hwstat = self->last_reg_rd[0]; - if ((self->last_hwstat & 0x84) == 0x84) - fpi_ssm_next_state(ssm); - else - fpi_ssm_jump_to_state(ssm, INIT_CHECK_HWSTAT_POWERDOWN); - break; - case INIT_REBOOT_POWER: ; - FpiSsm *rebootsm = fpi_ssm_new(FP_DEVICE(dev), - rebootpwr_run_state, - REBOOTPWR_NUM_STATES, dev); - fpi_ssm_start_subsm(ssm, rebootsm); - break; - case INIT_CHECK_HWSTAT_POWERDOWN: - if ((self->last_hwstat & 0x80) == 0) - sm_set_hwstat(ssm, dev, self->last_hwstat | 0x80); - else - fpi_ssm_next_state(ssm); - break; - case INIT_POWERUP: - if (!IRQ_HANDLER_IS_RUNNING(self)) { - fpi_ssm_mark_failed(ssm, fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, - "IRQ handler should be running but is not")); - return; - } - self->irq_cb_data = ssm; - self->irq_cb = init_scanpwr_irq_cb; + switch (fpi_ssm_get_cur_state (ssm)) + { + case INIT_GET_HWSTAT: + sm_read_reg (ssm, dev, REG_HWSTAT); + break; - FpiSsm *powerupsm = fpi_ssm_new(FP_DEVICE(dev), - powerup_run_state, - POWERUP_NUM_STATES, dev); - fpi_ssm_start_subsm(ssm, powerupsm); - break; - case INIT_AWAIT_SCAN_POWER: - if (self->scanpwr_irq_timeouts < 0) { - fpi_ssm_next_state(ssm); - break; - } + case INIT_CHECK_HWSTAT_REBOOT: + self->last_hwstat = self->last_reg_rd[0]; + if ((self->last_hwstat & 0x84) == 0x84) + fpi_ssm_next_state (ssm); + else + fpi_ssm_jump_to_state (ssm, INIT_CHECK_HWSTAT_POWERDOWN); + break; - /* sometimes the 56aa interrupt that we are waiting for never arrives, - * so we include this timeout loop to retry the whole process 3 times - * if we don't get an irq any time soon. */ - self->scanpwr_irq_timeout = fpi_device_add_timeout(_dev, - 300, - init_scanpwr_timeout, - ssm); - break; - case INIT_DONE: - if (self->scanpwr_irq_timeout) { - g_source_destroy (self->scanpwr_irq_timeout); - self->scanpwr_irq_timeout = NULL; - } - self->irq_cb_data = NULL; - self->irq_cb = NULL; - fpi_ssm_next_state(ssm); - break; - case INIT_GET_VERSION: - sm_read_regs(ssm, dev, REG_DEVICE_INFO, 16); - break; - case INIT_REPORT_VERSION: - /* Likely hardware revision, and firmware version. - * Not sure which is which. */ - fp_info("Versions %02x%02x and %02x%02x", - self->last_reg_rd[10], self->last_reg_rd[11], - self->last_reg_rd[4], self->last_reg_rd[5]); - fpi_ssm_mark_completed(ssm); - break; - } + case INIT_REBOOT_POWER:; + FpiSsm *rebootsm = fpi_ssm_new (FP_DEVICE (dev), + rebootpwr_run_state, + REBOOTPWR_NUM_STATES, dev); + fpi_ssm_start_subsm (ssm, rebootsm); + break; + + case INIT_CHECK_HWSTAT_POWERDOWN: + if ((self->last_hwstat & 0x80) == 0) + sm_set_hwstat (ssm, dev, self->last_hwstat | 0x80); + else + fpi_ssm_next_state (ssm); + break; + + case INIT_POWERUP: + if (!IRQ_HANDLER_IS_RUNNING (self)) + { + fpi_ssm_mark_failed (ssm, fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, + "IRQ handler should be running but is not")); + return; + } + self->irq_cb_data = ssm; + self->irq_cb = init_scanpwr_irq_cb; + + FpiSsm *powerupsm = fpi_ssm_new (FP_DEVICE (dev), + powerup_run_state, + POWERUP_NUM_STATES, dev); + fpi_ssm_start_subsm (ssm, powerupsm); + break; + + case INIT_AWAIT_SCAN_POWER: + if (self->scanpwr_irq_timeouts < 0) + { + fpi_ssm_next_state (ssm); + break; + } + + /* sometimes the 56aa interrupt that we are waiting for never arrives, + * so we include this timeout loop to retry the whole process 3 times + * if we don't get an irq any time soon. */ + self->scanpwr_irq_timeout = fpi_device_add_timeout (_dev, + 300, + init_scanpwr_timeout, + ssm); + break; + + case INIT_DONE: + if (self->scanpwr_irq_timeout) + { + g_source_destroy (self->scanpwr_irq_timeout); + self->scanpwr_irq_timeout = NULL; + } + self->irq_cb_data = NULL; + self->irq_cb = NULL; + fpi_ssm_next_state (ssm); + break; + + case INIT_GET_VERSION: + sm_read_regs (ssm, dev, REG_DEVICE_INFO, 16); + break; + + case INIT_REPORT_VERSION: + /* Likely hardware revision, and firmware version. + * Not sure which is which. */ + fp_info ("Versions %02x%02x and %02x%02x", + self->last_reg_rd[10], self->last_reg_rd[11], + self->last_reg_rd[4], self->last_reg_rd[5]); + fpi_ssm_mark_completed (ssm); + break; + } } -static void activate_initsm_complete(FpiSsm *ssm, FpDevice *dev, - void *user_data, GError *error) +static void +activate_initsm_complete (FpiSsm *ssm, FpDevice *dev, + void *user_data, GError *error) { - fpi_image_device_activate_complete(FP_IMAGE_DEVICE (dev), error); + fpi_image_device_activate_complete (FP_IMAGE_DEVICE (dev), error); } -static void dev_activate(FpImageDevice *dev) +static void +dev_activate (FpImageDevice *dev) { - FpiDeviceUru4000 *self = FPI_DEVICE_URU4000(dev); - FpiSsm *ssm; + FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev); + FpiSsm *ssm; - start_irq_handler(dev); + start_irq_handler (dev); - self->scanpwr_irq_timeouts = 0; - ssm = fpi_ssm_new(FP_DEVICE(dev), init_run_state, INIT_NUM_STATES, NULL); - fpi_ssm_start(ssm, activate_initsm_complete); + self->scanpwr_irq_timeouts = 0; + ssm = fpi_ssm_new (FP_DEVICE (dev), init_run_state, INIT_NUM_STATES, NULL); + fpi_ssm_start (ssm, activate_initsm_complete); } /***** DEINITIALIZATION *****/ -static void deactivate_irqs_stopped(FpImageDevice *dev) +static void +deactivate_irqs_stopped (FpImageDevice *dev) { - fpi_image_device_deactivate_complete(dev, NULL); + fpi_image_device_deactivate_complete (dev, NULL); } -static void deactivate_write_reg_cb(FpiUsbTransfer *transfer, FpDevice *dev, - gpointer user_data, GError *error) +static void +deactivate_write_reg_cb (FpiUsbTransfer *transfer, FpDevice *dev, + gpointer user_data, GError *error) { - stop_irq_handler(FP_IMAGE_DEVICE (dev), deactivate_irqs_stopped); + stop_irq_handler (FP_IMAGE_DEVICE (dev), deactivate_irqs_stopped); } -static void dev_deactivate(FpImageDevice *dev) +static void +dev_deactivate (FpImageDevice *dev) { - dev_change_state(dev, FP_IMAGE_DEVICE_STATE_INACTIVE); + dev_change_state (dev, FP_IMAGE_DEVICE_STATE_INACTIVE); } -static void execute_state_change(FpImageDevice *dev) +static void +execute_state_change (FpImageDevice *dev) { - FpiDeviceUru4000 *self = FPI_DEVICE_URU4000(dev); - FpiSsm *ssm; + FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev); + FpiSsm *ssm; - switch (self->activate_state) { - case FP_IMAGE_DEVICE_STATE_INACTIVE: - fp_dbg("deactivating"); - self->irq_cb = NULL; - self->irq_cb_data = NULL; - write_reg(dev, REG_MODE, MODE_OFF, - deactivate_write_reg_cb, NULL); - break; + switch (self->activate_state) + { + case FP_IMAGE_DEVICE_STATE_INACTIVE: + fp_dbg ("deactivating"); + self->irq_cb = NULL; + self->irq_cb_data = NULL; + write_reg (dev, REG_MODE, MODE_OFF, + deactivate_write_reg_cb, NULL); + break; - case FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_ON: - fp_dbg("wait finger on"); - if (!IRQ_HANDLER_IS_RUNNING(self)) { - fpi_image_device_session_error (dev, - fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, - "IRQ handler should be running but is not")); - return; - } - self->irq_cb = finger_presence_irq_cb; - write_reg(dev, REG_MODE, MODE_AWAIT_FINGER_ON, - change_state_write_reg_cb, NULL); - break; + case FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_ON: + fp_dbg ("wait finger on"); + if (!IRQ_HANDLER_IS_RUNNING (self)) + { + fpi_image_device_session_error (dev, + fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, + "IRQ handler should be running but is not")); + return; + } + self->irq_cb = finger_presence_irq_cb; + write_reg (dev, REG_MODE, MODE_AWAIT_FINGER_ON, + change_state_write_reg_cb, NULL); + break; - case FP_IMAGE_DEVICE_STATE_CAPTURE: - fp_dbg("starting capture"); - self->irq_cb = NULL; + case FP_IMAGE_DEVICE_STATE_CAPTURE: + fp_dbg ("starting capture"); + self->irq_cb = NULL; - ssm = fpi_ssm_new(FP_DEVICE(dev), imaging_run_state, - IMAGING_NUM_STATES, dev); - self->img_enc_seed = rand(); - self->img_transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); - self->img_transfer->ssm = ssm; - self->img_transfer->short_is_error = FALSE; - fpi_usb_transfer_fill_bulk(self->img_transfer, - EP_DATA, - sizeof(struct uru4k_image)); + ssm = fpi_ssm_new (FP_DEVICE (dev), imaging_run_state, + IMAGING_NUM_STATES, dev); + self->img_enc_seed = rand (); + self->img_transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); + self->img_transfer->ssm = ssm; + self->img_transfer->short_is_error = FALSE; + fpi_usb_transfer_fill_bulk (self->img_transfer, + EP_DATA, + sizeof (struct uru4k_image)); - fpi_ssm_start(ssm, imaging_complete); + fpi_ssm_start (ssm, imaging_complete); - write_reg(dev, REG_MODE, MODE_CAPTURE, - change_state_write_reg_cb, NULL); - break; + write_reg (dev, REG_MODE, MODE_CAPTURE, + change_state_write_reg_cb, NULL); + break; - case FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF: - fp_dbg("await finger off"); - if (!IRQ_HANDLER_IS_RUNNING(self)) { - fpi_image_device_session_error (dev, - fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, - "IRQ handler should be running but is not")); - return; - } - self->irq_cb = finger_presence_irq_cb; - write_reg(dev, REG_MODE, MODE_AWAIT_FINGER_OFF, - change_state_write_reg_cb, NULL); - break; - } + case FP_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF: + fp_dbg ("await finger off"); + if (!IRQ_HANDLER_IS_RUNNING (self)) + { + fpi_image_device_session_error (dev, + fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, + "IRQ handler should be running but is not")); + return; + } + self->irq_cb = finger_presence_irq_cb; + write_reg (dev, REG_MODE, MODE_AWAIT_FINGER_OFF, + change_state_write_reg_cb, NULL); + break; + } } /***** LIBRARY STUFF *****/ -static void dev_init(FpImageDevice *dev) +static void +dev_init (FpImageDevice *dev) { - GError *error = NULL; - FpiDeviceUru4000 *self; - g_autoptr(GPtrArray) interfaces = NULL; - GUsbInterface *iface = NULL; - guint64 driver_data; - SECStatus rv; - SECItem item; - int i; + GError *error = NULL; + FpiDeviceUru4000 *self; - interfaces = g_usb_device_get_interfaces (fpi_device_get_usb_device(FP_DEVICE(dev)), &error); - if (error) { - fpi_image_device_open_complete (dev, error); - return; - } + g_autoptr(GPtrArray) interfaces = NULL; + GUsbInterface *iface = NULL; + guint64 driver_data; + SECStatus rv; + SECItem item; + int i; - /* Find fingerprint interface; TODO: Move this into probe() */ - for (i = 0; i < interfaces->len; i++) { - GUsbInterface *cur_iface = g_ptr_array_index (interfaces, i); + interfaces = g_usb_device_get_interfaces (fpi_device_get_usb_device (FP_DEVICE (dev)), &error); + if (error) + { + fpi_image_device_open_complete (dev, error); + return; + } - if (g_usb_interface_get_class (cur_iface) == 255 && - g_usb_interface_get_subclass (cur_iface) == 255 && - g_usb_interface_get_protocol (cur_iface) == 255) { - iface = cur_iface; - break; - } - } + /* Find fingerprint interface; TODO: Move this into probe() */ + for (i = 0; i < interfaces->len; i++) + { + GUsbInterface *cur_iface = g_ptr_array_index (interfaces, i); - if (iface == NULL) { - fp_err("could not find interface"); - fpi_image_device_open_complete (dev, - fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, - "Could not find interface")); - return; - } + if (g_usb_interface_get_class (cur_iface) == 255 && + g_usb_interface_get_subclass (cur_iface) == 255 && + g_usb_interface_get_protocol (cur_iface) == 255) + { + iface = cur_iface; + break; + } + } - /* TODO: Find/check endpoints; does not seem easily possible with GUsb unfortunately! */ + if (iface == NULL) + { + fp_err ("could not find interface"); + fpi_image_device_open_complete (dev, + fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, + "Could not find interface")); + return; + } + + /* TODO: Find/check endpoints; does not seem easily possible with GUsb unfortunately! */ #if 0 - if (iface_desc->bNumEndpoints != 2) { - fp_err("found %d endpoints!?", iface_desc->bNumEndpoints); - r = -ENODEV; - goto out; - } + if (iface_desc->bNumEndpoints != 2) + { + fp_err ("found %d endpoints!?", iface_desc->bNumEndpoints); + r = -ENODEV; + goto out; + } - ep = &iface_desc->endpoint[0]; - if (ep->bEndpointAddress != EP_INTR - || (ep->bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) != - LIBUSB_TRANSFER_TYPE_INTERRUPT) { - fp_err("unrecognised interrupt endpoint"); - r = -ENODEV; - goto out; - } + ep = &iface_desc->endpoint[0]; + if (ep->bEndpointAddress != EP_INTR || + (ep->bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) != + LIBUSB_TRANSFER_TYPE_INTERRUPT) + { + fp_err ("unrecognised interrupt endpoint"); + r = -ENODEV; + goto out; + } - ep = &iface_desc->endpoint[1]; - if (ep->bEndpointAddress != EP_DATA - || (ep->bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) != - LIBUSB_TRANSFER_TYPE_BULK) { - fp_err("unrecognised bulk endpoint"); - r = -ENODEV; - goto out; - } + ep = &iface_desc->endpoint[1]; + if (ep->bEndpointAddress != EP_DATA || + (ep->bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) != + LIBUSB_TRANSFER_TYPE_BULK) + { + fp_err ("unrecognised bulk endpoint"); + r = -ENODEV; + goto out; + } #endif - /* Device looks like a supported reader */ + /* Device looks like a supported reader */ - if (!g_usb_device_claim_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), - g_usb_interface_get_number (iface), 0, &error)) { - fpi_image_device_open_complete(dev, error); - return; - } + if (!g_usb_device_claim_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), + g_usb_interface_get_number (iface), 0, &error)) + { + fpi_image_device_open_complete (dev, error); + return; + } - /* Disable loading p11-kit's user configuration */ - g_setenv ("P11_KIT_NO_USER_CONFIG", "1", TRUE); + /* Disable loading p11-kit's user configuration */ + g_setenv ("P11_KIT_NO_USER_CONFIG", "1", TRUE); - /* Initialise NSS early */ - rv = NSS_NoDB_Init("."); - if (rv != SECSuccess) { - fp_err("could not initialise NSS"); - fpi_image_device_open_complete (dev, - fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, - "Could not initialise NSS")); - return; - } + /* Initialise NSS early */ + rv = NSS_NoDB_Init ("."); + if (rv != SECSuccess) + { + fp_err ("could not initialise NSS"); + fpi_image_device_open_complete (dev, + fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, + "Could not initialise NSS")); + return; + } - self = FPI_DEVICE_URU4000(dev); + self = FPI_DEVICE_URU4000 (dev); - driver_data = fpi_device_get_driver_data (FP_DEVICE (dev)); - self->profile = &uru4k_dev_info[driver_data]; - self->interface = g_usb_interface_get_number (iface); + driver_data = fpi_device_get_driver_data (FP_DEVICE (dev)); + self->profile = &uru4k_dev_info[driver_data]; + self->interface = g_usb_interface_get_number (iface); - /* Set up encryption */ - self->cipher = CKM_AES_ECB; - self->slot = PK11_GetBestSlot(self->cipher, NULL); - if (self->slot == NULL) { - fp_err("could not get encryption slot"); - fpi_image_device_open_complete (dev, - fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, - "Could not get encryption slot")); - return; - } - item.type = siBuffer; - item.data = (unsigned char*) crkey; - item.len = sizeof(crkey); - self->symkey = PK11_ImportSymKey(self->slot, - self->cipher, - PK11_OriginUnwrap, - CKA_ENCRYPT, - &item, NULL); - if (self->symkey == NULL) { - fp_err("failed to import key into NSS"); - PK11_FreeSlot(self->slot); - self->slot = NULL; - fpi_image_device_open_complete (dev, - fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, - "Failed to import key into NSS")); - return; - } - self->param = PK11_ParamFromIV(self->cipher, NULL); + /* Set up encryption */ + self->cipher = CKM_AES_ECB; + self->slot = PK11_GetBestSlot (self->cipher, NULL); + if (self->slot == NULL) + { + fp_err ("could not get encryption slot"); + fpi_image_device_open_complete (dev, + fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, + "Could not get encryption slot")); + return; + } + item.type = siBuffer; + item.data = (unsigned char *) crkey; + item.len = sizeof (crkey); + self->symkey = PK11_ImportSymKey (self->slot, + self->cipher, + PK11_OriginUnwrap, + CKA_ENCRYPT, + &item, NULL); + if (self->symkey == NULL) + { + fp_err ("failed to import key into NSS"); + PK11_FreeSlot (self->slot); + self->slot = NULL; + fpi_image_device_open_complete (dev, + fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, + "Failed to import key into NSS")); + return; + } + self->param = PK11_ParamFromIV (self->cipher, NULL); - fpi_image_device_open_complete(dev, NULL); + fpi_image_device_open_complete (dev, NULL); } -static void dev_deinit(FpImageDevice *dev) +static void +dev_deinit (FpImageDevice *dev) { - GError *error = NULL; - FpiDeviceUru4000 *self = FPI_DEVICE_URU4000(dev); - if (self->symkey) - PK11_FreeSymKey (self->symkey); - if (self->param) - SECITEM_FreeItem(self->param, PR_TRUE); - if (self->slot) - PK11_FreeSlot(self->slot); - g_usb_device_release_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), - self->interface, 0, &error); - fpi_image_device_close_complete(dev, error); + GError *error = NULL; + FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev); + + if (self->symkey) + PK11_FreeSymKey (self->symkey); + if (self->param) + SECITEM_FreeItem (self->param, PR_TRUE); + if (self->slot) + PK11_FreeSlot (self->slot); + g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), + self->interface, 0, &error); + fpi_image_device_close_complete (dev, error); } -static const FpIdEntry id_table [ ] = { - /* ms kbd with fp rdr */ - { .vid = 0x045e, .pid = 0x00bb, .driver_data = MS_KBD }, +static const FpIdEntry id_table[] = { + /* ms kbd with fp rdr */ + { .vid = 0x045e, .pid = 0x00bb, .driver_data = MS_KBD }, - /* ms intellimouse with fp rdr */ - { .vid = 0x045e, .pid = 0x00bc, .driver_data = MS_INTELLIMOUSE }, + /* ms intellimouse with fp rdr */ + { .vid = 0x045e, .pid = 0x00bc, .driver_data = MS_INTELLIMOUSE }, - /* ms fp rdr (standalone) */ - { .vid = 0x045e, .pid = 0x00bd, .driver_data = MS_STANDALONE }, + /* ms fp rdr (standalone) */ + { .vid = 0x045e, .pid = 0x00bd, .driver_data = MS_STANDALONE }, - /* ms fp rdr (standalone) v2 */ - { .vid = 0x045e, .pid = 0x00ca, .driver_data = MS_STANDALONE_V2 }, + /* ms fp rdr (standalone) v2 */ + { .vid = 0x045e, .pid = 0x00ca, .driver_data = MS_STANDALONE_V2 }, - /* dp uru4000 (standalone) */ - { .vid = 0x05ba, .pid = 0x0007, .driver_data = DP_URU4000 }, + /* dp uru4000 (standalone) */ + { .vid = 0x05ba, .pid = 0x0007, .driver_data = DP_URU4000 }, - /* dp uru4000 (keyboard) */ - { .vid = 0x05ba, .pid = 0x0008, .driver_data = DP_URU4000 }, + /* dp uru4000 (keyboard) */ + { .vid = 0x05ba, .pid = 0x0008, .driver_data = DP_URU4000 }, - /* dp uru4000b (standalone) */ - { .vid = 0x05ba, .pid = 0x000a, .driver_data = DP_URU4000B }, + /* dp uru4000b (standalone) */ + { .vid = 0x05ba, .pid = 0x000a, .driver_data = DP_URU4000B }, - /* terminating entry */ - { .vid = 0, .pid = 0, .driver_data = 0 }, + /* terminating entry */ + { .vid = 0, .pid = 0, .driver_data = 0 }, }; -static void fpi_device_uru4000_init(FpiDeviceUru4000 *self) { +static void +fpi_device_uru4000_init (FpiDeviceUru4000 *self) +{ } -static void fpi_device_uru4000_class_init(FpiDeviceUru4000Class *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); - FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS(klass); +static void +fpi_device_uru4000_class_init (FpiDeviceUru4000Class *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); + FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); - dev_class->id = "uru4000"; - dev_class->full_name = "Digital Persona U.are.U 4000/4000B/4500"; - dev_class->type = FP_DEVICE_TYPE_USB; - dev_class->id_table = id_table; - dev_class->scan_type = FP_SCAN_TYPE_PRESS; + dev_class->id = "uru4000"; + dev_class->full_name = "Digital Persona U.are.U 4000/4000B/4500"; + dev_class->type = FP_DEVICE_TYPE_USB; + dev_class->id_table = id_table; + dev_class->scan_type = FP_SCAN_TYPE_PRESS; - img_class->img_open = dev_init; - img_class->img_close = dev_deinit; - img_class->activate = dev_activate; - img_class->deactivate = dev_deactivate; - img_class->change_state = dev_change_state; + img_class->img_open = dev_init; + img_class->img_close = dev_deinit; + img_class->activate = dev_activate; + img_class->deactivate = dev_deactivate; + img_class->change_state = dev_change_state; - img_class->img_width = IMAGE_WIDTH; - img_class->img_height = IMAGE_HEIGHT; + img_class->img_width = IMAGE_WIDTH; + img_class->img_height = IMAGE_HEIGHT; } - diff --git a/libfprint/drivers/vcom5s.c b/libfprint/drivers/vcom5s.c index c97c419..74e7bdb 100644 --- a/libfprint/drivers/vcom5s.c +++ b/libfprint/drivers/vcom5s.c @@ -28,109 +28,112 @@ * powerdown? does windows do anything special on exit? */ -#define CTRL_TIMEOUT 1000 -#define EP_IN (1 | FPI_USB_ENDPOINT_IN) +#define CTRL_TIMEOUT 1000 +#define EP_IN (1 | FPI_USB_ENDPOINT_IN) -#define IMG_WIDTH 300 -#define IMG_HEIGHT 288 -#define ROWS_PER_RQ 12 -#define NR_REQS (IMG_HEIGHT / ROWS_PER_RQ) -#define RQ_SIZE (IMG_WIDTH * ROWS_PER_RQ) -#define IMG_SIZE (IMG_WIDTH * IMG_HEIGHT) +#define IMG_WIDTH 300 +#define IMG_HEIGHT 288 +#define ROWS_PER_RQ 12 +#define NR_REQS (IMG_HEIGHT / ROWS_PER_RQ) +#define RQ_SIZE (IMG_WIDTH * ROWS_PER_RQ) +#define IMG_SIZE (IMG_WIDTH * IMG_HEIGHT) -struct _FpDeviceVcom5s { - FpImageDevice parent; +struct _FpDeviceVcom5s +{ + FpImageDevice parent; - int capture_iteration; - FpImage *capture_img; - gboolean loop_running; - gboolean deactivating; + int capture_iteration; + FpImage *capture_img; + gboolean loop_running; + gboolean deactivating; }; -G_DECLARE_FINAL_TYPE(FpDeviceVcom5s, fpi_device_vcom5s, FPI, DEVICE_VCOM5S, - FpImageDevice); -G_DEFINE_TYPE(FpDeviceVcom5s, fpi_device_vcom5s, FP_TYPE_IMAGE_DEVICE); +G_DECLARE_FINAL_TYPE (FpDeviceVcom5s, fpi_device_vcom5s, FPI, DEVICE_VCOM5S, + FpImageDevice); +G_DEFINE_TYPE (FpDeviceVcom5s, fpi_device_vcom5s, FP_TYPE_IMAGE_DEVICE); enum v5s_regs { - /* when using gain 0x29: - * a value of 0x00 produces mostly-black image - * 0x09 destroys ridges (too white) - * 0x01 or 0x02 seem good values */ - REG_CONTRAST = 0x02, + /* when using gain 0x29: + * a value of 0x00 produces mostly-black image + * 0x09 destroys ridges (too white) + * 0x01 or 0x02 seem good values */ + REG_CONTRAST = 0x02, - /* when using contrast 0x01: - * a value of 0x00 will produce an all-black image. - * 0x29 produces a good contrast image: ridges quite dark, but some - * light grey noise as background - * 0x46 produces all-white image with grey ridges (not very dark) */ - REG_GAIN = 0x03, + /* when using contrast 0x01: + * a value of 0x00 will produce an all-black image. + * 0x29 produces a good contrast image: ridges quite dark, but some + * light grey noise as background + * 0x46 produces all-white image with grey ridges (not very dark) */ + REG_GAIN = 0x03, }; enum v5s_cmd { - /* scan one row. has parameter, at a guess this is which row to scan? */ - CMD_SCAN_ONE_ROW = 0xc0, + /* scan one row. has parameter, at a guess this is which row to scan? */ + CMD_SCAN_ONE_ROW = 0xc0, - /* scan whole image */ - CMD_SCAN = 0xc1, + /* scan whole image */ + CMD_SCAN = 0xc1, }; /***** REGISTER I/O *****/ -static void sm_write_reg_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +sm_write_reg_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - if (error) - fpi_ssm_mark_failed(transfer->ssm, error); - else - fpi_ssm_next_state(transfer->ssm); + if (error) + fpi_ssm_mark_failed (transfer->ssm, error); + else + fpi_ssm_next_state (transfer->ssm); } static void -sm_write_reg(FpiSsm *ssm, - FpDevice *dev, - unsigned char reg, - unsigned char value) +sm_write_reg (FpiSsm *ssm, + FpDevice *dev, + unsigned char reg, + unsigned char value) { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(dev); + FpiUsbTransfer *transfer = fpi_usb_transfer_new (dev); - fp_dbg("set %02x=%02x", reg, value); - fpi_usb_transfer_fill_control(transfer, - G_USB_DEVICE_DIRECTION_HOST_TO_DEVICE, - G_USB_DEVICE_REQUEST_TYPE_VENDOR, - G_USB_DEVICE_RECIPIENT_DEVICE, - reg, value, 0, 0); - transfer->ssm = ssm; - fpi_usb_transfer_submit(transfer, CTRL_TIMEOUT, NULL, sm_write_reg_cb, - NULL); - fpi_usb_transfer_unref(transfer); -} - -static void sm_exec_cmd_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) -{ - if (error) - fpi_ssm_mark_failed(transfer->ssm, error); - else - fpi_ssm_next_state(transfer->ssm); + fp_dbg ("set %02x=%02x", reg, value); + fpi_usb_transfer_fill_control (transfer, + G_USB_DEVICE_DIRECTION_HOST_TO_DEVICE, + G_USB_DEVICE_REQUEST_TYPE_VENDOR, + G_USB_DEVICE_RECIPIENT_DEVICE, + reg, value, 0, 0); + transfer->ssm = ssm; + fpi_usb_transfer_submit (transfer, CTRL_TIMEOUT, NULL, sm_write_reg_cb, + NULL); + fpi_usb_transfer_unref (transfer); } static void -sm_exec_cmd(FpiSsm *ssm, - FpDevice *dev, - unsigned char cmd, - unsigned char param) +sm_exec_cmd_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpiUsbTransfer *transfer = fpi_usb_transfer_new(dev); + if (error) + fpi_ssm_mark_failed (transfer->ssm, error); + else + fpi_ssm_next_state (transfer->ssm); +} - fp_dbg("cmd %02x param %02x", cmd, param); - fpi_usb_transfer_fill_control(transfer, - G_USB_DEVICE_DIRECTION_DEVICE_TO_HOST, - G_USB_DEVICE_REQUEST_TYPE_VENDOR, - G_USB_DEVICE_RECIPIENT_DEVICE, - cmd, param, 0, 0); - transfer->ssm = ssm; - fpi_usb_transfer_submit(transfer, CTRL_TIMEOUT, NULL, sm_exec_cmd_cb, - NULL); - fpi_usb_transfer_unref(transfer); +static void +sm_exec_cmd (FpiSsm *ssm, + FpDevice *dev, + unsigned char cmd, + unsigned char param) +{ + FpiUsbTransfer *transfer = fpi_usb_transfer_new (dev); + + fp_dbg ("cmd %02x param %02x", cmd, param); + fpi_usb_transfer_fill_control (transfer, + G_USB_DEVICE_DIRECTION_DEVICE_TO_HOST, + G_USB_DEVICE_REQUEST_TYPE_VENDOR, + G_USB_DEVICE_RECIPIENT_DEVICE, + cmd, param, 0, 0); + transfer->ssm = ssm; + fpi_usb_transfer_submit (transfer, CTRL_TIMEOUT, NULL, sm_exec_cmd_cb, + NULL); + fpi_usb_transfer_unref (transfer); } /***** FINGER DETECTION *****/ @@ -145,217 +148,246 @@ sm_exec_cmd(FpiSsm *ssm, #define DETBOX_COL_END (DETBOX_COL_START + DETBOX_COLS) #define FINGER_PRESENCE_THRESHOLD 100 -static gboolean finger_is_present(unsigned char *data) +static gboolean +finger_is_present (unsigned char *data) { - int row; - guint16 imgavg = 0; + int row; + guint16 imgavg = 0; - for (row = DETBOX_ROW_START; row < DETBOX_ROW_END; row++) { - unsigned char *rowdata = data + (row * IMG_WIDTH); - guint16 rowavg = 0; - int col; + for (row = DETBOX_ROW_START; row < DETBOX_ROW_END; row++) + { + unsigned char *rowdata = data + (row * IMG_WIDTH); + guint16 rowavg = 0; + int col; - for (col = DETBOX_COL_START; col < DETBOX_COL_END; col++) - rowavg += rowdata[col]; - rowavg /= DETBOX_COLS; - imgavg += rowavg; - } - imgavg /= DETBOX_ROWS; - fp_dbg("img avg %d", imgavg); + for (col = DETBOX_COL_START; col < DETBOX_COL_END; col++) + rowavg += rowdata[col]; + rowavg /= DETBOX_COLS; + imgavg += rowavg; + } + imgavg /= DETBOX_ROWS; + fp_dbg ("img avg %d", imgavg); - return (imgavg <= FINGER_PRESENCE_THRESHOLD); + return imgavg <= FINGER_PRESENCE_THRESHOLD; } /***** IMAGE ACQUISITION *****/ -static void capture_iterate(FpiSsm *ssm, FpDevice *dev); +static void capture_iterate (FpiSsm *ssm, + FpDevice *dev); -static void capture_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +capture_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpImageDevice *imgdev = FP_IMAGE_DEVICE(device); - FpDeviceVcom5s *self = FPI_DEVICE_VCOM5S(device); + FpImageDevice *imgdev = FP_IMAGE_DEVICE (device); + FpDeviceVcom5s *self = FPI_DEVICE_VCOM5S (device); - if (error) { - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } + if (error) + { + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } - if (++self->capture_iteration == NR_REQS) { - FpImage *img = self->capture_img; - /* must clear this early, otherwise the call chain takes us into - * loopsm_complete where we would free it, when in fact we are - * supposed to be handing off this image */ - self->capture_img = NULL; + if (++self->capture_iteration == NR_REQS) + { + FpImage *img = self->capture_img; + /* must clear this early, otherwise the call chain takes us into + * loopsm_complete where we would free it, when in fact we are + * supposed to be handing off this image */ + self->capture_img = NULL; - fpi_image_device_report_finger_status(imgdev, - finger_is_present(img->data)); - fpi_image_device_image_captured(imgdev, img); - fpi_ssm_next_state(transfer->ssm); - } else { - capture_iterate(transfer->ssm, device); - } + fpi_image_device_report_finger_status (imgdev, + finger_is_present (img->data)); + fpi_image_device_image_captured (imgdev, img); + fpi_ssm_next_state (transfer->ssm); + } + else + { + capture_iterate (transfer->ssm, device); + } } static void -capture_iterate(FpiSsm *ssm, - FpDevice *dev) +capture_iterate (FpiSsm *ssm, + FpDevice *dev) { - FpDeviceVcom5s *self = FPI_DEVICE_VCOM5S(dev); - int iteration = self->capture_iteration; - FpiUsbTransfer *transfer = fpi_usb_transfer_new(FP_DEVICE(dev)); + FpDeviceVcom5s *self = FPI_DEVICE_VCOM5S (dev); + int iteration = self->capture_iteration; + FpiUsbTransfer *transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_fill_bulk_full (transfer, - EP_IN, - self->capture_img->data + (RQ_SIZE * iteration), - RQ_SIZE, - NULL); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_fill_bulk_full (transfer, + EP_IN, + self->capture_img->data + (RQ_SIZE * iteration), + RQ_SIZE, + NULL); - fpi_usb_transfer_submit (transfer, CTRL_TIMEOUT, NULL, capture_cb, NULL); - fpi_usb_transfer_unref (transfer); + fpi_usb_transfer_submit (transfer, CTRL_TIMEOUT, NULL, capture_cb, NULL); + fpi_usb_transfer_unref (transfer); } static void -sm_do_capture(FpiSsm *ssm, - FpDevice *dev) +sm_do_capture (FpiSsm *ssm, + FpDevice *dev) { - FpDeviceVcom5s *self = FPI_DEVICE_VCOM5S(dev); - FpImageDeviceClass *cls = FP_IMAGE_DEVICE_GET_CLASS (dev); + FpDeviceVcom5s *self = FPI_DEVICE_VCOM5S (dev); + FpImageDeviceClass *cls = FP_IMAGE_DEVICE_GET_CLASS (dev); - G_DEBUG_HERE(); - self->capture_img = fp_image_new (cls->img_width, cls->img_height); - self->capture_iteration = 0; - capture_iterate(ssm, dev); + G_DEBUG_HERE (); + self->capture_img = fp_image_new (cls->img_width, cls->img_height); + self->capture_iteration = 0; + capture_iterate (ssm, dev); } /***** CAPTURE LOOP *****/ enum loop_states { - LOOP_SET_CONTRAST, - LOOP_SET_GAIN, - LOOP_CMD_SCAN, - LOOP_CAPTURE, - LOOP_CAPTURE_DONE, - LOOP_NUM_STATES, + LOOP_SET_CONTRAST, + LOOP_SET_GAIN, + LOOP_CMD_SCAN, + LOOP_CAPTURE, + LOOP_CAPTURE_DONE, + LOOP_NUM_STATES, }; -static void loop_run_state(FpiSsm *ssm, FpDevice *dev, void *user_data) +static void +loop_run_state (FpiSsm *ssm, FpDevice *dev, void *user_data) { - FpDeviceVcom5s *self = FPI_DEVICE_VCOM5S(dev); + FpDeviceVcom5s *self = FPI_DEVICE_VCOM5S (dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case LOOP_SET_CONTRAST: - sm_write_reg(ssm, dev, REG_CONTRAST, 0x01); - break; - case LOOP_SET_GAIN: - sm_write_reg(ssm, dev, REG_GAIN, 0x29); - break; - case LOOP_CMD_SCAN: - if (self->deactivating) { - fp_dbg("deactivating, marking completed"); - fpi_ssm_mark_completed(ssm); - } else - sm_exec_cmd(ssm, dev, CMD_SCAN, 0x00); - break; - case LOOP_CAPTURE: - sm_do_capture(ssm, dev); - break; - case LOOP_CAPTURE_DONE: - fpi_ssm_jump_to_state(ssm, LOOP_CMD_SCAN); - break; - default: - g_assert_not_reached (); - } + switch (fpi_ssm_get_cur_state (ssm)) + { + case LOOP_SET_CONTRAST: + sm_write_reg (ssm, dev, REG_CONTRAST, 0x01); + break; + + case LOOP_SET_GAIN: + sm_write_reg (ssm, dev, REG_GAIN, 0x29); + break; + + case LOOP_CMD_SCAN: + if (self->deactivating) + { + fp_dbg ("deactivating, marking completed"); + fpi_ssm_mark_completed (ssm); + } + else + { + sm_exec_cmd (ssm, dev, CMD_SCAN, 0x00); + } + break; + + case LOOP_CAPTURE: + sm_do_capture (ssm, dev); + break; + + case LOOP_CAPTURE_DONE: + fpi_ssm_jump_to_state (ssm, LOOP_CMD_SCAN); + break; + + default: + g_assert_not_reached (); + } } -static void loopsm_complete(FpiSsm *ssm, FpDevice *dev, void *user_data, - GError *error) +static void +loopsm_complete (FpiSsm *ssm, FpDevice *dev, void *user_data, + GError *error) { - FpImageDevice *imgdev = FP_IMAGE_DEVICE (dev); - FpDeviceVcom5s *self = FPI_DEVICE_VCOM5S(dev); + FpImageDevice *imgdev = FP_IMAGE_DEVICE (dev); + FpDeviceVcom5s *self = FPI_DEVICE_VCOM5S (dev); - fpi_ssm_free(ssm); - g_object_unref (self->capture_img); - self->capture_img = NULL; - self->loop_running = FALSE; + fpi_ssm_free (ssm); + g_object_unref (self->capture_img); + self->capture_img = NULL; + self->loop_running = FALSE; - if (error && !self->deactivating) - fpi_image_device_session_error(imgdev, error); - else if (error) - g_error_free (error); + if (error && !self->deactivating) + fpi_image_device_session_error (imgdev, error); + else if (error) + g_error_free (error); - if (self->deactivating) - fpi_image_device_deactivate_complete(imgdev, NULL); + if (self->deactivating) + fpi_image_device_deactivate_complete (imgdev, NULL); } -static void dev_activate(FpImageDevice *dev) +static void +dev_activate (FpImageDevice *dev) { - FpDeviceVcom5s *self = FPI_DEVICE_VCOM5S(dev); - FpiSsm *ssm = fpi_ssm_new(FP_DEVICE(dev), loop_run_state, - LOOP_NUM_STATES, dev); - self->deactivating = FALSE; - fpi_ssm_start(ssm, loopsm_complete); - self->loop_running = TRUE; - fpi_image_device_activate_complete(dev, NULL); + FpDeviceVcom5s *self = FPI_DEVICE_VCOM5S (dev); + FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (dev), loop_run_state, + LOOP_NUM_STATES, dev); + + self->deactivating = FALSE; + fpi_ssm_start (ssm, loopsm_complete); + self->loop_running = TRUE; + fpi_image_device_activate_complete (dev, NULL); } -static void dev_deactivate(FpImageDevice *dev) +static void +dev_deactivate (FpImageDevice *dev) { - FpDeviceVcom5s *self = FPI_DEVICE_VCOM5S(dev); - if (self->loop_running) - self->deactivating = TRUE; - else - fpi_image_device_deactivate_complete(dev, NULL); + FpDeviceVcom5s *self = FPI_DEVICE_VCOM5S (dev); + + if (self->loop_running) + self->deactivating = TRUE; + else + fpi_image_device_deactivate_complete (dev, NULL); } -static void dev_init(FpImageDevice *dev) +static void +dev_init (FpImageDevice *dev) { - GError *error = NULL; + GError *error = NULL; - g_usb_device_claim_interface (fpi_device_get_usb_device(FP_DEVICE(dev)), 0, 0, &error); + g_usb_device_claim_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), 0, 0, &error); - fpi_image_device_open_complete(dev, error); + fpi_image_device_open_complete (dev, error); } -static void dev_deinit(FpImageDevice *dev) +static void +dev_deinit (FpImageDevice *dev) { - GError *error = NULL; + GError *error = NULL; - g_usb_device_release_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), - 0, 0, &error); + g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), + 0, 0, &error); - fpi_image_device_close_complete(dev, error); + fpi_image_device_close_complete (dev, error); } -static const FpIdEntry id_table [ ] = { - { .vid = 0x061a, .pid = 0x0110, }, - { .vid = 0, .pid = 0, .driver_data = 0 }, +static const FpIdEntry id_table[] = { + { .vid = 0x061a, .pid = 0x0110, }, + { .vid = 0, .pid = 0, .driver_data = 0 }, }; -static void fpi_device_vcom5s_init(FpDeviceVcom5s *self) { +static void +fpi_device_vcom5s_init (FpDeviceVcom5s *self) +{ } -static void fpi_device_vcom5s_class_init(FpDeviceVcom5sClass *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); - FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS(klass); +static void +fpi_device_vcom5s_class_init (FpDeviceVcom5sClass *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); + FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); - dev_class->id = "vcom5s"; - dev_class->full_name = "Veridicom 5thSense"; - dev_class->type = FP_DEVICE_TYPE_USB; - dev_class->id_table = id_table; - dev_class->scan_type = FP_SCAN_TYPE_PRESS; + dev_class->id = "vcom5s"; + dev_class->full_name = "Veridicom 5thSense"; + dev_class->type = FP_DEVICE_TYPE_USB; + dev_class->id_table = id_table; + dev_class->scan_type = FP_SCAN_TYPE_PRESS; - img_class->img_open = dev_init; - img_class->img_close = dev_deinit; - img_class->activate = dev_activate; - img_class->deactivate = dev_deactivate; + img_class->img_open = dev_init; + img_class->img_close = dev_deinit; + img_class->activate = dev_activate; + img_class->deactivate = dev_deactivate; - img_class->img_width = IMG_WIDTH; - img_class->img_height = IMG_HEIGHT; + img_class->img_width = IMG_WIDTH; + img_class->img_height = IMG_HEIGHT; } - diff --git a/libfprint/drivers/vfs0050.c b/libfprint/drivers/vfs0050.c index aa47ec4..399be86 100644 --- a/libfprint/drivers/vfs0050.c +++ b/libfprint/drivers/vfs0050.c @@ -27,703 +27,762 @@ G_DEFINE_TYPE (FpDeviceVfs0050, fpi_device_vfs0050, FP_TYPE_IMAGE_DEVICE) /* USB functions */ /* Callback for async_write */ -static void async_write_callback(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +async_write_callback (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - if (error) { - fp_err("USB write transfer: %s", error->message); - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } + if (error) + { + fp_err ("USB write transfer: %s", error->message); + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } - fpi_ssm_next_state(transfer->ssm); + fpi_ssm_next_state (transfer->ssm); } /* Send data to EP1, the only out endpoint */ static void -async_write(FpiSsm *ssm, - FpDevice *dev, - void *data, - int len) +async_write (FpiSsm *ssm, + FpDevice *dev, + void *data, + int len) { - FpiUsbTransfer *transfer; + FpiUsbTransfer *transfer; - transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); - fpi_usb_transfer_fill_bulk_full(transfer, 0x01, data, len, NULL); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_submit(transfer, VFS_USB_TIMEOUT, NULL, - async_write_callback, NULL); - fpi_usb_transfer_unref(transfer); + transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); + fpi_usb_transfer_fill_bulk_full (transfer, 0x01, data, len, NULL); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_submit (transfer, VFS_USB_TIMEOUT, NULL, + async_write_callback, NULL); + fpi_usb_transfer_unref (transfer); } /* Callback for async_read */ -static void async_read_callback(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +async_read_callback (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - int ep = transfer->endpoint; + int ep = transfer->endpoint; - if (error) { - fp_err("USB read transfer on endpoint %d: %s", ep - 0x80, - error->message); - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } + if (error) + { + fp_err ("USB read transfer on endpoint %d: %s", ep - 0x80, + error->message); + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } - fpi_ssm_next_state(transfer->ssm); + fpi_ssm_next_state (transfer->ssm); } /* Receive data from the given ep and either discard or fill the given buffer */ static void -async_read(FpiSsm *ssm, - FpDevice *dev, - int ep, - void *data, - int len) +async_read (FpiSsm *ssm, + FpDevice *dev, + int ep, + void *data, + int len) { - FpiUsbTransfer *transfer; - GDestroyNotify free_func = NULL; + FpiUsbTransfer *transfer; + GDestroyNotify free_func = NULL; - ep |= FPI_USB_ENDPOINT_IN; + ep |= FPI_USB_ENDPOINT_IN; - transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; + transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; - if (data == NULL) { - data = g_malloc0 (len); - free_func = g_free; - } + if (data == NULL) + { + data = g_malloc0 (len); + free_func = g_free; + } - /* 0x83 is the only interrupt endpoint */ - if (ep == EP3_IN) - fpi_usb_transfer_fill_interrupt_full(transfer, ep, data, len, free_func); - else - fpi_usb_transfer_fill_bulk_full(transfer, ep, data, len, free_func); + /* 0x83 is the only interrupt endpoint */ + if (ep == EP3_IN) + fpi_usb_transfer_fill_interrupt_full (transfer, ep, data, len, free_func); + else + fpi_usb_transfer_fill_bulk_full (transfer, ep, data, len, free_func); - fpi_usb_transfer_submit(transfer, VFS_USB_TIMEOUT, NULL, - async_read_callback, NULL); - fpi_usb_transfer_unref(transfer); + fpi_usb_transfer_submit (transfer, VFS_USB_TIMEOUT, NULL, + async_read_callback, NULL); + fpi_usb_transfer_unref (transfer); } /* Callback for async_abort */ -static void async_abort_callback(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +async_abort_callback (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - int ep = transfer->endpoint; + int ep = transfer->endpoint; - /* In normal case endpoint is empty */ - if (g_error_matches (error, G_USB_DEVICE_ERROR, G_USB_DEVICE_ERROR_TIMED_OUT)) { - g_free (error); - fpi_ssm_next_state(transfer->ssm); - return; - } + /* In normal case endpoint is empty */ + if (g_error_matches (error, G_USB_DEVICE_ERROR, G_USB_DEVICE_ERROR_TIMED_OUT)) + { + g_free (error); + fpi_ssm_next_state (transfer->ssm); + return; + } - if (error) { - fp_err("USB write transfer: %s", error->message); - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } + if (error) + { + fp_err ("USB write transfer: %s", error->message); + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } - /* Don't stop process, only print warning */ - fp_warn("Endpoint %d had extra %zd bytes readable", ep - 0x80, - transfer->actual_length); + /* Don't stop process, only print warning */ + fp_warn ("Endpoint %d had extra %zd bytes readable", ep - 0x80, + transfer->actual_length); - fpi_ssm_jump_to_state(transfer->ssm, - fpi_ssm_get_cur_state(transfer->ssm)); + fpi_ssm_jump_to_state (transfer->ssm, + fpi_ssm_get_cur_state (transfer->ssm)); } /* Receive data from the given ep; continues to the next state once no * more data is available. Otherwise the current state is repeated. */ -static void async_abort(FpDevice *dev, FpiSsm *ssm, int ep) +static void +async_abort (FpDevice *dev, FpiSsm *ssm, int ep) { - FpiUsbTransfer *transfer; + FpiUsbTransfer *transfer; - ep |= FPI_USB_ENDPOINT_IN; + ep |= FPI_USB_ENDPOINT_IN; - transfer = fpi_usb_transfer_new (dev); + transfer = fpi_usb_transfer_new (dev); - /* 0x83 is the only interrupt endpoint */ - if (ep == EP3_IN) - fpi_usb_transfer_fill_interrupt (transfer, ep, VFS_USB_BUFFER_SIZE); - else - fpi_usb_transfer_fill_bulk (transfer, ep, VFS_USB_BUFFER_SIZE); + /* 0x83 is the only interrupt endpoint */ + if (ep == EP3_IN) + fpi_usb_transfer_fill_interrupt (transfer, ep, VFS_USB_BUFFER_SIZE); + else + fpi_usb_transfer_fill_bulk (transfer, ep, VFS_USB_BUFFER_SIZE); - fpi_usb_transfer_submit(transfer, VFS_USB_ABORT_TIMEOUT, NULL, - async_abort_callback, NULL); - fpi_usb_transfer_unref(transfer); + fpi_usb_transfer_submit (transfer, VFS_USB_ABORT_TIMEOUT, NULL, + async_abort_callback, NULL); + fpi_usb_transfer_unref (transfer); } /* Image processing functions */ /* Pixel getter for fpi_assemble_lines */ -static unsigned char vfs0050_get_pixel(struct fpi_line_asmbl_ctx *ctx, - GSList * line, unsigned int x) +static unsigned char +vfs0050_get_pixel (struct fpi_line_asmbl_ctx *ctx, + GSList * line, unsigned int x) { - return ((struct vfs_line *)line->data)->data[x]; + return ((struct vfs_line *) line->data)->data[x]; } /* Deviation getter for fpi_assemble_lines */ -static int vfs0050_get_difference(struct fpi_line_asmbl_ctx *ctx, - GSList * line_list_1, GSList * line_list_2) +static int +vfs0050_get_difference (struct fpi_line_asmbl_ctx *ctx, + GSList * line_list_1, GSList * line_list_2) { - struct vfs_line *line1 = line_list_1->data; - struct vfs_line *line2 = line_list_2->data; - const int shift = (VFS_IMAGE_WIDTH - VFS_NEXT_LINE_WIDTH) / 2 - 1; - int res = 0; - for (int i = 0; i < VFS_NEXT_LINE_WIDTH; ++i) { - int x = - (int)line1->next_line_part[i] - (int)line2->data[shift + i]; - res += x * x; - } - return res; + struct vfs_line *line1 = line_list_1->data; + struct vfs_line *line2 = line_list_2->data; + const int shift = (VFS_IMAGE_WIDTH - VFS_NEXT_LINE_WIDTH) / 2 - 1; + int res = 0; + + for (int i = 0; i < VFS_NEXT_LINE_WIDTH; ++i) + { + int x = + (int) line1->next_line_part[i] - (int) line2->data[shift + i]; + res += x * x; + } + return res; } #define VFS_NOISE_THRESHOLD 40 /* Checks whether line is noise or not using hardware parameters */ -static char is_noise(struct vfs_line *line) +static char +is_noise (struct vfs_line *line) { - int val1 = line->noise_hash_1; - int val2 = line->noise_hash_2; - if (val1 > VFS_NOISE_THRESHOLD - && val1 < 256 - VFS_NOISE_THRESHOLD - && val2 > VFS_NOISE_THRESHOLD && val2 < 256 - VFS_NOISE_THRESHOLD) - return 1; - return 0; + int val1 = line->noise_hash_1; + int val2 = line->noise_hash_2; + + if (val1 > VFS_NOISE_THRESHOLD && + val1 < 256 - VFS_NOISE_THRESHOLD && + val2 > VFS_NOISE_THRESHOLD && val2 < 256 - VFS_NOISE_THRESHOLD) + return 1; + return 0; } /* Parameters for fpi_assemble_lines */ static struct fpi_line_asmbl_ctx assembling_ctx = { - .line_width = VFS_IMAGE_WIDTH, - .max_height = VFS_MAX_HEIGHT, - .resolution = 10, - .median_filter_size = 25, - .max_search_offset = 100, - .get_deviation = vfs0050_get_difference, - .get_pixel = vfs0050_get_pixel, + .line_width = VFS_IMAGE_WIDTH, + .max_height = VFS_MAX_HEIGHT, + .resolution = 10, + .median_filter_size = 25, + .max_search_offset = 100, + .get_deviation = vfs0050_get_difference, + .get_pixel = vfs0050_get_pixel, }; /* Processes image before submitting */ -static FpImage *prepare_image(FpDeviceVfs0050 *vdev) +static FpImage * +prepare_image (FpDeviceVfs0050 *vdev) { - int height = vdev->bytes / VFS_LINE_SIZE; + int height = vdev->bytes / VFS_LINE_SIZE; - /* Noise cleaning. IMHO, it works pretty well - I've not detected cases when it doesn't work or cuts a part of the finger - Noise arises at the end of scan when some water remains on the scanner */ - while (height > 0) { - if (!is_noise(vdev->lines_buffer + height - 1)) - break; - --height; - } - if (height > VFS_MAX_HEIGHT) - height = VFS_MAX_HEIGHT; + /* Noise cleaning. IMHO, it works pretty well + I've not detected cases when it doesn't work or cuts a part of the finger + Noise arises at the end of scan when some water remains on the scanner */ + while (height > 0) + { + if (!is_noise (vdev->lines_buffer + height - 1)) + break; + --height; + } + if (height > VFS_MAX_HEIGHT) + height = VFS_MAX_HEIGHT; - /* If image is not good enough */ - if (height < VFS_IMAGE_WIDTH) - return NULL; + /* If image is not good enough */ + if (height < VFS_IMAGE_WIDTH) + return NULL; - /* Building GSList */ - GSList *lines = NULL; - for (int i = height - 1; i >= 0; --i) - lines = g_slist_prepend(lines, vdev->lines_buffer + i); + /* Building GSList */ + GSList *lines = NULL; + for (int i = height - 1; i >= 0; --i) + lines = g_slist_prepend (lines, vdev->lines_buffer + i); - /* Perform line assembling */ - FpImage *img = fpi_assemble_lines(&assembling_ctx, lines, height); + /* Perform line assembling */ + FpImage *img = fpi_assemble_lines (&assembling_ctx, lines, height); - g_slist_free(lines); - return img; + g_slist_free (lines); + return img; } /* Processes and submits image after fingerprint received */ -static void submit_image(FpDeviceVfs0050 *self) +static void +submit_image (FpDeviceVfs0050 *self) { - FpImageDevice *idev = FP_IMAGE_DEVICE(self); + FpImageDevice *idev = FP_IMAGE_DEVICE (self); - /* We were not asked to submit image actually */ - if (!self->active) - return; + /* We were not asked to submit image actually */ + if (!self->active) + return; - FpImage *img = prepare_image(self); + FpImage *img = prepare_image (self); - if (!img) - fpi_image_device_retry_scan(idev, FP_DEVICE_RETRY_TOO_SHORT); - else - fpi_image_device_image_captured(idev, img); + if (!img) + fpi_image_device_retry_scan (idev, FP_DEVICE_RETRY_TOO_SHORT); + else + fpi_image_device_image_captured (idev, img); - /* Finger not on the scanner */ - fpi_image_device_report_finger_status(idev, FALSE); + /* Finger not on the scanner */ + fpi_image_device_report_finger_status (idev, FALSE); } /* Proto functions */ /* SSM loop for clear_ep2 */ static void -clear_ep2_ssm(FpiSsm *ssm, FpDevice *dev, void *user_data) +clear_ep2_ssm (FpiSsm *ssm, FpDevice *dev, void *user_data) { - char command04 = 0x04; + char command04 = 0x04; - switch (fpi_ssm_get_cur_state(ssm)) { - case SUBSM1_COMMAND_04: - async_write(ssm, dev, &command04, sizeof(command04)); - break; + switch (fpi_ssm_get_cur_state (ssm)) + { + case SUBSM1_COMMAND_04: + async_write (ssm, dev, &command04, sizeof (command04)); + break; - case SUBSM1_RETURN_CODE: - async_read(ssm, dev, 1, NULL, 2); - break; + case SUBSM1_RETURN_CODE: + async_read (ssm, dev, 1, NULL, 2); + break; - case SUBSM1_ABORT_2: - async_abort(dev, ssm, 2); - break; + case SUBSM1_ABORT_2: + async_abort (dev, ssm, 2); + break; - default: - fp_err("Unknown SUBSM1 state"); - fpi_ssm_mark_failed(ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); - } + default: + fp_err ("Unknown SUBSM1 state"); + fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + } } /* Send command to clear EP2 */ static void -clear_ep2(FpDevice *dev, - FpiSsm *ssm) +clear_ep2 (FpDevice *dev, + FpiSsm *ssm) { - FpiSsm *subsm = - fpi_ssm_new(dev, clear_ep2_ssm, SUBSM1_STATES, NULL); - fpi_ssm_start_subsm(ssm, subsm); + FpiSsm *subsm = + fpi_ssm_new (dev, clear_ep2_ssm, SUBSM1_STATES, NULL); + + fpi_ssm_start_subsm (ssm, subsm); } -static void send_control_packet_ssm(FpiSsm *ssm, FpDevice *dev, - void *user_data) +static void +send_control_packet_ssm (FpiSsm *ssm, FpDevice *dev, + void *user_data) { - FpDeviceVfs0050 *self = FPI_DEVICE_VFS0050(dev); + FpDeviceVfs0050 *self = FPI_DEVICE_VFS0050 (dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case SUBSM2_SEND_CONTROL: - async_write(ssm, dev, self->control_packet, - VFS_CONTROL_PACKET_SIZE); - break; + switch (fpi_ssm_get_cur_state (ssm)) + { + case SUBSM2_SEND_CONTROL: + async_write (ssm, dev, self->control_packet, + VFS_CONTROL_PACKET_SIZE); + break; - case SUBSM2_RETURN_CODE: - async_read(ssm, dev, 1, NULL, 2); - break; + case SUBSM2_RETURN_CODE: + async_read (ssm, dev, 1, NULL, 2); + break; - case SUBSM2_SEND_COMMIT: - /* next_receive_* packets could be sent only in pair */ - if (self->control_packet == next_receive_1) { - self->control_packet = next_receive_2; - fpi_ssm_jump_to_state(ssm, SUBSM2_SEND_CONTROL); - break; - } - /* commit_out in Windows differs in each commit, but I send the same each time */ - async_write(ssm, dev, commit_out, sizeof(commit_out)); - break; + case SUBSM2_SEND_COMMIT: + /* next_receive_* packets could be sent only in pair */ + if (self->control_packet == next_receive_1) + { + self->control_packet = next_receive_2; + fpi_ssm_jump_to_state (ssm, SUBSM2_SEND_CONTROL); + break; + } + /* commit_out in Windows differs in each commit, but I send the same each time */ + async_write (ssm, dev, commit_out, sizeof (commit_out)); + break; - case SUBSM2_COMMIT_RESPONSE: - async_read(ssm, dev, 1, NULL, VFS_COMMIT_RESPONSE_SIZE); - break; + case SUBSM2_COMMIT_RESPONSE: + async_read (ssm, dev, 1, NULL, VFS_COMMIT_RESPONSE_SIZE); + break; - case SUBSM2_READ_EMPTY_INTERRUPT: - /* I don't know how to check result, it could be different - * NOTE: I guess this comment relates to the above read. */ - async_read(ssm, dev, 3, self->interrupt, VFS_INTERRUPT_SIZE); - break; + case SUBSM2_READ_EMPTY_INTERRUPT: + /* I don't know how to check result, it could be different + * NOTE: I guess this comment relates to the above read. */ + async_read (ssm, dev, 3, self->interrupt, VFS_INTERRUPT_SIZE); + break; - case SUBSM2_ABORT_3: - /* Check that interrupt is empty */ - if (memcmp - (self->interrupt, empty_interrupt, VFS_INTERRUPT_SIZE)) { - fp_err("Unknown SUBSM2 state"); - fpi_ssm_mark_failed(ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); - break; - } - async_abort(dev, ssm, 3); - break; + case SUBSM2_ABORT_3: + /* Check that interrupt is empty */ + if (memcmp + (self->interrupt, empty_interrupt, VFS_INTERRUPT_SIZE)) + { + fp_err ("Unknown SUBSM2 state"); + fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + break; + } + async_abort (dev, ssm, 3); + break; - case SUBSM2_CLEAR_EP2: - /* After turn_on Windows doesn't clear EP2 */ - if (self->control_packet != turn_on) - clear_ep2(dev, ssm); - else - fpi_ssm_next_state(ssm); - break; + case SUBSM2_CLEAR_EP2: + /* After turn_on Windows doesn't clear EP2 */ + if (self->control_packet != turn_on) + clear_ep2 (dev, ssm); + else + fpi_ssm_next_state (ssm); + break; - default: - fp_err("Unknown SUBSM2 state"); - fpi_ssm_mark_failed(ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); - } + default: + fp_err ("Unknown SUBSM2 state"); + fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + } } /* Send device state control packet */ static void -send_control_packet(FpiSsm *ssm, - FpDevice *dev) +send_control_packet (FpiSsm *ssm, + FpDevice *dev) { - FpiSsm *subsm = - fpi_ssm_new(dev, send_control_packet_ssm, - SUBSM2_STATES, NULL); - fpi_ssm_start_subsm(ssm, subsm); + FpiSsm *subsm = + fpi_ssm_new (dev, send_control_packet_ssm, + SUBSM2_STATES, NULL); + + fpi_ssm_start_subsm (ssm, subsm); } /* Clears all fprint data */ -static void clear_data(FpDeviceVfs0050 *vdev) +static void +clear_data (FpDeviceVfs0050 *vdev) { - g_free(vdev->lines_buffer); - vdev->lines_buffer = NULL; - vdev->memory = vdev->bytes = 0; + g_free (vdev->lines_buffer); + vdev->lines_buffer = NULL; + vdev->memory = vdev->bytes = 0; } /* After receiving interrupt from EP3 */ -static void interrupt_callback(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +interrupt_callback (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpDeviceVfs0050 *self = FPI_DEVICE_VFS0050(device); - char *interrupt = transfer->buffer; + FpDeviceVfs0050 *self = FPI_DEVICE_VFS0050 (device); + char *interrupt = transfer->buffer; - /* we expect a cancellation error when the device is deactivating - * go into the SSM_CLEAR_EP2 state in that case. */ - if (!self->active && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { - g_error_free (error); - fpi_ssm_jump_to_state(transfer->ssm, SSM_CLEAR_EP2); - return; - } + /* we expect a cancellation error when the device is deactivating + * go into the SSM_CLEAR_EP2 state in that case. */ + if (!self->active && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + { + g_error_free (error); + fpi_ssm_jump_to_state (transfer->ssm, SSM_CLEAR_EP2); + return; + } - if (error) { - fp_err("USB read interrupt transfer: %s", - error->message); - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } + if (error) + { + fp_err ("USB read interrupt transfer: %s", + error->message); + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } - /* Standard interrupts */ - if (memcmp(interrupt, interrupt1, VFS_INTERRUPT_SIZE) == 0 || - memcmp(interrupt, interrupt2, VFS_INTERRUPT_SIZE) == 0 || - memcmp(interrupt, interrupt3, VFS_INTERRUPT_SIZE) == 0) { - /* Go to the next ssm stage */ - fpi_ssm_next_state(transfer->ssm); - return; - } + /* Standard interrupts */ + if (memcmp (interrupt, interrupt1, VFS_INTERRUPT_SIZE) == 0 || + memcmp (interrupt, interrupt2, VFS_INTERRUPT_SIZE) == 0 || + memcmp (interrupt, interrupt3, VFS_INTERRUPT_SIZE) == 0) + { + /* Go to the next ssm stage */ + fpi_ssm_next_state (transfer->ssm); + return; + } - /* When finger is on the scanner before turn_on */ - if (interrupt[0] == 0x01) { - fp_warn("Finger is already on the scanner"); + /* When finger is on the scanner before turn_on */ + if (interrupt[0] == 0x01) + { + fp_warn ("Finger is already on the scanner"); - /* Go to the next ssm stage */ - fpi_ssm_next_state(transfer->ssm); - return; - } + /* Go to the next ssm stage */ + fpi_ssm_next_state (transfer->ssm); + return; + } - /* Unknown interrupt; abort the session */ - fp_err("Unknown interrupt '%02x:%02x:%02x:%02x:%02x'!", - interrupt[0] & 0xff, interrupt[1] & 0xff, interrupt[2] & 0xff, - interrupt[3] & 0xff, interrupt[4] & 0xff); + /* Unknown interrupt; abort the session */ + fp_err ("Unknown interrupt '%02x:%02x:%02x:%02x:%02x'!", + interrupt[0] & 0xff, interrupt[1] & 0xff, interrupt[2] & 0xff, + interrupt[3] & 0xff, interrupt[4] & 0xff); - /* Abort ssm */ - fpi_ssm_mark_failed(transfer->ssm, - fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + /* Abort ssm */ + fpi_ssm_mark_failed (transfer->ssm, + fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); } -static void receive_callback(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +receive_callback (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpDeviceVfs0050 *self = FPI_DEVICE_VFS0050(device); + FpDeviceVfs0050 *self = FPI_DEVICE_VFS0050 (device); - if (error && !g_error_matches (error, G_USB_DEVICE_ERROR, G_USB_DEVICE_ERROR_TIMED_OUT)) { - fp_err("USB read transfer: %s", error->message); + if (error && !g_error_matches (error, G_USB_DEVICE_ERROR, G_USB_DEVICE_ERROR_TIMED_OUT)) + { + fp_err ("USB read transfer: %s", error->message); - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } - if (error) - g_error_free (error); + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } + if (error) + g_error_free (error); - /* Check if fingerprint data is over */ - if (transfer->actual_length == 0) { - fpi_ssm_next_state(transfer->ssm); - } else { - self->bytes += transfer->actual_length; + /* Check if fingerprint data is over */ + if (transfer->actual_length == 0) + { + fpi_ssm_next_state (transfer->ssm); + } + else + { + self->bytes += transfer->actual_length; - /* We need more data */ - fpi_ssm_jump_to_state(transfer->ssm, - fpi_ssm_get_cur_state(transfer->ssm)); - } + /* We need more data */ + fpi_ssm_jump_to_state (transfer->ssm, + fpi_ssm_get_cur_state (transfer->ssm)); + } } /* SSM stub to prepare device to another scan after orange light was on */ static void -another_scan(FpDevice *dev, - void *data) +another_scan (FpDevice *dev, + void *data) { - FpiSsm *ssm = data; - fpi_ssm_jump_to_state(ssm, SSM_TURN_ON); + FpiSsm *ssm = data; + + fpi_ssm_jump_to_state (ssm, SSM_TURN_ON); } /* Main SSM loop */ -static void activate_ssm(FpiSsm *ssm, FpDevice *dev, void *user_data) +static void +activate_ssm (FpiSsm *ssm, FpDevice *dev, void *user_data) { - FpImageDevice *idev = FP_IMAGE_DEVICE (dev); - FpDeviceVfs0050 *self = FPI_DEVICE_VFS0050(dev); + FpImageDevice *idev = FP_IMAGE_DEVICE (dev); + FpDeviceVfs0050 *self = FPI_DEVICE_VFS0050 (dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case SSM_INITIAL_ABORT_1: - async_abort(dev, ssm, 1); - break; + switch (fpi_ssm_get_cur_state (ssm)) + { + case SSM_INITIAL_ABORT_1: + async_abort (dev, ssm, 1); + break; - case SSM_INITIAL_ABORT_2: - async_abort(dev, ssm, 2); - break; + case SSM_INITIAL_ABORT_2: + async_abort (dev, ssm, 2); + break; - case SSM_INITIAL_ABORT_3: - async_abort(dev, ssm, 3); - break; + case SSM_INITIAL_ABORT_3: + async_abort (dev, ssm, 3); + break; - case SSM_CLEAR_EP2: - clear_ep2(dev, ssm); - break; + case SSM_CLEAR_EP2: + clear_ep2 (dev, ssm); + break; - case SSM_TURN_OFF: - /* Set control_packet argument */ - self->control_packet = turn_off; + case SSM_TURN_OFF: + /* Set control_packet argument */ + self->control_packet = turn_off; - send_control_packet(ssm, dev); - break; + send_control_packet (ssm, dev); + break; - case SSM_TURN_ON: - if (!self->active) { - /* The only correct exit */ - fpi_ssm_mark_completed(ssm); + case SSM_TURN_ON: + if (!self->active) + { + /* The only correct exit */ + fpi_ssm_mark_completed (ssm); - if (self->need_report) { - fpi_image_device_deactivate_complete(idev, - NULL); - self->need_report = 0; - } - break; - } - /* Set control_packet argument */ - self->control_packet = turn_on; + if (self->need_report) + { + fpi_image_device_deactivate_complete (idev, + NULL); + self->need_report = 0; + } + break; + } + /* Set control_packet argument */ + self->control_packet = turn_on; - send_control_packet(ssm, dev); - break; + send_control_packet (ssm, dev); + break; - case SSM_ASK_INTERRUPT: { - FpiUsbTransfer *transfer; - /* Activated, light must be blinking now */ + case SSM_ASK_INTERRUPT: { + FpiUsbTransfer *transfer; + /* Activated, light must be blinking now */ - /* If we first time here, report that activate completed */ - if (self->need_report) { - fpi_image_device_activate_complete(idev, NULL); - self->need_report = 0; - } + /* If we first time here, report that activate completed */ + if (self->need_report) + { + fpi_image_device_activate_complete (idev, NULL); + self->need_report = 0; + } - /* Asynchronously enquire an interrupt */ - transfer = fpi_usb_transfer_new (dev); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_fill_interrupt (transfer, 0x83, VFS_INTERRUPT_SIZE); - fpi_usb_transfer_submit (transfer, - 0, - fpi_device_get_cancellable (dev), - interrupt_callback, NULL); - fpi_usb_transfer_unref (transfer); + /* Asynchronously enquire an interrupt */ + transfer = fpi_usb_transfer_new (dev); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_fill_interrupt (transfer, 0x83, VFS_INTERRUPT_SIZE); + fpi_usb_transfer_submit (transfer, + 0, + fpi_device_get_cancellable (dev), + interrupt_callback, NULL); + fpi_usb_transfer_unref (transfer); - /* I've put it here to be sure that data is cleared */ - clear_data(self); + /* I've put it here to be sure that data is cleared */ + clear_data (self); - fpi_ssm_next_state(ssm); - break; - } - case SSM_WAIT_INTERRUPT: - /* TODO: This state is unused at this point. When we - * are in this state, then a user cancellation will - * cause deactivation. In that case, the USB transfer - * is cancelled and the device is set to not be active. - * We then go into SSM_CLEAR_EP2 based on the - * cancellation. */ - break; + fpi_ssm_next_state (ssm); + break; + } - case SSM_RECEIVE_FINGER: { - FpiUsbTransfer *transfer; + case SSM_WAIT_INTERRUPT: + /* TODO: This state is unused at this point. When we + * are in this state, then a user cancellation will + * cause deactivation. In that case, the USB transfer + * is cancelled and the device is set to not be active. + * We then go into SSM_CLEAR_EP2 based on the + * cancellation. */ + break; - if (self->memory == 0) { - /* Initialize fingerprint buffer */ - g_free(self->lines_buffer); - self->memory = VFS_USB_BUFFER_SIZE; - self->lines_buffer = g_malloc(self->memory); - self->bytes = 0; + case SSM_RECEIVE_FINGER: { + FpiUsbTransfer *transfer; - /* Finger is on the scanner */ - fpi_image_device_report_finger_status(idev, TRUE); - } + if (self->memory == 0) + { + /* Initialize fingerprint buffer */ + g_free (self->lines_buffer); + self->memory = VFS_USB_BUFFER_SIZE; + self->lines_buffer = g_malloc (self->memory); + self->bytes = 0; - /* Increase buffer size while it's insufficient */ - while (self->bytes + VFS_USB_BUFFER_SIZE > self->memory) { - self->memory <<= 1; - self->lines_buffer = - (struct vfs_line *)g_realloc(self->lines_buffer, - self->memory); - } + /* Finger is on the scanner */ + fpi_image_device_report_finger_status (idev, TRUE); + } - /* Receive chunk of data */ - transfer = fpi_usb_transfer_new (dev); - fpi_usb_transfer_fill_bulk_full(transfer, 0x82, - (void *)self->lines_buffer + self->bytes, - VFS_USB_BUFFER_SIZE, NULL); - transfer->ssm = ssm; - fpi_usb_transfer_submit(transfer, VFS_USB_TIMEOUT, NULL, - receive_callback, NULL); - fpi_usb_transfer_unref(transfer); - break; - } - case SSM_SUBMIT_IMAGE: - submit_image(self); - clear_data(self); + /* Increase buffer size while it's insufficient */ + while (self->bytes + VFS_USB_BUFFER_SIZE > self->memory) + { + self->memory <<= 1; + self->lines_buffer = + (struct vfs_line *) g_realloc (self->lines_buffer, + self->memory); + } - /* Wait for probable vdev->active changing */ - fpi_device_add_timeout(dev, VFS_SSM_TIMEOUT, - fpi_ssm_next_state_timeout_cb, ssm); - break; + /* Receive chunk of data */ + transfer = fpi_usb_transfer_new (dev); + fpi_usb_transfer_fill_bulk_full (transfer, 0x82, + (void *) self->lines_buffer + self->bytes, + VFS_USB_BUFFER_SIZE, NULL); + transfer->ssm = ssm; + fpi_usb_transfer_submit (transfer, VFS_USB_TIMEOUT, NULL, + receive_callback, NULL); + fpi_usb_transfer_unref (transfer); + break; + } - case SSM_NEXT_RECEIVE: - if (!self->active) { - /* It's the last scan */ - fpi_ssm_jump_to_state(ssm, SSM_CLEAR_EP2); - break; - } + case SSM_SUBMIT_IMAGE: + submit_image (self); + clear_data (self); - /* Set control_packet argument */ - self->control_packet = next_receive_1; + /* Wait for probable vdev->active changing */ + fpi_device_add_timeout (dev, VFS_SSM_TIMEOUT, + fpi_ssm_next_state_timeout_cb, ssm); + break; - send_control_packet(ssm, dev); - break; + case SSM_NEXT_RECEIVE: + if (!self->active) + { + /* It's the last scan */ + fpi_ssm_jump_to_state (ssm, SSM_CLEAR_EP2); + break; + } - case SSM_WAIT_ANOTHER_SCAN: - /* Orange light is on now */ - fpi_device_add_timeout(dev, VFS_SSM_ORANGE_TIMEOUT, - another_scan, ssm); - break; + /* Set control_packet argument */ + self->control_packet = next_receive_1; - default: - fp_err("Unknown state"); - fpi_ssm_mark_failed(ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); - } + send_control_packet (ssm, dev); + break; + + case SSM_WAIT_ANOTHER_SCAN: + /* Orange light is on now */ + fpi_device_add_timeout (dev, VFS_SSM_ORANGE_TIMEOUT, + another_scan, ssm); + break; + + default: + fp_err ("Unknown state"); + fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + } } /* Driver functions */ /* Callback for dev_activate ssm */ -static void dev_activate_callback(FpiSsm *ssm, FpDevice *dev, - void *user_data, GError *error) +static void +dev_activate_callback (FpiSsm *ssm, FpDevice *dev, + void *user_data, GError *error) { - FpDeviceVfs0050 *self = FPI_DEVICE_VFS0050(dev); + FpDeviceVfs0050 *self = FPI_DEVICE_VFS0050 (dev); - self->ssm_active = 0; + self->ssm_active = 0; - if (error) { - g_warning ("Unhandled device activation error: %s", error->message); - g_error_free (error); - } + if (error) + { + g_warning ("Unhandled device activation error: %s", error->message); + g_error_free (error); + } - fpi_ssm_free(ssm); + fpi_ssm_free (ssm); } /* Activate device */ -static void dev_activate(FpImageDevice *idev) +static void +dev_activate (FpImageDevice *idev) { - FpDeviceVfs0050 *self = FPI_DEVICE_VFS0050(idev); + FpDeviceVfs0050 *self = FPI_DEVICE_VFS0050 (idev); - /* Initialize flags */ - self->active = 1; - self->need_report = 1; - self->ssm_active = 1; + /* Initialize flags */ + self->active = 1; + self->need_report = 1; + self->ssm_active = 1; - FpiSsm *ssm = fpi_ssm_new(FP_DEVICE(idev), activate_ssm, SSM_STATES, - idev); - fpi_ssm_start(ssm, dev_activate_callback); + FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (idev), activate_ssm, SSM_STATES, + idev); + fpi_ssm_start (ssm, dev_activate_callback); } /* Deactivate device */ -static void dev_deactivate(FpImageDevice *idev) +static void +dev_deactivate (FpImageDevice *idev) { - FpDeviceVfs0050 *self = FPI_DEVICE_VFS0050(idev); + FpDeviceVfs0050 *self = FPI_DEVICE_VFS0050 (idev); - if (!self->ssm_active) { - fpi_image_device_deactivate_complete(idev, NULL); - return; - } + if (!self->ssm_active) + { + fpi_image_device_deactivate_complete (idev, NULL); + return; + } - /* Initialize flags */ - self->active = 0; - self->need_report = 1; + /* Initialize flags */ + self->active = 0; + self->need_report = 1; } /* Callback for dev_open ssm */ -static void dev_open_callback(FpiSsm *ssm, FpDevice *dev, void *user_data, - GError *error) +static void +dev_open_callback (FpiSsm *ssm, FpDevice *dev, void *user_data, + GError *error) { - /* Notify open complete */ - fpi_image_device_open_complete(FP_IMAGE_DEVICE (dev), error); - fpi_ssm_free(ssm); + /* Notify open complete */ + fpi_image_device_open_complete (FP_IMAGE_DEVICE (dev), error); + fpi_ssm_free (ssm); } /* Open device */ -static void dev_open(FpImageDevice *idev) +static void +dev_open (FpImageDevice *idev) { - GError *error = NULL; + GError *error = NULL; - /* Claim usb interface */ - if (!g_usb_device_claim_interface (fpi_device_get_usb_device(FP_DEVICE(idev)), 0, 0, &error)) { - fpi_image_device_open_complete (idev, error); - return; - } + /* Claim usb interface */ + if (!g_usb_device_claim_interface (fpi_device_get_usb_device (FP_DEVICE (idev)), 0, 0, &error)) + { + fpi_image_device_open_complete (idev, error); + return; + } - /* Clearing previous device state */ - FpiSsm *ssm = fpi_ssm_new(FP_DEVICE(idev), activate_ssm, SSM_STATES, NULL); - fpi_ssm_start(ssm, dev_open_callback); + /* Clearing previous device state */ + FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (idev), activate_ssm, SSM_STATES, NULL); + fpi_ssm_start (ssm, dev_open_callback); } /* Close device */ -static void dev_close(FpImageDevice *idev) +static void +dev_close (FpImageDevice *idev) { - GError *error = NULL; - FpDeviceVfs0050 *self = FPI_DEVICE_VFS0050(idev); + GError *error = NULL; + FpDeviceVfs0050 *self = FPI_DEVICE_VFS0050 (idev); - clear_data(self); + clear_data (self); - /* Release usb interface */ - g_usb_device_release_interface(fpi_device_get_usb_device(FP_DEVICE(idev)), - 0, 0, &error); + /* Release usb interface */ + g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (idev)), + 0, 0, &error); - /* Notify close complete */ - fpi_image_device_close_complete(idev, error); + /* Notify close complete */ + fpi_image_device_close_complete (idev, error); } /* Usb id table of device */ -static const FpIdEntry id_table [ ] = { - {.vid = 0x138a, .pid = 0x0050, - }, - {.vid = 0, .pid = 0, .driver_data = 0}, +static const FpIdEntry id_table[] = { + {.vid = 0x138a, .pid = 0x0050, }, + {.vid = 0, .pid = 0, .driver_data = 0}, }; -static void fpi_device_vfs0050_init(FpDeviceVfs0050 *self) { +static void +fpi_device_vfs0050_init (FpDeviceVfs0050 *self) +{ } -static void fpi_device_vfs0050_class_init(FpDeviceVfs0050Class *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); - FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS(klass); +static void +fpi_device_vfs0050_class_init (FpDeviceVfs0050Class *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); + FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); - dev_class->id = "vfs0050"; - dev_class->full_name = "Validity VFS0050"; - dev_class->type = FP_DEVICE_TYPE_USB; - dev_class->id_table = id_table; - dev_class->scan_type = FP_SCAN_TYPE_SWIPE; + dev_class->id = "vfs0050"; + dev_class->full_name = "Validity VFS0050"; + dev_class->type = FP_DEVICE_TYPE_USB; + dev_class->id_table = id_table; + dev_class->scan_type = FP_SCAN_TYPE_SWIPE; - img_class->img_open = dev_open; - img_class->img_close = dev_close; - img_class->activate = dev_activate; - img_class->deactivate = dev_deactivate; + img_class->img_open = dev_open; + img_class->img_close = dev_close; + img_class->activate = dev_activate; + img_class->deactivate = dev_deactivate; - img_class->bz3_threshold = 24; + img_class->bz3_threshold = 24; - img_class->img_width = VFS_IMAGE_WIDTH; - img_class->img_height = -1; + img_class->img_width = VFS_IMAGE_WIDTH; + img_class->img_height = -1; } diff --git a/libfprint/drivers/vfs0050.h b/libfprint/drivers/vfs0050.h index a6b315b..f4ebb17 100644 --- a/libfprint/drivers/vfs0050.h +++ b/libfprint/drivers/vfs0050.h @@ -51,334 +51,336 @@ #define EP3_IN 0x83 /* Fingerprint horizontal line */ -struct vfs_line { - /* It must be always 0x01 */ - unsigned char _0x01; - /* It must be always 0xfe */ - unsigned char _0xfe; +struct vfs_line +{ + /* It must be always 0x01 */ + unsigned char _0x01; + /* It must be always 0xfe */ + unsigned char _0xfe; - /* line number starting from some number in Little-Endian */ - unsigned short id; + /* line number starting from some number in Little-Endian */ + unsigned short id; - /* Some hashes which are useful to detect noise */ - unsigned char noise_hash_1; - unsigned char noise_hash_2; + /* Some hashes which are useful to detect noise */ + unsigned char noise_hash_1; + unsigned char noise_hash_2; - /* The first byte of _somedata is always 0x00, the second is strange useless cyclic line number */ - unsigned short _somedata; + /* The first byte of _somedata is always 0x00, the second is strange useless cyclic line number */ + unsigned short _somedata; - /* Fingerprint image */ - unsigned char data[VFS_IMAGE_WIDTH]; + /* Fingerprint image */ + unsigned char data[VFS_IMAGE_WIDTH]; - /* Narrow fingerprint part from the center used for variable speed lines assembling */ - unsigned char next_line_part[VFS_NEXT_LINE_WIDTH]; + /* Narrow fingerprint part from the center used for variable speed lines assembling */ + unsigned char next_line_part[VFS_NEXT_LINE_WIDTH]; - /* scan_data is 0xfb except some rare cases, it's skipped */ - unsigned char scan_data[8]; -} __attribute__ ((__packed__)); + /* scan_data is 0xfb except some rare cases, it's skipped */ + unsigned char scan_data[8]; +} __attribute__((__packed__)); /* The main driver structure */ -struct _FpDeviceVfs0050 { - FpImageDevice parent; +struct _FpDeviceVfs0050 +{ + FpImageDevice parent; - /* One if we were asked to read fingerprint, zero otherwise */ - char active; + /* One if we were asked to read fingerprint, zero otherwise */ + char active; - /* Control packet parameter for send_control_packet */ - unsigned char *control_packet; + /* Control packet parameter for send_control_packet */ + unsigned char *control_packet; - /* For dev_deactivate to check whether ssm still running or not */ - char ssm_active; + /* For dev_deactivate to check whether ssm still running or not */ + char ssm_active; - /* Should we call fpi_imgdev_activate_complete or fpi_imgdev_deactivate_complete */ - char need_report; + /* Should we call fpi_imgdev_activate_complete or fpi_imgdev_deactivate_complete */ + char need_report; - /* Received fingerprint raw lines */ - struct vfs_line *lines_buffer; + /* Received fingerprint raw lines */ + struct vfs_line *lines_buffer; - /* Current number of received bytes and current memory used by data */ - int bytes, memory; + /* Current number of received bytes and current memory used by data */ + int bytes, memory; - /* USB buffer for fingerprint */ - char *usb_buffer; + /* USB buffer for fingerprint */ + char *usb_buffer; - /* Received interrupt data */ - unsigned char interrupt[8]; + /* Received interrupt data */ + unsigned char interrupt[8]; }; G_DECLARE_FINAL_TYPE (FpDeviceVfs0050, fpi_device_vfs0050, FPI, DEVICE_VFS0050, FpImageDevice) /* SSM states for clear_ep2 */ enum SUBSM1 { - SUBSM1_COMMAND_04, - SUBSM1_RETURN_CODE, - SUBSM1_ABORT_2, + SUBSM1_COMMAND_04, + SUBSM1_RETURN_CODE, + SUBSM1_ABORT_2, - SUBSM1_STATES, + SUBSM1_STATES, }; /* SSM states for control */ enum SUBSM2 { - SUBSM2_SEND_CONTROL, - SUBSM2_RETURN_CODE, /* If next_receive, send another control packet */ + SUBSM2_SEND_CONTROL, + SUBSM2_RETURN_CODE, /* If next_receive, send another control packet */ - SUBSM2_SEND_COMMIT, - SUBSM2_COMMIT_RESPONSE, - SUBSM2_READ_EMPTY_INTERRUPT, - SUBSM2_ABORT_3, - SUBSM2_CLEAR_EP2, + SUBSM2_SEND_COMMIT, + SUBSM2_COMMIT_RESPONSE, + SUBSM2_READ_EMPTY_INTERRUPT, + SUBSM2_ABORT_3, + SUBSM2_CLEAR_EP2, - SUBSM2_STATES, + SUBSM2_STATES, }; /* SSM states for activate_ssm */ enum SSM_STATE { - SSM_INITIAL_ABORT_1, - SSM_INITIAL_ABORT_2, - SSM_INITIAL_ABORT_3, - SSM_CLEAR_EP2, - SSM_TURN_OFF, + SSM_INITIAL_ABORT_1, + SSM_INITIAL_ABORT_2, + SSM_INITIAL_ABORT_3, + SSM_CLEAR_EP2, + SSM_TURN_OFF, - /* Here the device is turned off; if not active, complete ssm */ - SSM_TURN_ON, + /* Here the device is turned off; if not active, complete ssm */ + SSM_TURN_ON, - SSM_ASK_INTERRUPT, - SSM_WAIT_INTERRUPT, + SSM_ASK_INTERRUPT, + SSM_WAIT_INTERRUPT, - SSM_RECEIVE_FINGER, - SSM_SUBMIT_IMAGE, + SSM_RECEIVE_FINGER, + SSM_SUBMIT_IMAGE, - /* If not active, jump to CLEAR_EP2 */ - SSM_NEXT_RECEIVE, - SSM_WAIT_ANOTHER_SCAN, - /* Jump to TURN_ON */ + /* If not active, jump to CLEAR_EP2 */ + SSM_NEXT_RECEIVE, + SSM_WAIT_ANOTHER_SCAN, + /* Jump to TURN_ON */ - SSM_STATES + SSM_STATES }; /* Blocks of data from USB sniffer */ /* Turns on the light */ static unsigned char turn_on[] = { - 0x39, 0x20, 0xBF, 0x02, 0x00, 0xF4, 0x01, 0x00, 0x00, 0x01, 0xD1, 0x00, - 0x20, 0xD1, 0xD1, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x01, 0x00, - 0x00, 0x01, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xF4, 0x01, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0xF4, 0x01, 0x00, 0x00, 0x02, 0xD1, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, + 0x39, 0x20, 0xBF, 0x02, 0x00, 0xF4, 0x01, 0x00, 0x00, 0x01, 0xD1, 0x00, + 0x20, 0xD1, 0xD1, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x01, 0x00, + 0x00, 0x01, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xF4, 0x01, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0xF4, 0x01, 0x00, 0x00, 0x02, 0xD1, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, }; /* Power off */ static unsigned char turn_off[] = { - 0x39, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, + 0x39, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, }; /* Turns on orange light */ static unsigned char next_receive_1[] = { - 0x39, 0xB8, 0x0B, 0x00, 0x00, 0xB8, 0x0B, 0x00, 0x00, 0x01, 0xD1, 0x00, - 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0xB8, 0x0B, 0x00, 0x00, 0x02, 0xD1, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, + 0x39, 0xB8, 0x0B, 0x00, 0x00, 0xB8, 0x0B, 0x00, 0x00, 0x01, 0xD1, 0x00, + 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0xB8, 0x0B, 0x00, 0x00, 0x02, 0xD1, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, }; /* Packet directly after next_receive_1 */ static unsigned char next_receive_2[] = { - 0x39, 0xE8, 0x03, 0x00, 0x00, 0xE8, 0x03, 0x00, 0x00, 0x01, 0xD1, 0x00, - 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0xE8, 0x03, 0x00, 0x00, 0x02, 0xD1, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, + 0x39, 0xE8, 0x03, 0x00, 0x00, 0xE8, 0x03, 0x00, 0x00, 0x01, 0xD1, 0x00, + 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0xE8, 0x03, 0x00, 0x00, 0x02, 0xD1, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, }; /* Commit message */ static unsigned char commit_out[] = { - 0x02, 0x94, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x2C, 0x03, 0x00, - 0x30, 0x1B, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x08, 0x00, 0x20, 0x03, 0x00, 0x30, 0x3D, 0x10, 0x00, - 0x00, 0x20, 0x00, 0x08, - 0x00, 0x18, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, - 0x00, 0x24, 0x03, 0x00, - 0x30, 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x28, 0x03, 0x00, - 0x30, 0x08, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x08, 0x00, 0x30, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x08, - 0x00, 0x38, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, - 0x00, 0x3C, 0x03, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x44, 0x03, 0x00, - 0x30, 0x14, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x08, 0x00, 0x48, 0x03, 0x00, 0x30, 0x01, 0x04, 0x02, - 0x00, 0x20, 0x00, 0x08, - 0x00, 0x4C, 0x03, 0x00, 0x30, 0x01, 0x0C, 0x02, 0x00, 0x20, 0x00, 0x08, - 0x00, 0x54, 0x03, 0x00, - 0x30, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x5C, 0x03, 0x00, - 0x30, 0x90, 0x01, 0x02, - 0x00, 0x20, 0x00, 0x08, 0x00, 0x60, 0x03, 0x00, 0x30, 0x2C, 0x01, 0x19, - 0x00, 0x20, 0x00, 0x08, - 0x00, 0x64, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, - 0x00, 0x6C, 0x03, 0x00, - 0x30, 0x1E, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x70, 0x03, 0x00, - 0x30, 0x21, 0x80, 0x00, - 0x00, 0x20, 0x00, 0x08, 0x00, 0x78, 0x03, 0x00, 0x30, 0x09, 0x00, 0x02, - 0x00, 0x20, 0x00, 0x08, - 0x00, 0x7C, 0x03, 0x00, 0x30, 0x0B, 0x00, 0x19, 0x00, 0x20, 0x00, 0x08, - 0x00, 0x80, 0x03, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x84, 0x03, 0x00, - 0x30, 0x3A, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x08, 0x00, 0x88, 0x03, 0x00, 0x30, 0x14, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x08, - 0x00, 0x8C, 0x03, 0x00, 0x30, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, - 0x00, 0x90, 0x03, 0x00, - 0x30, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x94, 0x03, 0x00, - 0x30, 0x08, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x08, 0x00, 0x98, 0x03, 0x00, 0x30, 0x00, 0x00, 0xA1, - 0x01, 0x20, 0x00, 0x08, - 0x00, 0x9C, 0x03, 0x00, 0x30, 0x00, 0x00, 0xA1, 0x01, 0x20, 0x00, 0x08, - 0x00, 0xA8, 0x03, 0x00, - 0x30, 0x64, 0x01, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0xAC, 0x03, 0x00, - 0x30, 0x64, 0x01, 0x00, - 0x00, 0x20, 0x00, 0x08, 0x00, 0xB0, 0x03, 0x00, 0x30, 0x00, 0x01, 0x00, - 0x00, 0x20, 0x00, 0x08, - 0x00, 0xB4, 0x03, 0x00, 0x30, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x08, - 0x00, 0xB8, 0x03, 0x00, - 0x30, 0x05, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0xBC, 0x03, 0x00, - 0x30, 0x05, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x08, 0x00, 0xC0, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x08, - 0x00, 0x84, 0x03, 0x00, 0x30, 0x3B, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, - 0x00, 0x08, 0x07, 0x00, - 0x30, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x0C, 0x07, 0x00, - 0x30, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x08, 0x00, 0x14, 0x07, 0x00, 0x30, 0x20, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x08, - 0x00, 0x1C, 0x07, 0x00, 0x30, 0x1A, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, - 0x00, 0x70, 0x0D, 0x00, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x25, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x90, 0x00, 0x00, 0x00, 0x2B, 0xFF, 0x2B, 0xFF, 0x2B, - 0xED, 0x00, 0x00, 0x2B, - 0xFB, 0x00, 0x00, 0x2B, 0xC5, 0x00, 0x00, 0x2B, 0x05, 0x80, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x24, 0xD3, 0x2E, 0xC0, 0x2C, 0x3B, 0x08, 0xF0, 0x3B, 0x09, 0x24, - 0xBB, 0x3B, 0x0B, 0x24, - 0xAA, 0x3B, 0x1F, 0xF8, 0x00, 0x3B, 0x3F, 0xF0, 0x00, 0x3B, 0x35, 0xC0, - 0x00, 0x38, 0x80, 0x2C, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x38, 0x80, 0x2C, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xC0, - 0x3A, 0x80, 0x2C, 0x70, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x3B, 0x0A, 0x80, - 0x2E, 0x83, 0x24, 0xDB, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x2C, 0x31, 0x83, 0x2C, 0x70, - 0x00, 0x00, 0x00, 0x00, - 0xCB, 0x33, 0x1B, 0x83, 0x2C, 0x70, 0x00, 0x00, 0x00, 0x00, 0xCB, 0x31, - 0x83, 0x2C, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xCB, 0x00, 0x33, 0x1E, 0x83, 0x2E, 0x25, 0xFF, 0xC4, - 0x00, 0x2F, 0x06, 0x84, - 0x2E, 0x00, 0x00, 0x10, 0x20, 0x29, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x23, 0x00, 0x00, - 0x00, 0x21, 0x00, 0x10, 0x00, 0x48, 0x03, 0x00, 0x30, 0xFF, 0xF0, 0xFF, - 0xFF, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x00, 0x00, 0x21, 0x00, 0x10, 0x00, 0x4C, 0x03, 0x00, - 0x30, 0xFF, 0xF0, 0xFF, - 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x21, 0x00, 0x10, - 0x00, 0x20, 0x03, 0x00, - 0x30, 0x7F, 0x00, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, - 0x00, 0x20, 0x00, 0x08, - 0x00, 0x24, 0x03, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, - 0x00, 0x1C, 0x07, 0x00, - 0x30, 0x1A, 0x00, 0x00, 0x00, 0x21, 0x00, 0x10, 0x00, 0x20, 0x03, 0x00, - 0x30, 0xC3, 0xFF, 0xFF, - 0xFF, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, - 0x00, 0x80, 0x03, 0x00, - 0x30, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x84, 0x00, 0x31, 0x65, 0x77, - 0x77, 0x77, 0x78, 0x88, - 0x77, 0x77, 0x76, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x77, 0x67, - 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x76, 0x67, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x77, 0x66, 0x66, - 0x66, 0x66, 0x67, 0x66, 0x66, 0x66, 0x66, 0x66, 0x76, 0x76, 0x66, 0x56, - 0x66, 0x66, 0x56, 0x55, - 0x65, 0x66, 0x66, 0x66, 0x65, 0x66, 0x66, 0x55, 0x66, 0x66, 0x65, 0x66, - 0x76, 0x76, 0x77, 0x77, - 0x66, 0x66, 0x66, 0x76, 0x67, 0x66, 0x77, 0x67, 0x66, 0x66, 0x66, 0x56, - 0x65, 0x66, 0x65, 0x66, - 0x66, 0x55, 0x55, 0x54, 0x55, 0x65, 0x66, 0x66, 0x66, 0x76, 0x77, 0x87, - 0x88, 0x77, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x65, 0x66, 0x55, 0x55, 0x65, 0x56, 0x55, - 0x55, 0x55, 0x54, 0x45, - 0x54, 0x55, 0x55, 0x55, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x77, 0x77, - 0x66, 0x26, 0x00, 0x28, - 0x00, 0xFF, 0x00, 0x0F, 0x00, 0xF0, 0xF0, 0x0F, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x30, 0x01, 0x02, - 0x00, 0x2C, 0x01, 0x28, 0x00, 0x20, 0x80, 0x00, 0x00, 0x0A, 0x00, 0x02, - 0x00, 0x0B, 0x00, 0x19, - 0x00, 0x40, 0x1F, 0x10, 0x27, 0x00, 0x0F, 0x03, 0x00, + 0x02, 0x94, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x2C, 0x03, 0x00, + 0x30, 0x1B, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x08, 0x00, 0x20, 0x03, 0x00, 0x30, 0x3D, 0x10, 0x00, + 0x00, 0x20, 0x00, 0x08, + 0x00, 0x18, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, + 0x00, 0x24, 0x03, 0x00, + 0x30, 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x28, 0x03, 0x00, + 0x30, 0x08, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x08, 0x00, 0x30, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x08, + 0x00, 0x38, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, + 0x00, 0x3C, 0x03, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x44, 0x03, 0x00, + 0x30, 0x14, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x08, 0x00, 0x48, 0x03, 0x00, 0x30, 0x01, 0x04, 0x02, + 0x00, 0x20, 0x00, 0x08, + 0x00, 0x4C, 0x03, 0x00, 0x30, 0x01, 0x0C, 0x02, 0x00, 0x20, 0x00, 0x08, + 0x00, 0x54, 0x03, 0x00, + 0x30, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x5C, 0x03, 0x00, + 0x30, 0x90, 0x01, 0x02, + 0x00, 0x20, 0x00, 0x08, 0x00, 0x60, 0x03, 0x00, 0x30, 0x2C, 0x01, 0x19, + 0x00, 0x20, 0x00, 0x08, + 0x00, 0x64, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, + 0x00, 0x6C, 0x03, 0x00, + 0x30, 0x1E, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x70, 0x03, 0x00, + 0x30, 0x21, 0x80, 0x00, + 0x00, 0x20, 0x00, 0x08, 0x00, 0x78, 0x03, 0x00, 0x30, 0x09, 0x00, 0x02, + 0x00, 0x20, 0x00, 0x08, + 0x00, 0x7C, 0x03, 0x00, 0x30, 0x0B, 0x00, 0x19, 0x00, 0x20, 0x00, 0x08, + 0x00, 0x80, 0x03, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x84, 0x03, 0x00, + 0x30, 0x3A, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x08, 0x00, 0x88, 0x03, 0x00, 0x30, 0x14, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x08, + 0x00, 0x8C, 0x03, 0x00, 0x30, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, + 0x00, 0x90, 0x03, 0x00, + 0x30, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x94, 0x03, 0x00, + 0x30, 0x08, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x08, 0x00, 0x98, 0x03, 0x00, 0x30, 0x00, 0x00, 0xA1, + 0x01, 0x20, 0x00, 0x08, + 0x00, 0x9C, 0x03, 0x00, 0x30, 0x00, 0x00, 0xA1, 0x01, 0x20, 0x00, 0x08, + 0x00, 0xA8, 0x03, 0x00, + 0x30, 0x64, 0x01, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0xAC, 0x03, 0x00, + 0x30, 0x64, 0x01, 0x00, + 0x00, 0x20, 0x00, 0x08, 0x00, 0xB0, 0x03, 0x00, 0x30, 0x00, 0x01, 0x00, + 0x00, 0x20, 0x00, 0x08, + 0x00, 0xB4, 0x03, 0x00, 0x30, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x08, + 0x00, 0xB8, 0x03, 0x00, + 0x30, 0x05, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0xBC, 0x03, 0x00, + 0x30, 0x05, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x08, 0x00, 0xC0, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x08, + 0x00, 0x84, 0x03, 0x00, 0x30, 0x3B, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, + 0x00, 0x08, 0x07, 0x00, + 0x30, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x0C, 0x07, 0x00, + 0x30, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x08, 0x00, 0x14, 0x07, 0x00, 0x30, 0x20, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x08, + 0x00, 0x1C, 0x07, 0x00, 0x30, 0x1A, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, + 0x00, 0x70, 0x0D, 0x00, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x25, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x90, 0x00, 0x00, 0x00, 0x2B, 0xFF, 0x2B, 0xFF, 0x2B, + 0xED, 0x00, 0x00, 0x2B, + 0xFB, 0x00, 0x00, 0x2B, 0xC5, 0x00, 0x00, 0x2B, 0x05, 0x80, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x24, 0xD3, 0x2E, 0xC0, 0x2C, 0x3B, 0x08, 0xF0, 0x3B, 0x09, 0x24, + 0xBB, 0x3B, 0x0B, 0x24, + 0xAA, 0x3B, 0x1F, 0xF8, 0x00, 0x3B, 0x3F, 0xF0, 0x00, 0x3B, 0x35, 0xC0, + 0x00, 0x38, 0x80, 0x2C, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x38, 0x80, 0x2C, 0x70, 0x00, + 0x00, 0x00, 0x00, 0xC0, + 0x3A, 0x80, 0x2C, 0x70, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x3B, 0x0A, 0x80, + 0x2E, 0x83, 0x24, 0xDB, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x2C, 0x31, 0x83, 0x2C, 0x70, + 0x00, 0x00, 0x00, 0x00, + 0xCB, 0x33, 0x1B, 0x83, 0x2C, 0x70, 0x00, 0x00, 0x00, 0x00, 0xCB, 0x31, + 0x83, 0x2C, 0x70, 0x00, + 0x00, 0x00, 0x00, 0xCB, 0x00, 0x33, 0x1E, 0x83, 0x2E, 0x25, 0xFF, 0xC4, + 0x00, 0x2F, 0x06, 0x84, + 0x2E, 0x00, 0x00, 0x10, 0x20, 0x29, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x23, 0x00, 0x00, + 0x00, 0x21, 0x00, 0x10, 0x00, 0x48, 0x03, 0x00, 0x30, 0xFF, 0xF0, 0xFF, + 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x21, 0x00, 0x10, 0x00, 0x4C, 0x03, 0x00, + 0x30, 0xFF, 0xF0, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x21, 0x00, 0x10, + 0x00, 0x20, 0x03, 0x00, + 0x30, 0x7F, 0x00, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, + 0x00, 0x20, 0x00, 0x08, + 0x00, 0x24, 0x03, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, + 0x00, 0x1C, 0x07, 0x00, + 0x30, 0x1A, 0x00, 0x00, 0x00, 0x21, 0x00, 0x10, 0x00, 0x20, 0x03, 0x00, + 0x30, 0xC3, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, + 0x00, 0x80, 0x03, 0x00, + 0x30, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x84, 0x00, 0x31, 0x65, 0x77, + 0x77, 0x77, 0x78, 0x88, + 0x77, 0x77, 0x76, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x77, 0x67, + 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x76, 0x67, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x77, 0x66, 0x66, + 0x66, 0x66, 0x67, 0x66, 0x66, 0x66, 0x66, 0x66, 0x76, 0x76, 0x66, 0x56, + 0x66, 0x66, 0x56, 0x55, + 0x65, 0x66, 0x66, 0x66, 0x65, 0x66, 0x66, 0x55, 0x66, 0x66, 0x65, 0x66, + 0x76, 0x76, 0x77, 0x77, + 0x66, 0x66, 0x66, 0x76, 0x67, 0x66, 0x77, 0x67, 0x66, 0x66, 0x66, 0x56, + 0x65, 0x66, 0x65, 0x66, + 0x66, 0x55, 0x55, 0x54, 0x55, 0x65, 0x66, 0x66, 0x66, 0x76, 0x77, 0x87, + 0x88, 0x77, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x65, 0x66, 0x55, 0x55, 0x65, 0x56, 0x55, + 0x55, 0x55, 0x54, 0x45, + 0x54, 0x55, 0x55, 0x55, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x77, 0x77, + 0x66, 0x26, 0x00, 0x28, + 0x00, 0xFF, 0x00, 0x0F, 0x00, 0xF0, 0xF0, 0x0F, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x30, 0x01, 0x02, + 0x00, 0x2C, 0x01, 0x28, 0x00, 0x20, 0x80, 0x00, 0x00, 0x0A, 0x00, 0x02, + 0x00, 0x0B, 0x00, 0x19, + 0x00, 0x40, 0x1F, 0x10, 0x27, 0x00, 0x0F, 0x03, 0x00, }; /* Known interrupts */ static unsigned char empty_interrupt[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, }; static unsigned char interrupt1[] = { - 0x02, 0x00, 0x0E, 0x00, 0xF0, + 0x02, 0x00, 0x0E, 0x00, 0xF0, }; static unsigned char interrupt2[] = { - 0x02, 0x04, 0x0A, 0x00, 0xF0, + 0x02, 0x04, 0x0A, 0x00, 0xF0, }; static unsigned char interrupt3[] = { - 0x02, 0x00, 0x0A, 0x00, 0xF0, + 0x02, 0x00, 0x0A, 0x00, 0xF0, }; diff --git a/libfprint/drivers/vfs101.c b/libfprint/drivers/vfs101.c index 690ec2d..6abf265 100644 --- a/libfprint/drivers/vfs101.c +++ b/libfprint/drivers/vfs101.c @@ -22,1330 +22,1368 @@ #include "drivers_api.h" /* Input-Output usb endpoint */ -#define EP_IN(n) (n | FPI_USB_ENDPOINT_IN) -#define EP_OUT(n) (n | FPI_USB_ENDPOINT_OUT) +#define EP_IN(n) (n | FPI_USB_ENDPOINT_IN) +#define EP_OUT(n) (n | FPI_USB_ENDPOINT_OUT) /* Usb bulk timeout */ -#define BULK_TIMEOUT 100 +#define BULK_TIMEOUT 100 /* The device send back the image into block of 16 frames of 292 bytes */ -#define VFS_FRAME_SIZE 292 -#define VFS_BLOCK_SIZE 16 * VFS_FRAME_SIZE +#define VFS_FRAME_SIZE 292 +#define VFS_BLOCK_SIZE 16 * VFS_FRAME_SIZE /* Buffer height */ -#define VFS_BUFFER_HEIGHT 5000 +#define VFS_BUFFER_HEIGHT 5000 /* Buffer size */ -#define VFS_BUFFER_SIZE (VFS_BUFFER_HEIGHT * VFS_FRAME_SIZE) +#define VFS_BUFFER_SIZE (VFS_BUFFER_HEIGHT * VFS_FRAME_SIZE) /* Image width */ -#define VFS_IMG_WIDTH 200 +#define VFS_IMG_WIDTH 200 /* Maximum image height */ -#define VFS_IMG_MAX_HEIGHT 1023 +#define VFS_IMG_MAX_HEIGHT 1023 /* Minimum image height */ -#define VFS_IMG_MIN_HEIGHT 200 +#define VFS_IMG_MIN_HEIGHT 200 /* Scan level threshold */ -#define VFS_IMG_SLT_BEGIN 768 -#define VFS_IMG_SLT_END 64 -#define VFS_IMG_SLT_LINES 4 +#define VFS_IMG_SLT_BEGIN 768 +#define VFS_IMG_SLT_END 64 +#define VFS_IMG_SLT_LINES 4 /* Minimum image level */ -#define VFS_IMG_MIN_IMAGE_LEVEL 144 +#define VFS_IMG_MIN_IMAGE_LEVEL 144 /* Best image contrast */ -#define VFS_IMG_BEST_CONTRAST 128 +#define VFS_IMG_BEST_CONTRAST 128 /* Device parameters address */ -#define VFS_PAR_000E 0x000e -#define VFS_PAR_0011 0x0011 -#define VFS_PAR_THRESHOLD 0x0057 -#define VFS_PAR_STATE_3 0x005e -#define VFS_PAR_STATE_5 0x005f -#define VFS_PAR_INFO_RATE 0x0062 -#define VFS_PAR_0076 0x0076 -#define VFS_PAR_INFO_CONTRAST 0x0077 -#define VFS_PAR_0078 0x0078 +#define VFS_PAR_000E 0x000e +#define VFS_PAR_0011 0x0011 +#define VFS_PAR_THRESHOLD 0x0057 +#define VFS_PAR_STATE_3 0x005e +#define VFS_PAR_STATE_5 0x005f +#define VFS_PAR_INFO_RATE 0x0062 +#define VFS_PAR_0076 0x0076 +#define VFS_PAR_INFO_CONTRAST 0x0077 +#define VFS_PAR_0078 0x0078 /* Device regiones address */ -#define VFS_REG_IMG_EXPOSURE 0xff500e -#define VFS_REG_IMG_CONTRAST 0xff5038 +#define VFS_REG_IMG_EXPOSURE 0xff500e +#define VFS_REG_IMG_CONTRAST 0xff5038 /* Device settings */ -#define VFS_VAL_000E 0x0001 -#define VFS_VAL_0011 0x0008 -#define VFS_VAL_THRESHOLD 0x0096 -#define VFS_VAL_STATE_3 0x0064 -#define VFS_VAL_STATE_5 0x00c8 -#define VFS_VAL_INFO_RATE 0x0001 -#define VFS_VAL_0076 0x0012 -#define VFS_VAL_0078 0x2230 -#define VFS_VAL_IMG_EXPOSURE 0x21c0 +#define VFS_VAL_000E 0x0001 +#define VFS_VAL_0011 0x0008 +#define VFS_VAL_THRESHOLD 0x0096 +#define VFS_VAL_STATE_3 0x0064 +#define VFS_VAL_STATE_5 0x00c8 +#define VFS_VAL_INFO_RATE 0x0001 +#define VFS_VAL_0076 0x0012 +#define VFS_VAL_0078 0x2230 +#define VFS_VAL_IMG_EXPOSURE 0x21c0 /* Structure for Validity device */ -struct _FpDeviceVfs101 { - FpImageDevice parent; +struct _FpDeviceVfs101 +{ + FpImageDevice parent; - /* Action state */ - gboolean active; - gboolean deactivate; + /* Action state */ + gboolean active; + gboolean deactivate; - /* Sequential number */ - unsigned int seqnum; + /* Sequential number */ + unsigned int seqnum; - /* Buffer for input/output */ - unsigned char *buffer; + /* Buffer for input/output */ + unsigned char *buffer; - /* Length of data to send or received */ - unsigned int length; + /* Length of data to send or received */ + unsigned int length; - /* Ignore usb error */ - int ignore_error; + /* Ignore usb error */ + int ignore_error; - /* Loop counter */ - int counter; + /* Loop counter */ + int counter; - /* Image contrast */ - int contrast; + /* Image contrast */ + int contrast; - /* Best contrast */ - int best_contrast; + /* Best contrast */ + int best_contrast; - /* Best contrast level */ - int best_clevel; + /* Best contrast level */ + int best_clevel; - /* Bottom line of image */ - int bottom; + /* Bottom line of image */ + int bottom; - /* Image height */ - int height; + /* Image height */ + int height; }; -G_DECLARE_FINAL_TYPE(FpDeviceVfs101, fpi_device_vfs101, FPI, DEVICE_VFS101, - FpImageDevice); -G_DEFINE_TYPE(FpDeviceVfs101, fpi_device_vfs101, FP_TYPE_IMAGE_DEVICE); +G_DECLARE_FINAL_TYPE (FpDeviceVfs101, fpi_device_vfs101, FPI, DEVICE_VFS101, + FpImageDevice); +G_DEFINE_TYPE (FpDeviceVfs101, fpi_device_vfs101, FP_TYPE_IMAGE_DEVICE); /* Return byte at specified position */ -static inline unsigned char byte(int position, int value) +static inline unsigned char +byte (int position, int value) { - return (value >> (position * 8)) & 0xff; + return (value >> (position * 8)) & 0xff; } /* Return sequential number */ -static inline unsigned short get_seqnum(int h, int l) +static inline unsigned short +get_seqnum (int h, int l) { - return (h<<8) | l; + return (h << 8) | l; } /* Check sequential number */ -static inline int check_seqnum(FpDeviceVfs101 *vdev) +static inline int +check_seqnum (FpDeviceVfs101 *vdev) { - if ((byte(0, vdev->seqnum) == vdev->buffer[0]) && - (byte(1, vdev->seqnum) == vdev->buffer[1])) - return 0; - else - return 1; + if ((byte (0, vdev->seqnum) == vdev->buffer[0]) && + (byte (1, vdev->seqnum) == vdev->buffer[1])) + return 0; + else + return 1; } /* Internal result codes */ -enum -{ - RESULT_RETRY, - RESULT_RETRY_SHORT, - RESULT_RETRY_REMOVE, - RESULT_COUNT, +enum { + RESULT_RETRY, + RESULT_RETRY_SHORT, + RESULT_RETRY_REMOVE, + RESULT_COUNT, }; /* Dump buffer for debug */ #define dump_buffer(buf) \ - fp_dbg("%02x %02x %02x %02x %02x %02x %02x %02x", \ - buf[6], buf[7], buf[8], buf[9], buf[10], buf[11], buf[12], buf[13] \ - ) + fp_dbg ("%02x %02x %02x %02x %02x %02x %02x %02x", \ + buf[6], buf[7], buf[8], buf[9], buf[10], buf[11], buf[12], buf[13] \ + ) /* Callback of asynchronous send */ -static void async_send_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +async_send_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpImageDevice *dev = FP_IMAGE_DEVICE(device); - FpDeviceVfs101 *self = FPI_DEVICE_VFS101(dev); + FpImageDevice *dev = FP_IMAGE_DEVICE (device); + FpDeviceVfs101 *self = FPI_DEVICE_VFS101 (dev); - /* Skip error check if ignore_error is set */ - if (error) { - if (!self->ignore_error) { - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } else { - g_error_free (error); - fp_dbg ("Ignoring send error: %s", error->message); - } - } - /* Reset ignore_error flag */ - self->ignore_error = FALSE; + /* Skip error check if ignore_error is set */ + if (error) + { + if (!self->ignore_error) + { + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } + else + { + g_error_free (error); + fp_dbg ("Ignoring send error: %s", error->message); + } + } + /* Reset ignore_error flag */ + self->ignore_error = FALSE; - /* Dump buffer for debug */ - dump_buffer(self->buffer); + /* Dump buffer for debug */ + dump_buffer (self->buffer); - fpi_ssm_next_state(transfer->ssm); + fpi_ssm_next_state (transfer->ssm); } /* Submit asynchronous send */ static void -async_send(FpiSsm *ssm, - FpImageDevice *dev) +async_send (FpiSsm *ssm, + FpImageDevice *dev) { - FpDeviceVfs101 *self = FPI_DEVICE_VFS101(dev); - FpiUsbTransfer *transfer; + FpDeviceVfs101 *self = FPI_DEVICE_VFS101 (dev); + FpiUsbTransfer *transfer; - transfer = fpi_usb_transfer_new(FP_DEVICE (dev)); + transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); - /* Put sequential number into the buffer */ - self->seqnum++; - self->buffer[0] = byte(0, self->seqnum); - self->buffer[1] = byte(1, self->seqnum); + /* Put sequential number into the buffer */ + self->seqnum++; + self->buffer[0] = byte (0, self->seqnum); + self->buffer[1] = byte (1, self->seqnum); - /* Prepare bulk transfer */ - fpi_usb_transfer_fill_bulk_full(transfer, EP_OUT(1), - self->buffer, self->length, NULL); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - async_send_cb, NULL); - fpi_usb_transfer_unref(transfer); + /* Prepare bulk transfer */ + fpi_usb_transfer_fill_bulk_full (transfer, EP_OUT (1), + self->buffer, self->length, NULL); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + async_send_cb, NULL); + fpi_usb_transfer_unref (transfer); } /* Callback of asynchronous recv */ -static void async_recv_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +async_recv_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpImageDevice *dev = FP_IMAGE_DEVICE(device); - FpDeviceVfs101 *self = FPI_DEVICE_VFS101(dev); + FpImageDevice *dev = FP_IMAGE_DEVICE (device); + FpDeviceVfs101 *self = FPI_DEVICE_VFS101 (dev); - /* Skip error check if ignore_error is set */ - if (!self->ignore_error) - { - if (error) - { - /* Transfer not completed, return IO error */ - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } + /* Skip error check if ignore_error is set */ + if (!self->ignore_error) + { + if (error) + { + /* Transfer not completed, return IO error */ + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } - if (check_seqnum(self)) - { - /* Sequential number received mismatch, return protocol error */ - fp_err("seqnum mismatch, got %04x, expected %04x", - get_seqnum(self->buffer[1], self->buffer[0]), - self->seqnum); - fpi_ssm_mark_failed(transfer->ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); - return; - } - } + if (check_seqnum (self)) + { + /* Sequential number received mismatch, return protocol error */ + fp_err ("seqnum mismatch, got %04x, expected %04x", + get_seqnum (self->buffer[1], self->buffer[0]), + self->seqnum); + fpi_ssm_mark_failed (transfer->ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + return; + } + } - g_clear_pointer (&error, g_error_free); + g_clear_pointer (&error, g_error_free); - /* Reset ignore_error flag */ - self->ignore_error = FALSE; + /* Reset ignore_error flag */ + self->ignore_error = FALSE; - /* Dump buffer for debug */ - dump_buffer(self->buffer); + /* Dump buffer for debug */ + dump_buffer (self->buffer); - /* Set length of received data */ - self->length = transfer->actual_length; + /* Set length of received data */ + self->length = transfer->actual_length; - fpi_ssm_next_state(transfer->ssm); + fpi_ssm_next_state (transfer->ssm); } /* Submit asynchronous recv */ static void -async_recv(FpiSsm *ssm, - FpImageDevice *dev) +async_recv (FpiSsm *ssm, + FpImageDevice *dev) { - FpDeviceVfs101 *self = FPI_DEVICE_VFS101(dev); - FpiUsbTransfer *transfer; + FpDeviceVfs101 *self = FPI_DEVICE_VFS101 (dev); + FpiUsbTransfer *transfer; - /* Allocation of transfer */ - transfer = fpi_usb_transfer_new(FP_DEVICE (dev)); + /* Allocation of transfer */ + transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); - /* Prepare bulk transfer */ - fpi_usb_transfer_fill_bulk_full(transfer, EP_IN(1), self->buffer, - 0x0f, NULL); - transfer->ssm = ssm; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - async_recv_cb, NULL); - fpi_usb_transfer_unref(transfer); + /* Prepare bulk transfer */ + fpi_usb_transfer_fill_bulk_full (transfer, EP_IN (1), self->buffer, + 0x0f, NULL); + transfer->ssm = ssm; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + async_recv_cb, NULL); + fpi_usb_transfer_unref (transfer); } -static void async_load(FpiSsm *ssm, FpImageDevice *dev); +static void async_load (FpiSsm *ssm, + FpImageDevice *dev); /* Callback of asynchronous load */ -static void async_load_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +async_load_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpImageDevice *dev = FP_IMAGE_DEVICE(device); - FpDeviceVfs101 *self = FPI_DEVICE_VFS101(dev); + FpImageDevice *dev = FP_IMAGE_DEVICE (device); + FpDeviceVfs101 *self = FPI_DEVICE_VFS101 (dev); - /* Skip error check if ignore_error is set */ - if (!self->ignore_error) - { - if (error) - { - /* Transfer not completed */ - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } + /* Skip error check if ignore_error is set */ + if (!self->ignore_error) + { + if (error) + { + /* Transfer not completed */ + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } - if (transfer->actual_length % VFS_FRAME_SIZE) - { - /* Received incomplete frame, return protocol error */ - fp_err("received incomplete frame"); - fpi_ssm_mark_failed(transfer->ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); - return; - } - } + if (transfer->actual_length % VFS_FRAME_SIZE) + { + /* Received incomplete frame, return protocol error */ + fp_err ("received incomplete frame"); + fpi_ssm_mark_failed (transfer->ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + return; + } + } - /* Any error has been ignored. */ - g_clear_pointer (&error, g_error_free); + /* Any error has been ignored. */ + g_clear_pointer (&error, g_error_free); - /* Increase image length */ - self->length += transfer->actual_length; + /* Increase image length */ + self->length += transfer->actual_length; - if (transfer->actual_length == VFS_BLOCK_SIZE) - { - if ((VFS_BUFFER_SIZE - self->length) < VFS_BLOCK_SIZE) - { - /* Buffer full, image too large, return no memory error */ - fp_err("buffer full, image too large"); - fpi_ssm_mark_failed(transfer->ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); - return; - } - else - /* Image load not completed, submit another asynchronous load */ - async_load(transfer->ssm, dev); - } - else - { - /* Reset ignore_error flag */ - self->ignore_error = FALSE; + if (transfer->actual_length == VFS_BLOCK_SIZE) + { + if ((VFS_BUFFER_SIZE - self->length) < VFS_BLOCK_SIZE) + { + /* Buffer full, image too large, return no memory error */ + fp_err ("buffer full, image too large"); + fpi_ssm_mark_failed (transfer->ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + return; + } + else + { + /* Image load not completed, submit another asynchronous load */ + async_load (transfer->ssm, dev); + } + } + else + { + /* Reset ignore_error flag */ + self->ignore_error = FALSE; - /* Image load completed, go to next state */ - self->height = self->length / VFS_FRAME_SIZE; - fp_dbg("image loaded, height = %d", self->height); - fpi_ssm_next_state(transfer->ssm); - } + /* Image load completed, go to next state */ + self->height = self->length / VFS_FRAME_SIZE; + fp_dbg ("image loaded, height = %d", self->height); + fpi_ssm_next_state (transfer->ssm); + } } /* Submit asynchronous load */ static void -async_load(FpiSsm *ssm, - FpImageDevice *dev) +async_load (FpiSsm *ssm, + FpImageDevice *dev) { - FpDeviceVfs101 *self = FPI_DEVICE_VFS101(dev); - FpiUsbTransfer *transfer; - unsigned char *buffer; + FpDeviceVfs101 *self = FPI_DEVICE_VFS101 (dev); + FpiUsbTransfer *transfer; + unsigned char *buffer; - /* Allocation of transfer */ - transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); + /* Allocation of transfer */ + transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); - /* Append new data into the buffer */ - buffer = self->buffer + self->length; + /* Append new data into the buffer */ + buffer = self->buffer + self->length; - /* Prepare bulk transfer */ - fpi_usb_transfer_fill_bulk_full(transfer, EP_IN(2), buffer, - VFS_BLOCK_SIZE, NULL); - transfer->ssm = ssm; - fpi_usb_transfer_submit(transfer, BULK_TIMEOUT, NULL, - async_load_cb, NULL); - fpi_usb_transfer_unref(transfer); + /* Prepare bulk transfer */ + fpi_usb_transfer_fill_bulk_full (transfer, EP_IN (2), buffer, + VFS_BLOCK_SIZE, NULL); + transfer->ssm = ssm; + fpi_usb_transfer_submit (transfer, BULK_TIMEOUT, NULL, + async_load_cb, NULL); + fpi_usb_transfer_unref (transfer); } /* Submit asynchronous sleep */ static void -async_sleep(unsigned int msec, - FpiSsm *ssm, - FpImageDevice *dev) +async_sleep (unsigned int msec, + FpiSsm *ssm, + FpImageDevice *dev) { - fpi_device_add_timeout(FP_DEVICE(dev), msec, - fpi_ssm_next_state_timeout_cb, ssm); + fpi_device_add_timeout (FP_DEVICE (dev), msec, + fpi_ssm_next_state_timeout_cb, ssm); } /* Swap ssm states */ -enum -{ - M_SWAP_SEND, - M_SWAP_RECV, - M_SWAP_NUM_STATES, +enum { + M_SWAP_SEND, + M_SWAP_RECV, + M_SWAP_NUM_STATES, }; /* Exec swap sequential state machine */ -static void m_swap_state(FpiSsm *ssm, FpDevice *_dev, void *user_data) +static void +m_swap_state (FpiSsm *ssm, FpDevice *_dev, void *user_data) { - switch (fpi_ssm_get_cur_state(ssm)) - { - case M_SWAP_SEND: - /* Send data */ - async_send(ssm, user_data); - break; + switch (fpi_ssm_get_cur_state (ssm)) + { + case M_SWAP_SEND: + /* Send data */ + async_send (ssm, user_data); + break; - case M_SWAP_RECV: - /* Recv response */ - async_recv(ssm, user_data); - break; - } + case M_SWAP_RECV: + /* Recv response */ + async_recv (ssm, user_data); + break; + } } /* Start swap sequential state machine */ static void -m_swap(FpiSsm *ssm, - FpImageDevice *dev, - unsigned char *data, - size_t length) +m_swap (FpiSsm *ssm, + FpImageDevice *dev, + unsigned char *data, + size_t length) { - FpDeviceVfs101 *self = FPI_DEVICE_VFS101(dev); - FpiSsm *subsm; + FpDeviceVfs101 *self = FPI_DEVICE_VFS101 (dev); + FpiSsm *subsm; - /* Prepare data for sending */ - memcpy(self->buffer, data, length); - memset(self->buffer + length, 0, 16 - length); - self->length = length; + /* Prepare data for sending */ + memcpy (self->buffer, data, length); + memset (self->buffer + length, 0, 16 - length); + self->length = length; - /* Start swap ssm */ - subsm = fpi_ssm_new(FP_DEVICE(dev), m_swap_state, M_SWAP_NUM_STATES, - dev); - fpi_ssm_start_subsm(ssm, subsm); + /* Start swap ssm */ + subsm = fpi_ssm_new (FP_DEVICE (dev), m_swap_state, M_SWAP_NUM_STATES, + dev); + fpi_ssm_start_subsm (ssm, subsm); } /* Retrieve fingerprint image */ static void -vfs_get_print(FpiSsm *ssm, - FpImageDevice *dev, - unsigned int param, - int type) +vfs_get_print (FpiSsm *ssm, + FpImageDevice *dev, + unsigned int param, + int type) { - unsigned char data[2][0x0e] = { - { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01 }, - { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01 } - }; + unsigned char data[2][0x0e] = { + { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01 }, + { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01 } + }; - fp_dbg("param = %04x, type = %d", param, type); + fp_dbg ("param = %04x, type = %d", param, type); - /* Prepare data for sending */ - data[type][6] = byte(0, param); - data[type][7] = byte(1, param); + /* Prepare data for sending */ + data[type][6] = byte (0, param); + data[type][7] = byte (1, param); - /* Run swap sequential state machine */ - m_swap(ssm, dev, data[type], 0x0e); + /* Run swap sequential state machine */ + m_swap (ssm, dev, data[type], 0x0e); } /* Set a parameter value on the device */ static void -vfs_set_param(FpiSsm *ssm, - FpImageDevice *dev, - unsigned int param, - unsigned int value) +vfs_set_param (FpiSsm *ssm, + FpImageDevice *dev, + unsigned int param, + unsigned int value) { - unsigned char data[0x0a] = { 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00 }; + unsigned char data[0x0a] = { 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00 }; - fp_dbg("param = %04x, value = %04x", param, value); + fp_dbg ("param = %04x, value = %04x", param, value); - /* Prepare data for sending */ - data[6] = byte(0, param); - data[7] = byte(1, param); - data[8] = byte(0, value); - data[9] = byte(1, value); + /* Prepare data for sending */ + data[6] = byte (0, param); + data[7] = byte (1, param); + data[8] = byte (0, value); + data[9] = byte (1, value); - /* Run swap sequential state machine */ - m_swap(ssm, dev, data, 0x0a); + /* Run swap sequential state machine */ + m_swap (ssm, dev, data, 0x0a); } /* Abort previous print */ static void -vfs_abort_print(FpiSsm *ssm, - FpImageDevice *dev) +vfs_abort_print (FpiSsm *ssm, + FpImageDevice *dev) { - unsigned char data[0x06] = { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00 }; + unsigned char data[0x06] = { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00 }; - G_DEBUG_HERE(); + G_DEBUG_HERE (); - /* Run swap sequential state machine */ - m_swap (ssm, dev, data, 0x06); + /* Run swap sequential state machine */ + m_swap (ssm, dev, data, 0x06); } /* Poke a value on a region */ static void -vfs_poke(FpiSsm *ssm, - FpImageDevice *dev, - unsigned int addr, - unsigned int value, - unsigned int size) +vfs_poke (FpiSsm *ssm, + FpImageDevice *dev, + unsigned int addr, + unsigned int value, + unsigned int size) { - unsigned char data[0x0f] = { 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + unsigned char data[0x0f] = { 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - fp_dbg("addr = %04x, value = %04x", addr, value); + fp_dbg ("addr = %04x, value = %04x", addr, value); - /* Prepare data for sending */ - data[6] = byte(0, addr); - data[7] = byte(1, addr); - data[8] = byte(2, addr); - data[9] = byte(3, addr); - data[10] = byte(0, value); - data[11] = byte(1, value); - data[12] = byte(2, value); - data[13] = byte(3, value); - data[14] = byte(0, size); + /* Prepare data for sending */ + data[6] = byte (0, addr); + data[7] = byte (1, addr); + data[8] = byte (2, addr); + data[9] = byte (3, addr); + data[10] = byte (0, value); + data[11] = byte (1, value); + data[12] = byte (2, value); + data[13] = byte (3, value); + data[14] = byte (0, size); - /* Run swap sequential state machine */ - m_swap(ssm, dev, data, 0x0f); + /* Run swap sequential state machine */ + m_swap (ssm, dev, data, 0x0f); } /* Get current finger state */ static void -vfs_get_finger_state(FpiSsm *ssm, - FpImageDevice *dev) +vfs_get_finger_state (FpiSsm *ssm, + FpImageDevice *dev) { - unsigned char data[0x06] = { 0x00, 0x00, 0x00, 0x00, 0x16, 0x00 }; + unsigned char data[0x06] = { 0x00, 0x00, 0x00, 0x00, 0x16, 0x00 }; - G_DEBUG_HERE(); + G_DEBUG_HERE (); - /* Run swap sequential state machine */ - m_swap (ssm, dev, data, 0x06); + /* Run swap sequential state machine */ + m_swap (ssm, dev, data, 0x06); } /* Load raw image from reader */ static void -vfs_img_load(FpiSsm *ssm, - FpImageDevice *dev) +vfs_img_load (FpiSsm *ssm, + FpImageDevice *dev) { - FpDeviceVfs101 *self = FPI_DEVICE_VFS101(dev); + FpDeviceVfs101 *self = FPI_DEVICE_VFS101 (dev); - G_DEBUG_HERE(); + G_DEBUG_HERE (); - /* Reset buffer length */ - self->length = 0; + /* Reset buffer length */ + self->length = 0; - /* Reset image properties */ - self->bottom = 0; - self->height = -1; + /* Reset image properties */ + self->bottom = 0; + self->height = -1; - /* Asynchronous load */ - async_load(ssm, dev); + /* Asynchronous load */ + async_load (ssm, dev); } -#define offset(x, y) ((x) + ((y) * VFS_FRAME_SIZE)) +#define offset(x, y) ((x) + ((y) * VFS_FRAME_SIZE)) /* Screen image to remove noise and find bottom line and height of image */ -static void img_screen(FpDeviceVfs101 *vdev) +static void +img_screen (FpDeviceVfs101 *vdev) { - int y, x, count, top; - long int level; - int last_line = vdev->height - 1; + int y, x, count, top; + long int level; + int last_line = vdev->height - 1; - fp_dbg("image height before screen = %d", vdev->height); + fp_dbg ("image height before screen = %d", vdev->height); - count = 0; + count = 0; - /* Image returned from sensor can contain many empty lines, - * for remove these lines compare byte 282-283 (scan level information) - * with two different thresholds, one for the begin of finger image and - * one for the end. To increase stability of the code use a counter - * of lines that satisfy the threshold. - */ - for (y = last_line, top = last_line; y >= 0; y--) - { - /* Take image scan level */ - level = vdev->buffer[offset(283, y)] * 256 + - vdev->buffer[offset(282, y)]; + /* Image returned from sensor can contain many empty lines, + * for remove these lines compare byte 282-283 (scan level information) + * with two different thresholds, one for the begin of finger image and + * one for the end. To increase stability of the code use a counter + * of lines that satisfy the threshold. + */ + for (y = last_line, top = last_line; y >= 0; y--) + { + /* Take image scan level */ + level = vdev->buffer[offset (283, y)] * 256 + + vdev->buffer[offset (282, y)]; - fp_dbg("line = %d, scan level = %ld", y, level); + fp_dbg ("line = %d, scan level = %ld", y, level); - if (level >= VFS_IMG_SLT_BEGIN && top == last_line) - { - /* Begin threshold satisfied */ - if (count < VFS_IMG_SLT_LINES) - /* Increase count */ - count++; - else - { - /* Found top fingerprint line */ - top = y + VFS_IMG_SLT_LINES; - count = 0; - } - } - else if ((level < VFS_IMG_SLT_END || level >= 65535) && - top != last_line) - { - /* End threshold satisfied */ - if (count < VFS_IMG_SLT_LINES) - /* Increase count */ - count++; - else - { - /* Found bottom fingerprint line */ - vdev->bottom = y + VFS_IMG_SLT_LINES + 1; - break; - } - } - else - /* Not threshold satisfied, reset count */ - count = 0; - } + if (level >= VFS_IMG_SLT_BEGIN && top == last_line) + { + /* Begin threshold satisfied */ + if (count < VFS_IMG_SLT_LINES) + { + /* Increase count */ + count++; + } + else + { + /* Found top fingerprint line */ + top = y + VFS_IMG_SLT_LINES; + count = 0; + } + } + else if ((level < VFS_IMG_SLT_END || level >= 65535) && + top != last_line) + { + /* End threshold satisfied */ + if (count < VFS_IMG_SLT_LINES) + { + /* Increase count */ + count++; + } + else + { + /* Found bottom fingerprint line */ + vdev->bottom = y + VFS_IMG_SLT_LINES + 1; + break; + } + } + else + { + /* Not threshold satisfied, reset count */ + count = 0; + } + } - vdev->height = top - vdev->bottom + 1; + vdev->height = top - vdev->bottom + 1; - /* Check max height */ - if (vdev->height > VFS_IMG_MAX_HEIGHT) - vdev->height = VFS_IMG_MAX_HEIGHT; + /* Check max height */ + if (vdev->height > VFS_IMG_MAX_HEIGHT) + vdev->height = VFS_IMG_MAX_HEIGHT; - fp_dbg("image height after screen = %d", vdev->height); + fp_dbg ("image height after screen = %d", vdev->height); - /* Scan image and remove noise */ - for (y = vdev->bottom; y <= top; y++) - for (x = 6; x < VFS_IMG_WIDTH + 6; x++) - if (vdev->buffer[offset(x, y)] > VFS_IMG_MIN_IMAGE_LEVEL) - vdev->buffer[offset(x, y)] = 255; + /* Scan image and remove noise */ + for (y = vdev->bottom; y <= top; y++) + for (x = 6; x < VFS_IMG_WIDTH + 6; x++) + if (vdev->buffer[offset (x, y)] > VFS_IMG_MIN_IMAGE_LEVEL) + vdev->buffer[offset (x, y)] = 255; }; /* Copy image from reader buffer and put it into image data */ -static void img_copy(FpDeviceVfs101 *self, FpImage *img) +static void +img_copy (FpDeviceVfs101 *self, FpImage *img) { - unsigned int line; - unsigned char *img_buffer = img->data; - unsigned char *vdev_buffer = self->buffer + (self->bottom * VFS_FRAME_SIZE) + 6; + unsigned int line; + unsigned char *img_buffer = img->data; + unsigned char *vdev_buffer = self->buffer + (self->bottom * VFS_FRAME_SIZE) + 6; - for (line = 0; line < img->height; line++) - { - /* Copy image line from reader buffer to image data */ - memcpy(img_buffer, vdev_buffer, VFS_IMG_WIDTH); + for (line = 0; line < img->height; line++) + { + /* Copy image line from reader buffer to image data */ + memcpy (img_buffer, vdev_buffer, VFS_IMG_WIDTH); - /* Next line of reader buffer */ - vdev_buffer = vdev_buffer + VFS_FRAME_SIZE; + /* Next line of reader buffer */ + vdev_buffer = vdev_buffer + VFS_FRAME_SIZE; - /* Next line of image buffer */ - img_buffer = img_buffer + VFS_IMG_WIDTH; - } + /* Next line of image buffer */ + img_buffer = img_buffer + VFS_IMG_WIDTH; + } } /* Extract fingerpint image from raw data */ static void -img_extract(FpiSsm *ssm, - FpImageDevice *dev) +img_extract (FpiSsm *ssm, + FpImageDevice *dev) { - FpDeviceVfs101 *self = FPI_DEVICE_VFS101(dev); - FpImage *img; + FpDeviceVfs101 *self = FPI_DEVICE_VFS101 (dev); + FpImage *img; - /* Screen image to remove noise and find top and bottom line */ - img_screen(self); + /* Screen image to remove noise and find top and bottom line */ + img_screen (self); - /* Check image height */ - if (self->height < VFS_IMG_MIN_HEIGHT) - { - /* Image too short */ - self->height = 0; - fpi_image_device_retry_scan (dev, FP_DEVICE_RETRY_TOO_SHORT); - return; - } + /* Check image height */ + if (self->height < VFS_IMG_MIN_HEIGHT) + { + /* Image too short */ + self->height = 0; + fpi_image_device_retry_scan (dev, FP_DEVICE_RETRY_TOO_SHORT); + return; + } - /* Create new image */ - img = fp_image_new(self->height, VFS_IMG_WIDTH); - img->width = VFS_IMG_WIDTH; - img->height = self->height; - img->flags = FPI_IMAGE_V_FLIPPED; + /* Create new image */ + img = fp_image_new (self->height, VFS_IMG_WIDTH); + img->width = VFS_IMG_WIDTH; + img->height = self->height; + img->flags = FPI_IMAGE_V_FLIPPED; - /* Copy data into image */ - img_copy(self, img); + /* Copy data into image */ + img_copy (self, img); - /* Notify image captured */ - fpi_image_device_image_captured(dev, img); + /* Notify image captured */ + fpi_image_device_image_captured (dev, img); }; /* Finger states */ -enum -{ - VFS_FINGER_EMPTY, - VFS_FINGER_PRESENT, - VFS_FINGER_UNKNOWN, +enum { + VFS_FINGER_EMPTY, + VFS_FINGER_PRESENT, + VFS_FINGER_UNKNOWN, }; /* Return finger state */ -static inline int vfs_finger_state(FpDeviceVfs101 *vdev) +static inline int +vfs_finger_state (FpDeviceVfs101 *vdev) { - /* Check finger state */ - switch (vdev->buffer[0x0a]) - { - case 0x00: - case 0x01: - /* Finger is empty */ - return VFS_FINGER_EMPTY; - break; + /* Check finger state */ + switch (vdev->buffer[0x0a]) + { + case 0x00: + case 0x01: + /* Finger is empty */ + return VFS_FINGER_EMPTY; + break; - case 0x02: - case 0x03: - case 0x04: - case 0x05: - case 0x06: - /* Finger is present */ - return VFS_FINGER_PRESENT; - break; + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + /* Finger is present */ + return VFS_FINGER_PRESENT; + break; - default: - return VFS_FINGER_UNKNOWN; - } + default: + return VFS_FINGER_UNKNOWN; + } }; /* Check contrast of image */ -static void vfs_check_contrast(FpDeviceVfs101 *vdev) +static void +vfs_check_contrast (FpDeviceVfs101 *vdev) { - int y; - long int count = 0; + int y; + long int count = 0; - /* Check difference from byte 4 to byte 5 for verify contrast of image */ - for (y = 0; y < vdev->height; y++) - count = count + vdev->buffer[offset(5, y)] - vdev->buffer[offset(4, y)]; - count = count / vdev->height; + /* Check difference from byte 4 to byte 5 for verify contrast of image */ + for (y = 0; y < vdev->height; y++) + count = count + vdev->buffer[offset (5, y)] - vdev->buffer[offset (4, y)]; + count = count / vdev->height; - if (count < 16) - { - /* Contrast not valid, retry */ - vdev->contrast++; - return; - } + if (count < 16) + { + /* Contrast not valid, retry */ + vdev->contrast++; + return; + } - fp_dbg("contrast = %d, level = %ld", vdev->contrast, count); + fp_dbg ("contrast = %d, level = %ld", vdev->contrast, count); - if (labs(count - VFS_IMG_BEST_CONTRAST) < abs(vdev->best_clevel - VFS_IMG_BEST_CONTRAST)) - { - /* Better contrast found, use it */ - vdev->best_contrast = vdev->contrast; - vdev->best_clevel = count; - } + if (labs (count - VFS_IMG_BEST_CONTRAST) < abs (vdev->best_clevel - VFS_IMG_BEST_CONTRAST)) + { + /* Better contrast found, use it */ + vdev->best_contrast = vdev->contrast; + vdev->best_clevel = count; + } } /* Loop ssm states */ -enum -{ - /* Step 0 - Scan finger */ - M_LOOP_0_GET_PRINT, - M_LOOP_0_SLEEP, - M_LOOP_0_GET_STATE, - M_LOOP_0_LOAD_IMAGE, - M_LOOP_0_EXTRACT_IMAGE, - M_LOOP_0_CHECK_ACTION, +enum { + /* Step 0 - Scan finger */ + M_LOOP_0_GET_PRINT, + M_LOOP_0_SLEEP, + M_LOOP_0_GET_STATE, + M_LOOP_0_LOAD_IMAGE, + M_LOOP_0_EXTRACT_IMAGE, + M_LOOP_0_CHECK_ACTION, - /* Step 1 - Scan failed */ - M_LOOP_1_GET_STATE, - M_LOOP_1_CHECK_STATE, - M_LOOP_1_GET_PRINT, - M_LOOP_1_LOAD_IMAGE, - M_LOOP_1_LOOP, - M_LOOP_1_SLEEP, + /* Step 1 - Scan failed */ + M_LOOP_1_GET_STATE, + M_LOOP_1_CHECK_STATE, + M_LOOP_1_GET_PRINT, + M_LOOP_1_LOAD_IMAGE, + M_LOOP_1_LOOP, + M_LOOP_1_SLEEP, - /* Step 2 - Abort print */ - M_LOOP_2_ABORT_PRINT, - M_LOOP_2_LOAD_IMAGE, + /* Step 2 - Abort print */ + M_LOOP_2_ABORT_PRINT, + M_LOOP_2_LOAD_IMAGE, - /* Step 3 - Wait aborting */ - M_LOOP_3_GET_PRINT, - M_LOOP_3_LOAD_IMAGE, - M_LOOP_3_CHECK_IMAGE, - M_LOOP_3_LOOP, + /* Step 3 - Wait aborting */ + M_LOOP_3_GET_PRINT, + M_LOOP_3_LOAD_IMAGE, + M_LOOP_3_CHECK_IMAGE, + M_LOOP_3_LOOP, - /* Number of states */ - M_LOOP_NUM_STATES, + /* Number of states */ + M_LOOP_NUM_STATES, }; /* Exec loop sequential state machine */ -static void m_loop_state(FpiSsm *ssm, FpDevice *_dev, void *user_data) +static void +m_loop_state (FpiSsm *ssm, FpDevice *_dev, void *user_data) { - FpImageDevice *dev = user_data; - FpDeviceVfs101 *self = FPI_DEVICE_VFS101(_dev); + FpImageDevice *dev = user_data; + FpDeviceVfs101 *self = FPI_DEVICE_VFS101 (_dev); - /* Complete if deactivation was requested */ - if (self->deactivate) { - fpi_ssm_mark_completed(ssm); - return; - } + /* Complete if deactivation was requested */ + if (self->deactivate) + { + fpi_ssm_mark_completed (ssm); + return; + } - switch (fpi_ssm_get_cur_state(ssm)) - { - case M_LOOP_0_GET_PRINT: - /* Send get print command to the reader */ - vfs_get_print(ssm, dev, VFS_BUFFER_HEIGHT, 1); - break; + switch (fpi_ssm_get_cur_state (ssm)) + { + case M_LOOP_0_GET_PRINT: + /* Send get print command to the reader */ + vfs_get_print (ssm, dev, VFS_BUFFER_HEIGHT, 1); + break; - case M_LOOP_0_SLEEP: - /* Wait fingerprint scanning */ - async_sleep(50, ssm, dev); - break; + case M_LOOP_0_SLEEP: + /* Wait fingerprint scanning */ + async_sleep (50, ssm, dev); + break; - case M_LOOP_0_GET_STATE: - /* Get finger state */ - vfs_get_finger_state(ssm, dev); - break; + case M_LOOP_0_GET_STATE: + /* Get finger state */ + vfs_get_finger_state (ssm, dev); + break; - case M_LOOP_0_LOAD_IMAGE: - /* Check finger state */ - switch (vfs_finger_state(self)) - { - case VFS_FINGER_EMPTY: - fpi_image_device_report_finger_status(dev, FALSE); + case M_LOOP_0_LOAD_IMAGE: + /* Check finger state */ + switch (vfs_finger_state (self)) + { + case VFS_FINGER_EMPTY: + fpi_image_device_report_finger_status (dev, FALSE); - /* Finger isn't present, loop */ - fpi_ssm_jump_to_state(ssm, M_LOOP_0_SLEEP); - break; + /* Finger isn't present, loop */ + fpi_ssm_jump_to_state (ssm, M_LOOP_0_SLEEP); + break; - case VFS_FINGER_PRESENT: - fpi_image_device_report_finger_status(dev, TRUE); + case VFS_FINGER_PRESENT: + fpi_image_device_report_finger_status (dev, TRUE); - /* Load image from reader */ - self->ignore_error = TRUE; - vfs_img_load(ssm, dev); - break; + /* Load image from reader */ + self->ignore_error = TRUE; + vfs_img_load (ssm, dev); + break; - default: - fpi_image_device_report_finger_status(dev, FALSE); + default: + fpi_image_device_report_finger_status (dev, FALSE); - /* Unknown state */ - fp_err("unknown device state 0x%02x", - self->buffer[0x0a]); - fpi_ssm_mark_failed(ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); - break; - } - break; + /* Unknown state */ + fp_err ("unknown device state 0x%02x", + self->buffer[0x0a]); + fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + break; + } + break; - case M_LOOP_0_EXTRACT_IMAGE: - /* Fingerprint is loaded, extract image from raw data */ - img_extract(ssm, dev); + case M_LOOP_0_EXTRACT_IMAGE: + /* Fingerprint is loaded, extract image from raw data */ + img_extract (ssm, dev); - /* Wait handling image */ - async_sleep(10, ssm, dev); - break; + /* Wait handling image */ + async_sleep (10, ssm, dev); + break; - case M_LOOP_0_CHECK_ACTION: - /* Action not completed */ - if (self->height > 0) - /* Continue loop */ - fpi_ssm_jump_to_state(ssm, M_LOOP_2_ABORT_PRINT); - else - /* Error found */ - fpi_ssm_next_state(ssm); - break; + case M_LOOP_0_CHECK_ACTION: + /* Action not completed */ + if (self->height > 0) + /* Continue loop */ + fpi_ssm_jump_to_state (ssm, M_LOOP_2_ABORT_PRINT); + else + /* Error found */ + fpi_ssm_next_state (ssm); + break; - case M_LOOP_1_GET_STATE: - /* Get finger state */ - vfs_get_finger_state(ssm, dev); - break; + case M_LOOP_1_GET_STATE: + /* Get finger state */ + vfs_get_finger_state (ssm, dev); + break; - case M_LOOP_1_CHECK_STATE: - /* Check finger state */ - if (vfs_finger_state(self) == VFS_FINGER_PRESENT) - { - fpi_image_device_report_finger_status(dev, TRUE); - async_sleep(250, ssm, dev); - } - else - { - /* Finger not present */ - fpi_image_device_report_finger_status(dev, FALSE); + case M_LOOP_1_CHECK_STATE: + /* Check finger state */ + if (vfs_finger_state (self) == VFS_FINGER_PRESENT) + { + fpi_image_device_report_finger_status (dev, TRUE); + async_sleep (250, ssm, dev); + } + else + { + /* Finger not present */ + fpi_image_device_report_finger_status (dev, FALSE); - /* Continue */ - fpi_ssm_jump_to_state(ssm, M_LOOP_1_SLEEP); - } - break; + /* Continue */ + fpi_ssm_jump_to_state (ssm, M_LOOP_1_SLEEP); + } + break; - case M_LOOP_1_GET_PRINT: - /* Send get print command to the reader */ - vfs_get_print(ssm, dev, VFS_BUFFER_HEIGHT, 1); - break; + case M_LOOP_1_GET_PRINT: + /* Send get print command to the reader */ + vfs_get_print (ssm, dev, VFS_BUFFER_HEIGHT, 1); + break; - case M_LOOP_1_LOAD_IMAGE: - /* Load image */ - self->ignore_error = TRUE; - vfs_img_load(ssm, dev); - break; + case M_LOOP_1_LOAD_IMAGE: + /* Load image */ + self->ignore_error = TRUE; + vfs_img_load (ssm, dev); + break; - case M_LOOP_1_LOOP: - /* Loop */ - fpi_ssm_jump_to_state(ssm, M_LOOP_1_GET_STATE); - break; + case M_LOOP_1_LOOP: + /* Loop */ + fpi_ssm_jump_to_state (ssm, M_LOOP_1_GET_STATE); + break; - case M_LOOP_1_SLEEP: - /* Wait fingerprint scanning */ - async_sleep(10, ssm, dev); - break; + case M_LOOP_1_SLEEP: + /* Wait fingerprint scanning */ + async_sleep (10, ssm, dev); + break; - case M_LOOP_2_ABORT_PRINT: - /* Abort print command */ - vfs_abort_print(ssm, dev); - break; + case M_LOOP_2_ABORT_PRINT: + /* Abort print command */ + vfs_abort_print (ssm, dev); + break; - case M_LOOP_2_LOAD_IMAGE: - /* Load abort image */ - self->ignore_error = TRUE; - vfs_img_load(ssm, dev); - break; + case M_LOOP_2_LOAD_IMAGE: + /* Load abort image */ + self->ignore_error = TRUE; + vfs_img_load (ssm, dev); + break; - case M_LOOP_3_GET_PRINT: - /* Get empty image */ - vfs_get_print(ssm, dev, 0x000a, 0); - break; + case M_LOOP_3_GET_PRINT: + /* Get empty image */ + vfs_get_print (ssm, dev, 0x000a, 0); + break; - case M_LOOP_3_LOAD_IMAGE: - /* Load abort image */ - self->ignore_error = TRUE; - vfs_img_load(ssm, dev); - break; + case M_LOOP_3_LOAD_IMAGE: + /* Load abort image */ + self->ignore_error = TRUE; + vfs_img_load (ssm, dev); + break; - case M_LOOP_3_CHECK_IMAGE: - if (self->height == 10) - { - /* Image load correctly, jump to step 0 */ - self->counter = 0; - fpi_ssm_jump_to_state(ssm, M_LOOP_0_GET_PRINT); - } - else if (self->counter < 10) - { - /* Wait aborting */ - self->counter++; - async_sleep(100, ssm, dev); - } - else - { - /* reach max loop counter, return protocol error */ - fp_err("waiting abort reach max loop counter"); - fpi_ssm_mark_failed(ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); - } - break; + case M_LOOP_3_CHECK_IMAGE: + if (self->height == 10) + { + /* Image load correctly, jump to step 0 */ + self->counter = 0; + fpi_ssm_jump_to_state (ssm, M_LOOP_0_GET_PRINT); + } + else if (self->counter < 10) + { + /* Wait aborting */ + self->counter++; + async_sleep (100, ssm, dev); + } + else + { + /* reach max loop counter, return protocol error */ + fp_err ("waiting abort reach max loop counter"); + fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + } + break; - case M_LOOP_3_LOOP: - /* Loop */ - fpi_ssm_jump_to_state(ssm, M_LOOP_3_GET_PRINT); - break; - } + case M_LOOP_3_LOOP: + /* Loop */ + fpi_ssm_jump_to_state (ssm, M_LOOP_3_GET_PRINT); + break; + } } /* Complete loop sequential state machine */ -static void m_loop_complete(FpiSsm *ssm, FpDevice *dev, void *user_data, - GError *error) +static void +m_loop_complete (FpiSsm *ssm, FpDevice *dev, void *user_data, + GError *error) { - FpDeviceVfs101 *self = FPI_DEVICE_VFS101 (dev); + FpDeviceVfs101 *self = FPI_DEVICE_VFS101 (dev); - /* When the loop completes, we have (successfully) deactivated */ - if (self->active) - fpi_image_device_deactivate_complete (FP_IMAGE_DEVICE (dev), - error); + /* When the loop completes, we have (successfully) deactivated */ + if (self->active) + fpi_image_device_deactivate_complete (FP_IMAGE_DEVICE (dev), + error); - self->active = FALSE; + self->active = FALSE; - fpi_ssm_free(ssm); + fpi_ssm_free (ssm); } /* Init ssm states */ -enum -{ - /* Step 0 - Cleanup device buffer */ - M_INIT_0_RECV_DIRTY, - M_INIT_0_ABORT_PRINT, - M_INIT_0_LOAD_IMAGE, +enum { + /* Step 0 - Cleanup device buffer */ + M_INIT_0_RECV_DIRTY, + M_INIT_0_ABORT_PRINT, + M_INIT_0_LOAD_IMAGE, - /* Step 1 - Wait aborting */ - M_INIT_1_GET_PRINT, - M_INIT_1_LOAD_IMAGE, - M_INIT_1_CHECK_IMAGE, - M_INIT_1_LOOP, + /* Step 1 - Wait aborting */ + M_INIT_1_GET_PRINT, + M_INIT_1_LOAD_IMAGE, + M_INIT_1_CHECK_IMAGE, + M_INIT_1_LOOP, - /* Step 2 - Handle unexpected finger presence */ - M_INIT_2_GET_STATE, - M_INIT_2_CHECK_STATE, - M_INIT_2_GET_PRINT, - M_INIT_2_LOAD_IMAGE, - M_INIT_2_LOOP, + /* Step 2 - Handle unexpected finger presence */ + M_INIT_2_GET_STATE, + M_INIT_2_CHECK_STATE, + M_INIT_2_GET_PRINT, + M_INIT_2_LOAD_IMAGE, + M_INIT_2_LOOP, - /* Step 3 - Set parameters */ - M_INIT_3_SET_000E, - M_INIT_3_SET_0011, - M_INIT_3_SET_0076, - M_INIT_3_SET_0078, - M_INIT_3_SET_THRESHOLD, - M_INIT_3_SET_STATE3_COUNT, - M_INIT_3_SET_STATE5_COUNT, - M_INIT_3_SET_INFO_CONTRAST, - M_INIT_3_SET_INFO_RATE, + /* Step 3 - Set parameters */ + M_INIT_3_SET_000E, + M_INIT_3_SET_0011, + M_INIT_3_SET_0076, + M_INIT_3_SET_0078, + M_INIT_3_SET_THRESHOLD, + M_INIT_3_SET_STATE3_COUNT, + M_INIT_3_SET_STATE5_COUNT, + M_INIT_3_SET_INFO_CONTRAST, + M_INIT_3_SET_INFO_RATE, - /* Step 4 - Autocalibrate contrast */ - M_INIT_4_SET_EXPOSURE, - M_INIT_4_SET_CONTRAST, - M_INIT_4_GET_PRINT, - M_INIT_4_LOAD_IMAGE, - M_INIT_4_CHECK_CONTRAST, + /* Step 4 - Autocalibrate contrast */ + M_INIT_4_SET_EXPOSURE, + M_INIT_4_SET_CONTRAST, + M_INIT_4_GET_PRINT, + M_INIT_4_LOAD_IMAGE, + M_INIT_4_CHECK_CONTRAST, - /* Step 5 - Set info line parameters */ - M_INIT_5_SET_EXPOSURE, - M_INIT_5_SET_CONTRAST, - M_INIT_5_SET_INFO_CONTRAST, - M_INIT_5_SET_INFO_RATE, + /* Step 5 - Set info line parameters */ + M_INIT_5_SET_EXPOSURE, + M_INIT_5_SET_CONTRAST, + M_INIT_5_SET_INFO_CONTRAST, + M_INIT_5_SET_INFO_RATE, - /* Number of states */ - M_INIT_NUM_STATES, + /* Number of states */ + M_INIT_NUM_STATES, }; /* Exec init sequential state machine */ -static void m_init_state(FpiSsm *ssm, FpDevice *_dev, void *user_data) +static void +m_init_state (FpiSsm *ssm, FpDevice *_dev, void *user_data) { - FpImageDevice *dev = user_data; - FpDeviceVfs101 *self = FPI_DEVICE_VFS101(_dev); + FpImageDevice *dev = user_data; + FpDeviceVfs101 *self = FPI_DEVICE_VFS101 (_dev); - /* Mark as cancelled when activation collides with deactivation. */ - if (self->deactivate) { - fpi_ssm_mark_failed (ssm, - g_error_new (G_IO_ERROR, - G_IO_ERROR_CANCELLED, - "Initialisation was cancelled")); - return; - } + /* Mark as cancelled when activation collides with deactivation. */ + if (self->deactivate) + { + fpi_ssm_mark_failed (ssm, + g_error_new (G_IO_ERROR, + G_IO_ERROR_CANCELLED, + "Initialisation was cancelled")); + return; + } - switch (fpi_ssm_get_cur_state(ssm)) - { - case M_INIT_0_RECV_DIRTY: - /* Recv eventually dirty data */ - self->ignore_error = TRUE; - async_recv(ssm, dev); - break; + switch (fpi_ssm_get_cur_state (ssm)) + { + case M_INIT_0_RECV_DIRTY: + /* Recv eventually dirty data */ + self->ignore_error = TRUE; + async_recv (ssm, dev); + break; - case M_INIT_0_ABORT_PRINT: - /* Abort print command */ - vfs_abort_print(ssm, dev); - break; + case M_INIT_0_ABORT_PRINT: + /* Abort print command */ + vfs_abort_print (ssm, dev); + break; - case M_INIT_0_LOAD_IMAGE: - /* Load abort image */ - self->ignore_error = TRUE; - vfs_img_load(ssm, dev); - break; + case M_INIT_0_LOAD_IMAGE: + /* Load abort image */ + self->ignore_error = TRUE; + vfs_img_load (ssm, dev); + break; - case M_INIT_1_GET_PRINT: - /* Get empty image */ - vfs_get_print(ssm, dev, 0x000a, 0); - break; + case M_INIT_1_GET_PRINT: + /* Get empty image */ + vfs_get_print (ssm, dev, 0x000a, 0); + break; - case M_INIT_1_LOAD_IMAGE: - /* Load abort image */ - self->ignore_error = TRUE; - vfs_img_load(ssm, dev); - break; + case M_INIT_1_LOAD_IMAGE: + /* Load abort image */ + self->ignore_error = TRUE; + vfs_img_load (ssm, dev); + break; - case M_INIT_1_CHECK_IMAGE: - if (self->height == 10) - { - /* Image load correctly, jump to step 2 */ - self->counter = 0; - fpi_ssm_jump_to_state(ssm, M_INIT_2_GET_STATE); - } - else if (self->counter < 10) - { - /* Wait aborting */ - self->counter++; - async_sleep(100, ssm, dev); - } - else - { - /* reach max loop counter, return protocol error */ - fp_err("waiting abort reach max loop counter"); - fpi_ssm_mark_failed(ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); - } - break; + case M_INIT_1_CHECK_IMAGE: + if (self->height == 10) + { + /* Image load correctly, jump to step 2 */ + self->counter = 0; + fpi_ssm_jump_to_state (ssm, M_INIT_2_GET_STATE); + } + else if (self->counter < 10) + { + /* Wait aborting */ + self->counter++; + async_sleep (100, ssm, dev); + } + else + { + /* reach max loop counter, return protocol error */ + fp_err ("waiting abort reach max loop counter"); + fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO)); + } + break; - case M_INIT_1_LOOP: - /* Loop */ - fpi_ssm_jump_to_state(ssm, M_INIT_1_GET_PRINT); - break; + case M_INIT_1_LOOP: + /* Loop */ + fpi_ssm_jump_to_state (ssm, M_INIT_1_GET_PRINT); + break; - case M_INIT_2_GET_STATE: - /* Get finger state */ - vfs_get_finger_state(ssm, dev); - break; + case M_INIT_2_GET_STATE: + /* Get finger state */ + vfs_get_finger_state (ssm, dev); + break; - case M_INIT_2_CHECK_STATE: - /* Check finger state */ - if (vfs_finger_state(self) == VFS_FINGER_PRESENT) - { - /* Wait a bit for finger removal; if it doesn't happen, prompt */ - if (self->counter < 2) - { - /* Wait removing finger */ - self->counter++; - async_sleep(250, ssm, dev); - } - else - { - /* The user should remove their finger from the scanner */ - fp_warn("unexpected finger find, remove finger from the scanner"); - fpi_ssm_mark_failed(ssm, fpi_device_retry_new (FP_DEVICE_RETRY_REMOVE_FINGER)); - } - } - else - { - /* Finger not present */ - if (self->counter == 0) - /* Continue */ - fpi_ssm_jump_to_state(ssm, M_INIT_3_SET_000E); - else - { - /* Finger removed, jump to abort */ - self->counter = 0; - fpi_ssm_jump_to_state(ssm, M_INIT_0_ABORT_PRINT); - } - } - break; + case M_INIT_2_CHECK_STATE: + /* Check finger state */ + if (vfs_finger_state (self) == VFS_FINGER_PRESENT) + { + /* Wait a bit for finger removal; if it doesn't happen, prompt */ + if (self->counter < 2) + { + /* Wait removing finger */ + self->counter++; + async_sleep (250, ssm, dev); + } + else + { + /* The user should remove their finger from the scanner */ + fp_warn ("unexpected finger find, remove finger from the scanner"); + fpi_ssm_mark_failed (ssm, fpi_device_retry_new (FP_DEVICE_RETRY_REMOVE_FINGER)); + } + } + else + { + /* Finger not present */ + if (self->counter == 0) + { + /* Continue */ + fpi_ssm_jump_to_state (ssm, M_INIT_3_SET_000E); + } + else + { + /* Finger removed, jump to abort */ + self->counter = 0; + fpi_ssm_jump_to_state (ssm, M_INIT_0_ABORT_PRINT); + } + } + break; - case M_INIT_2_GET_PRINT: - /* Send get print command to the reader */ - vfs_get_print(ssm, dev, VFS_BUFFER_HEIGHT, 1); - break; + case M_INIT_2_GET_PRINT: + /* Send get print command to the reader */ + vfs_get_print (ssm, dev, VFS_BUFFER_HEIGHT, 1); + break; - case M_INIT_2_LOAD_IMAGE: - /* Load unexpected image */ - self->ignore_error = TRUE; - vfs_img_load(ssm, dev); - break; + case M_INIT_2_LOAD_IMAGE: + /* Load unexpected image */ + self->ignore_error = TRUE; + vfs_img_load (ssm, dev); + break; - case M_INIT_2_LOOP: - /* Loop */ - fpi_ssm_jump_to_state(ssm, M_INIT_2_GET_STATE); - break; + case M_INIT_2_LOOP: + /* Loop */ + fpi_ssm_jump_to_state (ssm, M_INIT_2_GET_STATE); + break; - case M_INIT_3_SET_000E: - /* Set param 0x000e, required for take image */ - vfs_set_param(ssm, dev, VFS_PAR_000E, VFS_VAL_000E); - break; + case M_INIT_3_SET_000E: + /* Set param 0x000e, required for take image */ + vfs_set_param (ssm, dev, VFS_PAR_000E, VFS_VAL_000E); + break; - case M_INIT_3_SET_0011: - /* Set param 0x0011, required for take image */ - vfs_set_param(ssm, dev, VFS_PAR_0011, VFS_VAL_0011); - break; + case M_INIT_3_SET_0011: + /* Set param 0x0011, required for take image */ + vfs_set_param (ssm, dev, VFS_PAR_0011, VFS_VAL_0011); + break; - case M_INIT_3_SET_0076: - /* Set param 0x0076, required for use info line */ - vfs_set_param(ssm, dev, VFS_PAR_0076, VFS_VAL_0076); - break; + case M_INIT_3_SET_0076: + /* Set param 0x0076, required for use info line */ + vfs_set_param (ssm, dev, VFS_PAR_0076, VFS_VAL_0076); + break; - case M_INIT_3_SET_0078: - /* Set param 0x0078, required for use info line */ - vfs_set_param(ssm, dev, VFS_PAR_0078, VFS_VAL_0078); - break; + case M_INIT_3_SET_0078: + /* Set param 0x0078, required for use info line */ + vfs_set_param (ssm, dev, VFS_PAR_0078, VFS_VAL_0078); + break; - case M_INIT_3_SET_THRESHOLD: - /* Set threshold */ - vfs_set_param(ssm, dev, VFS_PAR_THRESHOLD, VFS_VAL_THRESHOLD); - break; + case M_INIT_3_SET_THRESHOLD: + /* Set threshold */ + vfs_set_param (ssm, dev, VFS_PAR_THRESHOLD, VFS_VAL_THRESHOLD); + break; - case M_INIT_3_SET_STATE3_COUNT: - /* Set state 3 count */ - vfs_set_param(ssm, dev, VFS_PAR_STATE_3, VFS_VAL_STATE_3); - break; + case M_INIT_3_SET_STATE3_COUNT: + /* Set state 3 count */ + vfs_set_param (ssm, dev, VFS_PAR_STATE_3, VFS_VAL_STATE_3); + break; - case M_INIT_3_SET_STATE5_COUNT: - /* Set state 5 count */ - vfs_set_param(ssm, dev, VFS_PAR_STATE_5, VFS_VAL_STATE_5); - break; + case M_INIT_3_SET_STATE5_COUNT: + /* Set state 5 count */ + vfs_set_param (ssm, dev, VFS_PAR_STATE_5, VFS_VAL_STATE_5); + break; - case M_INIT_3_SET_INFO_CONTRAST: - /* Set info line contrast */ - vfs_set_param(ssm, dev, VFS_PAR_INFO_CONTRAST, 10); - break; + case M_INIT_3_SET_INFO_CONTRAST: + /* Set info line contrast */ + vfs_set_param (ssm, dev, VFS_PAR_INFO_CONTRAST, 10); + break; - case M_INIT_3_SET_INFO_RATE: - /* Set info line rate */ - vfs_set_param(ssm, dev, VFS_PAR_INFO_RATE, 32); - break; + case M_INIT_3_SET_INFO_RATE: + /* Set info line rate */ + vfs_set_param (ssm, dev, VFS_PAR_INFO_RATE, 32); + break; - case M_INIT_4_SET_EXPOSURE: - /* Set exposure level of reader */ - vfs_poke(ssm, dev, VFS_REG_IMG_EXPOSURE, 0x4000, 0x02); - self->counter = 1; - break; + case M_INIT_4_SET_EXPOSURE: + /* Set exposure level of reader */ + vfs_poke (ssm, dev, VFS_REG_IMG_EXPOSURE, 0x4000, 0x02); + self->counter = 1; + break; - case M_INIT_4_SET_CONTRAST: - /* Set contrast level of reader */ - vfs_poke(ssm, dev, VFS_REG_IMG_CONTRAST, self->contrast, 0x01); - break; + case M_INIT_4_SET_CONTRAST: + /* Set contrast level of reader */ + vfs_poke (ssm, dev, VFS_REG_IMG_CONTRAST, self->contrast, 0x01); + break; - case M_INIT_4_GET_PRINT: - /* Get empty image */ - vfs_get_print(ssm, dev, 0x000a, 0); - break; + case M_INIT_4_GET_PRINT: + /* Get empty image */ + vfs_get_print (ssm, dev, 0x000a, 0); + break; - case M_INIT_4_LOAD_IMAGE: - /* Load empty image */ - vfs_img_load(ssm, dev); - break; + case M_INIT_4_LOAD_IMAGE: + /* Load empty image */ + vfs_img_load (ssm, dev); + break; - case M_INIT_4_CHECK_CONTRAST: - /* Check contrast */ - vfs_check_contrast(self); + case M_INIT_4_CHECK_CONTRAST: + /* Check contrast */ + vfs_check_contrast (self); - if (self->contrast <= 6 || self->counter >= 12) - { - /* End contrast scan, continue */ - self->contrast = self->best_contrast; - self->counter = 0; - fp_dbg("use contrast value = %d", self->contrast); - fpi_ssm_next_state(ssm); - } - else - { - /* Continue contrast scan, loop */ - self->contrast--; - self->counter++; - fpi_ssm_jump_to_state(ssm, M_INIT_4_SET_CONTRAST); - } - break; + if (self->contrast <= 6 || self->counter >= 12) + { + /* End contrast scan, continue */ + self->contrast = self->best_contrast; + self->counter = 0; + fp_dbg ("use contrast value = %d", self->contrast); + fpi_ssm_next_state (ssm); + } + else + { + /* Continue contrast scan, loop */ + self->contrast--; + self->counter++; + fpi_ssm_jump_to_state (ssm, M_INIT_4_SET_CONTRAST); + } + break; - case M_INIT_5_SET_EXPOSURE: - /* Set exposure level of reader */ - vfs_poke(ssm, dev, VFS_REG_IMG_EXPOSURE, VFS_VAL_IMG_EXPOSURE, 0x02); - break; + case M_INIT_5_SET_EXPOSURE: + /* Set exposure level of reader */ + vfs_poke (ssm, dev, VFS_REG_IMG_EXPOSURE, VFS_VAL_IMG_EXPOSURE, 0x02); + break; - case M_INIT_5_SET_CONTRAST: - /* Set contrast level of reader */ - vfs_poke(ssm, dev, VFS_REG_IMG_CONTRAST, self->contrast, 0x01); - break; + case M_INIT_5_SET_CONTRAST: + /* Set contrast level of reader */ + vfs_poke (ssm, dev, VFS_REG_IMG_CONTRAST, self->contrast, 0x01); + break; - case M_INIT_5_SET_INFO_CONTRAST: - /* Set info line contrast */ - vfs_set_param(ssm, dev, VFS_PAR_INFO_CONTRAST, self->contrast); - break; + case M_INIT_5_SET_INFO_CONTRAST: + /* Set info line contrast */ + vfs_set_param (ssm, dev, VFS_PAR_INFO_CONTRAST, self->contrast); + break; - case M_INIT_5_SET_INFO_RATE: - /* Set info line rate */ - vfs_set_param(ssm, dev, VFS_PAR_INFO_RATE, VFS_VAL_INFO_RATE); - break; - } + case M_INIT_5_SET_INFO_RATE: + /* Set info line rate */ + vfs_set_param (ssm, dev, VFS_PAR_INFO_RATE, VFS_VAL_INFO_RATE); + break; + } } /* Complete init sequential state machine */ -static void m_init_complete(FpiSsm *ssm, FpDevice *_dev, void *user_data, - GError *error) +static void +m_init_complete (FpiSsm *ssm, FpDevice *_dev, void *user_data, + GError *error) { - FpImageDevice *dev = user_data; + FpImageDevice *dev = user_data; - /* Notify activate complete */ - fpi_image_device_activate_complete(dev, error); + /* Notify activate complete */ + fpi_image_device_activate_complete (dev, error); - if (!error) { - FpiSsm *ssm_loop; + if (!error) + { + FpiSsm *ssm_loop; - /* Start loop ssm */ - ssm_loop = fpi_ssm_new(FP_DEVICE(dev), m_loop_state, - M_LOOP_NUM_STATES, dev); - fpi_ssm_start(ssm_loop, m_loop_complete); - } + /* Start loop ssm */ + ssm_loop = fpi_ssm_new (FP_DEVICE (dev), m_loop_state, + M_LOOP_NUM_STATES, dev); + fpi_ssm_start (ssm_loop, m_loop_complete); + } - /* Free sequential state machine */ - fpi_ssm_free(ssm); + /* Free sequential state machine */ + fpi_ssm_free (ssm); } /* Activate device */ -static void dev_activate(FpImageDevice *dev) +static void +dev_activate (FpImageDevice *dev) { - FpDeviceVfs101 *self = FPI_DEVICE_VFS101(dev); - FpiSsm *ssm; + FpDeviceVfs101 *self = FPI_DEVICE_VFS101 (dev); + FpiSsm *ssm; - /* Check if already active */ - g_assert (!self->active); + /* Check if already active */ + g_assert (!self->active); - /* Set active state */ - self->active = TRUE; - self->deactivate = FALSE; + /* Set active state */ + self->active = TRUE; + self->deactivate = FALSE; - /* Set contrast */ - self->contrast = 15; - self->best_clevel = -1; + /* Set contrast */ + self->contrast = 15; + self->best_clevel = -1; - /* Reset loop counter */ - self->counter = 0; + /* Reset loop counter */ + self->counter = 0; - /* Start init ssm */ - ssm = fpi_ssm_new(FP_DEVICE(dev), m_init_state, M_INIT_NUM_STATES, dev); - fpi_ssm_start(ssm, m_init_complete); + /* Start init ssm */ + ssm = fpi_ssm_new (FP_DEVICE (dev), m_init_state, M_INIT_NUM_STATES, dev); + fpi_ssm_start (ssm, m_init_complete); } /* Deactivate device */ -static void dev_deactivate(FpImageDevice *dev) +static void +dev_deactivate (FpImageDevice *dev) { - FpDeviceVfs101 *self = FPI_DEVICE_VFS101(dev); + FpDeviceVfs101 *self = FPI_DEVICE_VFS101 (dev); - /* Device already deactivated, likely due to an error */ - if (!self->active) { - fpi_image_device_deactivate_complete (dev, NULL); - return; - } + /* Device already deactivated, likely due to an error */ + if (!self->active) + { + fpi_image_device_deactivate_complete (dev, NULL); + return; + } - /* Signal deactivation, deactivation will happen from the SSM - * completion handler. */ - self->deactivate = TRUE; + /* Signal deactivation, deactivation will happen from the SSM + * completion handler. */ + self->deactivate = TRUE; } /* Open device */ -static void dev_open(FpImageDevice *dev) +static void +dev_open (FpImageDevice *dev) { - FpDeviceVfs101 *self = FPI_DEVICE_VFS101(dev); - GError *error = NULL; + FpDeviceVfs101 *self = FPI_DEVICE_VFS101 (dev); + GError *error = NULL; - /* Claim usb interface */ - g_usb_device_claim_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), 0, 0, &error); + /* Claim usb interface */ + g_usb_device_claim_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), 0, 0, &error); - /* Initialize private structure */ - self->seqnum = -1; - self->buffer = g_malloc0 (VFS_BUFFER_SIZE); + /* Initialize private structure */ + self->seqnum = -1; + self->buffer = g_malloc0 (VFS_BUFFER_SIZE); - /* Notify open complete */ - fpi_image_device_open_complete(dev, error); + /* Notify open complete */ + fpi_image_device_open_complete (dev, error); } /* Close device */ -static void dev_close(FpImageDevice *dev) +static void +dev_close (FpImageDevice *dev) { - FpDeviceVfs101 *self = FPI_DEVICE_VFS101(dev); - GError *error = NULL; + FpDeviceVfs101 *self = FPI_DEVICE_VFS101 (dev); + GError *error = NULL; - /* Release usb interface */ - g_usb_device_release_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), - 0, 0, &error); + /* Release usb interface */ + g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), + 0, 0, &error); - g_clear_pointer (&self->buffer, g_free); + g_clear_pointer (&self->buffer, g_free); - /* Notify close complete */ - fpi_image_device_close_complete(dev, error); + /* Notify close complete */ + fpi_image_device_close_complete (dev, error); } /* Usb id table of device */ -static const FpIdEntry id_table [ ] = { - { .vid = 0x138a, .pid = 0x0001, }, - { .vid = 0, .pid = 0, .driver_data = 0 }, +static const FpIdEntry id_table[] = { + { .vid = 0x138a, .pid = 0x0001, }, + { .vid = 0, .pid = 0, .driver_data = 0 }, }; -static void fpi_device_vfs101_init(FpDeviceVfs101 *self) { +static void +fpi_device_vfs101_init (FpDeviceVfs101 *self) +{ } -static void fpi_device_vfs101_class_init(FpDeviceVfs101Class *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); - FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS(klass); +static void +fpi_device_vfs101_class_init (FpDeviceVfs101Class *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); + FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); - dev_class->id = "vfs101"; - dev_class->full_name = "Validity VFS101"; - dev_class->type = FP_DEVICE_TYPE_USB; - dev_class->id_table = id_table; - dev_class->scan_type = FP_SCAN_TYPE_SWIPE; + dev_class->id = "vfs101"; + dev_class->full_name = "Validity VFS101"; + dev_class->type = FP_DEVICE_TYPE_USB; + dev_class->id_table = id_table; + dev_class->scan_type = FP_SCAN_TYPE_SWIPE; - img_class->img_open = dev_open; - img_class->img_close = dev_close; - img_class->activate = dev_activate; - img_class->deactivate = dev_deactivate; + img_class->img_open = dev_open; + img_class->img_close = dev_close; + img_class->activate = dev_activate; + img_class->deactivate = dev_deactivate; - img_class->bz3_threshold = 24; + img_class->bz3_threshold = 24; - img_class->img_width = VFS_IMG_WIDTH; - img_class->img_height = -1; + img_class->img_width = VFS_IMG_WIDTH; + img_class->img_height = -1; } diff --git a/libfprint/drivers/vfs301.c b/libfprint/drivers/vfs301.c index 2339c2f..4d3dc30 100644 --- a/libfprint/drivers/vfs301.c +++ b/libfprint/drivers/vfs301.c @@ -30,249 +30,268 @@ G_DEFINE_TYPE (FpDeviceVfs301, fpi_device_vfs301, FP_TYPE_IMAGE_DEVICE) /* Submit asynchronous sleep */ static void -async_sleep(unsigned int msec, - FpiSsm *ssm, - FpImageDevice *dev) +async_sleep (unsigned int msec, + FpiSsm *ssm, + FpImageDevice *dev) { - /* Add timeout */ - fpi_device_add_timeout(FP_DEVICE(dev), msec, - fpi_ssm_next_state_timeout_cb, ssm); + /* Add timeout */ + fpi_device_add_timeout (FP_DEVICE (dev), msec, + fpi_ssm_next_state_timeout_cb, ssm); } static int -submit_image(FpiSsm *ssm, - FpImageDevice *dev) +submit_image (FpiSsm *ssm, + FpImageDevice *dev) { - FpDeviceVfs301 *self = FPI_DEVICE_VFS301(dev); - int height; - FpImage *img; + FpDeviceVfs301 *self = FPI_DEVICE_VFS301 (dev); + int height; + FpImage *img; #if 0 - /* XXX: This is probably handled by libfprint automagically? */ - if (vdev->scanline_count < 20) { - fpi_ssm_jump_to_state(ssm, M_REQUEST_PRINT); - return 0; - } + /* XXX: This is probably handled by libfprint automagically? */ + if (vdev->scanline_count < 20) + { + fpi_ssm_jump_to_state (ssm, M_REQUEST_PRINT); + return 0; + } #endif - img = fp_image_new(VFS301_FP_OUTPUT_WIDTH, self->scanline_count); - if (img == NULL) - return 0; + img = fp_image_new (VFS301_FP_OUTPUT_WIDTH, self->scanline_count); + if (img == NULL) + return 0; - vfs301_extract_image(self, img->data, &height); + vfs301_extract_image (self, img->data, &height); - /* TODO: how to detect flip? should the resulting image be - * oriented so that it is equal e.g. to a fingerprint on a paper, - * or to the finger when I look at it?) */ - img->flags = FPI_IMAGE_COLORS_INVERTED | FPI_IMAGE_V_FLIPPED; + /* TODO: how to detect flip? should the resulting image be + * oriented so that it is equal e.g. to a fingerprint on a paper, + * or to the finger when I look at it?) */ + img->flags = FPI_IMAGE_COLORS_INVERTED | FPI_IMAGE_V_FLIPPED; - /* The image buffer is larger at this point, but that does not - * matter. */ - img->width = VFS301_FP_OUTPUT_WIDTH; - img->height = height; + /* The image buffer is larger at this point, but that does not + * matter. */ + img->width = VFS301_FP_OUTPUT_WIDTH; + img->height = height; - fpi_image_device_image_captured(dev, img); + fpi_image_device_image_captured (dev, img); - return 1; + return 1; } /* Loop ssm states */ -enum -{ - /* Step 0 - Scan finger */ - M_REQUEST_PRINT, - M_WAIT_PRINT, - M_CHECK_PRINT, - M_READ_PRINT_START, - M_READ_PRINT_WAIT, - M_READ_PRINT_POLL, - M_SUBMIT_PRINT, +enum { + /* Step 0 - Scan finger */ + M_REQUEST_PRINT, + M_WAIT_PRINT, + M_CHECK_PRINT, + M_READ_PRINT_START, + M_READ_PRINT_WAIT, + M_READ_PRINT_POLL, + M_SUBMIT_PRINT, - /* Number of states */ - M_LOOP_NUM_STATES, + /* Number of states */ + M_LOOP_NUM_STATES, }; /* Exec loop sequential state machine */ -static void m_loop_state(FpiSsm *ssm, FpDevice *_dev, void *user_data) +static void +m_loop_state (FpiSsm *ssm, FpDevice *_dev, void *user_data) { - FpImageDevice *dev = user_data; - FpDeviceVfs301 *self = FPI_DEVICE_VFS301(_dev); + FpImageDevice *dev = user_data; + FpDeviceVfs301 *self = FPI_DEVICE_VFS301 (_dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case M_REQUEST_PRINT: - vfs301_proto_request_fingerprint(self); - fpi_ssm_next_state(ssm); - break; + switch (fpi_ssm_get_cur_state (ssm)) + { + case M_REQUEST_PRINT: + vfs301_proto_request_fingerprint (self); + fpi_ssm_next_state (ssm); + break; - case M_WAIT_PRINT: - /* Wait fingerprint scanning */ - async_sleep(200, ssm, dev); - break; + case M_WAIT_PRINT: + /* Wait fingerprint scanning */ + async_sleep (200, ssm, dev); + break; - case M_CHECK_PRINT: - if (!vfs301_proto_peek_event(self)) - fpi_ssm_jump_to_state(ssm, M_WAIT_PRINT); - else - fpi_ssm_next_state(ssm); - break; + case M_CHECK_PRINT: + if (!vfs301_proto_peek_event (self)) + fpi_ssm_jump_to_state (ssm, M_WAIT_PRINT); + else + fpi_ssm_next_state (ssm); + break; - case M_READ_PRINT_START: - fpi_image_device_report_finger_status(dev, TRUE); - vfs301_proto_process_event_start(self); - fpi_ssm_next_state(ssm); - break; + case M_READ_PRINT_START: + fpi_image_device_report_finger_status (dev, TRUE); + vfs301_proto_process_event_start (self); + fpi_ssm_next_state (ssm); + break; - case M_READ_PRINT_WAIT: - /* Wait fingerprint scanning */ - async_sleep(200, ssm, dev); - break; + case M_READ_PRINT_WAIT: + /* Wait fingerprint scanning */ + async_sleep (200, ssm, dev); + break; - case M_READ_PRINT_POLL: - { - int rv = vfs301_proto_process_event_poll(self); - g_assert(rv != VFS301_FAILURE); - if (rv == VFS301_ONGOING) - fpi_ssm_jump_to_state(ssm, M_READ_PRINT_WAIT); - else - fpi_ssm_next_state(ssm); - } - break; + case M_READ_PRINT_POLL: + { + int rv = vfs301_proto_process_event_poll (self); + g_assert (rv != VFS301_FAILURE); + if (rv == VFS301_ONGOING) + fpi_ssm_jump_to_state (ssm, M_READ_PRINT_WAIT); + else + fpi_ssm_next_state (ssm); + } + break; - case M_SUBMIT_PRINT: - if (submit_image(ssm, dev)) { - fpi_ssm_mark_completed(ssm); - /* NOTE: finger off is expected only after submitting image... */ - fpi_image_device_report_finger_status(dev, FALSE); - } else { - fpi_ssm_jump_to_state(ssm, M_REQUEST_PRINT); - } - break; - default: - g_assert_not_reached (); - } + case M_SUBMIT_PRINT: + if (submit_image (ssm, dev)) + { + fpi_ssm_mark_completed (ssm); + /* NOTE: finger off is expected only after submitting image... */ + fpi_image_device_report_finger_status (dev, FALSE); + } + else + { + fpi_ssm_jump_to_state (ssm, M_REQUEST_PRINT); + } + break; + + default: + g_assert_not_reached (); + } } /* Complete loop sequential state machine */ -static void m_loop_complete(FpiSsm *ssm, FpDevice *_dev, void *user_data, - GError *error) +static void +m_loop_complete (FpiSsm *ssm, FpDevice *_dev, void *user_data, + GError *error) { - if (error) { - g_warning ("State machine completed with an error: %s", error->message); - g_error_free (error); - } - /* Free sequential state machine */ - fpi_ssm_free(ssm); + if (error) + { + g_warning ("State machine completed with an error: %s", error->message); + g_error_free (error); + } + /* Free sequential state machine */ + fpi_ssm_free (ssm); } /* Exec init sequential state machine */ -static void m_init_state(FpiSsm *ssm, FpDevice *_dev, void *user_data) +static void +m_init_state (FpiSsm *ssm, FpDevice *_dev, void *user_data) { - FpDeviceVfs301 *self = FPI_DEVICE_VFS301(_dev); + FpDeviceVfs301 *self = FPI_DEVICE_VFS301 (_dev); - g_assert(fpi_ssm_get_cur_state(ssm) == 0); + g_assert (fpi_ssm_get_cur_state (ssm) == 0); - vfs301_proto_init(self); + vfs301_proto_init (self); - fpi_ssm_mark_completed(ssm); + fpi_ssm_mark_completed (ssm); } /* Complete init sequential state machine */ -static void m_init_complete(FpiSsm *ssm, FpDevice *dev, void *user_data, - GError *error) +static void +m_init_complete (FpiSsm *ssm, FpDevice *dev, void *user_data, + GError *error) { - FpiSsm *ssm_loop; + FpiSsm *ssm_loop; - fpi_image_device_activate_complete(FP_IMAGE_DEVICE (dev), error); - if (!error) { - /* Notify activate complete */ + fpi_image_device_activate_complete (FP_IMAGE_DEVICE (dev), error); + if (!error) + { + /* Notify activate complete */ - /* Start loop ssm */ - ssm_loop = fpi_ssm_new(dev, m_loop_state, - M_LOOP_NUM_STATES, dev); - fpi_ssm_start(ssm_loop, m_loop_complete); - } + /* Start loop ssm */ + ssm_loop = fpi_ssm_new (dev, m_loop_state, + M_LOOP_NUM_STATES, dev); + fpi_ssm_start (ssm_loop, m_loop_complete); + } - /* Free sequential state machine */ - fpi_ssm_free(ssm); + /* Free sequential state machine */ + fpi_ssm_free (ssm); } /* Activate device */ -static void dev_activate(FpImageDevice *dev) +static void +dev_activate (FpImageDevice *dev) { - FpiSsm *ssm; + FpiSsm *ssm; - /* Start init ssm */ - ssm = fpi_ssm_new(FP_DEVICE(dev), m_init_state, 1, dev); - fpi_ssm_start(ssm, m_init_complete); + /* Start init ssm */ + ssm = fpi_ssm_new (FP_DEVICE (dev), m_init_state, 1, dev); + fpi_ssm_start (ssm, m_init_complete); } /* Deactivate device */ -static void dev_deactivate(FpImageDevice *dev) +static void +dev_deactivate (FpImageDevice *dev) { - FpDeviceVfs301 *self; + FpDeviceVfs301 *self; - self = FPI_DEVICE_VFS301(dev); - vfs301_proto_deinit(self); - fpi_image_device_deactivate_complete(dev, NULL); + self = FPI_DEVICE_VFS301 (dev); + vfs301_proto_deinit (self); + fpi_image_device_deactivate_complete (dev, NULL); } -static void dev_open(FpImageDevice *dev) +static void +dev_open (FpImageDevice *dev) { - FpDeviceVfs301 *self = FPI_DEVICE_VFS301(dev); - GError *error = NULL; + FpDeviceVfs301 *self = FPI_DEVICE_VFS301 (dev); + GError *error = NULL; - /* Claim usb interface */ - g_usb_device_claim_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), 0, 0, &error); + /* Claim usb interface */ + g_usb_device_claim_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), 0, 0, &error); - /* Initialize private structure */ - self->scanline_count = 0; + /* Initialize private structure */ + self->scanline_count = 0; - /* Notify open complete */ - fpi_image_device_open_complete(dev, error); + /* Notify open complete */ + fpi_image_device_open_complete (dev, error); } -static void dev_close(FpImageDevice *dev) +static void +dev_close (FpImageDevice *dev) { - FpDeviceVfs301 *self = FPI_DEVICE_VFS301(dev); - GError *error = NULL; + FpDeviceVfs301 *self = FPI_DEVICE_VFS301 (dev); + GError *error = NULL; - /* Release private structure */ - g_clear_pointer (&self->scanline_buf, g_free); + /* Release private structure */ + g_clear_pointer (&self->scanline_buf, g_free); - /* Release usb interface */ - g_usb_device_release_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), - 0, 0, &error); + /* Release usb interface */ + g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), + 0, 0, &error); - /* Notify close complete */ - fpi_image_device_close_complete(dev, error); + /* Notify close complete */ + fpi_image_device_close_complete (dev, error); } /* Usb id table of device */ -static const FpIdEntry id_table [ ] = { - { /* vfs301 */ .vid = 0x138a, .pid = 0x0005, }, - { /* vfs300 */ .vid = 0x138a, .pid = 0x0008, }, - { .vid = 0, .pid = 0, .driver_data = 0 }, +static const FpIdEntry id_table[] = { + { /* vfs301 */ .vid = 0x138a, .pid = 0x0005, }, + { /* vfs300 */ .vid = 0x138a, .pid = 0x0008, }, + { .vid = 0, .pid = 0, .driver_data = 0 }, }; -static void fpi_device_vfs301_init(FpDeviceVfs301 *self) { +static void +fpi_device_vfs301_init (FpDeviceVfs301 *self) +{ } -static void fpi_device_vfs301_class_init(FpDeviceVfs301Class *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); - FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS(klass); +static void +fpi_device_vfs301_class_init (FpDeviceVfs301Class *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); + FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); - dev_class->id = "vfs301"; - dev_class->full_name = "Validity VFS301"; - dev_class->type = FP_DEVICE_TYPE_USB; - dev_class->id_table = id_table; - dev_class->scan_type = FP_SCAN_TYPE_SWIPE; + dev_class->id = "vfs301"; + dev_class->full_name = "Validity VFS301"; + dev_class->type = FP_DEVICE_TYPE_USB; + dev_class->id_table = id_table; + dev_class->scan_type = FP_SCAN_TYPE_SWIPE; - img_class->img_open = dev_open; - img_class->img_close = dev_close; - img_class->activate = dev_activate; - img_class->deactivate = dev_deactivate; + img_class->img_open = dev_open; + img_class->img_close = dev_close; + img_class->activate = dev_activate; + img_class->deactivate = dev_deactivate; - img_class->bz3_threshold = 24; + img_class->bz3_threshold = 24; - img_class->img_width = VFS301_FP_WIDTH; - img_class->img_height = -1; + img_class->img_width = VFS301_FP_WIDTH; + img_class->img_height = -1; } diff --git a/libfprint/drivers/vfs301.h b/libfprint/drivers/vfs301.h index dfbbc7e..3ab23f9 100644 --- a/libfprint/drivers/vfs301.h +++ b/libfprint/drivers/vfs301.h @@ -25,113 +25,118 @@ #include "fpi-image-device.h" enum { - VFS301_DEFAULT_WAIT_TIMEOUT = 300, + VFS301_DEFAULT_WAIT_TIMEOUT = 300, - VFS301_SEND_ENDPOINT = 0x01, - VFS301_RECEIVE_ENDPOINT_CTRL = 0x81, - VFS301_RECEIVE_ENDPOINT_DATA = 0x82 + VFS301_SEND_ENDPOINT = 0x01, + VFS301_RECEIVE_ENDPOINT_CTRL = 0x81, + VFS301_RECEIVE_ENDPOINT_DATA = 0x82 }; #define VFS301_FP_RECV_LEN_1 (84032) #define VFS301_FP_RECV_LEN_2 (84096) -struct _FpDeviceVfs301 { - FpImageDevice parent; +struct _FpDeviceVfs301 +{ + FpImageDevice parent; - /* buffer to hold raw scanlines */ - unsigned char *scanline_buf; - int scanline_count; + /* buffer to hold raw scanlines */ + unsigned char *scanline_buf; + int scanline_count; - enum { - VFS301_ONGOING = 0, - VFS301_ENDED = 1, - VFS301_FAILURE = -1 - } recv_progress; - int recv_exp_amt; + enum { + VFS301_ONGOING = 0, + VFS301_ENDED = 1, + VFS301_FAILURE = -1 + } recv_progress; + int recv_exp_amt; }; G_DECLARE_FINAL_TYPE (FpDeviceVfs301, fpi_device_vfs301, FPI, DEVICE_VFS301, FpImageDevice) enum { - /* Width of the scanned data in px */ - VFS301_FP_WIDTH = 200, + /* Width of the scanned data in px */ + VFS301_FP_WIDTH = 200, - /* sizeof(fp_line_t) */ - VFS301_FP_FRAME_SIZE = 288, - /* Width of output line */ + /* sizeof(fp_line_t) */ + VFS301_FP_FRAME_SIZE = 288, + /* Width of output line */ #ifndef OUTPUT_RAW - VFS301_FP_OUTPUT_WIDTH = VFS301_FP_WIDTH, + VFS301_FP_OUTPUT_WIDTH = VFS301_FP_WIDTH, #else - VFS301_FP_OUTPUT_WIDTH = VFS301_FP_FRAME_SIZE, + VFS301_FP_OUTPUT_WIDTH = VFS301_FP_FRAME_SIZE, #endif - VFS301_FP_SUM_LINES = 3, + VFS301_FP_SUM_LINES = 3, #ifdef SCAN_FINISH_DETECTION - /* TODO: The following changes (seen ~60 and ~80) In that - * case we'll need to calibrate this from empty data somehow... */ - VFS301_FP_SUM_MEDIAN = 60, - VFS301_FP_SUM_EMPTY_RANGE = 5, + /* TODO: The following changes (seen ~60 and ~80) In that + * case we'll need to calibrate this from empty data somehow... */ + VFS301_FP_SUM_MEDIAN = 60, + VFS301_FP_SUM_EMPTY_RANGE = 5, #endif - /* Minimum average difference between returned lines */ - VFS301_FP_LINE_DIFF_THRESHOLD = 15, + /* Minimum average difference between returned lines */ + VFS301_FP_LINE_DIFF_THRESHOLD = 15, - /* Maximum waiting time for a single fingerprint frame */ - VFS301_FP_RECV_TIMEOUT = 2000 + /* Maximum waiting time for a single fingerprint frame */ + VFS301_FP_RECV_TIMEOUT = 2000 }; /* Arrays of this structure is returned during the initialization as a response * to the 0x02D0 messages. * It seems to be always the same - what is it for? Some kind of confirmation? */ -typedef struct { - unsigned char sync_0x01; - unsigned char sync_0xfe; +typedef struct +{ + unsigned char sync_0x01; + unsigned char sync_0xfe; - unsigned char counter_lo; - unsigned char counter_hi; /* FIXME ? */ + unsigned char counter_lo; + unsigned char counter_hi; /* FIXME ? */ - unsigned char flags[3]; + unsigned char flags[3]; - unsigned char sync_0x00; + unsigned char sync_0x00; - unsigned char scan[VFS301_FP_WIDTH]; + unsigned char scan[VFS301_FP_WIDTH]; } vfs301_init_line_t; -typedef struct { - unsigned char sync_0x01; - unsigned char sync_0xfe; +typedef struct +{ + unsigned char sync_0x01; + unsigned char sync_0xfe; - unsigned char counter_lo; - unsigned char counter_hi; + unsigned char counter_lo; + unsigned char counter_hi; - unsigned char sync_0x08[2]; /* XXX: always? 0x08 0x08 */ - /* 0x08 | 0x18 - Looks like 0x08 marks good quality lines */ - unsigned char flag_1; - unsigned char sync_0x00; + unsigned char sync_0x08[2]; /* XXX: always? 0x08 0x08 */ + /* 0x08 | 0x18 - Looks like 0x08 marks good quality lines */ + unsigned char flag_1; + unsigned char sync_0x00; - unsigned char scan[VFS301_FP_WIDTH]; + unsigned char scan[VFS301_FP_WIDTH]; - /* A offsetted, stretched, inverted copy of scan... probably could - * serve finger motion speed detection? - * Seems to be subdivided to some 10B + 53B + 1B blocks */ - unsigned char mirror[64]; + /* A offsetted, stretched, inverted copy of scan... probably could + * serve finger motion speed detection? + * Seems to be subdivided to some 10B + 53B + 1B blocks */ + unsigned char mirror[64]; - /* Some kind of sum of the scan, very low contrast */ - unsigned char sum1[2]; - unsigned char sum2[11]; - unsigned char sum3[3]; + /* Some kind of sum of the scan, very low contrast */ + unsigned char sum1[2]; + unsigned char sum2[11]; + unsigned char sum3[3]; } vfs301_line_t; -void vfs301_proto_init(FpDeviceVfs301 *dev); -void vfs301_proto_deinit(FpDeviceVfs301 *dev); +void vfs301_proto_init (FpDeviceVfs301 *dev); +void vfs301_proto_deinit (FpDeviceVfs301 *dev); -void vfs301_proto_request_fingerprint(FpDeviceVfs301 *dev); +void vfs301_proto_request_fingerprint (FpDeviceVfs301 *dev); /** returns 0 if no event is ready, or 1 if there is one... */ -int vfs301_proto_peek_event(FpDeviceVfs301 *dev); -void vfs301_proto_process_event_start(FpDeviceVfs301 *dev); -int vfs301_proto_process_event_poll(FpDeviceVfs301 *dev); +int vfs301_proto_peek_event (FpDeviceVfs301 *dev); +void vfs301_proto_process_event_start (FpDeviceVfs301 *dev); +int vfs301_proto_process_event_poll (FpDeviceVfs301 *dev); -void vfs301_extract_image(FpDeviceVfs301 *vfs, unsigned char *output, int *output_height); +void vfs301_extract_image (FpDeviceVfs301 *vfs, + unsigned char *output, + int *output_height); diff --git a/libfprint/drivers/vfs301_proto.c b/libfprint/drivers/vfs301_proto.c index 17129f1..5d02597 100644 --- a/libfprint/drivers/vfs301_proto.c +++ b/libfprint/drivers/vfs301_proto.c @@ -41,416 +41,453 @@ /************************** USB STUFF *****************************************/ #ifdef DEBUG -static void usb_print_packet(int dir, GError *error, const guint8 *data, int length) +static void +usb_print_packet (int dir, GError *error, const guint8 *data, int length) { - fprintf(stderr, "%s, error %s, len %d\n", dir ? "send" : "recv", error ? error->message : "-", length); + fprintf (stderr, "%s, error %s, len %d\n", dir ? "send" : "recv", error ? error->message : "-", length); #ifdef PRINT_VERBOSE - int i; + int i; - for (i = 0; i < MIN(length, 128); i++) { - fprintf(stderr, "%.2X ", data[i]); - if (i % 8 == 7) - fprintf(stderr, " "); - if (i % 32 == 31) - fprintf(stderr, "\n"); - } + for (i = 0; i < MIN (length, 128); i++) + { + fprintf (stderr, "%.2X ", data[i]); + if (i % 8 == 7) + fprintf (stderr, " "); + if (i % 32 == 31) + fprintf (stderr, "\n"); + } #endif - fprintf(stderr, "\n"); + fprintf (stderr, "\n"); } #endif -static void usb_recv(FpDeviceVfs301 *dev, guint8 endpoint, int max_bytes, FpiUsbTransfer **out, GError **error) +static void +usb_recv (FpDeviceVfs301 *dev, guint8 endpoint, int max_bytes, FpiUsbTransfer **out, GError **error) { - GError *err = NULL; - g_autoptr(FpiUsbTransfer) transfer = NULL; + GError *err = NULL; - /* XXX: This function swallows any transfer errors, that is obviously - * quite bad (it used to assert on no-error)! */ + g_autoptr(FpiUsbTransfer) transfer = NULL; - transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); - transfer->short_is_error = TRUE; - fpi_usb_transfer_fill_bulk (transfer, endpoint, max_bytes); + /* XXX: This function swallows any transfer errors, that is obviously + * quite bad (it used to assert on no-error)! */ - fpi_usb_transfer_submit_sync (transfer, VFS301_DEFAULT_WAIT_TIMEOUT, &err); + transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); + transfer->short_is_error = TRUE; + fpi_usb_transfer_fill_bulk (transfer, endpoint, max_bytes); + + fpi_usb_transfer_submit_sync (transfer, VFS301_DEFAULT_WAIT_TIMEOUT, &err); #ifdef DEBUG - usb_print_packet(0, err, transfer->buffer, transfer->actual_length); + usb_print_packet (0, err, transfer->buffer, transfer->actual_length); #endif - if (err) { - if (!error) - g_warning("Unhandled receive error: %s", err->message); - g_propagate_error (error, err); - } + if (err) + { + if (!error) + g_warning ("Unhandled receive error: %s", err->message); + g_propagate_error (error, err); + } - if (out) - *out = g_steal_pointer (&transfer); + if (out) + *out = g_steal_pointer (&transfer); } -static void usb_send(FpDeviceVfs301 *dev, const guint8 *data, gssize length, GError **error) +static void +usb_send (FpDeviceVfs301 *dev, const guint8 *data, gssize length, GError **error) { - GError *err = NULL; - g_autoptr(FpiUsbTransfer) transfer = NULL; + GError *err = NULL; - /* XXX: This function swallows any transfer errors, that is obviously - * quite bad (it used to assert on no-error)! */ + g_autoptr(FpiUsbTransfer) transfer = NULL; - transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); - transfer->short_is_error = TRUE; - fpi_usb_transfer_fill_bulk_full (transfer, VFS301_SEND_ENDPOINT, (guint8*) data, length, g_free); + /* XXX: This function swallows any transfer errors, that is obviously + * quite bad (it used to assert on no-error)! */ - fpi_usb_transfer_submit_sync (transfer, VFS301_DEFAULT_WAIT_TIMEOUT, &err); + transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); + transfer->short_is_error = TRUE; + fpi_usb_transfer_fill_bulk_full (transfer, VFS301_SEND_ENDPOINT, (guint8 *) data, length, g_free); + + fpi_usb_transfer_submit_sync (transfer, VFS301_DEFAULT_WAIT_TIMEOUT, &err); #ifdef DEBUG - usb_print_packet(1, err, data, length); + usb_print_packet (1, err, data, length); #endif - if (err) { - g_warning ("Error while sending data, continuing anyway: %s", err->message); - g_propagate_error (error, err); - } + if (err) + { + g_warning ("Error while sending data, continuing anyway: %s", err->message); + g_propagate_error (error, err); + } } /************************** OUT MESSAGES GENERATION ***************************/ -static guint8 * vfs301_proto_generate_0B(int subtype, gssize *len) +static guint8 * +vfs301_proto_generate_0B (int subtype, gssize *len) { - guint8 *res = g_malloc0 (39); - guint8 *data = res; + guint8 *res = g_malloc0 (39); + guint8 *data = res; - *data = 0x0B; - *len = 1; - data++; + *data = 0x0B; + *len = 1; + data++; - *len += 38; + *len += 38; - data[20] = subtype; + data[20] = subtype; - switch (subtype) { - case 0x04: - data[34] = 0x9F; - break; - case 0x05: - data[34] = 0xAB; - /* NOTE: There was a len++ here, which could never do anything */ - break; - default: - g_assert_not_reached(); - break; - } + switch (subtype) + { + case 0x04: + data[34] = 0x9F; + break; - return res; + case 0x05: + data[34] = 0xAB; + /* NOTE: There was a len++ here, which could never do anything */ + break; + + default: + g_assert_not_reached (); + break; + } + + return res; } #define HEX_TO_INT(c) \ - (((c) >= '0' && (c) <= '9') ? ((c) - '0') : ((c) - 'A' + 10)) + (((c) >= '0' && (c) <= '9') ? ((c) - '0') : ((c) - 'A' + 10)) -static guint8 * translate_str(const char **srcL, gssize *len) +static guint8 * +translate_str (const char **srcL, gssize *len) { - guint8 *res = NULL; - guint8 *dst; - const char **src_pos; - const char *src; - gssize src_len = 0; + guint8 *res = NULL; + guint8 *dst; + const char **src_pos; + const char *src; + gssize src_len = 0; - for (src_pos = srcL; *src_pos; src_pos++) { - gint tmp; + for (src_pos = srcL; *src_pos; src_pos++) + { + gint tmp; - src = *src_pos; - tmp = strlen(src); - g_assert (tmp % 2 == 0); - src_len += tmp; - } + src = *src_pos; + tmp = strlen (src); + g_assert (tmp % 2 == 0); + src_len += tmp; + } - *len = src_len / 2; - res = g_malloc0 (*len); - dst = res; + *len = src_len / 2; + res = g_malloc0 (*len); + dst = res; - for (src_pos = srcL; *src_pos; src_pos++) { - for (src = *src_pos; *src; src += 2, dst += 1) { - *dst = (guint8) ((HEX_TO_INT (src[0]) << 4) | (HEX_TO_INT (src[1]))); - } - } + for (src_pos = srcL; *src_pos; src_pos++) + for (src = *src_pos; *src; src += 2, dst += 1) + *dst = (guint8) ((HEX_TO_INT (src[0]) << 4) | (HEX_TO_INT (src[1]))); - return res; + return res; } -static guint8 *vfs301_proto_generate(int type, int subtype, gssize *len) +static guint8 * +vfs301_proto_generate (int type, int subtype, gssize *len) { - switch (type) { - case 0x01: - case 0x04: - /* After cmd 0x04 is sent, a data is received on VALIDITY_RECEIVE_ENDPOINT_CTRL. - * If it is 0x0000: - * additional 64B and 224B are read from _DATA, then vfs301_next_scan_FA00 is - * sent, 0000 received from _CTRL, and then continue with wait loop - * If it is 0x1204: - * => reinit? - */ - case 0x17: - case 0x19: - case 0x1A: - { - guint8 *data = g_malloc0 (1); - *data = type; - *len = 1; - return data; - } - break; - case 0x0B: - return vfs301_proto_generate_0B(subtype, len); - break; - case 0x02D0: - { - const char **dataLs[] = { - vfs301_02D0_01, - vfs301_02D0_02, - vfs301_02D0_03, - vfs301_02D0_04, - vfs301_02D0_05, - vfs301_02D0_06, - vfs301_02D0_07, - }; - g_assert((int)subtype <= G_N_ELEMENTS (dataLs)); - return translate_str(dataLs[subtype - 1], len); - } - break; - case 0x0220: - switch (subtype) { - case 1: - return translate_str(vfs301_0220_01, len); - break; - case 2: - return translate_str(vfs301_0220_02, len); - break; - case 3: - return translate_str(vfs301_0220_03, len); - break; - case 0xFA00: - case 0x2C01: - case 0x5E01: { - guint8 *data; - guint8 *field; + switch (type) + { + case 0x01: + case 0x04: + /* After cmd 0x04 is sent, a data is received on VALIDITY_RECEIVE_ENDPOINT_CTRL. + * If it is 0x0000: + * additional 64B and 224B are read from _DATA, then vfs301_next_scan_FA00 is + * sent, 0000 received from _CTRL, and then continue with wait loop + * If it is 0x1204: + * => reinit? + */ + case 0x17: + case 0x19: + case 0x1A: + { + guint8 *data = g_malloc0 (1); + *data = type; + *len = 1; + return data; + } + break; - data = translate_str(vfs301_next_scan_template, len); - field = data + *len - (sizeof(S4_TAIL) - 1) / 2 - 4; + case 0x0B: + return vfs301_proto_generate_0B (subtype, len); + break; - g_assert (field >= data && field < data + *len); - g_assert(field[0] == 0xDE); - g_assert(field[1] == 0xAD); - g_assert(field[2] == 0xDE); - g_assert(field[3] == 0xAD); + case 0x02D0: + { + const char **dataLs[] = { + vfs301_02D0_01, + vfs301_02D0_02, + vfs301_02D0_03, + vfs301_02D0_04, + vfs301_02D0_05, + vfs301_02D0_06, + vfs301_02D0_07, + }; + g_assert ((int) subtype <= G_N_ELEMENTS (dataLs)); + return translate_str (dataLs[subtype - 1], len); + } + break; - field[0] = (guint8)((subtype >> 8) & 0xFF); - field[1] = (guint8)(subtype & 0xFF); - field[2] = field[0]; - field[3] = field[1]; + case 0x0220: + switch (subtype) + { + case 1: + return translate_str (vfs301_0220_01, len); + break; - return data; - break; - } - default: - g_assert_not_reached(); - break; - } - break; - case 0x06: - default: - break; - } + case 2: + return translate_str (vfs301_0220_02, len); + break; - g_assert_not_reached(); - *len = 0; - return NULL; + case 3: + return translate_str (vfs301_0220_03, len); + break; + + case 0xFA00: + case 0x2C01: + case 0x5E01: { + guint8 *data; + guint8 *field; + + data = translate_str (vfs301_next_scan_template, len); + field = data + *len - (sizeof (S4_TAIL) - 1) / 2 - 4; + + g_assert (field >= data && field < data + *len); + g_assert (field[0] == 0xDE); + g_assert (field[1] == 0xAD); + g_assert (field[2] == 0xDE); + g_assert (field[3] == 0xAD); + + field[0] = (guint8) ((subtype >> 8) & 0xFF); + field[1] = (guint8) (subtype & 0xFF); + field[2] = field[0]; + field[3] = field[1]; + + return data; + break; + } + + default: + g_assert_not_reached (); + break; + } + break; + + case 0x06: + default: + break; + } + + g_assert_not_reached (); + *len = 0; + return NULL; } /************************** SCAN IMAGE PROCESSING *****************************/ #ifdef SCAN_FINISH_DETECTION -static int img_is_finished_scan(fp_line_t *lines, int no_lines) +static int +img_is_finished_scan (fp_line_t *lines, int no_lines) { - int i; - int j; - int rv = 1; + int i; + int j; + int rv = 1; - for (i = no_lines - VFS301_FP_SUM_LINES; i < no_lines; i++) { - /* check the line for fingerprint data */ - for (j = 0; j < sizeof(lines[i].sum2); j++) { - if (lines[i].sum2[j] > (VFS301_FP_SUM_MEDIAN + VFS301_FP_SUM_EMPTY_RANGE)) - rv = 0; - } - } + for (i = no_lines - VFS301_FP_SUM_LINES; i < no_lines; i++) + { + /* check the line for fingerprint data */ + for (j = 0; j < sizeof (lines[i].sum2); j++) + if (lines[i].sum2[j] > (VFS301_FP_SUM_MEDIAN + VFS301_FP_SUM_EMPTY_RANGE)) + rv = 0; + } - return rv; + return rv; } #endif -static int scanline_diff(const guint8 *scanlines, int prev, int cur) +static int +scanline_diff (const guint8 *scanlines, int prev, int cur) { - const guint8 *line1 = scanlines + prev * VFS301_FP_OUTPUT_WIDTH; - const guint8 *line2 = scanlines + cur * VFS301_FP_OUTPUT_WIDTH; - int i; - int diff; + const guint8 *line1 = scanlines + prev * VFS301_FP_OUTPUT_WIDTH; + const guint8 *line2 = scanlines + cur * VFS301_FP_OUTPUT_WIDTH; + int i; + int diff; #ifdef OUTPUT_RAW - /* We only need the image, not the surrounding stuff. */ - line1 = ((vfs301_line_t*)line1)->scan; - line2 = ((vfs301_line_t*)line2)->scan; + /* We only need the image, not the surrounding stuff. */ + line1 = ((vfs301_line_t *) line1)->scan; + line2 = ((vfs301_line_t *) line2)->scan; #endif - /* TODO: This doesn't work too well when there are parallel lines in the - * fingerprint. */ - for (diff = 0, i = 0; i < VFS301_FP_WIDTH; i++) { - if (*line1 > *line2) - diff += *line1 - *line2; - else - diff += *line2 - *line1; + /* TODO: This doesn't work too well when there are parallel lines in the + * fingerprint. */ + for (diff = 0, i = 0; i < VFS301_FP_WIDTH; i++) + { + if (*line1 > *line2) + diff += *line1 - *line2; + else + diff += *line2 - *line1; - line1++; - line2++; - } + line1++; + line2++; + } - return ((diff / VFS301_FP_WIDTH) > VFS301_FP_LINE_DIFF_THRESHOLD); + return (diff / VFS301_FP_WIDTH) > VFS301_FP_LINE_DIFF_THRESHOLD; } /** Transform the input data to a normalized fingerprint scan */ -void vfs301_extract_image(FpDeviceVfs301 *vfs, guint8 *output, int *output_height -) +void +vfs301_extract_image (FpDeviceVfs301 *vfs, guint8 *output, int *output_height + ) { - const guint8 *scanlines = vfs->scanline_buf; - int last_line; - int i; + const guint8 *scanlines = vfs->scanline_buf; + int last_line; + int i; - g_assert(vfs->scanline_count >= 1); + g_assert (vfs->scanline_count >= 1); - *output_height = 1; - memcpy(output, scanlines, VFS301_FP_OUTPUT_WIDTH); - last_line = 0; + *output_height = 1; + memcpy (output, scanlines, VFS301_FP_OUTPUT_WIDTH); + last_line = 0; - /* The following algorithm is quite trivial - it just picks lines that - * differ more than VFS301_FP_LINE_DIFF_THRESHOLD. - * TODO: A nicer approach would be to pick those lines and then do some kind - * of bi/tri-linear resampling to get the output (so that we don't get so - * many false edges etc.). - */ - for (i = 1; i < vfs->scanline_count; i++) { - if (scanline_diff(scanlines, last_line, i)) { - memcpy( - output + VFS301_FP_OUTPUT_WIDTH * (*output_height), - scanlines + VFS301_FP_OUTPUT_WIDTH * i, - VFS301_FP_OUTPUT_WIDTH - ); - last_line = i; - (*output_height)++; - } - } + /* The following algorithm is quite trivial - it just picks lines that + * differ more than VFS301_FP_LINE_DIFF_THRESHOLD. + * TODO: A nicer approach would be to pick those lines and then do some kind + * of bi/tri-linear resampling to get the output (so that we don't get so + * many false edges etc.). + */ + for (i = 1; i < vfs->scanline_count; i++) + { + if (scanline_diff (scanlines, last_line, i)) + { + memcpy ( + output + VFS301_FP_OUTPUT_WIDTH * (*output_height), + scanlines + VFS301_FP_OUTPUT_WIDTH * i, + VFS301_FP_OUTPUT_WIDTH + ); + last_line = i; + (*output_height)++; + } + } } -static int img_process_data(int first_block, FpDeviceVfs301 *dev, const guint8 *buf, int len) +static int +img_process_data (int first_block, FpDeviceVfs301 *dev, const guint8 *buf, int len) { - vfs301_line_t *lines = (vfs301_line_t*)buf; - int no_lines = len / sizeof(vfs301_line_t); - int i; - /*int no_nonempty;*/ - guint8 *cur_line; - int last_img_height; + vfs301_line_t *lines = (vfs301_line_t *) buf; + int no_lines = len / sizeof (vfs301_line_t); + int i; + /*int no_nonempty;*/ + guint8 *cur_line; + int last_img_height; + #ifdef SCAN_FINISH_DETECTION - int finished_scan; + int finished_scan; #endif - if (first_block) { - last_img_height = 0; - dev->scanline_count = no_lines; - } else { - last_img_height = dev->scanline_count; - dev->scanline_count += no_lines; - } + if (first_block) + { + last_img_height = 0; + dev->scanline_count = no_lines; + } + else + { + last_img_height = dev->scanline_count; + dev->scanline_count += no_lines; + } - dev->scanline_buf = g_realloc(dev->scanline_buf, dev->scanline_count * VFS301_FP_OUTPUT_WIDTH); + dev->scanline_buf = g_realloc (dev->scanline_buf, dev->scanline_count * VFS301_FP_OUTPUT_WIDTH); - for (cur_line = dev->scanline_buf + last_img_height * VFS301_FP_OUTPUT_WIDTH, i = 0; - i < no_lines; - i++, cur_line += VFS301_FP_OUTPUT_WIDTH - ) { + for (cur_line = dev->scanline_buf + last_img_height * VFS301_FP_OUTPUT_WIDTH, i = 0; + i < no_lines; + i++, cur_line += VFS301_FP_OUTPUT_WIDTH + ) + { #ifndef OUTPUT_RAW - memcpy(cur_line, lines[i].scan, VFS301_FP_OUTPUT_WIDTH); + memcpy (cur_line, lines[i].scan, VFS301_FP_OUTPUT_WIDTH); #else - memcpy(cur_line, &lines[i], VFS301_FP_OUTPUT_WIDTH); + memcpy (cur_line, &lines[i], VFS301_FP_OUTPUT_WIDTH); #endif - } + } #ifdef SCAN_FINISH_DETECTION - finished_scan = img_is_finished_scan(lines, no_lines); + finished_scan = img_is_finished_scan (lines, no_lines); - return !finished_scan; + return !finished_scan; #else /* SCAN_FINISH_DETECTION */ - return 1; /* Just continue until data is coming */ + return 1; /* Just continue until data is coming */ #endif } /************************** PROTOCOL STUFF ************************************/ #define USB_RECV(from, len) \ - usb_recv(dev, from, len, NULL, NULL) + usb_recv (dev, from, len, NULL, NULL) #define USB_SEND(type, subtype) \ - { \ - const guint8 *data; \ - gssize len; \ - data = vfs301_proto_generate(type, subtype, &len); \ - usb_send(dev, data, len, NULL); \ - } + { \ + const guint8 *data; \ + gssize len; \ + data = vfs301_proto_generate (type, subtype, &len); \ + usb_send (dev, data, len, NULL); \ + } -#define RAW_DATA(x) x, sizeof(x) +#define RAW_DATA(x) x, sizeof (x) #define IS_VFS301_FP_SEQ_START(b) ((b[0] == 0x01) && (b[1] == 0xfe)) -static int vfs301_proto_process_data(FpDeviceVfs301 *dev, int first_block, const guint8 *buf, gint len) +static int +vfs301_proto_process_data (FpDeviceVfs301 *dev, int first_block, const guint8 *buf, gint len) { - int i; + int i; - if (first_block) { - g_assert(len >= VFS301_FP_FRAME_SIZE); + if (first_block) + { + g_assert (len >= VFS301_FP_FRAME_SIZE); - /* Skip bytes until start_sequence is found */ - for (i = 0; i < VFS301_FP_FRAME_SIZE; i++, buf++, len--) { - if (IS_VFS301_FP_SEQ_START(buf)) - break; - } - } + /* Skip bytes until start_sequence is found */ + for (i = 0; i < VFS301_FP_FRAME_SIZE; i++, buf++, len--) + if (IS_VFS301_FP_SEQ_START (buf)) + break; + } - return img_process_data(first_block, dev, buf, len); + return img_process_data (first_block, dev, buf, len); } -void vfs301_proto_request_fingerprint(FpDeviceVfs301 *dev) +void +vfs301_proto_request_fingerprint (FpDeviceVfs301 *dev) { - USB_SEND(0x0220, 0xFA00); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 000000000000 */ + USB_SEND (0x0220, 0xFA00); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 000000000000 */ } -int vfs301_proto_peek_event(FpDeviceVfs301 *dev) +int +vfs301_proto_peek_event (FpDeviceVfs301 *dev) { - g_autoptr(GError) error = NULL; - g_autoptr(FpiUsbTransfer) transfer = NULL; + g_autoptr(GError) error = NULL; + g_autoptr(FpiUsbTransfer) transfer = NULL; - const char no_event[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - const char got_event[] = {0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00}; + const char no_event[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + const char got_event[] = {0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00}; - USB_SEND(0x17, -1); - usb_recv (dev, VFS301_RECEIVE_ENDPOINT_CTRL, 7, &transfer, &error); + USB_SEND (0x17, -1); + usb_recv (dev, VFS301_RECEIVE_ENDPOINT_CTRL, 7, &transfer, &error); - /* XXX: This is obviously not a sane error handling! */ - g_assert (!error); + /* XXX: This is obviously not a sane error handling! */ + g_assert (!error); - if (memcmp(transfer->buffer, no_event, sizeof(no_event)) == 0) { - return 0; - } else if (memcmp(transfer->buffer, got_event, sizeof(no_event)) == 0) { - return 1; - } else { - g_assert_not_reached(); - } + if (memcmp (transfer->buffer, no_event, sizeof (no_event)) == 0) + return 0; + else if (memcmp (transfer->buffer, got_event, sizeof (no_event)) == 0) + return 1; + else + g_assert_not_reached (); } /* XXX: We sometimes need to receive data on from two endpoints at the same @@ -458,196 +495,207 @@ int vfs301_proto_peek_event(FpDeviceVfs301 *dev) * we will run into timeouts randomly and need to then try again. */ #define PARALLEL_RECEIVE(e1, l1, e2, l2) \ - { \ - g_autoptr(GError) error = NULL;\ - usb_recv(dev, e1, l1, NULL, &error); \ - usb_recv(dev, e2, l2, NULL, NULL); \ - if (g_error_matches (error, G_USB_DEVICE_ERROR, G_USB_DEVICE_ERROR_TIMED_OUT)) \ - usb_recv(dev, e1, l1, NULL, NULL); \ - } + { \ + g_autoptr(GError) error = NULL; \ + usb_recv (dev, e1, l1, NULL, &error); \ + usb_recv (dev, e2, l2, NULL, NULL); \ + if (g_error_matches (error, G_USB_DEVICE_ERROR, G_USB_DEVICE_ERROR_TIMED_OUT)) \ + usb_recv(dev, e1, l1, NULL, NULL); \ + } -static void vfs301_proto_process_event_cb(FpiUsbTransfer *transfer, - FpDevice *device, - gpointer user_data, GError *error) +static void +vfs301_proto_process_event_cb (FpiUsbTransfer *transfer, + FpDevice *device, + gpointer user_data, GError *error) { - FpDeviceVfs301 *dev = user_data; + FpDeviceVfs301 *dev = user_data; - if (error) { - g_warning ("Error receiving data: %s", error->message); - g_error_free (error); - dev->recv_progress = VFS301_FAILURE; - return; - } else if (transfer->actual_length < transfer->length) { - /* TODO: process the data anyway? */ - dev->recv_progress = VFS301_ENDED; - return; - } else { - FpiUsbTransfer *new; - if (!vfs301_proto_process_data(dev, - transfer->length == VFS301_FP_RECV_LEN_1, - transfer->buffer, - transfer->actual_length)) { - dev->recv_progress = VFS301_ENDED; - return; - } + if (error) + { + g_warning ("Error receiving data: %s", error->message); + g_error_free (error); + dev->recv_progress = VFS301_FAILURE; + return; + } + else if (transfer->actual_length < transfer->length) + { + /* TODO: process the data anyway? */ + dev->recv_progress = VFS301_ENDED; + return; + } + else + { + FpiUsbTransfer *new; + if (!vfs301_proto_process_data (dev, + transfer->length == VFS301_FP_RECV_LEN_1, + transfer->buffer, + transfer->actual_length)) + { + dev->recv_progress = VFS301_ENDED; + return; + } - new = fpi_usb_transfer_new (device); + new = fpi_usb_transfer_new (device); - fpi_usb_transfer_fill_bulk(new, VFS301_RECEIVE_ENDPOINT_DATA, VFS301_FP_RECV_LEN_2); - fpi_usb_transfer_submit(new, VFS301_FP_RECV_TIMEOUT, NULL, - vfs301_proto_process_event_cb, NULL); - fpi_usb_transfer_unref (new); - return; - } + fpi_usb_transfer_fill_bulk (new, VFS301_RECEIVE_ENDPOINT_DATA, VFS301_FP_RECV_LEN_2); + fpi_usb_transfer_submit (new, VFS301_FP_RECV_TIMEOUT, NULL, + vfs301_proto_process_event_cb, NULL); + fpi_usb_transfer_unref (new); + return; + } } -void vfs301_proto_process_event_start(FpDeviceVfs301 *dev) +void +vfs301_proto_process_event_start (FpDeviceVfs301 *dev) { - FpiUsbTransfer *transfer; + FpiUsbTransfer *transfer; - /* - * Notes: - * - * seen next_scan order: - * o FA00 - * o FA00 - * o 2C01 - * o FA00 - * o FA00 - * o 2C01 - * o FA00 - * o FA00 - * o 2C01 - * o 5E01 !? - * o FA00 - * o FA00 - * o 2C01 - * o FA00 - * o FA00 - * o 2C01 - */ - USB_RECV(VFS301_RECEIVE_ENDPOINT_DATA, 64); + /* + * Notes: + * + * seen next_scan order: + * o FA00 + * o FA00 + * o 2C01 + * o FA00 + * o FA00 + * o 2C01 + * o FA00 + * o FA00 + * o 2C01 + * o 5E01 !? + * o FA00 + * o FA00 + * o 2C01 + * o FA00 + * o FA00 + * o 2C01 + */ + USB_RECV (VFS301_RECEIVE_ENDPOINT_DATA, 64); - /* now read the fingerprint data, while there are some */ - transfer = fpi_usb_transfer_new(FP_DEVICE (dev)); - dev->recv_progress = VFS301_ONGOING; + /* now read the fingerprint data, while there are some */ + transfer = fpi_usb_transfer_new (FP_DEVICE (dev)); + dev->recv_progress = VFS301_ONGOING; - fpi_usb_transfer_fill_bulk (transfer, VFS301_RECEIVE_ENDPOINT_DATA, VFS301_FP_RECV_LEN_1); - fpi_usb_transfer_submit(transfer, VFS301_FP_RECV_TIMEOUT, NULL, - vfs301_proto_process_event_cb, NULL); - fpi_usb_transfer_unref(transfer); + fpi_usb_transfer_fill_bulk (transfer, VFS301_RECEIVE_ENDPOINT_DATA, VFS301_FP_RECV_LEN_1); + fpi_usb_transfer_submit (transfer, VFS301_FP_RECV_TIMEOUT, NULL, + vfs301_proto_process_event_cb, NULL); + fpi_usb_transfer_unref (transfer); } -int vfs301_proto_process_event_poll(FpDeviceVfs301 *dev) +int +vfs301_proto_process_event_poll (FpDeviceVfs301 *dev) { - if (dev->recv_progress != VFS301_ENDED) - return dev->recv_progress; + if (dev->recv_progress != VFS301_ENDED) + return dev->recv_progress; - /* Finish the scan process... */ + /* Finish the scan process... */ - USB_SEND(0x04, -1); - /* the following may come in random order, data may not come at all, don't - * try for too long... */ - PARALLEL_RECEIVE( - VFS301_RECEIVE_ENDPOINT_CTRL, 2, /* 1204 */ - VFS301_RECEIVE_ENDPOINT_DATA, 16384 - ); + USB_SEND (0x04, -1); + /* the following may come in random order, data may not come at all, don't + * try for too long... */ + PARALLEL_RECEIVE ( + VFS301_RECEIVE_ENDPOINT_CTRL, 2, /* 1204 */ + VFS301_RECEIVE_ENDPOINT_DATA, 16384 + ); - USB_SEND(0x0220, 2); - PARALLEL_RECEIVE( - VFS301_RECEIVE_ENDPOINT_DATA, 5760, /* seems to always come */ - VFS301_RECEIVE_ENDPOINT_CTRL, 2 /* 0000 */ - ); + USB_SEND (0x0220, 2); + PARALLEL_RECEIVE ( + VFS301_RECEIVE_ENDPOINT_DATA, 5760, /* seems to always come */ + VFS301_RECEIVE_ENDPOINT_CTRL, 2 /* 0000 */ + ); - return dev->recv_progress; + return dev->recv_progress; } -void vfs301_proto_init(FpDeviceVfs301 *dev) +void +vfs301_proto_init (FpDeviceVfs301 *dev) { - USB_SEND(0x01, -1); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 38); - USB_SEND(0x0B, 0x04); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 6); /* 000000000000 */ - USB_SEND(0x0B, 0x05); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 7); /* 00000000000000 */ - USB_SEND(0x19, -1); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 64); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 4); /* 6BB4D0BC */ - usb_send(dev, RAW_DATA(vfs301_06_1), NULL); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + USB_SEND (0x01, -1); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 38); + USB_SEND (0x0B, 0x04); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 6); /* 000000000000 */ + USB_SEND (0x0B, 0x05); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 7); /* 00000000000000 */ + USB_SEND (0x19, -1); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 64); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 4); /* 6BB4D0BC */ + usb_send (dev, RAW_DATA (vfs301_06_1), NULL); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - USB_SEND(0x01, -1); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 38); - USB_SEND(0x1A, -1); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - usb_send(dev, RAW_DATA(vfs301_06_2), NULL); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - USB_SEND(0x0220, 1); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - USB_RECV(VFS301_RECEIVE_ENDPOINT_DATA, 256); - USB_RECV(VFS301_RECEIVE_ENDPOINT_DATA, 32); + USB_SEND (0x01, -1); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 38); + USB_SEND (0x1A, -1); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + usb_send (dev, RAW_DATA (vfs301_06_2), NULL); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + USB_SEND (0x0220, 1); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + USB_RECV (VFS301_RECEIVE_ENDPOINT_DATA, 256); + USB_RECV (VFS301_RECEIVE_ENDPOINT_DATA, 32); - USB_SEND(0x1A, -1); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - usb_send(dev, RAW_DATA(vfs301_06_3), NULL); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + USB_SEND (0x1A, -1); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + usb_send (dev, RAW_DATA (vfs301_06_3), NULL); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - USB_SEND(0x01, -1); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 38); - USB_SEND(0x02D0, 1); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - USB_RECV(VFS301_RECEIVE_ENDPOINT_DATA, 11648); /* 56 * vfs301_init_line_t[] */ - USB_SEND(0x02D0, 2); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - USB_RECV(VFS301_RECEIVE_ENDPOINT_DATA, 53248); /* 2 * 128 * vfs301_init_line_t[] */ - USB_SEND(0x02D0, 3); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - USB_RECV(VFS301_RECEIVE_ENDPOINT_DATA, 19968); /* 96 * vfs301_init_line_t[] */ - USB_SEND(0x02D0, 4); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - USB_RECV(VFS301_RECEIVE_ENDPOINT_DATA, 5824); /* 28 * vfs301_init_line_t[] */ - USB_SEND(0x02D0, 5); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - USB_RECV(VFS301_RECEIVE_ENDPOINT_DATA, 6656); /* 32 * vfs301_init_line_t[] */ - USB_SEND(0x02D0, 6); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - USB_RECV(VFS301_RECEIVE_ENDPOINT_DATA, 6656); /* 32 * vfs301_init_line_t[] */ - USB_SEND(0x02D0, 7); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - USB_RECV(VFS301_RECEIVE_ENDPOINT_DATA, 832); - usb_send(dev, RAW_DATA(vfs301_12), NULL); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + USB_SEND (0x01, -1); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 38); + USB_SEND (0x02D0, 1); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + USB_RECV (VFS301_RECEIVE_ENDPOINT_DATA, 11648); /* 56 * vfs301_init_line_t[] */ + USB_SEND (0x02D0, 2); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + USB_RECV (VFS301_RECEIVE_ENDPOINT_DATA, 53248); /* 2 * 128 * vfs301_init_line_t[] */ + USB_SEND (0x02D0, 3); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + USB_RECV (VFS301_RECEIVE_ENDPOINT_DATA, 19968); /* 96 * vfs301_init_line_t[] */ + USB_SEND (0x02D0, 4); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + USB_RECV (VFS301_RECEIVE_ENDPOINT_DATA, 5824); /* 28 * vfs301_init_line_t[] */ + USB_SEND (0x02D0, 5); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + USB_RECV (VFS301_RECEIVE_ENDPOINT_DATA, 6656); /* 32 * vfs301_init_line_t[] */ + USB_SEND (0x02D0, 6); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + USB_RECV (VFS301_RECEIVE_ENDPOINT_DATA, 6656); /* 32 * vfs301_init_line_t[] */ + USB_SEND (0x02D0, 7); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + USB_RECV (VFS301_RECEIVE_ENDPOINT_DATA, 832); + usb_send (dev, RAW_DATA (vfs301_12), NULL); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - USB_SEND(0x1A, -1); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - usb_send(dev, RAW_DATA(vfs301_06_2), NULL); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - USB_SEND(0x0220, 2); - PARALLEL_RECEIVE( - VFS301_RECEIVE_ENDPOINT_CTRL, 2, /* 0000 */ - VFS301_RECEIVE_ENDPOINT_DATA, 5760 - ); + USB_SEND (0x1A, -1); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + usb_send (dev, RAW_DATA (vfs301_06_2), NULL); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + USB_SEND (0x0220, 2); + PARALLEL_RECEIVE ( + VFS301_RECEIVE_ENDPOINT_CTRL, 2, /* 0000 */ + VFS301_RECEIVE_ENDPOINT_DATA, 5760 + ); - USB_SEND(0x1A, -1); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - usb_send(dev, RAW_DATA(vfs301_06_1), NULL); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + USB_SEND (0x1A, -1); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + usb_send (dev, RAW_DATA (vfs301_06_1), NULL); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - USB_SEND(0x1A, -1); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - usb_send(dev, RAW_DATA(vfs301_06_4), NULL); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - usb_send(dev, RAW_DATA(vfs301_24), NULL); /* turns on white */ - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + USB_SEND (0x1A, -1); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + usb_send (dev, RAW_DATA (vfs301_06_4), NULL); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ + usb_send (dev, RAW_DATA (vfs301_24), NULL); /* turns on white */ + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2); /* 0000 */ - USB_SEND(0x01, -1); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 38); - USB_SEND(0x0220, 3); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 2368); - USB_RECV(VFS301_RECEIVE_ENDPOINT_CTRL, 36); - USB_RECV(VFS301_RECEIVE_ENDPOINT_DATA, 5760); + USB_SEND (0x01, -1); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 38); + USB_SEND (0x0220, 3); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 2368); + USB_RECV (VFS301_RECEIVE_ENDPOINT_CTRL, 36); + USB_RECV (VFS301_RECEIVE_ENDPOINT_DATA, 5760); } -void vfs301_proto_deinit(FpDeviceVfs301 *dev) +void +vfs301_proto_deinit (FpDeviceVfs301 *dev) { } diff --git a/libfprint/drivers/vfs301_proto_fragments.h b/libfprint/drivers/vfs301_proto_fragments.h index 39441a1..6decbc7 100644 --- a/libfprint/drivers/vfs301_proto_fragments.h +++ b/libfprint/drivers/vfs301_proto_fragments.h @@ -26,1118 +26,1118 @@ * I missed some block start, or split data that should be together. * It's quite challenging, this reverse engineering... :-) */ -#define __01 0x88 /* sometimes also 0x87? depending on what? */ +#define __01 0x88 /* sometimes also 0x87? depending on what? */ static const unsigned char vfs301_06_1[] = { /* 2401 B */ - 0x06, 0x00, 0x00, 0x54, 0x09, 0x00, 0x0F, 0x00, 0x60, - 0xD8, 0x0C, 0x00, 0x60, - 0xD4, 0x0C, 0x00, 0x60, - 0x18, 0x17, 0x00, 0x60, - 0x28, 0x17, 0x00, 0x60, - 0xC8, 0x0D, 0x00, 0x60, - 0x9C, 0x0B, 0x00, 0x60, - 0xD8, 0x16, 0x00, 0x60, - 0xDC, 0x16, 0x00, 0x60, - 0x00, 0x0E, 0x04, 0x30, 0xE0, 0x0C, 0x00, 0x60, - 0x07, 0x09, 0x00, 0x00, 0xFF, 0xF7, 0xFF, 0xFF, 0xCC, 0x08, 0x00, 0x60, - 0x02, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x48, 0x0D, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0xE0, 0x16, 0x00, 0x60, - 0x00, 0x12, 0x04, 0x30, 0xA5, 0xC2, 0x00, 0x00, 0xE4, 0x16, 0x00, 0x60, - 0xF0, 0x16, 0x00, 0x60, - 0x00, 0x0F, 0x04, 0x30, 0xB0, 0x0A, 0x00, 0x60, - 0x58, 0xB3, 0x04, 0x60, - 0x84, 0x05, 0x00, 0x60, - 0xA4, 0xED, 0x04, 0x60, - 0x8C, 0x04, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x60, - 0x40, 0x08, 0x00, 0x00, 0x10, 0x03, 0x02, 0x28, 0x1C, 0x0E, 0x00, 0x60, - 0x30, 0x17, 0x00, 0x60, - 0x70, 0x0E, 0x00, 0x60, + 0x06, 0x00, 0x00, 0x54, 0x09, 0x00, 0x0F, 0x00, 0x60, + 0xD8, 0x0C, 0x00, 0x60, + 0xD4, 0x0C, 0x00, 0x60, + 0x18, 0x17, 0x00, 0x60, + 0x28, 0x17, 0x00, 0x60, + 0xC8, 0x0D, 0x00, 0x60, + 0x9C, 0x0B, 0x00, 0x60, + 0xD8, 0x16, 0x00, 0x60, + 0xDC, 0x16, 0x00, 0x60, + 0x00, 0x0E, 0x04, 0x30, 0xE0, 0x0C, 0x00, 0x60, + 0x07, 0x09, 0x00, 0x00, 0xFF, 0xF7, 0xFF, 0xFF, 0xCC, 0x08, 0x00, 0x60, + 0x02, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x48, 0x0D, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0xE0, 0x16, 0x00, 0x60, + 0x00, 0x12, 0x04, 0x30, 0xA5, 0xC2, 0x00, 0x00, 0xE4, 0x16, 0x00, 0x60, + 0xF0, 0x16, 0x00, 0x60, + 0x00, 0x0F, 0x04, 0x30, 0xB0, 0x0A, 0x00, 0x60, + 0x58, 0xB3, 0x04, 0x60, + 0x84, 0x05, 0x00, 0x60, + 0xA4, 0xED, 0x04, 0x60, + 0x8C, 0x04, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x60, + 0x40, 0x08, 0x00, 0x00, 0x10, 0x03, 0x02, 0x28, 0x1C, 0x0E, 0x00, 0x60, + 0x30, 0x17, 0x00, 0x60, + 0x70, 0x0E, 0x00, 0x60, - 0xFF, 0xFF, 0xFF, 0xBF, 0xFD, 0x0C, 0x00, - 0x60, 0xF8, 0x16, 0x00, 0x60, 0xA8, 0x0B, 0x00, - 0x60, 0x08, 0x17, 0x00, 0x60, 0x18, 0x0D, 0x00, - 0x60, 0x00, 0x9E, 0x00, 0x38, 0xDC, 0x0C, 0x00, - 0x60, 0x04, 0x17, 0x00, 0x60, 0x36, 0x41, 0x00, - 0xE5, 0x59, 0x00, 0xA5, 0x65, 0x00, 0xE5, 0x5C, - 0x00, 0x25, 0x66, 0x00, 0x25, 0x58, 0x00, 0x91, - 0xC0, 0x03, 0xA1, 0xC1, 0x03, 0x0C, 0x08, 0x89, - 0x0A, 0x82, 0x49, 0x00, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x36, 0x61, 0x00, 0x0C, 0x96, 0x91, 0xC2, - 0x03, 0xB1, 0xC3, 0x03, 0x71, 0xC4, 0x03, 0xD8, - 0x1B, 0x16, 0x84, 0x07, 0xC2, 0x0D, 0x4E, 0xC0, - 0xC0, 0x74, 0xE2, 0xA0, 0x71, 0x47, 0x3E, 0x05, - 0x16, 0xDC, 0x0F, 0x47, 0xBE, 0x02, 0x16, 0x4C, - 0x13, 0xF2, 0xA4, 0x6B, 0x26, 0x1C, 0x6E, 0x82, - 0xCC, 0xFE, 0x16, 0x88, 0x07, 0x16, 0x25, 0x05, - 0xC2, 0x0D, 0x4E, 0x16, 0x2C, 0x08, 0x92, 0xCC, - 0xFE, 0x16, 0x59, 0x08, 0x60, 0xAC, 0xC0, 0x16, - 0xAA, 0x10, 0xC2, 0x2D, 0x10, 0xC2, 0x0C, 0x00, - 0xA2, 0xA4, 0x6D, 0x66, 0x6C, 0x02, 0x06, 0x03, - 0x00, 0xAD, 0x0D, 0x65, 0x3B, 0x00, 0xD1, 0xC3, - 0x03, 0xD8, 0x1D, 0x16, 0xAA, 0x07, 0x0C, 0x9C, - 0xE8, 0x07, 0x62, 0x4D, 0x4E, 0xA2, 0x5E, 0x00, - 0xC0, 0xF0, 0x74, 0x60, 0xFF, 0xC0, 0x16, 0xBF, - 0x0D, 0x0C, 0x38, 0xA1, 0xC5, 0x03, 0x91, 0xC6, - 0x03, 0x99, 0x2A, 0x82, 0x4D, 0x4E, 0x0C, 0x2A, - 0xA5, 0xC6, 0x29, 0x1D, 0xF0, 0x16, 0xCD, 0x13, - 0xE8, 0x07, 0xC2, 0xA4, 0x70, 0xC2, 0x5E, 0x00, - 0xC2, 0x0D, 0x4E, 0x06, 0xDE, 0xFF, 0x16, 0xD3, - 0xF8, 0x0C, 0x9C, 0x88, 0x07, 0x62, 0x4D, 0x4E, - 0xF2, 0x58, 0x00, 0x06, 0xE0, 0xFF, 0xC2, 0x1D, - 0x24, 0x37, 0xBC, 0x34, 0x98, 0x07, 0x62, 0x4D, - 0x4E, 0xF2, 0x59, 0x00, 0x46, 0xDD, 0xFF, 0x00, - 0x00, 0x47, 0xBE, 0x02, 0x86, 0xDD, 0xFF, 0x46, - 0x01, 0x00, 0xA2, 0x1D, 0x24, 0x16, 0x3A, 0xF7, - 0xE8, 0x07, 0xC2, 0xA4, 0x6C, 0xC2, 0x5E, 0x00, - 0x62, 0x4D, 0x4E, 0x0C, 0x9C, 0xC6, 0xD8, 0xFF, - 0x00, 0xC2, 0x0D, 0x4E, 0x06, 0xE2, 0xFF, 0x00, - 0x00, 0x16, 0x83, 0xF4, 0xFD, 0x0C, 0xF9, 0x01, - 0xC7, 0xB3, 0x03, 0x8D, 0x03, 0x89, 0x01, 0xA8, - 0xFD, 0xBD, 0x02, 0xC2, 0x21, 0x00, 0xA5, 0x80, - 0x2D, 0xB1, 0xC3, 0x03, 0xD8, 0x1B, 0xA8, 0x01, - 0xC8, 0xFD, 0xAA, 0xCC, 0xC9, 0xFD, 0xD8, 0x1B, - 0x92, 0x1D, 0x24, 0xE2, 0xA0, 0x71, 0xA0, 0x99, - 0xC0, 0x92, 0x5D, 0x24, 0x46, 0xC5, 0xFF, 0x00, - 0x00, 0xF2, 0xA0, 0x72, 0x8D, 0x03, 0x89, 0x01, - 0x40, 0xFF, 0xC0, 0x37, 0xBF, 0x03, 0x8D, 0x0F, - 0x89, 0x01, 0xBD, 0x02, 0xA2, 0x2D, 0x11, 0xC8, - 0x01, 0x4A, 0xAA, 0xE5, 0x7C, 0x2D, 0xE2, 0xA0, - 0x71, 0xC8, 0x01, 0xB1, 0xC3, 0x03, 0xCA, 0x22, - 0xC0, 0x33, 0xC0, 0xD8, 0x1B, 0xCA, 0x44, 0xC2, - 0x0D, 0x4E, 0x46, 0xB3, 0xFF, 0xA1, 0xC2, 0x03, - 0xE5, 0x70, 0x2D, 0xC6, 0xC9, 0xFF, 0xA2, 0x2D, - 0x11, 0x0C, 0x1E, 0xE2, 0x4D, 0x4E, 0x25, 0x5E, - 0x2D, 0xC1, 0xC3, 0x03, 0xC8, 0x1C, 0xBD, 0x0A, - 0xA2, 0x2C, 0x11, 0xB9, 0xBC, 0x4B, 0xAA, 0x25, - 0x5D, 0x2D, 0xD1, 0xC3, 0x03, 0xD2, 0x2D, 0x01, - 0xA2, 0x6D, 0x0C, 0xA2, 0x2D, 0x11, 0x65, 0x2E, - 0x2D, 0xB1, 0xC3, 0x03, 0xD8, 0x1B, 0x0C, 0x0E, - 0xA8, 0xBD, 0xE2, 0x6D, 0x11, 0xAC, 0xCA, 0xE5, - 0x22, 0x2D, 0xB1, 0xC3, 0x03, 0xF8, 0x1B, 0xA2, - 0x6F, 0x10, 0xD8, 0x1B, 0x92, 0x2D, 0x10, 0x16, - 0xE9, 0x04, 0x0C, 0x2C, 0x99, 0xFD, 0xD8, 0x1B, - 0x0C, 0x2A, 0xA2, 0x4D, 0x4E, 0x88, 0xBD, 0x82, - 0x5D, 0x24, 0xE2, 0xA0, 0x71, 0xC0, 0xC0, 0x74, - 0x46, 0x99, 0xFF, 0x00, 0x00, 0xC2, 0x0D, 0x4E, - 0x86, 0xFB, 0xFF, 0x00, 0x00, 0xAD, 0x09, 0x25, - 0x65, 0x2D, 0xA2, 0xA0, 0x72, 0xE5, 0x1E, 0x2D, - 0xB1, 0xC3, 0x03, 0xD8, 0x1B, 0xA2, 0x6D, 0x11, - 0xCC, 0xEA, 0x0C, 0x9C, 0x62, 0x4D, 0x4E, 0x88, - 0x07, 0xF2, 0xA4, 0x6A, 0xF2, 0x58, 0x00, 0x06, - 0x89, 0xFF, 0xC2, 0x0D, 0x4E, 0x86, 0x87, 0xFF, - 0x00, 0x0C, 0x9C, 0x62, 0x4D, 0x4E, 0xA8, 0x07, - 0x92, 0xA4, 0x6F, 0x92, 0x5A, 0x00, 0x06, 0xEC, - 0xFF, 0x36, 0x41, 0x00, 0x42, 0xC2, 0x20, 0x82, - 0xC2, 0x14, 0x91, 0xC7, 0x03, 0x8B, 0xB2, 0x7C, - 0xF3, 0x39, 0xD2, 0x49, 0x92, 0x49, 0x82, 0x89, - 0x62, 0x89, 0x52, 0x99, 0x42, 0xB9, 0x32, 0xB9, - 0x22, 0xA2, 0xC9, 0xFC, 0xA9, 0x72, 0x1D, 0xF0, - 0x00, 0x36, 0x41, 0x00, 0xA2, 0x22, 0x10, 0x16, - 0x2A, 0x00, 0x25, 0x23, 0x2D, 0xA2, 0x22, 0x11, - 0x8C, 0x1A, 0xA5, 0x22, 0x2D, 0xA8, 0xD2, 0x26, - 0x0A, 0x02, 0xE5, 0x56, 0x21, 0x1D, 0xF0, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x20, 0xA2, 0x20, 0x65, - 0xA5, 0x2A, 0xA1, 0xC3, 0x03, 0xA2, 0x2A, 0x01, - 0xA2, 0xCA, 0x14, 0x65, 0x0E, 0x2D, 0xE5, 0x95, - 0x2A, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x31, 0xC3, 0x03, 0xC8, 0x13, 0x0C, 0x05, 0x92, - 0x0C, 0x4E, 0x41, 0xC8, 0x03, 0x82, 0xC9, 0xFD, - 0x16, 0x68, 0x0B, 0x26, 0x49, 0x14, 0x21, 0xC9, - 0x03, 0x26, 0x59, 0x10, 0xA2, 0xC9, 0xFA, 0x16, - 0xFA, 0x07, 0xB2, 0xC9, 0xF9, 0x16, 0x4B, 0x0D, - 0x26, 0x89, 0x49, 0x1D, 0xF0, 0xA2, 0x2C, 0x10, - 0xE8, 0x12, 0xD8, 0x22, 0xD9, 0x03, 0xE2, 0x62, - 0x02, 0x16, 0x9A, 0x00, 0x25, 0x1C, 0x2D, 0xF8, - 0x13, 0x52, 0x6F, 0x10, 0xC8, 0x13, 0xC0, 0x20, - 0x00, 0xB2, 0xA2, 0x00, 0x81, 0xCA, 0x03, 0x82, - 0x64, 0x83, 0xA8, 0xCC, 0xA9, 0xEC, 0xE5, 0xA5, - 0x24, 0xA8, 0x13, 0x0C, 0x69, 0x92, 0x4A, 0x4E, - 0xA2, 0xA2, 0x00, 0xE5, 0x86, 0x2A, 0xA8, 0x13, - 0x8B, 0xAA, 0xA5, 0x0A, 0x00, 0xC0, 0x20, 0x00, - 0x52, 0x64, 0x80, 0x1D, 0xF0, 0xC0, 0x20, 0x00, - 0xC1, 0xCB, 0x03, 0xB2, 0x24, 0x83, 0xC0, 0x20, - 0x00, 0xC0, 0xBB, 0x10, 0xB2, 0x64, 0x83, 0x65, - 0xD5, 0x2A, 0xA8, 0x13, 0x8B, 0xAA, 0xE5, 0x06, - 0x2D, 0xA1, 0xC2, 0x03, 0x25, 0x56, 0x2D, 0x98, - 0x03, 0x16, 0xE9, 0xF8, 0x99, 0x22, 0x59, 0x03, - 0x1D, 0xF0, 0xA2, 0xCC, 0x20, 0xA5, 0x92, 0x2A, - 0x16, 0xFA, 0xF7, 0x22, 0xA0, 0x07, 0xB2, 0x0A, - 0x2C, 0xC2, 0x23, 0x01, 0x07, 0x6B, 0x02, 0x22, - 0x4C, 0x4E, 0x65, 0xA4, 0x24, 0xA8, 0x13, 0xA2, - 0xCA, 0x20, 0xE5, 0x90, 0x2A, 0x56, 0x5A, 0xFE, - 0x1D, 0xF0, 0x52, 0x63, 0x00, 0xA1, 0xCD, 0x03, - 0xB1, 0xCC, 0x03, 0xB2, 0x62, 0x02, 0x65, 0xB5, - 0x2A, 0xC0, 0x20, 0x00, 0x0C, 0x4C, 0xE1, 0xCE, - 0x03, 0xD2, 0x24, 0x83, 0xC0, 0x20, 0x00, 0xA8, - 0x13, 0xE0, 0xDD, 0x20, 0xD2, 0x64, 0x83, 0xC2, - 0x4A, 0x4E, 0xE5, 0x0C, 0x00, 0xAD, 0x02, 0xA5, - 0x9A, 0x29, 0x1D, 0xF0, 0x00, 0xA1, 0xCF, 0x03, - 0x25, 0x52, 0x2D, 0xC0, 0x20, 0x00, 0xA8, 0x13, - 0xF1, 0xD0, 0x03, 0xF2, 0x64, 0x83, 0x65, 0x1B, - 0x00, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x31, 0xC3, 0x03, 0x82, 0x23, 0x01, 0x71, 0xD1, - 0x03, 0x82, 0x28, 0x0E, 0x62, 0xA0, 0x00, 0x16, - 0x68, 0x05, 0xE5, 0x76, 0x2A, 0x4D, 0x0A, 0x16, - 0x2A, 0x05, 0xA8, 0x13, 0x52, 0x14, 0x15, 0xA8, - 0xEA, 0x57, 0xBA, 0x01, 0x5D, 0x0A, 0xB1, 0xD2, - 0x03, 0xC8, 0x24, 0x0C, 0x0D, 0xF1, 0xD3, 0x03, - 0x50, 0xE0, 0xF4, 0xE2, 0x54, 0x14, 0x52, 0xC4, - 0x10, 0xAD, 0x05, 0xE5, 0x81, 0x21, 0x62, 0x44, - 0x2C, 0xD8, 0x13, 0xC2, 0x14, 0x14, 0xB8, 0xED, - 0xC0, 0xBB, 0xC0, 0xB9, 0xED, 0xCC, 0x8B, 0x79, - 0x34, 0x0C, 0x1D, 0xD2, 0x44, 0x2C, 0xD2, 0x23, - 0x01, 0xAD, 0x05, 0xB8, 0xDD, 0x0C, 0x1C, 0x25, - 0xAD, 0x21, 0xE8, 0x13, 0xE8, 0xEE, 0x56, 0x8E, - 0xFA, 0x1D, 0xF0, 0x00, 0x00, 0xAD, 0x02, 0x65, - 0x72, 0x2A, 0x1D, 0xF0, 0x00, 0x36, 0x41, 0x00, - 0xB2, 0xC2, 0xF0, 0xA2, 0xC3, 0x20, 0xA5, 0x7F, - 0x2A, 0xA2, 0xC3, 0x14, 0xE5, 0xF3, 0x2C, 0x1D, - 0xF0, 0x36, 0x41, 0x00, 0x0C, 0x0A, 0xBD, 0x02, - 0xC1, 0xD4, 0x03, 0x65, 0x9B, 0x21, 0xA9, 0xD2, - 0x26, 0x0A, 0x05, 0x0C, 0x02, 0x1D, 0xF0, 0x00, - 0x00, 0x22, 0xA4, 0x6E, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x36, 0x41, 0x00, 0xA2, 0xA0, 0x03, 0xB1, - 0xD5, 0x03, 0xE5, 0xEA, 0x2C, 0x92, 0xA0, 0x60, - 0x81, 0xC8, 0x03, 0xB8, 0xB2, 0xA2, 0x22, 0x10, - 0xA9, 0xF2, 0xB2, 0x52, 0x26, 0xB2, 0x52, 0x25, - 0x0C, 0x8B, 0xC0, 0x20, 0x00, 0xF2, 0x28, 0x81, - 0xC0, 0x20, 0x00, 0xE8, 0xF2, 0x90, 0xFF, 0x20, - 0xF2, 0x68, 0x81, 0xE2, 0x0E, 0x00, 0xC0, 0x20, - 0x00, 0xC8, 0xF2, 0xF1, 0xD6, 0x03, 0x1B, 0xCC, - 0xE2, 0x5F, 0x80, 0xD2, 0x12, 0x25, 0xC9, 0xF2, - 0x0B, 0xDD, 0xD2, 0x52, 0x25, 0x80, 0x61, 0x00, - 0x9D, 0x08, 0xA0, 0xE4, 0x03, 0xB0, 0xAA, 0x20, - 0xA0, 0xE4, 0x13, 0x80, 0xE6, 0x13, 0x10, 0x20, - 0x00, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x61, 0x00, - 0xC0, 0x20, 0x00, 0xC1, 0xD6, 0x03, 0xF1, 0xC8, - 0x03, 0xE1, 0xC3, 0x03, 0xA2, 0x2F, 0x82, 0xB8, - 0x1E, 0x17, 0x6A, 0x14, 0x92, 0x1B, 0x26, 0x16, - 0xE9, 0x00, 0x82, 0xC9, 0xFF, 0xC0, 0x20, 0x00, - 0xD2, 0x1C, 0x80, 0xD2, 0x51, 0x00, 0x82, 0x5B, - 0x26, 0x92, 0x1B, 0x25, 0x07, 0xEA, 0x07, 0x8C, - 0xA9, 0x82, 0x0B, 0x4E, 0x26, 0x48, 0x41, 0x8C, - 0x29, 0x1D, 0xF0, 0x00, 0x00, 0x92, 0x1B, 0x26, - 0x56, 0x59, 0xFF, 0xC0, 0x20, 0x00, 0x0C, 0x5D, - 0x92, 0xAF, 0x9F, 0x82, 0x2F, 0x81, 0xC0, 0x20, - 0x00, 0x90, 0x88, 0x10, 0x82, 0x6F, 0x81, 0x7C, - 0x7F, 0xA0, 0x61, 0x00, 0xCD, 0x0A, 0xE0, 0xE4, - 0x03, 0xF0, 0xEE, 0x10, 0xE0, 0xE4, 0x13, 0xA0, - 0xE6, 0x13, 0x10, 0x20, 0x00, 0xD2, 0x4B, 0x4E, - 0xA2, 0xCB, 0x14, 0xE5, 0xE3, 0x2C, 0x1D, 0xF0, - 0x00, 0xD8, 0xFB, 0xD2, 0x0D, 0x00, 0xC0, 0x20, - 0x00, 0xA8, 0xFB, 0xD2, 0x5C, 0x80, 0x1B, 0xAA, - 0xA9, 0xFB, 0xB8, 0x1E, 0x92, 0x1B, 0x25, 0x0B, - 0x99, 0x90, 0x90, 0xF4, 0x92, 0x5B, 0x25, 0x06, - 0xE7, 0xFF, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x92, 0xA0, 0x06, 0xB1, 0xC8, 0x03, 0xC0, 0x20, - 0x00, 0x82, 0x2B, 0x82, 0x0C, 0x0A, 0x17, 0x68, - 0x0B, 0x92, 0xC9, 0xFF, 0xC0, 0x20, 0x00, 0xC2, - 0x2B, 0x80, 0x56, 0x89, 0xFE, 0xC0, 0x20, 0x00, - 0xA2, 0xC2, 0x14, 0x0C, 0x8D, 0xE2, 0xA0, 0x04, - 0xE2, 0x6B, 0x84, 0xD2, 0x42, 0x4E, 0x25, 0xDE, - 0x2C, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x31, 0xD7, 0x03, 0x21, 0xD8, 0x03, 0x22, 0x63, - 0x75, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, - 0xA1, 0xD9, 0x03, 0xB1, 0xDA, 0x03, 0xC1, 0xDB, - 0x03, 0xE5, 0x37, 0x2D, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x16, 0xA5, 0x01, 0x20, - 0x61, 0x00, 0x25, 0xA4, 0xFF, 0x20, 0xE6, 0x13, - 0x10, 0x20, 0x00, 0xA2, 0xA0, 0x00, 0x65, 0x72, - 0x29, 0xA1, 0xDC, 0x03, 0xB1, 0xDD, 0x03, 0xE5, - 0xFF, 0x2C, 0x1D, 0xF0, 0x00, 0x36, 0x41, 0x00, - 0xA1, 0xDE, 0x03, 0xB1, 0xDE, 0x03, 0x65, 0xFC, - 0x20, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, - 0xCD, 0x04, 0x81, 0xDF, 0x03, 0xBD, 0x03, 0x88, - 0x08, 0xAD, 0x02, 0xCC, 0xF8, 0x8C, 0xD3, 0xD1, - 0xC9, 0x03, 0xF1, 0xE0, 0x03, 0x98, 0x1D, 0xE8, - 0x2D, 0xE9, 0x0F, 0x92, 0x6D, 0x02, 0xE5, 0x65, - 0x29, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, - 0xC1, 0xE0, 0x03, 0xAD, 0x02, 0x98, 0x0C, 0x0C, - 0x0B, 0x8C, 0x59, 0x81, 0xC9, 0x03, 0xB9, 0x0C, - 0x99, 0x28, 0xE5, 0x70, 0x29, 0x1D, 0xF0, 0x00, - 0x00, 0x36, 0x41, 0x00, 0xD1, 0xE2, 0x03, 0x91, - 0xE3, 0x03, 0xB0, 0x82, 0x11, 0xA1, 0xE1, 0x03, - 0xB2, 0xAE, 0xF0, 0xBA, 0xAA, 0xAA, 0xA8, 0x9A, - 0x88, 0xC8, 0x0A, 0xC0, 0x20, 0x00, 0xB8, 0x7C, - 0xC0, 0x20, 0x00, 0xD0, 0xBB, 0x10, 0xB9, 0x7C, - 0x82, 0x08, 0x7F, 0x0C, 0x09, 0x8C, 0x18, 0xE5, - 0x5B, 0x21, 0x1D, 0xF0, 0x00, 0x36, 0x41, 0x00, - 0x21, 0xE4, 0x03, 0x31, 0xE5, 0x03, 0x28, 0x22, - 0x29, 0x03, 0x1D, 0xF0, 0x00, 0x36, 0x41, 0x00, - 0x21, 0xE6, 0x03, 0x88, 0x02, 0x27, 0x98, 0x02, - 0x1D, 0xF0, 0x00, 0x20, 0xA2, 0x20, 0x25, 0x08, - 0x00, 0xAD, 0x02, 0xE5, 0xC5, 0x20, 0x1D, 0xF0, - 0x00, 0x36, 0x41, 0x00, 0x20, 0x61, 0x00, 0xA1, - 0xE6, 0x03, 0xE5, 0xC4, 0x20, 0xA5, 0x0B, 0x24, - 0x20, 0xE6, 0x13, 0x10, 0x20, 0x00, 0x1D, 0xF0, - 0x00, 0x36, 0x41, 0x00, 0x41, 0xE7, 0x03, 0x21, - 0xE8, 0x03, 0xC0, 0x20, 0x00, 0x32, 0x22, 0x81, - 0x98, 0x54, 0x88, 0x34, 0x30, 0x99, 0x20, 0x99, - 0x54, 0x87, 0x83, 0x39, 0x0C, 0x1C, 0xB2, 0xA0, - 0x38, 0xA2, 0x24, 0x04, 0xC0, 0x20, 0x00, 0xB0, - 0xAA, 0x10, 0xA2, 0x62, 0x80, 0xC0, 0x20, 0x00, - 0xD2, 0x22, 0x81, 0xD0, 0xE0, 0x04, 0x07, 0xED, - 0xF3, 0xC0, 0x20, 0x00, 0xB1, 0xE9, 0x03, 0x32, - 0x62, 0x81, 0xC0, 0x20, 0x00, 0xB8, 0x0B, 0xA1, - 0xEA, 0x03, 0x1B, 0xBB, 0xB9, 0x4A, 0x4B, 0xAA, - 0xA5, 0xBD, 0x20, 0x1D, 0xF0, 0x00, 0x0C, 0x0C, - 0xC9, 0x34, 0xE5, 0xC4, 0x21, 0xC6, 0xEE, 0xFF, - 0x00, 0x36, 0x41, 0x00, 0x20, 0x61, 0x00, 0x3C, - 0x8A, 0x0C, 0x0B, 0x65, 0x08, 0x24, 0x20, 0xE6, - 0x13, 0x10, 0x20, 0x00, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x1F, 0x00, 0x00, 0x00, 0xD0, 0x0F, 0x02, - 0x60, 0xD8, 0x11, 0x02, 0x60, 0x00, 0x12, 0x02, - 0x60, 0x3C, 0x12, 0x02, 0x60, 0x54, 0x13, 0x02, - 0x60, 0x20, 0x12, 0x02, 0x60, 0xCC, 0x13, 0x02, - 0x60, 0xE0, 0x13, 0x02, 0x60, 0x00, 0x14, 0x02, - 0x60, 0x64, 0x14, 0x02, 0x60, 0x04, 0x15, 0x02, - 0x60, 0xC8, 0x16, 0x00, 0x60, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x16, 0x02, - 0x60, 0x08, 0x17, 0x00, 0x60, 0x08, 0x17, 0x00, - 0x60, 0x04, 0x17, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0xD0, 0x16, 0x00, 0x60, 0xD4, 0x16, 0x00, - 0x60, 0x2C, 0x17, 0x00, 0x60, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x0C, 0x00, - 0x60, 0xD4, 0x0C, 0x00, 0x60, 0x19, 0x30, 0x00, - 0x00, 0x40, 0x17, 0x00, 0x60, 0x10, 0x01, 0x00, - 0x00, 0xB0, 0x0A, 0x00, 0x60, 0x60, 0x15, 0x02, - 0x60, 0x34, 0x0D, 0x00, 0x60, 0x10, 0x03, 0x02, - 0x28, 0x18, 0x00, 0x02, 0x28, 0x14, 0x03, 0x02, - 0x28, 0xBC, 0x08, 0x00, 0x60, 0x94, 0x15, 0x02, - 0x60, 0xBC, 0x15, 0x02, 0x60, 0xA4, 0x05, 0x00, - 0x60, 0xD8, 0x15, 0x02, 0x60, 0xA8, 0x0B, 0x00, - 0x60, 0xF8, 0x16, 0x00, 0x60, 0xAC, 0x06, 0x00, - 0x60, 0x38, 0x16, 0x02, 0x60, 0x50, 0x16, 0x02, - 0x60, 0xD8, 0x56, 0x04, 0x60, 0x36, 0x41, 0x00, - 0x81, 0xCF, 0x05, 0xB1, 0xCD, 0x05, 0xA2, 0xA0, - 0x03, 0x91, 0xCE, 0x05, 0xA2, 0x4B, 0x00, 0x82, - 0x69, 0x00, 0xE5, 0x01, 0x00, 0xA5, 0x08, 0x00, - 0x25, 0x05, 0x00, 0x25, 0x06, 0x00, 0x25, 0x02, - 0x00, 0xA5, 0x06, 0x00, 0xA1, 0xD0, 0x05, 0xB1, - 0xD1, 0x05, 0x25, 0xDC, 0x2C, 0x1D, 0xF0, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x31, 0xD2, 0x05, 0x21, - 0xD3, 0x05, 0x22, 0x63, 0x75, 0x1D, 0xF0, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x91, 0xD4, 0x05, 0x92, - 0x09, 0x47, 0x26, 0x19, 0x04, 0x26, 0x29, 0x0C, - 0x1D, 0xF0, 0xA1, 0xD5, 0x05, 0xB1, 0xD6, 0x05, - 0xE5, 0xD6, 0x20, 0x1D, 0xF0, 0xA1, 0xD5, 0x05, - 0xB1, 0xD7, 0x05, 0x25, 0xD6, 0x20, 0x1D, 0xF0, - 0x00, 0x36, 0x41, 0x00, 0x81, 0xD9, 0x05, 0x31, - 0xD8, 0x05, 0x21, 0xDA, 0x05, 0x29, 0x43, 0x89, - 0x03, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x31, 0xDB, 0x05, 0x21, 0xDC, 0x05, 0x22, 0x63, - 0x13, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x31, 0xDD, 0x05, 0x21, 0xDE, 0x05, 0x48, 0x03, - 0x49, 0x22, 0x29, 0x03, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x91, 0xE0, 0x05, 0x21, - 0xE2, 0x05, 0x31, 0xDF, 0x05, 0x81, 0xE1, 0x05, - 0x89, 0xC3, 0x29, 0xA3, 0x99, 0xB3, 0x1D, 0xF0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x04, 0x00, 0x8C, 0x17, 0x02, - 0x60, + 0xFF, 0xFF, 0xFF, 0xBF, 0xFD, 0x0C, 0x00, + 0x60, 0xF8, 0x16, 0x00, 0x60, 0xA8, 0x0B, 0x00, + 0x60, 0x08, 0x17, 0x00, 0x60, 0x18, 0x0D, 0x00, + 0x60, 0x00, 0x9E, 0x00, 0x38, 0xDC, 0x0C, 0x00, + 0x60, 0x04, 0x17, 0x00, 0x60, 0x36, 0x41, 0x00, + 0xE5, 0x59, 0x00, 0xA5, 0x65, 0x00, 0xE5, 0x5C, + 0x00, 0x25, 0x66, 0x00, 0x25, 0x58, 0x00, 0x91, + 0xC0, 0x03, 0xA1, 0xC1, 0x03, 0x0C, 0x08, 0x89, + 0x0A, 0x82, 0x49, 0x00, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x36, 0x61, 0x00, 0x0C, 0x96, 0x91, 0xC2, + 0x03, 0xB1, 0xC3, 0x03, 0x71, 0xC4, 0x03, 0xD8, + 0x1B, 0x16, 0x84, 0x07, 0xC2, 0x0D, 0x4E, 0xC0, + 0xC0, 0x74, 0xE2, 0xA0, 0x71, 0x47, 0x3E, 0x05, + 0x16, 0xDC, 0x0F, 0x47, 0xBE, 0x02, 0x16, 0x4C, + 0x13, 0xF2, 0xA4, 0x6B, 0x26, 0x1C, 0x6E, 0x82, + 0xCC, 0xFE, 0x16, 0x88, 0x07, 0x16, 0x25, 0x05, + 0xC2, 0x0D, 0x4E, 0x16, 0x2C, 0x08, 0x92, 0xCC, + 0xFE, 0x16, 0x59, 0x08, 0x60, 0xAC, 0xC0, 0x16, + 0xAA, 0x10, 0xC2, 0x2D, 0x10, 0xC2, 0x0C, 0x00, + 0xA2, 0xA4, 0x6D, 0x66, 0x6C, 0x02, 0x06, 0x03, + 0x00, 0xAD, 0x0D, 0x65, 0x3B, 0x00, 0xD1, 0xC3, + 0x03, 0xD8, 0x1D, 0x16, 0xAA, 0x07, 0x0C, 0x9C, + 0xE8, 0x07, 0x62, 0x4D, 0x4E, 0xA2, 0x5E, 0x00, + 0xC0, 0xF0, 0x74, 0x60, 0xFF, 0xC0, 0x16, 0xBF, + 0x0D, 0x0C, 0x38, 0xA1, 0xC5, 0x03, 0x91, 0xC6, + 0x03, 0x99, 0x2A, 0x82, 0x4D, 0x4E, 0x0C, 0x2A, + 0xA5, 0xC6, 0x29, 0x1D, 0xF0, 0x16, 0xCD, 0x13, + 0xE8, 0x07, 0xC2, 0xA4, 0x70, 0xC2, 0x5E, 0x00, + 0xC2, 0x0D, 0x4E, 0x06, 0xDE, 0xFF, 0x16, 0xD3, + 0xF8, 0x0C, 0x9C, 0x88, 0x07, 0x62, 0x4D, 0x4E, + 0xF2, 0x58, 0x00, 0x06, 0xE0, 0xFF, 0xC2, 0x1D, + 0x24, 0x37, 0xBC, 0x34, 0x98, 0x07, 0x62, 0x4D, + 0x4E, 0xF2, 0x59, 0x00, 0x46, 0xDD, 0xFF, 0x00, + 0x00, 0x47, 0xBE, 0x02, 0x86, 0xDD, 0xFF, 0x46, + 0x01, 0x00, 0xA2, 0x1D, 0x24, 0x16, 0x3A, 0xF7, + 0xE8, 0x07, 0xC2, 0xA4, 0x6C, 0xC2, 0x5E, 0x00, + 0x62, 0x4D, 0x4E, 0x0C, 0x9C, 0xC6, 0xD8, 0xFF, + 0x00, 0xC2, 0x0D, 0x4E, 0x06, 0xE2, 0xFF, 0x00, + 0x00, 0x16, 0x83, 0xF4, 0xFD, 0x0C, 0xF9, 0x01, + 0xC7, 0xB3, 0x03, 0x8D, 0x03, 0x89, 0x01, 0xA8, + 0xFD, 0xBD, 0x02, 0xC2, 0x21, 0x00, 0xA5, 0x80, + 0x2D, 0xB1, 0xC3, 0x03, 0xD8, 0x1B, 0xA8, 0x01, + 0xC8, 0xFD, 0xAA, 0xCC, 0xC9, 0xFD, 0xD8, 0x1B, + 0x92, 0x1D, 0x24, 0xE2, 0xA0, 0x71, 0xA0, 0x99, + 0xC0, 0x92, 0x5D, 0x24, 0x46, 0xC5, 0xFF, 0x00, + 0x00, 0xF2, 0xA0, 0x72, 0x8D, 0x03, 0x89, 0x01, + 0x40, 0xFF, 0xC0, 0x37, 0xBF, 0x03, 0x8D, 0x0F, + 0x89, 0x01, 0xBD, 0x02, 0xA2, 0x2D, 0x11, 0xC8, + 0x01, 0x4A, 0xAA, 0xE5, 0x7C, 0x2D, 0xE2, 0xA0, + 0x71, 0xC8, 0x01, 0xB1, 0xC3, 0x03, 0xCA, 0x22, + 0xC0, 0x33, 0xC0, 0xD8, 0x1B, 0xCA, 0x44, 0xC2, + 0x0D, 0x4E, 0x46, 0xB3, 0xFF, 0xA1, 0xC2, 0x03, + 0xE5, 0x70, 0x2D, 0xC6, 0xC9, 0xFF, 0xA2, 0x2D, + 0x11, 0x0C, 0x1E, 0xE2, 0x4D, 0x4E, 0x25, 0x5E, + 0x2D, 0xC1, 0xC3, 0x03, 0xC8, 0x1C, 0xBD, 0x0A, + 0xA2, 0x2C, 0x11, 0xB9, 0xBC, 0x4B, 0xAA, 0x25, + 0x5D, 0x2D, 0xD1, 0xC3, 0x03, 0xD2, 0x2D, 0x01, + 0xA2, 0x6D, 0x0C, 0xA2, 0x2D, 0x11, 0x65, 0x2E, + 0x2D, 0xB1, 0xC3, 0x03, 0xD8, 0x1B, 0x0C, 0x0E, + 0xA8, 0xBD, 0xE2, 0x6D, 0x11, 0xAC, 0xCA, 0xE5, + 0x22, 0x2D, 0xB1, 0xC3, 0x03, 0xF8, 0x1B, 0xA2, + 0x6F, 0x10, 0xD8, 0x1B, 0x92, 0x2D, 0x10, 0x16, + 0xE9, 0x04, 0x0C, 0x2C, 0x99, 0xFD, 0xD8, 0x1B, + 0x0C, 0x2A, 0xA2, 0x4D, 0x4E, 0x88, 0xBD, 0x82, + 0x5D, 0x24, 0xE2, 0xA0, 0x71, 0xC0, 0xC0, 0x74, + 0x46, 0x99, 0xFF, 0x00, 0x00, 0xC2, 0x0D, 0x4E, + 0x86, 0xFB, 0xFF, 0x00, 0x00, 0xAD, 0x09, 0x25, + 0x65, 0x2D, 0xA2, 0xA0, 0x72, 0xE5, 0x1E, 0x2D, + 0xB1, 0xC3, 0x03, 0xD8, 0x1B, 0xA2, 0x6D, 0x11, + 0xCC, 0xEA, 0x0C, 0x9C, 0x62, 0x4D, 0x4E, 0x88, + 0x07, 0xF2, 0xA4, 0x6A, 0xF2, 0x58, 0x00, 0x06, + 0x89, 0xFF, 0xC2, 0x0D, 0x4E, 0x86, 0x87, 0xFF, + 0x00, 0x0C, 0x9C, 0x62, 0x4D, 0x4E, 0xA8, 0x07, + 0x92, 0xA4, 0x6F, 0x92, 0x5A, 0x00, 0x06, 0xEC, + 0xFF, 0x36, 0x41, 0x00, 0x42, 0xC2, 0x20, 0x82, + 0xC2, 0x14, 0x91, 0xC7, 0x03, 0x8B, 0xB2, 0x7C, + 0xF3, 0x39, 0xD2, 0x49, 0x92, 0x49, 0x82, 0x89, + 0x62, 0x89, 0x52, 0x99, 0x42, 0xB9, 0x32, 0xB9, + 0x22, 0xA2, 0xC9, 0xFC, 0xA9, 0x72, 0x1D, 0xF0, + 0x00, 0x36, 0x41, 0x00, 0xA2, 0x22, 0x10, 0x16, + 0x2A, 0x00, 0x25, 0x23, 0x2D, 0xA2, 0x22, 0x11, + 0x8C, 0x1A, 0xA5, 0x22, 0x2D, 0xA8, 0xD2, 0x26, + 0x0A, 0x02, 0xE5, 0x56, 0x21, 0x1D, 0xF0, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x20, 0xA2, 0x20, 0x65, + 0xA5, 0x2A, 0xA1, 0xC3, 0x03, 0xA2, 0x2A, 0x01, + 0xA2, 0xCA, 0x14, 0x65, 0x0E, 0x2D, 0xE5, 0x95, + 0x2A, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x31, 0xC3, 0x03, 0xC8, 0x13, 0x0C, 0x05, 0x92, + 0x0C, 0x4E, 0x41, 0xC8, 0x03, 0x82, 0xC9, 0xFD, + 0x16, 0x68, 0x0B, 0x26, 0x49, 0x14, 0x21, 0xC9, + 0x03, 0x26, 0x59, 0x10, 0xA2, 0xC9, 0xFA, 0x16, + 0xFA, 0x07, 0xB2, 0xC9, 0xF9, 0x16, 0x4B, 0x0D, + 0x26, 0x89, 0x49, 0x1D, 0xF0, 0xA2, 0x2C, 0x10, + 0xE8, 0x12, 0xD8, 0x22, 0xD9, 0x03, 0xE2, 0x62, + 0x02, 0x16, 0x9A, 0x00, 0x25, 0x1C, 0x2D, 0xF8, + 0x13, 0x52, 0x6F, 0x10, 0xC8, 0x13, 0xC0, 0x20, + 0x00, 0xB2, 0xA2, 0x00, 0x81, 0xCA, 0x03, 0x82, + 0x64, 0x83, 0xA8, 0xCC, 0xA9, 0xEC, 0xE5, 0xA5, + 0x24, 0xA8, 0x13, 0x0C, 0x69, 0x92, 0x4A, 0x4E, + 0xA2, 0xA2, 0x00, 0xE5, 0x86, 0x2A, 0xA8, 0x13, + 0x8B, 0xAA, 0xA5, 0x0A, 0x00, 0xC0, 0x20, 0x00, + 0x52, 0x64, 0x80, 0x1D, 0xF0, 0xC0, 0x20, 0x00, + 0xC1, 0xCB, 0x03, 0xB2, 0x24, 0x83, 0xC0, 0x20, + 0x00, 0xC0, 0xBB, 0x10, 0xB2, 0x64, 0x83, 0x65, + 0xD5, 0x2A, 0xA8, 0x13, 0x8B, 0xAA, 0xE5, 0x06, + 0x2D, 0xA1, 0xC2, 0x03, 0x25, 0x56, 0x2D, 0x98, + 0x03, 0x16, 0xE9, 0xF8, 0x99, 0x22, 0x59, 0x03, + 0x1D, 0xF0, 0xA2, 0xCC, 0x20, 0xA5, 0x92, 0x2A, + 0x16, 0xFA, 0xF7, 0x22, 0xA0, 0x07, 0xB2, 0x0A, + 0x2C, 0xC2, 0x23, 0x01, 0x07, 0x6B, 0x02, 0x22, + 0x4C, 0x4E, 0x65, 0xA4, 0x24, 0xA8, 0x13, 0xA2, + 0xCA, 0x20, 0xE5, 0x90, 0x2A, 0x56, 0x5A, 0xFE, + 0x1D, 0xF0, 0x52, 0x63, 0x00, 0xA1, 0xCD, 0x03, + 0xB1, 0xCC, 0x03, 0xB2, 0x62, 0x02, 0x65, 0xB5, + 0x2A, 0xC0, 0x20, 0x00, 0x0C, 0x4C, 0xE1, 0xCE, + 0x03, 0xD2, 0x24, 0x83, 0xC0, 0x20, 0x00, 0xA8, + 0x13, 0xE0, 0xDD, 0x20, 0xD2, 0x64, 0x83, 0xC2, + 0x4A, 0x4E, 0xE5, 0x0C, 0x00, 0xAD, 0x02, 0xA5, + 0x9A, 0x29, 0x1D, 0xF0, 0x00, 0xA1, 0xCF, 0x03, + 0x25, 0x52, 0x2D, 0xC0, 0x20, 0x00, 0xA8, 0x13, + 0xF1, 0xD0, 0x03, 0xF2, 0x64, 0x83, 0x65, 0x1B, + 0x00, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x31, 0xC3, 0x03, 0x82, 0x23, 0x01, 0x71, 0xD1, + 0x03, 0x82, 0x28, 0x0E, 0x62, 0xA0, 0x00, 0x16, + 0x68, 0x05, 0xE5, 0x76, 0x2A, 0x4D, 0x0A, 0x16, + 0x2A, 0x05, 0xA8, 0x13, 0x52, 0x14, 0x15, 0xA8, + 0xEA, 0x57, 0xBA, 0x01, 0x5D, 0x0A, 0xB1, 0xD2, + 0x03, 0xC8, 0x24, 0x0C, 0x0D, 0xF1, 0xD3, 0x03, + 0x50, 0xE0, 0xF4, 0xE2, 0x54, 0x14, 0x52, 0xC4, + 0x10, 0xAD, 0x05, 0xE5, 0x81, 0x21, 0x62, 0x44, + 0x2C, 0xD8, 0x13, 0xC2, 0x14, 0x14, 0xB8, 0xED, + 0xC0, 0xBB, 0xC0, 0xB9, 0xED, 0xCC, 0x8B, 0x79, + 0x34, 0x0C, 0x1D, 0xD2, 0x44, 0x2C, 0xD2, 0x23, + 0x01, 0xAD, 0x05, 0xB8, 0xDD, 0x0C, 0x1C, 0x25, + 0xAD, 0x21, 0xE8, 0x13, 0xE8, 0xEE, 0x56, 0x8E, + 0xFA, 0x1D, 0xF0, 0x00, 0x00, 0xAD, 0x02, 0x65, + 0x72, 0x2A, 0x1D, 0xF0, 0x00, 0x36, 0x41, 0x00, + 0xB2, 0xC2, 0xF0, 0xA2, 0xC3, 0x20, 0xA5, 0x7F, + 0x2A, 0xA2, 0xC3, 0x14, 0xE5, 0xF3, 0x2C, 0x1D, + 0xF0, 0x36, 0x41, 0x00, 0x0C, 0x0A, 0xBD, 0x02, + 0xC1, 0xD4, 0x03, 0x65, 0x9B, 0x21, 0xA9, 0xD2, + 0x26, 0x0A, 0x05, 0x0C, 0x02, 0x1D, 0xF0, 0x00, + 0x00, 0x22, 0xA4, 0x6E, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x36, 0x41, 0x00, 0xA2, 0xA0, 0x03, 0xB1, + 0xD5, 0x03, 0xE5, 0xEA, 0x2C, 0x92, 0xA0, 0x60, + 0x81, 0xC8, 0x03, 0xB8, 0xB2, 0xA2, 0x22, 0x10, + 0xA9, 0xF2, 0xB2, 0x52, 0x26, 0xB2, 0x52, 0x25, + 0x0C, 0x8B, 0xC0, 0x20, 0x00, 0xF2, 0x28, 0x81, + 0xC0, 0x20, 0x00, 0xE8, 0xF2, 0x90, 0xFF, 0x20, + 0xF2, 0x68, 0x81, 0xE2, 0x0E, 0x00, 0xC0, 0x20, + 0x00, 0xC8, 0xF2, 0xF1, 0xD6, 0x03, 0x1B, 0xCC, + 0xE2, 0x5F, 0x80, 0xD2, 0x12, 0x25, 0xC9, 0xF2, + 0x0B, 0xDD, 0xD2, 0x52, 0x25, 0x80, 0x61, 0x00, + 0x9D, 0x08, 0xA0, 0xE4, 0x03, 0xB0, 0xAA, 0x20, + 0xA0, 0xE4, 0x13, 0x80, 0xE6, 0x13, 0x10, 0x20, + 0x00, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x61, 0x00, + 0xC0, 0x20, 0x00, 0xC1, 0xD6, 0x03, 0xF1, 0xC8, + 0x03, 0xE1, 0xC3, 0x03, 0xA2, 0x2F, 0x82, 0xB8, + 0x1E, 0x17, 0x6A, 0x14, 0x92, 0x1B, 0x26, 0x16, + 0xE9, 0x00, 0x82, 0xC9, 0xFF, 0xC0, 0x20, 0x00, + 0xD2, 0x1C, 0x80, 0xD2, 0x51, 0x00, 0x82, 0x5B, + 0x26, 0x92, 0x1B, 0x25, 0x07, 0xEA, 0x07, 0x8C, + 0xA9, 0x82, 0x0B, 0x4E, 0x26, 0x48, 0x41, 0x8C, + 0x29, 0x1D, 0xF0, 0x00, 0x00, 0x92, 0x1B, 0x26, + 0x56, 0x59, 0xFF, 0xC0, 0x20, 0x00, 0x0C, 0x5D, + 0x92, 0xAF, 0x9F, 0x82, 0x2F, 0x81, 0xC0, 0x20, + 0x00, 0x90, 0x88, 0x10, 0x82, 0x6F, 0x81, 0x7C, + 0x7F, 0xA0, 0x61, 0x00, 0xCD, 0x0A, 0xE0, 0xE4, + 0x03, 0xF0, 0xEE, 0x10, 0xE0, 0xE4, 0x13, 0xA0, + 0xE6, 0x13, 0x10, 0x20, 0x00, 0xD2, 0x4B, 0x4E, + 0xA2, 0xCB, 0x14, 0xE5, 0xE3, 0x2C, 0x1D, 0xF0, + 0x00, 0xD8, 0xFB, 0xD2, 0x0D, 0x00, 0xC0, 0x20, + 0x00, 0xA8, 0xFB, 0xD2, 0x5C, 0x80, 0x1B, 0xAA, + 0xA9, 0xFB, 0xB8, 0x1E, 0x92, 0x1B, 0x25, 0x0B, + 0x99, 0x90, 0x90, 0xF4, 0x92, 0x5B, 0x25, 0x06, + 0xE7, 0xFF, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x92, 0xA0, 0x06, 0xB1, 0xC8, 0x03, 0xC0, 0x20, + 0x00, 0x82, 0x2B, 0x82, 0x0C, 0x0A, 0x17, 0x68, + 0x0B, 0x92, 0xC9, 0xFF, 0xC0, 0x20, 0x00, 0xC2, + 0x2B, 0x80, 0x56, 0x89, 0xFE, 0xC0, 0x20, 0x00, + 0xA2, 0xC2, 0x14, 0x0C, 0x8D, 0xE2, 0xA0, 0x04, + 0xE2, 0x6B, 0x84, 0xD2, 0x42, 0x4E, 0x25, 0xDE, + 0x2C, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x31, 0xD7, 0x03, 0x21, 0xD8, 0x03, 0x22, 0x63, + 0x75, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, + 0xA1, 0xD9, 0x03, 0xB1, 0xDA, 0x03, 0xC1, 0xDB, + 0x03, 0xE5, 0x37, 0x2D, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x16, 0xA5, 0x01, 0x20, + 0x61, 0x00, 0x25, 0xA4, 0xFF, 0x20, 0xE6, 0x13, + 0x10, 0x20, 0x00, 0xA2, 0xA0, 0x00, 0x65, 0x72, + 0x29, 0xA1, 0xDC, 0x03, 0xB1, 0xDD, 0x03, 0xE5, + 0xFF, 0x2C, 0x1D, 0xF0, 0x00, 0x36, 0x41, 0x00, + 0xA1, 0xDE, 0x03, 0xB1, 0xDE, 0x03, 0x65, 0xFC, + 0x20, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, + 0xCD, 0x04, 0x81, 0xDF, 0x03, 0xBD, 0x03, 0x88, + 0x08, 0xAD, 0x02, 0xCC, 0xF8, 0x8C, 0xD3, 0xD1, + 0xC9, 0x03, 0xF1, 0xE0, 0x03, 0x98, 0x1D, 0xE8, + 0x2D, 0xE9, 0x0F, 0x92, 0x6D, 0x02, 0xE5, 0x65, + 0x29, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, + 0xC1, 0xE0, 0x03, 0xAD, 0x02, 0x98, 0x0C, 0x0C, + 0x0B, 0x8C, 0x59, 0x81, 0xC9, 0x03, 0xB9, 0x0C, + 0x99, 0x28, 0xE5, 0x70, 0x29, 0x1D, 0xF0, 0x00, + 0x00, 0x36, 0x41, 0x00, 0xD1, 0xE2, 0x03, 0x91, + 0xE3, 0x03, 0xB0, 0x82, 0x11, 0xA1, 0xE1, 0x03, + 0xB2, 0xAE, 0xF0, 0xBA, 0xAA, 0xAA, 0xA8, 0x9A, + 0x88, 0xC8, 0x0A, 0xC0, 0x20, 0x00, 0xB8, 0x7C, + 0xC0, 0x20, 0x00, 0xD0, 0xBB, 0x10, 0xB9, 0x7C, + 0x82, 0x08, 0x7F, 0x0C, 0x09, 0x8C, 0x18, 0xE5, + 0x5B, 0x21, 0x1D, 0xF0, 0x00, 0x36, 0x41, 0x00, + 0x21, 0xE4, 0x03, 0x31, 0xE5, 0x03, 0x28, 0x22, + 0x29, 0x03, 0x1D, 0xF0, 0x00, 0x36, 0x41, 0x00, + 0x21, 0xE6, 0x03, 0x88, 0x02, 0x27, 0x98, 0x02, + 0x1D, 0xF0, 0x00, 0x20, 0xA2, 0x20, 0x25, 0x08, + 0x00, 0xAD, 0x02, 0xE5, 0xC5, 0x20, 0x1D, 0xF0, + 0x00, 0x36, 0x41, 0x00, 0x20, 0x61, 0x00, 0xA1, + 0xE6, 0x03, 0xE5, 0xC4, 0x20, 0xA5, 0x0B, 0x24, + 0x20, 0xE6, 0x13, 0x10, 0x20, 0x00, 0x1D, 0xF0, + 0x00, 0x36, 0x41, 0x00, 0x41, 0xE7, 0x03, 0x21, + 0xE8, 0x03, 0xC0, 0x20, 0x00, 0x32, 0x22, 0x81, + 0x98, 0x54, 0x88, 0x34, 0x30, 0x99, 0x20, 0x99, + 0x54, 0x87, 0x83, 0x39, 0x0C, 0x1C, 0xB2, 0xA0, + 0x38, 0xA2, 0x24, 0x04, 0xC0, 0x20, 0x00, 0xB0, + 0xAA, 0x10, 0xA2, 0x62, 0x80, 0xC0, 0x20, 0x00, + 0xD2, 0x22, 0x81, 0xD0, 0xE0, 0x04, 0x07, 0xED, + 0xF3, 0xC0, 0x20, 0x00, 0xB1, 0xE9, 0x03, 0x32, + 0x62, 0x81, 0xC0, 0x20, 0x00, 0xB8, 0x0B, 0xA1, + 0xEA, 0x03, 0x1B, 0xBB, 0xB9, 0x4A, 0x4B, 0xAA, + 0xA5, 0xBD, 0x20, 0x1D, 0xF0, 0x00, 0x0C, 0x0C, + 0xC9, 0x34, 0xE5, 0xC4, 0x21, 0xC6, 0xEE, 0xFF, + 0x00, 0x36, 0x41, 0x00, 0x20, 0x61, 0x00, 0x3C, + 0x8A, 0x0C, 0x0B, 0x65, 0x08, 0x24, 0x20, 0xE6, + 0x13, 0x10, 0x20, 0x00, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x00, 0xD0, 0x0F, 0x02, + 0x60, 0xD8, 0x11, 0x02, 0x60, 0x00, 0x12, 0x02, + 0x60, 0x3C, 0x12, 0x02, 0x60, 0x54, 0x13, 0x02, + 0x60, 0x20, 0x12, 0x02, 0x60, 0xCC, 0x13, 0x02, + 0x60, 0xE0, 0x13, 0x02, 0x60, 0x00, 0x14, 0x02, + 0x60, 0x64, 0x14, 0x02, 0x60, 0x04, 0x15, 0x02, + 0x60, 0xC8, 0x16, 0x00, 0x60, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x16, 0x02, + 0x60, 0x08, 0x17, 0x00, 0x60, 0x08, 0x17, 0x00, + 0x60, 0x04, 0x17, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x00, 0xD0, 0x16, 0x00, 0x60, 0xD4, 0x16, 0x00, + 0x60, 0x2C, 0x17, 0x00, 0x60, 0x50, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x0C, 0x00, + 0x60, 0xD4, 0x0C, 0x00, 0x60, 0x19, 0x30, 0x00, + 0x00, 0x40, 0x17, 0x00, 0x60, 0x10, 0x01, 0x00, + 0x00, 0xB0, 0x0A, 0x00, 0x60, 0x60, 0x15, 0x02, + 0x60, 0x34, 0x0D, 0x00, 0x60, 0x10, 0x03, 0x02, + 0x28, 0x18, 0x00, 0x02, 0x28, 0x14, 0x03, 0x02, + 0x28, 0xBC, 0x08, 0x00, 0x60, 0x94, 0x15, 0x02, + 0x60, 0xBC, 0x15, 0x02, 0x60, 0xA4, 0x05, 0x00, + 0x60, 0xD8, 0x15, 0x02, 0x60, 0xA8, 0x0B, 0x00, + 0x60, 0xF8, 0x16, 0x00, 0x60, 0xAC, 0x06, 0x00, + 0x60, 0x38, 0x16, 0x02, 0x60, 0x50, 0x16, 0x02, + 0x60, 0xD8, 0x56, 0x04, 0x60, 0x36, 0x41, 0x00, + 0x81, 0xCF, 0x05, 0xB1, 0xCD, 0x05, 0xA2, 0xA0, + 0x03, 0x91, 0xCE, 0x05, 0xA2, 0x4B, 0x00, 0x82, + 0x69, 0x00, 0xE5, 0x01, 0x00, 0xA5, 0x08, 0x00, + 0x25, 0x05, 0x00, 0x25, 0x06, 0x00, 0x25, 0x02, + 0x00, 0xA5, 0x06, 0x00, 0xA1, 0xD0, 0x05, 0xB1, + 0xD1, 0x05, 0x25, 0xDC, 0x2C, 0x1D, 0xF0, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x31, 0xD2, 0x05, 0x21, + 0xD3, 0x05, 0x22, 0x63, 0x75, 0x1D, 0xF0, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x91, 0xD4, 0x05, 0x92, + 0x09, 0x47, 0x26, 0x19, 0x04, 0x26, 0x29, 0x0C, + 0x1D, 0xF0, 0xA1, 0xD5, 0x05, 0xB1, 0xD6, 0x05, + 0xE5, 0xD6, 0x20, 0x1D, 0xF0, 0xA1, 0xD5, 0x05, + 0xB1, 0xD7, 0x05, 0x25, 0xD6, 0x20, 0x1D, 0xF0, + 0x00, 0x36, 0x41, 0x00, 0x81, 0xD9, 0x05, 0x31, + 0xD8, 0x05, 0x21, 0xDA, 0x05, 0x29, 0x43, 0x89, + 0x03, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x31, 0xDB, 0x05, 0x21, 0xDC, 0x05, 0x22, 0x63, + 0x13, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x31, 0xDD, 0x05, 0x21, 0xDE, 0x05, 0x48, 0x03, + 0x49, 0x22, 0x29, 0x03, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x91, 0xE0, 0x05, 0x21, + 0xE2, 0x05, 0x31, 0xDF, 0x05, 0x81, 0xE1, 0x05, + 0x89, 0xC3, 0x29, 0xA3, 0x99, 0xB3, 0x1D, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x04, 0x00, 0x8C, 0x17, 0x02, + 0x60, }; static const unsigned char vfs301_06_2[] = { /* 1905 B */ - 0x06, 0x00, 0x00, 0x64, 0x07, 0x00, 0x0F, 0x00, - 0x60, 0xD8, 0x0C, 0x00, 0x60, 0xD4, 0x0C, 0x00, - 0x60, 0x50, 0x15, 0x00, 0x60, 0x20, 0x0E, 0x00, - 0x60, 0xFC, 0xFF, 0x00, 0x00, 0x30, 0x15, 0x00, - 0x60, 0xB0, 0x0A, 0x00, 0x60, 0x58, 0xB3, 0x04, - 0x60, 0x84, 0x05, 0x00, 0x60, 0xA4, 0xED, 0x04, - 0x60, 0x8C, 0x04, 0x00, 0x00, 0x00, 0x0F, 0x00, - 0x60, 0x60, 0x06, 0x00, 0x00, 0xA0, 0x0A, 0x00, - 0x60, 0xD0, 0x38, 0x04, 0x60, 0xB4, 0x39, 0x04, - 0x60, 0x58, 0xB4, 0x04, 0x60, 0xFC, 0x0C, 0x00, - 0x60, 0x20, 0x15, 0x00, 0x60, 0xC8, 0x0D, 0x00, - 0x60, 0x9C, 0x0B, 0x00, 0x60, 0xFC, 0x14, 0x00, - 0x60, 0xCC, 0x08, 0x00, 0x60, 0x68, 0x0A, 0x00, - 0x60, 0x4C, 0x3F, 0x04, 0x60, 0xC0, 0x0D, 0x00, - 0x60, 0x04, 0x15, 0x00, 0x60, 0x18, 0x0D, 0x00, - 0x60, 0x00, 0x9E, 0x00, 0x38, 0xDC, 0x0C, 0x00, - 0x60, 0x00, 0x15, 0x00, 0x60, 0x36, 0x41, 0x00, - 0x25, 0x37, 0x00, 0x65, 0x3A, 0x00, 0xA5, 0x4C, - 0x00, 0xE5, 0x48, 0x00, 0x65, 0x35, 0x00, 0x91, - 0xC0, 0x03, 0xA1, 0xC1, 0x03, 0x0C, 0x08, 0x89, - 0x0A, 0x82, 0x49, 0x00, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x31, 0xC2, 0x03, 0x38, - 0x03, 0x8C, 0x73, 0x88, 0x23, 0x66, 0x28, 0x03, - 0x0C, 0x39, 0x99, 0x23, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x31, 0xC3, 0x03, 0x0C, - 0x02, 0x22, 0x43, 0x00, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x36, 0x41, 0x00, 0xBD, 0x02, 0x21, 0xC2, - 0x03, 0x28, 0x02, 0x1C, 0x8C, 0xCB, 0xA2, 0xA5, - 0x8F, 0x2D, 0xD1, 0xC4, 0x03, 0x2C, 0x0B, 0x92, - 0x12, 0x11, 0x0C, 0x1C, 0xDC, 0x79, 0xA2, 0x12, - 0x0F, 0x92, 0x12, 0x0E, 0xA0, 0xA0, 0xE4, 0x90, - 0xAA, 0xC0, 0xA2, 0xCA, 0xC2, 0xA0, 0xA1, 0x21, - 0xAA, 0x99, 0x8B, 0x99, 0x92, 0x52, 0x11, 0xB2, - 0x52, 0x13, 0xC9, 0x22, 0xD0, 0xD9, 0x10, 0xD2, - 0x52, 0x11, 0x1D, 0xF0, 0x00, 0x36, 0x41, 0x00, - 0xD8, 0x22, 0x31, 0xC2, 0x03, 0x0C, 0x1E, 0x38, - 0x03, 0x0C, 0x0C, 0xAD, 0x03, 0xF2, 0x13, 0x13, - 0xB2, 0x13, 0x10, 0xF0, 0xCE, 0x83, 0xDA, 0xBB, - 0x25, 0x17, 0x00, 0x0C, 0x45, 0xA8, 0x23, 0x92, - 0x13, 0x13, 0x0C, 0x04, 0x8C, 0x69, 0x0B, 0x99, - 0x90, 0x90, 0xF4, 0x92, 0x53, 0x13, 0xF6, 0x8A, - 0x2F, 0xB1, 0xC5, 0x03, 0xB0, 0xBA, 0xA0, 0xB8, - 0x0B, 0xA0, 0x0B, 0x00, 0xC8, 0x22, 0xB2, 0x13, - 0x11, 0xAD, 0x03, 0xCA, 0xBB, 0x65, 0x21, 0x00, - 0xD2, 0x13, 0x06, 0xF1, 0xC3, 0x03, 0xD7, 0x3A, - 0x0F, 0x0C, 0x29, 0x92, 0x4F, 0x00, 0xE2, 0x13, - 0x0F, 0xE0, 0xEF, 0x04, 0x16, 0xBE, 0x10, 0x99, - 0x23, 0x0C, 0x14, 0x2D, 0x04, 0x1D, 0xF0, 0x49, - 0x23, 0x0C, 0x24, 0x06, 0xFD, 0xFF, 0xAD, 0x03, - 0xE5, 0x1B, 0x00, 0x82, 0x13, 0x09, 0xB2, 0x13, - 0x08, 0x87, 0x3A, 0x02, 0x06, 0x24, 0x00, 0xC8, - 0x22, 0xB2, 0x13, 0x11, 0xAD, 0x03, 0xCA, 0xBB, - 0x65, 0x1D, 0x00, 0xD2, 0x13, 0x07, 0xD7, 0x3A, - 0x02, 0xC6, 0x36, 0x00, 0xE2, 0x13, 0x14, 0x0B, - 0xEE, 0xE0, 0xE0, 0xF4, 0xE2, 0x53, 0x14, 0x56, - 0xEE, 0x0D, 0x0C, 0x24, 0x0C, 0x7F, 0xF9, 0x23, - 0xC6, 0xED, 0xFF, 0xAD, 0x03, 0xE5, 0x17, 0x00, - 0x82, 0x13, 0x08, 0x87, 0x3A, 0x6A, 0x59, 0x23, - 0x42, 0x53, 0x16, 0x92, 0x13, 0x0A, 0x92, 0x53, - 0x14, 0x0C, 0x04, 0x06, 0xE7, 0xFF, 0xAD, 0x03, - 0x65, 0x16, 0x00, 0xB2, 0x13, 0x08, 0xB7, 0x3A, - 0x29, 0xC2, 0x13, 0x14, 0x0B, 0xCC, 0xC0, 0xC0, - 0xF4, 0xC2, 0x53, 0x14, 0xEC, 0xBC, 0x0C, 0x6D, - 0xE2, 0x13, 0x0B, 0xE2, 0x53, 0x14, 0xD9, 0x23, - 0xC6, 0x07, 0x00, 0xDC, 0xC9, 0x59, 0x23, 0x42, - 0x53, 0x16, 0xF2, 0x13, 0x0A, 0xF2, 0x53, 0x14, - 0xC6, 0x03, 0x00, 0x0C, 0x58, 0x92, 0x13, 0x0D, - 0xA2, 0x13, 0x0C, 0xA2, 0x53, 0x14, 0x92, 0x53, - 0x15, 0x89, 0x23, 0x0C, 0x04, 0x86, 0xD4, 0xFF, - 0xB7, 0x3A, 0x05, 0xC2, 0x13, 0x0B, 0xC2, 0x53, - 0x14, 0x42, 0x53, 0x16, 0x0C, 0x04, 0x46, 0xD0, - 0xFF, 0x92, 0x13, 0x15, 0x66, 0x19, 0x09, 0x0C, - 0x34, 0x0B, 0xD9, 0xD2, 0x53, 0x15, 0x46, 0xCC, - 0xFF, 0xCC, 0x39, 0x0C, 0x14, 0x86, 0x01, 0x00, - 0x0C, 0x04, 0x0B, 0xE9, 0xE2, 0x53, 0x15, 0xC8, - 0x22, 0xB2, 0x13, 0x11, 0xAD, 0x03, 0xCA, 0xBB, - 0x65, 0x11, 0x00, 0xD2, 0x13, 0x07, 0xD7, 0xBA, - 0x10, 0xE2, 0x13, 0x14, 0x0B, 0xEE, 0xE0, 0xE0, - 0xF4, 0xE2, 0x53, 0x14, 0xE0, 0x45, 0x83, 0x06, - 0xC0, 0xFF, 0xF2, 0x13, 0x0D, 0xF2, 0x53, 0x14, - 0xC6, 0xBD, 0xFF, 0x0C, 0x39, 0x86, 0xBB, 0xFF, - 0x82, 0x13, 0x06, 0x87, 0x3A, 0x05, 0x92, 0x13, - 0x0B, 0x92, 0x53, 0x14, 0x0C, 0x04, 0x46, 0xB8, - 0xFF, 0x0C, 0x04, 0x06, 0xB7, 0xFF, 0x00, 0x00, - 0x00, 0x36, 0x61, 0x00, 0xB2, 0xA0, 0x94, 0xA2, - 0xC2, 0x34, 0x92, 0xC2, 0x54, 0x99, 0x01, 0xA9, - 0x11, 0xBC, 0xB4, 0x68, 0x11, 0x5D, 0x09, 0x1C, - 0x04, 0x72, 0x12, 0x12, 0x82, 0xA0, 0x94, 0xC0, - 0x77, 0x11, 0x7A, 0x72, 0x8A, 0x77, 0x82, 0x16, - 0x00, 0xB2, 0x07, 0x00, 0x1B, 0x77, 0xAD, 0x0B, - 0xB0, 0x88, 0xC0, 0x82, 0x56, 0x00, 0x2B, 0x66, - 0x65, 0x96, 0x2D, 0x98, 0x05, 0x0B, 0x44, 0xA0, - 0x99, 0xC0, 0x99, 0x05, 0x4B, 0x55, 0x56, 0xC4, - 0xFD, 0x98, 0x01, 0xA8, 0x11, 0xB2, 0xA0, 0x94, - 0x5D, 0x09, 0x6D, 0x0A, 0x72, 0x12, 0x12, 0x1C, - 0x04, 0xC0, 0x77, 0x11, 0x7A, 0x72, 0xBA, 0x77, - 0xD2, 0x03, 0x01, 0xE2, 0x03, 0x03, 0xC2, 0x03, - 0x02, 0xB2, 0x03, 0x00, 0xEA, 0xCC, 0xDA, 0xBB, - 0xCA, 0xBB, 0xB0, 0xB2, 0x41, 0xAD, 0x0B, 0xB2, - 0x47, 0x00, 0x82, 0x16, 0x00, 0x1B, 0x77, 0xBA, - 0x88, 0x82, 0x56, 0x00, 0x2B, 0x66, 0x65, 0x91, - 0x2D, 0x8B, 0x33, 0xF8, 0x05, 0x0B, 0x44, 0xAA, - 0xFF, 0xF9, 0x05, 0x4B, 0x55, 0x56, 0x74, 0xFC, - 0x82, 0x12, 0x12, 0x1B, 0x88, 0x80, 0x80, 0x44, - 0x82, 0x52, 0x12, 0x1D, 0xF0, 0x36, 0x41, 0x00, - 0x32, 0xC2, 0x34, 0x1C, 0x05, 0x0C, 0x04, 0xB2, - 0x13, 0x00, 0xAD, 0x0B, 0xA5, 0x8E, 0x2D, 0x2B, - 0x33, 0x0B, 0x55, 0xA0, 0x95, 0x41, 0x82, 0x22, - 0x15, 0x4B, 0x22, 0x90, 0x88, 0xC0, 0x80, 0x85, - 0x41, 0x8A, 0x44, 0x56, 0x05, 0xFE, 0x40, 0x24, - 0x41, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x1C, 0x07, 0x0C, 0x06, 0x0C, 0x05, 0xB2, 0xC3, - 0x81, 0x42, 0x03, 0x00, 0xB2, 0x0B, 0x7E, 0xC2, - 0x03, 0x01, 0x47, 0xBB, 0x0C, 0x47, 0xBC, 0x11, - 0x4D, 0x0B, 0xC7, 0xBB, 0x0C, 0x4D, 0x0C, 0xC6, - 0x01, 0x00, 0x47, 0x3C, 0x04, 0xC7, 0xBB, 0x01, - 0x4D, 0x0B, 0xAD, 0x04, 0xBD, 0x04, 0x65, 0x89, - 0x2D, 0xAA, 0x66, 0x5A, 0x54, 0x0B, 0x77, 0x4B, - 0x33, 0xB2, 0xC3, 0x81, 0x56, 0x97, 0xFC, 0xAD, - 0x05, 0xBD, 0x05, 0x25, 0x88, 0x2D, 0xD2, 0x12, - 0x16, 0xA0, 0x94, 0x41, 0x90, 0x96, 0xC0, 0xD0, - 0xCD, 0xF0, 0x90, 0x94, 0x41, 0x90, 0xE3, 0x41, - 0xC0, 0xC3, 0x21, 0xEA, 0xCC, 0xD0, 0x9C, 0x93, - 0x92, 0x52, 0x16, 0x2D, 0x09, 0x1D, 0xF0, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x31, 0xC6, 0x03, 0x21, - 0xC7, 0x03, 0x22, 0x63, 0x75, 0x1D, 0xF0, 0x00, - 0x00, 0x36, 0x41, 0x00, 0xA1, 0xC8, 0x03, 0xB1, - 0xC9, 0x03, 0xC1, 0xCA, 0x03, 0xA5, 0x5D, 0x2D, - 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x9C, 0x85, 0x20, 0x61, 0x00, 0xE5, 0xC6, 0xFF, - 0x20, 0xE6, 0x13, 0x10, 0x20, 0x00, 0x0C, 0x0A, - 0x65, 0x98, 0x29, 0xA1, 0xCB, 0x03, 0xB1, 0xCC, - 0x03, 0xA5, 0x25, 0x2D, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x0C, 0xBB, 0x31, 0xC6, - 0x03, 0x21, 0xD0, 0x03, 0x81, 0xCF, 0x03, 0x91, - 0xCD, 0x03, 0xA1, 0xCE, 0x03, 0xA9, 0xF9, 0x82, - 0x69, 0x19, 0x22, 0x63, 0x6B, 0xB2, 0x59, 0x1C, - 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x21, 0xD1, 0x03, 0x88, 0x22, 0x37, 0x68, 0x0E, - 0xA1, 0xD2, 0x03, 0xA5, 0x4D, 0x2D, 0x98, 0x22, - 0x6C, 0x7A, 0xA0, 0x99, 0x10, 0x99, 0x22, 0xE5, - 0x79, 0x22, 0x1D, 0xF0, 0x00, 0x36, 0x41, 0x00, - 0xCD, 0x04, 0xBD, 0x03, 0xAD, 0x02, 0xDD, 0x05, - 0x25, 0x0E, 0x2A, 0xAC, 0x15, 0x81, 0xD3, 0x03, - 0xA1, 0xD4, 0x03, 0x88, 0x08, 0x91, 0xD1, 0x03, - 0x82, 0x08, 0x02, 0x98, 0x29, 0xB6, 0x28, 0x06, - 0x91, 0xD5, 0x03, 0x99, 0x2A, 0x1D, 0xF0, 0x37, - 0x69, 0x05, 0x91, 0xD6, 0x03, 0x86, 0xFC, 0xFF, - 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, - 0xBD, 0x03, 0xAD, 0x02, 0xCD, 0x04, 0xDD, 0x05, - 0x1C, 0x8E, 0x25, 0x71, 0x22, 0xBC, 0x16, 0x82, - 0x12, 0x1A, 0x5A, 0xA4, 0xEC, 0xA8, 0x1C, 0x79, - 0xA7, 0x39, 0x28, 0x92, 0xA4, 0x21, 0x92, 0x52, - 0x1A, 0x06, 0x05, 0x00, 0xA1, 0xD2, 0x03, 0x25, - 0x42, 0x2D, 0xA8, 0x82, 0xE5, 0xBF, 0xFF, 0xB1, - 0xD1, 0x03, 0xA8, 0x2B, 0x30, 0xAA, 0x20, 0xA9, - 0x2B, 0xA8, 0x82, 0xA5, 0x05, 0x2D, 0x0C, 0x0B, - 0xB9, 0x82, 0x1D, 0xF0, 0x1C, 0x83, 0xA7, 0xB3, - 0xDA, 0x92, 0xA4, 0x22, 0x86, 0xF3, 0xFF, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x8C, 0x36, 0x0C, 0x03, - 0x32, 0x52, 0x1A, 0x1D, 0xF0, 0x36, 0x41, 0x00, - 0xA5, 0xB9, 0xFF, 0xAD, 0x02, 0x81, 0xD6, 0x03, - 0x89, 0x22, 0xE5, 0x8C, 0x29, 0x1D, 0xF0, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x31, 0xD7, 0x03, 0x21, - 0xD8, 0x03, 0x29, 0x13, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x81, 0xD9, 0x03, 0x30, - 0x61, 0x00, 0x88, 0x08, 0x82, 0x08, 0x10, 0x26, - 0x48, 0x07, 0xAD, 0x02, 0xA5, 0x54, 0x28, 0x06, - 0x01, 0x00, 0x0C, 0x0A, 0xE5, 0xED, 0x20, 0x30, - 0xE6, 0x13, 0x10, 0x20, 0x00, 0x1D, 0xF0, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x21, 0xDA, 0x03, 0x88, - 0x02, 0x27, 0x18, 0x09, 0xAD, 0x02, 0xE5, 0x07, - 0x00, 0xAD, 0x02, 0xE5, 0xE2, 0x20, 0x1D, 0xF0, - 0x00, 0x36, 0x41, 0x00, 0x20, 0x61, 0x00, 0xA1, - 0xDA, 0x03, 0xE5, 0xE1, 0x20, 0xA5, 0x28, 0x24, - 0x20, 0xE6, 0x13, 0x10, 0x20, 0x00, 0x1D, 0xF0, - 0x00, 0x36, 0x41, 0x00, 0x41, 0xDB, 0x03, 0x21, - 0xDC, 0x03, 0xC0, 0x20, 0x00, 0x32, 0x22, 0x81, - 0x98, 0x54, 0x88, 0x34, 0x30, 0x99, 0x20, 0x99, - 0x54, 0x87, 0x03, 0x06, 0x0C, 0x0A, 0xA9, 0x34, - 0xA5, 0xE5, 0x21, 0x0C, 0x1D, 0x3C, 0x8C, 0xB8, - 0x44, 0xC0, 0x20, 0x00, 0xC0, 0xBB, 0x10, 0xB2, - 0x62, 0x80, 0xC0, 0x20, 0x00, 0xE2, 0x22, 0x81, - 0xE0, 0xF0, 0x04, 0x07, 0xEE, 0xF3, 0xC0, 0x20, - 0x00, 0xB1, 0xDD, 0x03, 0x32, 0x62, 0x81, 0xC0, - 0x20, 0x00, 0xB8, 0x0B, 0xA1, 0xDE, 0x03, 0x1B, - 0xBB, 0xB9, 0x4A, 0x4B, 0xAA, 0x25, 0xDA, 0x20, - 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x20, 0x61, 0x00, 0x3C, 0x8A, 0x0C, 0x0B, 0xA5, - 0x25, 0x24, 0x20, 0xE6, 0x13, 0x10, 0x20, 0x00, - 0x1D, 0xF0, 0x00, 0x00, 0x00, 0xB8, 0x0F, 0x02, - 0x60, 0xC0, 0x0F, 0x02, 0x60, 0x04, 0x14, 0x02, - 0x60, 0xDC, 0x14, 0x02, 0x60, 0x04, 0x15, 0x00, - 0x60, 0x04, 0x15, 0x00, 0x60, 0x00, 0x15, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xF4, 0x14, 0x00, 0x60, 0xF8, 0x14, 0x00, - 0x60, 0x50, 0x15, 0x00, 0x60, 0x94, 0x02, 0x00, - 0x00, 0x78, 0x10, 0x02, 0x60, 0x53, 0x10, 0x02, - 0x60, 0x78, 0x10, 0x02, 0x60, 0x02, 0x11, 0x02, - 0x60, 0xDD, 0x10, 0x02, 0x60, 0xC2, 0x10, 0x02, - 0x60, 0x85, 0x10, 0x02, 0x60, 0x7E, 0x10, 0x02, - 0x60, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x0C, 0x00, - 0x60, 0xD4, 0x0C, 0x00, 0x60, 0x10, 0x30, 0x02, - 0x00, 0x60, 0x15, 0x00, 0x60, 0x00, 0x01, 0x00, - 0x00, 0xB0, 0x0A, 0x00, 0x60, 0x04, 0x13, 0x02, - 0x60, 0xA0, 0x0A, 0x00, 0x60, 0xA4, 0x13, 0x02, - 0x60, 0xF8, 0x13, 0x02, 0x60, 0x6C, 0x13, 0x02, - 0x60, 0x6C, 0x06, 0x00, 0x60, 0x14, 0x10, 0x02, - 0x60, 0xF4, 0x05, 0x00, 0x60, 0x4C, 0x13, 0x02, - 0x60, 0x68, 0x0A, 0x00, 0x60, 0x28, 0x8F, 0x04, - 0x60, 0x48, 0x08, 0x00, 0x60, 0x28, 0x14, 0x02, - 0x60, 0xAC, 0x06, 0x00, 0x60, 0x68, 0x14, 0x02, - 0x60, 0x80, 0x14, 0x02, 0x60, 0xD8, 0x56, 0x04, - 0x60, 0x36, 0x41, 0x00, 0x81, 0x57, 0x05, 0xB1, - 0x55, 0x05, 0x0C, 0x3A, 0x91, 0x56, 0x05, 0xA2, - 0x4B, 0x00, 0x89, 0x09, 0xE5, 0x01, 0x00, 0xE5, - 0x05, 0x00, 0xA5, 0x06, 0x00, 0x65, 0x07, 0x00, - 0x25, 0x02, 0x00, 0xA1, 0x58, 0x05, 0xB1, 0x59, - 0x05, 0x25, 0xFA, 0x2C, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x31, 0x5A, 0x05, 0x21, - 0x5B, 0x05, 0x22, 0x63, 0x75, 0x1D, 0xF0, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x0C, 0x8F, 0xB1, 0x5A, - 0x05, 0xA1, 0x5F, 0x05, 0x91, 0x60, 0x05, 0x81, - 0x61, 0x05, 0x31, 0x62, 0x05, 0x21, 0x63, 0x05, - 0xC1, 0x5E, 0x05, 0xD1, 0x5C, 0x05, 0xE1, 0x5D, - 0x05, 0xE9, 0xFD, 0xC2, 0x6D, 0x19, 0x29, 0x83, - 0x89, 0x39, 0xA2, 0x6B, 0x6B, 0xF2, 0x5D, 0x1C, - 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x31, 0x64, 0x05, 0x21, 0x65, 0x05, 0x29, 0x13, - 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x31, 0x66, 0x05, 0x21, 0x67, 0x05, 0x22, 0x63, - 0x19, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x91, 0x69, 0x05, 0x21, 0x6B, 0x05, 0x31, 0x68, - 0x05, 0x81, 0x6A, 0x05, 0x89, 0xC3, 0x29, 0xA3, - 0x99, 0xB3, 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x04, 0x00, 0xB0, 0x15, 0x02, - 0x60, + 0x06, 0x00, 0x00, 0x64, 0x07, 0x00, 0x0F, 0x00, + 0x60, 0xD8, 0x0C, 0x00, 0x60, 0xD4, 0x0C, 0x00, + 0x60, 0x50, 0x15, 0x00, 0x60, 0x20, 0x0E, 0x00, + 0x60, 0xFC, 0xFF, 0x00, 0x00, 0x30, 0x15, 0x00, + 0x60, 0xB0, 0x0A, 0x00, 0x60, 0x58, 0xB3, 0x04, + 0x60, 0x84, 0x05, 0x00, 0x60, 0xA4, 0xED, 0x04, + 0x60, 0x8C, 0x04, 0x00, 0x00, 0x00, 0x0F, 0x00, + 0x60, 0x60, 0x06, 0x00, 0x00, 0xA0, 0x0A, 0x00, + 0x60, 0xD0, 0x38, 0x04, 0x60, 0xB4, 0x39, 0x04, + 0x60, 0x58, 0xB4, 0x04, 0x60, 0xFC, 0x0C, 0x00, + 0x60, 0x20, 0x15, 0x00, 0x60, 0xC8, 0x0D, 0x00, + 0x60, 0x9C, 0x0B, 0x00, 0x60, 0xFC, 0x14, 0x00, + 0x60, 0xCC, 0x08, 0x00, 0x60, 0x68, 0x0A, 0x00, + 0x60, 0x4C, 0x3F, 0x04, 0x60, 0xC0, 0x0D, 0x00, + 0x60, 0x04, 0x15, 0x00, 0x60, 0x18, 0x0D, 0x00, + 0x60, 0x00, 0x9E, 0x00, 0x38, 0xDC, 0x0C, 0x00, + 0x60, 0x00, 0x15, 0x00, 0x60, 0x36, 0x41, 0x00, + 0x25, 0x37, 0x00, 0x65, 0x3A, 0x00, 0xA5, 0x4C, + 0x00, 0xE5, 0x48, 0x00, 0x65, 0x35, 0x00, 0x91, + 0xC0, 0x03, 0xA1, 0xC1, 0x03, 0x0C, 0x08, 0x89, + 0x0A, 0x82, 0x49, 0x00, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x31, 0xC2, 0x03, 0x38, + 0x03, 0x8C, 0x73, 0x88, 0x23, 0x66, 0x28, 0x03, + 0x0C, 0x39, 0x99, 0x23, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x31, 0xC3, 0x03, 0x0C, + 0x02, 0x22, 0x43, 0x00, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x36, 0x41, 0x00, 0xBD, 0x02, 0x21, 0xC2, + 0x03, 0x28, 0x02, 0x1C, 0x8C, 0xCB, 0xA2, 0xA5, + 0x8F, 0x2D, 0xD1, 0xC4, 0x03, 0x2C, 0x0B, 0x92, + 0x12, 0x11, 0x0C, 0x1C, 0xDC, 0x79, 0xA2, 0x12, + 0x0F, 0x92, 0x12, 0x0E, 0xA0, 0xA0, 0xE4, 0x90, + 0xAA, 0xC0, 0xA2, 0xCA, 0xC2, 0xA0, 0xA1, 0x21, + 0xAA, 0x99, 0x8B, 0x99, 0x92, 0x52, 0x11, 0xB2, + 0x52, 0x13, 0xC9, 0x22, 0xD0, 0xD9, 0x10, 0xD2, + 0x52, 0x11, 0x1D, 0xF0, 0x00, 0x36, 0x41, 0x00, + 0xD8, 0x22, 0x31, 0xC2, 0x03, 0x0C, 0x1E, 0x38, + 0x03, 0x0C, 0x0C, 0xAD, 0x03, 0xF2, 0x13, 0x13, + 0xB2, 0x13, 0x10, 0xF0, 0xCE, 0x83, 0xDA, 0xBB, + 0x25, 0x17, 0x00, 0x0C, 0x45, 0xA8, 0x23, 0x92, + 0x13, 0x13, 0x0C, 0x04, 0x8C, 0x69, 0x0B, 0x99, + 0x90, 0x90, 0xF4, 0x92, 0x53, 0x13, 0xF6, 0x8A, + 0x2F, 0xB1, 0xC5, 0x03, 0xB0, 0xBA, 0xA0, 0xB8, + 0x0B, 0xA0, 0x0B, 0x00, 0xC8, 0x22, 0xB2, 0x13, + 0x11, 0xAD, 0x03, 0xCA, 0xBB, 0x65, 0x21, 0x00, + 0xD2, 0x13, 0x06, 0xF1, 0xC3, 0x03, 0xD7, 0x3A, + 0x0F, 0x0C, 0x29, 0x92, 0x4F, 0x00, 0xE2, 0x13, + 0x0F, 0xE0, 0xEF, 0x04, 0x16, 0xBE, 0x10, 0x99, + 0x23, 0x0C, 0x14, 0x2D, 0x04, 0x1D, 0xF0, 0x49, + 0x23, 0x0C, 0x24, 0x06, 0xFD, 0xFF, 0xAD, 0x03, + 0xE5, 0x1B, 0x00, 0x82, 0x13, 0x09, 0xB2, 0x13, + 0x08, 0x87, 0x3A, 0x02, 0x06, 0x24, 0x00, 0xC8, + 0x22, 0xB2, 0x13, 0x11, 0xAD, 0x03, 0xCA, 0xBB, + 0x65, 0x1D, 0x00, 0xD2, 0x13, 0x07, 0xD7, 0x3A, + 0x02, 0xC6, 0x36, 0x00, 0xE2, 0x13, 0x14, 0x0B, + 0xEE, 0xE0, 0xE0, 0xF4, 0xE2, 0x53, 0x14, 0x56, + 0xEE, 0x0D, 0x0C, 0x24, 0x0C, 0x7F, 0xF9, 0x23, + 0xC6, 0xED, 0xFF, 0xAD, 0x03, 0xE5, 0x17, 0x00, + 0x82, 0x13, 0x08, 0x87, 0x3A, 0x6A, 0x59, 0x23, + 0x42, 0x53, 0x16, 0x92, 0x13, 0x0A, 0x92, 0x53, + 0x14, 0x0C, 0x04, 0x06, 0xE7, 0xFF, 0xAD, 0x03, + 0x65, 0x16, 0x00, 0xB2, 0x13, 0x08, 0xB7, 0x3A, + 0x29, 0xC2, 0x13, 0x14, 0x0B, 0xCC, 0xC0, 0xC0, + 0xF4, 0xC2, 0x53, 0x14, 0xEC, 0xBC, 0x0C, 0x6D, + 0xE2, 0x13, 0x0B, 0xE2, 0x53, 0x14, 0xD9, 0x23, + 0xC6, 0x07, 0x00, 0xDC, 0xC9, 0x59, 0x23, 0x42, + 0x53, 0x16, 0xF2, 0x13, 0x0A, 0xF2, 0x53, 0x14, + 0xC6, 0x03, 0x00, 0x0C, 0x58, 0x92, 0x13, 0x0D, + 0xA2, 0x13, 0x0C, 0xA2, 0x53, 0x14, 0x92, 0x53, + 0x15, 0x89, 0x23, 0x0C, 0x04, 0x86, 0xD4, 0xFF, + 0xB7, 0x3A, 0x05, 0xC2, 0x13, 0x0B, 0xC2, 0x53, + 0x14, 0x42, 0x53, 0x16, 0x0C, 0x04, 0x46, 0xD0, + 0xFF, 0x92, 0x13, 0x15, 0x66, 0x19, 0x09, 0x0C, + 0x34, 0x0B, 0xD9, 0xD2, 0x53, 0x15, 0x46, 0xCC, + 0xFF, 0xCC, 0x39, 0x0C, 0x14, 0x86, 0x01, 0x00, + 0x0C, 0x04, 0x0B, 0xE9, 0xE2, 0x53, 0x15, 0xC8, + 0x22, 0xB2, 0x13, 0x11, 0xAD, 0x03, 0xCA, 0xBB, + 0x65, 0x11, 0x00, 0xD2, 0x13, 0x07, 0xD7, 0xBA, + 0x10, 0xE2, 0x13, 0x14, 0x0B, 0xEE, 0xE0, 0xE0, + 0xF4, 0xE2, 0x53, 0x14, 0xE0, 0x45, 0x83, 0x06, + 0xC0, 0xFF, 0xF2, 0x13, 0x0D, 0xF2, 0x53, 0x14, + 0xC6, 0xBD, 0xFF, 0x0C, 0x39, 0x86, 0xBB, 0xFF, + 0x82, 0x13, 0x06, 0x87, 0x3A, 0x05, 0x92, 0x13, + 0x0B, 0x92, 0x53, 0x14, 0x0C, 0x04, 0x46, 0xB8, + 0xFF, 0x0C, 0x04, 0x06, 0xB7, 0xFF, 0x00, 0x00, + 0x00, 0x36, 0x61, 0x00, 0xB2, 0xA0, 0x94, 0xA2, + 0xC2, 0x34, 0x92, 0xC2, 0x54, 0x99, 0x01, 0xA9, + 0x11, 0xBC, 0xB4, 0x68, 0x11, 0x5D, 0x09, 0x1C, + 0x04, 0x72, 0x12, 0x12, 0x82, 0xA0, 0x94, 0xC0, + 0x77, 0x11, 0x7A, 0x72, 0x8A, 0x77, 0x82, 0x16, + 0x00, 0xB2, 0x07, 0x00, 0x1B, 0x77, 0xAD, 0x0B, + 0xB0, 0x88, 0xC0, 0x82, 0x56, 0x00, 0x2B, 0x66, + 0x65, 0x96, 0x2D, 0x98, 0x05, 0x0B, 0x44, 0xA0, + 0x99, 0xC0, 0x99, 0x05, 0x4B, 0x55, 0x56, 0xC4, + 0xFD, 0x98, 0x01, 0xA8, 0x11, 0xB2, 0xA0, 0x94, + 0x5D, 0x09, 0x6D, 0x0A, 0x72, 0x12, 0x12, 0x1C, + 0x04, 0xC0, 0x77, 0x11, 0x7A, 0x72, 0xBA, 0x77, + 0xD2, 0x03, 0x01, 0xE2, 0x03, 0x03, 0xC2, 0x03, + 0x02, 0xB2, 0x03, 0x00, 0xEA, 0xCC, 0xDA, 0xBB, + 0xCA, 0xBB, 0xB0, 0xB2, 0x41, 0xAD, 0x0B, 0xB2, + 0x47, 0x00, 0x82, 0x16, 0x00, 0x1B, 0x77, 0xBA, + 0x88, 0x82, 0x56, 0x00, 0x2B, 0x66, 0x65, 0x91, + 0x2D, 0x8B, 0x33, 0xF8, 0x05, 0x0B, 0x44, 0xAA, + 0xFF, 0xF9, 0x05, 0x4B, 0x55, 0x56, 0x74, 0xFC, + 0x82, 0x12, 0x12, 0x1B, 0x88, 0x80, 0x80, 0x44, + 0x82, 0x52, 0x12, 0x1D, 0xF0, 0x36, 0x41, 0x00, + 0x32, 0xC2, 0x34, 0x1C, 0x05, 0x0C, 0x04, 0xB2, + 0x13, 0x00, 0xAD, 0x0B, 0xA5, 0x8E, 0x2D, 0x2B, + 0x33, 0x0B, 0x55, 0xA0, 0x95, 0x41, 0x82, 0x22, + 0x15, 0x4B, 0x22, 0x90, 0x88, 0xC0, 0x80, 0x85, + 0x41, 0x8A, 0x44, 0x56, 0x05, 0xFE, 0x40, 0x24, + 0x41, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x1C, 0x07, 0x0C, 0x06, 0x0C, 0x05, 0xB2, 0xC3, + 0x81, 0x42, 0x03, 0x00, 0xB2, 0x0B, 0x7E, 0xC2, + 0x03, 0x01, 0x47, 0xBB, 0x0C, 0x47, 0xBC, 0x11, + 0x4D, 0x0B, 0xC7, 0xBB, 0x0C, 0x4D, 0x0C, 0xC6, + 0x01, 0x00, 0x47, 0x3C, 0x04, 0xC7, 0xBB, 0x01, + 0x4D, 0x0B, 0xAD, 0x04, 0xBD, 0x04, 0x65, 0x89, + 0x2D, 0xAA, 0x66, 0x5A, 0x54, 0x0B, 0x77, 0x4B, + 0x33, 0xB2, 0xC3, 0x81, 0x56, 0x97, 0xFC, 0xAD, + 0x05, 0xBD, 0x05, 0x25, 0x88, 0x2D, 0xD2, 0x12, + 0x16, 0xA0, 0x94, 0x41, 0x90, 0x96, 0xC0, 0xD0, + 0xCD, 0xF0, 0x90, 0x94, 0x41, 0x90, 0xE3, 0x41, + 0xC0, 0xC3, 0x21, 0xEA, 0xCC, 0xD0, 0x9C, 0x93, + 0x92, 0x52, 0x16, 0x2D, 0x09, 0x1D, 0xF0, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x31, 0xC6, 0x03, 0x21, + 0xC7, 0x03, 0x22, 0x63, 0x75, 0x1D, 0xF0, 0x00, + 0x00, 0x36, 0x41, 0x00, 0xA1, 0xC8, 0x03, 0xB1, + 0xC9, 0x03, 0xC1, 0xCA, 0x03, 0xA5, 0x5D, 0x2D, + 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x9C, 0x85, 0x20, 0x61, 0x00, 0xE5, 0xC6, 0xFF, + 0x20, 0xE6, 0x13, 0x10, 0x20, 0x00, 0x0C, 0x0A, + 0x65, 0x98, 0x29, 0xA1, 0xCB, 0x03, 0xB1, 0xCC, + 0x03, 0xA5, 0x25, 0x2D, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x0C, 0xBB, 0x31, 0xC6, + 0x03, 0x21, 0xD0, 0x03, 0x81, 0xCF, 0x03, 0x91, + 0xCD, 0x03, 0xA1, 0xCE, 0x03, 0xA9, 0xF9, 0x82, + 0x69, 0x19, 0x22, 0x63, 0x6B, 0xB2, 0x59, 0x1C, + 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x21, 0xD1, 0x03, 0x88, 0x22, 0x37, 0x68, 0x0E, + 0xA1, 0xD2, 0x03, 0xA5, 0x4D, 0x2D, 0x98, 0x22, + 0x6C, 0x7A, 0xA0, 0x99, 0x10, 0x99, 0x22, 0xE5, + 0x79, 0x22, 0x1D, 0xF0, 0x00, 0x36, 0x41, 0x00, + 0xCD, 0x04, 0xBD, 0x03, 0xAD, 0x02, 0xDD, 0x05, + 0x25, 0x0E, 0x2A, 0xAC, 0x15, 0x81, 0xD3, 0x03, + 0xA1, 0xD4, 0x03, 0x88, 0x08, 0x91, 0xD1, 0x03, + 0x82, 0x08, 0x02, 0x98, 0x29, 0xB6, 0x28, 0x06, + 0x91, 0xD5, 0x03, 0x99, 0x2A, 0x1D, 0xF0, 0x37, + 0x69, 0x05, 0x91, 0xD6, 0x03, 0x86, 0xFC, 0xFF, + 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, + 0xBD, 0x03, 0xAD, 0x02, 0xCD, 0x04, 0xDD, 0x05, + 0x1C, 0x8E, 0x25, 0x71, 0x22, 0xBC, 0x16, 0x82, + 0x12, 0x1A, 0x5A, 0xA4, 0xEC, 0xA8, 0x1C, 0x79, + 0xA7, 0x39, 0x28, 0x92, 0xA4, 0x21, 0x92, 0x52, + 0x1A, 0x06, 0x05, 0x00, 0xA1, 0xD2, 0x03, 0x25, + 0x42, 0x2D, 0xA8, 0x82, 0xE5, 0xBF, 0xFF, 0xB1, + 0xD1, 0x03, 0xA8, 0x2B, 0x30, 0xAA, 0x20, 0xA9, + 0x2B, 0xA8, 0x82, 0xA5, 0x05, 0x2D, 0x0C, 0x0B, + 0xB9, 0x82, 0x1D, 0xF0, 0x1C, 0x83, 0xA7, 0xB3, + 0xDA, 0x92, 0xA4, 0x22, 0x86, 0xF3, 0xFF, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x8C, 0x36, 0x0C, 0x03, + 0x32, 0x52, 0x1A, 0x1D, 0xF0, 0x36, 0x41, 0x00, + 0xA5, 0xB9, 0xFF, 0xAD, 0x02, 0x81, 0xD6, 0x03, + 0x89, 0x22, 0xE5, 0x8C, 0x29, 0x1D, 0xF0, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x31, 0xD7, 0x03, 0x21, + 0xD8, 0x03, 0x29, 0x13, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x81, 0xD9, 0x03, 0x30, + 0x61, 0x00, 0x88, 0x08, 0x82, 0x08, 0x10, 0x26, + 0x48, 0x07, 0xAD, 0x02, 0xA5, 0x54, 0x28, 0x06, + 0x01, 0x00, 0x0C, 0x0A, 0xE5, 0xED, 0x20, 0x30, + 0xE6, 0x13, 0x10, 0x20, 0x00, 0x1D, 0xF0, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x21, 0xDA, 0x03, 0x88, + 0x02, 0x27, 0x18, 0x09, 0xAD, 0x02, 0xE5, 0x07, + 0x00, 0xAD, 0x02, 0xE5, 0xE2, 0x20, 0x1D, 0xF0, + 0x00, 0x36, 0x41, 0x00, 0x20, 0x61, 0x00, 0xA1, + 0xDA, 0x03, 0xE5, 0xE1, 0x20, 0xA5, 0x28, 0x24, + 0x20, 0xE6, 0x13, 0x10, 0x20, 0x00, 0x1D, 0xF0, + 0x00, 0x36, 0x41, 0x00, 0x41, 0xDB, 0x03, 0x21, + 0xDC, 0x03, 0xC0, 0x20, 0x00, 0x32, 0x22, 0x81, + 0x98, 0x54, 0x88, 0x34, 0x30, 0x99, 0x20, 0x99, + 0x54, 0x87, 0x03, 0x06, 0x0C, 0x0A, 0xA9, 0x34, + 0xA5, 0xE5, 0x21, 0x0C, 0x1D, 0x3C, 0x8C, 0xB8, + 0x44, 0xC0, 0x20, 0x00, 0xC0, 0xBB, 0x10, 0xB2, + 0x62, 0x80, 0xC0, 0x20, 0x00, 0xE2, 0x22, 0x81, + 0xE0, 0xF0, 0x04, 0x07, 0xEE, 0xF3, 0xC0, 0x20, + 0x00, 0xB1, 0xDD, 0x03, 0x32, 0x62, 0x81, 0xC0, + 0x20, 0x00, 0xB8, 0x0B, 0xA1, 0xDE, 0x03, 0x1B, + 0xBB, 0xB9, 0x4A, 0x4B, 0xAA, 0x25, 0xDA, 0x20, + 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x20, 0x61, 0x00, 0x3C, 0x8A, 0x0C, 0x0B, 0xA5, + 0x25, 0x24, 0x20, 0xE6, 0x13, 0x10, 0x20, 0x00, + 0x1D, 0xF0, 0x00, 0x00, 0x00, 0xB8, 0x0F, 0x02, + 0x60, 0xC0, 0x0F, 0x02, 0x60, 0x04, 0x14, 0x02, + 0x60, 0xDC, 0x14, 0x02, 0x60, 0x04, 0x15, 0x00, + 0x60, 0x04, 0x15, 0x00, 0x60, 0x00, 0x15, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xF4, 0x14, 0x00, 0x60, 0xF8, 0x14, 0x00, + 0x60, 0x50, 0x15, 0x00, 0x60, 0x94, 0x02, 0x00, + 0x00, 0x78, 0x10, 0x02, 0x60, 0x53, 0x10, 0x02, + 0x60, 0x78, 0x10, 0x02, 0x60, 0x02, 0x11, 0x02, + 0x60, 0xDD, 0x10, 0x02, 0x60, 0xC2, 0x10, 0x02, + 0x60, 0x85, 0x10, 0x02, 0x60, 0x7E, 0x10, 0x02, + 0x60, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x0C, 0x00, + 0x60, 0xD4, 0x0C, 0x00, 0x60, 0x10, 0x30, 0x02, + 0x00, 0x60, 0x15, 0x00, 0x60, 0x00, 0x01, 0x00, + 0x00, 0xB0, 0x0A, 0x00, 0x60, 0x04, 0x13, 0x02, + 0x60, 0xA0, 0x0A, 0x00, 0x60, 0xA4, 0x13, 0x02, + 0x60, 0xF8, 0x13, 0x02, 0x60, 0x6C, 0x13, 0x02, + 0x60, 0x6C, 0x06, 0x00, 0x60, 0x14, 0x10, 0x02, + 0x60, 0xF4, 0x05, 0x00, 0x60, 0x4C, 0x13, 0x02, + 0x60, 0x68, 0x0A, 0x00, 0x60, 0x28, 0x8F, 0x04, + 0x60, 0x48, 0x08, 0x00, 0x60, 0x28, 0x14, 0x02, + 0x60, 0xAC, 0x06, 0x00, 0x60, 0x68, 0x14, 0x02, + 0x60, 0x80, 0x14, 0x02, 0x60, 0xD8, 0x56, 0x04, + 0x60, 0x36, 0x41, 0x00, 0x81, 0x57, 0x05, 0xB1, + 0x55, 0x05, 0x0C, 0x3A, 0x91, 0x56, 0x05, 0xA2, + 0x4B, 0x00, 0x89, 0x09, 0xE5, 0x01, 0x00, 0xE5, + 0x05, 0x00, 0xA5, 0x06, 0x00, 0x65, 0x07, 0x00, + 0x25, 0x02, 0x00, 0xA1, 0x58, 0x05, 0xB1, 0x59, + 0x05, 0x25, 0xFA, 0x2C, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x31, 0x5A, 0x05, 0x21, + 0x5B, 0x05, 0x22, 0x63, 0x75, 0x1D, 0xF0, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x0C, 0x8F, 0xB1, 0x5A, + 0x05, 0xA1, 0x5F, 0x05, 0x91, 0x60, 0x05, 0x81, + 0x61, 0x05, 0x31, 0x62, 0x05, 0x21, 0x63, 0x05, + 0xC1, 0x5E, 0x05, 0xD1, 0x5C, 0x05, 0xE1, 0x5D, + 0x05, 0xE9, 0xFD, 0xC2, 0x6D, 0x19, 0x29, 0x83, + 0x89, 0x39, 0xA2, 0x6B, 0x6B, 0xF2, 0x5D, 0x1C, + 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x31, 0x64, 0x05, 0x21, 0x65, 0x05, 0x29, 0x13, + 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x31, 0x66, 0x05, 0x21, 0x67, 0x05, 0x22, 0x63, + 0x19, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x91, 0x69, 0x05, 0x21, 0x6B, 0x05, 0x31, 0x68, + 0x05, 0x81, 0x6A, 0x05, 0x89, 0xC3, 0x29, 0xA3, + 0x99, 0xB3, 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x04, 0x00, 0xB0, 0x15, 0x02, + 0x60, }; static const unsigned char vfs301_06_3[] = { /* 785 B */ - 0x06, 0x00, 0x00, 0x04, 0x03, 0x00, 0x0F, 0x00, - 0x60, 0xD8, 0x0C, 0x00, 0x60, 0xD4, 0x0C, 0x00, - 0x60, 0xB0, 0x0A, 0x00, 0x60, 0x58, 0xB3, 0x04, - 0x60, 0x84, 0x05, 0x00, 0x60, 0xA4, 0xED, 0x04, - 0x60, 0x8C, 0x04, 0x00, 0x00, 0xBC, 0x08, 0x00, - 0x60, 0x00, 0x0F, 0x00, 0x60, 0x50, 0x02, 0x00, - 0x00, 0xFC, 0x07, 0x00, 0x60, 0xF4, 0x8B, 0x04, - 0x60, 0xBC, 0x0D, 0x00, 0x60, 0xDC, 0x0C, 0x00, - 0x60, 0xC0, 0x0D, 0x00, 0x60, 0x40, 0x11, 0x00, - 0x60, 0x18, 0x0D, 0x00, 0x60, 0x00, 0x9E, 0x00, - 0x38, 0x3C, 0x11, 0x00, 0x60, 0x36, 0x41, 0x00, - 0xE5, 0x02, 0x00, 0x65, 0x14, 0x00, 0x25, 0x06, - 0x00, 0x25, 0x01, 0x00, 0x91, 0xC0, 0x03, 0xA1, - 0xC1, 0x03, 0x0C, 0x08, 0x89, 0x0A, 0x82, 0x49, - 0x00, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x31, 0xC2, 0x03, 0x21, 0xC3, 0x03, 0x22, 0x63, - 0x75, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, - 0xA1, 0xC4, 0x03, 0xB1, 0xC5, 0x03, 0xC1, 0xC6, - 0x03, 0xE5, 0x94, 0x2D, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x9C, 0xD5, 0x20, 0x61, - 0x00, 0x25, 0xFB, 0xFF, 0x81, 0xC7, 0x03, 0x20, - 0xE6, 0x13, 0x10, 0x20, 0x00, 0x88, 0x28, 0x0C, - 0x0A, 0xE0, 0x08, 0x00, 0xA1, 0xC8, 0x03, 0xB1, - 0xC9, 0x03, 0xA5, 0x5C, 0x2D, 0x1D, 0xF0, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x31, 0xCA, 0x03, 0x21, - 0xCB, 0x03, 0x29, 0xD3, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x41, 0xCC, 0x03, 0x88, - 0x04, 0x22, 0x08, 0xD2, 0x80, 0x22, 0xA0, 0x28, - 0x92, 0xAD, 0x02, 0xE5, 0x73, 0x2D, 0xC0, 0x20, - 0x00, 0x5D, 0x0A, 0x38, 0x0A, 0xA2, 0xC2, 0x10, - 0x25, 0x73, 0x2D, 0x88, 0x04, 0x30, 0x9A, 0x10, - 0x82, 0x28, 0x1D, 0xC0, 0x20, 0x00, 0x90, 0x88, - 0x20, 0x89, 0x05, 0xC0, 0x20, 0x00, 0x38, 0x05, - 0x7C, 0xF5, 0x50, 0x5A, 0x30, 0x30, 0x35, 0x10, - 0xCB, 0xA2, 0xE5, 0x70, 0x2D, 0x37, 0x9A, 0x29, - 0x4B, 0xA2, 0x65, 0x70, 0x2D, 0xB8, 0x04, 0xCD, - 0x0A, 0xA2, 0xC2, 0x14, 0x92, 0x2B, 0x1E, 0xC2, - 0x6B, 0x1D, 0x1B, 0x99, 0x92, 0x6B, 0x1E, 0x25, - 0x6F, 0x2D, 0xB8, 0x04, 0xD2, 0x2B, 0x1E, 0xD7, - 0xBA, 0x16, 0xA2, 0xCB, 0x64, 0x25, 0x2E, 0x2D, - 0x1D, 0xF0, 0x8B, 0xA2, 0xE5, 0x6D, 0x2D, 0xF8, - 0x04, 0x3A, 0xEA, 0xE0, 0xE5, 0x10, 0xE2, 0x6F, - 0x1D, 0x81, 0xCA, 0x03, 0x82, 0x28, 0x12, 0xE0, - 0x08, 0x00, 0xA2, 0xA0, 0x94, 0xC1, 0xCD, 0x03, - 0xB8, 0x04, 0xC0, 0x20, 0x00, 0xC8, 0x0C, 0x92, - 0x1B, 0x5D, 0xAA, 0xAB, 0xCA, 0x99, 0x92, 0x6B, - 0x28, 0xE5, 0x20, 0x21, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x81, 0xCE, 0x03, 0x30, - 0x61, 0x00, 0x88, 0x08, 0x82, 0x08, 0x10, 0x26, - 0x48, 0x07, 0xAD, 0x02, 0x25, 0x90, 0x28, 0x06, - 0x01, 0x00, 0x0C, 0x0A, 0x65, 0x29, 0x21, 0x30, - 0xE6, 0x13, 0x10, 0x20, 0x00, 0x1D, 0xF0, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x21, 0xCF, 0x03, 0x88, - 0x02, 0x27, 0x18, 0x09, 0xAD, 0x02, 0xE5, 0x07, - 0x00, 0xAD, 0x02, 0x65, 0x1E, 0x21, 0x1D, 0xF0, - 0x00, 0x36, 0x41, 0x00, 0x20, 0x61, 0x00, 0xA1, - 0xCF, 0x03, 0x65, 0x1D, 0x21, 0x25, 0x64, 0x24, - 0x20, 0xE6, 0x13, 0x10, 0x20, 0x00, 0x1D, 0xF0, - 0x00, 0x36, 0x41, 0x00, 0x41, 0xD0, 0x03, 0x21, - 0xD1, 0x03, 0xC0, 0x20, 0x00, 0x32, 0x22, 0x81, - 0x98, 0x54, 0x88, 0x34, 0x30, 0x99, 0x20, 0x99, - 0x54, 0x87, 0x03, 0x06, 0x0C, 0x0A, 0xA9, 0x34, - 0x25, 0x21, 0x22, 0x0C, 0x1D, 0x3C, 0x8C, 0xB8, - 0x44, 0xC0, 0x20, 0x00, 0xC0, 0xBB, 0x10, 0xB2, - 0x62, 0x80, 0xC0, 0x20, 0x00, 0xE2, 0x22, 0x81, - 0xE0, 0xF0, 0x04, 0x07, 0xEE, 0xF3, 0xC0, 0x20, - 0x00, 0xB1, 0xCD, 0x03, 0x32, 0x62, 0x81, 0xC0, - 0x20, 0x00, 0xB8, 0x0B, 0xA1, 0xD2, 0x03, 0x1B, - 0xBB, 0xB9, 0x4A, 0x4B, 0xAA, 0xA5, 0x15, 0x21, - 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x20, 0x61, 0x00, 0x3C, 0x8A, 0x0C, 0x0B, 0x25, - 0x61, 0x24, 0x20, 0xE6, 0x13, 0x10, 0x20, 0x00, - 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x24, 0x11, 0x02, - 0x60, 0x40, 0x11, 0x00, 0x60, 0x40, 0x11, 0x00, - 0x60, 0x3C, 0x11, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0xD8, 0x0C, 0x00, 0x60, 0xD4, 0x0C, 0x00, - 0x60, 0x12, 0x30, 0x00, 0x00, 0x50, 0x11, 0x00, - 0x60, 0xB0, 0x00, 0x00, 0x00, 0xB0, 0x0A, 0x00, - 0x60, 0x90, 0x0F, 0x02, 0x60, 0xFC, 0x07, 0x00, - 0x60, 0xC8, 0x0F, 0x02, 0x60, 0x48, 0x08, 0x00, - 0x60, 0x70, 0x10, 0x02, 0x60, 0xAC, 0x06, 0x00, - 0x60, 0xB0, 0x10, 0x02, 0x60, 0xC8, 0x10, 0x02, - 0x60, 0xD8, 0x56, 0x04, 0x60, 0x36, 0x41, 0x00, - 0x81, 0x56, 0x04, 0xB1, 0x54, 0x04, 0x0C, 0x1A, - 0x91, 0x55, 0x04, 0xA2, 0x4B, 0x00, 0x89, 0x09, - 0xA5, 0x01, 0x00, 0x65, 0x02, 0x00, 0x25, 0x03, - 0x00, 0xE5, 0x03, 0x00, 0xA1, 0x57, 0x04, 0xB1, - 0x58, 0x04, 0xA5, 0x3C, 0x2D, 0x1D, 0xF0, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x31, 0x59, 0x04, 0x21, - 0x5A, 0x04, 0x22, 0x63, 0x75, 0x1D, 0xF0, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x31, 0x5B, 0x04, 0x21, - 0x5C, 0x04, 0x29, 0xD3, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x31, 0x5D, 0x04, 0x21, - 0x5E, 0x04, 0x22, 0x63, 0x19, 0x1D, 0xF0, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x91, 0x60, 0x04, 0x21, - 0x62, 0x04, 0x31, 0x5F, 0x04, 0x81, 0x61, 0x04, - 0x89, 0xC3, 0x29, 0xA3, 0x99, 0xB3, 0x1D, 0xF0, - 0x00, 0x01, 0x00, 0x04, 0x00, 0x8C, 0x11, 0x02, - 0x60, + 0x06, 0x00, 0x00, 0x04, 0x03, 0x00, 0x0F, 0x00, + 0x60, 0xD8, 0x0C, 0x00, 0x60, 0xD4, 0x0C, 0x00, + 0x60, 0xB0, 0x0A, 0x00, 0x60, 0x58, 0xB3, 0x04, + 0x60, 0x84, 0x05, 0x00, 0x60, 0xA4, 0xED, 0x04, + 0x60, 0x8C, 0x04, 0x00, 0x00, 0xBC, 0x08, 0x00, + 0x60, 0x00, 0x0F, 0x00, 0x60, 0x50, 0x02, 0x00, + 0x00, 0xFC, 0x07, 0x00, 0x60, 0xF4, 0x8B, 0x04, + 0x60, 0xBC, 0x0D, 0x00, 0x60, 0xDC, 0x0C, 0x00, + 0x60, 0xC0, 0x0D, 0x00, 0x60, 0x40, 0x11, 0x00, + 0x60, 0x18, 0x0D, 0x00, 0x60, 0x00, 0x9E, 0x00, + 0x38, 0x3C, 0x11, 0x00, 0x60, 0x36, 0x41, 0x00, + 0xE5, 0x02, 0x00, 0x65, 0x14, 0x00, 0x25, 0x06, + 0x00, 0x25, 0x01, 0x00, 0x91, 0xC0, 0x03, 0xA1, + 0xC1, 0x03, 0x0C, 0x08, 0x89, 0x0A, 0x82, 0x49, + 0x00, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x31, 0xC2, 0x03, 0x21, 0xC3, 0x03, 0x22, 0x63, + 0x75, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, + 0xA1, 0xC4, 0x03, 0xB1, 0xC5, 0x03, 0xC1, 0xC6, + 0x03, 0xE5, 0x94, 0x2D, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x9C, 0xD5, 0x20, 0x61, + 0x00, 0x25, 0xFB, 0xFF, 0x81, 0xC7, 0x03, 0x20, + 0xE6, 0x13, 0x10, 0x20, 0x00, 0x88, 0x28, 0x0C, + 0x0A, 0xE0, 0x08, 0x00, 0xA1, 0xC8, 0x03, 0xB1, + 0xC9, 0x03, 0xA5, 0x5C, 0x2D, 0x1D, 0xF0, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x31, 0xCA, 0x03, 0x21, + 0xCB, 0x03, 0x29, 0xD3, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x41, 0xCC, 0x03, 0x88, + 0x04, 0x22, 0x08, 0xD2, 0x80, 0x22, 0xA0, 0x28, + 0x92, 0xAD, 0x02, 0xE5, 0x73, 0x2D, 0xC0, 0x20, + 0x00, 0x5D, 0x0A, 0x38, 0x0A, 0xA2, 0xC2, 0x10, + 0x25, 0x73, 0x2D, 0x88, 0x04, 0x30, 0x9A, 0x10, + 0x82, 0x28, 0x1D, 0xC0, 0x20, 0x00, 0x90, 0x88, + 0x20, 0x89, 0x05, 0xC0, 0x20, 0x00, 0x38, 0x05, + 0x7C, 0xF5, 0x50, 0x5A, 0x30, 0x30, 0x35, 0x10, + 0xCB, 0xA2, 0xE5, 0x70, 0x2D, 0x37, 0x9A, 0x29, + 0x4B, 0xA2, 0x65, 0x70, 0x2D, 0xB8, 0x04, 0xCD, + 0x0A, 0xA2, 0xC2, 0x14, 0x92, 0x2B, 0x1E, 0xC2, + 0x6B, 0x1D, 0x1B, 0x99, 0x92, 0x6B, 0x1E, 0x25, + 0x6F, 0x2D, 0xB8, 0x04, 0xD2, 0x2B, 0x1E, 0xD7, + 0xBA, 0x16, 0xA2, 0xCB, 0x64, 0x25, 0x2E, 0x2D, + 0x1D, 0xF0, 0x8B, 0xA2, 0xE5, 0x6D, 0x2D, 0xF8, + 0x04, 0x3A, 0xEA, 0xE0, 0xE5, 0x10, 0xE2, 0x6F, + 0x1D, 0x81, 0xCA, 0x03, 0x82, 0x28, 0x12, 0xE0, + 0x08, 0x00, 0xA2, 0xA0, 0x94, 0xC1, 0xCD, 0x03, + 0xB8, 0x04, 0xC0, 0x20, 0x00, 0xC8, 0x0C, 0x92, + 0x1B, 0x5D, 0xAA, 0xAB, 0xCA, 0x99, 0x92, 0x6B, + 0x28, 0xE5, 0x20, 0x21, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x81, 0xCE, 0x03, 0x30, + 0x61, 0x00, 0x88, 0x08, 0x82, 0x08, 0x10, 0x26, + 0x48, 0x07, 0xAD, 0x02, 0x25, 0x90, 0x28, 0x06, + 0x01, 0x00, 0x0C, 0x0A, 0x65, 0x29, 0x21, 0x30, + 0xE6, 0x13, 0x10, 0x20, 0x00, 0x1D, 0xF0, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x21, 0xCF, 0x03, 0x88, + 0x02, 0x27, 0x18, 0x09, 0xAD, 0x02, 0xE5, 0x07, + 0x00, 0xAD, 0x02, 0x65, 0x1E, 0x21, 0x1D, 0xF0, + 0x00, 0x36, 0x41, 0x00, 0x20, 0x61, 0x00, 0xA1, + 0xCF, 0x03, 0x65, 0x1D, 0x21, 0x25, 0x64, 0x24, + 0x20, 0xE6, 0x13, 0x10, 0x20, 0x00, 0x1D, 0xF0, + 0x00, 0x36, 0x41, 0x00, 0x41, 0xD0, 0x03, 0x21, + 0xD1, 0x03, 0xC0, 0x20, 0x00, 0x32, 0x22, 0x81, + 0x98, 0x54, 0x88, 0x34, 0x30, 0x99, 0x20, 0x99, + 0x54, 0x87, 0x03, 0x06, 0x0C, 0x0A, 0xA9, 0x34, + 0x25, 0x21, 0x22, 0x0C, 0x1D, 0x3C, 0x8C, 0xB8, + 0x44, 0xC0, 0x20, 0x00, 0xC0, 0xBB, 0x10, 0xB2, + 0x62, 0x80, 0xC0, 0x20, 0x00, 0xE2, 0x22, 0x81, + 0xE0, 0xF0, 0x04, 0x07, 0xEE, 0xF3, 0xC0, 0x20, + 0x00, 0xB1, 0xCD, 0x03, 0x32, 0x62, 0x81, 0xC0, + 0x20, 0x00, 0xB8, 0x0B, 0xA1, 0xD2, 0x03, 0x1B, + 0xBB, 0xB9, 0x4A, 0x4B, 0xAA, 0xA5, 0x15, 0x21, + 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x20, 0x61, 0x00, 0x3C, 0x8A, 0x0C, 0x0B, 0x25, + 0x61, 0x24, 0x20, 0xE6, 0x13, 0x10, 0x20, 0x00, + 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x24, 0x11, 0x02, + 0x60, 0x40, 0x11, 0x00, 0x60, 0x40, 0x11, 0x00, + 0x60, 0x3C, 0x11, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x00, 0xD8, 0x0C, 0x00, 0x60, 0xD4, 0x0C, 0x00, + 0x60, 0x12, 0x30, 0x00, 0x00, 0x50, 0x11, 0x00, + 0x60, 0xB0, 0x00, 0x00, 0x00, 0xB0, 0x0A, 0x00, + 0x60, 0x90, 0x0F, 0x02, 0x60, 0xFC, 0x07, 0x00, + 0x60, 0xC8, 0x0F, 0x02, 0x60, 0x48, 0x08, 0x00, + 0x60, 0x70, 0x10, 0x02, 0x60, 0xAC, 0x06, 0x00, + 0x60, 0xB0, 0x10, 0x02, 0x60, 0xC8, 0x10, 0x02, + 0x60, 0xD8, 0x56, 0x04, 0x60, 0x36, 0x41, 0x00, + 0x81, 0x56, 0x04, 0xB1, 0x54, 0x04, 0x0C, 0x1A, + 0x91, 0x55, 0x04, 0xA2, 0x4B, 0x00, 0x89, 0x09, + 0xA5, 0x01, 0x00, 0x65, 0x02, 0x00, 0x25, 0x03, + 0x00, 0xE5, 0x03, 0x00, 0xA1, 0x57, 0x04, 0xB1, + 0x58, 0x04, 0xA5, 0x3C, 0x2D, 0x1D, 0xF0, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x31, 0x59, 0x04, 0x21, + 0x5A, 0x04, 0x22, 0x63, 0x75, 0x1D, 0xF0, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x31, 0x5B, 0x04, 0x21, + 0x5C, 0x04, 0x29, 0xD3, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x31, 0x5D, 0x04, 0x21, + 0x5E, 0x04, 0x22, 0x63, 0x19, 0x1D, 0xF0, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x91, 0x60, 0x04, 0x21, + 0x62, 0x04, 0x31, 0x5F, 0x04, 0x81, 0x61, 0x04, + 0x89, 0xC3, 0x29, 0xA3, 0x99, 0xB3, 0x1D, 0xF0, + 0x00, 0x01, 0x00, 0x04, 0x00, 0x8C, 0x11, 0x02, + 0x60, }; static const unsigned char vfs301_06_4[] = { /* 3057 B */ - 0x06, 0x00, 0x00, 0xE4, 0x0B, 0x00, 0x0F, 0x00, - 0x60, 0xD8, 0x0C, 0x00, 0x60, 0xD4, 0x0C, 0x00, - 0x60, 0xB0, 0x0A, 0x00, 0x60, 0x58, 0xB3, 0x04, - 0x60, 0x84, 0x05, 0x00, 0x60, 0xA4, 0xED, 0x04, - 0x60, 0x8C, 0x04, 0x00, 0x00, 0x00, 0x0F, 0x00, - 0x60, 0xC0, 0x0A, 0x00, 0x00, 0xA0, 0x0A, 0x00, - 0x60, 0xD0, 0x38, 0x04, 0x60, 0xB4, 0x39, 0x04, - 0x60, 0x58, 0xB4, 0x04, 0x60, 0xFC, 0x0C, 0x00, - 0x60, 0x80, 0x19, 0x00, 0x60, 0xC8, 0x0D, 0x00, - 0x60, 0x9C, 0x0B, 0x00, 0x60, 0xF4, 0x18, 0x00, - 0x60, 0xCC, 0x08, 0x00, 0x60, 0xF8, 0x18, 0x00, - 0x60, 0xA8, 0x0B, 0x00, 0x60, 0xE4, 0x06, 0x00, - 0x60, 0x54, 0x11, 0x02, 0x60, 0xAC, 0x06, 0x00, - 0x60, 0x48, 0x11, 0x02, 0x60, 0x04, 0x19, 0x00, - 0x60, 0x80, 0x7F, 0x00, 0x38, 0x80, 0x5F, 0x00, - 0x38, 0x80, 0x3F, 0x00, 0x38, 0xDC, 0x0C, 0x00, - 0x60, 0x1C, 0x19, 0x00, 0x60, 0x2C, 0x19, 0x00, - 0x60, 0x48, 0x19, 0x00, 0x60, 0x00, 0x40, 0x00, - 0x38, 0x00, 0xA0, 0x00, 0x38, 0x68, 0x0A, 0x00, - 0x60, 0x4C, 0x3F, 0x04, 0x60, 0xC0, 0x0D, 0x00, - 0x60, 0x5C, 0x19, 0x00, 0x60, 0x18, 0x0D, 0x00, - 0x60, 0x00, 0x9E, 0x00, 0x38, 0x58, 0x19, 0x00, - 0x60, 0xB0, 0x19, 0x00, 0x60, 0x20, 0x0E, 0x00, - 0x60, 0xFC, 0xFF, 0x00, 0x00, 0x90, 0x19, 0x00, - 0x60, 0x36, 0x41, 0x00, 0x65, 0x03, 0x00, 0x25, - 0x18, 0x00, 0x65, 0x15, 0x00, 0x25, 0x06, 0x00, - 0x25, 0x54, 0x00, 0x65, 0x50, 0x00, 0x25, 0x01, - 0x00, 0x91, 0xC0, 0x03, 0xA1, 0xC1, 0x03, 0x0C, - 0x08, 0x89, 0x0A, 0x82, 0x49, 0x00, 0x1D, 0xF0, - 0x00, 0x36, 0x41, 0x00, 0x31, 0xC2, 0x03, 0x21, - 0xC3, 0x03, 0x22, 0x63, 0x75, 0x1D, 0xF0, 0x00, - 0x00, 0x36, 0x41, 0x00, 0xA1, 0xC4, 0x03, 0xB1, - 0xC5, 0x03, 0xC1, 0xC6, 0x03, 0xA5, 0x8D, 0x2D, - 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x9C, 0x85, 0x20, 0x61, 0x00, 0xA5, 0xFA, 0xFF, - 0x20, 0xE6, 0x13, 0x10, 0x20, 0x00, 0x0C, 0x0A, - 0x65, 0xC8, 0x29, 0xA1, 0xC7, 0x03, 0xB1, 0xC8, - 0x03, 0xA5, 0x55, 0x2D, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x0C, 0xBB, 0x31, 0xC2, - 0x03, 0x21, 0xCC, 0x03, 0x81, 0xCB, 0x03, 0x91, - 0xC9, 0x03, 0xA1, 0xCA, 0x03, 0xA9, 0xF9, 0x82, - 0x69, 0x19, 0x22, 0x63, 0x6B, 0xB2, 0x59, 0x1C, - 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x21, 0xCD, 0x03, 0x88, 0x22, 0x37, 0x68, 0x0E, - 0xA1, 0xCE, 0x03, 0xA5, 0x7D, 0x2D, 0x98, 0x22, - 0x6C, 0x7A, 0xA0, 0x99, 0x10, 0x99, 0x22, 0xE5, - 0xA9, 0x22, 0x1D, 0xF0, 0x00, 0x36, 0x41, 0x00, - 0xCD, 0x04, 0xBD, 0x03, 0xAD, 0x02, 0xDD, 0x05, - 0x25, 0x3E, 0x2A, 0xAC, 0x15, 0x81, 0xCF, 0x03, - 0xA1, 0xD0, 0x03, 0x88, 0x08, 0x91, 0xCD, 0x03, - 0x82, 0x08, 0x02, 0x98, 0x29, 0xB6, 0x28, 0x06, - 0x91, 0xD1, 0x03, 0x99, 0x2A, 0x1D, 0xF0, 0x37, - 0x69, 0x05, 0x91, 0xD2, 0x03, 0x86, 0xFC, 0xFF, - 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, - 0xBD, 0x03, 0xAD, 0x02, 0xCD, 0x04, 0xDD, 0x05, - 0x1C, 0x8E, 0x25, 0xA1, 0x22, 0xBC, 0x16, 0x82, - 0x12, 0x1A, 0x5A, 0xA4, 0xEC, 0xA8, 0x1C, 0x79, - 0xA7, 0x39, 0x28, 0x92, 0xA4, 0x21, 0x92, 0x52, - 0x1A, 0x06, 0x05, 0x00, 0xA1, 0xCE, 0x03, 0x25, - 0x72, 0x2D, 0xA8, 0x82, 0xA5, 0x50, 0x00, 0xB1, - 0xCD, 0x03, 0xA8, 0x2B, 0x30, 0xAA, 0x20, 0xA9, - 0x2B, 0xA8, 0x82, 0xA5, 0x35, 0x2D, 0x0C, 0x0B, - 0xB9, 0x82, 0x1D, 0xF0, 0x1C, 0x83, 0xA7, 0xB3, - 0xDA, 0x92, 0xA4, 0x22, 0x86, 0xF3, 0xFF, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x8C, 0x36, 0x0C, 0x03, - 0x32, 0x52, 0x1A, 0x1D, 0xF0, 0x36, 0x41, 0x00, - 0x65, 0x4A, 0x00, 0xAD, 0x02, 0x81, 0xD2, 0x03, - 0x89, 0x22, 0xE5, 0xBC, 0x29, 0x1D, 0xF0, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x21, 0xD3, 0x03, 0x31, - 0xD4, 0x03, 0x28, 0x22, 0x29, 0x03, 0x1D, 0xF0, - 0x00, 0x36, 0x41, 0x00, 0x21, 0xD8, 0x03, 0x31, - 0xD7, 0x03, 0x91, 0xD5, 0x03, 0x81, 0xD6, 0x03, - 0x89, 0x49, 0x29, 0x03, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x25, 0x18, 0x00, 0x1D, - 0xF0, 0x36, 0x41, 0x00, 0xA5, 0x17, 0x00, 0x65, - 0x20, 0x24, 0x1D, 0xF0, 0x00, 0x36, 0x41, 0x00, - 0xAD, 0x02, 0x65, 0xBE, 0x24, 0x65, 0x16, 0x00, - 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x61, 0xD9, 0x03, 0xCC, 0xE4, 0xA2, 0xA0, 0x76, - 0x65, 0x22, 0x2D, 0xA9, 0x36, 0xCC, 0x4A, 0xA2, - 0xA4, 0x31, 0x25, 0xB2, 0x29, 0x72, 0xA0, 0x76, - 0xD8, 0x36, 0xA2, 0xA0, 0x75, 0xAC, 0x2D, 0x4A, - 0xB3, 0xB7, 0x37, 0x0E, 0xDA, 0xA4, 0xBD, 0x02, - 0xCD, 0x03, 0x65, 0x74, 0x2D, 0xA2, 0xA0, 0x75, - 0xC6, 0x03, 0x00, 0x47, 0x3A, 0x0C, 0xDA, 0xA4, - 0xBD, 0x02, 0x40, 0xC7, 0xC0, 0x25, 0x73, 0x2D, - 0xA2, 0xA0, 0x75, 0xBC, 0x75, 0xC8, 0x36, 0x4A, - 0xB3, 0xBC, 0x1C, 0xB7, 0x3A, 0x08, 0xA2, 0xA4, - 0x05, 0x25, 0xAE, 0x29, 0x46, 0x07, 0x00, 0xB7, - 0xB7, 0x25, 0xA2, 0xA4, 0x06, 0x65, 0xAD, 0x29, - 0x46, 0x04, 0x00, 0x0C, 0x0A, 0xE5, 0xAC, 0x29, - 0xA8, 0x46, 0xB8, 0x36, 0xC2, 0xA0, 0x76, 0x25, - 0x70, 0x2D, 0xA5, 0x02, 0x00, 0xA8, 0x36, 0xE5, - 0x25, 0x2D, 0x0C, 0x0D, 0xD9, 0x36, 0x1D, 0xF0, - 0xE8, 0x46, 0x8C, 0x1E, 0xA5, 0x0D, 0x00, 0xA2, - 0xA0, 0x76, 0x25, 0x1A, 0x2D, 0xA9, 0x46, 0x56, - 0x0A, 0xFD, 0xA2, 0xA4, 0x31, 0xE5, 0xA9, 0x29, - 0x46, 0xF6, 0xFF, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x21, 0xD9, 0x03, 0x91, 0xDA, 0x03, 0xB1, 0xDB, - 0x03, 0x81, 0xDC, 0x03, 0xC0, 0x20, 0x00, 0xA2, - 0x08, 0x84, 0xC0, 0x20, 0x00, 0xD2, 0x0B, 0x84, - 0xC0, 0x20, 0x00, 0xC2, 0x09, 0x84, 0x80, 0xDD, - 0x11, 0xD0, 0xAA, 0x20, 0x00, 0xCC, 0x11, 0xC0, - 0xAA, 0x20, 0xA9, 0xE2, 0xC0, 0x20, 0x00, 0x82, - 0x08, 0x81, 0xC0, 0x20, 0x00, 0xB2, 0x0B, 0x81, - 0xC0, 0x20, 0x00, 0xA8, 0x42, 0x80, 0xBB, 0x11, - 0x92, 0x09, 0x81, 0xB0, 0x88, 0x20, 0x00, 0x99, - 0x11, 0x90, 0x88, 0x20, 0x89, 0xF2, 0xE5, 0x73, - 0x24, 0x31, 0xDD, 0x03, 0x98, 0x42, 0x0C, 0x0B, - 0xA2, 0x09, 0x70, 0x92, 0x09, 0x71, 0xB2, 0x42, - 0x14, 0x80, 0x99, 0x11, 0xA0, 0x99, 0x20, 0x16, - 0x79, 0x04, 0xC0, 0x20, 0x00, 0xB8, 0x03, 0x9A, - 0xBB, 0x0B, 0xBB, 0xB9, 0x92, 0xA1, 0xDE, 0x03, - 0xA5, 0xFF, 0x20, 0xB8, 0x42, 0xB2, 0x0B, 0x75, - 0x9C, 0x9B, 0xC0, 0x20, 0x00, 0xA1, 0xDF, 0x03, - 0xD8, 0x03, 0xB0, 0xCB, 0x11, 0xB0, 0xCC, 0xC0, - 0xB0, 0xCC, 0xA0, 0xD0, 0xCC, 0xB0, 0x0B, 0xCC, - 0xC9, 0xD2, 0x65, 0xFD, 0x20, 0xA1, 0xE0, 0x03, - 0x0C, 0x1E, 0xE2, 0x62, 0x10, 0xC0, 0x20, 0x00, - 0xD8, 0x03, 0xD2, 0x62, 0x14, 0x25, 0xFC, 0x20, - 0x1D, 0xF0, 0xC0, 0x20, 0x00, 0xB8, 0x03, 0x06, - 0xEE, 0xFF, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x21, 0xD9, 0x03, 0x88, 0x42, 0x16, 0x28, 0x08, - 0xA2, 0xC2, 0x44, 0xE5, 0xFB, 0x20, 0xB8, 0x42, - 0x92, 0x0B, 0x74, 0x26, 0x19, 0x14, 0xA2, 0xC9, - 0xFE, 0x16, 0x9A, 0x07, 0xC2, 0xC9, 0xFD, 0x16, - 0xAC, 0x06, 0xA2, 0xCB, 0x48, 0x25, 0x1A, 0x00, - 0x46, 0x01, 0x00, 0xA2, 0xCB, 0x50, 0xA5, 0x19, - 0x00, 0xA1, 0xDE, 0x03, 0x65, 0xF9, 0x20, 0xA1, - 0xDF, 0x03, 0xE5, 0xF8, 0x20, 0xE1, 0xDA, 0x03, - 0x81, 0xDB, 0x03, 0xA1, 0xDC, 0x03, 0xD8, 0xE2, - 0xC0, 0x20, 0x00, 0xD2, 0x4A, 0x84, 0xC8, 0xE2, - 0xC0, 0x20, 0x00, 0xC0, 0xC8, 0x41, 0xC2, 0x48, - 0x84, 0xB8, 0xE2, 0xC0, 0x20, 0x00, 0xB0, 0xB0, - 0xF5, 0xB2, 0x4E, 0x84, 0x98, 0xF2, 0xC0, 0x20, - 0x00, 0x92, 0x4A, 0x81, 0xF8, 0xF2, 0xC0, 0x20, - 0x00, 0xF0, 0xF8, 0x41, 0xF2, 0x48, 0x81, 0xD8, - 0xF2, 0xC0, 0x20, 0x00, 0xD0, 0xD0, 0xF5, 0xD2, - 0x4E, 0x81, 0xA8, 0x42, 0x25, 0x0F, 0x2D, 0x0C, - 0x0E, 0xE9, 0x42, 0x1D, 0xF0, 0xA2, 0xCB, 0x60, - 0xA5, 0x13, 0x00, 0x86, 0xE6, 0xFF, 0xA2, 0xCB, - 0x58, 0xE5, 0x12, 0x00, 0x46, 0xE4, 0xFF, 0x00, - 0x00, 0x36, 0x41, 0x00, 0xB1, 0xD9, 0x03, 0x0C, - 0x1D, 0x98, 0x4B, 0xA2, 0x0B, 0x14, 0xAC, 0x79, - 0xC1, 0xDD, 0x03, 0xEC, 0x4A, 0xA2, 0x09, 0x72, - 0xE2, 0x09, 0x73, 0xD2, 0x4B, 0x14, 0x80, 0x9E, - 0x11, 0xA0, 0x99, 0x20, 0xBC, 0xD9, 0xC0, 0x20, - 0x00, 0xA8, 0x0C, 0x9A, 0x9A, 0x0B, 0x99, 0x99, - 0x32, 0xD2, 0x6B, 0x10, 0xAD, 0x02, 0xA5, 0xED, - 0x20, 0x1D, 0xF0, 0x66, 0x1A, 0xF2, 0xE2, 0x09, - 0x71, 0xA2, 0x09, 0x70, 0x80, 0x9E, 0x11, 0xA0, - 0x99, 0x20, 0x0C, 0x0E, 0xE2, 0x4B, 0x14, 0x8C, - 0xA9, 0xC0, 0x20, 0x00, 0xA8, 0x0C, 0x9A, 0x9A, - 0x0B, 0x99, 0x46, 0xF4, 0xFF, 0xC0, 0x20, 0x00, - 0x98, 0x0C, 0x46, 0xF2, 0xFF, 0xC0, 0x20, 0x00, - 0x98, 0x0C, 0x46, 0xF0, 0xFF, 0x36, 0x41, 0x00, - 0x31, 0xD9, 0x03, 0xB8, 0x43, 0x92, 0x03, 0x14, - 0x16, 0xFB, 0x09, 0xFC, 0x99, 0x82, 0x0B, 0x71, - 0xA2, 0x0B, 0x70, 0x80, 0x88, 0x11, 0xA0, 0x88, - 0x20, 0xAC, 0xB8, 0xC2, 0x0B, 0x68, 0x92, 0x0B, - 0x6B, 0xA2, 0x0B, 0x6A, 0x80, 0x99, 0x11, 0xA0, - 0x99, 0x20, 0xA2, 0x0B, 0x69, 0x80, 0x99, 0x11, - 0xA0, 0x99, 0x20, 0xA2, 0x23, 0x10, 0x80, 0x99, - 0x11, 0xC0, 0x99, 0x20, 0xA7, 0x09, 0x6D, 0xA2, - 0xCB, 0x50, 0x65, 0x07, 0x00, 0xC6, 0x10, 0x00, - 0x66, 0x19, 0x40, 0xA2, 0x0B, 0x73, 0xC2, 0x0B, - 0x72, 0x80, 0xAA, 0x11, 0xC0, 0xAA, 0x20, 0xBC, - 0x1A, 0xE2, 0x0B, 0x6C, 0xC2, 0x0B, 0x6F, 0xD2, - 0x0B, 0x6E, 0x80, 0xCC, 0x11, 0xD0, 0xCC, 0x20, - 0xD2, 0x0B, 0x6D, 0x80, 0xCC, 0x11, 0xD0, 0xCC, - 0x20, 0xD2, 0x23, 0x10, 0x80, 0xCC, 0x11, 0xE0, - 0xCC, 0x20, 0xD7, 0x0C, 0x08, 0xA2, 0xCB, 0x60, - 0xA5, 0x03, 0x00, 0x46, 0x01, 0x00, 0xA2, 0xCB, - 0x58, 0xE5, 0x02, 0x00, 0xAD, 0x02, 0xD1, 0xDD, - 0x03, 0x82, 0x23, 0x10, 0x0C, 0x1F, 0xF0, 0x88, - 0x11, 0xED, 0x08, 0x80, 0xEF, 0x83, 0xE2, 0x63, - 0x10, 0xC0, 0x20, 0x00, 0xD8, 0x0D, 0xD9, 0x32, - 0xA5, 0xDF, 0x20, 0x1D, 0xF0, 0xA2, 0xCB, 0x48, - 0xA5, 0x00, 0x00, 0x46, 0xF5, 0xFF, 0x00, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x4B, 0xA2, 0x25, 0x28, - 0x2D, 0x3D, 0x0A, 0xAD, 0x02, 0xA5, 0x27, 0x2D, - 0xB1, 0xE1, 0x03, 0xC1, 0xE2, 0x03, 0xC0, 0x20, - 0x00, 0x82, 0x0B, 0x03, 0xC0, 0x20, 0x00, 0x30, - 0x88, 0x10, 0x30, 0x38, 0x41, 0x80, 0x8A, 0x20, - 0xA0, 0xA8, 0x41, 0x82, 0x4B, 0x03, 0xB2, 0xDB, - 0x20, 0xC7, 0x9B, 0xE1, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x36, 0x41, 0x00, 0xA5, 0xDF, 0xFF, 0x1D, - 0xF0, 0x36, 0x41, 0x00, 0x31, 0xE3, 0x03, 0x21, - 0xE4, 0x03, 0x29, 0x13, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x81, 0xE5, 0x03, 0x30, - 0x61, 0x00, 0x88, 0x08, 0x82, 0x08, 0x10, 0x26, - 0x48, 0x07, 0xAD, 0x02, 0x25, 0x49, 0x28, 0x06, - 0x01, 0x00, 0x0C, 0x0A, 0x65, 0xE2, 0x20, 0x30, - 0xE6, 0x13, 0x10, 0x20, 0x00, 0x1D, 0xF0, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x21, 0xE6, 0x03, 0x88, - 0x02, 0x27, 0x18, 0x09, 0xAD, 0x02, 0xE5, 0x07, - 0x00, 0xAD, 0x02, 0x65, 0xD7, 0x20, 0x1D, 0xF0, - 0x00, 0x36, 0x41, 0x00, 0x20, 0x61, 0x00, 0xA1, - 0xE6, 0x03, 0x65, 0xD6, 0x20, 0x25, 0x1D, 0x24, - 0x20, 0xE6, 0x13, 0x10, 0x20, 0x00, 0x1D, 0xF0, - 0x00, 0x36, 0x41, 0x00, 0x41, 0xE7, 0x03, 0x21, - 0xE8, 0x03, 0xC0, 0x20, 0x00, 0x32, 0x22, 0x81, - 0x98, 0x54, 0x88, 0x34, 0x30, 0x99, 0x20, 0x99, - 0x54, 0x87, 0x03, 0x06, 0x0C, 0x0A, 0xA9, 0x34, - 0x25, 0xDA, 0x21, 0x0C, 0x1D, 0x3C, 0x8C, 0xB8, - 0x44, 0xC0, 0x20, 0x00, 0xC0, 0xBB, 0x10, 0xB2, - 0x62, 0x80, 0xC0, 0x20, 0x00, 0xE2, 0x22, 0x81, - 0xE0, 0xF0, 0x04, 0x07, 0xEE, 0xF3, 0xC0, 0x20, - 0x00, 0xB1, 0xDD, 0x03, 0x32, 0x62, 0x81, 0xC0, - 0x20, 0x00, 0xB8, 0x0B, 0xA1, 0xE9, 0x03, 0x1B, - 0xBB, 0xB9, 0x4A, 0x4B, 0xAA, 0xA5, 0xCE, 0x20, - 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x20, 0x61, 0x00, 0x3C, 0x8A, 0x0C, 0x0B, 0x25, - 0x1A, 0x24, 0x20, 0xE6, 0x13, 0x10, 0x20, 0x00, - 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x31, 0xEA, 0x03, 0x38, 0x03, 0x8C, 0x73, 0x88, - 0x23, 0x66, 0x28, 0x03, 0x0C, 0x39, 0x99, 0x23, - 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x31, 0xEB, 0x03, 0x0C, 0x02, 0x22, 0x43, 0x00, - 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, - 0xBD, 0x02, 0x21, 0xEA, 0x03, 0x28, 0x02, 0x1C, - 0x8C, 0xCB, 0xA2, 0xE5, 0x2E, 0x2D, 0xD1, 0xEC, - 0x03, 0x2C, 0x0B, 0x92, 0x12, 0x11, 0x0C, 0x1C, - 0xDC, 0x79, 0xA2, 0x12, 0x0F, 0x92, 0x12, 0x0E, - 0xA0, 0xA0, 0xE4, 0x90, 0xAA, 0xC0, 0xA2, 0xCA, - 0xC2, 0xA0, 0xA1, 0x21, 0xAA, 0x99, 0x8B, 0x99, - 0x92, 0x52, 0x11, 0xB2, 0x52, 0x13, 0xC9, 0x22, - 0xD0, 0xD9, 0x10, 0xD2, 0x52, 0x11, 0x1D, 0xF0, - 0x00, 0x36, 0x41, 0x00, 0xD8, 0x22, 0x31, 0xEA, - 0x03, 0x0C, 0x1E, 0x38, 0x03, 0x0C, 0x0C, 0xAD, - 0x03, 0xF2, 0x13, 0x13, 0xB2, 0x13, 0x10, 0xF0, - 0xCE, 0x83, 0xDA, 0xBB, 0x25, 0x17, 0x00, 0x0C, - 0x45, 0xA8, 0x23, 0x92, 0x13, 0x13, 0x0C, 0x04, - 0x8C, 0x69, 0x0B, 0x99, 0x90, 0x90, 0xF4, 0x92, - 0x53, 0x13, 0xF6, 0x8A, 0x2F, 0xB1, 0xED, 0x03, - 0xB0, 0xBA, 0xA0, 0xB8, 0x0B, 0xA0, 0x0B, 0x00, - 0xC8, 0x22, 0xB2, 0x13, 0x11, 0xAD, 0x03, 0xCA, - 0xBB, 0x65, 0x21, 0x00, 0xD2, 0x13, 0x06, 0xF1, - 0xEB, 0x03, 0xD7, 0x3A, 0x0F, 0x0C, 0x29, 0x92, - 0x4F, 0x00, 0xE2, 0x13, 0x0F, 0xE0, 0xEF, 0x04, - 0x16, 0xBE, 0x10, 0x99, 0x23, 0x0C, 0x14, 0x2D, - 0x04, 0x1D, 0xF0, 0x49, 0x23, 0x0C, 0x24, 0x06, - 0xFD, 0xFF, 0xAD, 0x03, 0xE5, 0x1B, 0x00, 0x82, - 0x13, 0x09, 0xB2, 0x13, 0x08, 0x87, 0x3A, 0x02, - 0x06, 0x24, 0x00, 0xC8, 0x22, 0xB2, 0x13, 0x11, - 0xAD, 0x03, 0xCA, 0xBB, 0x65, 0x1D, 0x00, 0xD2, - 0x13, 0x07, 0xD7, 0x3A, 0x02, 0xC6, 0x36, 0x00, - 0xE2, 0x13, 0x14, 0x0B, 0xEE, 0xE0, 0xE0, 0xF4, - 0xE2, 0x53, 0x14, 0x56, 0xEE, 0x0D, 0x0C, 0x24, - 0x0C, 0x7F, 0xF9, 0x23, 0xC6, 0xED, 0xFF, 0xAD, - 0x03, 0xE5, 0x17, 0x00, 0x82, 0x13, 0x08, 0x87, - 0x3A, 0x6A, 0x59, 0x23, 0x42, 0x53, 0x16, 0x92, - 0x13, 0x0A, 0x92, 0x53, 0x14, 0x0C, 0x04, 0x06, - 0xE7, 0xFF, 0xAD, 0x03, 0x65, 0x16, 0x00, 0xB2, - 0x13, 0x08, 0xB7, 0x3A, 0x29, 0xC2, 0x13, 0x14, - 0x0B, 0xCC, 0xC0, 0xC0, 0xF4, 0xC2, 0x53, 0x14, - 0xEC, 0xBC, 0x0C, 0x6D, 0xE2, 0x13, 0x0B, 0xE2, - 0x53, 0x14, 0xD9, 0x23, 0xC6, 0x07, 0x00, 0xDC, - 0xC9, 0x59, 0x23, 0x42, 0x53, 0x16, 0xF2, 0x13, - 0x0A, 0xF2, 0x53, 0x14, 0xC6, 0x03, 0x00, 0x0C, - 0x58, 0x92, 0x13, 0x0D, 0xA2, 0x13, 0x0C, 0xA2, - 0x53, 0x14, 0x92, 0x53, 0x15, 0x89, 0x23, 0x0C, - 0x04, 0x86, 0xD4, 0xFF, 0xB7, 0x3A, 0x05, 0xC2, - 0x13, 0x0B, 0xC2, 0x53, 0x14, 0x42, 0x53, 0x16, - 0x0C, 0x04, 0x46, 0xD0, 0xFF, 0x92, 0x13, 0x15, - 0x66, 0x19, 0x09, 0x0C, 0x34, 0x0B, 0xD9, 0xD2, - 0x53, 0x15, 0x46, 0xCC, 0xFF, 0xCC, 0x39, 0x0C, - 0x14, 0x86, 0x01, 0x00, 0x0C, 0x04, 0x0B, 0xE9, - 0xE2, 0x53, 0x15, 0xC8, 0x22, 0xB2, 0x13, 0x11, - 0xAD, 0x03, 0xCA, 0xBB, 0x65, 0x11, 0x00, 0xD2, - 0x13, 0x07, 0xD7, 0xBA, 0x10, 0xE2, 0x13, 0x14, - 0x0B, 0xEE, 0xE0, 0xE0, 0xF4, 0xE2, 0x53, 0x14, - 0xE0, 0x45, 0x83, 0x06, 0xC0, 0xFF, 0xF2, 0x13, - 0x0D, 0xF2, 0x53, 0x14, 0xC6, 0xBD, 0xFF, 0x0C, - 0x39, 0x86, 0xBB, 0xFF, 0x82, 0x13, 0x06, 0x87, - 0x3A, 0x05, 0x92, 0x13, 0x0B, 0x92, 0x53, 0x14, - 0x0C, 0x04, 0x46, 0xB8, 0xFF, 0x0C, 0x04, 0x06, - 0xB7, 0xFF, 0x00, 0x00, 0x00, 0x36, 0x61, 0x00, - 0xB2, 0xA0, 0x94, 0xA2, 0xC2, 0x34, 0x92, 0xC2, - 0x54, 0x99, 0x01, 0xA9, 0x11, 0xBC, 0xB4, 0x68, - 0x11, 0x5D, 0x09, 0x1C, 0x04, 0x72, 0x12, 0x12, - 0x82, 0xA0, 0x94, 0xC0, 0x77, 0x11, 0x7A, 0x72, - 0x8A, 0x77, 0x82, 0x16, 0x00, 0xB2, 0x07, 0x00, - 0x1B, 0x77, 0xAD, 0x0B, 0xB0, 0x88, 0xC0, 0x82, - 0x56, 0x00, 0x2B, 0x66, 0xA5, 0x35, 0x2D, 0x98, - 0x05, 0x0B, 0x44, 0xA0, 0x99, 0xC0, 0x99, 0x05, - 0x4B, 0x55, 0x56, 0xC4, 0xFD, 0x98, 0x01, 0xA8, - 0x11, 0xB2, 0xA0, 0x94, 0x5D, 0x09, 0x6D, 0x0A, - 0x72, 0x12, 0x12, 0x1C, 0x04, 0xC0, 0x77, 0x11, - 0x7A, 0x72, 0xBA, 0x77, 0xD2, 0x03, 0x01, 0xE2, - 0x03, 0x03, 0xC2, 0x03, 0x02, 0xB2, 0x03, 0x00, - 0xEA, 0xCC, 0xDA, 0xBB, 0xCA, 0xBB, 0xB0, 0xB2, - 0x41, 0xAD, 0x0B, 0xB2, 0x47, 0x00, 0x82, 0x16, - 0x00, 0x1B, 0x77, 0xBA, 0x88, 0x82, 0x56, 0x00, - 0x2B, 0x66, 0xA5, 0x30, 0x2D, 0x8B, 0x33, 0xF8, - 0x05, 0x0B, 0x44, 0xAA, 0xFF, 0xF9, 0x05, 0x4B, - 0x55, 0x56, 0x74, 0xFC, 0x82, 0x12, 0x12, 0x1B, - 0x88, 0x80, 0x80, 0x44, 0x82, 0x52, 0x12, 0x1D, - 0xF0, 0x36, 0x41, 0x00, 0x32, 0xC2, 0x34, 0x1C, - 0x05, 0x0C, 0x04, 0xB2, 0x13, 0x00, 0xAD, 0x0B, - 0xE5, 0x2D, 0x2D, 0x2B, 0x33, 0x0B, 0x55, 0xA0, - 0x95, 0x41, 0x82, 0x22, 0x15, 0x4B, 0x22, 0x90, - 0x88, 0xC0, 0x80, 0x85, 0x41, 0x8A, 0x44, 0x56, - 0x05, 0xFE, 0x40, 0x24, 0x41, 0x1D, 0xF0, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x1C, 0x07, 0x0C, 0x06, - 0x0C, 0x05, 0xB2, 0xC3, 0x81, 0x42, 0x03, 0x00, - 0xB2, 0x0B, 0x7E, 0xC2, 0x03, 0x01, 0x47, 0xBB, - 0x0C, 0x47, 0xBC, 0x11, 0x4D, 0x0B, 0xC7, 0xBB, - 0x0C, 0x4D, 0x0C, 0xC6, 0x01, 0x00, 0x47, 0x3C, - 0x04, 0xC7, 0xBB, 0x01, 0x4D, 0x0B, 0xAD, 0x04, - 0xBD, 0x04, 0xA5, 0x28, 0x2D, 0xAA, 0x66, 0x5A, - 0x54, 0x0B, 0x77, 0x4B, 0x33, 0xB2, 0xC3, 0x81, - 0x56, 0x97, 0xFC, 0xAD, 0x05, 0xBD, 0x05, 0x65, - 0x27, 0x2D, 0xD2, 0x12, 0x16, 0xA0, 0x94, 0x41, - 0x90, 0x96, 0xC0, 0xD0, 0xCD, 0xF0, 0x90, 0x94, - 0x41, 0x90, 0xE3, 0x41, 0xC0, 0xC3, 0x21, 0xEA, - 0xCC, 0xD0, 0x9C, 0x93, 0x92, 0x52, 0x16, 0x2D, - 0x09, 0x1D, 0xF0, 0x00, 0x00, 0x24, 0x00, 0x00, - 0x00, 0x64, 0x11, 0x02, 0x60, 0x04, 0x11, 0x02, - 0x60, 0xEC, 0x18, 0x00, 0x60, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x13, 0x02, - 0x60, 0xC8, 0x14, 0x02, 0x60, 0xD4, 0x13, 0x02, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x19, 0x00, - 0x60, 0x1C, 0x19, 0x00, 0x60, 0x04, 0x19, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x19, 0x00, - 0x60, 0x2C, 0x19, 0x00, 0x60, 0x08, 0x19, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x19, 0x00, 0x60, 0x48, 0x19, 0x00, - 0x60, 0x0C, 0x19, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x94, 0x15, 0x02, 0x60, 0x5C, 0x19, 0x00, - 0x60, 0x5C, 0x19, 0x00, 0x60, 0x58, 0x19, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x15, 0x02, - 0x60, 0xCC, 0x15, 0x02, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x6C, 0x19, 0x00, 0x60, 0x70, 0x19, 0x00, - 0x60, 0xB0, 0x19, 0x00, 0x60, 0x94, 0x02, 0x00, - 0x00, 0x84, 0x16, 0x02, 0x60, 0x5F, 0x16, 0x02, - 0x60, 0x84, 0x16, 0x02, 0x60, 0x0E, 0x17, 0x02, - 0x60, 0xE9, 0x16, 0x02, 0x60, 0xCE, 0x16, 0x02, - 0x60, 0x91, 0x16, 0x02, 0x60, 0x8A, 0x16, 0x02, - 0x60, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x0C, 0x00, - 0x60, 0xD4, 0x0C, 0x00, 0x60, 0x10, 0xB0, 0x02, - 0x00, 0xC0, 0x19, 0x00, 0x60, 0x20, 0x01, 0x00, - 0x00, 0xB0, 0x0A, 0x00, 0x60, 0x04, 0x10, 0x02, - 0x60, 0xA0, 0x0A, 0x00, 0x60, 0xA4, 0x10, 0x02, - 0x60, 0xF8, 0x10, 0x02, 0x60, 0x6C, 0x10, 0x02, - 0x60, 0x6C, 0x06, 0x00, 0x60, 0x20, 0x16, 0x02, - 0x60, 0xF4, 0x05, 0x00, 0x60, 0x4C, 0x10, 0x02, - 0x60, 0xA8, 0x0B, 0x00, 0x60, 0xF8, 0x18, 0x00, - 0x60, 0x68, 0x0A, 0x00, 0x60, 0x28, 0x8F, 0x04, - 0x60, 0x48, 0x08, 0x00, 0x60, 0xE0, 0x14, 0x02, - 0x60, 0xAC, 0x06, 0x00, 0x60, 0x20, 0x15, 0x02, - 0x60, 0x38, 0x15, 0x02, 0x60, 0xD8, 0x56, 0x04, - 0x60, 0x36, 0x41, 0x00, 0x81, 0x6F, 0x06, 0xB1, - 0x6D, 0x06, 0x0C, 0x6A, 0x91, 0x6E, 0x06, 0xA2, - 0x4B, 0x00, 0x89, 0x09, 0x25, 0x02, 0x00, 0x65, - 0x07, 0x00, 0x25, 0x09, 0x00, 0xE5, 0x07, 0x00, - 0x65, 0x02, 0x00, 0x65, 0x05, 0x00, 0xA5, 0x6E, - 0xFF, 0xA1, 0x70, 0x06, 0xB1, 0x71, 0x06, 0x65, - 0xB3, 0x2C, 0x1D, 0xF0, 0x00, 0x36, 0x41, 0x00, - 0x31, 0x72, 0x06, 0x21, 0x73, 0x06, 0x22, 0x63, - 0x75, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x0C, 0x8F, 0xB1, 0x72, 0x06, 0xA1, 0x77, 0x06, - 0x91, 0x78, 0x06, 0x81, 0x79, 0x06, 0x31, 0x7A, - 0x06, 0x21, 0x7B, 0x06, 0xC1, 0x76, 0x06, 0xD1, - 0x74, 0x06, 0xE1, 0x75, 0x06, 0xE9, 0xFD, 0xC2, - 0x6D, 0x19, 0x29, 0x83, 0x89, 0x39, 0xA2, 0x6B, - 0x6B, 0xF2, 0x5D, 0x1C, 0x1D, 0xF0, 0x00, 0x00, - 0x00, 0x36, 0x41, 0x00, 0x31, 0x7C, 0x06, 0x21, - 0x7D, 0x06, 0x48, 0x03, 0x49, 0x22, 0x29, 0x03, - 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x31, 0x7E, 0x06, 0x21, 0x7F, 0x06, 0x29, 0x13, - 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x31, 0x80, 0x06, 0x21, 0x81, 0x06, 0x22, 0x63, - 0x19, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, - 0x91, 0x83, 0x06, 0x21, 0x85, 0x06, 0x31, 0x82, - 0x06, 0x81, 0x84, 0x06, 0x89, 0xC3, 0x29, 0xA3, - 0x99, 0xB3, 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x04, 0x00, 0x18, 0x1A, 0x02, - 0x60, + 0x06, 0x00, 0x00, 0xE4, 0x0B, 0x00, 0x0F, 0x00, + 0x60, 0xD8, 0x0C, 0x00, 0x60, 0xD4, 0x0C, 0x00, + 0x60, 0xB0, 0x0A, 0x00, 0x60, 0x58, 0xB3, 0x04, + 0x60, 0x84, 0x05, 0x00, 0x60, 0xA4, 0xED, 0x04, + 0x60, 0x8C, 0x04, 0x00, 0x00, 0x00, 0x0F, 0x00, + 0x60, 0xC0, 0x0A, 0x00, 0x00, 0xA0, 0x0A, 0x00, + 0x60, 0xD0, 0x38, 0x04, 0x60, 0xB4, 0x39, 0x04, + 0x60, 0x58, 0xB4, 0x04, 0x60, 0xFC, 0x0C, 0x00, + 0x60, 0x80, 0x19, 0x00, 0x60, 0xC8, 0x0D, 0x00, + 0x60, 0x9C, 0x0B, 0x00, 0x60, 0xF4, 0x18, 0x00, + 0x60, 0xCC, 0x08, 0x00, 0x60, 0xF8, 0x18, 0x00, + 0x60, 0xA8, 0x0B, 0x00, 0x60, 0xE4, 0x06, 0x00, + 0x60, 0x54, 0x11, 0x02, 0x60, 0xAC, 0x06, 0x00, + 0x60, 0x48, 0x11, 0x02, 0x60, 0x04, 0x19, 0x00, + 0x60, 0x80, 0x7F, 0x00, 0x38, 0x80, 0x5F, 0x00, + 0x38, 0x80, 0x3F, 0x00, 0x38, 0xDC, 0x0C, 0x00, + 0x60, 0x1C, 0x19, 0x00, 0x60, 0x2C, 0x19, 0x00, + 0x60, 0x48, 0x19, 0x00, 0x60, 0x00, 0x40, 0x00, + 0x38, 0x00, 0xA0, 0x00, 0x38, 0x68, 0x0A, 0x00, + 0x60, 0x4C, 0x3F, 0x04, 0x60, 0xC0, 0x0D, 0x00, + 0x60, 0x5C, 0x19, 0x00, 0x60, 0x18, 0x0D, 0x00, + 0x60, 0x00, 0x9E, 0x00, 0x38, 0x58, 0x19, 0x00, + 0x60, 0xB0, 0x19, 0x00, 0x60, 0x20, 0x0E, 0x00, + 0x60, 0xFC, 0xFF, 0x00, 0x00, 0x90, 0x19, 0x00, + 0x60, 0x36, 0x41, 0x00, 0x65, 0x03, 0x00, 0x25, + 0x18, 0x00, 0x65, 0x15, 0x00, 0x25, 0x06, 0x00, + 0x25, 0x54, 0x00, 0x65, 0x50, 0x00, 0x25, 0x01, + 0x00, 0x91, 0xC0, 0x03, 0xA1, 0xC1, 0x03, 0x0C, + 0x08, 0x89, 0x0A, 0x82, 0x49, 0x00, 0x1D, 0xF0, + 0x00, 0x36, 0x41, 0x00, 0x31, 0xC2, 0x03, 0x21, + 0xC3, 0x03, 0x22, 0x63, 0x75, 0x1D, 0xF0, 0x00, + 0x00, 0x36, 0x41, 0x00, 0xA1, 0xC4, 0x03, 0xB1, + 0xC5, 0x03, 0xC1, 0xC6, 0x03, 0xA5, 0x8D, 0x2D, + 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x9C, 0x85, 0x20, 0x61, 0x00, 0xA5, 0xFA, 0xFF, + 0x20, 0xE6, 0x13, 0x10, 0x20, 0x00, 0x0C, 0x0A, + 0x65, 0xC8, 0x29, 0xA1, 0xC7, 0x03, 0xB1, 0xC8, + 0x03, 0xA5, 0x55, 0x2D, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x0C, 0xBB, 0x31, 0xC2, + 0x03, 0x21, 0xCC, 0x03, 0x81, 0xCB, 0x03, 0x91, + 0xC9, 0x03, 0xA1, 0xCA, 0x03, 0xA9, 0xF9, 0x82, + 0x69, 0x19, 0x22, 0x63, 0x6B, 0xB2, 0x59, 0x1C, + 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x21, 0xCD, 0x03, 0x88, 0x22, 0x37, 0x68, 0x0E, + 0xA1, 0xCE, 0x03, 0xA5, 0x7D, 0x2D, 0x98, 0x22, + 0x6C, 0x7A, 0xA0, 0x99, 0x10, 0x99, 0x22, 0xE5, + 0xA9, 0x22, 0x1D, 0xF0, 0x00, 0x36, 0x41, 0x00, + 0xCD, 0x04, 0xBD, 0x03, 0xAD, 0x02, 0xDD, 0x05, + 0x25, 0x3E, 0x2A, 0xAC, 0x15, 0x81, 0xCF, 0x03, + 0xA1, 0xD0, 0x03, 0x88, 0x08, 0x91, 0xCD, 0x03, + 0x82, 0x08, 0x02, 0x98, 0x29, 0xB6, 0x28, 0x06, + 0x91, 0xD1, 0x03, 0x99, 0x2A, 0x1D, 0xF0, 0x37, + 0x69, 0x05, 0x91, 0xD2, 0x03, 0x86, 0xFC, 0xFF, + 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, + 0xBD, 0x03, 0xAD, 0x02, 0xCD, 0x04, 0xDD, 0x05, + 0x1C, 0x8E, 0x25, 0xA1, 0x22, 0xBC, 0x16, 0x82, + 0x12, 0x1A, 0x5A, 0xA4, 0xEC, 0xA8, 0x1C, 0x79, + 0xA7, 0x39, 0x28, 0x92, 0xA4, 0x21, 0x92, 0x52, + 0x1A, 0x06, 0x05, 0x00, 0xA1, 0xCE, 0x03, 0x25, + 0x72, 0x2D, 0xA8, 0x82, 0xA5, 0x50, 0x00, 0xB1, + 0xCD, 0x03, 0xA8, 0x2B, 0x30, 0xAA, 0x20, 0xA9, + 0x2B, 0xA8, 0x82, 0xA5, 0x35, 0x2D, 0x0C, 0x0B, + 0xB9, 0x82, 0x1D, 0xF0, 0x1C, 0x83, 0xA7, 0xB3, + 0xDA, 0x92, 0xA4, 0x22, 0x86, 0xF3, 0xFF, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x8C, 0x36, 0x0C, 0x03, + 0x32, 0x52, 0x1A, 0x1D, 0xF0, 0x36, 0x41, 0x00, + 0x65, 0x4A, 0x00, 0xAD, 0x02, 0x81, 0xD2, 0x03, + 0x89, 0x22, 0xE5, 0xBC, 0x29, 0x1D, 0xF0, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x21, 0xD3, 0x03, 0x31, + 0xD4, 0x03, 0x28, 0x22, 0x29, 0x03, 0x1D, 0xF0, + 0x00, 0x36, 0x41, 0x00, 0x21, 0xD8, 0x03, 0x31, + 0xD7, 0x03, 0x91, 0xD5, 0x03, 0x81, 0xD6, 0x03, + 0x89, 0x49, 0x29, 0x03, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x25, 0x18, 0x00, 0x1D, + 0xF0, 0x36, 0x41, 0x00, 0xA5, 0x17, 0x00, 0x65, + 0x20, 0x24, 0x1D, 0xF0, 0x00, 0x36, 0x41, 0x00, + 0xAD, 0x02, 0x65, 0xBE, 0x24, 0x65, 0x16, 0x00, + 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x61, 0xD9, 0x03, 0xCC, 0xE4, 0xA2, 0xA0, 0x76, + 0x65, 0x22, 0x2D, 0xA9, 0x36, 0xCC, 0x4A, 0xA2, + 0xA4, 0x31, 0x25, 0xB2, 0x29, 0x72, 0xA0, 0x76, + 0xD8, 0x36, 0xA2, 0xA0, 0x75, 0xAC, 0x2D, 0x4A, + 0xB3, 0xB7, 0x37, 0x0E, 0xDA, 0xA4, 0xBD, 0x02, + 0xCD, 0x03, 0x65, 0x74, 0x2D, 0xA2, 0xA0, 0x75, + 0xC6, 0x03, 0x00, 0x47, 0x3A, 0x0C, 0xDA, 0xA4, + 0xBD, 0x02, 0x40, 0xC7, 0xC0, 0x25, 0x73, 0x2D, + 0xA2, 0xA0, 0x75, 0xBC, 0x75, 0xC8, 0x36, 0x4A, + 0xB3, 0xBC, 0x1C, 0xB7, 0x3A, 0x08, 0xA2, 0xA4, + 0x05, 0x25, 0xAE, 0x29, 0x46, 0x07, 0x00, 0xB7, + 0xB7, 0x25, 0xA2, 0xA4, 0x06, 0x65, 0xAD, 0x29, + 0x46, 0x04, 0x00, 0x0C, 0x0A, 0xE5, 0xAC, 0x29, + 0xA8, 0x46, 0xB8, 0x36, 0xC2, 0xA0, 0x76, 0x25, + 0x70, 0x2D, 0xA5, 0x02, 0x00, 0xA8, 0x36, 0xE5, + 0x25, 0x2D, 0x0C, 0x0D, 0xD9, 0x36, 0x1D, 0xF0, + 0xE8, 0x46, 0x8C, 0x1E, 0xA5, 0x0D, 0x00, 0xA2, + 0xA0, 0x76, 0x25, 0x1A, 0x2D, 0xA9, 0x46, 0x56, + 0x0A, 0xFD, 0xA2, 0xA4, 0x31, 0xE5, 0xA9, 0x29, + 0x46, 0xF6, 0xFF, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x21, 0xD9, 0x03, 0x91, 0xDA, 0x03, 0xB1, 0xDB, + 0x03, 0x81, 0xDC, 0x03, 0xC0, 0x20, 0x00, 0xA2, + 0x08, 0x84, 0xC0, 0x20, 0x00, 0xD2, 0x0B, 0x84, + 0xC0, 0x20, 0x00, 0xC2, 0x09, 0x84, 0x80, 0xDD, + 0x11, 0xD0, 0xAA, 0x20, 0x00, 0xCC, 0x11, 0xC0, + 0xAA, 0x20, 0xA9, 0xE2, 0xC0, 0x20, 0x00, 0x82, + 0x08, 0x81, 0xC0, 0x20, 0x00, 0xB2, 0x0B, 0x81, + 0xC0, 0x20, 0x00, 0xA8, 0x42, 0x80, 0xBB, 0x11, + 0x92, 0x09, 0x81, 0xB0, 0x88, 0x20, 0x00, 0x99, + 0x11, 0x90, 0x88, 0x20, 0x89, 0xF2, 0xE5, 0x73, + 0x24, 0x31, 0xDD, 0x03, 0x98, 0x42, 0x0C, 0x0B, + 0xA2, 0x09, 0x70, 0x92, 0x09, 0x71, 0xB2, 0x42, + 0x14, 0x80, 0x99, 0x11, 0xA0, 0x99, 0x20, 0x16, + 0x79, 0x04, 0xC0, 0x20, 0x00, 0xB8, 0x03, 0x9A, + 0xBB, 0x0B, 0xBB, 0xB9, 0x92, 0xA1, 0xDE, 0x03, + 0xA5, 0xFF, 0x20, 0xB8, 0x42, 0xB2, 0x0B, 0x75, + 0x9C, 0x9B, 0xC0, 0x20, 0x00, 0xA1, 0xDF, 0x03, + 0xD8, 0x03, 0xB0, 0xCB, 0x11, 0xB0, 0xCC, 0xC0, + 0xB0, 0xCC, 0xA0, 0xD0, 0xCC, 0xB0, 0x0B, 0xCC, + 0xC9, 0xD2, 0x65, 0xFD, 0x20, 0xA1, 0xE0, 0x03, + 0x0C, 0x1E, 0xE2, 0x62, 0x10, 0xC0, 0x20, 0x00, + 0xD8, 0x03, 0xD2, 0x62, 0x14, 0x25, 0xFC, 0x20, + 0x1D, 0xF0, 0xC0, 0x20, 0x00, 0xB8, 0x03, 0x06, + 0xEE, 0xFF, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x21, 0xD9, 0x03, 0x88, 0x42, 0x16, 0x28, 0x08, + 0xA2, 0xC2, 0x44, 0xE5, 0xFB, 0x20, 0xB8, 0x42, + 0x92, 0x0B, 0x74, 0x26, 0x19, 0x14, 0xA2, 0xC9, + 0xFE, 0x16, 0x9A, 0x07, 0xC2, 0xC9, 0xFD, 0x16, + 0xAC, 0x06, 0xA2, 0xCB, 0x48, 0x25, 0x1A, 0x00, + 0x46, 0x01, 0x00, 0xA2, 0xCB, 0x50, 0xA5, 0x19, + 0x00, 0xA1, 0xDE, 0x03, 0x65, 0xF9, 0x20, 0xA1, + 0xDF, 0x03, 0xE5, 0xF8, 0x20, 0xE1, 0xDA, 0x03, + 0x81, 0xDB, 0x03, 0xA1, 0xDC, 0x03, 0xD8, 0xE2, + 0xC0, 0x20, 0x00, 0xD2, 0x4A, 0x84, 0xC8, 0xE2, + 0xC0, 0x20, 0x00, 0xC0, 0xC8, 0x41, 0xC2, 0x48, + 0x84, 0xB8, 0xE2, 0xC0, 0x20, 0x00, 0xB0, 0xB0, + 0xF5, 0xB2, 0x4E, 0x84, 0x98, 0xF2, 0xC0, 0x20, + 0x00, 0x92, 0x4A, 0x81, 0xF8, 0xF2, 0xC0, 0x20, + 0x00, 0xF0, 0xF8, 0x41, 0xF2, 0x48, 0x81, 0xD8, + 0xF2, 0xC0, 0x20, 0x00, 0xD0, 0xD0, 0xF5, 0xD2, + 0x4E, 0x81, 0xA8, 0x42, 0x25, 0x0F, 0x2D, 0x0C, + 0x0E, 0xE9, 0x42, 0x1D, 0xF0, 0xA2, 0xCB, 0x60, + 0xA5, 0x13, 0x00, 0x86, 0xE6, 0xFF, 0xA2, 0xCB, + 0x58, 0xE5, 0x12, 0x00, 0x46, 0xE4, 0xFF, 0x00, + 0x00, 0x36, 0x41, 0x00, 0xB1, 0xD9, 0x03, 0x0C, + 0x1D, 0x98, 0x4B, 0xA2, 0x0B, 0x14, 0xAC, 0x79, + 0xC1, 0xDD, 0x03, 0xEC, 0x4A, 0xA2, 0x09, 0x72, + 0xE2, 0x09, 0x73, 0xD2, 0x4B, 0x14, 0x80, 0x9E, + 0x11, 0xA0, 0x99, 0x20, 0xBC, 0xD9, 0xC0, 0x20, + 0x00, 0xA8, 0x0C, 0x9A, 0x9A, 0x0B, 0x99, 0x99, + 0x32, 0xD2, 0x6B, 0x10, 0xAD, 0x02, 0xA5, 0xED, + 0x20, 0x1D, 0xF0, 0x66, 0x1A, 0xF2, 0xE2, 0x09, + 0x71, 0xA2, 0x09, 0x70, 0x80, 0x9E, 0x11, 0xA0, + 0x99, 0x20, 0x0C, 0x0E, 0xE2, 0x4B, 0x14, 0x8C, + 0xA9, 0xC0, 0x20, 0x00, 0xA8, 0x0C, 0x9A, 0x9A, + 0x0B, 0x99, 0x46, 0xF4, 0xFF, 0xC0, 0x20, 0x00, + 0x98, 0x0C, 0x46, 0xF2, 0xFF, 0xC0, 0x20, 0x00, + 0x98, 0x0C, 0x46, 0xF0, 0xFF, 0x36, 0x41, 0x00, + 0x31, 0xD9, 0x03, 0xB8, 0x43, 0x92, 0x03, 0x14, + 0x16, 0xFB, 0x09, 0xFC, 0x99, 0x82, 0x0B, 0x71, + 0xA2, 0x0B, 0x70, 0x80, 0x88, 0x11, 0xA0, 0x88, + 0x20, 0xAC, 0xB8, 0xC2, 0x0B, 0x68, 0x92, 0x0B, + 0x6B, 0xA2, 0x0B, 0x6A, 0x80, 0x99, 0x11, 0xA0, + 0x99, 0x20, 0xA2, 0x0B, 0x69, 0x80, 0x99, 0x11, + 0xA0, 0x99, 0x20, 0xA2, 0x23, 0x10, 0x80, 0x99, + 0x11, 0xC0, 0x99, 0x20, 0xA7, 0x09, 0x6D, 0xA2, + 0xCB, 0x50, 0x65, 0x07, 0x00, 0xC6, 0x10, 0x00, + 0x66, 0x19, 0x40, 0xA2, 0x0B, 0x73, 0xC2, 0x0B, + 0x72, 0x80, 0xAA, 0x11, 0xC0, 0xAA, 0x20, 0xBC, + 0x1A, 0xE2, 0x0B, 0x6C, 0xC2, 0x0B, 0x6F, 0xD2, + 0x0B, 0x6E, 0x80, 0xCC, 0x11, 0xD0, 0xCC, 0x20, + 0xD2, 0x0B, 0x6D, 0x80, 0xCC, 0x11, 0xD0, 0xCC, + 0x20, 0xD2, 0x23, 0x10, 0x80, 0xCC, 0x11, 0xE0, + 0xCC, 0x20, 0xD7, 0x0C, 0x08, 0xA2, 0xCB, 0x60, + 0xA5, 0x03, 0x00, 0x46, 0x01, 0x00, 0xA2, 0xCB, + 0x58, 0xE5, 0x02, 0x00, 0xAD, 0x02, 0xD1, 0xDD, + 0x03, 0x82, 0x23, 0x10, 0x0C, 0x1F, 0xF0, 0x88, + 0x11, 0xED, 0x08, 0x80, 0xEF, 0x83, 0xE2, 0x63, + 0x10, 0xC0, 0x20, 0x00, 0xD8, 0x0D, 0xD9, 0x32, + 0xA5, 0xDF, 0x20, 0x1D, 0xF0, 0xA2, 0xCB, 0x48, + 0xA5, 0x00, 0x00, 0x46, 0xF5, 0xFF, 0x00, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x4B, 0xA2, 0x25, 0x28, + 0x2D, 0x3D, 0x0A, 0xAD, 0x02, 0xA5, 0x27, 0x2D, + 0xB1, 0xE1, 0x03, 0xC1, 0xE2, 0x03, 0xC0, 0x20, + 0x00, 0x82, 0x0B, 0x03, 0xC0, 0x20, 0x00, 0x30, + 0x88, 0x10, 0x30, 0x38, 0x41, 0x80, 0x8A, 0x20, + 0xA0, 0xA8, 0x41, 0x82, 0x4B, 0x03, 0xB2, 0xDB, + 0x20, 0xC7, 0x9B, 0xE1, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x36, 0x41, 0x00, 0xA5, 0xDF, 0xFF, 0x1D, + 0xF0, 0x36, 0x41, 0x00, 0x31, 0xE3, 0x03, 0x21, + 0xE4, 0x03, 0x29, 0x13, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x81, 0xE5, 0x03, 0x30, + 0x61, 0x00, 0x88, 0x08, 0x82, 0x08, 0x10, 0x26, + 0x48, 0x07, 0xAD, 0x02, 0x25, 0x49, 0x28, 0x06, + 0x01, 0x00, 0x0C, 0x0A, 0x65, 0xE2, 0x20, 0x30, + 0xE6, 0x13, 0x10, 0x20, 0x00, 0x1D, 0xF0, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x21, 0xE6, 0x03, 0x88, + 0x02, 0x27, 0x18, 0x09, 0xAD, 0x02, 0xE5, 0x07, + 0x00, 0xAD, 0x02, 0x65, 0xD7, 0x20, 0x1D, 0xF0, + 0x00, 0x36, 0x41, 0x00, 0x20, 0x61, 0x00, 0xA1, + 0xE6, 0x03, 0x65, 0xD6, 0x20, 0x25, 0x1D, 0x24, + 0x20, 0xE6, 0x13, 0x10, 0x20, 0x00, 0x1D, 0xF0, + 0x00, 0x36, 0x41, 0x00, 0x41, 0xE7, 0x03, 0x21, + 0xE8, 0x03, 0xC0, 0x20, 0x00, 0x32, 0x22, 0x81, + 0x98, 0x54, 0x88, 0x34, 0x30, 0x99, 0x20, 0x99, + 0x54, 0x87, 0x03, 0x06, 0x0C, 0x0A, 0xA9, 0x34, + 0x25, 0xDA, 0x21, 0x0C, 0x1D, 0x3C, 0x8C, 0xB8, + 0x44, 0xC0, 0x20, 0x00, 0xC0, 0xBB, 0x10, 0xB2, + 0x62, 0x80, 0xC0, 0x20, 0x00, 0xE2, 0x22, 0x81, + 0xE0, 0xF0, 0x04, 0x07, 0xEE, 0xF3, 0xC0, 0x20, + 0x00, 0xB1, 0xDD, 0x03, 0x32, 0x62, 0x81, 0xC0, + 0x20, 0x00, 0xB8, 0x0B, 0xA1, 0xE9, 0x03, 0x1B, + 0xBB, 0xB9, 0x4A, 0x4B, 0xAA, 0xA5, 0xCE, 0x20, + 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x20, 0x61, 0x00, 0x3C, 0x8A, 0x0C, 0x0B, 0x25, + 0x1A, 0x24, 0x20, 0xE6, 0x13, 0x10, 0x20, 0x00, + 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x31, 0xEA, 0x03, 0x38, 0x03, 0x8C, 0x73, 0x88, + 0x23, 0x66, 0x28, 0x03, 0x0C, 0x39, 0x99, 0x23, + 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x31, 0xEB, 0x03, 0x0C, 0x02, 0x22, 0x43, 0x00, + 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, + 0xBD, 0x02, 0x21, 0xEA, 0x03, 0x28, 0x02, 0x1C, + 0x8C, 0xCB, 0xA2, 0xE5, 0x2E, 0x2D, 0xD1, 0xEC, + 0x03, 0x2C, 0x0B, 0x92, 0x12, 0x11, 0x0C, 0x1C, + 0xDC, 0x79, 0xA2, 0x12, 0x0F, 0x92, 0x12, 0x0E, + 0xA0, 0xA0, 0xE4, 0x90, 0xAA, 0xC0, 0xA2, 0xCA, + 0xC2, 0xA0, 0xA1, 0x21, 0xAA, 0x99, 0x8B, 0x99, + 0x92, 0x52, 0x11, 0xB2, 0x52, 0x13, 0xC9, 0x22, + 0xD0, 0xD9, 0x10, 0xD2, 0x52, 0x11, 0x1D, 0xF0, + 0x00, 0x36, 0x41, 0x00, 0xD8, 0x22, 0x31, 0xEA, + 0x03, 0x0C, 0x1E, 0x38, 0x03, 0x0C, 0x0C, 0xAD, + 0x03, 0xF2, 0x13, 0x13, 0xB2, 0x13, 0x10, 0xF0, + 0xCE, 0x83, 0xDA, 0xBB, 0x25, 0x17, 0x00, 0x0C, + 0x45, 0xA8, 0x23, 0x92, 0x13, 0x13, 0x0C, 0x04, + 0x8C, 0x69, 0x0B, 0x99, 0x90, 0x90, 0xF4, 0x92, + 0x53, 0x13, 0xF6, 0x8A, 0x2F, 0xB1, 0xED, 0x03, + 0xB0, 0xBA, 0xA0, 0xB8, 0x0B, 0xA0, 0x0B, 0x00, + 0xC8, 0x22, 0xB2, 0x13, 0x11, 0xAD, 0x03, 0xCA, + 0xBB, 0x65, 0x21, 0x00, 0xD2, 0x13, 0x06, 0xF1, + 0xEB, 0x03, 0xD7, 0x3A, 0x0F, 0x0C, 0x29, 0x92, + 0x4F, 0x00, 0xE2, 0x13, 0x0F, 0xE0, 0xEF, 0x04, + 0x16, 0xBE, 0x10, 0x99, 0x23, 0x0C, 0x14, 0x2D, + 0x04, 0x1D, 0xF0, 0x49, 0x23, 0x0C, 0x24, 0x06, + 0xFD, 0xFF, 0xAD, 0x03, 0xE5, 0x1B, 0x00, 0x82, + 0x13, 0x09, 0xB2, 0x13, 0x08, 0x87, 0x3A, 0x02, + 0x06, 0x24, 0x00, 0xC8, 0x22, 0xB2, 0x13, 0x11, + 0xAD, 0x03, 0xCA, 0xBB, 0x65, 0x1D, 0x00, 0xD2, + 0x13, 0x07, 0xD7, 0x3A, 0x02, 0xC6, 0x36, 0x00, + 0xE2, 0x13, 0x14, 0x0B, 0xEE, 0xE0, 0xE0, 0xF4, + 0xE2, 0x53, 0x14, 0x56, 0xEE, 0x0D, 0x0C, 0x24, + 0x0C, 0x7F, 0xF9, 0x23, 0xC6, 0xED, 0xFF, 0xAD, + 0x03, 0xE5, 0x17, 0x00, 0x82, 0x13, 0x08, 0x87, + 0x3A, 0x6A, 0x59, 0x23, 0x42, 0x53, 0x16, 0x92, + 0x13, 0x0A, 0x92, 0x53, 0x14, 0x0C, 0x04, 0x06, + 0xE7, 0xFF, 0xAD, 0x03, 0x65, 0x16, 0x00, 0xB2, + 0x13, 0x08, 0xB7, 0x3A, 0x29, 0xC2, 0x13, 0x14, + 0x0B, 0xCC, 0xC0, 0xC0, 0xF4, 0xC2, 0x53, 0x14, + 0xEC, 0xBC, 0x0C, 0x6D, 0xE2, 0x13, 0x0B, 0xE2, + 0x53, 0x14, 0xD9, 0x23, 0xC6, 0x07, 0x00, 0xDC, + 0xC9, 0x59, 0x23, 0x42, 0x53, 0x16, 0xF2, 0x13, + 0x0A, 0xF2, 0x53, 0x14, 0xC6, 0x03, 0x00, 0x0C, + 0x58, 0x92, 0x13, 0x0D, 0xA2, 0x13, 0x0C, 0xA2, + 0x53, 0x14, 0x92, 0x53, 0x15, 0x89, 0x23, 0x0C, + 0x04, 0x86, 0xD4, 0xFF, 0xB7, 0x3A, 0x05, 0xC2, + 0x13, 0x0B, 0xC2, 0x53, 0x14, 0x42, 0x53, 0x16, + 0x0C, 0x04, 0x46, 0xD0, 0xFF, 0x92, 0x13, 0x15, + 0x66, 0x19, 0x09, 0x0C, 0x34, 0x0B, 0xD9, 0xD2, + 0x53, 0x15, 0x46, 0xCC, 0xFF, 0xCC, 0x39, 0x0C, + 0x14, 0x86, 0x01, 0x00, 0x0C, 0x04, 0x0B, 0xE9, + 0xE2, 0x53, 0x15, 0xC8, 0x22, 0xB2, 0x13, 0x11, + 0xAD, 0x03, 0xCA, 0xBB, 0x65, 0x11, 0x00, 0xD2, + 0x13, 0x07, 0xD7, 0xBA, 0x10, 0xE2, 0x13, 0x14, + 0x0B, 0xEE, 0xE0, 0xE0, 0xF4, 0xE2, 0x53, 0x14, + 0xE0, 0x45, 0x83, 0x06, 0xC0, 0xFF, 0xF2, 0x13, + 0x0D, 0xF2, 0x53, 0x14, 0xC6, 0xBD, 0xFF, 0x0C, + 0x39, 0x86, 0xBB, 0xFF, 0x82, 0x13, 0x06, 0x87, + 0x3A, 0x05, 0x92, 0x13, 0x0B, 0x92, 0x53, 0x14, + 0x0C, 0x04, 0x46, 0xB8, 0xFF, 0x0C, 0x04, 0x06, + 0xB7, 0xFF, 0x00, 0x00, 0x00, 0x36, 0x61, 0x00, + 0xB2, 0xA0, 0x94, 0xA2, 0xC2, 0x34, 0x92, 0xC2, + 0x54, 0x99, 0x01, 0xA9, 0x11, 0xBC, 0xB4, 0x68, + 0x11, 0x5D, 0x09, 0x1C, 0x04, 0x72, 0x12, 0x12, + 0x82, 0xA0, 0x94, 0xC0, 0x77, 0x11, 0x7A, 0x72, + 0x8A, 0x77, 0x82, 0x16, 0x00, 0xB2, 0x07, 0x00, + 0x1B, 0x77, 0xAD, 0x0B, 0xB0, 0x88, 0xC0, 0x82, + 0x56, 0x00, 0x2B, 0x66, 0xA5, 0x35, 0x2D, 0x98, + 0x05, 0x0B, 0x44, 0xA0, 0x99, 0xC0, 0x99, 0x05, + 0x4B, 0x55, 0x56, 0xC4, 0xFD, 0x98, 0x01, 0xA8, + 0x11, 0xB2, 0xA0, 0x94, 0x5D, 0x09, 0x6D, 0x0A, + 0x72, 0x12, 0x12, 0x1C, 0x04, 0xC0, 0x77, 0x11, + 0x7A, 0x72, 0xBA, 0x77, 0xD2, 0x03, 0x01, 0xE2, + 0x03, 0x03, 0xC2, 0x03, 0x02, 0xB2, 0x03, 0x00, + 0xEA, 0xCC, 0xDA, 0xBB, 0xCA, 0xBB, 0xB0, 0xB2, + 0x41, 0xAD, 0x0B, 0xB2, 0x47, 0x00, 0x82, 0x16, + 0x00, 0x1B, 0x77, 0xBA, 0x88, 0x82, 0x56, 0x00, + 0x2B, 0x66, 0xA5, 0x30, 0x2D, 0x8B, 0x33, 0xF8, + 0x05, 0x0B, 0x44, 0xAA, 0xFF, 0xF9, 0x05, 0x4B, + 0x55, 0x56, 0x74, 0xFC, 0x82, 0x12, 0x12, 0x1B, + 0x88, 0x80, 0x80, 0x44, 0x82, 0x52, 0x12, 0x1D, + 0xF0, 0x36, 0x41, 0x00, 0x32, 0xC2, 0x34, 0x1C, + 0x05, 0x0C, 0x04, 0xB2, 0x13, 0x00, 0xAD, 0x0B, + 0xE5, 0x2D, 0x2D, 0x2B, 0x33, 0x0B, 0x55, 0xA0, + 0x95, 0x41, 0x82, 0x22, 0x15, 0x4B, 0x22, 0x90, + 0x88, 0xC0, 0x80, 0x85, 0x41, 0x8A, 0x44, 0x56, + 0x05, 0xFE, 0x40, 0x24, 0x41, 0x1D, 0xF0, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x1C, 0x07, 0x0C, 0x06, + 0x0C, 0x05, 0xB2, 0xC3, 0x81, 0x42, 0x03, 0x00, + 0xB2, 0x0B, 0x7E, 0xC2, 0x03, 0x01, 0x47, 0xBB, + 0x0C, 0x47, 0xBC, 0x11, 0x4D, 0x0B, 0xC7, 0xBB, + 0x0C, 0x4D, 0x0C, 0xC6, 0x01, 0x00, 0x47, 0x3C, + 0x04, 0xC7, 0xBB, 0x01, 0x4D, 0x0B, 0xAD, 0x04, + 0xBD, 0x04, 0xA5, 0x28, 0x2D, 0xAA, 0x66, 0x5A, + 0x54, 0x0B, 0x77, 0x4B, 0x33, 0xB2, 0xC3, 0x81, + 0x56, 0x97, 0xFC, 0xAD, 0x05, 0xBD, 0x05, 0x65, + 0x27, 0x2D, 0xD2, 0x12, 0x16, 0xA0, 0x94, 0x41, + 0x90, 0x96, 0xC0, 0xD0, 0xCD, 0xF0, 0x90, 0x94, + 0x41, 0x90, 0xE3, 0x41, 0xC0, 0xC3, 0x21, 0xEA, + 0xCC, 0xD0, 0x9C, 0x93, 0x92, 0x52, 0x16, 0x2D, + 0x09, 0x1D, 0xF0, 0x00, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x64, 0x11, 0x02, 0x60, 0x04, 0x11, 0x02, + 0x60, 0xEC, 0x18, 0x00, 0x60, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x13, 0x02, + 0x60, 0xC8, 0x14, 0x02, 0x60, 0xD4, 0x13, 0x02, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x19, 0x00, + 0x60, 0x1C, 0x19, 0x00, 0x60, 0x04, 0x19, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x19, 0x00, + 0x60, 0x2C, 0x19, 0x00, 0x60, 0x08, 0x19, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x19, 0x00, 0x60, 0x48, 0x19, 0x00, + 0x60, 0x0C, 0x19, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x94, 0x15, 0x02, 0x60, 0x5C, 0x19, 0x00, + 0x60, 0x5C, 0x19, 0x00, 0x60, 0x58, 0x19, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x15, 0x02, + 0x60, 0xCC, 0x15, 0x02, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x6C, 0x19, 0x00, 0x60, 0x70, 0x19, 0x00, + 0x60, 0xB0, 0x19, 0x00, 0x60, 0x94, 0x02, 0x00, + 0x00, 0x84, 0x16, 0x02, 0x60, 0x5F, 0x16, 0x02, + 0x60, 0x84, 0x16, 0x02, 0x60, 0x0E, 0x17, 0x02, + 0x60, 0xE9, 0x16, 0x02, 0x60, 0xCE, 0x16, 0x02, + 0x60, 0x91, 0x16, 0x02, 0x60, 0x8A, 0x16, 0x02, + 0x60, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x0C, 0x00, + 0x60, 0xD4, 0x0C, 0x00, 0x60, 0x10, 0xB0, 0x02, + 0x00, 0xC0, 0x19, 0x00, 0x60, 0x20, 0x01, 0x00, + 0x00, 0xB0, 0x0A, 0x00, 0x60, 0x04, 0x10, 0x02, + 0x60, 0xA0, 0x0A, 0x00, 0x60, 0xA4, 0x10, 0x02, + 0x60, 0xF8, 0x10, 0x02, 0x60, 0x6C, 0x10, 0x02, + 0x60, 0x6C, 0x06, 0x00, 0x60, 0x20, 0x16, 0x02, + 0x60, 0xF4, 0x05, 0x00, 0x60, 0x4C, 0x10, 0x02, + 0x60, 0xA8, 0x0B, 0x00, 0x60, 0xF8, 0x18, 0x00, + 0x60, 0x68, 0x0A, 0x00, 0x60, 0x28, 0x8F, 0x04, + 0x60, 0x48, 0x08, 0x00, 0x60, 0xE0, 0x14, 0x02, + 0x60, 0xAC, 0x06, 0x00, 0x60, 0x20, 0x15, 0x02, + 0x60, 0x38, 0x15, 0x02, 0x60, 0xD8, 0x56, 0x04, + 0x60, 0x36, 0x41, 0x00, 0x81, 0x6F, 0x06, 0xB1, + 0x6D, 0x06, 0x0C, 0x6A, 0x91, 0x6E, 0x06, 0xA2, + 0x4B, 0x00, 0x89, 0x09, 0x25, 0x02, 0x00, 0x65, + 0x07, 0x00, 0x25, 0x09, 0x00, 0xE5, 0x07, 0x00, + 0x65, 0x02, 0x00, 0x65, 0x05, 0x00, 0xA5, 0x6E, + 0xFF, 0xA1, 0x70, 0x06, 0xB1, 0x71, 0x06, 0x65, + 0xB3, 0x2C, 0x1D, 0xF0, 0x00, 0x36, 0x41, 0x00, + 0x31, 0x72, 0x06, 0x21, 0x73, 0x06, 0x22, 0x63, + 0x75, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x0C, 0x8F, 0xB1, 0x72, 0x06, 0xA1, 0x77, 0x06, + 0x91, 0x78, 0x06, 0x81, 0x79, 0x06, 0x31, 0x7A, + 0x06, 0x21, 0x7B, 0x06, 0xC1, 0x76, 0x06, 0xD1, + 0x74, 0x06, 0xE1, 0x75, 0x06, 0xE9, 0xFD, 0xC2, + 0x6D, 0x19, 0x29, 0x83, 0x89, 0x39, 0xA2, 0x6B, + 0x6B, 0xF2, 0x5D, 0x1C, 0x1D, 0xF0, 0x00, 0x00, + 0x00, 0x36, 0x41, 0x00, 0x31, 0x7C, 0x06, 0x21, + 0x7D, 0x06, 0x48, 0x03, 0x49, 0x22, 0x29, 0x03, + 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x31, 0x7E, 0x06, 0x21, 0x7F, 0x06, 0x29, 0x13, + 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x31, 0x80, 0x06, 0x21, 0x81, 0x06, 0x22, 0x63, + 0x19, 0x1D, 0xF0, 0x00, 0x00, 0x36, 0x41, 0x00, + 0x91, 0x83, 0x06, 0x21, 0x85, 0x06, 0x31, 0x82, + 0x06, 0x81, 0x84, 0x06, 0x89, 0xC3, 0x29, 0xA3, + 0x99, 0xB3, 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x04, 0x00, 0x18, 0x1A, 0x02, + 0x60, }; static const unsigned char vfs301_12[] = { /* 57 B */ - 0x12, 0x90, 0x02, 0x00, 0x00, 0xFE, 0x03, 0x00, - 0x00, 0xFF, 0x1F, 0xFF, 0x1F, 0x00, 0x00, 0x00, - 0x00, 0xE3, 0x18, 0xD8, 0x01, 0xE3, 0x18, 0xD8, - 0x01, 0xE3, 0x18, 0xD8, 0x01, 0xE3, 0x18, 0xD8, - 0x01, 0xE3, 0x18, 0xD8, 0x01, 0x20, 0xFA, 0x80, - 0x00, 0x3F, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x00, - 0x00, + 0x12, 0x90, 0x02, 0x00, 0x00, 0xFE, 0x03, 0x00, + 0x00, 0xFF, 0x1F, 0xFF, 0x1F, 0x00, 0x00, 0x00, + 0x00, 0xE3, 0x18, 0xD8, 0x01, 0xE3, 0x18, 0xD8, + 0x01, 0xE3, 0x18, 0xD8, 0x01, 0xE3, 0x18, 0xD8, + 0x01, 0xE3, 0x18, 0xD8, 0x01, 0x20, 0xFA, 0x80, + 0x00, 0x3F, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x00, + 0x00, }; static const unsigned char vfs301_24[] = { /* 119 B */ - 0x24, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, - 0x07, 0x00, 0x00, 0x00, - 0xF8, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, - 0x07, 0x00, 0x00, 0x00, - 0xF8, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, - 0x07, 0x00, 0x00, 0x00, - 0xF8, 0xFF, 0xFF, 0xFF, - 0x07, 0x00, 0x00, 0x00, - 0xF8, 0xFF, 0xFF, 0xFF, - 0x07, 0x00, 0x00, 0x00, - 0xF8, 0xFF, 0xFF, 0xFF, - 0x07, 0x00, 0x00, 0x00, - 0xF8, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /* or : - * 0x00, 0xF4, 0x01, 0xF4, 0x01, 0x00, 0xB4, */ + 0x24, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, + 0x07, 0x00, 0x00, 0x00, + 0xF8, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, + 0x07, 0x00, 0x00, 0x00, + 0xF8, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, + 0x07, 0x00, 0x00, 0x00, + 0xF8, 0xFF, 0xFF, 0xFF, + 0x07, 0x00, 0x00, 0x00, + 0xF8, 0xFF, 0xFF, 0xFF, + 0x07, 0x00, 0x00, 0x00, + 0xF8, 0xFF, 0xFF, 0xFF, + 0x07, 0x00, 0x00, 0x00, + 0xF8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* or : + * 0x00, 0xF4, 0x01, 0xF4, 0x01, 0x00, 0xB4, */ }; -#define PACKET(cmd, length, payload)\ - cmd length payload +#define PACKET(cmd, length, payload) \ + cmd length payload /* This could be some kind of poke-command. * a looks like the address; (addr << 2), stored in little endian, * b looks like some flags, value of a seems to imply value of b * c looks like the stored value */ #define S1(a, b, c) \ - PACKET("0300", "0900", a b c "04") + PACKET ("0300", "0900", a b c "04") #define S2(a) \ - PACKET("0500", "0E00", a) + PACKET ("0500", "0E00", a) #define S3(a) \ - PACKET("0A00", "0800", a a) + PACKET ("0A00", "0800", a a) #define S4_TAIL \ - "00008000" "6400F401" "00000000" "0000C780" "24004400" + "00008000" "6400F401" "00000000" "0000C780" "24004400" #define S4(a) \ - PACKET("0800", "1800", a a S4_TAIL) + PACKET ("0800", "1800", a a S4_TAIL) #define Z8() \ - "00000000" + "00000000" #define TERM() \ - PACKET("1500", "0800", "0000000020280000") + PACKET ("1500", "0800", "0000000020280000") /* NOTE: * * Reordering the S1() macros in BLOB1 (and similar) doesn't @@ -1153,1479 +1153,1479 @@ static const unsigned char vfs301_24[] = { /* 119 B */ * input lines? */ #define vfs301_0220_BLOB1 \ - S1("0420", "0430", "00000000"),\ - S1("1820", "0430", "00000000"),\ - S1("2020", "0430", "08008000"),\ - S1("2420", "0430", "0000FF01"),\ - S1("2C20", "0430", "01000000"),\ - S1("4020", "0430", "FF030000"),\ - S1("4420", "0430", "E5030000"),\ - S1("4820", "0430", "EA030000"),\ - S1("4C20", "0430", "EA030000"),\ - S1("5020", "0430", "00000400"),\ - S1("5420", "0430", "01980200"),\ - S1("0021", "0430", "00000000"),\ - S1("0421", "0430", "01000000"),\ - S1("0821", "0430", "02000000"),\ - S1("0C21", "0430", "01000000"),\ - S1("1021", "0430", "01000000"),\ - S1("1421", "0430", "01000000"),\ - S1("1821", "0430", "01000000"),\ - S1("1C21", "0430", "1F000000"),\ - S1("2021", "0430", "08000000"),\ - S1("4021", "0430", "00000000"),\ - S1("4421", "0430", "01000000"),\ - S1("4821", "0430", "02000000"),\ - S1("4C21", "0430", "01000000"),\ - S1("5021", "0430", "01000000"),\ - S1("5421", "0430", "01000000"),\ - S1("5821", "0430", "01000000"),\ - S1("5C21", "0430", "1F000000"),\ - S1("6021", "0430", "08000000"),\ - S1("8021", "0430", "30000000"),\ - S1("8421", "0430", "01000000"),\ - S1("8821", "0430", "01000000"),\ - S1("8C21", "0430", "01000000"),\ - S1("9021", "0430", "00000000"),\ - S1("9421", "0430", "01000000"),\ - S1("9821", "0430", "00000000"),\ - S1("9C21", "0430", "1F000000"),\ - S1("A021", "0430", "04000000"),\ - S1("C021", "0430", "30000000"),\ - S1("C421", "0430", "01000000"),\ - S1("C821", "0430", "01000000"),\ - S1("CC21", "0430", "01000000"),\ - S1("D021", "0430", "01000000"),\ - S1("D421", "0430", "01000000"),\ - S1("D821", "0430", "01000000"),\ - S1("DC21", "0430", "1F000000"),\ - S1("E021", "0430", "03000000"),\ - S1("A020", "0430", "EFE10000"),\ - S1("A420", "0430", "00000000"),\ - S1("A820", "0430", "FE210400"),\ - S1("B020", "0430", "00000000"),\ - S1("C420", "0430", "14000000"),\ - S1("C820", "0430", "00000000"),\ - S1("CC20", "0430", "20000000"),\ - S1("38A0", "0038", "5CA30000"),\ - S1("0000", "0038", "02000000"),\ - S1("0400", "0038", "00080000"),\ - S1("0800", "0038", "00120000"),\ - S1("0C00", "0038", "01030200"),\ - S1("1000", "0038", "01070200"),\ - S1("1400", "0038", "0C0C8A00"),\ - PACKET("0200", "8005", \ - "FFF98720" \ - "1AF88700" \ - "1AF88700" \ - "1AF88700" \ - "1AF88700" \ - "1AF88700" \ - "1AF88700" \ - /* NOTE: The following(?) 200 values specify order of fingerprint columns \ - * in vfs301_line_t::scan. */ \ - "1AF80720" \ - "1BF80720" \ - "1CF80720" \ - "1DF80720" \ - "1EF80720" \ - "1FF80720" \ - "20F80720" \ - "21F80720" \ - "22F80720" \ - "23F80720" \ - "24F80722" \ - "25F80722" \ - "26F80722" \ - "27F80722" \ - "28F80722" \ - "29F80722" \ - "2AF80722" \ - "2BF80722" \ - "2CF80722" \ - "2DF80722" \ - "2EF80722" \ - "2FF80722" \ - "30F80722" \ - "31F80722" \ - "32F80722" \ - "33F80722" \ - "34F80722" \ - "35F80722" \ - "36F80722" \ - "37F80722" \ - "38F80722" \ - "39F80722" \ - "3AF80722" \ - "3BF80722" \ - "3CF80722" \ - "3DF80722" \ - "3EF80722" \ - "3FF80722" \ - "40F80722" \ - "41F80722" \ - "42F80722" \ - "43F80722" \ - "44F80722" \ - "45F80722" \ - "46F80722" \ - "47F80722" \ - "48F80722" \ - "49F80722" \ - "4AF80722" \ - "4BF80722" \ - "4CF80722" \ - "4DF80722" \ - "4EF80722" \ - "4FF80722" \ - "50F80722" \ - "51F80722" \ - "52F80722" \ - "53F80722" \ - "54F80722" \ - "55F80722" \ - "56F80722" \ - "57F80722" \ - "58F80722" \ - "59F80722" \ - "5AF80722" \ - "5BF80722" \ - "5CF80722" \ - "5DF80722" \ - "5EF80722" \ - "5FF80722" \ - "60F80722" \ - "61F80722" \ - "62F80722" \ - "63F80722" \ - "64F80722" \ - "65F80722" \ - "66F80722" \ - "67F80722" \ - "68F80722" \ - "69F80722" \ - "6AF80722" \ - "6BF80722" \ - "6CF80722" \ - "6DF80722" \ - "6EF80722" \ - "6FF80722" \ - "70F80722" \ - "71F80722" \ - "72F80722" \ - "73F80722" \ - "74F80722" \ - "75F80722" \ - "76F80722" \ - "77F80722" \ - "78F80722" \ - "79F80722" \ - "7AF80722" \ - "7BF80722" \ - "7CF80722" \ - "7DF80722" \ - "7EF80722" \ - "7FF80722" \ - "80F80722" \ - "81F80722" \ - "82F80722" \ - "83F80722" \ - "84F80722" \ - "85F80722" \ - "86F80722" \ - "87F80722" \ - "88F80722" \ - "89F80722" \ - "8AF80722" \ - "8BF80722" \ - "8CF80722" \ - "8DF80722" \ - "8EF80722" \ - "8FF80722" \ - "90F80722" \ - "91F80722" \ - "92F80722" \ - "93F80722" \ - "94F80722" \ - "95F80722" \ - "96F80722" \ - "97F80722" \ - "98F80722" \ - "99F80722" \ - "9AF80722" \ - "9BF80722" \ - "9CF80722" \ - "9DF80722" \ - "9EF80722" \ - "9FF80722" \ - "A0F80722" \ - "A1F80722" \ - "A2F80722" \ - "A3F80722" \ - "A4F80722" \ - "A5F80722" \ - "A6F80722" \ - "A7F80722" \ - "A8F80722" \ - "A9F80722" \ - "AAF80722" \ - "ABF80722" \ - "ACF80722" \ - "ADF80722" \ - "AEF80722" \ - "AFF80722" \ - "B0F80722" \ - "B1F80722" \ - "B2F80722" \ - "B3F80722" \ - "B4F80722" \ - "B5F80722" \ - "B6F80722" \ - "B7F80722" \ - "B8F80722" \ - "B9F80722" \ - "BAF80722" \ - "BBF80722" \ - "BCF80722" \ - "BDF80722" \ - "BEF80722" \ - "BFF80722" \ - "C0F80722" \ - "C1F80722" \ - "C2F80722" \ - "C3F80722" \ - "C4F80722" \ - "C5F80722" \ - "C6F80722" \ - "C7F80722" \ - "C8F80722" \ - "C9F80722" \ - "CAF80722" \ - "CBF80722" \ - "CCF80722" \ - "CDF80722" \ - "CEF80722" \ - "CFF80722" \ - "D0F80722" \ - "D1F80722" \ - "D2F80722" \ - "D3F80722" \ - "D4F80722" \ - "D5F80722" \ - "D6F80722" \ - "D7F80722" \ - "D8F80720" \ - "D9F80720" \ - "DAF80720" \ - "DBF80720" \ - "DCF80720" \ - "DDF80720" \ - "DEF80720" \ - "DFF80720" \ - "E0F80720" \ - "E1F80720" \ - \ - "E1F80700" \ - "0BF88700" \ - "0BF88700" \ - "0BF88700" \ - "0BF88700" \ - "0BF88700" \ - /* NOTE: The following(?) 64 values specify order of fingerprint columns \ - * in vfs301_line_t::mirror. \ - * Placing Z8() instead of the value shortens the mirror section. \ - * */ \ - "0BF88700" \ - "0AF80720" \ - "09F80720" \ - "08F80720" \ - "07F80720" \ - "06F80720" \ - "05F80720" \ - "04F80720" \ - "03F80720" \ - "02F80720" \ - "01F80720" \ - "00F80720" \ - "17F90720" \ - "16F90720" \ - "15F90720" \ - "14F90720" \ - "13F90720" \ - "12F90720" \ - "11F90720" \ - "10F90720" \ - "0FF90720" \ - "0EF90720" \ - "0DF90720" \ - "0CF90720" \ - "0BF90720" \ - "0AF90720" \ - "09F90720" \ - "08F90720" \ - "07F90720" \ - "06F90720" \ - "05F90720" \ - "04F90720" \ - "03F90720" \ - "02F90720" \ - "01F90720" \ - "00F90720" \ - "FFF80720" \ - "FEF80720" \ - "FDF80720" \ - "FCF80720" \ - "FBF80720" \ - "FAF80720" \ - "F9F80720" \ - "F8F80720" \ - "F7F80720" \ - "F6F80720" \ - "F5F80720" \ - "F4F80720" \ - "F3F80720" \ - "F2F80720" \ - "F1F80720" \ - "F0F80720" \ - "EFF80720" \ - "EEF80720" \ - "EDF80720" \ - "ECF80720" \ - "EBF80720" \ - "EAF80720" \ - "E9F80720" \ - "E8F80720" \ - "E7F80720" \ - "E6F80720" \ - "E5F80720" \ - "E4F80720" \ - \ - "0BF80720" \ - "0BF80700" \ - \ - "5CF2C700" \ - "5CF2C700" \ - "5CF2C700" \ - "5CF2C700" \ - "5CF2C700" \ - "5CF24700" \ - "5CF24700" \ - "5CF24720" \ - "FFF94700" \ - "FFF94700" \ - "FFF94700" \ - "FFF94700" \ - "FFF94700" \ - "FFF94720" \ - "5CF84700" \ - "5CF84700" \ - "5CF84700" \ - "5CF84700" \ - \ - /* NOTE: The following(?) values specify order of fingerprint columns \ - * in vfs301_line_t::sum*. */ \ - "5CF84700" \ - "5CF84720" \ - "62F84700" \ - "62F84720" \ - "68F84700" \ - "68F84720" \ - "6EF84700" \ - "6EF84720" \ - "74F84700" \ - "74F84720" \ - "7AF84700" \ - "7AF84720" \ - "80F84700" \ - "80F84720" \ - "86F84700" \ - "86F84720" \ - "8CF84700" \ - "8CF84720" \ - "92F84700" \ - "92F84720" \ - "98F84720" \ - "9E844700" \ - "9E844720" \ - "9E844700" \ - \ - "FFF96700" "FFF96700" "FFF96700" "FFF96700" "FFF96720" \ - "0DF86700" "0DF86700" "0DF86700" "0DF86700" "0DF86700" \ - "0DF86720" "0DF86700" \ - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() \ - Z8() Z8() Z8() Z8() Z8() Z8() Z8() \ - ), \ - S3("1003181C"), \ - S1("0020", "0430", "80000000") + S1 ("0420", "0430", "00000000"), \ + S1 ("1820", "0430", "00000000"), \ + S1 ("2020", "0430", "08008000"), \ + S1 ("2420", "0430", "0000FF01"), \ + S1 ("2C20", "0430", "01000000"), \ + S1 ("4020", "0430", "FF030000"), \ + S1 ("4420", "0430", "E5030000"), \ + S1 ("4820", "0430", "EA030000"), \ + S1 ("4C20", "0430", "EA030000"), \ + S1 ("5020", "0430", "00000400"), \ + S1 ("5420", "0430", "01980200"), \ + S1 ("0021", "0430", "00000000"), \ + S1 ("0421", "0430", "01000000"), \ + S1 ("0821", "0430", "02000000"), \ + S1 ("0C21", "0430", "01000000"), \ + S1 ("1021", "0430", "01000000"), \ + S1 ("1421", "0430", "01000000"), \ + S1 ("1821", "0430", "01000000"), \ + S1 ("1C21", "0430", "1F000000"), \ + S1 ("2021", "0430", "08000000"), \ + S1 ("4021", "0430", "00000000"), \ + S1 ("4421", "0430", "01000000"), \ + S1 ("4821", "0430", "02000000"), \ + S1 ("4C21", "0430", "01000000"), \ + S1 ("5021", "0430", "01000000"), \ + S1 ("5421", "0430", "01000000"), \ + S1 ("5821", "0430", "01000000"), \ + S1 ("5C21", "0430", "1F000000"), \ + S1 ("6021", "0430", "08000000"), \ + S1 ("8021", "0430", "30000000"), \ + S1 ("8421", "0430", "01000000"), \ + S1 ("8821", "0430", "01000000"), \ + S1 ("8C21", "0430", "01000000"), \ + S1 ("9021", "0430", "00000000"), \ + S1 ("9421", "0430", "01000000"), \ + S1 ("9821", "0430", "00000000"), \ + S1 ("9C21", "0430", "1F000000"), \ + S1 ("A021", "0430", "04000000"), \ + S1 ("C021", "0430", "30000000"), \ + S1 ("C421", "0430", "01000000"), \ + S1 ("C821", "0430", "01000000"), \ + S1 ("CC21", "0430", "01000000"), \ + S1 ("D021", "0430", "01000000"), \ + S1 ("D421", "0430", "01000000"), \ + S1 ("D821", "0430", "01000000"), \ + S1 ("DC21", "0430", "1F000000"), \ + S1 ("E021", "0430", "03000000"), \ + S1 ("A020", "0430", "EFE10000"), \ + S1 ("A420", "0430", "00000000"), \ + S1 ("A820", "0430", "FE210400"), \ + S1 ("B020", "0430", "00000000"), \ + S1 ("C420", "0430", "14000000"), \ + S1 ("C820", "0430", "00000000"), \ + S1 ("CC20", "0430", "20000000"), \ + S1 ("38A0", "0038", "5CA30000"), \ + S1 ("0000", "0038", "02000000"), \ + S1 ("0400", "0038", "00080000"), \ + S1 ("0800", "0038", "00120000"), \ + S1 ("0C00", "0038", "01030200"), \ + S1 ("1000", "0038", "01070200"), \ + S1 ("1400", "0038", "0C0C8A00"), \ + PACKET ("0200", "8005", \ + "FFF98720" \ + "1AF88700" \ + "1AF88700" \ + "1AF88700" \ + "1AF88700" \ + "1AF88700" \ + "1AF88700" \ + /* NOTE: The following(?) 200 values specify order of fingerprint columns \ + * in vfs301_line_t::scan. */ \ + "1AF80720" \ + "1BF80720" \ + "1CF80720" \ + "1DF80720" \ + "1EF80720" \ + "1FF80720" \ + "20F80720" \ + "21F80720" \ + "22F80720" \ + "23F80720" \ + "24F80722" \ + "25F80722" \ + "26F80722" \ + "27F80722" \ + "28F80722" \ + "29F80722" \ + "2AF80722" \ + "2BF80722" \ + "2CF80722" \ + "2DF80722" \ + "2EF80722" \ + "2FF80722" \ + "30F80722" \ + "31F80722" \ + "32F80722" \ + "33F80722" \ + "34F80722" \ + "35F80722" \ + "36F80722" \ + "37F80722" \ + "38F80722" \ + "39F80722" \ + "3AF80722" \ + "3BF80722" \ + "3CF80722" \ + "3DF80722" \ + "3EF80722" \ + "3FF80722" \ + "40F80722" \ + "41F80722" \ + "42F80722" \ + "43F80722" \ + "44F80722" \ + "45F80722" \ + "46F80722" \ + "47F80722" \ + "48F80722" \ + "49F80722" \ + "4AF80722" \ + "4BF80722" \ + "4CF80722" \ + "4DF80722" \ + "4EF80722" \ + "4FF80722" \ + "50F80722" \ + "51F80722" \ + "52F80722" \ + "53F80722" \ + "54F80722" \ + "55F80722" \ + "56F80722" \ + "57F80722" \ + "58F80722" \ + "59F80722" \ + "5AF80722" \ + "5BF80722" \ + "5CF80722" \ + "5DF80722" \ + "5EF80722" \ + "5FF80722" \ + "60F80722" \ + "61F80722" \ + "62F80722" \ + "63F80722" \ + "64F80722" \ + "65F80722" \ + "66F80722" \ + "67F80722" \ + "68F80722" \ + "69F80722" \ + "6AF80722" \ + "6BF80722" \ + "6CF80722" \ + "6DF80722" \ + "6EF80722" \ + "6FF80722" \ + "70F80722" \ + "71F80722" \ + "72F80722" \ + "73F80722" \ + "74F80722" \ + "75F80722" \ + "76F80722" \ + "77F80722" \ + "78F80722" \ + "79F80722" \ + "7AF80722" \ + "7BF80722" \ + "7CF80722" \ + "7DF80722" \ + "7EF80722" \ + "7FF80722" \ + "80F80722" \ + "81F80722" \ + "82F80722" \ + "83F80722" \ + "84F80722" \ + "85F80722" \ + "86F80722" \ + "87F80722" \ + "88F80722" \ + "89F80722" \ + "8AF80722" \ + "8BF80722" \ + "8CF80722" \ + "8DF80722" \ + "8EF80722" \ + "8FF80722" \ + "90F80722" \ + "91F80722" \ + "92F80722" \ + "93F80722" \ + "94F80722" \ + "95F80722" \ + "96F80722" \ + "97F80722" \ + "98F80722" \ + "99F80722" \ + "9AF80722" \ + "9BF80722" \ + "9CF80722" \ + "9DF80722" \ + "9EF80722" \ + "9FF80722" \ + "A0F80722" \ + "A1F80722" \ + "A2F80722" \ + "A3F80722" \ + "A4F80722" \ + "A5F80722" \ + "A6F80722" \ + "A7F80722" \ + "A8F80722" \ + "A9F80722" \ + "AAF80722" \ + "ABF80722" \ + "ACF80722" \ + "ADF80722" \ + "AEF80722" \ + "AFF80722" \ + "B0F80722" \ + "B1F80722" \ + "B2F80722" \ + "B3F80722" \ + "B4F80722" \ + "B5F80722" \ + "B6F80722" \ + "B7F80722" \ + "B8F80722" \ + "B9F80722" \ + "BAF80722" \ + "BBF80722" \ + "BCF80722" \ + "BDF80722" \ + "BEF80722" \ + "BFF80722" \ + "C0F80722" \ + "C1F80722" \ + "C2F80722" \ + "C3F80722" \ + "C4F80722" \ + "C5F80722" \ + "C6F80722" \ + "C7F80722" \ + "C8F80722" \ + "C9F80722" \ + "CAF80722" \ + "CBF80722" \ + "CCF80722" \ + "CDF80722" \ + "CEF80722" \ + "CFF80722" \ + "D0F80722" \ + "D1F80722" \ + "D2F80722" \ + "D3F80722" \ + "D4F80722" \ + "D5F80722" \ + "D6F80722" \ + "D7F80722" \ + "D8F80720" \ + "D9F80720" \ + "DAF80720" \ + "DBF80720" \ + "DCF80720" \ + "DDF80720" \ + "DEF80720" \ + "DFF80720" \ + "E0F80720" \ + "E1F80720" \ + \ + "E1F80700" \ + "0BF88700" \ + "0BF88700" \ + "0BF88700" \ + "0BF88700" \ + "0BF88700" \ + /* NOTE: The following(?) 64 values specify order of fingerprint columns \ + * in vfs301_line_t::mirror. \ + * Placing Z8() instead of the value shortens the mirror section. \ + * */ \ + "0BF88700" \ + "0AF80720" \ + "09F80720" \ + "08F80720" \ + "07F80720" \ + "06F80720" \ + "05F80720" \ + "04F80720" \ + "03F80720" \ + "02F80720" \ + "01F80720" \ + "00F80720" \ + "17F90720" \ + "16F90720" \ + "15F90720" \ + "14F90720" \ + "13F90720" \ + "12F90720" \ + "11F90720" \ + "10F90720" \ + "0FF90720" \ + "0EF90720" \ + "0DF90720" \ + "0CF90720" \ + "0BF90720" \ + "0AF90720" \ + "09F90720" \ + "08F90720" \ + "07F90720" \ + "06F90720" \ + "05F90720" \ + "04F90720" \ + "03F90720" \ + "02F90720" \ + "01F90720" \ + "00F90720" \ + "FFF80720" \ + "FEF80720" \ + "FDF80720" \ + "FCF80720" \ + "FBF80720" \ + "FAF80720" \ + "F9F80720" \ + "F8F80720" \ + "F7F80720" \ + "F6F80720" \ + "F5F80720" \ + "F4F80720" \ + "F3F80720" \ + "F2F80720" \ + "F1F80720" \ + "F0F80720" \ + "EFF80720" \ + "EEF80720" \ + "EDF80720" \ + "ECF80720" \ + "EBF80720" \ + "EAF80720" \ + "E9F80720" \ + "E8F80720" \ + "E7F80720" \ + "E6F80720" \ + "E5F80720" \ + "E4F80720" \ + \ + "0BF80720" \ + "0BF80700" \ + \ + "5CF2C700" \ + "5CF2C700" \ + "5CF2C700" \ + "5CF2C700" \ + "5CF2C700" \ + "5CF24700" \ + "5CF24700" \ + "5CF24720" \ + "FFF94700" \ + "FFF94700" \ + "FFF94700" \ + "FFF94700" \ + "FFF94700" \ + "FFF94720" \ + "5CF84700" \ + "5CF84700" \ + "5CF84700" \ + "5CF84700" \ + \ + /* NOTE: The following(?) values specify order of fingerprint columns \ + * in vfs301_line_t::sum*. */ \ + "5CF84700" \ + "5CF84720" \ + "62F84700" \ + "62F84720" \ + "68F84700" \ + "68F84720" \ + "6EF84700" \ + "6EF84720" \ + "74F84700" \ + "74F84720" \ + "7AF84700" \ + "7AF84720" \ + "80F84700" \ + "80F84720" \ + "86F84700" \ + "86F84720" \ + "8CF84700" \ + "8CF84720" \ + "92F84700" \ + "92F84720" \ + "98F84720" \ + "9E844700" \ + "9E844720" \ + "9E844700" \ + \ + "FFF96700" "FFF96700" "FFF96700" "FFF96700" "FFF96720" \ + "0DF86700" "0DF86700" "0DF86700" "0DF86700" "0DF86700" \ + "0DF86720" "0DF86700" \ + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () \ + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () \ + ), \ + S3 ("1003181C"), \ + S1 ("0020", "0430", "80000000") #define vfs301_0220_BLOB2 \ - S2("0C20FF00FFFF0000000000030000"),\ - S2("1020FF00FFFF0000000000070000"),\ - S1("0421", "0430", "01000000"),\ - S1("0821", "0430", "02000000"),\ - S1("0C21", "0430", "01000000"),\ - S1("1021", "0430", "01000000"),\ - S1("1421", "0430", "01000000"),\ - S1("1821", "0430", "01000000"),\ - S1("4421", "0430", "01000000"),\ - S1("4821", "0430", "02000000"),\ - S1("4C21", "0430", "01000000"),\ - S1("5021", "0430", "01000000"),\ - S1("5421", "0430", "01000000"),\ - S1("5821", "0430", "01000000"),\ - S1("C820", "0430", "07000000"),\ - S2("1420FFFF00FF0000000000008800"),\ - S1("8421", "0430", "01000000"),\ - S1("8821", "0430", "01000000"),\ - S1("8C21", "0430", "01000000"),\ - S1("9021", "0430", "01000000"),\ - S1("9421", "0430", "01000000"),\ - S1("9821", "0430", "01000000"),\ - S1("A021", "0430", "00000000"),\ - S1("2021", "0430", "08000000"),\ - S1("6021", "0430", "08000000") + S2 ("0C20FF00FFFF0000000000030000"), \ + S2 ("1020FF00FFFF0000000000070000"), \ + S1 ("0421", "0430", "01000000"), \ + S1 ("0821", "0430", "02000000"), \ + S1 ("0C21", "0430", "01000000"), \ + S1 ("1021", "0430", "01000000"), \ + S1 ("1421", "0430", "01000000"), \ + S1 ("1821", "0430", "01000000"), \ + S1 ("4421", "0430", "01000000"), \ + S1 ("4821", "0430", "02000000"), \ + S1 ("4C21", "0430", "01000000"), \ + S1 ("5021", "0430", "01000000"), \ + S1 ("5421", "0430", "01000000"), \ + S1 ("5821", "0430", "01000000"), \ + S1 ("C820", "0430", "07000000"), \ + S2 ("1420FFFF00FF0000000000008800"), \ + S1 ("8421", "0430", "01000000"), \ + S1 ("8821", "0430", "01000000"), \ + S1 ("8C21", "0430", "01000000"), \ + S1 ("9021", "0430", "01000000"), \ + S1 ("9421", "0430", "01000000"), \ + S1 ("9821", "0430", "01000000"), \ + S1 ("A021", "0430", "00000000"), \ + S1 ("2021", "0430", "08000000"), \ + S1 ("6021", "0430", "08000000") #define vfs301_02D0_BLOB1 \ - S1("A820", "0430", "FE210000"), \ - S1("B020", "0430", "00000000"), \ - S1("C420", "0430", "14000000"), \ - S1("C820", "0430", "00000000"), \ - S1("CC20", "0430", "20000000"), \ - S1("38A0", "0038", "5CA30000"), \ - S1("0000", "0038", "02000000"), \ - S1("0400", "0038", "00080000"), \ - S1("0800", "0038", "00120000"), \ - S1("0C00", "0038", "01030200"), \ - S1("1000", "0038", "01070200"), \ - S1("1400", "0038", "0C0C8A00") + S1 ("A820", "0430", "FE210000"), \ + S1 ("B020", "0430", "00000000"), \ + S1 ("C420", "0430", "14000000"), \ + S1 ("C820", "0430", "00000000"), \ + S1 ("CC20", "0430", "20000000"), \ + S1 ("38A0", "0038", "5CA30000"), \ + S1 ("0000", "0038", "02000000"), \ + S1 ("0400", "0038", "00080000"), \ + S1 ("0800", "0038", "00120000"), \ + S1 ("0C00", "0038", "01030200"), \ + S1 ("1000", "0038", "01070200"), \ + S1 ("1400", "0038", "0C0C8A00") #define vfs301_02D0_BLOB4 \ - PACKET("1200", "0100", "01"),\ - S2("0C20FF00FFFF0000000000030000"),\ - S2("1020FF00FFFF0000000000070000"),\ - S1("0421", "0430", "01000000"),\ - S1("0821", "0430", "02000000"),\ - S1("0C21", "0430", "01000000"),\ - S1("1021", "0430", "01000000"),\ - S1("1421", "0430", "01000000"),\ - S1("1821", "0430", "01000000"),\ - S1("4421", "0430", "01000000"),\ - S1("4821", "0430", "02000000"),\ - S1("4C21", "0430", "01000000"),\ - S1("5021", "0430", "01000000"),\ - S1("5421", "0430", "01000000"),\ - S1("5821", "0430", "01000000") + PACKET ("1200", "0100", "01"), \ + S2 ("0C20FF00FFFF0000000000030000"), \ + S2 ("1020FF00FFFF0000000000070000"), \ + S1 ("0421", "0430", "01000000"), \ + S1 ("0821", "0430", "02000000"), \ + S1 ("0C21", "0430", "01000000"), \ + S1 ("1021", "0430", "01000000"), \ + S1 ("1421", "0430", "01000000"), \ + S1 ("1821", "0430", "01000000"), \ + S1 ("4421", "0430", "01000000"), \ + S1 ("4821", "0430", "02000000"), \ + S1 ("4C21", "0430", "01000000"), \ + S1 ("5021", "0430", "01000000"), \ + S1 ("5421", "0430", "01000000"), \ + S1 ("5821", "0430", "01000000") /* TODO: looks like that removing this whole packet doesn't cause * any troubles. */ -#define vfs301_02D0_ALIGNED_BLOB\ - PACKET("0200", "8005", \ - "FF830720" "5F820720" "FF830720" \ - "5F820720" "FF830720" "5F820720" "FF830720" \ - "5F820720" "FF830720" "5F820720" "FF8B0720" \ - "608A0720" "FF930720" "61920720" "FF9B0720" \ - "629A0720" "FFA30720" "63A20720" "FFAB0720" \ - "64AA0720" "FFB30720" "65B20720" "FFBB0720" \ - "66BA0720" "FFC30720" "67C20720" "FFCB0720" \ - "68CA0720" "FFD30720" "69D20720" "FFDB0720" \ - "6ADA0720" "FFE30720" "6BE20720" "FFEB0720" \ - "6CEA0720" "FFF30720" "6DF20720" "FFFB0720" \ - "6EFA0720" "FF850720" "6F840720" "FF8D0720" \ - "708C0720" "FF950720" "71940720" "FF9D0720" \ - "729C0720" "FFA50720" "73A40720" "FFAD0720" \ - "74AC0720" "FFB50720" "75B40720" "FFBD0720" \ - "76BC0720" "FFC50720" "77C40720" "FFCD0720" \ - "78CC0720" "FFD50720" "79D40720" "FFDD0720" \ - "7ADC0720" "FFE50720" "7BE40720" "FFED0720" \ - "7CEC0720" "FFF50720" "7DF40720" "FFFD0720" \ - "7EFC0720" "FF870720" "7F860720" "FF8F0720" \ - "808E0720" "FF970720" "81960720" "FF9F0720" \ - "829E0720" "FFA70720" "83A60720" "FFAF0720" \ - "84AE0720" "FFB70720" "85B60720" "FFBF0720" \ - "86BE0720" "FFC70720" "87C60720" "FFCF0720" \ - "88CE0720" "FFD70720" "89D60720" "FFDF0720" \ - "8ADE0720" "FFE70720" "8BE60720" "FFEF0720" \ - "8CEE0720" "FFF70720" "8DF60720" "FFFF0720" \ - "8EFE0720" \ - "FFFF0720" "8EFE0720" "FFF70720" "8DF60720" \ - "FFEF0720" "8CEE0720" "FFE70720" "8BE60720" \ - "FFDF0720" "8ADE0720" "FFD70720" "89D60720" \ - "FFCF0720" "88CE0720" "FFC70720" "87C60720" \ - "FFBF0720" "86BE0720" "FFB70720" "85B60720" \ - "FFAF0720" "84AE0720" "FFA70720" "83A60720" \ - "FF9F0720" "829E0720" "FF970720" "81960720" \ - "FF8F0720" "808E0720" "FF870720" "7F860720" \ - "FFFD0720" "7EFC0720" "FFF50720" "7DF40720" \ - "FFED0720" "7CEC0720" "FFE50720" "7BE40720" \ - "FFDD0720" "7ADC0720" "FFD50720" "79D40720" \ - "FFCD0720" "78CC0720" "FFC50720" "77C40720" \ - "FFBD0720" "76BC0720" "FFB50720" "75B40720" \ - "FFAD0720" "74AC0720" "FFA50720" "73A40720" \ - "FF9D0720" "729C0720" "FF950720" "71940720" \ - "FF8D0720" "708C0720" "FF850720" "6F840720" \ - "FFFB0720" "6EFA0720" "FFF30720" "6DF20720" \ - "FFEB0720" "6CEA0720" "FFE30720" "6BE20720" \ - "FFDB0720" "6ADA0720" "FFD30720" "69D20720" \ - "FFCB0720" "68CA0720" "FFC30720" "67C20720" \ - "FFBB0720" "66BA0720" "FFB30720" "65B20720" \ - "FFAB0720" "64AA0720" "FFA30720" "63A20720" \ - "FF9B0720" "629A0720" "FF930720" "61920720" \ - "FF8B0720" "608A0720" "FF830720" "5F820720" \ - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() \ - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() \ - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() \ - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() \ - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() \ - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() \ - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() \ - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() \ - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() \ - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() \ - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() \ - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() \ - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() \ - ),\ - S3("1003181C"),\ - S1("0020", "0430", "80000000") +#define vfs301_02D0_ALIGNED_BLOB \ + PACKET ("0200", "8005", \ + "FF830720" "5F820720" "FF830720" \ + "5F820720" "FF830720" "5F820720" "FF830720" \ + "5F820720" "FF830720" "5F820720" "FF8B0720" \ + "608A0720" "FF930720" "61920720" "FF9B0720" \ + "629A0720" "FFA30720" "63A20720" "FFAB0720" \ + "64AA0720" "FFB30720" "65B20720" "FFBB0720" \ + "66BA0720" "FFC30720" "67C20720" "FFCB0720" \ + "68CA0720" "FFD30720" "69D20720" "FFDB0720" \ + "6ADA0720" "FFE30720" "6BE20720" "FFEB0720" \ + "6CEA0720" "FFF30720" "6DF20720" "FFFB0720" \ + "6EFA0720" "FF850720" "6F840720" "FF8D0720" \ + "708C0720" "FF950720" "71940720" "FF9D0720" \ + "729C0720" "FFA50720" "73A40720" "FFAD0720" \ + "74AC0720" "FFB50720" "75B40720" "FFBD0720" \ + "76BC0720" "FFC50720" "77C40720" "FFCD0720" \ + "78CC0720" "FFD50720" "79D40720" "FFDD0720" \ + "7ADC0720" "FFE50720" "7BE40720" "FFED0720" \ + "7CEC0720" "FFF50720" "7DF40720" "FFFD0720" \ + "7EFC0720" "FF870720" "7F860720" "FF8F0720" \ + "808E0720" "FF970720" "81960720" "FF9F0720" \ + "829E0720" "FFA70720" "83A60720" "FFAF0720" \ + "84AE0720" "FFB70720" "85B60720" "FFBF0720" \ + "86BE0720" "FFC70720" "87C60720" "FFCF0720" \ + "88CE0720" "FFD70720" "89D60720" "FFDF0720" \ + "8ADE0720" "FFE70720" "8BE60720" "FFEF0720" \ + "8CEE0720" "FFF70720" "8DF60720" "FFFF0720" \ + "8EFE0720" \ + "FFFF0720" "8EFE0720" "FFF70720" "8DF60720" \ + "FFEF0720" "8CEE0720" "FFE70720" "8BE60720" \ + "FFDF0720" "8ADE0720" "FFD70720" "89D60720" \ + "FFCF0720" "88CE0720" "FFC70720" "87C60720" \ + "FFBF0720" "86BE0720" "FFB70720" "85B60720" \ + "FFAF0720" "84AE0720" "FFA70720" "83A60720" \ + "FF9F0720" "829E0720" "FF970720" "81960720" \ + "FF8F0720" "808E0720" "FF870720" "7F860720" \ + "FFFD0720" "7EFC0720" "FFF50720" "7DF40720" \ + "FFED0720" "7CEC0720" "FFE50720" "7BE40720" \ + "FFDD0720" "7ADC0720" "FFD50720" "79D40720" \ + "FFCD0720" "78CC0720" "FFC50720" "77C40720" \ + "FFBD0720" "76BC0720" "FFB50720" "75B40720" \ + "FFAD0720" "74AC0720" "FFA50720" "73A40720" \ + "FF9D0720" "729C0720" "FF950720" "71940720" \ + "FF8D0720" "708C0720" "FF850720" "6F840720" \ + "FFFB0720" "6EFA0720" "FFF30720" "6DF20720" \ + "FFEB0720" "6CEA0720" "FFE30720" "6BE20720" \ + "FFDB0720" "6ADA0720" "FFD30720" "69D20720" \ + "FFCB0720" "68CA0720" "FFC30720" "67C20720" \ + "FFBB0720" "66BA0720" "FFB30720" "65B20720" \ + "FFAB0720" "64AA0720" "FFA30720" "63A20720" \ + "FF9B0720" "629A0720" "FF930720" "61920720" \ + "FF8B0720" "608A0720" "FF830720" "5F820720" \ + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () \ + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () \ + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () \ + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () \ + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () \ + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () \ + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () \ + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () \ + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () \ + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () \ + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () \ + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () \ + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () \ + ), \ + S3 ("1003181C"), \ + S1 ("0020", "0430", "80000000") const char *vfs301_0220_01[] = { - "0220010100", + "0220010100", - /* NOTE: replacing this by vfs301_0220_BLOB1 seems to not cause problems */ - S1("0420", "0430", "00000000"), - S1("1820", "0430", "00000000"), - S1("2020", "0430", "08008000"), - S1("2420", "0430", "0000FF01"), - S1("2C20", "0430", "01000000"), - S1("4020", "0430", "AD010000"), - S1("4420", "0430", "AD010000"), - S1("4820", "0430", "AD010000"), - S1("4C20", "0430", "FF030000"), - S1("5020", "0430", "00005003"), - S1("5420", "0430", "013E0200"), - S1("0021", "0430", "14000000"), - S1("0421", "0430", "01000000"), - S1("0821", "0430", "01000000"), - S1("0C21", "0430", "01000000"), - S1("1021", "0430", "01000000"), - S1("1421", "0430", "01000000"), - S1("1821", "0430", "01000000"), - S1("1C21", "0430", "12000000"), - S1("2021", "0430", "04000000"), - S1("4021", "0430", "00000000"), - S1("4421", "0430", "01000000"), - S1("4821", "0430", "10000000"), - S1("4C21", "0430", "01000000"), - S1("5021", "0430", "01000000"), - S1("5421", "0430", "00000000"), - S1("5821", "0430", "01000000"), - S1("5C21", "0430", "1F000000"), - S1("6021", "0430", "0F000000"), - S1("8021", "0430", "00000000"), - S1("8421", "0430", "01000000"), - S1("8821", "0430", "10000000"), - S1("8C21", "0430", "01000000"), - S1("9021", "0430", "01000000"), - S1("9421", "0430", "00000000"), - S1("9821", "0430", "01000000"), - S1("9C21", "0430", "1F000000"), - S1("A021", "0430", "0F000000"), - S1("C021", "0430", "00000000"), - S1("C421", "0430", "01000000"), - S1("C821", "0430", "10000000"), - S1("CC21", "0430", "01000000"), - S1("D021", "0430", "01000000"), - S1("D421", "0430", "00000000"), - S1("D821", "0430", "01000000"), - S1("DC21", "0430", "1F000000"), - S1("E021", "0430", "0F000000"), - S1("A020", "0430", "EFE10000"), - S1("A420", "0430", "00000000"), - S1("A820", "0430", "FE210000"), - S1("B020", "0430", "00000000"), - S1("C420", "0430", "47000000"), - S1("C820", "0430", "00000000"), - S1("CC20", "0430", "20000000"), - S1("38A0", "0038", "5CA30000"), - S1("0000", "0038", "02000000"), - S1("0400", "0038", "00080000"), - S1("0800", "0038", "00120000"), - S1("0C00", "0038", "01030200"), - S1("1000", "0038", "01070200"), - S1("1400", "0038", "0C0C8A00"), + /* NOTE: replacing this by vfs301_0220_BLOB1 seems to not cause problems */ + S1 ("0420", "0430", "00000000"), + S1 ("1820", "0430", "00000000"), + S1 ("2020", "0430", "08008000"), + S1 ("2420", "0430", "0000FF01"), + S1 ("2C20", "0430", "01000000"), + S1 ("4020", "0430", "AD010000"), + S1 ("4420", "0430", "AD010000"), + S1 ("4820", "0430", "AD010000"), + S1 ("4C20", "0430", "FF030000"), + S1 ("5020", "0430", "00005003"), + S1 ("5420", "0430", "013E0200"), + S1 ("0021", "0430", "14000000"), + S1 ("0421", "0430", "01000000"), + S1 ("0821", "0430", "01000000"), + S1 ("0C21", "0430", "01000000"), + S1 ("1021", "0430", "01000000"), + S1 ("1421", "0430", "01000000"), + S1 ("1821", "0430", "01000000"), + S1 ("1C21", "0430", "12000000"), + S1 ("2021", "0430", "04000000"), + S1 ("4021", "0430", "00000000"), + S1 ("4421", "0430", "01000000"), + S1 ("4821", "0430", "10000000"), + S1 ("4C21", "0430", "01000000"), + S1 ("5021", "0430", "01000000"), + S1 ("5421", "0430", "00000000"), + S1 ("5821", "0430", "01000000"), + S1 ("5C21", "0430", "1F000000"), + S1 ("6021", "0430", "0F000000"), + S1 ("8021", "0430", "00000000"), + S1 ("8421", "0430", "01000000"), + S1 ("8821", "0430", "10000000"), + S1 ("8C21", "0430", "01000000"), + S1 ("9021", "0430", "01000000"), + S1 ("9421", "0430", "00000000"), + S1 ("9821", "0430", "01000000"), + S1 ("9C21", "0430", "1F000000"), + S1 ("A021", "0430", "0F000000"), + S1 ("C021", "0430", "00000000"), + S1 ("C421", "0430", "01000000"), + S1 ("C821", "0430", "10000000"), + S1 ("CC21", "0430", "01000000"), + S1 ("D021", "0430", "01000000"), + S1 ("D421", "0430", "00000000"), + S1 ("D821", "0430", "01000000"), + S1 ("DC21", "0430", "1F000000"), + S1 ("E021", "0430", "0F000000"), + S1 ("A020", "0430", "EFE10000"), + S1 ("A420", "0430", "00000000"), + S1 ("A820", "0430", "FE210000"), + S1 ("B020", "0430", "00000000"), + S1 ("C420", "0430", "47000000"), + S1 ("C820", "0430", "00000000"), + S1 ("CC20", "0430", "20000000"), + S1 ("38A0", "0038", "5CA30000"), + S1 ("0000", "0038", "02000000"), + S1 ("0400", "0038", "00080000"), + S1 ("0800", "0038", "00120000"), + S1 ("0C00", "0038", "01030200"), + S1 ("1000", "0038", "01070200"), + S1 ("1400", "0038", "0C0C8A00"), - /* TODO: looks like that removing this whole packet doesn't cause - * any troubles. */ - PACKET("0200", "8005", - "FFF98720" - "83488420" - "83488420" - "83488420" - "83488420" - "83488420" - "83488420" - "83488420" - "83488420" - "83488420" - "83488420" - "85480420" - "87480420" - "89480420" - "8B480420" - "8D480420" - "8F480420" - "91480420" - "93480420" - "95480420" - "97480420" - "99480420" - "9B480420" - "9D480420" - "9F480420" - "A1480420" - "A3480420" - "A3480400" - "855A0420" - "875A0420" - "895A0420" - "8B5A0420" - "8D5A0420" - "8F5A0420" - "915A0420" - "935A0420" - "955A0420" - "975A0420" - "995A0420" - "9B5A0420" - "9D5A0420" - "9F5A0420" - "A15A0420" - "A35A0420" - "A35A0400" - "856C0420" - "876C0420" - "896C0420" - "8B6C0420" - "8D6C0420" - "8F6C0420" - "916C0420" - "936C0420" - "956C0420" - "976C0420" - "996C0420" - "9B6C0420" - "9D6C0420" - "9F6C0420" - "A16C0420" - "A36C0420" - "A36C0400" - "86480420" - "88480420" - "8A480420" - "8C480420" - "8E480420" - "90480420" - "92480420" - "94480420" - "96480420" - "98480420" - "9A480420" - "9C480420" - "9E480420" - "A0480420" - "A2480420" - "A4480420" - "A4480400" - "865A0420" - "885A0420" - "8A5A0420" - "8C5A0420" - "8E5A0420" - "905A0420" - "925A0420" - "945A0420" - "965A0420" - "985A0420" - "9A5A0420" - "9C5A0420" - "9E5A0420" - "A05A0420" - "A25A0420" - "A45A0420" - "A45A0400" - "866C0420" - "886C0420" - "8A6C0420" - "8C6C0420" - "8E6C0420" - "906C0420" - "926C0420" - "946C0420" - "966C0420" - "986C0420" - "9A6C0420" - "9C6C0420" - "9E6C0420" - "A06C0420" - "A26C0420" - "A46C0420" - "A46C0400" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" "83688420" "83688420" - "83688420" "83688420" - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() - ), - S3("10035109"), - S1("0020", "0430", "80000000"), + /* TODO: looks like that removing this whole packet doesn't cause + * any troubles. */ + PACKET ("0200", "8005", + "FFF98720" + "83488420" + "83488420" + "83488420" + "83488420" + "83488420" + "83488420" + "83488420" + "83488420" + "83488420" + "83488420" + "85480420" + "87480420" + "89480420" + "8B480420" + "8D480420" + "8F480420" + "91480420" + "93480420" + "95480420" + "97480420" + "99480420" + "9B480420" + "9D480420" + "9F480420" + "A1480420" + "A3480420" + "A3480400" + "855A0420" + "875A0420" + "895A0420" + "8B5A0420" + "8D5A0420" + "8F5A0420" + "915A0420" + "935A0420" + "955A0420" + "975A0420" + "995A0420" + "9B5A0420" + "9D5A0420" + "9F5A0420" + "A15A0420" + "A35A0420" + "A35A0400" + "856C0420" + "876C0420" + "896C0420" + "8B6C0420" + "8D6C0420" + "8F6C0420" + "916C0420" + "936C0420" + "956C0420" + "976C0420" + "996C0420" + "9B6C0420" + "9D6C0420" + "9F6C0420" + "A16C0420" + "A36C0420" + "A36C0400" + "86480420" + "88480420" + "8A480420" + "8C480420" + "8E480420" + "90480420" + "92480420" + "94480420" + "96480420" + "98480420" + "9A480420" + "9C480420" + "9E480420" + "A0480420" + "A2480420" + "A4480420" + "A4480400" + "865A0420" + "885A0420" + "8A5A0420" + "8C5A0420" + "8E5A0420" + "905A0420" + "925A0420" + "945A0420" + "965A0420" + "985A0420" + "9A5A0420" + "9C5A0420" + "9E5A0420" + "A05A0420" + "A25A0420" + "A45A0420" + "A45A0400" + "866C0420" + "886C0420" + "8A6C0420" + "8C6C0420" + "8E6C0420" + "906C0420" + "926C0420" + "946C0420" + "966C0420" + "986C0420" + "9A6C0420" + "9C6C0420" + "9E6C0420" + "A06C0420" + "A26C0420" + "A46C0420" + "A46C0400" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" "83688420" "83688420" + "83688420" "83688420" + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () + ), + S3 ("10035109"), + S1 ("0020", "0430", "80000000"), - TERM(), + TERM (), - NULL + NULL }; const char *vfs301_next_scan_template[] = { - PACKET("0220", "0100", "00"), + PACKET ("0220", "0100", "00"), - vfs301_0220_BLOB1, + vfs301_0220_BLOB1, - vfs301_0220_BLOB2, + vfs301_0220_BLOB2, - TERM(), + TERM (), - S4("DEAD"), + S4 ("DEAD"), - NULL + NULL }; const char *vfs301_0220_02[] = { - "0220011400", + "0220011400", - vfs301_0220_BLOB1, + vfs301_0220_BLOB1, - vfs301_0220_BLOB2, + vfs301_0220_BLOB2, - TERM(), + TERM (), - NULL + NULL }; const char *vfs301_0220_03[] = { - "0220011400", + "0220011400", - vfs301_0220_BLOB1, + vfs301_0220_BLOB1, - "17000000", + "17000000", - vfs301_0220_BLOB2, + vfs301_0220_BLOB2, - TERM(), + TERM (), - NULL + NULL }; const char *vfs301_02D0_01[] = { - "02D0003800", + "02D0003800", - S1("0420", "0430", "00000000"), - S1("1820", "0430", "01807800"), - S1("2020", "0430", "08008000"), - S1("2420", "0430", "0000FF01"), - S1("2C20", "0430", "01000000"), - S1("4020", "0430", "FF030000"), - S1("4420", "0430", "E6030000"), - S1("4820", "0430", "E7030000"), - S1("4C20", "0430", "E8030000"), - S1("5020", "0430", "00025802"), - S1("5420", "0430", "00E20100"), - S1("0021", "0430", "00000000"), - S1("0421", "0430", "01000000"), - S1("0821", "0430", "01000000"), - S1("0C21", "0430", "01000000"), - S1("1021", "0430", "01000000"), - S1("1421", "0430", "01000000"), - S1("1821", "0430", "01000000"), - S1("1C21", "0430", "1F000000"), - S1("2021", "0430", "01000000"), - S1("4021", "0430", "00000000"), - S1("4421", "0430", "01000000"), - S1("4821", "0430", "01000000"), - S1("4C21", "0430", "01000000"), - S1("5021", "0430", "01000000"), - S1("5421", "0430", "01000000"), - S1("5821", "0430", "01000000"), - S1("5C21", "0430", "1F000000"), - S1("6021", "0430", "01000000"), - S1("8021", "0430", "00000000"), - S1("8421", "0430", "01000000"), - S1("8821", "0430", "01000000"), - S1("8C21", "0430", "01000000"), - S1("9021", "0430", "01000000"), - S1("9421", "0430", "01000000"), - S1("9821", "0430", "01000000"), - S1("9C21", "0430", "1F000000"), - S1("A021", "0430", "01000000"), - S1("C021", "0430", "00000000"), - S1("C421", "0430", "01000000"), - S1("C821", "0430", "01000000"), - S1("CC21", "0430", "01000000"), - S1("D021", "0430", "01000000"), - S1("D421", "0430", "01000000"), - S1("D821", "0430", "01000000"), - S1("DC21", "0430", "1F000000"), - S1("E021", "0430", "01000000"), - S1("A020", "0430", "EFE10000"), - S1("A420", "0430", "00000000"), - vfs301_02D0_BLOB1, - vfs301_02D0_ALIGNED_BLOB, + S1 ("0420", "0430", "00000000"), + S1 ("1820", "0430", "01807800"), + S1 ("2020", "0430", "08008000"), + S1 ("2420", "0430", "0000FF01"), + S1 ("2C20", "0430", "01000000"), + S1 ("4020", "0430", "FF030000"), + S1 ("4420", "0430", "E6030000"), + S1 ("4820", "0430", "E7030000"), + S1 ("4C20", "0430", "E8030000"), + S1 ("5020", "0430", "00025802"), + S1 ("5420", "0430", "00E20100"), + S1 ("0021", "0430", "00000000"), + S1 ("0421", "0430", "01000000"), + S1 ("0821", "0430", "01000000"), + S1 ("0C21", "0430", "01000000"), + S1 ("1021", "0430", "01000000"), + S1 ("1421", "0430", "01000000"), + S1 ("1821", "0430", "01000000"), + S1 ("1C21", "0430", "1F000000"), + S1 ("2021", "0430", "01000000"), + S1 ("4021", "0430", "00000000"), + S1 ("4421", "0430", "01000000"), + S1 ("4821", "0430", "01000000"), + S1 ("4C21", "0430", "01000000"), + S1 ("5021", "0430", "01000000"), + S1 ("5421", "0430", "01000000"), + S1 ("5821", "0430", "01000000"), + S1 ("5C21", "0430", "1F000000"), + S1 ("6021", "0430", "01000000"), + S1 ("8021", "0430", "00000000"), + S1 ("8421", "0430", "01000000"), + S1 ("8821", "0430", "01000000"), + S1 ("8C21", "0430", "01000000"), + S1 ("9021", "0430", "01000000"), + S1 ("9421", "0430", "01000000"), + S1 ("9821", "0430", "01000000"), + S1 ("9C21", "0430", "1F000000"), + S1 ("A021", "0430", "01000000"), + S1 ("C021", "0430", "00000000"), + S1 ("C421", "0430", "01000000"), + S1 ("C821", "0430", "01000000"), + S1 ("CC21", "0430", "01000000"), + S1 ("D021", "0430", "01000000"), + S1 ("D421", "0430", "01000000"), + S1 ("D821", "0430", "01000000"), + S1 ("DC21", "0430", "1F000000"), + S1 ("E021", "0430", "01000000"), + S1 ("A020", "0430", "EFE10000"), + S1 ("A420", "0430", "00000000"), + vfs301_02D0_BLOB1, + vfs301_02D0_ALIGNED_BLOB, - PACKET("0C00", "0100", "00"), - PACKET("0D00", "E800", - "C0000000080000000200000000000000" - "00000050D52200180000009CCE156100" - "0000002003000000" - "0C00003800080000FF00FFFF" - "0C00003800090000FF00FFFF" - "0C00003800020000FF00FFFF" - "0C00003800030000FF00FFFF" - "0C00003800040000FF00FFFF" - "0C00003800050000FF00FFFF" - "0C00003800060000FF00FFFF" - "0C00003800070000FF00FFFF" - "1000003800040000FF00FFFF" - "1000003800050000FF00FFFF" - "1000003800060000FF00FFFF" - "1000003800070000FF00FFFF" - "1000003800080000FF00FFFF" - "1000003800090000FF00FFFF" - "10000038000A0000FF00FFFF" - "10000038000B0000FF00FFFF"), - PACKET("0E00", "E000", - "000100010101011F010000000000FF01" - "000101010101011F010000000000FF01" - "000102010101011F010000000000FF01" - "000104010101011F010000000000FF01" - "000108010101011F010000000000FF01" - "000110010101011F010000000000FF01" - "000110010201011F010000000000FF01" - "000110010401011F010000000000FF01" - "000110010801011F010000000000FF01" - "000110011001011F010000000000FF01" - "000110011001021F010000000000FF01" - "000110011001041F010000000000FF01" - "000110011001081F010000000000FF01" - "000110011001101F010000000000FF01" - "0F000100021000010001110002000800" ), - PACKET("1200", "0100", "0E"), + PACKET ("0C00", "0100", "00"), + PACKET ("0D00", "E800", + "C0000000080000000200000000000000" + "00000050D52200180000009CCE156100" + "0000002003000000" + "0C00003800080000FF00FFFF" + "0C00003800090000FF00FFFF" + "0C00003800020000FF00FFFF" + "0C00003800030000FF00FFFF" + "0C00003800040000FF00FFFF" + "0C00003800050000FF00FFFF" + "0C00003800060000FF00FFFF" + "0C00003800070000FF00FFFF" + "1000003800040000FF00FFFF" + "1000003800050000FF00FFFF" + "1000003800060000FF00FFFF" + "1000003800070000FF00FFFF" + "1000003800080000FF00FFFF" + "1000003800090000FF00FFFF" + "10000038000A0000FF00FFFF" + "10000038000B0000FF00FFFF"), + PACKET ("0E00", "E000", + "000100010101011F010000000000FF01" + "000101010101011F010000000000FF01" + "000102010101011F010000000000FF01" + "000104010101011F010000000000FF01" + "000108010101011F010000000000FF01" + "000110010101011F010000000000FF01" + "000110010201011F010000000000FF01" + "000110010401011F010000000000FF01" + "000110010801011F010000000000FF01" + "000110011001011F010000000000FF01" + "000110011001021F010000000000FF01" + "000110011001041F010000000000FF01" + "000110011001081F010000000000FF01" + "000110011001101F010000000000FF01" + "0F000100021000010001110002000800" ), + PACKET ("1200", "0100", "0E"), - TERM(), + TERM (), - NULL + NULL }; const char *vfs301_02D0_02[] = { - "02D0000001", + "02D0000001", - S1("0420", "0430", "00000000"), - S1("1820", "0430", "01806300"), - S1("2020", "0430", "08008000"), - S1("2420", "0430", "0000FF01"), - S1("2C20", "0430", "01000000"), - S1("4020", "0430", "FF030000"), - S1("4420", "0430", "E6030000"), - S1("4820", "0430", "E7030000"), - S1("4C20", "0430", "E8030000"), - S1("5020", "0430", "00025802"), - S1("5420", "0430", "008E0100"), - S1("0021", "0430", "00000000"), - S1("0421", "0430", "00000000"), - S1("0821", "0430", "00000000"), - S1("0C21", "0430", "00000000"), - S1("1021", "0430", "00000000"), - S1("1421", "0430", "00000000"), - S1("1821", "0430", "00000000"), - S1("1C21", "0430", "1F000000"), - S1("2021", "0430", "01000000"), - S1("4021", "0430", "00000000"), - S1("4421", "0430", "00000000"), - S1("4821", "0430", "00000000"), - S1("4C21", "0430", "00000000"), - S1("5021", "0430", "00000000"), - S1("5421", "0430", "00000000"), - S1("5821", "0430", "00000000"), - S1("5C21", "0430", "1F000000"), - S1("6021", "0430", "01000000"), - S1("8021", "0430", "00000000"), - S1("8421", "0430", "00000000"), - S1("8821", "0430", "00000000"), - S1("8C21", "0430", "00000000"), - S1("9021", "0430", "00000000"), - S1("9421", "0430", "00000000"), - S1("9821", "0430", "00000000"), - S1("9C21", "0430", "1F000000"), - S1("A021", "0430", "01000000"), - S1("C021", "0430", "00000000"), - S1("C421", "0430", "00000000"), - S1("C821", "0430", "00000000"), - S1("CC21", "0430", "00000000"), - S1("D021", "0430", "00000000"), - S1("D421", "0430", "00000000"), - S1("D821", "0430", "00000000"), - S1("DC21", "0430", "1F000000"), - S1("E021", "0430", "01000000"), - S1("A020", "0430", "EFE10000"), - S1("A420", "0430", "00400000"), - vfs301_02D0_BLOB1, - vfs301_02D0_ALIGNED_BLOB, + S1 ("0420", "0430", "00000000"), + S1 ("1820", "0430", "01806300"), + S1 ("2020", "0430", "08008000"), + S1 ("2420", "0430", "0000FF01"), + S1 ("2C20", "0430", "01000000"), + S1 ("4020", "0430", "FF030000"), + S1 ("4420", "0430", "E6030000"), + S1 ("4820", "0430", "E7030000"), + S1 ("4C20", "0430", "E8030000"), + S1 ("5020", "0430", "00025802"), + S1 ("5420", "0430", "008E0100"), + S1 ("0021", "0430", "00000000"), + S1 ("0421", "0430", "00000000"), + S1 ("0821", "0430", "00000000"), + S1 ("0C21", "0430", "00000000"), + S1 ("1021", "0430", "00000000"), + S1 ("1421", "0430", "00000000"), + S1 ("1821", "0430", "00000000"), + S1 ("1C21", "0430", "1F000000"), + S1 ("2021", "0430", "01000000"), + S1 ("4021", "0430", "00000000"), + S1 ("4421", "0430", "00000000"), + S1 ("4821", "0430", "00000000"), + S1 ("4C21", "0430", "00000000"), + S1 ("5021", "0430", "00000000"), + S1 ("5421", "0430", "00000000"), + S1 ("5821", "0430", "00000000"), + S1 ("5C21", "0430", "1F000000"), + S1 ("6021", "0430", "01000000"), + S1 ("8021", "0430", "00000000"), + S1 ("8421", "0430", "00000000"), + S1 ("8821", "0430", "00000000"), + S1 ("8C21", "0430", "00000000"), + S1 ("9021", "0430", "00000000"), + S1 ("9421", "0430", "00000000"), + S1 ("9821", "0430", "00000000"), + S1 ("9C21", "0430", "1F000000"), + S1 ("A021", "0430", "01000000"), + S1 ("C021", "0430", "00000000"), + S1 ("C421", "0430", "00000000"), + S1 ("C821", "0430", "00000000"), + S1 ("CC21", "0430", "00000000"), + S1 ("D021", "0430", "00000000"), + S1 ("D421", "0430", "00000000"), + S1 ("D821", "0430", "00000000"), + S1 ("DC21", "0430", "1F000000"), + S1 ("E021", "0430", "01000000"), + S1 ("A020", "0430", "EFE10000"), + S1 ("A420", "0430", "00400000"), + vfs301_02D0_BLOB1, + vfs301_02D0_ALIGNED_BLOB, - PACKET("0C00", "0100", "03"), - PACKET("0D00", "2800", "C82004300000000001000000FF00000000FFFFFF01000000C8200430000000000000003001000000"), - PACKET("0E00", "1000", "000101010100011F0800000000000001"), - PACKET("0F00", "0100", "01"), - PACKET("1000", "0100", "01"), - PACKET("1100", "0200", "0001"), - vfs301_02D0_BLOB4, + PACKET ("0C00", "0100", "03"), + PACKET ("0D00", "2800", "C82004300000000001000000FF00000000FFFFFF01000000C8200430000000000000003001000000"), + PACKET ("0E00", "1000", "000101010100011F0800000000000001"), + PACKET ("0F00", "0100", "01"), + PACKET ("1000", "0100", "01"), + PACKET ("1100", "0200", "0001"), + vfs301_02D0_BLOB4, - TERM(), + TERM (), - NULL + NULL }; const char *vfs301_02D0_03[] = { - "02D0006000", + "02D0006000", - S1("0420", "0430", "00000000"), - S1("1820", "0430", "01806300"), - S1("2020", "0430", "08008000"), - S1("2420", "0430", "0000FF01"), - S1("2C20", "0430", "01000000"), - S1("4020", "0430", "FF030000"), - S1("4420", "0430", "E6030000"), - S1("4820", "0430", "E7030000"), - S1("4C20", "0430", "E8030000"), - S1("5020", "0430", "00025802"), - S1("5420", "0430", "008E0100"), - S1("0021", "0430", "00000000"), - S1("0421", "0430", "01000000"), - S1("0821", "0430", "01000000"), - S1("0C21", "0430", "01000000"), - S1("1021", "0430", "01000000"), - S1("1421", "0430", "01000000"), - S1("1821", "0430", "01000000"), - S1("1C21", "0430", "1F000000"), - S1("2021", "0430", "05000000"), - S1("4021", "0430", "00000000"), - S1("4421", "0430", "01000000"), - S1("4821", "0430", "01000000"), - S1("4C21", "0430", "01000000"), - S1("5021", "0430", "01000000"), - S1("5421", "0430", "01000000"), - S1("5821", "0430", "01000000"), - S1("5C21", "0430", "1F000000"), - S1("6021", "0430", "05000000"), - S1("8021", "0430", "00000000"), - S1("8421", "0430", "01000000"), - S1("8821", "0430", "01000000"), - S1("8C21", "0430", "01000000"), - S1("9021", "0430", "01000000"), - S1("9421", "0430", "01000000"), - S1("9821", "0430", "01000000"), - S1("9C21", "0430", "1F000000"), - S1("A021", "0430", "05000000"), - S1("C021", "0430", "00000000"), - S1("C421", "0430", "01000000"), - S1("C821", "0430", "01000000"), - S1("CC21", "0430", "01000000"), - S1("D021", "0430", "01000000"), - S1("D421", "0430", "01000000"), - S1("D821", "0430", "01000000"), - S1("DC21", "0430", "1F000000"), - S1("E021", "0430", "05000000"), - S1("A020", "0430", "EFE10000"), - S1("A420", "0430", "00000000"), - vfs301_02D0_BLOB1, - vfs301_02D0_ALIGNED_BLOB, + S1 ("0420", "0430", "00000000"), + S1 ("1820", "0430", "01806300"), + S1 ("2020", "0430", "08008000"), + S1 ("2420", "0430", "0000FF01"), + S1 ("2C20", "0430", "01000000"), + S1 ("4020", "0430", "FF030000"), + S1 ("4420", "0430", "E6030000"), + S1 ("4820", "0430", "E7030000"), + S1 ("4C20", "0430", "E8030000"), + S1 ("5020", "0430", "00025802"), + S1 ("5420", "0430", "008E0100"), + S1 ("0021", "0430", "00000000"), + S1 ("0421", "0430", "01000000"), + S1 ("0821", "0430", "01000000"), + S1 ("0C21", "0430", "01000000"), + S1 ("1021", "0430", "01000000"), + S1 ("1421", "0430", "01000000"), + S1 ("1821", "0430", "01000000"), + S1 ("1C21", "0430", "1F000000"), + S1 ("2021", "0430", "05000000"), + S1 ("4021", "0430", "00000000"), + S1 ("4421", "0430", "01000000"), + S1 ("4821", "0430", "01000000"), + S1 ("4C21", "0430", "01000000"), + S1 ("5021", "0430", "01000000"), + S1 ("5421", "0430", "01000000"), + S1 ("5821", "0430", "01000000"), + S1 ("5C21", "0430", "1F000000"), + S1 ("6021", "0430", "05000000"), + S1 ("8021", "0430", "00000000"), + S1 ("8421", "0430", "01000000"), + S1 ("8821", "0430", "01000000"), + S1 ("8C21", "0430", "01000000"), + S1 ("9021", "0430", "01000000"), + S1 ("9421", "0430", "01000000"), + S1 ("9821", "0430", "01000000"), + S1 ("9C21", "0430", "1F000000"), + S1 ("A021", "0430", "05000000"), + S1 ("C021", "0430", "00000000"), + S1 ("C421", "0430", "01000000"), + S1 ("C821", "0430", "01000000"), + S1 ("CC21", "0430", "01000000"), + S1 ("D021", "0430", "01000000"), + S1 ("D421", "0430", "01000000"), + S1 ("D821", "0430", "01000000"), + S1 ("DC21", "0430", "1F000000"), + S1 ("E021", "0430", "05000000"), + S1 ("A020", "0430", "EFE10000"), + S1 ("A420", "0430", "00000000"), + vfs301_02D0_BLOB1, + vfs301_02D0_ALIGNED_BLOB, - PACKET("0C00", "0100", "02"), - PACKET("0D00", "2800", "1400003800006E000000010000008F00FFFF00FF01000000000002000000010000000F0002000000"), - PACKET("0E00", "1000", "00000000000000000500000000000001"), - PACKET("0F00", "0100", "01"), - PACKET("1000", "0100", "02") - PACKET("1100", "0200", "6000"), - vfs301_02D0_BLOB4, - S1("C820", "0430", "07000000"), + PACKET ("0C00", "0100", "02"), + PACKET ("0D00", "2800", "1400003800006E000000010000008F00FFFF00FF01000000000002000000010000000F0002000000"), + PACKET ("0E00", "1000", "00000000000000000500000000000001"), + PACKET ("0F00", "0100", "01"), + PACKET ("1000", "0100", "02") + PACKET ("1100", "0200", "6000"), + vfs301_02D0_BLOB4, + S1 ("C820", "0430", "07000000"), - TERM(), + TERM (), - NULL + NULL }; const char *vfs301_02D0_04[] = { - "02D0001C00", + "02D0001C00", - S1("0420", "0430", "00000000"), - S1("1820", "0430", "01806300"), - S1("2020", "0430", "08008000"), - S1("2420", "0430", "0000FF01"), - S1("2C20", "0430", "01000000"), - S1("4020", "0430", "FF030000"), - S1("4420", "0430", "E7030000"), - S1("4820", "0430", "FF030000"), - S1("4C20", "0430", "FF030000"), - S1("5020", "0430", "00025802"), - S1("5420", "0430", "008E0100"), - S1("0021", "0430", "30000000"), - S1("0421", "0430", "01000000"), - S1("0821", "0430", "01000000"), - S1("0C21", "0430", "01000000"), - S1("1021", "0430", "01000000"), - S1("1421", "0430", "01000000"), - S1("1821", "0430", "01000000"), - S1("1C21", "0430", "1F000000"), - S1("2021", "0430", "00000000"), - S1("4021", "0430", "30000000"), - S1("4421", "0430", "01000000"), - S1("4821", "0430", "01000000"), - S1("4C21", "0430", "01000000"), - S1("5021", "0430", "01000000"), - S1("5421", "0430", "01000000"), - S1("5821", "0430", "01000000"), - S1("5C21", "0430", "1F000000"), - S1("6021", "0430", "00000000"), - S1("8021", "0430", "30000000"), - S1("8421", "0430", "01000000"), - S1("8821", "0430", "01000000"), - S1("8C21", "0430", "01000000"), - S1("9021", "0430", "01000000"), - S1("9421", "0430", "01000000"), - S1("9821", "0430", "01000000"), - S1("9C21", "0430", "1F000000"), - S1("A021", "0430", "00000000"), - S1("C021", "0430", "30000000"), - S1("C421", "0430", "01000000"), - S1("C821", "0430", "01000000"), - S1("CC21", "0430", "01000000"), - S1("D021", "0430", "01000000"), - S1("D421", "0430", "01000000"), - S1("D821", "0430", "01000000"), - S1("DC21", "0430", "1F000000"), - S1("E021", "0430", "00000000"), - S1("A020", "0430", "EFE10000"), - S1("A420", "0430", "00000000"), - vfs301_02D0_BLOB1, + S1 ("0420", "0430", "00000000"), + S1 ("1820", "0430", "01806300"), + S1 ("2020", "0430", "08008000"), + S1 ("2420", "0430", "0000FF01"), + S1 ("2C20", "0430", "01000000"), + S1 ("4020", "0430", "FF030000"), + S1 ("4420", "0430", "E7030000"), + S1 ("4820", "0430", "FF030000"), + S1 ("4C20", "0430", "FF030000"), + S1 ("5020", "0430", "00025802"), + S1 ("5420", "0430", "008E0100"), + S1 ("0021", "0430", "30000000"), + S1 ("0421", "0430", "01000000"), + S1 ("0821", "0430", "01000000"), + S1 ("0C21", "0430", "01000000"), + S1 ("1021", "0430", "01000000"), + S1 ("1421", "0430", "01000000"), + S1 ("1821", "0430", "01000000"), + S1 ("1C21", "0430", "1F000000"), + S1 ("2021", "0430", "00000000"), + S1 ("4021", "0430", "30000000"), + S1 ("4421", "0430", "01000000"), + S1 ("4821", "0430", "01000000"), + S1 ("4C21", "0430", "01000000"), + S1 ("5021", "0430", "01000000"), + S1 ("5421", "0430", "01000000"), + S1 ("5821", "0430", "01000000"), + S1 ("5C21", "0430", "1F000000"), + S1 ("6021", "0430", "00000000"), + S1 ("8021", "0430", "30000000"), + S1 ("8421", "0430", "01000000"), + S1 ("8821", "0430", "01000000"), + S1 ("8C21", "0430", "01000000"), + S1 ("9021", "0430", "01000000"), + S1 ("9421", "0430", "01000000"), + S1 ("9821", "0430", "01000000"), + S1 ("9C21", "0430", "1F000000"), + S1 ("A021", "0430", "00000000"), + S1 ("C021", "0430", "30000000"), + S1 ("C421", "0430", "01000000"), + S1 ("C821", "0430", "01000000"), + S1 ("CC21", "0430", "01000000"), + S1 ("D021", "0430", "01000000"), + S1 ("D421", "0430", "01000000"), + S1 ("D821", "0430", "01000000"), + S1 ("DC21", "0430", "1F000000"), + S1 ("E021", "0430", "00000000"), + S1 ("A020", "0430", "EFE10000"), + S1 ("A420", "0430", "00000000"), + vfs301_02D0_BLOB1, - /* TODO: looks like that removing this whole packet doesn't cause - * any troubles. */ - PACKET("0200", "8005", - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - "FFF30720" "80F20720" "FFF30720" "80F20720" - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - ), + /* TODO: looks like that removing this whole packet doesn't cause + * any troubles. */ + PACKET ("0200", "8005", + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + "FFF30720" "80F20720" "FFF30720" "80F20720" + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + ), - S3("1003181C"), - S1("0020", "0430", "80000000"), + S3 ("1003181C"), + S1 ("0020", "0430", "80000000"), - PACKET("0C00", "0100", "00"), - PACKET("0D00", "2800", "A02104300100000001000000010000000100000001000000A0210430000000000031003801000000"), - PACKET("0E00", "E000", - "00010001000100000000000000007E00" - "00010101000100000000000000007E00" - "00010101010100000000000000007E00" - "00010101010101000000000000007E00" - "00010201010101000000000000007E00" - "00010401010101000000000000007E00" - "00010801010101000000000000007E00" - "00011001010101000000000000007E00" - "00011001020101000000000000007E00" - "00011001040101000000000000007E00" - "00011001080101000000000000007E00" - "00011001100102000000000000007E00" - "00011001100104000000000000007E00" - "00011001100108000000000000007E00"), - PACKET("0F00", "0100", "01"), - PACKET("1000", "0100", "02"), - PACKET("1100", "0200", "0200"), - PACKET("1200", "0100", "0E"), - S2("0C20FF00FFFF0000000000030000"), - S2("1020FF00FFFF0000000000070000"), - S1("0421", "0430", "01000000"), - S1("0821", "0430", "02000000"), - S1("0C21", "0430", "01000000"), - S1("1021", "0430", "01000000"), - S1("1421", "0430", "01000000"), - S1("1821", "0430", "01000000"), - S1("4421", "0430", "01000000"), - S1("4821", "0430", "02000000"), - S1("4C21", "0430", "01000000"), - S1("5021", "0430", "01000000"), - S1("5421", "0430", "01000000"), - S1("5821", "0430", "01000000"), - S1("C820", "0430", "07000000"), - S2("1420FFFF00FF0000000000008800"), + PACKET ("0C00", "0100", "00"), + PACKET ("0D00", "2800", "A02104300100000001000000010000000100000001000000A0210430000000000031003801000000"), + PACKET ("0E00", "E000", + "00010001000100000000000000007E00" + "00010101000100000000000000007E00" + "00010101010100000000000000007E00" + "00010101010101000000000000007E00" + "00010201010101000000000000007E00" + "00010401010101000000000000007E00" + "00010801010101000000000000007E00" + "00011001010101000000000000007E00" + "00011001020101000000000000007E00" + "00011001040101000000000000007E00" + "00011001080101000000000000007E00" + "00011001100102000000000000007E00" + "00011001100104000000000000007E00" + "00011001100108000000000000007E00"), + PACKET ("0F00", "0100", "01"), + PACKET ("1000", "0100", "02"), + PACKET ("1100", "0200", "0200"), + PACKET ("1200", "0100", "0E"), + S2 ("0C20FF00FFFF0000000000030000"), + S2 ("1020FF00FFFF0000000000070000"), + S1 ("0421", "0430", "01000000"), + S1 ("0821", "0430", "02000000"), + S1 ("0C21", "0430", "01000000"), + S1 ("1021", "0430", "01000000"), + S1 ("1421", "0430", "01000000"), + S1 ("1821", "0430", "01000000"), + S1 ("4421", "0430", "01000000"), + S1 ("4821", "0430", "02000000"), + S1 ("4C21", "0430", "01000000"), + S1 ("5021", "0430", "01000000"), + S1 ("5421", "0430", "01000000"), + S1 ("5821", "0430", "01000000"), + S1 ("C820", "0430", "07000000"), + S2 ("1420FFFF00FF0000000000008800"), - TERM(), + TERM (), - NULL + NULL }; /* Sorry had to replace BLOB3 (was a fragment!) */ const char *vfs301_02D0_05[] = { - "02D0002000", + "02D0002000", - S1("0420", "0430", "00000000"), - S1("1820", "0430", "01806300"), - S1("2020", "0430", "08008000"), - S1("2420", "0430", "0000FF01"), - S1("2C20", "0430", "01000000"), - S1("4020", "0430", "FF030000"), - S1("4420", "0430", "E7030000"), - S1("4820", "0430", "FF030000"), - S1("4C20", "0430", "FF030000"), - S1("5020", "0430", "00025802"), - S1("5420", "0430", "008E0100"), - S1("0021", "0430", "30000000"), - S1("0421", "0430", "01000000"), - S1("0821", "0430", "01000000"), - S1("0C21", "0430", "01000000"), - S1("1021", "0430", "00000000"), - S1("1421", "0430", "01000000"), - S1("1821", "0430", "00000000"), - S1("1C21", "0430", "1F000000"), - S1("2021", "0430", "04000000"), - S1("4021", "0430", "30000000"), - S1("4421", "0430", "01000000"), - S1("4821", "0430", "01000000"), - S1("4C21", "0430", "01000000"), - S1("5021", "0430", "00000000"), - S1("5421", "0430", "01000000"), - S1("5821", "0430", "00000000"), - S1("5C21", "0430", "1F000000"), - S1("6021", "0430", "04000000"), - S1("8021", "0430", "30000000"), - S1("8421", "0430", "01000000"), - S1("8821", "0430", "01000000"), - S1("8C21", "0430", "01000000"), - S1("9021", "0430", "00000000"), - S1("9421", "0430", "01000000"), - S1("9821", "0430", "00000000"), - S1("9C21", "0430", "1F000000"), - S1("A021", "0430", "04000000"), - S1("C021", "0430", "30000000"), - S1("C421", "0430", "01000000"), - S1("C821", "0430", "01000000"), - S1("CC21", "0430", "01000000"), - S1("D021", "0430", "00000000"), - S1("D421", "0430", "01000000"), - S1("D821", "0430", "00000000"), - S1("DC21", "0430", "1F000000"), - S1("E021", "0430", "04000000"), - S1("A020", "0430", "EFE10000"), - S1("A420", "0430", "00000000"), - vfs301_02D0_BLOB1, + S1 ("0420", "0430", "00000000"), + S1 ("1820", "0430", "01806300"), + S1 ("2020", "0430", "08008000"), + S1 ("2420", "0430", "0000FF01"), + S1 ("2C20", "0430", "01000000"), + S1 ("4020", "0430", "FF030000"), + S1 ("4420", "0430", "E7030000"), + S1 ("4820", "0430", "FF030000"), + S1 ("4C20", "0430", "FF030000"), + S1 ("5020", "0430", "00025802"), + S1 ("5420", "0430", "008E0100"), + S1 ("0021", "0430", "30000000"), + S1 ("0421", "0430", "01000000"), + S1 ("0821", "0430", "01000000"), + S1 ("0C21", "0430", "01000000"), + S1 ("1021", "0430", "00000000"), + S1 ("1421", "0430", "01000000"), + S1 ("1821", "0430", "00000000"), + S1 ("1C21", "0430", "1F000000"), + S1 ("2021", "0430", "04000000"), + S1 ("4021", "0430", "30000000"), + S1 ("4421", "0430", "01000000"), + S1 ("4821", "0430", "01000000"), + S1 ("4C21", "0430", "01000000"), + S1 ("5021", "0430", "00000000"), + S1 ("5421", "0430", "01000000"), + S1 ("5821", "0430", "00000000"), + S1 ("5C21", "0430", "1F000000"), + S1 ("6021", "0430", "04000000"), + S1 ("8021", "0430", "30000000"), + S1 ("8421", "0430", "01000000"), + S1 ("8821", "0430", "01000000"), + S1 ("8C21", "0430", "01000000"), + S1 ("9021", "0430", "00000000"), + S1 ("9421", "0430", "01000000"), + S1 ("9821", "0430", "00000000"), + S1 ("9C21", "0430", "1F000000"), + S1 ("A021", "0430", "04000000"), + S1 ("C021", "0430", "30000000"), + S1 ("C421", "0430", "01000000"), + S1 ("C821", "0430", "01000000"), + S1 ("CC21", "0430", "01000000"), + S1 ("D021", "0430", "00000000"), + S1 ("D421", "0430", "01000000"), + S1 ("D821", "0430", "00000000"), + S1 ("DC21", "0430", "1F000000"), + S1 ("E021", "0430", "04000000"), + S1 ("A020", "0430", "EFE10000"), + S1 ("A420", "0430", "00000000"), + vfs301_02D0_BLOB1, - /* TODO: looks like that removing this whole packet doesn't cause - * any troubles. */ - PACKET("0200", "8005", - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - "FFF34720" "80F24720" "FFF34720" "80F24720" - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() - Z8() Z8() Z8() Z8() Z8() Z8() Z8() Z8() ), + /* TODO: looks like that removing this whole packet doesn't cause + * any troubles. */ + PACKET ("0200", "8005", + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + "FFF34720" "80F24720" "FFF34720" "80F24720" + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () + Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 () Z8 ()), - S3("1003181C"), - S1("0020", "0430", "80000000") + S3 ("1003181C"), + S1 ("0020", "0430", "80000000") - PACKET("0C00", "0100", "01"), - PACKET("0D00", "2800", "A021043000000000010000000F00000000FFFFFF01000000A0210430000000000000003001000000"), - PACKET("0E00", "1000", "00000000000000000000000000000000"), - PACKET("0F00", "0100", "01"), - PACKET("1000", "0100", "02"), - PACKET("1100", "0200", "2000"), - vfs301_02D0_BLOB4, - S1("C820", "0430", "07000000"), - S2("1420FFFF00FF0000000000008800"), - S1("8421", "0430", "01000000"), - S1("8821", "0430", "01000000"), - S1("8C21", "0430", "01000000"), - S1("9021", "0430", "01000000"), - S1("9421", "0430", "01000000"), - S1("9821", "0430", "01000000"), + PACKET ("0C00", "0100", "01"), + PACKET ("0D00", "2800", "A021043000000000010000000F00000000FFFFFF01000000A0210430000000000000003001000000"), + PACKET ("0E00", "1000", "00000000000000000000000000000000"), + PACKET ("0F00", "0100", "01"), + PACKET ("1000", "0100", "02"), + PACKET ("1100", "0200", "2000"), + vfs301_02D0_BLOB4, + S1 ("C820", "0430", "07000000"), + S2 ("1420FFFF00FF0000000000008800"), + S1 ("8421", "0430", "01000000"), + S1 ("8821", "0430", "01000000"), + S1 ("8C21", "0430", "01000000"), + S1 ("9021", "0430", "01000000"), + S1 ("9421", "0430", "01000000"), + S1 ("9821", "0430", "01000000"), - TERM(), + TERM (), - NULL + NULL }; const char *vfs301_02D0_06[] = { - "02D0002000", + "02D0002000", - S1("0420", "0430", "00000000"), - S1("1820", "0430", "01806300"), - S1("2020", "0430", "08008000"), - S1("2420", "0430", "0000FF01"), - S1("2C20", "0430", "01000000"), - S1("4020", "0430", "FF030000"), - S1("4420", "0430", "E6030000"), - S1("4820", "0430", "E7030000"), - S1("4C20", "0430", "E8030000"), - S1("5020", "0430", "00025802"), - S1("5420", "0430", "008E0100"), - S1("0021", "0430", "00000000"), - S1("0421", "0430", "01000000"), - S1("0821", "0430", "01000000"), - S1("0C21", "0430", "01000000"), - S1("1021", "0430", "01000000"), - S1("1421", "0430", "01000000"), - S1("1821", "0430", "01000000"), - S1("1C21", "0430", "1F000000"), - S1("2021", "0430", "08000000"), - S1("4021", "0430", "00000000"), - S1("4421", "0430", "01000000"), - S1("4821", "0430", "01000000"), - S1("4C21", "0430", "01000000"), - S1("5021", "0430", "01000000"), - S1("5421", "0430", "01000000"), - S1("5821", "0430", "01000000"), - S1("5C21", "0430", "1F000000"), - S1("6021", "0430", "08000000"), - S1("8021", "0430", "00000000"), - S1("8421", "0430", "01000000"), - S1("8821", "0430", "01000000"), - S1("8C21", "0430", "01000000"), - S1("9021", "0430", "01000000"), - S1("9421", "0430", "01000000"), - S1("9821", "0430", "01000000"), - S1("9C21", "0430", "1F000000"), - S1("A021", "0430", "08000000"), - S1("C021", "0430", "00000000"), - S1("C421", "0430", "01000000"), - S1("C821", "0430", "01000000"), - S1("CC21", "0430", "01000000"), - S1("D021", "0430", "01000000"), - S1("D421", "0430", "01000000"), - S1("D821", "0430", "01000000"), - S1("DC21", "0430", "1F000000"), - S1("E021", "0430", "08000000"), - S1("A020", "0430", "EFE10000"), - S1("A420", "0430", "00000000"), - vfs301_02D0_BLOB1, - vfs301_02D0_ALIGNED_BLOB, + S1 ("0420", "0430", "00000000"), + S1 ("1820", "0430", "01806300"), + S1 ("2020", "0430", "08008000"), + S1 ("2420", "0430", "0000FF01"), + S1 ("2C20", "0430", "01000000"), + S1 ("4020", "0430", "FF030000"), + S1 ("4420", "0430", "E6030000"), + S1 ("4820", "0430", "E7030000"), + S1 ("4C20", "0430", "E8030000"), + S1 ("5020", "0430", "00025802"), + S1 ("5420", "0430", "008E0100"), + S1 ("0021", "0430", "00000000"), + S1 ("0421", "0430", "01000000"), + S1 ("0821", "0430", "01000000"), + S1 ("0C21", "0430", "01000000"), + S1 ("1021", "0430", "01000000"), + S1 ("1421", "0430", "01000000"), + S1 ("1821", "0430", "01000000"), + S1 ("1C21", "0430", "1F000000"), + S1 ("2021", "0430", "08000000"), + S1 ("4021", "0430", "00000000"), + S1 ("4421", "0430", "01000000"), + S1 ("4821", "0430", "01000000"), + S1 ("4C21", "0430", "01000000"), + S1 ("5021", "0430", "01000000"), + S1 ("5421", "0430", "01000000"), + S1 ("5821", "0430", "01000000"), + S1 ("5C21", "0430", "1F000000"), + S1 ("6021", "0430", "08000000"), + S1 ("8021", "0430", "00000000"), + S1 ("8421", "0430", "01000000"), + S1 ("8821", "0430", "01000000"), + S1 ("8C21", "0430", "01000000"), + S1 ("9021", "0430", "01000000"), + S1 ("9421", "0430", "01000000"), + S1 ("9821", "0430", "01000000"), + S1 ("9C21", "0430", "1F000000"), + S1 ("A021", "0430", "08000000"), + S1 ("C021", "0430", "00000000"), + S1 ("C421", "0430", "01000000"), + S1 ("C821", "0430", "01000000"), + S1 ("CC21", "0430", "01000000"), + S1 ("D021", "0430", "01000000"), + S1 ("D421", "0430", "01000000"), + S1 ("D821", "0430", "01000000"), + S1 ("DC21", "0430", "1F000000"), + S1 ("E021", "0430", "08000000"), + S1 ("A020", "0430", "EFE10000"), + S1 ("A420", "0430", "00000000"), + vfs301_02D0_BLOB1, + vfs301_02D0_ALIGNED_BLOB, - PACKET("0C00", "0100", "01"), - PACKET("0D00", "2800", "2021043000000000010000000F00000000FFFFFF0100000020210430000000000000003001000000"), - PACKET("0E00", "1000", "00000000000000000000000000000001"), - PACKET("0F00", "0100", "01"), - PACKET("1000", "0100", "02"), - PACKET("1100", "0200", "2000"), - vfs301_02D0_BLOB4, - S1("C820", "0430", "07000000"), - S2("1420FFFF00FF0000000000008800"), - S1("8421", "0430", "01000000"), - S1("8821", "0430", "01000000"), - S1("8C21", "0430", "01000000"), - S1("9021", "0430", "01000000"), - S1("9421", "0430", "01000000"), - S1("9821", "0430", "01000000"), - S1("A021", "0430", "00000000"), + PACKET ("0C00", "0100", "01"), + PACKET ("0D00", "2800", "2021043000000000010000000F00000000FFFFFF0100000020210430000000000000003001000000"), + PACKET ("0E00", "1000", "00000000000000000000000000000001"), + PACKET ("0F00", "0100", "01"), + PACKET ("1000", "0100", "02"), + PACKET ("1100", "0200", "2000"), + vfs301_02D0_BLOB4, + S1 ("C820", "0430", "07000000"), + S2 ("1420FFFF00FF0000000000008800"), + S1 ("8421", "0430", "01000000"), + S1 ("8821", "0430", "01000000"), + S1 ("8C21", "0430", "01000000"), + S1 ("9021", "0430", "01000000"), + S1 ("9421", "0430", "01000000"), + S1 ("9821", "0430", "01000000"), + S1 ("A021", "0430", "00000000"), - TERM(), + TERM (), - NULL + NULL }; const char *vfs301_02D0_07[] = { - "02D0000400" - S3("1003181C"), - PACKET("0C00", "0100", "04"), - PACKET("0D00", "2800", "28A0003803000000020000003B000000C0FFFFFF0100000028A00038000000001047004801000000"), - PACKET("1100", "0200", "0400"), - PACKET("1300", "0400", "18000000"), - PACKET("1400", "0400", "1E000000"), + "02D0000400" + S3 ("1003181C"), + PACKET ("0C00", "0100", "04"), + PACKET ("0D00", "2800", "28A0003803000000020000003B000000C0FFFFFF0100000028A00038000000001047004801000000"), + PACKET ("1100", "0200", "0400"), + PACKET ("1300", "0400", "18000000"), + PACKET ("1400", "0400", "1E000000"), - S1("A020", "0430", "EFE10000"), - S1("08A0", "0038", "78000200"), - S1("10A0", "0038", "E3186800"), - S1("14A0", "0038", "E3186800"), - S1("18A0", "0038", "E3186800"), - S1("1CA0", "0038", "E3186800"), - S1("20A0", "0038", "E3186800"), - S1("24A0", "0038", "0CFA8000"), - S1("28A0", "0038", "00000800"), - S1("04A0", "0038", "FFFFFFFF"), + S1 ("A020", "0430", "EFE10000"), + S1 ("08A0", "0038", "78000200"), + S1 ("10A0", "0038", "E3186800"), + S1 ("14A0", "0038", "E3186800"), + S1 ("18A0", "0038", "E3186800"), + S1 ("1CA0", "0038", "E3186800"), + S1 ("20A0", "0038", "E3186800"), + S1 ("24A0", "0038", "0CFA8000"), + S1 ("28A0", "0038", "00000800"), + S1 ("04A0", "0038", "FFFFFFFF"), - vfs301_0220_BLOB2, + vfs301_0220_BLOB2, - TERM(), + TERM (), - NULL + NULL }; diff --git a/libfprint/drivers/vfs5011.c b/libfprint/drivers/vfs5011.c index cb1147b..301a1d6 100644 --- a/libfprint/drivers/vfs5011.c +++ b/libfprint/drivers/vfs5011.c @@ -26,406 +26,447 @@ /* =================== sync/async USB transfer sequence ==================== */ enum { - ACTION_SEND, - ACTION_RECEIVE, + ACTION_SEND, + ACTION_RECEIVE, }; -struct usb_action { - int type; - const char *name; - int endpoint; - int size; - unsigned char *data; - int correct_reply_size; +struct usb_action +{ + int type; + const char *name; + int endpoint; + int size; + unsigned char *data; + int correct_reply_size; }; #define SEND(ENDPOINT, COMMAND) \ -{ \ - .type = ACTION_SEND, \ - .endpoint = ENDPOINT, \ - .name = #COMMAND, \ - .size = sizeof(COMMAND), \ - .data = COMMAND \ -}, + { \ + .type = ACTION_SEND, \ + .endpoint = ENDPOINT, \ + .name = #COMMAND, \ + .size = sizeof (COMMAND), \ + .data = COMMAND \ + }, #define RECV(ENDPOINT, SIZE) \ -{ \ - .type = ACTION_RECEIVE, \ - .endpoint = ENDPOINT, \ - .size = SIZE, \ - .data = NULL \ -}, + { \ + .type = ACTION_RECEIVE, \ + .endpoint = ENDPOINT, \ + .size = SIZE, \ + .data = NULL \ + }, #define RECV_CHECK(ENDPOINT, SIZE, EXPECTED) \ -{ \ - .type = ACTION_RECEIVE, \ - .endpoint = ENDPOINT, \ - .size = SIZE, \ - .data = EXPECTED, \ - .correct_reply_size = sizeof(EXPECTED) \ -}, + { \ + .type = ACTION_RECEIVE, \ + .endpoint = ENDPOINT, \ + .size = SIZE, \ + .data = EXPECTED, \ + .correct_reply_size = sizeof (EXPECTED) \ + }, -struct usbexchange_data { - int stepcount; - FpImageDevice *device; - struct usb_action *actions; - void *receive_buf; - int timeout; +struct usbexchange_data +{ + int stepcount; + FpImageDevice *device; + struct usb_action *actions; + void *receive_buf; + int timeout; }; -static void start_scan(FpImageDevice *dev); +static void start_scan (FpImageDevice *dev); -static void async_send_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +async_send_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - struct usbexchange_data *data = fpi_ssm_get_user_data(transfer->ssm); - struct usb_action *action; + struct usbexchange_data *data = fpi_ssm_get_user_data (transfer->ssm); + struct usb_action *action; - g_assert(!(fpi_ssm_get_cur_state(transfer->ssm) >= data->stepcount)); + g_assert (!(fpi_ssm_get_cur_state (transfer->ssm) >= data->stepcount)); - action = &data->actions[fpi_ssm_get_cur_state(transfer->ssm)]; - g_assert(!(action->type != ACTION_SEND)); + action = &data->actions[fpi_ssm_get_cur_state (transfer->ssm)]; + g_assert (!(action->type != ACTION_SEND)); - if (error) { - /* Transfer not completed, return IO error */ - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } + if (error) + { + /* Transfer not completed, return IO error */ + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } - /* success */ - fpi_ssm_next_state(transfer->ssm); + /* success */ + fpi_ssm_next_state (transfer->ssm); } -static void async_recv_cb(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +async_recv_cb (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - struct usbexchange_data *data = fpi_ssm_get_user_data(transfer->ssm); - struct usb_action *action; + struct usbexchange_data *data = fpi_ssm_get_user_data (transfer->ssm); + struct usb_action *action; - if (error) { - /* Transfer not completed, return IO error */ - fpi_ssm_mark_failed(transfer->ssm, error); - return; - } + if (error) + { + /* Transfer not completed, return IO error */ + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } - g_assert(!(fpi_ssm_get_cur_state(transfer->ssm) >= data->stepcount)); + g_assert (!(fpi_ssm_get_cur_state (transfer->ssm) >= data->stepcount)); - action = &data->actions[fpi_ssm_get_cur_state(transfer->ssm)]; - g_assert(!(action->type != ACTION_RECEIVE)); + action = &data->actions[fpi_ssm_get_cur_state (transfer->ssm)]; + g_assert (!(action->type != ACTION_RECEIVE)); - if (action->data != NULL) { - if (transfer->actual_length != action->correct_reply_size) { - fp_err("Got %d bytes instead of %d", - (gint)transfer->actual_length, - action->correct_reply_size); - fpi_ssm_mark_failed(transfer->ssm, fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); - return; - } - if (memcmp(transfer->buffer, action->data, - action->correct_reply_size) != 0) { - fp_dbg("Wrong reply:"); - fpi_ssm_mark_failed(transfer->ssm, fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); - return; - } - } else - fp_dbg("Got %d bytes out of %d", - (gint)transfer->actual_length, - (gint)transfer->length); + if (action->data != NULL) + { + if (transfer->actual_length != action->correct_reply_size) + { + fp_err ("Got %d bytes instead of %d", + (gint) transfer->actual_length, + action->correct_reply_size); + fpi_ssm_mark_failed (transfer->ssm, fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); + return; + } + if (memcmp (transfer->buffer, action->data, + action->correct_reply_size) != 0) + { + fp_dbg ("Wrong reply:"); + fpi_ssm_mark_failed (transfer->ssm, fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); + return; + } + } + else + { + fp_dbg ("Got %d bytes out of %d", + (gint) transfer->actual_length, + (gint) transfer->length); + } - fpi_ssm_next_state(transfer->ssm); + fpi_ssm_next_state (transfer->ssm); } -static void usbexchange_loop(FpiSsm *ssm, FpDevice *_dev, void *user_data) +static void +usbexchange_loop (FpiSsm *ssm, FpDevice *_dev, void *user_data) { - struct usbexchange_data *data = user_data; - struct usb_action *action = &data->actions[fpi_ssm_get_cur_state(ssm)]; - FpiUsbTransfer *transfer; + struct usbexchange_data *data = user_data; + struct usb_action *action = &data->actions[fpi_ssm_get_cur_state (ssm)]; + FpiUsbTransfer *transfer; - g_assert (fpi_ssm_get_cur_state(ssm) < data->stepcount); + g_assert (fpi_ssm_get_cur_state (ssm) < data->stepcount); - switch (action->type) { - case ACTION_SEND: - fp_dbg("Sending %s", action->name); - transfer = fpi_usb_transfer_new(_dev); - fpi_usb_transfer_fill_bulk_full(transfer, action->endpoint, - action->data, action->size, - NULL); - transfer->ssm = ssm; - transfer->short_is_error = TRUE; - fpi_usb_transfer_submit(transfer, data->timeout, NULL, - async_send_cb, NULL); - fpi_usb_transfer_unref(transfer); - break; + switch (action->type) + { + case ACTION_SEND: + fp_dbg ("Sending %s", action->name); + transfer = fpi_usb_transfer_new (_dev); + fpi_usb_transfer_fill_bulk_full (transfer, action->endpoint, + action->data, action->size, + NULL); + transfer->ssm = ssm; + transfer->short_is_error = TRUE; + fpi_usb_transfer_submit (transfer, data->timeout, NULL, + async_send_cb, NULL); + fpi_usb_transfer_unref (transfer); + break; - case ACTION_RECEIVE: - fp_dbg("Receiving %d bytes", action->size); - transfer = fpi_usb_transfer_new(_dev); - fpi_usb_transfer_fill_bulk_full(transfer, action->endpoint, - data->receive_buf, - action->size, NULL); - transfer->ssm = ssm; - fpi_usb_transfer_submit(transfer, data->timeout, NULL, - async_recv_cb, NULL); - fpi_usb_transfer_unref(transfer); - break; + case ACTION_RECEIVE: + fp_dbg ("Receiving %d bytes", action->size); + transfer = fpi_usb_transfer_new (_dev); + fpi_usb_transfer_fill_bulk_full (transfer, action->endpoint, + data->receive_buf, + action->size, NULL); + transfer->ssm = ssm; + fpi_usb_transfer_submit (transfer, data->timeout, NULL, + async_recv_cb, NULL); + fpi_usb_transfer_unref (transfer); + break; - default: - fp_err("Bug detected: invalid action %d", action->type); - fpi_ssm_mark_failed(ssm, fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); - return; - } + default: + fp_err ("Bug detected: invalid action %d", action->type); + fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); + return; + } } -static void usb_exchange_async(FpiSsm *ssm, - struct usbexchange_data *data) +static void +usb_exchange_async (FpiSsm *ssm, + struct usbexchange_data *data) { - FpiSsm *subsm = fpi_ssm_new(FP_DEVICE(data->device), - usbexchange_loop, - data->stepcount, - data); - fpi_ssm_start_subsm(ssm, subsm); + FpiSsm *subsm = fpi_ssm_new (FP_DEVICE (data->device), + usbexchange_loop, + data->stepcount, + data); + + fpi_ssm_start_subsm (ssm, subsm); } /* ====================== utils ======================= */ /* Calculade squared standand deviation of sum of two lines */ -static int vfs5011_get_deviation2(struct fpi_line_asmbl_ctx *ctx, GSList *row1, GSList *row2) +static int +vfs5011_get_deviation2 (struct fpi_line_asmbl_ctx *ctx, GSList *row1, GSList *row2) { - unsigned char *buf1, *buf2; - int res = 0, mean = 0, i; - const int size = 64; + unsigned char *buf1, *buf2; + int res = 0, mean = 0, i; + const int size = 64; - buf1 = row1->data + 56; - buf2 = row2->data + 168; + buf1 = row1->data + 56; + buf2 = row2->data + 168; - for (i = 0; i < size; i++) - mean += (int)buf1[i] + (int)buf2[i]; + for (i = 0; i < size; i++) + mean += (int) buf1[i] + (int) buf2[i]; - mean /= size; + mean /= size; - for (i = 0; i < size; i++) { - int dev = (int)buf1[i] + (int)buf2[i] - mean; - res += dev*dev; - } + for (i = 0; i < size; i++) + { + int dev = (int) buf1[i] + (int) buf2[i] - mean; + res += dev * dev; + } - return res / size; + return res / size; } -static unsigned char vfs5011_get_pixel(struct fpi_line_asmbl_ctx *ctx, - GSList *row, - unsigned x) +static unsigned char +vfs5011_get_pixel (struct fpi_line_asmbl_ctx *ctx, + GSList *row, + unsigned x) { - unsigned char *data = row->data + 8; + unsigned char *data = row->data + 8; - return data[x]; + return data[x]; } /* ====================== main stuff ======================= */ enum { - CAPTURE_LINES = 256, - MAXLINES = 2000, - MAX_CAPTURE_LINES = 100000, + CAPTURE_LINES = 256, + MAXLINES = 2000, + MAX_CAPTURE_LINES = 100000, }; static struct fpi_line_asmbl_ctx assembling_ctx = { - .line_width = VFS5011_IMAGE_WIDTH, - .max_height = MAXLINES, - .resolution = 10, - .median_filter_size = 25, - .max_search_offset = 30, - .get_deviation = vfs5011_get_deviation2, - .get_pixel = vfs5011_get_pixel, + .line_width = VFS5011_IMAGE_WIDTH, + .max_height = MAXLINES, + .resolution = 10, + .median_filter_size = 25, + .max_search_offset = 30, + .get_deviation = vfs5011_get_deviation2, + .get_pixel = vfs5011_get_pixel, }; -struct _FpDeviceVfs5011 { - FpImageDevice parent; - - unsigned char *total_buffer; - unsigned char *capture_buffer; - unsigned char *row_buffer; - unsigned char *lastline; - GSList *rows; - int lines_captured, lines_recorded, empty_lines; - int max_lines_captured, max_lines_recorded; - int lines_total, lines_total_allocated; - gboolean loop_running; - gboolean deactivating; - struct usbexchange_data init_sequence; -}; - -G_DECLARE_FINAL_TYPE(FpDeviceVfs5011, fpi_device_vfs5011, FPI, DEVICE_VFS5011, - FpImageDevice); -G_DEFINE_TYPE(FpDeviceVfs5011, fpi_device_vfs5011, FP_TYPE_IMAGE_DEVICE); - -enum { - DEV_ACTIVATE_REQUEST_FPRINT, - DEV_ACTIVATE_INIT_COMPLETE, - DEV_ACTIVATE_READ_DATA, - DEV_ACTIVATE_DATA_COMPLETE, - DEV_ACTIVATE_PREPARE_NEXT_CAPTURE, - DEV_ACTIVATE_NUM_STATES -}; - -enum { - DEV_OPEN_START, - DEV_OPEN_NUM_STATES -}; - -static void capture_init(FpDeviceVfs5011 *self, int max_captured, - int max_recorded) +struct _FpDeviceVfs5011 { - fp_dbg("capture_init"); - self->lastline = NULL; - self->lines_captured = 0; - self->lines_recorded = 0; - self->empty_lines = 0; - self->lines_total = 0; - self->lines_total_allocated = 0; - self->total_buffer = NULL; - self->max_lines_captured = max_captured; - self->max_lines_recorded = max_recorded; + FpImageDevice parent; + + unsigned char *total_buffer; + unsigned char *capture_buffer; + unsigned char *row_buffer; + unsigned char *lastline; + GSList *rows; + int lines_captured, lines_recorded, empty_lines; + int max_lines_captured, max_lines_recorded; + int lines_total, lines_total_allocated; + gboolean loop_running; + gboolean deactivating; + struct usbexchange_data init_sequence; +}; + +G_DECLARE_FINAL_TYPE (FpDeviceVfs5011, fpi_device_vfs5011, FPI, DEVICE_VFS5011, + FpImageDevice); +G_DEFINE_TYPE (FpDeviceVfs5011, fpi_device_vfs5011, FP_TYPE_IMAGE_DEVICE); + +enum { + DEV_ACTIVATE_REQUEST_FPRINT, + DEV_ACTIVATE_INIT_COMPLETE, + DEV_ACTIVATE_READ_DATA, + DEV_ACTIVATE_DATA_COMPLETE, + DEV_ACTIVATE_PREPARE_NEXT_CAPTURE, + DEV_ACTIVATE_NUM_STATES +}; + +enum { + DEV_OPEN_START, + DEV_OPEN_NUM_STATES +}; + +static void +capture_init (FpDeviceVfs5011 *self, int max_captured, + int max_recorded) +{ + fp_dbg ("capture_init"); + self->lastline = NULL; + self->lines_captured = 0; + self->lines_recorded = 0; + self->empty_lines = 0; + self->lines_total = 0; + self->lines_total_allocated = 0; + self->total_buffer = NULL; + self->max_lines_captured = max_captured; + self->max_lines_recorded = max_recorded; } -static int process_chunk(FpDeviceVfs5011 *self, int transferred) +static int +process_chunk (FpDeviceVfs5011 *self, int transferred) { - enum { - DEVIATION_THRESHOLD = 15*15, - DIFFERENCE_THRESHOLD = 600, - STOP_CHECK_LINES = 50 - }; + enum { + DEVIATION_THRESHOLD = 15 * 15, + DIFFERENCE_THRESHOLD = 600, + STOP_CHECK_LINES = 50 + }; - fp_dbg("process_chunk: got %d bytes", transferred); - int lines_captured = transferred/VFS5011_LINE_SIZE; - int i; + fp_dbg ("process_chunk: got %d bytes", transferred); + int lines_captured = transferred / VFS5011_LINE_SIZE; + int i; - for (i = 0; i < lines_captured; i++) { - unsigned char *linebuf = self->capture_buffer - + i * VFS5011_LINE_SIZE; + for (i = 0; i < lines_captured; i++) + { + unsigned char *linebuf = self->capture_buffer + + i * VFS5011_LINE_SIZE; - if (fpi_std_sq_dev(linebuf + 8, VFS5011_IMAGE_WIDTH) - < DEVIATION_THRESHOLD) { - if (self->lines_captured == 0) - continue; - else - self->empty_lines++; - } else - self->empty_lines = 0; - if (self->empty_lines >= STOP_CHECK_LINES) { - fp_dbg("process_chunk: got %d empty lines, finishing", - self->empty_lines); - return 1; - } + if (fpi_std_sq_dev (linebuf + 8, VFS5011_IMAGE_WIDTH) + < DEVIATION_THRESHOLD) + { + if (self->lines_captured == 0) + continue; + else + self->empty_lines++; + } + else + { + self->empty_lines = 0; + } + if (self->empty_lines >= STOP_CHECK_LINES) + { + fp_dbg ("process_chunk: got %d empty lines, finishing", + self->empty_lines); + return 1; + } - self->lines_captured++; - if (self->lines_captured > self->max_lines_captured) { - fp_dbg("process_chunk: captured %d lines, finishing", - self->lines_captured); - return 1; - } + self->lines_captured++; + if (self->lines_captured > self->max_lines_captured) + { + fp_dbg ("process_chunk: captured %d lines, finishing", + self->lines_captured); + return 1; + } - if ((self->lastline == NULL) - || (fpi_mean_sq_diff_norm(self->lastline + 8, - linebuf + 8, - VFS5011_IMAGE_WIDTH) >= DIFFERENCE_THRESHOLD)) { - self->lastline = g_malloc(VFS5011_LINE_SIZE); - self->rows = g_slist_prepend(self->rows, - self->lastline); - memmove(self->lastline, linebuf, VFS5011_LINE_SIZE); - self->lines_recorded++; - if (self->lines_recorded >= self->max_lines_recorded) { - fp_dbg("process_chunk: recorded %d lines, finishing", - self->lines_recorded); - return 1; - } - } - } - return 0; + if ((self->lastline == NULL) || + (fpi_mean_sq_diff_norm (self->lastline + 8, + linebuf + 8, + VFS5011_IMAGE_WIDTH) >= DIFFERENCE_THRESHOLD)) + { + self->lastline = g_malloc (VFS5011_LINE_SIZE); + self->rows = g_slist_prepend (self->rows, + self->lastline); + memmove (self->lastline, linebuf, VFS5011_LINE_SIZE); + self->lines_recorded++; + if (self->lines_recorded >= self->max_lines_recorded) + { + fp_dbg ("process_chunk: recorded %d lines, finishing", + self->lines_recorded); + return 1; + } + } + } + return 0; } static void -submit_image(FpiSsm *ssm, - FpDeviceVfs5011 *self, - FpImageDevice *dev) +submit_image (FpiSsm *ssm, + FpDeviceVfs5011 *self, + FpImageDevice *dev) { - FpImage *img; + FpImage *img; - if (self->lines_recorded == 0) { - /* == FP_ENROLL_RETRY_TOO_SHORT */ - fpi_image_device_retry_scan (dev, FP_DEVICE_RETRY_TOO_SHORT); - return; - } + if (self->lines_recorded == 0) + { + /* == FP_ENROLL_RETRY_TOO_SHORT */ + fpi_image_device_retry_scan (dev, FP_DEVICE_RETRY_TOO_SHORT); + return; + } - g_assert (self->rows != NULL); + g_assert (self->rows != NULL); - self->rows = g_slist_reverse(self->rows); + self->rows = g_slist_reverse (self->rows); - img = fpi_assemble_lines(&assembling_ctx, self->rows, - self->lines_recorded); + img = fpi_assemble_lines (&assembling_ctx, self->rows, + self->lines_recorded); - g_slist_free_full(self->rows, g_free); - self->rows = NULL; + g_slist_free_full (self->rows, g_free); + self->rows = NULL; - fp_dbg("Image captured, committing"); + fp_dbg ("Image captured, committing"); - fpi_image_device_image_captured(dev, img); + fpi_image_device_image_captured (dev, img); } -static void chunk_capture_callback(FpiUsbTransfer *transfer, FpDevice *device, - gpointer user_data, GError *error) +static void +chunk_capture_callback (FpiUsbTransfer *transfer, FpDevice *device, + gpointer user_data, GError *error) { - FpImageDevice *dev = FP_IMAGE_DEVICE(device); - FpDeviceVfs5011 *self; + FpImageDevice *dev = FP_IMAGE_DEVICE (device); + FpDeviceVfs5011 *self; - self = FPI_DEVICE_VFS5011(dev); + self = FPI_DEVICE_VFS5011 (dev); - if (!error || - g_error_matches(error, G_USB_DEVICE_ERROR, G_USB_DEVICE_ERROR_TIMED_OUT)) { - if (error) - g_error_free(error); + if (!error || + g_error_matches (error, G_USB_DEVICE_ERROR, G_USB_DEVICE_ERROR_TIMED_OUT)) + { + if (error) + g_error_free (error); - if (transfer->actual_length > 0) - fpi_image_device_report_finger_status(dev, TRUE); + if (transfer->actual_length > 0) + fpi_image_device_report_finger_status (dev, TRUE); - if (process_chunk(self, transfer->actual_length)) - fpi_ssm_jump_to_state(transfer->ssm, - DEV_ACTIVATE_DATA_COMPLETE); - else - fpi_ssm_jump_to_state(transfer->ssm, - DEV_ACTIVATE_READ_DATA); - } else { - if (!self->deactivating) { - fp_err("Failed to capture data"); - fpi_ssm_mark_failed(transfer->ssm, error); - } else { - g_error_free (error); - fpi_ssm_mark_completed(transfer->ssm); - } - } + if (process_chunk (self, transfer->actual_length)) + fpi_ssm_jump_to_state (transfer->ssm, + DEV_ACTIVATE_DATA_COMPLETE); + else + fpi_ssm_jump_to_state (transfer->ssm, + DEV_ACTIVATE_READ_DATA); + } + else + { + if (!self->deactivating) + { + fp_err ("Failed to capture data"); + fpi_ssm_mark_failed (transfer->ssm, error); + } + else + { + g_error_free (error); + fpi_ssm_mark_completed (transfer->ssm); + } + } } -static void capture_chunk_async(FpDeviceVfs5011 *self, - GUsbDevice *handle, int nline, - int timeout, FpiSsm *ssm) +static void +capture_chunk_async (FpDeviceVfs5011 *self, + GUsbDevice *handle, int nline, + int timeout, FpiSsm *ssm) { - FpiUsbTransfer *transfer; - fp_dbg("capture_chunk_async: capture %d lines, already have %d", - nline, self->lines_recorded); - enum { - DEVIATION_THRESHOLD = 15*15, - DIFFERENCE_THRESHOLD = 600, - STOP_CHECK_LINES = 50 - }; + FpiUsbTransfer *transfer; - transfer = fpi_usb_transfer_new(FP_DEVICE(self)); - fpi_usb_transfer_fill_bulk_full(transfer, - VFS5011_IN_ENDPOINT_DATA, - self->capture_buffer, - nline * VFS5011_LINE_SIZE, NULL); - transfer->ssm = ssm; - fpi_usb_transfer_submit(transfer, timeout, fpi_device_get_cancellable (FP_DEVICE (self)), - chunk_capture_callback, NULL); - fpi_usb_transfer_unref(transfer); + fp_dbg ("capture_chunk_async: capture %d lines, already have %d", + nline, self->lines_recorded); + enum { + DEVIATION_THRESHOLD = 15 * 15, + DIFFERENCE_THRESHOLD = 600, + STOP_CHECK_LINES = 50 + }; + + transfer = fpi_usb_transfer_new (FP_DEVICE (self)); + fpi_usb_transfer_fill_bulk_full (transfer, + VFS5011_IN_ENDPOINT_DATA, + self->capture_buffer, + nline * VFS5011_LINE_SIZE, NULL); + transfer->ssm = ssm; + fpi_usb_transfer_submit (transfer, timeout, fpi_device_get_cancellable (FP_DEVICE (self)), + chunk_capture_callback, NULL); + fpi_usb_transfer_unref (transfer); } /* @@ -434,425 +475,439 @@ static void capture_chunk_async(FpDeviceVfs5011 *self, * image. */ struct usb_action vfs5011_initialization[] = { - SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_01) - RECV(VFS5011_IN_ENDPOINT_CTRL, 64) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_cmd_01) + RECV (VFS5011_IN_ENDPOINT_CTRL, 64) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_19) - RECV(VFS5011_IN_ENDPOINT_CTRL, 64) - RECV(VFS5011_IN_ENDPOINT_CTRL, 64) /* B5C457F9 */ + SEND (VFS5011_OUT_ENDPOINT, vfs5011_cmd_19) + RECV (VFS5011_IN_ENDPOINT_CTRL, 64) + RECV (VFS5011_IN_ENDPOINT_CTRL, 64) /* B5C457F9 */ - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_00) - RECV(VFS5011_IN_ENDPOINT_CTRL, 64) /* 0000FFFFFFFF */ + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_00) + RECV (VFS5011_IN_ENDPOINT_CTRL, 64) /* 0000FFFFFFFF */ - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_01) - RECV(VFS5011_IN_ENDPOINT_CTRL, 64) /* 0000FFFFFFFFFF */ + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_01) + RECV (VFS5011_IN_ENDPOINT_CTRL, 64) /* 0000FFFFFFFFFF */ - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_02) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_02) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_01) - RECV(VFS5011_IN_ENDPOINT_CTRL, 64) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_cmd_01) + RECV (VFS5011_IN_ENDPOINT_CTRL, 64) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_03) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_03) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_04) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - RECV(VFS5011_IN_ENDPOINT_DATA, 256) - RECV(VFS5011_IN_ENDPOINT_DATA, 64) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_04) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + RECV (VFS5011_IN_ENDPOINT_DATA, 256) + RECV (VFS5011_IN_ENDPOINT_DATA, 64) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_05) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_05) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_01) - RECV(VFS5011_IN_ENDPOINT_CTRL, 64) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_cmd_01) + RECV (VFS5011_IN_ENDPOINT_CTRL, 64) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_06) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - RECV(VFS5011_IN_ENDPOINT_DATA, 17216) - RECV(VFS5011_IN_ENDPOINT_DATA, 32) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_06) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + RECV (VFS5011_IN_ENDPOINT_DATA, 17216) + RECV (VFS5011_IN_ENDPOINT_DATA, 32) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_07) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - RECV(VFS5011_IN_ENDPOINT_DATA, 45056) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_07) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + RECV (VFS5011_IN_ENDPOINT_DATA, 45056) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_08) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - RECV(VFS5011_IN_ENDPOINT_DATA, 16896) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_08) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + RECV (VFS5011_IN_ENDPOINT_DATA, 16896) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_09) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - RECV(VFS5011_IN_ENDPOINT_DATA, 4928) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_09) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + RECV (VFS5011_IN_ENDPOINT_DATA, 4928) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_10) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - RECV(VFS5011_IN_ENDPOINT_DATA, 5632) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_10) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + RECV (VFS5011_IN_ENDPOINT_DATA, 5632) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_11) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - RECV(VFS5011_IN_ENDPOINT_DATA, 5632) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_11) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + RECV (VFS5011_IN_ENDPOINT_DATA, 5632) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_12) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - RECV(VFS5011_IN_ENDPOINT_DATA, 3328) - RECV(VFS5011_IN_ENDPOINT_DATA, 64) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_12) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + RECV (VFS5011_IN_ENDPOINT_DATA, 3328) + RECV (VFS5011_IN_ENDPOINT_DATA, 64) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_13) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_13) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_03) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_03) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_14) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - RECV(VFS5011_IN_ENDPOINT_DATA, 4800) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_14) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + RECV (VFS5011_IN_ENDPOINT_DATA, 4800) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_02) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_02) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_27) - RECV(VFS5011_IN_ENDPOINT_CTRL, 64) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_cmd_27) + RECV (VFS5011_IN_ENDPOINT_CTRL, 64) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_15) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_15) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_16) - RECV(VFS5011_IN_ENDPOINT_CTRL, 2368) - RECV(VFS5011_IN_ENDPOINT_CTRL, 64) - RECV(VFS5011_IN_ENDPOINT_DATA, 4800) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_16) + RECV (VFS5011_IN_ENDPOINT_CTRL, 2368) + RECV (VFS5011_IN_ENDPOINT_CTRL, 64) + RECV (VFS5011_IN_ENDPOINT_DATA, 4800) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_17) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_17) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_18) - /* 0000 */ - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_init_18) + /* 0000 */ + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - /* - * Windows driver does this and it works - * But in this driver this call never returns... - * RECV(VFS5011_IN_ENDPOINT_CTRL2, 8) //00D3054000 - */ + /* + * Windows driver does this and it works + * But in this driver this call never returns... + * RECV(VFS5011_IN_ENDPOINT_CTRL2, 8) //00D3054000 + */ }; /* Initiate recording the image */ struct usb_action vfs5011_initiate_capture[] = { - SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_04) - RECV(VFS5011_IN_ENDPOINT_DATA, 64) - RECV(VFS5011_IN_ENDPOINT_DATA, 84032) - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_cmd_04) + RECV (VFS5011_IN_ENDPOINT_DATA, 64) + RECV (VFS5011_IN_ENDPOINT_DATA, 84032) + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_prepare_00) - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_prepare_00) + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_prepare_01) - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_prepare_01) + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_prepare_02) - RECV(VFS5011_IN_ENDPOINT_CTRL, 2368) - RECV(VFS5011_IN_ENDPOINT_CTRL, 64) - RECV(VFS5011_IN_ENDPOINT_DATA, 4800) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_prepare_02) + RECV (VFS5011_IN_ENDPOINT_CTRL, 2368) + RECV (VFS5011_IN_ENDPOINT_CTRL, 64) + RECV (VFS5011_IN_ENDPOINT_DATA, 4800) - SEND(VFS5011_OUT_ENDPOINT, vfs5011_prepare_03) - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) - /* - * Windows driver does this and it works - * But in this driver this call never returns... - * RECV(VFS5011_IN_ENDPOINT_CTRL2, 8); - */ + SEND (VFS5011_OUT_ENDPOINT, vfs5011_prepare_03) + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + /* + * Windows driver does this and it works + * But in this driver this call never returns... + * RECV(VFS5011_IN_ENDPOINT_CTRL2, 8); + */ - SEND(VFS5011_OUT_ENDPOINT, vfs5011_prepare_04) - RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 2368, VFS5011_NORMAL_CONTROL_REPLY) + SEND (VFS5011_OUT_ENDPOINT, vfs5011_prepare_04) + RECV_CHECK (VFS5011_IN_ENDPOINT_CTRL, 2368, VFS5011_NORMAL_CONTROL_REPLY) - /* - * Windows driver does this and it works - * But in this driver this call never returns... - * RECV(VFS5011_IN_ENDPOINT_CTRL2, 8); - */ + /* + * Windows driver does this and it works + * But in this driver this call never returns... + * RECV(VFS5011_IN_ENDPOINT_CTRL2, 8); + */ }; /* ====================== lifprint interface ======================= */ -static void activate_loop(FpiSsm *ssm, FpDevice *_dev, void *user_data) +static void +activate_loop (FpiSsm *ssm, FpDevice *_dev, void *user_data) { - enum {READ_TIMEOUT = 0}; + enum {READ_TIMEOUT = 0}; - FpImageDevice *dev = user_data; - FpDeviceVfs5011 *self; + FpImageDevice *dev = user_data; + FpDeviceVfs5011 *self; - self = FPI_DEVICE_VFS5011(_dev); + self = FPI_DEVICE_VFS5011 (_dev); - fp_dbg("main_loop: state %d", fpi_ssm_get_cur_state(ssm)); + fp_dbg ("main_loop: state %d", fpi_ssm_get_cur_state (ssm)); - if (self->deactivating) { - fp_dbg("deactivating, marking completed"); - fpi_ssm_mark_completed(ssm); - return; - } + if (self->deactivating) + { + fp_dbg ("deactivating, marking completed"); + fpi_ssm_mark_completed (ssm); + return; + } - switch (fpi_ssm_get_cur_state(ssm)) { - case DEV_ACTIVATE_REQUEST_FPRINT: - self->init_sequence.stepcount = - G_N_ELEMENTS(vfs5011_initiate_capture); - self->init_sequence.actions = vfs5011_initiate_capture; - self->init_sequence.device = dev; - if (self->init_sequence.receive_buf == NULL) - self->init_sequence.receive_buf = - g_malloc0(VFS5011_RECEIVE_BUF_SIZE); - self->init_sequence.timeout = 1000; - usb_exchange_async(ssm, &self->init_sequence); - break; + switch (fpi_ssm_get_cur_state (ssm)) + { + case DEV_ACTIVATE_REQUEST_FPRINT: + self->init_sequence.stepcount = + G_N_ELEMENTS (vfs5011_initiate_capture); + self->init_sequence.actions = vfs5011_initiate_capture; + self->init_sequence.device = dev; + if (self->init_sequence.receive_buf == NULL) + self->init_sequence.receive_buf = + g_malloc0 (VFS5011_RECEIVE_BUF_SIZE); + self->init_sequence.timeout = 1000; + usb_exchange_async (ssm, &self->init_sequence); + break; - case DEV_ACTIVATE_INIT_COMPLETE: - if (self->init_sequence.receive_buf != NULL) - g_free(self->init_sequence.receive_buf); - self->init_sequence.receive_buf = NULL; - capture_init(self, MAX_CAPTURE_LINES, MAXLINES); - fpi_image_device_activate_complete(dev, NULL); - fpi_ssm_next_state(ssm); - break; + case DEV_ACTIVATE_INIT_COMPLETE: + if (self->init_sequence.receive_buf != NULL) + g_free (self->init_sequence.receive_buf); + self->init_sequence.receive_buf = NULL; + capture_init (self, MAX_CAPTURE_LINES, MAXLINES); + fpi_image_device_activate_complete (dev, NULL); + fpi_ssm_next_state (ssm); + break; - case DEV_ACTIVATE_READ_DATA: - capture_chunk_async(self, - fpi_device_get_usb_device(FP_DEVICE(dev)), - CAPTURE_LINES, - READ_TIMEOUT, ssm); - break; + case DEV_ACTIVATE_READ_DATA: + capture_chunk_async (self, + fpi_device_get_usb_device (FP_DEVICE (dev)), + CAPTURE_LINES, + READ_TIMEOUT, ssm); + break; - case DEV_ACTIVATE_DATA_COMPLETE: - fpi_device_add_timeout(_dev, 1, - fpi_ssm_next_state_timeout_cb, - ssm); + case DEV_ACTIVATE_DATA_COMPLETE: + fpi_device_add_timeout (_dev, 1, + fpi_ssm_next_state_timeout_cb, + ssm); - break; + break; - case DEV_ACTIVATE_PREPARE_NEXT_CAPTURE: - self->init_sequence.stepcount = - G_N_ELEMENTS(vfs5011_initiate_capture); - self->init_sequence.actions = vfs5011_initiate_capture; - self->init_sequence.device = dev; - if (self->init_sequence.receive_buf == NULL) - self->init_sequence.receive_buf = - g_malloc0(VFS5011_RECEIVE_BUF_SIZE); - self->init_sequence.timeout = VFS5011_DEFAULT_WAIT_TIMEOUT; - usb_exchange_async(ssm, &self->init_sequence); - break; + case DEV_ACTIVATE_PREPARE_NEXT_CAPTURE: + self->init_sequence.stepcount = + G_N_ELEMENTS (vfs5011_initiate_capture); + self->init_sequence.actions = vfs5011_initiate_capture; + self->init_sequence.device = dev; + if (self->init_sequence.receive_buf == NULL) + self->init_sequence.receive_buf = + g_malloc0 (VFS5011_RECEIVE_BUF_SIZE); + self->init_sequence.timeout = VFS5011_DEFAULT_WAIT_TIMEOUT; + usb_exchange_async (ssm, &self->init_sequence); + break; - } + } } -static void activate_loop_complete(FpiSsm *ssm, FpDevice *_dev, - void *user_data, GError *error) +static void +activate_loop_complete (FpiSsm *ssm, FpDevice *_dev, + void *user_data, GError *error) { - FpImageDevice *dev = user_data; - FpDeviceVfs5011 *self; + FpImageDevice *dev = user_data; + FpDeviceVfs5011 *self; - self = FPI_DEVICE_VFS5011(_dev); + self = FPI_DEVICE_VFS5011 (_dev); - fp_dbg("finishing"); - if (self->init_sequence.receive_buf != NULL) - g_free(self->init_sequence.receive_buf); - self->init_sequence.receive_buf = NULL; - if (!self->deactivating && !error) { - submit_image(ssm, self, dev); - fpi_image_device_report_finger_status(dev, FALSE); - } - fpi_ssm_free(ssm); + fp_dbg ("finishing"); + if (self->init_sequence.receive_buf != NULL) + g_free (self->init_sequence.receive_buf); + self->init_sequence.receive_buf = NULL; + if (!self->deactivating && !error) + { + submit_image (ssm, self, dev); + fpi_image_device_report_finger_status (dev, FALSE); + } + fpi_ssm_free (ssm); - self->loop_running = FALSE; + self->loop_running = FALSE; - if (self->deactivating) { - fpi_image_device_deactivate_complete(dev, error); - } else if (error) { - fpi_image_device_session_error(dev, error); - } else { - start_scan(dev); - } + if (self->deactivating) + fpi_image_device_deactivate_complete (dev, error); + else if (error) + fpi_image_device_session_error (dev, error); + else + start_scan (dev); } -static void open_loop(FpiSsm *ssm, FpDevice *_dev, void *user_data) +static void +open_loop (FpiSsm *ssm, FpDevice *_dev, void *user_data) { - FpImageDevice *dev = user_data; - FpDeviceVfs5011 *self; + FpImageDevice *dev = user_data; + FpDeviceVfs5011 *self; - self = FPI_DEVICE_VFS5011(_dev); + self = FPI_DEVICE_VFS5011 (_dev); - switch (fpi_ssm_get_cur_state(ssm)) { - case DEV_OPEN_START: - self->init_sequence.stepcount = - G_N_ELEMENTS(vfs5011_initialization); - self->init_sequence.actions = vfs5011_initialization; - self->init_sequence.device = dev; - self->init_sequence.receive_buf = - g_malloc0(VFS5011_RECEIVE_BUF_SIZE); - self->init_sequence.timeout = VFS5011_DEFAULT_WAIT_TIMEOUT; - usb_exchange_async(ssm, &self->init_sequence); - break; - }; + switch (fpi_ssm_get_cur_state (ssm)) + { + case DEV_OPEN_START: + self->init_sequence.stepcount = + G_N_ELEMENTS (vfs5011_initialization); + self->init_sequence.actions = vfs5011_initialization; + self->init_sequence.device = dev; + self->init_sequence.receive_buf = + g_malloc0 (VFS5011_RECEIVE_BUF_SIZE); + self->init_sequence.timeout = VFS5011_DEFAULT_WAIT_TIMEOUT; + usb_exchange_async (ssm, &self->init_sequence); + break; + } + ; } -static void open_loop_complete(FpiSsm *ssm, FpDevice *_dev, void *user_data, - GError *error) +static void +open_loop_complete (FpiSsm *ssm, FpDevice *_dev, void *user_data, + GError *error) { - FpImageDevice *dev = user_data; - FpDeviceVfs5011 *self; + FpImageDevice *dev = user_data; + FpDeviceVfs5011 *self; - self = FPI_DEVICE_VFS5011(_dev); - g_free(self->init_sequence.receive_buf); - self->init_sequence.receive_buf = NULL; + self = FPI_DEVICE_VFS5011 (_dev); + g_free (self->init_sequence.receive_buf); + self->init_sequence.receive_buf = NULL; - fpi_image_device_open_complete(dev, error); - fpi_ssm_free(ssm); + fpi_image_device_open_complete (dev, error); + fpi_ssm_free (ssm); } -static void dev_open(FpImageDevice *dev) +static void +dev_open (FpImageDevice *dev) { - FpiSsm *ssm; - GError *error = NULL; - FpDeviceVfs5011 *self; + FpiSsm *ssm; + GError *error = NULL; + FpDeviceVfs5011 *self; - self = FPI_DEVICE_VFS5011(dev); - self->capture_buffer = - (unsigned char *)g_malloc0(CAPTURE_LINES * VFS5011_LINE_SIZE); + self = FPI_DEVICE_VFS5011 (dev); + self->capture_buffer = + (unsigned char *) g_malloc0 (CAPTURE_LINES * VFS5011_LINE_SIZE); - if (!g_usb_device_claim_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), 0, 0, &error)) { - fpi_image_device_open_complete(dev, error); - return; - } + if (!g_usb_device_claim_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), 0, 0, &error)) + { + fpi_image_device_open_complete (dev, error); + return; + } - ssm = fpi_ssm_new(FP_DEVICE(dev), open_loop, DEV_OPEN_NUM_STATES, dev); - fpi_ssm_start(ssm, open_loop_complete); + ssm = fpi_ssm_new (FP_DEVICE (dev), open_loop, DEV_OPEN_NUM_STATES, dev); + fpi_ssm_start (ssm, open_loop_complete); } -static void dev_close(FpImageDevice *dev) +static void +dev_close (FpImageDevice *dev) { - GError *error = NULL; - FpDeviceVfs5011 *self = FPI_DEVICE_VFS5011(dev);; + GError *error = NULL; + FpDeviceVfs5011 *self = FPI_DEVICE_VFS5011 (dev); - g_usb_device_release_interface(fpi_device_get_usb_device(FP_DEVICE(dev)), - 0, 0, &error); + ; - g_free(self->capture_buffer); - g_slist_free_full(self->rows, g_free); + g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), + 0, 0, &error); - fpi_image_device_close_complete(dev, error); + g_free (self->capture_buffer); + g_slist_free_full (self->rows, g_free); + + fpi_image_device_close_complete (dev, error); } -static void start_scan(FpImageDevice *dev) +static void +start_scan (FpImageDevice *dev) { - FpDeviceVfs5011 *self; - FpiSsm *ssm; + FpDeviceVfs5011 *self; + FpiSsm *ssm; - self = FPI_DEVICE_VFS5011(dev); - self->loop_running = TRUE; - fp_dbg("creating ssm"); - ssm = fpi_ssm_new(FP_DEVICE(dev), activate_loop, - DEV_ACTIVATE_NUM_STATES, dev); - fp_dbg("starting ssm"); - fpi_ssm_start(ssm, activate_loop_complete); - fp_dbg("ssm done, getting out"); + self = FPI_DEVICE_VFS5011 (dev); + self->loop_running = TRUE; + fp_dbg ("creating ssm"); + ssm = fpi_ssm_new (FP_DEVICE (dev), activate_loop, + DEV_ACTIVATE_NUM_STATES, dev); + fp_dbg ("starting ssm"); + fpi_ssm_start (ssm, activate_loop_complete); + fp_dbg ("ssm done, getting out"); } -static void dev_activate(FpImageDevice *dev) +static void +dev_activate (FpImageDevice *dev) { - FpDeviceVfs5011 *self; + FpDeviceVfs5011 *self; - self = FPI_DEVICE_VFS5011(dev); - fp_dbg("device initialized"); - self->deactivating = FALSE; + self = FPI_DEVICE_VFS5011 (dev); + fp_dbg ("device initialized"); + self->deactivating = FALSE; - start_scan(dev); + start_scan (dev); } -static void dev_deactivate(FpImageDevice *dev) +static void +dev_deactivate (FpImageDevice *dev) { - FpDeviceVfs5011 *self; + FpDeviceVfs5011 *self; - self = FPI_DEVICE_VFS5011(dev); - if (self->loop_running) { - self->deactivating = TRUE; - } else - fpi_image_device_deactivate_complete(dev, NULL); + self = FPI_DEVICE_VFS5011 (dev); + if (self->loop_running) + self->deactivating = TRUE; + else + fpi_image_device_deactivate_complete (dev, NULL); } -static const FpIdEntry id_table [ ] = { - { /* Validity device from some Toshiba laptops */ .vid = 0x138a, .pid = 0x0010, - }, - { /* vfs5011 */ .vid = 0x138a, .pid = 0x0011, - }, - { /* Validity device from Lenovo Preferred Pro USB Fingerprint Keyboard KUF1256 */ .vid = 0x138a, .pid = 0x0015, - }, - { /* Validity device from Lenovo T440 laptops */ .vid = 0x138a, .pid = 0x0017, - }, - { /* one more Validity device */ .vid = 0x138a, .pid = 0x0018, - }, - { .vid = 0, .pid = 0, .driver_data = 0 }, +static const FpIdEntry id_table[] = { + { /* Validity device from some Toshiba laptops */ .vid = 0x138a, .pid = 0x0010, }, + { /* vfs5011 */ .vid = 0x138a, .pid = 0x0011, }, + { /* Validity device from Lenovo Preferred Pro USB Fingerprint Keyboard KUF1256 */ .vid = 0x138a, .pid = 0x0015, }, + { /* Validity device from Lenovo T440 laptops */ .vid = 0x138a, .pid = 0x0017, }, + { /* one more Validity device */ .vid = 0x138a, .pid = 0x0018, }, + { .vid = 0, .pid = 0, .driver_data = 0 }, }; -static void fpi_device_vfs5011_init(FpDeviceVfs5011 *self) { +static void +fpi_device_vfs5011_init (FpDeviceVfs5011 *self) +{ } -static void fpi_device_vfs5011_class_init(FpDeviceVfs5011Class *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS(klass); - FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS(klass); +static void +fpi_device_vfs5011_class_init (FpDeviceVfs5011Class *klass) +{ + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); + FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); - dev_class->id = "vfs5011"; - dev_class->full_name = "Validity VFS5011"; - dev_class->type = FP_DEVICE_TYPE_USB; - dev_class->id_table = id_table; - dev_class->scan_type = FP_SCAN_TYPE_SWIPE; + dev_class->id = "vfs5011"; + dev_class->full_name = "Validity VFS5011"; + dev_class->type = FP_DEVICE_TYPE_USB; + dev_class->id_table = id_table; + dev_class->scan_type = FP_SCAN_TYPE_SWIPE; - img_class->img_open = dev_open; - img_class->img_close = dev_close; - img_class->activate = dev_activate; - img_class->deactivate = dev_deactivate; + img_class->img_open = dev_open; + img_class->img_close = dev_close; + img_class->activate = dev_activate; + img_class->deactivate = dev_deactivate; - img_class->bz3_threshold = 20; + img_class->bz3_threshold = 20; - img_class->img_width = VFS5011_IMAGE_WIDTH; - img_class->img_height = -1; + img_class->img_width = VFS5011_IMAGE_WIDTH; + img_class->img_height = -1; } - diff --git a/libfprint/drivers/vfs5011_proto.h b/libfprint/drivers/vfs5011_proto.h index 972d017..f71a10f 100644 --- a/libfprint/drivers/vfs5011_proto.h +++ b/libfprint/drivers/vfs5011_proto.h @@ -5,6182 +5,6182 @@ #define VFS5011_IMAGE_WIDTH 160 enum { - VFS5011_DEFAULT_WAIT_TIMEOUT = 3000, + VFS5011_DEFAULT_WAIT_TIMEOUT = 3000, - VFS5011_OUT_ENDPOINT = 1 | FPI_USB_ENDPOINT_OUT, - VFS5011_IN_ENDPOINT_CTRL = 1 | FPI_USB_ENDPOINT_IN, - VFS5011_IN_ENDPOINT_DATA = 2 | FPI_USB_ENDPOINT_IN, - VFS5011_IN_ENDPOINT_CTRL2 = 3 | FPI_USB_ENDPOINT_IN, + VFS5011_OUT_ENDPOINT = 1 | FPI_USB_ENDPOINT_OUT, + VFS5011_IN_ENDPOINT_CTRL = 1 | FPI_USB_ENDPOINT_IN, + VFS5011_IN_ENDPOINT_DATA = 2 | FPI_USB_ENDPOINT_IN, + VFS5011_IN_ENDPOINT_CTRL2 = 3 | FPI_USB_ENDPOINT_IN, }; enum { - VFS5011_RECEIVE_BUF_SIZE = 102400 + VFS5011_RECEIVE_BUF_SIZE = 102400 }; static unsigned char VFS5011_NORMAL_CONTROL_REPLY[] = {0x00, 0x00}; static unsigned char vfs5011_cmd_01[] = { /* 1 B */ - 0x01, + 0x01, }; static unsigned char vfs5011_cmd_19[] = { /* 1 B */ - 0x19, + 0x19, }; static unsigned char vfs5011_init_00[] = { /* 39 B */ - 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x9F, 0x00, 0x00, 0x00, + 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x9F, 0x00, 0x00, 0x00, }; static unsigned char vfs5011_init_01[] = { /* 40 B */ - 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xAB, 0x00, 0x00, 0x00, 0x00, + 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xAB, 0x00, 0x00, 0x00, 0x00, }; static unsigned char vfs5011_init_02[] = { /* 578 B */ - 0x06, 0x9C, 0xF1, 0x9D, 0x71, 0xC3, 0x13, 0xDF, - 0x5F, 0xE4, 0x7A, 0x1F, 0xC7, 0x17, 0x53, 0x9A, - 0x1A, 0xA1, 0xD7, 0xB6, 0x6E, 0xBE, 0xDF, 0x1F, - 0x9F, 0x44, 0x42, 0x22, 0xFA, 0x2A, 0x6A, 0xAB, - 0x2B, 0xF0, 0x56, 0x39, 0xE3, 0x7B, 0x53, 0x9A, - 0x1A, 0xA1, 0xDB, 0xBA, 0x62, 0xB2, 0xE4, 0x65, - 0xE5, 0xDB, 0x68, 0x04, 0x79, 0x98, 0xDE, 0x8F, - 0x23, 0xFB, 0xEC, 0xAD, 0x76, 0xCA, 0xA2, 0xEB, - 0x61, 0x38, 0xC7, 0xAB, 0x6E, 0x2E, 0x78, 0xF9, - 0x79, 0x13, 0x8A, 0xE5, 0x90, 0x22, 0x63, 0x8D, - 0x0E, 0x93, 0x25, 0x49, 0x5A, 0xC8, 0xA3, 0xD8, - 0x7E, 0xAE, 0x12, 0xF6, 0x2C, 0x1C, 0xFC, 0x48, - 0x4F, 0x0E, 0x48, 0x22, 0xFB, 0x4B, 0xCE, 0x7E, - 0xDB, 0x2D, 0x91, 0xE0, 0xC8, 0x78, 0x2E, 0xAF, - 0x2F, 0xD4, 0x03, 0x6F, 0x12, 0x59, 0xC6, 0x26, - 0x40, 0x88, 0x2E, 0x62, 0xBA, 0x06, 0x6C, 0xC9, - 0x7A, 0x84, 0x93, 0xCF, 0x14, 0x15, 0x44, 0x87, - 0xE2, 0x09, 0x97, 0xE6, 0xCE, 0x7E, 0x28, 0xA9, - 0x29, 0x53, 0xD7, 0xB8, 0xD1, 0x53, 0x30, 0x15, - 0x6E, 0x95, 0x3E, 0xA2, 0x7A, 0xCA, 0x9C, 0x1D, - 0x9D, 0xEB, 0x5F, 0x15, 0xEF, 0x48, 0x34, 0xCC, - 0xCB, 0x02, 0xA6, 0xD6, 0xA7, 0x80, 0xF2, 0x3F, - 0x7E, 0x96, 0x23, 0xAE, 0x42, 0xF1, 0x29, 0xF5, - 0xAD, 0x5A, 0x35, 0x57, 0x36, 0xAA, 0xAF, 0x97, - 0xE8, 0x1E, 0xA2, 0xD3, 0xFB, 0x4B, 0x1D, 0x9C, - 0x1C, 0x06, 0x84, 0xEB, 0x9E, 0x2C, 0xD4, 0x18, - 0x94, 0x44, 0x7E, 0x4B, 0x12, 0x91, 0xF2, 0x8B, - 0x07, 0x45, 0xDB, 0x52, 0xBB, 0x2E, 0x53, 0x63, - 0xE3, 0x38, 0xB8, 0x95, 0x4D, 0x9B, 0xCF, 0x07, - 0x05, 0xDD, 0x4C, 0xE2, 0x39, 0xAF, 0xA9, 0x51, - 0xDB, 0xAD, 0x19, 0xC8, 0x13, 0x6E, 0x0A, 0x2F, - 0xEA, 0x12, 0xB9, 0x25, 0x55, 0xB6, 0x64, 0x04, - 0x7F, 0x14, 0x6E, 0x12, 0x08, 0xFB, 0xBD, 0xBD, - 0x1D, 0xC6, 0xE2, 0x84, 0x50, 0x20, 0x60, 0xA0, - 0x90, 0xD2, 0x74, 0x8A, 0x18, 0xA4, 0xD9, 0xE9, - 0x69, 0xB2, 0x1E, 0x73, 0xAB, 0x1B, 0x7B, 0xBB, - 0x3B, 0xE0, 0x42, 0x23, 0xF9, 0x29, 0x49, 0x89, - 0x09, 0xD2, 0x4C, 0x29, 0xF1, 0x21, 0x65, 0xAC, - 0x2C, 0x97, 0x30, 0x6C, 0xB4, 0x04, 0xF4, 0x3D, - 0xBD, 0x06, 0xA0, 0xC6, 0x1E, 0xCE, 0x7E, 0xB3, - 0x33, 0x88, 0x2E, 0x43, 0x9B, 0x2B, 0x37, 0xF0, - 0x70, 0xCB, 0x91, 0xF1, 0x2B, 0xFB, 0x8B, 0x48, - 0xCA, 0x39, 0x97, 0xFB, 0x21, 0xB9, 0xCD, 0x0E, - 0x8C, 0x7F, 0x8D, 0xEC, 0x36, 0xE6, 0xEA, 0x27, - 0xA5, 0x1E, 0x40, 0x2A, 0xF2, 0x22, 0xCA, 0x07, - 0x85, 0x3E, 0xC8, 0xAE, 0x76, 0xA6, 0xF0, 0x71, - 0xF1, 0xAB, 0x6B, 0x04, 0x6D, 0xA9, 0xCA, 0x06, - 0x2C, 0x66, 0xA5, 0xCA, 0xB0, 0x4B, 0x2B, 0x62, - 0xEB, 0xD5, 0x61, 0x0D, 0xF0, 0x46, 0x26, 0xC3, - 0x44, 0x9F, 0x0C, 0x63, 0xBB, 0xAA, 0xBD, 0x7E, - 0xF2, 0x74, 0x00, 0x66, 0x2B, 0x7A, 0x62, 0xA1, - 0x07, 0x80, 0x33, 0x8D, 0x1F, 0xF7, 0x45, 0xCB, - 0x5E, 0x24, 0xEB, 0x84, 0xED, 0x27, 0x44, 0x61, - 0xFF, 0x0C, 0xA7, 0x3B, 0xE3, 0x53, 0x05, 0x84, - 0x04, 0xEE, 0x23, 0x4C, 0xB5, 0x79, 0x1A, 0xF3, - 0xA0, 0x66, 0x20, 0x4C, 0x94, 0x24, 0x72, 0xF3, - 0x73, 0x39, 0xF8, 0x97, 0xDD, 0x64, 0x54, 0xF2, - 0x6B, 0xBA, 0xAD, 0xBC, 0x67, 0x66, 0x78, 0xBB, - 0x5E, 0x6D, 0xFB, 0x8A, 0xA2, 0x74, 0x3D, 0xF5, - 0xD4, 0x72, 0xC7, 0x1A, 0xBD, 0x0E, 0x0B, 0x2C, - 0x8C, 0x4A, 0x0C, 0x60, 0xB8, 0x08, 0x5E, 0xDF, - 0x5F, 0x05, 0x33, 0x5C, 0xB5, 0x7E, 0x1D, 0xFC, - 0xFD, 0x25, 0xBA, 0x95, 0xC4, 0xA7, 0xDA, 0xEA, - 0x6A, 0xB1, 0x31, 0x1C, 0xC4, 0xE5, 0x07, 0xC4, - 0xC5, 0x9D, 0x28, 0xCD, 0x3C, 0xE9, 0x89, 0x49, - 0xD4, 0xFF, 0x7F, 0x52, 0x8A, 0x9B, 0x7F, 0xBC, - 0x8E, 0xF5, 0xCF, 0x0B, 0xD9, 0x49, 0x48, 0x88, - 0x80, 0x71, 0x7D, 0xAB, 0xEF, 0x47, 0x2B, 0xF7, - 0x7B, 0x2D, 0x79, 0x3F, 0xCF, 0xBF, 0xFF, 0x3F, - 0x6D, 0xF8, 0x42, 0xEC, 0x7F, 0xE8, 0xED, 0x42, - 0xE6, 0x1D, 0x4D, 0x32, 0xFA, 0x6A, 0x0A, 0xD7, - 0xA7, 0x7C, 0xCB, 0xA7, 0x7B, 0xCB, 0xBF, 0x71, - 0xF3, 0x48, + 0x06, 0x9C, 0xF1, 0x9D, 0x71, 0xC3, 0x13, 0xDF, + 0x5F, 0xE4, 0x7A, 0x1F, 0xC7, 0x17, 0x53, 0x9A, + 0x1A, 0xA1, 0xD7, 0xB6, 0x6E, 0xBE, 0xDF, 0x1F, + 0x9F, 0x44, 0x42, 0x22, 0xFA, 0x2A, 0x6A, 0xAB, + 0x2B, 0xF0, 0x56, 0x39, 0xE3, 0x7B, 0x53, 0x9A, + 0x1A, 0xA1, 0xDB, 0xBA, 0x62, 0xB2, 0xE4, 0x65, + 0xE5, 0xDB, 0x68, 0x04, 0x79, 0x98, 0xDE, 0x8F, + 0x23, 0xFB, 0xEC, 0xAD, 0x76, 0xCA, 0xA2, 0xEB, + 0x61, 0x38, 0xC7, 0xAB, 0x6E, 0x2E, 0x78, 0xF9, + 0x79, 0x13, 0x8A, 0xE5, 0x90, 0x22, 0x63, 0x8D, + 0x0E, 0x93, 0x25, 0x49, 0x5A, 0xC8, 0xA3, 0xD8, + 0x7E, 0xAE, 0x12, 0xF6, 0x2C, 0x1C, 0xFC, 0x48, + 0x4F, 0x0E, 0x48, 0x22, 0xFB, 0x4B, 0xCE, 0x7E, + 0xDB, 0x2D, 0x91, 0xE0, 0xC8, 0x78, 0x2E, 0xAF, + 0x2F, 0xD4, 0x03, 0x6F, 0x12, 0x59, 0xC6, 0x26, + 0x40, 0x88, 0x2E, 0x62, 0xBA, 0x06, 0x6C, 0xC9, + 0x7A, 0x84, 0x93, 0xCF, 0x14, 0x15, 0x44, 0x87, + 0xE2, 0x09, 0x97, 0xE6, 0xCE, 0x7E, 0x28, 0xA9, + 0x29, 0x53, 0xD7, 0xB8, 0xD1, 0x53, 0x30, 0x15, + 0x6E, 0x95, 0x3E, 0xA2, 0x7A, 0xCA, 0x9C, 0x1D, + 0x9D, 0xEB, 0x5F, 0x15, 0xEF, 0x48, 0x34, 0xCC, + 0xCB, 0x02, 0xA6, 0xD6, 0xA7, 0x80, 0xF2, 0x3F, + 0x7E, 0x96, 0x23, 0xAE, 0x42, 0xF1, 0x29, 0xF5, + 0xAD, 0x5A, 0x35, 0x57, 0x36, 0xAA, 0xAF, 0x97, + 0xE8, 0x1E, 0xA2, 0xD3, 0xFB, 0x4B, 0x1D, 0x9C, + 0x1C, 0x06, 0x84, 0xEB, 0x9E, 0x2C, 0xD4, 0x18, + 0x94, 0x44, 0x7E, 0x4B, 0x12, 0x91, 0xF2, 0x8B, + 0x07, 0x45, 0xDB, 0x52, 0xBB, 0x2E, 0x53, 0x63, + 0xE3, 0x38, 0xB8, 0x95, 0x4D, 0x9B, 0xCF, 0x07, + 0x05, 0xDD, 0x4C, 0xE2, 0x39, 0xAF, 0xA9, 0x51, + 0xDB, 0xAD, 0x19, 0xC8, 0x13, 0x6E, 0x0A, 0x2F, + 0xEA, 0x12, 0xB9, 0x25, 0x55, 0xB6, 0x64, 0x04, + 0x7F, 0x14, 0x6E, 0x12, 0x08, 0xFB, 0xBD, 0xBD, + 0x1D, 0xC6, 0xE2, 0x84, 0x50, 0x20, 0x60, 0xA0, + 0x90, 0xD2, 0x74, 0x8A, 0x18, 0xA4, 0xD9, 0xE9, + 0x69, 0xB2, 0x1E, 0x73, 0xAB, 0x1B, 0x7B, 0xBB, + 0x3B, 0xE0, 0x42, 0x23, 0xF9, 0x29, 0x49, 0x89, + 0x09, 0xD2, 0x4C, 0x29, 0xF1, 0x21, 0x65, 0xAC, + 0x2C, 0x97, 0x30, 0x6C, 0xB4, 0x04, 0xF4, 0x3D, + 0xBD, 0x06, 0xA0, 0xC6, 0x1E, 0xCE, 0x7E, 0xB3, + 0x33, 0x88, 0x2E, 0x43, 0x9B, 0x2B, 0x37, 0xF0, + 0x70, 0xCB, 0x91, 0xF1, 0x2B, 0xFB, 0x8B, 0x48, + 0xCA, 0x39, 0x97, 0xFB, 0x21, 0xB9, 0xCD, 0x0E, + 0x8C, 0x7F, 0x8D, 0xEC, 0x36, 0xE6, 0xEA, 0x27, + 0xA5, 0x1E, 0x40, 0x2A, 0xF2, 0x22, 0xCA, 0x07, + 0x85, 0x3E, 0xC8, 0xAE, 0x76, 0xA6, 0xF0, 0x71, + 0xF1, 0xAB, 0x6B, 0x04, 0x6D, 0xA9, 0xCA, 0x06, + 0x2C, 0x66, 0xA5, 0xCA, 0xB0, 0x4B, 0x2B, 0x62, + 0xEB, 0xD5, 0x61, 0x0D, 0xF0, 0x46, 0x26, 0xC3, + 0x44, 0x9F, 0x0C, 0x63, 0xBB, 0xAA, 0xBD, 0x7E, + 0xF2, 0x74, 0x00, 0x66, 0x2B, 0x7A, 0x62, 0xA1, + 0x07, 0x80, 0x33, 0x8D, 0x1F, 0xF7, 0x45, 0xCB, + 0x5E, 0x24, 0xEB, 0x84, 0xED, 0x27, 0x44, 0x61, + 0xFF, 0x0C, 0xA7, 0x3B, 0xE3, 0x53, 0x05, 0x84, + 0x04, 0xEE, 0x23, 0x4C, 0xB5, 0x79, 0x1A, 0xF3, + 0xA0, 0x66, 0x20, 0x4C, 0x94, 0x24, 0x72, 0xF3, + 0x73, 0x39, 0xF8, 0x97, 0xDD, 0x64, 0x54, 0xF2, + 0x6B, 0xBA, 0xAD, 0xBC, 0x67, 0x66, 0x78, 0xBB, + 0x5E, 0x6D, 0xFB, 0x8A, 0xA2, 0x74, 0x3D, 0xF5, + 0xD4, 0x72, 0xC7, 0x1A, 0xBD, 0x0E, 0x0B, 0x2C, + 0x8C, 0x4A, 0x0C, 0x60, 0xB8, 0x08, 0x5E, 0xDF, + 0x5F, 0x05, 0x33, 0x5C, 0xB5, 0x7E, 0x1D, 0xFC, + 0xFD, 0x25, 0xBA, 0x95, 0xC4, 0xA7, 0xDA, 0xEA, + 0x6A, 0xB1, 0x31, 0x1C, 0xC4, 0xE5, 0x07, 0xC4, + 0xC5, 0x9D, 0x28, 0xCD, 0x3C, 0xE9, 0x89, 0x49, + 0xD4, 0xFF, 0x7F, 0x52, 0x8A, 0x9B, 0x7F, 0xBC, + 0x8E, 0xF5, 0xCF, 0x0B, 0xD9, 0x49, 0x48, 0x88, + 0x80, 0x71, 0x7D, 0xAB, 0xEF, 0x47, 0x2B, 0xF7, + 0x7B, 0x2D, 0x79, 0x3F, 0xCF, 0xBF, 0xFF, 0x3F, + 0x6D, 0xF8, 0x42, 0xEC, 0x7F, 0xE8, 0xED, 0x42, + 0xE6, 0x1D, 0x4D, 0x32, 0xFA, 0x6A, 0x0A, 0xD7, + 0xA7, 0x7C, 0xCB, 0xA7, 0x7B, 0xCB, 0xBF, 0x71, + 0xF3, 0x48, }; static unsigned char vfs5011_cmd_1A[] = { /* 1 B */ - 0x1A, + 0x1A, }; static unsigned char vfs5011_init_03[] = { /* 2354 B */ - 0x06, 0xFE, 0x93, 0xFF, 0x03, 0xBA, 0x6A, 0xA6, - 0x26, 0x9D, 0x03, 0x66, 0xBE, 0x6E, 0x2A, 0xE3, - 0x63, 0xD8, 0xFE, 0x9B, 0x43, 0x93, 0xD7, 0x03, - 0x83, 0x38, 0x8C, 0xE0, 0x38, 0x88, 0x58, 0x94, - 0x14, 0xAF, 0xC9, 0xA2, 0x7A, 0xCA, 0x96, 0x5E, - 0xDE, 0x65, 0x27, 0x36, 0xEA, 0x3A, 0x4E, 0x82, - 0x02, 0xB9, 0x0F, 0x4B, 0x97, 0x17, 0xF7, 0x1A, - 0x9E, 0x75, 0xC3, 0x8F, 0x53, 0xD3, 0x9F, 0x7F, - 0xFB, 0x10, 0xE6, 0xAA, 0x76, 0xF6, 0x72, 0x93, - 0x17, 0xFC, 0x4A, 0x26, 0xFE, 0x76, 0x2A, 0xEA, - 0x6A, 0x89, 0x3F, 0xF3, 0x2B, 0xA3, 0xFF, 0x9F, - 0x1F, 0xFC, 0x4A, 0x06, 0xDE, 0x56, 0x38, 0xD8, - 0x58, 0xBB, 0x0D, 0x21, 0xF9, 0x71, 0x19, 0x99, - 0x19, 0xFA, 0x4C, 0x40, 0x98, 0x10, 0x78, 0xD8, - 0x58, 0xBB, 0x0D, 0xE1, 0x39, 0xB1, 0xD9, 0x99, - 0x19, 0xFA, 0x6C, 0x7E, 0xA2, 0x72, 0xC6, 0x7D, - 0xF9, 0x42, 0xF4, 0x86, 0x5A, 0xDA, 0xD2, 0x06, - 0x86, 0x3D, 0x6F, 0x08, 0xD0, 0x00, 0xD8, 0x10, - 0x90, 0x2B, 0xFD, 0xB7, 0x6B, 0xBB, 0x67, 0xA0, - 0x20, 0x9B, 0x35, 0x36, 0xEA, 0x3A, 0xA2, 0x0C, - 0x88, 0x33, 0x7D, 0x1A, 0xC2, 0x12, 0x2A, 0xFE, - 0x7E, 0xC5, 0x8C, 0x17, 0x30, 0x7F, 0xE0, 0xCF, - 0xB0, 0x94, 0x4E, 0x36, 0xEE, 0x3E, 0x5E, 0x96, - 0x16, 0xCD, 0x9F, 0xE1, 0x3B, 0xEB, 0x8B, 0x5B, - 0xDB, 0x00, 0x8A, 0xF2, 0x2A, 0xFA, 0x0E, 0xC8, - 0x48, 0xF3, 0x6D, 0x12, 0xC8, 0x18, 0x08, 0xDC, - 0x5C, 0xE7, 0x01, 0x79, 0xA1, 0x71, 0x3D, 0xF4, - 0x74, 0xCF, 0x84, 0x17, 0xCF, 0x7F, 0xE0, 0x20, - 0x5F, 0x7B, 0xFB, 0xD6, 0x0E, 0x1B, 0x65, 0xA5, - 0x00, 0xDC, 0x6A, 0xE3, 0x7E, 0xCE, 0x4B, 0xCE, - 0x68, 0x22, 0xB8, 0xD7, 0xAE, 0x33, 0x50, 0x9C, - 0x14, 0x46, 0xFA, 0x14, 0x85, 0x35, 0x48, 0x78, - 0xF8, 0x23, 0xA3, 0x8E, 0x56, 0x77, 0x39, 0xFA, - 0x76, 0xA5, 0x91, 0xB4, 0x34, 0xE1, 0x4D, 0xA8, - 0x35, 0x1E, 0x9E, 0xB3, 0x6B, 0x6A, 0x3A, 0xF9, - 0xD4, 0x0D, 0x9A, 0xD9, 0x02, 0xF4, 0x94, 0x54, - 0x1F, 0xE6, 0x5B, 0x8C, 0x72, 0xC9, 0xA3, 0xEB, - 0x69, 0x32, 0x04, 0x1C, 0x43, 0x69, 0xF9, 0x3F, - 0xBE, 0x65, 0xF6, 0xFE, 0x03, 0x9E, 0xF4, 0x29, - 0x59, 0x82, 0x02, 0x2F, 0xF7, 0x67, 0x66, 0xA6, - 0x03, 0x22, 0x6B, 0x27, 0x19, 0xBA, 0xCA, 0x2A, - 0xAA, 0x7D, 0xC1, 0x08, 0xF6, 0x63, 0xA2, 0x53, - 0xD0, 0xBA, 0x3E, 0x51, 0xAC, 0x38, 0x70, 0xAD, - 0xDD, 0x06, 0x86, 0xAB, 0x73, 0xF2, 0xA1, 0x62, - 0xC3, 0x2C, 0x99, 0xDC, 0x47, 0xEA, 0x7A, 0xBA, - 0x3A, 0xE1, 0x61, 0x4C, 0x94, 0xA6, 0xC4, 0x09, - 0x85, 0x45, 0x73, 0x9F, 0x43, 0xA5, 0xDD, 0x1A, - 0x96, 0x48, 0xF2, 0x98, 0x02, 0xA0, 0xCE, 0x12, - 0x95, 0x74, 0x86, 0x58, 0x44, 0x75, 0x27, 0xE3, - 0x63, 0x0A, 0xB7, 0xA5, 0xBF, 0x0B, 0x6A, 0x9D, - 0xA6, 0x71, 0xF0, 0x20, 0xE9, 0x64, 0x0F, 0x08, - 0x33, 0xE4, 0x6F, 0x0F, 0x11, 0xA0, 0xC0, 0x37, - 0x8B, 0x54, 0x25, 0xF2, 0x2B, 0xA6, 0xCD, 0xA0, - 0x23, 0x45, 0xF0, 0xF9, 0x99, 0x01, 0xCB, 0x6D, - 0xB7, 0x3F, 0x82, 0x99, 0x0A, 0xFE, 0x2C, 0x28, - 0x29, 0xA4, 0x85, 0x15, 0x60, 0xD5, 0x08, 0xCD, - 0x68, 0x04, 0x9A, 0xFA, 0x39, 0x5B, 0x99, 0x35, - 0x15, 0x0A, 0xFD, 0x51, 0x4F, 0x3F, 0x85, 0x97, - 0xE5, 0x23, 0x17, 0xBB, 0xA7, 0x56, 0xF6, 0xB5, - 0x74, 0x5F, 0x06, 0x9A, 0xA2, 0xF1, 0xB0, 0xFA, - 0x94, 0xBF, 0xC7, 0x38, 0x22, 0xCF, 0x2D, 0xEB, - 0x68, 0xB3, 0xC7, 0x09, 0xBD, 0xC7, 0x65, 0x67, - 0xFB, 0x5D, 0xD1, 0x71, 0x6B, 0xD7, 0xB7, 0xA5, - 0x37, 0xE5, 0x7E, 0x19, 0x16, 0x1A, 0x7B, 0xB7, - 0x15, 0xD3, 0x95, 0xF9, 0x21, 0x91, 0xC7, 0x46, - 0xC6, 0xAC, 0x2F, 0x40, 0x20, 0x9B, 0x77, 0xDC, - 0xFE, 0x84, 0x52, 0x94, 0xE7, 0xF2, 0x28, 0xC8, - 0xE5, 0x3C, 0x2F, 0xEF, 0x12, 0xBF, 0x2F, 0xEF, - 0x6F, 0xB4, 0x34, 0x19, 0xC1, 0xD0, 0x86, 0x45, - 0x74, 0x98, 0x2D, 0x8C, 0x56, 0x43, 0x75, 0x90, - 0xA1, 0x43, 0xF6, 0xBA, 0x48, 0x58, 0x99, 0x61, - 0xE2, 0xF4, 0x40, 0x89, 0x04, 0x91, 0x40, 0xBB, - 0x38, 0xC3, 0x4F, 0x83, 0x99, 0xEA, 0x9A, 0xFB, - 0x41, 0x99, 0x23, 0x4D, 0xBC, 0x0F, 0x46, 0x95, - 0x3C, 0xC4, 0x5B, 0x04, 0xF9, 0x1D, 0x58, 0x29, - 0x94, 0x4C, 0xCA, 0x9C, 0xE4, 0x96, 0x35, 0xE5, - 0xC4, 0x23, 0x96, 0xDF, 0x54, 0xC1, 0xAD, 0x64, - 0xD4, 0x35, 0x23, 0x7D, 0x66, 0xC6, 0xBD, 0xE4, - 0x4D, 0x95, 0x68, 0x37, 0x89, 0xA0, 0x36, 0x5B, - 0xD8, 0xB1, 0xA7, 0x6E, 0x9A, 0x66, 0x23, 0x41, - 0xE9, 0x93, 0x1B, 0x74, 0x1D, 0x92, 0xF1, 0xF3, - 0xB0, 0x4F, 0x5C, 0x60, 0x9D, 0x9C, 0xBD, 0x7E, - 0xCE, 0x2F, 0x39, 0xF4, 0x6C, 0xDF, 0x8D, 0x8E, - 0x2A, 0x3C, 0x89, 0xC0, 0x4A, 0xDF, 0x0E, 0x8D, - 0x0E, 0xE5, 0x69, 0xA5, 0xDC, 0x2E, 0x4D, 0x40, - 0xC3, 0xFD, 0x18, 0x51, 0x38, 0xCD, 0xAE, 0x5E, - 0xE4, 0x9F, 0x88, 0xA0, 0x7B, 0x06, 0x65, 0x40, - 0x92, 0x6C, 0x6B, 0x40, 0x9B, 0x1B, 0x41, 0x21, - 0x00, 0x9D, 0x28, 0x89, 0x52, 0xC7, 0xF5, 0x10, - 0xA0, 0x51, 0x47, 0x36, 0x1E, 0xAE, 0xF8, 0x79, - 0xF9, 0x07, 0x94, 0xF8, 0xA1, 0x58, 0x3B, 0x6A, - 0xD9, 0x01, 0x16, 0x32, 0xE9, 0xF0, 0xC9, 0x80, - 0x09, 0xCF, 0x89, 0xE5, 0x3D, 0x8D, 0xDB, 0x5A, - 0xDA, 0x30, 0xB3, 0xDC, 0x08, 0x9F, 0xC7, 0x04, - 0xD5, 0x44, 0xF1, 0x0F, 0xD4, 0x6C, 0x6E, 0x0F, - 0xFF, 0x2F, 0x10, 0x6A, 0xFA, 0x4C, 0xFD, 0x76, - 0xF5, 0x22, 0xFE, 0x9E, 0x41, 0x73, 0xDA, 0xE6, - 0x70, 0xA3, 0x1F, 0x55, 0xD4, 0x6C, 0xA1, 0x63, - 0x06, 0x1C, 0x8C, 0xCD, 0x1F, 0xB2, 0x22, 0x88, - 0x4B, 0x22, 0x87, 0xE0, 0xAA, 0x1E, 0x7E, 0xA8, - 0x13, 0xC3, 0x13, 0x06, 0xCE, 0xBC, 0xC8, 0xF4, - 0x22, 0x55, 0xE9, 0x27, 0xBC, 0x04, 0x46, 0x85, - 0x08, 0xF3, 0x64, 0x0C, 0xC9, 0x89, 0xE5, 0x2E, - 0x2C, 0xF4, 0x4F, 0xE1, 0x1A, 0x77, 0x00, 0xA8, - 0x27, 0x6E, 0xD5, 0xB9, 0x6D, 0xCF, 0xB9, 0x50, - 0xDE, 0x0E, 0x11, 0xDF, 0x4A, 0xFA, 0xDC, 0x1C, - 0x9C, 0x4B, 0xFF, 0x53, 0xAB, 0x1B, 0xD9, 0x0A, - 0x82, 0x9B, 0x48, 0x84, 0xD0, 0x7A, 0xFF, 0xD5, - 0x73, 0xB5, 0xF3, 0xF5, 0x6E, 0x0C, 0x68, 0xA8, - 0x4E, 0x88, 0x02, 0xD6, 0x2C, 0x31, 0x52, 0x77, - 0x13, 0xEE, 0xF8, 0x74, 0xD8, 0x0E, 0x70, 0x91, - 0xA0, 0x37, 0x82, 0x1C, 0xCF, 0x7F, 0x39, 0xD6, - 0x51, 0xF8, 0x05, 0x69, 0xBD, 0x07, 0xC2, 0x68, - 0xCD, 0x1A, 0x94, 0x6A, 0x91, 0xFF, 0x5F, 0xBF, - 0x3F, 0x76, 0xA5, 0x69, 0x33, 0xC0, 0xA8, 0x2E, - 0xAD, 0x76, 0x62, 0x1D, 0xC2, 0xFE, 0xE4, 0x56, - 0x92, 0x49, 0x5D, 0x22, 0xFD, 0xE8, 0x6E, 0x88, - 0x04, 0xCD, 0x66, 0xFA, 0x90, 0x33, 0x5B, 0xF1, - 0x32, 0xFF, 0x82, 0xE9, 0xF3, 0x47, 0x27, 0x25, - 0x69, 0x49, 0xE9, 0xB9, 0x66, 0x34, 0x57, 0x9A, - 0x98, 0x67, 0x50, 0x2B, 0x9D, 0x7D, 0x8F, 0x42, - 0xC2, 0x0F, 0x30, 0x50, 0x84, 0x26, 0x4D, 0x74, - 0x06, 0x90, 0x26, 0xCC, 0x04, 0xB4, 0x56, 0x5F, - 0x26, 0xAB, 0x85, 0x1C, 0x7C, 0xEE, 0x23, 0xE0, - 0x85, 0x83, 0x13, 0xDF, 0x97, 0x53, 0x38, 0x61, - 0xB7, 0x85, 0x39, 0x59, 0x8A, 0x36, 0x1A, 0x38, - 0x9B, 0x9D, 0xF9, 0x37, 0x9B, 0xF1, 0x42, 0x42, - 0xE2, 0x39, 0x2D, 0x52, 0x82, 0xD0, 0xD5, 0xB5, - 0x47, 0xC1, 0x09, 0xA7, 0x3C, 0x84, 0xF2, 0x78, - 0x0A, 0xDD, 0x05, 0x8B, 0x17, 0xA7, 0x65, 0xB6, - 0x3E, 0x00, 0x69, 0x23, 0x7D, 0x08, 0x97, 0x7A, - 0xFD, 0x2A, 0x93, 0x3F, 0xC7, 0x77, 0xB5, 0x66, - 0xEE, 0xB7, 0x64, 0xA8, 0x66, 0x4C, 0xDF, 0x7A, - 0x24, 0xD9, 0x72, 0xEE, 0x3A, 0x88, 0xAE, 0xA6, - 0xD9, 0xBA, 0x2E, 0xEF, 0x34, 0x21, 0x99, 0x7F, - 0x5F, 0x14, 0xD6, 0xDC, 0x1D, 0x8A, 0xE6, 0x2D, - 0x7F, 0x87, 0xEC, 0x42, 0x38, 0xFC, 0x56, 0x55, - 0x15, 0xEE, 0x58, 0xE6, 0x5B, 0x4B, 0x89, 0x5A, - 0xD2, 0x7B, 0x91, 0x83, 0xE7, 0x0D, 0x07, 0x24, - 0xA8, 0x1E, 0x7A, 0x58, 0x80, 0x92, 0xE1, 0x29, - 0x4C, 0x4D, 0xDD, 0x37, 0xE6, 0x56, 0x3A, 0x85, - 0x09, 0x86, 0x72, 0x5D, 0x8D, 0x57, 0x74, 0x46, - 0x82, 0x59, 0x5D, 0x22, 0xF1, 0xDD, 0xF6, 0x84, - 0x50, 0x77, 0xCD, 0x5B, 0x8F, 0xB7, 0x55, 0xD1, - 0x51, 0x6F, 0x01, 0x4B, 0x01, 0xA5, 0x39, 0x6B, - 0x22, 0x08, 0x2C, 0x14, 0x30, 0xA2, 0xC1, 0x0C, - 0xAC, 0x56, 0xE4, 0x95, 0xBD, 0x20, 0x47, 0x01, - 0x5E, 0x7A, 0x6E, 0x16, 0x32, 0x94, 0x2E, 0x06, - 0x8A, 0xD9, 0xED, 0xC5, 0x1D, 0x1B, 0xC1, 0x11, - 0x9D, 0xBC, 0x2F, 0x95, 0x6B, 0xF9, 0x8D, 0xB1, - 0x13, 0x0A, 0x4D, 0x03, 0x8F, 0xC3, 0xA5, 0xF8, - 0x87, 0x39, 0x5A, 0x10, 0xE5, 0x52, 0x74, 0x48, - 0x37, 0xEC, 0x6C, 0x41, 0x99, 0x78, 0x2D, 0xEE, - 0x36, 0xE8, 0x1C, 0xD0, 0xF8, 0x02, 0x27, 0xD5, - 0x51, 0x0A, 0x9A, 0xD5, 0x3C, 0xAA, 0x89, 0x7A, - 0x9B, 0x0A, 0xBF, 0xA2, 0x31, 0x82, 0xEE, 0x86, - 0x20, 0x98, 0x01, 0x0B, 0x50, 0xFE, 0x92, 0x21, - 0x33, 0xCD, 0xA5, 0x09, 0xF1, 0x41, 0xB3, 0x15, - 0x35, 0xDC, 0x2E, 0xC2, 0xA8, 0x1D, 0x70, 0x12, - 0x95, 0x4E, 0x48, 0x95, 0x49, 0x49, 0x81, 0xD2, - 0xF0, 0x6C, 0xDA, 0xAB, 0x83, 0x2E, 0xBE, 0x72, - 0xE1, 0x7C, 0xCA, 0xA6, 0x72, 0xF1, 0xA3, 0x27, - 0x27, 0xE1, 0xA7, 0xC7, 0x4C, 0x3E, 0x7B, 0x65, - 0x25, 0xDE, 0x68, 0xC6, 0x78, 0x68, 0xCE, 0xFD, - 0x82, 0x59, 0xD9, 0xF4, 0x2C, 0xAD, 0x80, 0x43, - 0xE2, 0x77, 0xC2, 0x87, 0x4C, 0xE1, 0x71, 0xB1, - 0x31, 0xEA, 0x6A, 0x47, 0x9F, 0xBE, 0xEB, 0x28, - 0x30, 0xE2, 0xD8, 0x1D, 0x67, 0xFE, 0x43, 0x23, - 0x03, 0xCC, 0x5C, 0x0A, 0xD0, 0x05, 0x22, 0xC3, - 0x5E, 0x75, 0xF5, 0xD8, 0x00, 0x11, 0x21, 0xE2, - 0x43, 0xD1, 0x64, 0x39, 0xD2, 0x61, 0x90, 0x1F, - 0x9C, 0xC6, 0x21, 0x4E, 0x1F, 0x86, 0xCF, 0x0C, - 0x25, 0xA7, 0x0C, 0x90, 0x48, 0xF8, 0xAE, 0x2F, - 0xAF, 0x55, 0xB1, 0xDE, 0x8E, 0x1C, 0xBB, 0x13, - 0x8E, 0xF4, 0x11, 0x7E, 0x43, 0xBE, 0xF6, 0xA7, - 0x73, 0xAB, 0xDC, 0xE5, 0x3E, 0x3F, 0x09, 0xCA, - 0xE2, 0x1B, 0x15, 0x72, 0x6A, 0x70, 0x00, 0x50, - 0x4A, 0x81, 0x87, 0x71, 0x3A, 0x13, 0x51, 0xB4, - 0xFA, 0x04, 0xAF, 0x33, 0xEB, 0x5B, 0x0D, 0x8C, - 0x0C, 0x76, 0x93, 0xFC, 0x41, 0xB6, 0xFE, 0xDF, - 0x08, 0xD0, 0x27, 0x78, 0xA3, 0x22, 0x10, 0xD3, - 0x5F, 0x88, 0xE6, 0xA9, 0x80, 0x66, 0x05, 0x72, - 0x9F, 0x66, 0x6D, 0x0E, 0x1E, 0xAA, 0x03, 0xCC, - 0xE1, 0x38, 0x0F, 0x3B, 0xE0, 0xB0, 0x4D, 0xAD, - 0xB4, 0x4C, 0x73, 0x1B, 0xA6, 0x13, 0x73, 0x02, - 0xDB, 0x03, 0x1D, 0x52, 0x86, 0x34, 0xE4, 0x8E, - 0x2E, 0x5C, 0xC9, 0xB8, 0x90, 0x2C, 0x47, 0x41, - 0x37, 0x13, 0x93, 0xBE, 0x66, 0xCA, 0x62, 0x25, - 0x37, 0xE8, 0x7F, 0x49, 0x92, 0x3F, 0xAF, 0xC2, - 0x40, 0x3E, 0x4E, 0x07, 0xF2, 0x48, 0x35, 0x05, - 0x85, 0x5E, 0xDE, 0xF3, 0x2B, 0xDA, 0xE1, 0x22, - 0x93, 0x14, 0xA1, 0x45, 0xD9, 0xE0, 0x02, 0xFB, - 0x3F, 0xF9, 0xBF, 0xD3, 0x0B, 0xBB, 0xED, 0x6C, - 0xEC, 0x95, 0xE1, 0x9D, 0x60, 0xAB, 0xEB, 0xBA, - 0x61, 0xB9, 0x87, 0x69, 0x38, 0xC1, 0xBC, 0x8C, - 0x0C, 0xD7, 0x57, 0x7A, 0xA2, 0xAF, 0xCD, 0x2C, - 0xF1, 0x29, 0xB7, 0xD9, 0x0D, 0x31, 0xDA, 0xB8, - 0x1D, 0x8C, 0x12, 0xFF, 0x79, 0xCA, 0x38, 0x3A, - 0xAA, 0xE8, 0x0C, 0xF9, 0x63, 0x5A, 0x58, 0x14, - 0x97, 0x75, 0x51, 0x20, 0x08, 0xB8, 0xEE, 0x6F, - 0xEF, 0x05, 0xEE, 0x81, 0x61, 0xD2, 0x00, 0xD3, - 0x4B, 0x9C, 0x36, 0x5D, 0x6E, 0xC4, 0x35, 0xAA, - 0x29, 0x32, 0x2F, 0x63, 0x19, 0xFA, 0x82, 0x82, - 0x22, 0xF9, 0xD7, 0xB2, 0xE8, 0x4B, 0x2D, 0x4F, - 0x0C, 0xC7, 0xEB, 0x0F, 0x5E, 0x9D, 0x18, 0xAB, - 0x0B, 0x62, 0xC7, 0xB3, 0x7C, 0x27, 0x49, 0x31, - 0x22, 0x75, 0x58, 0xBC, 0x6F, 0x72, 0x10, 0x30, - 0xB8, 0x63, 0xF8, 0x9E, 0x5B, 0x1B, 0x77, 0xB5, - 0x28, 0x03, 0x83, 0xAE, 0x76, 0xF7, 0xCA, 0x09, - 0xB1, 0x69, 0x6D, 0x13, 0xDF, 0xA7, 0x64, 0x0C, - 0xAF, 0xBE, 0xB3, 0x66, 0x1D, 0x0A, 0x51, 0xC0, - 0xE0, 0xA0, 0xD6, 0x38, 0xF3, 0x5B, 0xA2, 0xC1, - 0x56, 0xE5, 0x78, 0xD6, 0xA6, 0xE9, 0x68, 0xC8, - 0x4B, 0x68, 0x6D, 0xC1, 0x39, 0x89, 0x3B, 0xE8, - 0x70, 0x1A, 0xE6, 0x89, 0xB1, 0xDC, 0xAC, 0x9E, - 0x75, 0x0E, 0x6A, 0x55, 0x95, 0xE5, 0xA5, 0x65, - 0x47, 0xB7, 0x81, 0x2D, 0xD5, 0x65, 0xC5, 0xAF, - 0x3F, 0x46, 0x9B, 0x77, 0xE9, 0x58, 0x38, 0x5A, - 0x19, 0xD2, 0xC1, 0xC3, 0x3B, 0x4B, 0x0B, 0xCB, - 0xDA, 0x5E, 0xEB, 0x05, 0xCE, 0x78, 0x80, 0x49, - 0x6B, 0x73, 0xD5, 0x23, 0x73, 0x4A, 0x59, 0x7C, - 0x97, 0x6C, 0x52, 0xBD, 0xC8, 0x7A, 0xFA, 0x32, - 0xB2, 0x74, 0x32, 0x5E, 0x86, 0x36, 0x60, 0xE1, - 0x61, 0xF8, 0xE6, 0x75, 0x3C, 0xED, 0x8E, 0xFF, - 0x22, 0xFA, 0x7D, 0x5B, 0x80, 0x88, 0xE3, 0xE1, - 0x7A, 0xB9, 0x03, 0x42, 0x4A, 0x36, 0x76, 0x74, - 0xAF, 0x6C, 0x1A, 0x56, 0x8E, 0x9C, 0xDF, 0xBF, - 0x96, 0xF6, 0x80, 0xCC, 0x14, 0x26, 0x65, 0x05, - 0x45, 0xBE, 0x08, 0xF4, 0xA4, 0x04, 0xF6, 0x97, - 0x17, 0x5C, 0x62, 0x2E, 0x74, 0xA7, 0x67, 0x67, - 0xC7, 0x1C, 0x88, 0xC7, 0x9F, 0xEF, 0xAF, 0x6F, - 0xAF, 0x56, 0xF0, 0xDE, 0xA2, 0x12, 0x32, 0xD0, - 0x70, 0x89, 0x5C, 0xB0, 0x75, 0x35, 0x63, 0xE2, - 0x62, 0xDF, 0x5D, 0x39, 0x63, 0xD0, 0x97, 0x95, - 0x16, 0xEB, 0x3B, 0x6F, 0xBD, 0xA0, 0xC2, 0xBF, - 0x3C, 0x2A, 0x98, 0x51, 0x56, 0xC4, 0xB9, 0x89, - 0xA1, 0x29, 0x2D, 0xE1, 0xC2, 0xC2, 0x6E, 0xBE, - 0xFC, 0x64, 0xF4, 0x58, 0xA0, 0x10, 0xE2, 0x28, - 0xA4, 0xBF, 0x29, 0x45, 0x2D, 0x04, 0x74, 0x26, - 0xEC, 0x3B, 0x90, 0x0C, 0xD4, 0x64, 0x1E, 0xDF, - 0x5F, 0x84, 0x32, 0x5E, 0x86, 0x36, 0xB6, 0x7B, - 0xF9, 0x42, 0xF0, 0x9D, 0x45, 0xF5, 0x95, 0x55, - 0xD5, 0x0E, 0x14, 0x76, 0xAC, 0x7C, 0x00, 0xC0, - 0x48, 0x93, 0x58, 0x30, 0x96, 0x22, 0x7E, 0xAC, - 0x2E, 0x95, 0xBB, 0xC5, 0x1F, 0xCF, 0x03, 0xD1, - 0x53, 0xE8, 0xC2, 0xBD, 0x67, 0xB7, 0xFF, 0x2C, - 0xAE, 0x15, 0xEB, 0x93, 0x4B, 0x9B, 0xB7, 0x63, - 0xE3, 0x58, 0x9E, 0xE6, 0x3E, 0xEE, 0xBA, 0x7A, - 0xFA, 0x21, 0x97, 0xFB, 0x23, 0x93, 0xF3, 0x33, - 0xB3, 0x68, 0xDE, 0xB2, 0x6A, 0xDA, 0x92, 0x5B, - 0xDB, 0x60, 0xF2, 0x97, 0x4F, 0x9F, 0xEF, 0x1F, - 0x9D, 0x46, 0x70, 0x08, 0xD0, 0x00, 0x30, 0xF1, - 0x71, 0xAA, 0xA0, 0xCB, 0x13, 0xC3, 0x0B, 0xC6, - 0x44, 0xFF, 0x35, 0x5E, 0x86, 0x56, 0x8E, 0x43, - 0xC1, 0x7A, 0xF0, 0x94, 0x4C, 0x9C, 0xEC, 0x22, - 0xA0, 0x1B, 0x65, 0x07, 0xDD, 0x0D, 0x05, 0xD1, - 0x51, 0xEA, 0xD0, 0xB3, 0x69, 0xB9, 0xB1, 0x60, - 0xE2, 0x59, 0x57, 0x33, 0xEB, 0x3B, 0x83, 0x52, - 0xD0, 0x6B, 0xD1, 0xAF, 0x75, 0xA5, 0x45, 0x97, - 0x15, 0xAE, 0xF0, 0x9A, 0x42, 0x92, 0x1E, 0xCD, - 0x4F, 0xF4, 0x02, 0x64, 0xBC, 0x6C, 0x3A, 0xBB, - 0x3B, 0x61, 0xC8, 0xA1, 0xC8, 0x65, 0x00, 0xCC, - 0x16, 0x5C, 0xF4, 0x9D, 0xE7, 0x1C, 0x7C, 0x35, - 0xBC, 0x42, 0xF7, 0x9B, 0xA6, 0x15, 0x75, 0x10, - 0x95, 0x4E, 0x9D, 0xF9, 0x21, 0xF4, 0x90, 0x50, - 0xB5, 0x67, 0xD1, 0x58, 0x80, 0x30, 0xF1, 0x11, - 0x94, 0xFE, 0x69, 0x00, 0xFD, 0xF9, 0xBE, 0x63, - 0x13, 0xC8, 0x48, 0x65, 0xBD, 0x3C, 0x7E, 0xBB, - 0x1A, 0xE2, 0x51, 0x14, 0xDF, 0x72, 0xE2, 0x22, - 0xA2, 0x79, 0xF9, 0xD4, 0x0C, 0x8D, 0xC9, 0x0C, - 0xAD, 0x53, 0xE0, 0xA5, 0xAE, 0x03, 0x93, 0x53, - 0xD3, 0x08, 0x88, 0xA5, 0x7D, 0xFC, 0xBA, 0x7F, - 0xDE, 0x22, 0x91, 0xD4, 0x4F, 0xE2, 0x72, 0xB2, - 0x32, 0xE9, 0x69, 0x44, 0x9C, 0x1D, 0x59, 0x9C, - 0x3D, 0xCE, 0x7D, 0x38, 0x73, 0xDE, 0x4E, 0x8E, - 0x0E, 0xD5, 0x55, 0x78, 0xA0, 0x81, 0xC8, 0x0D, - 0x81, 0x52, 0x66, 0x43, 0x9B, 0x4E, 0x2F, 0xEF, - 0xCE, 0x3E, 0x8D, 0x50, 0xAE, 0x1B, 0xBA, 0x50, - 0xD5, 0xC7, 0x7A, 0xBF, 0x3C, 0x91, 0x01, 0xC1, - 0x41, 0x9A, 0x1A, 0x37, 0xEF, 0x6E, 0x22, 0xE7, - 0x46, 0xB0, 0x03, 0x46, 0x8D, 0x20, 0xB0, 0x70, - 0xF0, 0x2B, 0xAB, 0x86, 0x5E, 0x6F, 0x21, 0xE4, - 0x55, 0xAC, 0x1F, 0x52, 0xA5, 0x10, 0x59, 0xBA, - 0xB3, 0x3B, 0x90, 0x0C, 0xD4, 0x64, 0x32, 0xB3, - 0x33, 0x79, 0xFF, 0x96, 0xCF, 0x4E, 0x2B, 0x62, - 0xCB, 0x75, 0xC3, 0xAF, 0x6A, 0x2A, 0x7C, 0xFD, - 0x7D, 0x07, 0x83, 0xEA, 0x80, 0x90, 0x7C, 0x14, - 0x9E, 0x65, 0xB2, 0xDE, 0x8E, 0x14, 0xCE, 0xB4, - 0xA8, 0x6B, 0xD1, 0xA1, 0x75, 0x48, 0xCA, 0x20, - 0x88, 0x93, 0x05, 0x69, 0x63, 0x9D, 0xF1, 0xF3, - 0x38, 0xC4, 0x57, 0x3A, 0xC6, 0x56, 0xD0, 0x03, - 0x93, 0x68, 0xDE, 0xAF, 0x87, 0x37, 0x57, 0x97, - 0x17, 0xCC, 0x7A, 0x16, 0xCE, 0x7E, 0x1E, 0xDE, - 0x5E, 0x85, 0x32, 0x5E, 0x82, 0x32, 0x9E, 0x4A, - 0xC8, 0x73, + 0x06, 0xFE, 0x93, 0xFF, 0x03, 0xBA, 0x6A, 0xA6, + 0x26, 0x9D, 0x03, 0x66, 0xBE, 0x6E, 0x2A, 0xE3, + 0x63, 0xD8, 0xFE, 0x9B, 0x43, 0x93, 0xD7, 0x03, + 0x83, 0x38, 0x8C, 0xE0, 0x38, 0x88, 0x58, 0x94, + 0x14, 0xAF, 0xC9, 0xA2, 0x7A, 0xCA, 0x96, 0x5E, + 0xDE, 0x65, 0x27, 0x36, 0xEA, 0x3A, 0x4E, 0x82, + 0x02, 0xB9, 0x0F, 0x4B, 0x97, 0x17, 0xF7, 0x1A, + 0x9E, 0x75, 0xC3, 0x8F, 0x53, 0xD3, 0x9F, 0x7F, + 0xFB, 0x10, 0xE6, 0xAA, 0x76, 0xF6, 0x72, 0x93, + 0x17, 0xFC, 0x4A, 0x26, 0xFE, 0x76, 0x2A, 0xEA, + 0x6A, 0x89, 0x3F, 0xF3, 0x2B, 0xA3, 0xFF, 0x9F, + 0x1F, 0xFC, 0x4A, 0x06, 0xDE, 0x56, 0x38, 0xD8, + 0x58, 0xBB, 0x0D, 0x21, 0xF9, 0x71, 0x19, 0x99, + 0x19, 0xFA, 0x4C, 0x40, 0x98, 0x10, 0x78, 0xD8, + 0x58, 0xBB, 0x0D, 0xE1, 0x39, 0xB1, 0xD9, 0x99, + 0x19, 0xFA, 0x6C, 0x7E, 0xA2, 0x72, 0xC6, 0x7D, + 0xF9, 0x42, 0xF4, 0x86, 0x5A, 0xDA, 0xD2, 0x06, + 0x86, 0x3D, 0x6F, 0x08, 0xD0, 0x00, 0xD8, 0x10, + 0x90, 0x2B, 0xFD, 0xB7, 0x6B, 0xBB, 0x67, 0xA0, + 0x20, 0x9B, 0x35, 0x36, 0xEA, 0x3A, 0xA2, 0x0C, + 0x88, 0x33, 0x7D, 0x1A, 0xC2, 0x12, 0x2A, 0xFE, + 0x7E, 0xC5, 0x8C, 0x17, 0x30, 0x7F, 0xE0, 0xCF, + 0xB0, 0x94, 0x4E, 0x36, 0xEE, 0x3E, 0x5E, 0x96, + 0x16, 0xCD, 0x9F, 0xE1, 0x3B, 0xEB, 0x8B, 0x5B, + 0xDB, 0x00, 0x8A, 0xF2, 0x2A, 0xFA, 0x0E, 0xC8, + 0x48, 0xF3, 0x6D, 0x12, 0xC8, 0x18, 0x08, 0xDC, + 0x5C, 0xE7, 0x01, 0x79, 0xA1, 0x71, 0x3D, 0xF4, + 0x74, 0xCF, 0x84, 0x17, 0xCF, 0x7F, 0xE0, 0x20, + 0x5F, 0x7B, 0xFB, 0xD6, 0x0E, 0x1B, 0x65, 0xA5, + 0x00, 0xDC, 0x6A, 0xE3, 0x7E, 0xCE, 0x4B, 0xCE, + 0x68, 0x22, 0xB8, 0xD7, 0xAE, 0x33, 0x50, 0x9C, + 0x14, 0x46, 0xFA, 0x14, 0x85, 0x35, 0x48, 0x78, + 0xF8, 0x23, 0xA3, 0x8E, 0x56, 0x77, 0x39, 0xFA, + 0x76, 0xA5, 0x91, 0xB4, 0x34, 0xE1, 0x4D, 0xA8, + 0x35, 0x1E, 0x9E, 0xB3, 0x6B, 0x6A, 0x3A, 0xF9, + 0xD4, 0x0D, 0x9A, 0xD9, 0x02, 0xF4, 0x94, 0x54, + 0x1F, 0xE6, 0x5B, 0x8C, 0x72, 0xC9, 0xA3, 0xEB, + 0x69, 0x32, 0x04, 0x1C, 0x43, 0x69, 0xF9, 0x3F, + 0xBE, 0x65, 0xF6, 0xFE, 0x03, 0x9E, 0xF4, 0x29, + 0x59, 0x82, 0x02, 0x2F, 0xF7, 0x67, 0x66, 0xA6, + 0x03, 0x22, 0x6B, 0x27, 0x19, 0xBA, 0xCA, 0x2A, + 0xAA, 0x7D, 0xC1, 0x08, 0xF6, 0x63, 0xA2, 0x53, + 0xD0, 0xBA, 0x3E, 0x51, 0xAC, 0x38, 0x70, 0xAD, + 0xDD, 0x06, 0x86, 0xAB, 0x73, 0xF2, 0xA1, 0x62, + 0xC3, 0x2C, 0x99, 0xDC, 0x47, 0xEA, 0x7A, 0xBA, + 0x3A, 0xE1, 0x61, 0x4C, 0x94, 0xA6, 0xC4, 0x09, + 0x85, 0x45, 0x73, 0x9F, 0x43, 0xA5, 0xDD, 0x1A, + 0x96, 0x48, 0xF2, 0x98, 0x02, 0xA0, 0xCE, 0x12, + 0x95, 0x74, 0x86, 0x58, 0x44, 0x75, 0x27, 0xE3, + 0x63, 0x0A, 0xB7, 0xA5, 0xBF, 0x0B, 0x6A, 0x9D, + 0xA6, 0x71, 0xF0, 0x20, 0xE9, 0x64, 0x0F, 0x08, + 0x33, 0xE4, 0x6F, 0x0F, 0x11, 0xA0, 0xC0, 0x37, + 0x8B, 0x54, 0x25, 0xF2, 0x2B, 0xA6, 0xCD, 0xA0, + 0x23, 0x45, 0xF0, 0xF9, 0x99, 0x01, 0xCB, 0x6D, + 0xB7, 0x3F, 0x82, 0x99, 0x0A, 0xFE, 0x2C, 0x28, + 0x29, 0xA4, 0x85, 0x15, 0x60, 0xD5, 0x08, 0xCD, + 0x68, 0x04, 0x9A, 0xFA, 0x39, 0x5B, 0x99, 0x35, + 0x15, 0x0A, 0xFD, 0x51, 0x4F, 0x3F, 0x85, 0x97, + 0xE5, 0x23, 0x17, 0xBB, 0xA7, 0x56, 0xF6, 0xB5, + 0x74, 0x5F, 0x06, 0x9A, 0xA2, 0xF1, 0xB0, 0xFA, + 0x94, 0xBF, 0xC7, 0x38, 0x22, 0xCF, 0x2D, 0xEB, + 0x68, 0xB3, 0xC7, 0x09, 0xBD, 0xC7, 0x65, 0x67, + 0xFB, 0x5D, 0xD1, 0x71, 0x6B, 0xD7, 0xB7, 0xA5, + 0x37, 0xE5, 0x7E, 0x19, 0x16, 0x1A, 0x7B, 0xB7, + 0x15, 0xD3, 0x95, 0xF9, 0x21, 0x91, 0xC7, 0x46, + 0xC6, 0xAC, 0x2F, 0x40, 0x20, 0x9B, 0x77, 0xDC, + 0xFE, 0x84, 0x52, 0x94, 0xE7, 0xF2, 0x28, 0xC8, + 0xE5, 0x3C, 0x2F, 0xEF, 0x12, 0xBF, 0x2F, 0xEF, + 0x6F, 0xB4, 0x34, 0x19, 0xC1, 0xD0, 0x86, 0x45, + 0x74, 0x98, 0x2D, 0x8C, 0x56, 0x43, 0x75, 0x90, + 0xA1, 0x43, 0xF6, 0xBA, 0x48, 0x58, 0x99, 0x61, + 0xE2, 0xF4, 0x40, 0x89, 0x04, 0x91, 0x40, 0xBB, + 0x38, 0xC3, 0x4F, 0x83, 0x99, 0xEA, 0x9A, 0xFB, + 0x41, 0x99, 0x23, 0x4D, 0xBC, 0x0F, 0x46, 0x95, + 0x3C, 0xC4, 0x5B, 0x04, 0xF9, 0x1D, 0x58, 0x29, + 0x94, 0x4C, 0xCA, 0x9C, 0xE4, 0x96, 0x35, 0xE5, + 0xC4, 0x23, 0x96, 0xDF, 0x54, 0xC1, 0xAD, 0x64, + 0xD4, 0x35, 0x23, 0x7D, 0x66, 0xC6, 0xBD, 0xE4, + 0x4D, 0x95, 0x68, 0x37, 0x89, 0xA0, 0x36, 0x5B, + 0xD8, 0xB1, 0xA7, 0x6E, 0x9A, 0x66, 0x23, 0x41, + 0xE9, 0x93, 0x1B, 0x74, 0x1D, 0x92, 0xF1, 0xF3, + 0xB0, 0x4F, 0x5C, 0x60, 0x9D, 0x9C, 0xBD, 0x7E, + 0xCE, 0x2F, 0x39, 0xF4, 0x6C, 0xDF, 0x8D, 0x8E, + 0x2A, 0x3C, 0x89, 0xC0, 0x4A, 0xDF, 0x0E, 0x8D, + 0x0E, 0xE5, 0x69, 0xA5, 0xDC, 0x2E, 0x4D, 0x40, + 0xC3, 0xFD, 0x18, 0x51, 0x38, 0xCD, 0xAE, 0x5E, + 0xE4, 0x9F, 0x88, 0xA0, 0x7B, 0x06, 0x65, 0x40, + 0x92, 0x6C, 0x6B, 0x40, 0x9B, 0x1B, 0x41, 0x21, + 0x00, 0x9D, 0x28, 0x89, 0x52, 0xC7, 0xF5, 0x10, + 0xA0, 0x51, 0x47, 0x36, 0x1E, 0xAE, 0xF8, 0x79, + 0xF9, 0x07, 0x94, 0xF8, 0xA1, 0x58, 0x3B, 0x6A, + 0xD9, 0x01, 0x16, 0x32, 0xE9, 0xF0, 0xC9, 0x80, + 0x09, 0xCF, 0x89, 0xE5, 0x3D, 0x8D, 0xDB, 0x5A, + 0xDA, 0x30, 0xB3, 0xDC, 0x08, 0x9F, 0xC7, 0x04, + 0xD5, 0x44, 0xF1, 0x0F, 0xD4, 0x6C, 0x6E, 0x0F, + 0xFF, 0x2F, 0x10, 0x6A, 0xFA, 0x4C, 0xFD, 0x76, + 0xF5, 0x22, 0xFE, 0x9E, 0x41, 0x73, 0xDA, 0xE6, + 0x70, 0xA3, 0x1F, 0x55, 0xD4, 0x6C, 0xA1, 0x63, + 0x06, 0x1C, 0x8C, 0xCD, 0x1F, 0xB2, 0x22, 0x88, + 0x4B, 0x22, 0x87, 0xE0, 0xAA, 0x1E, 0x7E, 0xA8, + 0x13, 0xC3, 0x13, 0x06, 0xCE, 0xBC, 0xC8, 0xF4, + 0x22, 0x55, 0xE9, 0x27, 0xBC, 0x04, 0x46, 0x85, + 0x08, 0xF3, 0x64, 0x0C, 0xC9, 0x89, 0xE5, 0x2E, + 0x2C, 0xF4, 0x4F, 0xE1, 0x1A, 0x77, 0x00, 0xA8, + 0x27, 0x6E, 0xD5, 0xB9, 0x6D, 0xCF, 0xB9, 0x50, + 0xDE, 0x0E, 0x11, 0xDF, 0x4A, 0xFA, 0xDC, 0x1C, + 0x9C, 0x4B, 0xFF, 0x53, 0xAB, 0x1B, 0xD9, 0x0A, + 0x82, 0x9B, 0x48, 0x84, 0xD0, 0x7A, 0xFF, 0xD5, + 0x73, 0xB5, 0xF3, 0xF5, 0x6E, 0x0C, 0x68, 0xA8, + 0x4E, 0x88, 0x02, 0xD6, 0x2C, 0x31, 0x52, 0x77, + 0x13, 0xEE, 0xF8, 0x74, 0xD8, 0x0E, 0x70, 0x91, + 0xA0, 0x37, 0x82, 0x1C, 0xCF, 0x7F, 0x39, 0xD6, + 0x51, 0xF8, 0x05, 0x69, 0xBD, 0x07, 0xC2, 0x68, + 0xCD, 0x1A, 0x94, 0x6A, 0x91, 0xFF, 0x5F, 0xBF, + 0x3F, 0x76, 0xA5, 0x69, 0x33, 0xC0, 0xA8, 0x2E, + 0xAD, 0x76, 0x62, 0x1D, 0xC2, 0xFE, 0xE4, 0x56, + 0x92, 0x49, 0x5D, 0x22, 0xFD, 0xE8, 0x6E, 0x88, + 0x04, 0xCD, 0x66, 0xFA, 0x90, 0x33, 0x5B, 0xF1, + 0x32, 0xFF, 0x82, 0xE9, 0xF3, 0x47, 0x27, 0x25, + 0x69, 0x49, 0xE9, 0xB9, 0x66, 0x34, 0x57, 0x9A, + 0x98, 0x67, 0x50, 0x2B, 0x9D, 0x7D, 0x8F, 0x42, + 0xC2, 0x0F, 0x30, 0x50, 0x84, 0x26, 0x4D, 0x74, + 0x06, 0x90, 0x26, 0xCC, 0x04, 0xB4, 0x56, 0x5F, + 0x26, 0xAB, 0x85, 0x1C, 0x7C, 0xEE, 0x23, 0xE0, + 0x85, 0x83, 0x13, 0xDF, 0x97, 0x53, 0x38, 0x61, + 0xB7, 0x85, 0x39, 0x59, 0x8A, 0x36, 0x1A, 0x38, + 0x9B, 0x9D, 0xF9, 0x37, 0x9B, 0xF1, 0x42, 0x42, + 0xE2, 0x39, 0x2D, 0x52, 0x82, 0xD0, 0xD5, 0xB5, + 0x47, 0xC1, 0x09, 0xA7, 0x3C, 0x84, 0xF2, 0x78, + 0x0A, 0xDD, 0x05, 0x8B, 0x17, 0xA7, 0x65, 0xB6, + 0x3E, 0x00, 0x69, 0x23, 0x7D, 0x08, 0x97, 0x7A, + 0xFD, 0x2A, 0x93, 0x3F, 0xC7, 0x77, 0xB5, 0x66, + 0xEE, 0xB7, 0x64, 0xA8, 0x66, 0x4C, 0xDF, 0x7A, + 0x24, 0xD9, 0x72, 0xEE, 0x3A, 0x88, 0xAE, 0xA6, + 0xD9, 0xBA, 0x2E, 0xEF, 0x34, 0x21, 0x99, 0x7F, + 0x5F, 0x14, 0xD6, 0xDC, 0x1D, 0x8A, 0xE6, 0x2D, + 0x7F, 0x87, 0xEC, 0x42, 0x38, 0xFC, 0x56, 0x55, + 0x15, 0xEE, 0x58, 0xE6, 0x5B, 0x4B, 0x89, 0x5A, + 0xD2, 0x7B, 0x91, 0x83, 0xE7, 0x0D, 0x07, 0x24, + 0xA8, 0x1E, 0x7A, 0x58, 0x80, 0x92, 0xE1, 0x29, + 0x4C, 0x4D, 0xDD, 0x37, 0xE6, 0x56, 0x3A, 0x85, + 0x09, 0x86, 0x72, 0x5D, 0x8D, 0x57, 0x74, 0x46, + 0x82, 0x59, 0x5D, 0x22, 0xF1, 0xDD, 0xF6, 0x84, + 0x50, 0x77, 0xCD, 0x5B, 0x8F, 0xB7, 0x55, 0xD1, + 0x51, 0x6F, 0x01, 0x4B, 0x01, 0xA5, 0x39, 0x6B, + 0x22, 0x08, 0x2C, 0x14, 0x30, 0xA2, 0xC1, 0x0C, + 0xAC, 0x56, 0xE4, 0x95, 0xBD, 0x20, 0x47, 0x01, + 0x5E, 0x7A, 0x6E, 0x16, 0x32, 0x94, 0x2E, 0x06, + 0x8A, 0xD9, 0xED, 0xC5, 0x1D, 0x1B, 0xC1, 0x11, + 0x9D, 0xBC, 0x2F, 0x95, 0x6B, 0xF9, 0x8D, 0xB1, + 0x13, 0x0A, 0x4D, 0x03, 0x8F, 0xC3, 0xA5, 0xF8, + 0x87, 0x39, 0x5A, 0x10, 0xE5, 0x52, 0x74, 0x48, + 0x37, 0xEC, 0x6C, 0x41, 0x99, 0x78, 0x2D, 0xEE, + 0x36, 0xE8, 0x1C, 0xD0, 0xF8, 0x02, 0x27, 0xD5, + 0x51, 0x0A, 0x9A, 0xD5, 0x3C, 0xAA, 0x89, 0x7A, + 0x9B, 0x0A, 0xBF, 0xA2, 0x31, 0x82, 0xEE, 0x86, + 0x20, 0x98, 0x01, 0x0B, 0x50, 0xFE, 0x92, 0x21, + 0x33, 0xCD, 0xA5, 0x09, 0xF1, 0x41, 0xB3, 0x15, + 0x35, 0xDC, 0x2E, 0xC2, 0xA8, 0x1D, 0x70, 0x12, + 0x95, 0x4E, 0x48, 0x95, 0x49, 0x49, 0x81, 0xD2, + 0xF0, 0x6C, 0xDA, 0xAB, 0x83, 0x2E, 0xBE, 0x72, + 0xE1, 0x7C, 0xCA, 0xA6, 0x72, 0xF1, 0xA3, 0x27, + 0x27, 0xE1, 0xA7, 0xC7, 0x4C, 0x3E, 0x7B, 0x65, + 0x25, 0xDE, 0x68, 0xC6, 0x78, 0x68, 0xCE, 0xFD, + 0x82, 0x59, 0xD9, 0xF4, 0x2C, 0xAD, 0x80, 0x43, + 0xE2, 0x77, 0xC2, 0x87, 0x4C, 0xE1, 0x71, 0xB1, + 0x31, 0xEA, 0x6A, 0x47, 0x9F, 0xBE, 0xEB, 0x28, + 0x30, 0xE2, 0xD8, 0x1D, 0x67, 0xFE, 0x43, 0x23, + 0x03, 0xCC, 0x5C, 0x0A, 0xD0, 0x05, 0x22, 0xC3, + 0x5E, 0x75, 0xF5, 0xD8, 0x00, 0x11, 0x21, 0xE2, + 0x43, 0xD1, 0x64, 0x39, 0xD2, 0x61, 0x90, 0x1F, + 0x9C, 0xC6, 0x21, 0x4E, 0x1F, 0x86, 0xCF, 0x0C, + 0x25, 0xA7, 0x0C, 0x90, 0x48, 0xF8, 0xAE, 0x2F, + 0xAF, 0x55, 0xB1, 0xDE, 0x8E, 0x1C, 0xBB, 0x13, + 0x8E, 0xF4, 0x11, 0x7E, 0x43, 0xBE, 0xF6, 0xA7, + 0x73, 0xAB, 0xDC, 0xE5, 0x3E, 0x3F, 0x09, 0xCA, + 0xE2, 0x1B, 0x15, 0x72, 0x6A, 0x70, 0x00, 0x50, + 0x4A, 0x81, 0x87, 0x71, 0x3A, 0x13, 0x51, 0xB4, + 0xFA, 0x04, 0xAF, 0x33, 0xEB, 0x5B, 0x0D, 0x8C, + 0x0C, 0x76, 0x93, 0xFC, 0x41, 0xB6, 0xFE, 0xDF, + 0x08, 0xD0, 0x27, 0x78, 0xA3, 0x22, 0x10, 0xD3, + 0x5F, 0x88, 0xE6, 0xA9, 0x80, 0x66, 0x05, 0x72, + 0x9F, 0x66, 0x6D, 0x0E, 0x1E, 0xAA, 0x03, 0xCC, + 0xE1, 0x38, 0x0F, 0x3B, 0xE0, 0xB0, 0x4D, 0xAD, + 0xB4, 0x4C, 0x73, 0x1B, 0xA6, 0x13, 0x73, 0x02, + 0xDB, 0x03, 0x1D, 0x52, 0x86, 0x34, 0xE4, 0x8E, + 0x2E, 0x5C, 0xC9, 0xB8, 0x90, 0x2C, 0x47, 0x41, + 0x37, 0x13, 0x93, 0xBE, 0x66, 0xCA, 0x62, 0x25, + 0x37, 0xE8, 0x7F, 0x49, 0x92, 0x3F, 0xAF, 0xC2, + 0x40, 0x3E, 0x4E, 0x07, 0xF2, 0x48, 0x35, 0x05, + 0x85, 0x5E, 0xDE, 0xF3, 0x2B, 0xDA, 0xE1, 0x22, + 0x93, 0x14, 0xA1, 0x45, 0xD9, 0xE0, 0x02, 0xFB, + 0x3F, 0xF9, 0xBF, 0xD3, 0x0B, 0xBB, 0xED, 0x6C, + 0xEC, 0x95, 0xE1, 0x9D, 0x60, 0xAB, 0xEB, 0xBA, + 0x61, 0xB9, 0x87, 0x69, 0x38, 0xC1, 0xBC, 0x8C, + 0x0C, 0xD7, 0x57, 0x7A, 0xA2, 0xAF, 0xCD, 0x2C, + 0xF1, 0x29, 0xB7, 0xD9, 0x0D, 0x31, 0xDA, 0xB8, + 0x1D, 0x8C, 0x12, 0xFF, 0x79, 0xCA, 0x38, 0x3A, + 0xAA, 0xE8, 0x0C, 0xF9, 0x63, 0x5A, 0x58, 0x14, + 0x97, 0x75, 0x51, 0x20, 0x08, 0xB8, 0xEE, 0x6F, + 0xEF, 0x05, 0xEE, 0x81, 0x61, 0xD2, 0x00, 0xD3, + 0x4B, 0x9C, 0x36, 0x5D, 0x6E, 0xC4, 0x35, 0xAA, + 0x29, 0x32, 0x2F, 0x63, 0x19, 0xFA, 0x82, 0x82, + 0x22, 0xF9, 0xD7, 0xB2, 0xE8, 0x4B, 0x2D, 0x4F, + 0x0C, 0xC7, 0xEB, 0x0F, 0x5E, 0x9D, 0x18, 0xAB, + 0x0B, 0x62, 0xC7, 0xB3, 0x7C, 0x27, 0x49, 0x31, + 0x22, 0x75, 0x58, 0xBC, 0x6F, 0x72, 0x10, 0x30, + 0xB8, 0x63, 0xF8, 0x9E, 0x5B, 0x1B, 0x77, 0xB5, + 0x28, 0x03, 0x83, 0xAE, 0x76, 0xF7, 0xCA, 0x09, + 0xB1, 0x69, 0x6D, 0x13, 0xDF, 0xA7, 0x64, 0x0C, + 0xAF, 0xBE, 0xB3, 0x66, 0x1D, 0x0A, 0x51, 0xC0, + 0xE0, 0xA0, 0xD6, 0x38, 0xF3, 0x5B, 0xA2, 0xC1, + 0x56, 0xE5, 0x78, 0xD6, 0xA6, 0xE9, 0x68, 0xC8, + 0x4B, 0x68, 0x6D, 0xC1, 0x39, 0x89, 0x3B, 0xE8, + 0x70, 0x1A, 0xE6, 0x89, 0xB1, 0xDC, 0xAC, 0x9E, + 0x75, 0x0E, 0x6A, 0x55, 0x95, 0xE5, 0xA5, 0x65, + 0x47, 0xB7, 0x81, 0x2D, 0xD5, 0x65, 0xC5, 0xAF, + 0x3F, 0x46, 0x9B, 0x77, 0xE9, 0x58, 0x38, 0x5A, + 0x19, 0xD2, 0xC1, 0xC3, 0x3B, 0x4B, 0x0B, 0xCB, + 0xDA, 0x5E, 0xEB, 0x05, 0xCE, 0x78, 0x80, 0x49, + 0x6B, 0x73, 0xD5, 0x23, 0x73, 0x4A, 0x59, 0x7C, + 0x97, 0x6C, 0x52, 0xBD, 0xC8, 0x7A, 0xFA, 0x32, + 0xB2, 0x74, 0x32, 0x5E, 0x86, 0x36, 0x60, 0xE1, + 0x61, 0xF8, 0xE6, 0x75, 0x3C, 0xED, 0x8E, 0xFF, + 0x22, 0xFA, 0x7D, 0x5B, 0x80, 0x88, 0xE3, 0xE1, + 0x7A, 0xB9, 0x03, 0x42, 0x4A, 0x36, 0x76, 0x74, + 0xAF, 0x6C, 0x1A, 0x56, 0x8E, 0x9C, 0xDF, 0xBF, + 0x96, 0xF6, 0x80, 0xCC, 0x14, 0x26, 0x65, 0x05, + 0x45, 0xBE, 0x08, 0xF4, 0xA4, 0x04, 0xF6, 0x97, + 0x17, 0x5C, 0x62, 0x2E, 0x74, 0xA7, 0x67, 0x67, + 0xC7, 0x1C, 0x88, 0xC7, 0x9F, 0xEF, 0xAF, 0x6F, + 0xAF, 0x56, 0xF0, 0xDE, 0xA2, 0x12, 0x32, 0xD0, + 0x70, 0x89, 0x5C, 0xB0, 0x75, 0x35, 0x63, 0xE2, + 0x62, 0xDF, 0x5D, 0x39, 0x63, 0xD0, 0x97, 0x95, + 0x16, 0xEB, 0x3B, 0x6F, 0xBD, 0xA0, 0xC2, 0xBF, + 0x3C, 0x2A, 0x98, 0x51, 0x56, 0xC4, 0xB9, 0x89, + 0xA1, 0x29, 0x2D, 0xE1, 0xC2, 0xC2, 0x6E, 0xBE, + 0xFC, 0x64, 0xF4, 0x58, 0xA0, 0x10, 0xE2, 0x28, + 0xA4, 0xBF, 0x29, 0x45, 0x2D, 0x04, 0x74, 0x26, + 0xEC, 0x3B, 0x90, 0x0C, 0xD4, 0x64, 0x1E, 0xDF, + 0x5F, 0x84, 0x32, 0x5E, 0x86, 0x36, 0xB6, 0x7B, + 0xF9, 0x42, 0xF0, 0x9D, 0x45, 0xF5, 0x95, 0x55, + 0xD5, 0x0E, 0x14, 0x76, 0xAC, 0x7C, 0x00, 0xC0, + 0x48, 0x93, 0x58, 0x30, 0x96, 0x22, 0x7E, 0xAC, + 0x2E, 0x95, 0xBB, 0xC5, 0x1F, 0xCF, 0x03, 0xD1, + 0x53, 0xE8, 0xC2, 0xBD, 0x67, 0xB7, 0xFF, 0x2C, + 0xAE, 0x15, 0xEB, 0x93, 0x4B, 0x9B, 0xB7, 0x63, + 0xE3, 0x58, 0x9E, 0xE6, 0x3E, 0xEE, 0xBA, 0x7A, + 0xFA, 0x21, 0x97, 0xFB, 0x23, 0x93, 0xF3, 0x33, + 0xB3, 0x68, 0xDE, 0xB2, 0x6A, 0xDA, 0x92, 0x5B, + 0xDB, 0x60, 0xF2, 0x97, 0x4F, 0x9F, 0xEF, 0x1F, + 0x9D, 0x46, 0x70, 0x08, 0xD0, 0x00, 0x30, 0xF1, + 0x71, 0xAA, 0xA0, 0xCB, 0x13, 0xC3, 0x0B, 0xC6, + 0x44, 0xFF, 0x35, 0x5E, 0x86, 0x56, 0x8E, 0x43, + 0xC1, 0x7A, 0xF0, 0x94, 0x4C, 0x9C, 0xEC, 0x22, + 0xA0, 0x1B, 0x65, 0x07, 0xDD, 0x0D, 0x05, 0xD1, + 0x51, 0xEA, 0xD0, 0xB3, 0x69, 0xB9, 0xB1, 0x60, + 0xE2, 0x59, 0x57, 0x33, 0xEB, 0x3B, 0x83, 0x52, + 0xD0, 0x6B, 0xD1, 0xAF, 0x75, 0xA5, 0x45, 0x97, + 0x15, 0xAE, 0xF0, 0x9A, 0x42, 0x92, 0x1E, 0xCD, + 0x4F, 0xF4, 0x02, 0x64, 0xBC, 0x6C, 0x3A, 0xBB, + 0x3B, 0x61, 0xC8, 0xA1, 0xC8, 0x65, 0x00, 0xCC, + 0x16, 0x5C, 0xF4, 0x9D, 0xE7, 0x1C, 0x7C, 0x35, + 0xBC, 0x42, 0xF7, 0x9B, 0xA6, 0x15, 0x75, 0x10, + 0x95, 0x4E, 0x9D, 0xF9, 0x21, 0xF4, 0x90, 0x50, + 0xB5, 0x67, 0xD1, 0x58, 0x80, 0x30, 0xF1, 0x11, + 0x94, 0xFE, 0x69, 0x00, 0xFD, 0xF9, 0xBE, 0x63, + 0x13, 0xC8, 0x48, 0x65, 0xBD, 0x3C, 0x7E, 0xBB, + 0x1A, 0xE2, 0x51, 0x14, 0xDF, 0x72, 0xE2, 0x22, + 0xA2, 0x79, 0xF9, 0xD4, 0x0C, 0x8D, 0xC9, 0x0C, + 0xAD, 0x53, 0xE0, 0xA5, 0xAE, 0x03, 0x93, 0x53, + 0xD3, 0x08, 0x88, 0xA5, 0x7D, 0xFC, 0xBA, 0x7F, + 0xDE, 0x22, 0x91, 0xD4, 0x4F, 0xE2, 0x72, 0xB2, + 0x32, 0xE9, 0x69, 0x44, 0x9C, 0x1D, 0x59, 0x9C, + 0x3D, 0xCE, 0x7D, 0x38, 0x73, 0xDE, 0x4E, 0x8E, + 0x0E, 0xD5, 0x55, 0x78, 0xA0, 0x81, 0xC8, 0x0D, + 0x81, 0x52, 0x66, 0x43, 0x9B, 0x4E, 0x2F, 0xEF, + 0xCE, 0x3E, 0x8D, 0x50, 0xAE, 0x1B, 0xBA, 0x50, + 0xD5, 0xC7, 0x7A, 0xBF, 0x3C, 0x91, 0x01, 0xC1, + 0x41, 0x9A, 0x1A, 0x37, 0xEF, 0x6E, 0x22, 0xE7, + 0x46, 0xB0, 0x03, 0x46, 0x8D, 0x20, 0xB0, 0x70, + 0xF0, 0x2B, 0xAB, 0x86, 0x5E, 0x6F, 0x21, 0xE4, + 0x55, 0xAC, 0x1F, 0x52, 0xA5, 0x10, 0x59, 0xBA, + 0xB3, 0x3B, 0x90, 0x0C, 0xD4, 0x64, 0x32, 0xB3, + 0x33, 0x79, 0xFF, 0x96, 0xCF, 0x4E, 0x2B, 0x62, + 0xCB, 0x75, 0xC3, 0xAF, 0x6A, 0x2A, 0x7C, 0xFD, + 0x7D, 0x07, 0x83, 0xEA, 0x80, 0x90, 0x7C, 0x14, + 0x9E, 0x65, 0xB2, 0xDE, 0x8E, 0x14, 0xCE, 0xB4, + 0xA8, 0x6B, 0xD1, 0xA1, 0x75, 0x48, 0xCA, 0x20, + 0x88, 0x93, 0x05, 0x69, 0x63, 0x9D, 0xF1, 0xF3, + 0x38, 0xC4, 0x57, 0x3A, 0xC6, 0x56, 0xD0, 0x03, + 0x93, 0x68, 0xDE, 0xAF, 0x87, 0x37, 0x57, 0x97, + 0x17, 0xCC, 0x7A, 0x16, 0xCE, 0x7E, 0x1E, 0xDE, + 0x5E, 0x85, 0x32, 0x5E, 0x82, 0x32, 0x9E, 0x4A, + 0xC8, 0x73, }; static unsigned char vfs5011_init_04[] = { /* 2221 B */ - 0x02, 0x20, 0x01, 0x01, 0x00, 0x03, 0x00, 0x09, - 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, - 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xAD, 0x01, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, - 0x20, 0x04, 0x30, 0xAD, 0x01, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, - 0xAD, 0x01, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x4C, 0x20, 0x04, 0x30, 0xFF, 0x03, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, - 0x04, 0x30, 0x00, 0x00, 0x50, 0x03, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x54, 0x20, 0x04, 0x30, 0x01, - 0x3E, 0x02, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x00, 0x21, 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x14, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x1C, 0x21, 0x04, 0x30, 0x12, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x20, 0x21, 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x40, 0x21, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, - 0x21, 0x04, 0x30, 0x10, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x5C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x60, 0x21, 0x04, - 0x30, 0x0F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x80, 0x21, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x84, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x88, 0x21, 0x04, 0x30, - 0x10, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x8C, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x90, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x94, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x98, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x9C, 0x21, 0x04, - 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x0F, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC0, - 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xC4, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xC8, 0x21, 0x04, 0x30, 0x10, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xCC, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xD0, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xD4, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xD8, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xDC, 0x21, 0x04, 0x30, 0x1F, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xE0, - 0x21, 0x04, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xA0, 0x20, 0x04, 0x30, - 0xEF, 0xE1, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xA4, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA8, 0x20, - 0x04, 0x30, 0xFE, 0x21, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xC4, 0x20, 0x04, 0x30, 0x47, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, - 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, - 0x00, 0x12, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, - 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, - 0x0C, 0x8A, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, - 0xFF, 0xF9, 0x87, 0x20, 0x83, 0x48, 0x84, 0x20, - 0x83, 0x48, 0x84, 0x20, 0x83, 0x48, 0x84, 0x20, - 0x83, 0x48, 0x84, 0x20, 0x83, 0x48, 0x84, 0x20, - 0x83, 0x48, 0x84, 0x20, 0x83, 0x48, 0x84, 0x20, - 0x83, 0x48, 0x84, 0x20, 0x83, 0x48, 0x84, 0x20, - 0x83, 0x48, 0x84, 0x20, 0x85, 0x48, 0x04, 0x20, - 0x87, 0x48, 0x04, 0x20, 0x89, 0x48, 0x04, 0x20, - 0x8B, 0x48, 0x04, 0x20, 0x8D, 0x48, 0x04, 0x20, - 0x8F, 0x48, 0x04, 0x20, 0x91, 0x48, 0x04, 0x20, - 0x93, 0x48, 0x04, 0x20, 0x95, 0x48, 0x04, 0x20, - 0x97, 0x48, 0x04, 0x20, 0x99, 0x48, 0x04, 0x20, - 0x9B, 0x48, 0x04, 0x20, 0x9D, 0x48, 0x04, 0x20, - 0x9F, 0x48, 0x04, 0x20, 0xA1, 0x48, 0x04, 0x20, - 0xA3, 0x48, 0x04, 0x20, 0xA3, 0x48, 0x04, 0x00, - 0x85, 0x5A, 0x04, 0x20, 0x87, 0x5A, 0x04, 0x20, - 0x89, 0x5A, 0x04, 0x20, 0x8B, 0x5A, 0x04, 0x20, - 0x8D, 0x5A, 0x04, 0x20, 0x8F, 0x5A, 0x04, 0x20, - 0x91, 0x5A, 0x04, 0x20, 0x93, 0x5A, 0x04, 0x20, - 0x95, 0x5A, 0x04, 0x20, 0x97, 0x5A, 0x04, 0x20, - 0x99, 0x5A, 0x04, 0x20, 0x9B, 0x5A, 0x04, 0x20, - 0x9D, 0x5A, 0x04, 0x20, 0x9F, 0x5A, 0x04, 0x20, - 0xA1, 0x5A, 0x04, 0x20, 0xA3, 0x5A, 0x04, 0x20, - 0xA3, 0x5A, 0x04, 0x00, 0x85, 0x6C, 0x04, 0x20, - 0x87, 0x6C, 0x04, 0x20, 0x89, 0x6C, 0x04, 0x20, - 0x8B, 0x6C, 0x04, 0x20, 0x8D, 0x6C, 0x04, 0x20, - 0x8F, 0x6C, 0x04, 0x20, 0x91, 0x6C, 0x04, 0x20, - 0x93, 0x6C, 0x04, 0x20, 0x95, 0x6C, 0x04, 0x20, - 0x97, 0x6C, 0x04, 0x20, 0x99, 0x6C, 0x04, 0x20, - 0x9B, 0x6C, 0x04, 0x20, 0x9D, 0x6C, 0x04, 0x20, - 0x9F, 0x6C, 0x04, 0x20, 0xA1, 0x6C, 0x04, 0x20, - 0xA3, 0x6C, 0x04, 0x20, 0xA3, 0x6C, 0x04, 0x00, - 0x86, 0x48, 0x04, 0x20, 0x88, 0x48, 0x04, 0x20, - 0x8A, 0x48, 0x04, 0x20, 0x8C, 0x48, 0x04, 0x20, - 0x8E, 0x48, 0x04, 0x20, 0x90, 0x48, 0x04, 0x20, - 0x92, 0x48, 0x04, 0x20, 0xF7, 0x48, 0x04, 0x20, - 0xF9, 0x48, 0x04, 0x20, 0xFB, 0x48, 0x04, 0x20, - 0xFD, 0x48, 0x04, 0x20, 0xFF, 0x48, 0x04, 0x20, - 0x01, 0x49, 0x04, 0x20, 0x03, 0x49, 0x04, 0x20, - 0x05, 0x49, 0x04, 0x20, 0x07, 0x49, 0x04, 0x20, - 0x07, 0x49, 0x04, 0x00, 0x86, 0x5A, 0x04, 0x20, - 0x88, 0x5A, 0x04, 0x20, 0x8A, 0x5A, 0x04, 0x20, - 0x8C, 0x5A, 0x04, 0x20, 0x8E, 0x5A, 0x04, 0x20, - 0x90, 0x5A, 0x04, 0x20, 0x92, 0x5A, 0x04, 0x20, - 0xF7, 0x5A, 0x04, 0x20, 0xF9, 0x5A, 0x04, 0x20, - 0xFB, 0x5A, 0x04, 0x20, 0xFD, 0x5A, 0x04, 0x20, - 0xFF, 0x5A, 0x04, 0x20, 0x01, 0x5B, 0x04, 0x20, - 0x03, 0x5B, 0x04, 0x20, 0x05, 0x5B, 0x04, 0x20, - 0x07, 0x5B, 0x04, 0x20, 0x07, 0x5B, 0x04, 0x00, - 0x86, 0x6C, 0x04, 0x20, 0x88, 0x6C, 0x04, 0x20, - 0x8A, 0x6C, 0x04, 0x20, 0x8C, 0x6C, 0x04, 0x20, - 0x8E, 0x6C, 0x04, 0x20, 0x90, 0x6C, 0x04, 0x20, - 0x92, 0x6C, 0x04, 0x20, 0xF7, 0x6C, 0x04, 0x20, - 0xF9, 0x6C, 0x04, 0x20, 0xFB, 0x6C, 0x04, 0x20, - 0xFD, 0x6C, 0x04, 0x20, 0xFF, 0x6C, 0x04, 0x20, - 0x01, 0x6D, 0x04, 0x20, 0x03, 0x6D, 0x04, 0x20, - 0x05, 0x6D, 0x04, 0x20, 0x07, 0x6D, 0x04, 0x20, - 0x07, 0x6D, 0x04, 0x00, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, - 0x83, 0x68, 0x84, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x51, 0x09, - 0x10, 0x03, 0x51, 0x09, 0x03, 0x00, 0x09, 0x00, - 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, - 0x04, 0x15, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x28, 0x00, 0x00, + 0x02, 0x20, 0x01, 0x01, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xAD, 0x01, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xAD, 0x01, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xAD, 0x01, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0xFF, 0x03, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, + 0x04, 0x30, 0x00, 0x00, 0x50, 0x03, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x54, 0x20, 0x04, 0x30, 0x01, + 0x3E, 0x02, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x21, 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x14, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x1C, 0x21, 0x04, 0x30, 0x12, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x20, 0x21, 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x40, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, + 0x21, 0x04, 0x30, 0x10, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x5C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x60, 0x21, 0x04, + 0x30, 0x0F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x80, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x84, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x88, 0x21, 0x04, 0x30, + 0x10, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x8C, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x90, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x94, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x98, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x9C, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x0F, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC0, + 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC4, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xC8, 0x21, 0x04, 0x30, 0x10, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xCC, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD0, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD4, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xD8, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xDC, 0x21, 0x04, 0x30, 0x1F, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xE0, + 0x21, 0x04, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA0, 0x20, 0x04, 0x30, + 0xEF, 0xE1, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xA4, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA8, 0x20, + 0x04, 0x30, 0xFE, 0x21, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xC4, 0x20, 0x04, 0x30, 0x47, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x12, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x8A, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0xF9, 0x87, 0x20, 0x83, 0x48, 0x84, 0x20, + 0x83, 0x48, 0x84, 0x20, 0x83, 0x48, 0x84, 0x20, + 0x83, 0x48, 0x84, 0x20, 0x83, 0x48, 0x84, 0x20, + 0x83, 0x48, 0x84, 0x20, 0x83, 0x48, 0x84, 0x20, + 0x83, 0x48, 0x84, 0x20, 0x83, 0x48, 0x84, 0x20, + 0x83, 0x48, 0x84, 0x20, 0x85, 0x48, 0x04, 0x20, + 0x87, 0x48, 0x04, 0x20, 0x89, 0x48, 0x04, 0x20, + 0x8B, 0x48, 0x04, 0x20, 0x8D, 0x48, 0x04, 0x20, + 0x8F, 0x48, 0x04, 0x20, 0x91, 0x48, 0x04, 0x20, + 0x93, 0x48, 0x04, 0x20, 0x95, 0x48, 0x04, 0x20, + 0x97, 0x48, 0x04, 0x20, 0x99, 0x48, 0x04, 0x20, + 0x9B, 0x48, 0x04, 0x20, 0x9D, 0x48, 0x04, 0x20, + 0x9F, 0x48, 0x04, 0x20, 0xA1, 0x48, 0x04, 0x20, + 0xA3, 0x48, 0x04, 0x20, 0xA3, 0x48, 0x04, 0x00, + 0x85, 0x5A, 0x04, 0x20, 0x87, 0x5A, 0x04, 0x20, + 0x89, 0x5A, 0x04, 0x20, 0x8B, 0x5A, 0x04, 0x20, + 0x8D, 0x5A, 0x04, 0x20, 0x8F, 0x5A, 0x04, 0x20, + 0x91, 0x5A, 0x04, 0x20, 0x93, 0x5A, 0x04, 0x20, + 0x95, 0x5A, 0x04, 0x20, 0x97, 0x5A, 0x04, 0x20, + 0x99, 0x5A, 0x04, 0x20, 0x9B, 0x5A, 0x04, 0x20, + 0x9D, 0x5A, 0x04, 0x20, 0x9F, 0x5A, 0x04, 0x20, + 0xA1, 0x5A, 0x04, 0x20, 0xA3, 0x5A, 0x04, 0x20, + 0xA3, 0x5A, 0x04, 0x00, 0x85, 0x6C, 0x04, 0x20, + 0x87, 0x6C, 0x04, 0x20, 0x89, 0x6C, 0x04, 0x20, + 0x8B, 0x6C, 0x04, 0x20, 0x8D, 0x6C, 0x04, 0x20, + 0x8F, 0x6C, 0x04, 0x20, 0x91, 0x6C, 0x04, 0x20, + 0x93, 0x6C, 0x04, 0x20, 0x95, 0x6C, 0x04, 0x20, + 0x97, 0x6C, 0x04, 0x20, 0x99, 0x6C, 0x04, 0x20, + 0x9B, 0x6C, 0x04, 0x20, 0x9D, 0x6C, 0x04, 0x20, + 0x9F, 0x6C, 0x04, 0x20, 0xA1, 0x6C, 0x04, 0x20, + 0xA3, 0x6C, 0x04, 0x20, 0xA3, 0x6C, 0x04, 0x00, + 0x86, 0x48, 0x04, 0x20, 0x88, 0x48, 0x04, 0x20, + 0x8A, 0x48, 0x04, 0x20, 0x8C, 0x48, 0x04, 0x20, + 0x8E, 0x48, 0x04, 0x20, 0x90, 0x48, 0x04, 0x20, + 0x92, 0x48, 0x04, 0x20, 0xF7, 0x48, 0x04, 0x20, + 0xF9, 0x48, 0x04, 0x20, 0xFB, 0x48, 0x04, 0x20, + 0xFD, 0x48, 0x04, 0x20, 0xFF, 0x48, 0x04, 0x20, + 0x01, 0x49, 0x04, 0x20, 0x03, 0x49, 0x04, 0x20, + 0x05, 0x49, 0x04, 0x20, 0x07, 0x49, 0x04, 0x20, + 0x07, 0x49, 0x04, 0x00, 0x86, 0x5A, 0x04, 0x20, + 0x88, 0x5A, 0x04, 0x20, 0x8A, 0x5A, 0x04, 0x20, + 0x8C, 0x5A, 0x04, 0x20, 0x8E, 0x5A, 0x04, 0x20, + 0x90, 0x5A, 0x04, 0x20, 0x92, 0x5A, 0x04, 0x20, + 0xF7, 0x5A, 0x04, 0x20, 0xF9, 0x5A, 0x04, 0x20, + 0xFB, 0x5A, 0x04, 0x20, 0xFD, 0x5A, 0x04, 0x20, + 0xFF, 0x5A, 0x04, 0x20, 0x01, 0x5B, 0x04, 0x20, + 0x03, 0x5B, 0x04, 0x20, 0x05, 0x5B, 0x04, 0x20, + 0x07, 0x5B, 0x04, 0x20, 0x07, 0x5B, 0x04, 0x00, + 0x86, 0x6C, 0x04, 0x20, 0x88, 0x6C, 0x04, 0x20, + 0x8A, 0x6C, 0x04, 0x20, 0x8C, 0x6C, 0x04, 0x20, + 0x8E, 0x6C, 0x04, 0x20, 0x90, 0x6C, 0x04, 0x20, + 0x92, 0x6C, 0x04, 0x20, 0xF7, 0x6C, 0x04, 0x20, + 0xF9, 0x6C, 0x04, 0x20, 0xFB, 0x6C, 0x04, 0x20, + 0xFD, 0x6C, 0x04, 0x20, 0xFF, 0x6C, 0x04, 0x20, + 0x01, 0x6D, 0x04, 0x20, 0x03, 0x6D, 0x04, 0x20, + 0x05, 0x6D, 0x04, 0x20, 0x07, 0x6D, 0x04, 0x20, + 0x07, 0x6D, 0x04, 0x00, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x51, 0x09, + 0x10, 0x03, 0x51, 0x09, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x15, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x28, 0x00, 0x00, }; static unsigned char vfs5011_init_05[] = { /* 2770 B */ - 0x06, 0x6B, 0x06, 0x6A, 0x76, 0xCC, 0x1C, 0xD0, - 0x50, 0xEB, 0x75, 0x10, 0xC8, 0x18, 0x5C, 0x95, - 0x15, 0xAE, 0xA8, 0xC8, 0x10, 0xC0, 0xB0, 0x7A, - 0xFA, 0x21, 0x96, 0xFA, 0x22, 0x92, 0xAE, 0x78, - 0xF8, 0x43, 0x05, 0x6E, 0xB6, 0x66, 0x62, 0xD5, - 0x51, 0xEA, 0xF0, 0xE5, 0x39, 0xE9, 0xA1, 0x19, - 0x9D, 0x26, 0x80, 0xE0, 0x38, 0xE8, 0x1C, 0xCA, - 0x4A, 0xF1, 0xBF, 0xD8, 0x00, 0xD0, 0x34, 0xD9, - 0x5D, 0xB6, 0x00, 0xF2, 0x2A, 0xA2, 0xAA, 0x7C, - 0xFC, 0x47, 0xDD, 0xB8, 0x60, 0xB0, 0xD0, 0xEF, - 0x6F, 0xB4, 0x46, 0x2C, 0xF4, 0x24, 0xBB, 0x7B, - 0x04, 0x20, 0x96, 0xC5, 0x1D, 0xAD, 0x32, 0x32, - 0x4D, 0x69, 0xDF, 0xA0, 0x7A, 0xAA, 0xB6, 0x60, - 0xE0, 0x5B, 0x89, 0xF6, 0x2C, 0xFC, 0x14, 0xC2, - 0x42, 0xF9, 0x23, 0x59, 0x81, 0x51, 0x31, 0xEF, - 0x6B, 0x80, 0x36, 0x52, 0x8A, 0x3A, 0x5A, 0x64, - 0x1B, 0xF7, 0xBD, 0xD4, 0x0C, 0xDC, 0xBC, 0x54, - 0xD0, 0x3B, 0x0D, 0x4C, 0x90, 0x10, 0x70, 0x90, - 0x14, 0xFF, 0x65, 0x29, 0xF5, 0x75, 0x55, 0xB5, - 0x31, 0xDA, 0x88, 0xC5, 0x19, 0x99, 0xF9, 0x39, - 0xB9, 0x5A, 0xD0, 0xBC, 0x64, 0xEC, 0x8C, 0xEC, - 0x6C, 0x8F, 0x05, 0xC9, 0x11, 0x99, 0xF9, 0x19, - 0x99, 0x7A, 0xC2, 0x8E, 0x56, 0xDE, 0xBE, 0x3E, - 0xBE, 0x5D, 0xE3, 0xCF, 0x17, 0x9F, 0xFF, 0x5F, - 0xDF, 0x3C, 0x82, 0x8E, 0x56, 0xDE, 0xBE, 0xFE, - 0x7E, 0x9D, 0x23, 0xCF, 0x17, 0x9F, 0xC9, 0x48, - 0xC8, 0xF6, 0x07, 0x4D, 0x04, 0x98, 0xFB, 0x9A, - 0x37, 0xEF, 0x55, 0x31, 0x60, 0xDA, 0x38, 0xB1, - 0x31, 0xF7, 0xB1, 0xDD, 0x05, 0xB5, 0xE3, 0x62, - 0xE2, 0x19, 0xCE, 0xA2, 0x5F, 0x11, 0x8E, 0x6E, - 0x08, 0xC0, 0x66, 0x2A, 0xF2, 0x4E, 0x24, 0x01, - 0xAA, 0x54, 0x43, 0x01, 0xDA, 0xDB, 0x94, 0x57, - 0xB2, 0x40, 0xDE, 0xAF, 0x87, 0x37, 0x61, 0xE0, - 0x60, 0x16, 0xA2, 0x4F, 0xA7, 0x14, 0x78, 0xB1, - 0x3A, 0x59, 0x78, 0x0C, 0xC5, 0x54, 0x05, 0xC6, - 0x8E, 0x57, 0xEA, 0x3D, 0x25, 0x55, 0x41, 0x46, - 0xDC, 0x0C, 0x71, 0x3F, 0x81, 0x3A, 0xAA, 0x8F, - 0x6B, 0x95, 0x0E, 0x68, 0xAD, 0xED, 0x90, 0xA0, - 0x20, 0xFB, 0x7B, 0x56, 0x8E, 0xAF, 0xFC, 0x3F, - 0x9E, 0x70, 0xC5, 0x98, 0x72, 0xC1, 0x20, 0xD4, - 0x57, 0x05, 0x60, 0x2E, 0x95, 0x35, 0xCC, 0x9F, - 0x02, 0x29, 0xA9, 0x84, 0x5C, 0xDD, 0x8B, 0x48, - 0xDE, 0xA7, 0x17, 0x1E, 0x49, 0xDC, 0x94, 0x57, - 0x75, 0xCC, 0x58, 0x15, 0xFA, 0x49, 0xB5, 0x7F, - 0x77, 0x96, 0xB2, 0xC4, 0x08, 0x3A, 0x72, 0xB2, - 0xA0, 0x29, 0x91, 0x1D, 0xCD, 0x7D, 0x5B, 0x9A, - 0x1A, 0xC1, 0x7B, 0x1D, 0x20, 0x5C, 0x1C, 0x79, - 0x9E, 0x45, 0x42, 0x17, 0xCC, 0xD5, 0x37, 0xFB, - 0x67, 0x34, 0x81, 0x0C, 0xEC, 0x5F, 0xCD, 0x05, - 0x50, 0x87, 0x58, 0xA4, 0x83, 0x03, 0xF2, 0x08, - 0x8B, 0xA2, 0x5C, 0xE5, 0xBC, 0x3E, 0x5D, 0x45, - 0xC6, 0xF5, 0x4D, 0xE3, 0x76, 0x11, 0xD9, 0x1A, - 0x78, 0xFE, 0x1F, 0xC1, 0x73, 0xDF, 0x7F, 0x9F, - 0x1F, 0x4C, 0x22, 0xDC, 0x2D, 0x1D, 0xEF, 0x45, - 0xE6, 0x31, 0x8E, 0x70, 0xC2, 0x50, 0xA2, 0x38, - 0xEE, 0xD5, 0x6B, 0x07, 0xC2, 0x82, 0x4A, 0x89, - 0xAB, 0xBA, 0x54, 0x5D, 0x7C, 0xEB, 0x96, 0xA6, - 0x26, 0xFD, 0x7D, 0x50, 0x88, 0xA9, 0xFE, 0x3D, - 0x3F, 0xED, 0x7F, 0x91, 0x00, 0x95, 0x50, 0xB1, - 0x31, 0x4B, 0xC6, 0xA9, 0xF0, 0x72, 0x11, 0xDD, - 0x74, 0x2D, 0xB3, 0xCD, 0x87, 0x5D, 0x39, 0x19, - 0x91, 0x4A, 0x5E, 0x92, 0xDE, 0xDF, 0x89, 0x4A, - 0x0B, 0xEC, 0x59, 0x8D, 0x5E, 0x2E, 0x6E, 0xAE, - 0xE6, 0x31, 0x15, 0x62, 0xE7, 0xFD, 0x36, 0x3C, - 0x25, 0x6C, 0xB1, 0xF5, 0x08, 0x02, 0x42, 0x9F, - 0xEF, 0x34, 0xB4, 0x99, 0x41, 0xFD, 0x88, 0x09, - 0xBE, 0x66, 0xE7, 0x69, 0x9D, 0x6A, 0xE8, 0x27, - 0x95, 0x4A, 0xDB, 0x95, 0x49, 0xDF, 0x85, 0x67, - 0xC7, 0x3D, 0xAA, 0xE4, 0x78, 0xED, 0x90, 0xA0, - 0x79, 0xE6, 0xC2, 0xAA, 0x57, 0x65, 0x01, 0xE7, - 0x6C, 0x2E, 0x08, 0xF4, 0x58, 0x7A, 0x5E, 0xB9, - 0xA3, 0xF0, 0xC6, 0x2B, 0xD2, 0xE0, 0xC4, 0x21, - 0xBC, 0x97, 0x78, 0x20, 0x4A, 0xFE, 0xB9, 0xDB, - 0x5F, 0xA1, 0xB5, 0x9D, 0x4F, 0xE4, 0x2E, 0x4E, - 0x6E, 0xC1, 0xD5, 0xFD, 0x03, 0x09, 0xC3, 0xA3, - 0x82, 0x78, 0x6C, 0x44, 0xB9, 0x14, 0x84, 0x44, - 0xC4, 0x1F, 0x9F, 0xB2, 0x6A, 0x1A, 0x5A, 0x9A, - 0x16, 0xC4, 0xF3, 0xA2, 0x79, 0xF8, 0xA2, 0x61, - 0xB0, 0x50, 0xE5, 0xFB, 0x00, 0x3A, 0x9A, 0x7A, - 0xFA, 0x69, 0x9A, 0x94, 0x6F, 0x56, 0xB6, 0x01, - 0x91, 0xCA, 0x0B, 0x76, 0x2E, 0xF8, 0x88, 0x88, - 0x28, 0xF3, 0x77, 0x38, 0x61, 0xA1, 0xA7, 0x47, - 0xB6, 0x5B, 0xEE, 0xE2, 0x7E, 0xEE, 0xBE, 0xDF, - 0x5B, 0xE1, 0x6B, 0x04, 0xEC, 0xDD, 0xB9, 0x49, - 0x78, 0xE2, 0xEC, 0x87, 0x49, 0xD1, 0xB9, 0xFB, - 0x50, 0x94, 0x15, 0x71, 0xD5, 0xE4, 0xBA, 0x79, - 0xF5, 0x64, 0x5A, 0xDE, 0x36, 0x35, 0x75, 0x55, - 0xDD, 0x06, 0x78, 0x51, 0xA8, 0x2F, 0x4C, 0x87, - 0x9B, 0x56, 0xB9, 0xDF, 0xB5, 0xC9, 0x57, 0x81, - 0xBA, 0x6B, 0x0F, 0xAF, 0x8A, 0x2C, 0xE1, 0x2D, - 0xBB, 0xDC, 0x6A, 0x20, 0xB4, 0x0C, 0xCE, 0xAE, - 0x2E, 0x50, 0x50, 0x1C, 0x06, 0x93, 0xF7, 0xF7, - 0xE7, 0x48, 0x52, 0x57, 0xA9, 0x50, 0x14, 0x71, - 0xE1, 0x3A, 0x0D, 0x53, 0x88, 0xBA, 0xF2, 0x20, - 0x40, 0x93, 0x25, 0xEB, 0x93, 0xB7, 0x6F, 0xA8, - 0xE8, 0x13, 0xA5, 0x01, 0xDF, 0xFD, 0x86, 0x1B, - 0x31, 0x41, 0x3D, 0xC8, 0x82, 0x59, 0x11, 0x34, - 0x1D, 0xE6, 0x98, 0xB1, 0x65, 0xDE, 0x3E, 0x52, - 0xD3, 0xA8, 0xBA, 0xF6, 0x0B, 0xA8, 0xC8, 0xA5, - 0x26, 0xF1, 0x4C, 0x85, 0x4F, 0xFF, 0x57, 0xD2, - 0x92, 0xD9, 0x1B, 0xEB, 0xAA, 0x3C, 0x15, 0xC2, - 0x5F, 0x74, 0x02, 0x4E, 0x96, 0xEE, 0x88, 0xFA, - 0x61, 0xE7, 0xFC, 0x92, 0x80, 0x8B, 0x52, 0xA0, - 0xC5, 0xB8, 0x2E, 0x5F, 0x77, 0xC7, 0xA7, 0x67, - 0x55, 0x2E, 0x99, 0x27, 0xFD, 0x47, 0x85, 0x47, - 0xEF, 0x34, 0x5F, 0x22, 0x7A, 0x60, 0x11, 0x71, - 0x5D, 0xA6, 0xC0, 0x06, 0xFE, 0x6B, 0x04, 0xC4, - 0xEC, 0xB5, 0x0F, 0x68, 0x15, 0xAB, 0xCB, 0x2E, - 0xE7, 0x3C, 0x86, 0xC1, 0x3C, 0x82, 0xE2, 0x3F, - 0x4F, 0x94, 0x2E, 0x48, 0xF5, 0xE8, 0xA8, 0xA0, - 0x65, 0x38, 0x54, 0xC7, 0x1F, 0xAF, 0x62, 0xA1, - 0x04, 0x36, 0x7F, 0xE1, 0x3B, 0xAD, 0x2F, 0xED, - 0x4A, 0x66, 0x6E, 0x13, 0x43, 0xC1, 0x1D, 0x55, - 0x4D, 0xD4, 0xDE, 0xFB, 0x81, 0x33, 0x59, 0x95, - 0x1E, 0x7C, 0x8F, 0x41, 0xDB, 0x4E, 0xE6, 0x63, - 0x25, 0x2E, 0x67, 0xA6, 0x7D, 0x28, 0xAE, 0x91, - 0xC3, 0x1A, 0x8A, 0x24, 0xFE, 0x69, 0xDE, 0xA2, - 0x33, 0x00, 0x84, 0x44, 0x62, 0x2A, 0x08, 0x64, - 0x5B, 0x02, 0xB6, 0xD0, 0x04, 0xBD, 0x44, 0xC1, - 0xC3, 0x5A, 0xC9, 0x6D, 0xF0, 0xC6, 0x61, 0x5E, - 0xDE, 0x05, 0xBF, 0xD9, 0xE4, 0x4A, 0x2A, 0xBC, - 0x86, 0xA1, 0x1B, 0x6D, 0xD0, 0x7E, 0x1E, 0xD2, - 0x69, 0x7F, 0xC3, 0xA3, 0x31, 0x41, 0x8A, 0xD9, - 0xF0, 0x6E, 0xDE, 0x5C, 0x7B, 0xCB, 0xA7, 0x4D, - 0xE8, 0x2E, 0x98, 0x2C, 0xB1, 0x0D, 0x23, 0x43, - 0x1D, 0x45, 0x2A, 0x03, 0x1D, 0x5F, 0xC0, 0x00, - 0x80, 0x5B, 0xDB, 0xF6, 0x2E, 0x3C, 0xFC, 0x18, - 0x49, 0xAF, 0x1A, 0x97, 0x70, 0xC3, 0x92, 0x65, - 0xE6, 0x1C, 0x90, 0xFF, 0x66, 0xE8, 0x8B, 0x8B, - 0x2B, 0xF0, 0xC4, 0x8C, 0x5A, 0x58, 0x1A, 0x53, - 0x11, 0xC9, 0x57, 0xDB, 0xB8, 0x18, 0xF8, 0xF4, - 0x65, 0x6E, 0x14, 0x68, 0x70, 0x7B, 0x3B, 0x1B, - 0x93, 0x48, 0x3E, 0x72, 0xAA, 0x36, 0xDC, 0x94, - 0xF0, 0xFA, 0x0D, 0x62, 0x08, 0x9A, 0x70, 0x72, - 0xF1, 0x0F, 0x58, 0x74, 0xAF, 0x9F, 0x33, 0xE2, - 0x82, 0x95, 0x33, 0x8F, 0xEC, 0x4C, 0xEC, 0x97, - 0x37, 0x0C, 0xB2, 0xDE, 0x1B, 0x5B, 0x0D, 0x8C, - 0x0C, 0x96, 0x16, 0x79, 0xF0, 0x72, 0x11, 0x09, - 0x8D, 0x27, 0xA6, 0xC9, 0x83, 0x1E, 0x62, 0x62, - 0xC2, 0x19, 0x2D, 0x56, 0x80, 0xF2, 0x8F, 0x19, - 0xB0, 0x62, 0x56, 0xF2, 0xD2, 0xF0, 0xBD, 0x61, - 0xAA, 0xBD, 0xCB, 0x67, 0x4B, 0x39, 0x04, 0x92, - 0x59, 0x1B, 0x3F, 0x3E, 0xFA, 0xCD, 0x81, 0x37, - 0x96, 0x74, 0xC1, 0x48, 0xCC, 0x59, 0x81, 0x45, - 0x67, 0xD7, 0x43, 0xA3, 0xC1, 0xF3, 0xB9, 0x7A, - 0x78, 0x8B, 0x3D, 0xB1, 0x61, 0xD1, 0xF7, 0x36, - 0xB6, 0x6D, 0xD7, 0xB1, 0x8C, 0xA6, 0xE6, 0xAE, - 0x8B, 0xB0, 0x0E, 0x62, 0x57, 0xED, 0x5F, 0xBB, - 0x3B, 0x52, 0xFE, 0x86, 0xFC, 0x21, 0x63, 0x71, - 0xEC, 0x61, 0x65, 0xC2, 0xE2, 0x85, 0x4E, 0x8F, - 0xD2, 0x02, 0x09, 0x67, 0x17, 0x89, 0x39, 0x99, - 0xED, 0xFB, 0x4B, 0xAC, 0xDE, 0x8B, 0x8B, 0x63, - 0xC9, 0x34, 0x3A, 0x52, 0x02, 0xE7, 0x25, 0xCE, - 0x6C, 0x25, 0xB8, 0xC8, 0xD2, 0x79, 0x4F, 0xEF, - 0xF6, 0xED, 0x3B, 0x9B, 0x83, 0xF1, 0xCA, 0x5C, - 0x4E, 0xFE, 0x54, 0xD8, 0x08, 0xB8, 0x00, 0xC4, - 0xE6, 0x2A, 0x92, 0x3C, 0xF9, 0x1F, 0xDD, 0xD7, - 0xAF, 0xD3, 0xC9, 0x2B, 0x75, 0xC5, 0xA5, 0x44, - 0xFD, 0x25, 0x21, 0x8E, 0xA9, 0xEF, 0xA4, 0x30, - 0xA6, 0x91, 0x22, 0xAB, 0x27, 0xB2, 0x1A, 0xDE, - 0xFC, 0x4B, 0xDF, 0x3F, 0x5D, 0x6F, 0x25, 0xE6, - 0xE4, 0x17, 0xA1, 0x2D, 0xFD, 0x4D, 0x6B, 0xAA, - 0x2A, 0xF1, 0x4B, 0x2D, 0x10, 0x32, 0x72, 0x3A, - 0x1F, 0x24, 0x9A, 0xF6, 0xE6, 0x52, 0x8F, 0x4D, - 0x6F, 0xD8, 0x4C, 0x88, 0x7A, 0x08, 0x74, 0xE2, - 0xC0, 0xD1, 0x6F, 0xE6, 0x67, 0xFF, 0x2E, 0xD7, - 0x54, 0x07, 0xE4, 0x20, 0xFC, 0x8E, 0x4E, 0x8E, - 0xCC, 0x4D, 0xAD, 0x73, 0xC1, 0x6D, 0xAF, 0x45, - 0xE7, 0xDC, 0x62, 0x0E, 0x04, 0x90, 0xF0, 0xC0, - 0x60, 0xBB, 0xCF, 0xBE, 0x30, 0x0C, 0xF0, 0x92, - 0x3F, 0xF8, 0xF3, 0x9D, 0x20, 0xC7, 0x8F, 0x9D, - 0x39, 0xE2, 0x32, 0x7D, 0x9B, 0xC9, 0xB4, 0x23, - 0x1F, 0xAA, 0x79, 0x5B, 0xA6, 0xEE, 0x8A, 0xE8, - 0x07, 0xFE, 0xE4, 0x92, 0xC2, 0x48, 0xA0, 0x68, - 0x08, 0xDB, 0x6D, 0x89, 0xF4, 0xA4, 0xCC, 0x0C, - 0x14, 0xCB, 0xF5, 0xCC, 0xB6, 0x6F, 0x2D, 0x0D, - 0x85, 0x5E, 0x40, 0x28, 0x52, 0xF8, 0xCF, 0x59, - 0xA3, 0x85, 0x35, 0x5A, 0x82, 0x32, 0x52, 0x33, - 0xF0, 0x28, 0x2F, 0x01, 0xDA, 0xD3, 0xE4, 0x01, - 0x3D, 0xC1, 0xAF, 0xC7, 0xDD, 0x70, 0x47, 0x0B, - 0x87, 0x41, 0x07, 0xCA, 0x57, 0xE4, 0x55, 0xD1, - 0x52, 0x50, 0x81, 0x08, 0x6A, 0xFD, 0x80, 0xB0, - 0x30, 0xEB, 0x6B, 0x46, 0x9E, 0xEF, 0xB8, 0x7B, - 0x5A, 0xBA, 0x0F, 0xDF, 0xC5, 0xF7, 0x55, 0x6B, - 0xFD, 0x6E, 0xDE, 0xD4, 0x1E, 0x85, 0x5D, 0x97, - 0xF5, 0x22, 0xB0, 0x0E, 0xDD, 0x6A, 0xA8, 0x63, - 0xE5, 0xAC, 0x11, 0x78, 0x70, 0x6A, 0xCA, 0x9D, - 0x37, 0xA5, 0xB1, 0x91, 0x61, 0x33, 0x1F, 0xFA, - 0x58, 0x88, 0x37, 0xA9, 0x7A, 0xC2, 0x50, 0xDC, - 0x7B, 0x82, 0x78, 0x32, 0xE6, 0x44, 0x39, 0x09, - 0x89, 0x52, 0xE8, 0x8E, 0xB3, 0x87, 0xC7, 0x0B, - 0x89, 0x4F, 0x09, 0xDD, 0x0F, 0x6D, 0x01, 0xE9, - 0xCB, 0x1B, 0xAA, 0x44, 0x97, 0x23, 0x99, 0xF3, - 0xD4, 0x27, 0xD7, 0x19, 0x8D, 0x15, 0x57, 0x9C, - 0x15, 0x2C, 0x96, 0xDE, 0xF4, 0x4F, 0x27, 0x15, - 0xD9, 0x25, 0x71, 0x51, 0xAC, 0x3E, 0x12, 0xF4, - 0x78, 0xB1, 0x1A, 0x86, 0x52, 0xE0, 0x9D, 0xAD, - 0x95, 0x44, 0x50, 0x30, 0xC0, 0xA2, 0xC9, 0x0E, - 0x0C, 0xDC, 0x6F, 0xD3, 0xA1, 0xD1, 0x36, 0xDC, - 0x40, 0x39, 0xC3, 0x87, 0x7D, 0xC6, 0xAF, 0x8D, - 0x01, 0xFE, 0xBA, 0xDD, 0x0D, 0x4F, 0x63, 0x84, - 0xE6, 0x71, 0xE2, 0xAC, 0x38, 0xAE, 0xC2, 0x10, - 0x8D, 0xA6, 0x1C, 0x72, 0xB7, 0xF7, 0x9B, 0x59, - 0xC4, 0xEF, 0x6F, 0x42, 0x9A, 0x0B, 0x5D, 0x9E, - 0x9C, 0x65, 0xD3, 0xFE, 0x11, 0xA2, 0x40, 0x98, - 0x4F, 0xA5, 0x21, 0x4E, 0x3A, 0xF2, 0x37, 0xCA, - 0x6F, 0x2C, 0x98, 0x56, 0xE7, 0x75, 0xB9, 0xA3, - 0xAB, 0x4A, 0x74, 0x10, 0x28, 0x90, 0xF0, 0xB8, - 0x9B, 0xA0, 0x1E, 0x72, 0x32, 0x80, 0x62, 0x81, - 0x04, 0x7D, 0xA2, 0xEC, 0xD4, 0x6C, 0x0C, 0x64, - 0xE6, 0x9F, 0x33, 0x08, 0x86, 0x5C, 0xC1, 0xA0, - 0x65, 0xBD, 0xBA, 0x92, 0x49, 0x40, 0x44, 0x21, - 0x0A, 0xF6, 0x5D, 0xC1, 0x19, 0xA9, 0xC9, 0xA8, - 0x6B, 0xB3, 0xC4, 0xEA, 0x31, 0x48, 0x7C, 0x19, - 0x33, 0xCF, 0xA1, 0xCF, 0xC5, 0x68, 0x5F, 0xC9, - 0x34, 0x11, 0xE1, 0x7B, 0x5C, 0xEC, 0xBA, 0x3B, - 0xBB, 0x6C, 0xD0, 0x9D, 0x73, 0xC0, 0xDC, 0xF0, - 0xC8, 0x11, 0x26, 0x74, 0xAF, 0xAD, 0xE6, 0x05, - 0x0D, 0x3E, 0x48, 0x9F, 0x57, 0x07, 0x6F, 0xAF, - 0x87, 0x5E, 0x4A, 0xEC, 0x6C, 0x39, 0xFE, 0x19, - 0x84, 0xAF, 0x2F, 0x02, 0xDA, 0x76, 0xCE, 0x89, - 0x9B, 0x44, 0xD3, 0xF9, 0x22, 0x8F, 0x1F, 0x72, - 0xF0, 0x0E, 0x0E, 0x47, 0xB2, 0x08, 0x75, 0x45, - 0xC5, 0x1E, 0x9E, 0xB3, 0x6B, 0x76, 0x14, 0xB1, - 0x31, 0xEA, 0x50, 0x3E, 0xFB, 0xBB, 0xED, 0x6C, - 0xEC, 0x17, 0x03, 0x4F, 0xB2, 0xE0, 0xA7, 0x56, - 0xED, 0x35, 0x1B, 0x74, 0x0C, 0x34, 0x15, 0x57, - 0x9E, 0x44, 0x50, 0x75, 0xAD, 0x36, 0xF4, 0xD1, - 0xB1, 0x4D, 0x4A, 0x11, 0xCA, 0xF8, 0x9A, 0x5F, - 0x2D, 0xF4, 0x45, 0xFB, 0x21, 0x97, 0x35, 0xF7, - 0x7F, 0x4C, 0xF9, 0x07, 0xDD, 0x69, 0x9B, 0x15, - 0x91, 0xC8, 0x30, 0x59, 0x23, 0xDD, 0xBF, 0xDF, - 0xF7, 0x6D, 0x79, 0x5B, 0x80, 0x92, 0xF0, 0x39, - 0x4B, 0xDE, 0x6F, 0xA1, 0x32, 0xA4, 0x66, 0xE8, - 0x61, 0x78, 0x80, 0xE4, 0xEE, 0x10, 0x76, 0x66, - 0x36, 0x99, 0xEF, 0x43, 0xEF, 0x9D, 0xB6, 0x51, - 0x03, 0x93, 0x0D, 0xCB, 0xCF, 0xAF, 0x1E, 0xFF, - 0xAD, 0x3D, 0xAF, 0xDE, 0xF6, 0x46, 0x10, 0x91, - 0x11, 0x07, 0xB3, 0xD3, 0x06, 0xAD, 0xAE, 0xD3, - 0x55, 0xB9, 0x3B, 0x26, 0xD5, 0x31, 0x61, 0xE5, - 0xA5, 0x65, 0x97, 0xBB, 0xE2, 0x13, 0x74, 0xD0, - 0x56, 0xA6, 0xA3, 0x1D, 0xC7, 0x77, 0x0C, 0x0E, - 0x12, 0xF1, 0xEA, 0x8B, 0x78, 0x73, 0xF1, 0x3D, - 0xBD, 0xB4, 0x0E, 0x63, 0x90, 0xEC, 0x66, 0x0C, - 0x56, 0x27, 0xC6, 0x31, 0x07, 0x6A, 0x00, 0x6D, - 0xE0, 0x86, 0x34, 0x7D, 0xC5, 0x5D, 0xF0, 0x32, - 0x0F, 0xD2, 0x68, 0x09, 0x91, 0xC0, 0xE1, 0x26, - 0xC2, 0x15, 0xB8, 0x16, 0x1C, 0xAE, 0xCE, 0x15, - 0x23, 0x28, 0x44, 0xE8, 0xE0, 0x81, 0x81, 0xDD, - 0xA3, 0x55, 0xEE, 0x10, 0xC4, 0x74, 0x3F, 0x44, - 0x54, 0x15, 0x63, 0x9F, 0xD6, 0x06, 0xFC, 0x1E, - 0x1C, 0xCB, 0x7C, 0x3B, 0x2F, 0x1F, 0xF5, 0xF5, - 0xF5, 0xAF, 0x79, 0x9F, 0x65, 0x82, 0x79, 0x5B, - 0xC6, 0xED, 0x76, 0x17, 0xD2, 0x92, 0xFE, 0x3C, - 0xA1, 0x8A, 0x0A, 0x07, 0xDF, 0xAF, 0xEF, 0x2F, - 0xEE, 0x7C, 0xC9, 0x04, 0x94, 0x27, 0x66, 0xE1, - 0x62, 0xEB, 0xFD, 0x90, 0x1A, 0xC8, 0x29, 0x29, - 0x89, 0x52, 0x76, 0x38, 0x60, 0x10, 0x50, 0x90, - 0xB0, 0xF2, 0x64, 0x9A, 0x20, 0x10, 0xB0, 0x50, - 0xD0, 0x89, 0x1B, 0xF6, 0xEE, 0x7E, 0x1E, 0x8E, - 0x86, 0x7D, 0x49, 0x41, 0x18, 0xCD, 0x8F, 0x6A, - 0xD7, 0x06, 0xA6, 0x80, 0x54, 0x5C, 0x16, 0x6F, - 0xEE, 0x39, 0x84, 0x08, 0xB1, 0x01, 0xB3, 0xD3, - 0x53, 0x59, 0xD8, 0xB7, 0xAF, 0x3F, 0x5F, 0x5D, - 0xFF, 0xA4, 0xD2, 0x9E, 0x46, 0xA6, 0x0A, 0xEA, - 0xB8, 0x7E, 0xC6, 0x68, 0xD2, 0xE2, 0x24, 0xF9, - 0x5C, 0x25, 0x33, 0xA3, 0xB9, 0x28, 0x48, 0x48, - 0xE8, 0x33, 0x77, 0x39, 0x6B, 0x2B, 0xC3, 0x42, - 0x62, 0x46, 0xE0, 0x0B, 0xCC, 0x8C, 0x2C, 0xCC, - 0x4C, 0xDC, 0xD1, 0x3F, 0xC5, 0xF9, 0x1B, 0xB7, - 0x37, 0x2E, 0x54, 0x3C, 0x33, 0xA8, 0x17, 0x86, - 0x4C, 0x94, 0xC2, 0x48, 0x83, 0x23, 0x63, 0xA3, - 0xA1, 0x5F, 0xED, 0x61, 0xB1, 0x01, 0x77, 0xBD, - 0x3A, 0xED, 0x55, 0xF8, 0x1B, 0xA8, 0xB4, 0x9C, - 0x10, 0x81, 0x4B, 0x1E, 0x06, 0x96, 0xF6, 0xE4, - 0x40, 0x1D, 0x6B, 0x27, 0xFF, 0xDF, 0x22, 0xF2, - 0xD2, 0x90, 0x06, 0xF8, 0x44, 0x72, 0xD2, 0x32, - 0xB2, 0x9B, 0x09, 0xE4, 0xFC, 0x6C, 0x0C, 0x4C, - 0x33, 0xF8, 0xBC, 0xB4, 0xED, 0x9D, 0xDD, 0x1D, - 0x4F, 0xF0, 0xC0, 0x6C, 0x94, 0x24, 0x8C, 0x40, - 0x68, 0x90, 0xD4, 0xB4, 0x6C, 0x6E, 0x02, 0xC3, - 0x81, 0x96, 0x22, 0xCE, 0xAD, 0x0C, 0x9C, 0xE7, - 0x47, 0x4E, 0xF4, 0x98, 0x82, 0x3E, 0x5F, 0x7D, - 0x9F, 0xC5, 0xF3, 0x53, 0x9A, 0xFA, 0x56, 0xB6, - 0xD3, 0xE0, 0xA9, 0x4D, 0xA6, 0x3B, 0x51, 0x19, - 0x91, 0xE7, 0x52, 0xDE, 0x0E, 0xBE, 0xC3, 0xF3, - 0x73, 0xA8, 0x12, 0x74, 0x49, 0xAD, 0xED, 0xAB, - 0xE6, 0xC2, 0xFC, 0xD5, 0xED, 0x55, 0x35, 0xE3, - 0x19, 0x3D, 0x4D, 0xC1, 0xE6, 0x56, 0x00, 0x81, - 0x01, 0x7B, 0x86, 0xE9, 0x80, 0x7C, 0x1F, 0x12, - 0x90, 0x2E, 0x70, 0x38, 0x51, 0xAF, 0xCC, 0x2C, - 0x86, 0xFD, 0xEA, 0xCB, 0x10, 0x6D, 0x0F, 0xAA, - 0xCD, 0x32, 0x35, 0x09, 0xD2, 0x42, 0x18, 0x78, - 0x3A, 0x22, 0x84, 0x49, 0xDE, 0x6D, 0x01, 0xC3, - 0x6A, 0xB2, 0x2D, 0x52, 0xA3, 0x30, 0x79, 0x8A, - 0xEF, 0xD1, 0x43, 0x9E, 0x14, 0xA7, 0xF7, 0x0D, - 0x2D, 0x34, 0x41, 0x3D, 0x44, 0xA5, 0xC6, 0xE3, - 0x87, 0x78, 0xC2, 0xA7, 0x4F, 0xC5, 0x05, 0xF7, - 0xB4, 0x7F, 0xE2, 0x17, 0xE6, 0x55, 0x1C, 0xCF, - 0xC4, 0x2C, 0xFC, 0x09, 0x25, 0x38, 0x5B, 0x29, - 0x09, 0x77, 0xED, 0xCD, 0xF0, 0x73, 0x3B, 0x5A, - 0x89, 0x51, 0x56, 0x6E, 0xB5, 0xC7, 0x64, 0x80, - 0x65, 0x5C, 0xCE, 0x13, 0x9D, 0x2E, 0x7E, 0x84, - 0xA4, 0xDE, 0x3D, 0x52, 0xB8, 0xCB, 0x8F, 0x82, - 0x01, 0x3F, 0x6A, 0x22, 0x4B, 0xA3, 0xC0, 0x30, - 0x8A, 0xF1, 0xE6, 0xDD, 0x06, 0x7B, 0x18, 0xBD, - 0xD8, 0x27, 0x20, 0x16, 0xCD, 0x4D, 0x17, 0x77, - 0x56, 0xD4, 0x61, 0xC0, 0x1B, 0x0E, 0x8A, 0x6E, - 0x5F, 0xD8, 0x6D, 0x31, 0xD3, 0xC3, 0x02, 0x99, - 0x1A, 0x0C, 0xB9, 0x70, 0x4B, 0xDF, 0x8F, 0x65, - 0x45, 0x83, 0xC5, 0xA9, 0x71, 0xC1, 0xBB, 0x7A, - 0xFA, 0x21, 0x97, 0xFB, 0x23, 0x93, 0x7F, 0xB2, - 0x30, 0x8B, 0xA9, 0xD3, 0x0B, 0xDB, 0xA6, 0x66, - 0xEC, 0x37, 0x03, 0x6B, 0x30, 0x84, 0x44, 0x97, - 0x15, 0xAE, 0x19, 0x75, 0xAD, 0x1D, 0x01, 0xD7, - 0x57, 0xEC, 0x26, 0x5C, 0x84, 0x54, 0x9C, 0x4A, - 0xCA, 0x71, 0x4F, 0x35, 0xED, 0x3D, 0xD5, 0x03, - 0x83, 0x38, 0x22, 0x58, 0x80, 0x50, 0x30, 0xF0, - 0x70, 0xAB, 0x1D, 0x71, 0xA9, 0x19, 0x79, 0xB9, - 0x39, 0xE2, 0x54, 0x38, 0xE0, 0x50, 0x30, 0xF0, - 0x70, 0xAB, 0x1D, 0x71, 0xA9, 0x19, 0x79, 0xB9, - 0x39, 0xE2, 0x54, 0x38, 0xE0, 0x50, 0x30, 0xF0, - 0x70, 0xAB, 0x1D, 0x71, 0xA9, 0x19, 0x79, 0xB9, - 0x39, 0xE2, 0x7C, 0x19, 0xC1, 0x11, 0x55, 0x9C, - 0x1C, 0xA7, 0x03, 0x5F, 0x87, 0x37, 0x97, 0x41, - 0xC1, 0x7A, 0x7C, 0x10, 0xC8, 0x78, 0x64, 0xA3, - 0x23, 0x98, 0x82, 0xE3, 0x39, 0xE9, 0x79, 0xBE, - 0x3E, 0x85, 0xC3, 0xA2, 0x78, 0xA8, 0xB8, 0x76, - 0xF4, 0x4F, 0xF1, 0x92, 0x48, 0x98, 0x44, 0x83, - 0x03, 0xB8, 0x86, 0xF9, 0x23, 0xF3, 0x3F, 0xEA, - 0x68, 0xD3, 0x53, 0x7E, 0xA6, 0x97, 0x45, 0x80, - 0xB1, 0xDA, 0x69, 0xA7, 0xDF, 0x6C, 0x9D, 0xEC, - 0x69, 0x10, 0xED, 0x81, 0xDB, 0x02, 0x62, 0xC7, - 0x46, 0x9D, 0x0E, 0x60, 0xB8, 0x2D, 0x49, 0x89, - 0xA8, 0xC0, 0x73, 0xAE, 0xC2, 0x77, 0xF2, 0xA3, - 0x04, 0xC2, 0x84, 0xE8, 0x30, 0x80, 0xD6, 0x57, - 0xD7, 0x3D, 0x3E, 0x57, 0xAE, 0xA8, 0xCD, 0x24, - 0x77, 0xB1, 0xF7, 0x9B, 0x43, 0xF3, 0xA5, 0x24, - 0xA4, 0xCE, 0xC0, 0xA9, 0x40, 0x4B, 0x2E, 0xCF, - 0xF3, 0x2D, 0x1A, 0xCC, 0x11, 0x30, 0xE7, 0x22, - 0x03, 0x61, 0xD2, 0x17, 0x16, 0x24, 0x2D, 0xFD, - 0x54, 0xAC, 0xA3, 0x56, 0x93, 0xD3, 0x85, 0x04, - 0x84, 0x6E, 0x6D, 0x04, 0xFD, 0xF0, 0x95, 0x7C, - 0x6F, 0xA9, 0xEF, 0x83, 0x5B, 0xEB, 0x8B, 0x4B, - 0xCB, 0x10, 0xA6, 0xCA, 0x12, 0xA2, 0xC2, 0x02, - 0x82, 0x59, 0xEE, 0x82, 0x5E, 0xEE, 0x76, 0xA0, - 0x22, 0x99, + 0x06, 0x6B, 0x06, 0x6A, 0x76, 0xCC, 0x1C, 0xD0, + 0x50, 0xEB, 0x75, 0x10, 0xC8, 0x18, 0x5C, 0x95, + 0x15, 0xAE, 0xA8, 0xC8, 0x10, 0xC0, 0xB0, 0x7A, + 0xFA, 0x21, 0x96, 0xFA, 0x22, 0x92, 0xAE, 0x78, + 0xF8, 0x43, 0x05, 0x6E, 0xB6, 0x66, 0x62, 0xD5, + 0x51, 0xEA, 0xF0, 0xE5, 0x39, 0xE9, 0xA1, 0x19, + 0x9D, 0x26, 0x80, 0xE0, 0x38, 0xE8, 0x1C, 0xCA, + 0x4A, 0xF1, 0xBF, 0xD8, 0x00, 0xD0, 0x34, 0xD9, + 0x5D, 0xB6, 0x00, 0xF2, 0x2A, 0xA2, 0xAA, 0x7C, + 0xFC, 0x47, 0xDD, 0xB8, 0x60, 0xB0, 0xD0, 0xEF, + 0x6F, 0xB4, 0x46, 0x2C, 0xF4, 0x24, 0xBB, 0x7B, + 0x04, 0x20, 0x96, 0xC5, 0x1D, 0xAD, 0x32, 0x32, + 0x4D, 0x69, 0xDF, 0xA0, 0x7A, 0xAA, 0xB6, 0x60, + 0xE0, 0x5B, 0x89, 0xF6, 0x2C, 0xFC, 0x14, 0xC2, + 0x42, 0xF9, 0x23, 0x59, 0x81, 0x51, 0x31, 0xEF, + 0x6B, 0x80, 0x36, 0x52, 0x8A, 0x3A, 0x5A, 0x64, + 0x1B, 0xF7, 0xBD, 0xD4, 0x0C, 0xDC, 0xBC, 0x54, + 0xD0, 0x3B, 0x0D, 0x4C, 0x90, 0x10, 0x70, 0x90, + 0x14, 0xFF, 0x65, 0x29, 0xF5, 0x75, 0x55, 0xB5, + 0x31, 0xDA, 0x88, 0xC5, 0x19, 0x99, 0xF9, 0x39, + 0xB9, 0x5A, 0xD0, 0xBC, 0x64, 0xEC, 0x8C, 0xEC, + 0x6C, 0x8F, 0x05, 0xC9, 0x11, 0x99, 0xF9, 0x19, + 0x99, 0x7A, 0xC2, 0x8E, 0x56, 0xDE, 0xBE, 0x3E, + 0xBE, 0x5D, 0xE3, 0xCF, 0x17, 0x9F, 0xFF, 0x5F, + 0xDF, 0x3C, 0x82, 0x8E, 0x56, 0xDE, 0xBE, 0xFE, + 0x7E, 0x9D, 0x23, 0xCF, 0x17, 0x9F, 0xC9, 0x48, + 0xC8, 0xF6, 0x07, 0x4D, 0x04, 0x98, 0xFB, 0x9A, + 0x37, 0xEF, 0x55, 0x31, 0x60, 0xDA, 0x38, 0xB1, + 0x31, 0xF7, 0xB1, 0xDD, 0x05, 0xB5, 0xE3, 0x62, + 0xE2, 0x19, 0xCE, 0xA2, 0x5F, 0x11, 0x8E, 0x6E, + 0x08, 0xC0, 0x66, 0x2A, 0xF2, 0x4E, 0x24, 0x01, + 0xAA, 0x54, 0x43, 0x01, 0xDA, 0xDB, 0x94, 0x57, + 0xB2, 0x40, 0xDE, 0xAF, 0x87, 0x37, 0x61, 0xE0, + 0x60, 0x16, 0xA2, 0x4F, 0xA7, 0x14, 0x78, 0xB1, + 0x3A, 0x59, 0x78, 0x0C, 0xC5, 0x54, 0x05, 0xC6, + 0x8E, 0x57, 0xEA, 0x3D, 0x25, 0x55, 0x41, 0x46, + 0xDC, 0x0C, 0x71, 0x3F, 0x81, 0x3A, 0xAA, 0x8F, + 0x6B, 0x95, 0x0E, 0x68, 0xAD, 0xED, 0x90, 0xA0, + 0x20, 0xFB, 0x7B, 0x56, 0x8E, 0xAF, 0xFC, 0x3F, + 0x9E, 0x70, 0xC5, 0x98, 0x72, 0xC1, 0x20, 0xD4, + 0x57, 0x05, 0x60, 0x2E, 0x95, 0x35, 0xCC, 0x9F, + 0x02, 0x29, 0xA9, 0x84, 0x5C, 0xDD, 0x8B, 0x48, + 0xDE, 0xA7, 0x17, 0x1E, 0x49, 0xDC, 0x94, 0x57, + 0x75, 0xCC, 0x58, 0x15, 0xFA, 0x49, 0xB5, 0x7F, + 0x77, 0x96, 0xB2, 0xC4, 0x08, 0x3A, 0x72, 0xB2, + 0xA0, 0x29, 0x91, 0x1D, 0xCD, 0x7D, 0x5B, 0x9A, + 0x1A, 0xC1, 0x7B, 0x1D, 0x20, 0x5C, 0x1C, 0x79, + 0x9E, 0x45, 0x42, 0x17, 0xCC, 0xD5, 0x37, 0xFB, + 0x67, 0x34, 0x81, 0x0C, 0xEC, 0x5F, 0xCD, 0x05, + 0x50, 0x87, 0x58, 0xA4, 0x83, 0x03, 0xF2, 0x08, + 0x8B, 0xA2, 0x5C, 0xE5, 0xBC, 0x3E, 0x5D, 0x45, + 0xC6, 0xF5, 0x4D, 0xE3, 0x76, 0x11, 0xD9, 0x1A, + 0x78, 0xFE, 0x1F, 0xC1, 0x73, 0xDF, 0x7F, 0x9F, + 0x1F, 0x4C, 0x22, 0xDC, 0x2D, 0x1D, 0xEF, 0x45, + 0xE6, 0x31, 0x8E, 0x70, 0xC2, 0x50, 0xA2, 0x38, + 0xEE, 0xD5, 0x6B, 0x07, 0xC2, 0x82, 0x4A, 0x89, + 0xAB, 0xBA, 0x54, 0x5D, 0x7C, 0xEB, 0x96, 0xA6, + 0x26, 0xFD, 0x7D, 0x50, 0x88, 0xA9, 0xFE, 0x3D, + 0x3F, 0xED, 0x7F, 0x91, 0x00, 0x95, 0x50, 0xB1, + 0x31, 0x4B, 0xC6, 0xA9, 0xF0, 0x72, 0x11, 0xDD, + 0x74, 0x2D, 0xB3, 0xCD, 0x87, 0x5D, 0x39, 0x19, + 0x91, 0x4A, 0x5E, 0x92, 0xDE, 0xDF, 0x89, 0x4A, + 0x0B, 0xEC, 0x59, 0x8D, 0x5E, 0x2E, 0x6E, 0xAE, + 0xE6, 0x31, 0x15, 0x62, 0xE7, 0xFD, 0x36, 0x3C, + 0x25, 0x6C, 0xB1, 0xF5, 0x08, 0x02, 0x42, 0x9F, + 0xEF, 0x34, 0xB4, 0x99, 0x41, 0xFD, 0x88, 0x09, + 0xBE, 0x66, 0xE7, 0x69, 0x9D, 0x6A, 0xE8, 0x27, + 0x95, 0x4A, 0xDB, 0x95, 0x49, 0xDF, 0x85, 0x67, + 0xC7, 0x3D, 0xAA, 0xE4, 0x78, 0xED, 0x90, 0xA0, + 0x79, 0xE6, 0xC2, 0xAA, 0x57, 0x65, 0x01, 0xE7, + 0x6C, 0x2E, 0x08, 0xF4, 0x58, 0x7A, 0x5E, 0xB9, + 0xA3, 0xF0, 0xC6, 0x2B, 0xD2, 0xE0, 0xC4, 0x21, + 0xBC, 0x97, 0x78, 0x20, 0x4A, 0xFE, 0xB9, 0xDB, + 0x5F, 0xA1, 0xB5, 0x9D, 0x4F, 0xE4, 0x2E, 0x4E, + 0x6E, 0xC1, 0xD5, 0xFD, 0x03, 0x09, 0xC3, 0xA3, + 0x82, 0x78, 0x6C, 0x44, 0xB9, 0x14, 0x84, 0x44, + 0xC4, 0x1F, 0x9F, 0xB2, 0x6A, 0x1A, 0x5A, 0x9A, + 0x16, 0xC4, 0xF3, 0xA2, 0x79, 0xF8, 0xA2, 0x61, + 0xB0, 0x50, 0xE5, 0xFB, 0x00, 0x3A, 0x9A, 0x7A, + 0xFA, 0x69, 0x9A, 0x94, 0x6F, 0x56, 0xB6, 0x01, + 0x91, 0xCA, 0x0B, 0x76, 0x2E, 0xF8, 0x88, 0x88, + 0x28, 0xF3, 0x77, 0x38, 0x61, 0xA1, 0xA7, 0x47, + 0xB6, 0x5B, 0xEE, 0xE2, 0x7E, 0xEE, 0xBE, 0xDF, + 0x5B, 0xE1, 0x6B, 0x04, 0xEC, 0xDD, 0xB9, 0x49, + 0x78, 0xE2, 0xEC, 0x87, 0x49, 0xD1, 0xB9, 0xFB, + 0x50, 0x94, 0x15, 0x71, 0xD5, 0xE4, 0xBA, 0x79, + 0xF5, 0x64, 0x5A, 0xDE, 0x36, 0x35, 0x75, 0x55, + 0xDD, 0x06, 0x78, 0x51, 0xA8, 0x2F, 0x4C, 0x87, + 0x9B, 0x56, 0xB9, 0xDF, 0xB5, 0xC9, 0x57, 0x81, + 0xBA, 0x6B, 0x0F, 0xAF, 0x8A, 0x2C, 0xE1, 0x2D, + 0xBB, 0xDC, 0x6A, 0x20, 0xB4, 0x0C, 0xCE, 0xAE, + 0x2E, 0x50, 0x50, 0x1C, 0x06, 0x93, 0xF7, 0xF7, + 0xE7, 0x48, 0x52, 0x57, 0xA9, 0x50, 0x14, 0x71, + 0xE1, 0x3A, 0x0D, 0x53, 0x88, 0xBA, 0xF2, 0x20, + 0x40, 0x93, 0x25, 0xEB, 0x93, 0xB7, 0x6F, 0xA8, + 0xE8, 0x13, 0xA5, 0x01, 0xDF, 0xFD, 0x86, 0x1B, + 0x31, 0x41, 0x3D, 0xC8, 0x82, 0x59, 0x11, 0x34, + 0x1D, 0xE6, 0x98, 0xB1, 0x65, 0xDE, 0x3E, 0x52, + 0xD3, 0xA8, 0xBA, 0xF6, 0x0B, 0xA8, 0xC8, 0xA5, + 0x26, 0xF1, 0x4C, 0x85, 0x4F, 0xFF, 0x57, 0xD2, + 0x92, 0xD9, 0x1B, 0xEB, 0xAA, 0x3C, 0x15, 0xC2, + 0x5F, 0x74, 0x02, 0x4E, 0x96, 0xEE, 0x88, 0xFA, + 0x61, 0xE7, 0xFC, 0x92, 0x80, 0x8B, 0x52, 0xA0, + 0xC5, 0xB8, 0x2E, 0x5F, 0x77, 0xC7, 0xA7, 0x67, + 0x55, 0x2E, 0x99, 0x27, 0xFD, 0x47, 0x85, 0x47, + 0xEF, 0x34, 0x5F, 0x22, 0x7A, 0x60, 0x11, 0x71, + 0x5D, 0xA6, 0xC0, 0x06, 0xFE, 0x6B, 0x04, 0xC4, + 0xEC, 0xB5, 0x0F, 0x68, 0x15, 0xAB, 0xCB, 0x2E, + 0xE7, 0x3C, 0x86, 0xC1, 0x3C, 0x82, 0xE2, 0x3F, + 0x4F, 0x94, 0x2E, 0x48, 0xF5, 0xE8, 0xA8, 0xA0, + 0x65, 0x38, 0x54, 0xC7, 0x1F, 0xAF, 0x62, 0xA1, + 0x04, 0x36, 0x7F, 0xE1, 0x3B, 0xAD, 0x2F, 0xED, + 0x4A, 0x66, 0x6E, 0x13, 0x43, 0xC1, 0x1D, 0x55, + 0x4D, 0xD4, 0xDE, 0xFB, 0x81, 0x33, 0x59, 0x95, + 0x1E, 0x7C, 0x8F, 0x41, 0xDB, 0x4E, 0xE6, 0x63, + 0x25, 0x2E, 0x67, 0xA6, 0x7D, 0x28, 0xAE, 0x91, + 0xC3, 0x1A, 0x8A, 0x24, 0xFE, 0x69, 0xDE, 0xA2, + 0x33, 0x00, 0x84, 0x44, 0x62, 0x2A, 0x08, 0x64, + 0x5B, 0x02, 0xB6, 0xD0, 0x04, 0xBD, 0x44, 0xC1, + 0xC3, 0x5A, 0xC9, 0x6D, 0xF0, 0xC6, 0x61, 0x5E, + 0xDE, 0x05, 0xBF, 0xD9, 0xE4, 0x4A, 0x2A, 0xBC, + 0x86, 0xA1, 0x1B, 0x6D, 0xD0, 0x7E, 0x1E, 0xD2, + 0x69, 0x7F, 0xC3, 0xA3, 0x31, 0x41, 0x8A, 0xD9, + 0xF0, 0x6E, 0xDE, 0x5C, 0x7B, 0xCB, 0xA7, 0x4D, + 0xE8, 0x2E, 0x98, 0x2C, 0xB1, 0x0D, 0x23, 0x43, + 0x1D, 0x45, 0x2A, 0x03, 0x1D, 0x5F, 0xC0, 0x00, + 0x80, 0x5B, 0xDB, 0xF6, 0x2E, 0x3C, 0xFC, 0x18, + 0x49, 0xAF, 0x1A, 0x97, 0x70, 0xC3, 0x92, 0x65, + 0xE6, 0x1C, 0x90, 0xFF, 0x66, 0xE8, 0x8B, 0x8B, + 0x2B, 0xF0, 0xC4, 0x8C, 0x5A, 0x58, 0x1A, 0x53, + 0x11, 0xC9, 0x57, 0xDB, 0xB8, 0x18, 0xF8, 0xF4, + 0x65, 0x6E, 0x14, 0x68, 0x70, 0x7B, 0x3B, 0x1B, + 0x93, 0x48, 0x3E, 0x72, 0xAA, 0x36, 0xDC, 0x94, + 0xF0, 0xFA, 0x0D, 0x62, 0x08, 0x9A, 0x70, 0x72, + 0xF1, 0x0F, 0x58, 0x74, 0xAF, 0x9F, 0x33, 0xE2, + 0x82, 0x95, 0x33, 0x8F, 0xEC, 0x4C, 0xEC, 0x97, + 0x37, 0x0C, 0xB2, 0xDE, 0x1B, 0x5B, 0x0D, 0x8C, + 0x0C, 0x96, 0x16, 0x79, 0xF0, 0x72, 0x11, 0x09, + 0x8D, 0x27, 0xA6, 0xC9, 0x83, 0x1E, 0x62, 0x62, + 0xC2, 0x19, 0x2D, 0x56, 0x80, 0xF2, 0x8F, 0x19, + 0xB0, 0x62, 0x56, 0xF2, 0xD2, 0xF0, 0xBD, 0x61, + 0xAA, 0xBD, 0xCB, 0x67, 0x4B, 0x39, 0x04, 0x92, + 0x59, 0x1B, 0x3F, 0x3E, 0xFA, 0xCD, 0x81, 0x37, + 0x96, 0x74, 0xC1, 0x48, 0xCC, 0x59, 0x81, 0x45, + 0x67, 0xD7, 0x43, 0xA3, 0xC1, 0xF3, 0xB9, 0x7A, + 0x78, 0x8B, 0x3D, 0xB1, 0x61, 0xD1, 0xF7, 0x36, + 0xB6, 0x6D, 0xD7, 0xB1, 0x8C, 0xA6, 0xE6, 0xAE, + 0x8B, 0xB0, 0x0E, 0x62, 0x57, 0xED, 0x5F, 0xBB, + 0x3B, 0x52, 0xFE, 0x86, 0xFC, 0x21, 0x63, 0x71, + 0xEC, 0x61, 0x65, 0xC2, 0xE2, 0x85, 0x4E, 0x8F, + 0xD2, 0x02, 0x09, 0x67, 0x17, 0x89, 0x39, 0x99, + 0xED, 0xFB, 0x4B, 0xAC, 0xDE, 0x8B, 0x8B, 0x63, + 0xC9, 0x34, 0x3A, 0x52, 0x02, 0xE7, 0x25, 0xCE, + 0x6C, 0x25, 0xB8, 0xC8, 0xD2, 0x79, 0x4F, 0xEF, + 0xF6, 0xED, 0x3B, 0x9B, 0x83, 0xF1, 0xCA, 0x5C, + 0x4E, 0xFE, 0x54, 0xD8, 0x08, 0xB8, 0x00, 0xC4, + 0xE6, 0x2A, 0x92, 0x3C, 0xF9, 0x1F, 0xDD, 0xD7, + 0xAF, 0xD3, 0xC9, 0x2B, 0x75, 0xC5, 0xA5, 0x44, + 0xFD, 0x25, 0x21, 0x8E, 0xA9, 0xEF, 0xA4, 0x30, + 0xA6, 0x91, 0x22, 0xAB, 0x27, 0xB2, 0x1A, 0xDE, + 0xFC, 0x4B, 0xDF, 0x3F, 0x5D, 0x6F, 0x25, 0xE6, + 0xE4, 0x17, 0xA1, 0x2D, 0xFD, 0x4D, 0x6B, 0xAA, + 0x2A, 0xF1, 0x4B, 0x2D, 0x10, 0x32, 0x72, 0x3A, + 0x1F, 0x24, 0x9A, 0xF6, 0xE6, 0x52, 0x8F, 0x4D, + 0x6F, 0xD8, 0x4C, 0x88, 0x7A, 0x08, 0x74, 0xE2, + 0xC0, 0xD1, 0x6F, 0xE6, 0x67, 0xFF, 0x2E, 0xD7, + 0x54, 0x07, 0xE4, 0x20, 0xFC, 0x8E, 0x4E, 0x8E, + 0xCC, 0x4D, 0xAD, 0x73, 0xC1, 0x6D, 0xAF, 0x45, + 0xE7, 0xDC, 0x62, 0x0E, 0x04, 0x90, 0xF0, 0xC0, + 0x60, 0xBB, 0xCF, 0xBE, 0x30, 0x0C, 0xF0, 0x92, + 0x3F, 0xF8, 0xF3, 0x9D, 0x20, 0xC7, 0x8F, 0x9D, + 0x39, 0xE2, 0x32, 0x7D, 0x9B, 0xC9, 0xB4, 0x23, + 0x1F, 0xAA, 0x79, 0x5B, 0xA6, 0xEE, 0x8A, 0xE8, + 0x07, 0xFE, 0xE4, 0x92, 0xC2, 0x48, 0xA0, 0x68, + 0x08, 0xDB, 0x6D, 0x89, 0xF4, 0xA4, 0xCC, 0x0C, + 0x14, 0xCB, 0xF5, 0xCC, 0xB6, 0x6F, 0x2D, 0x0D, + 0x85, 0x5E, 0x40, 0x28, 0x52, 0xF8, 0xCF, 0x59, + 0xA3, 0x85, 0x35, 0x5A, 0x82, 0x32, 0x52, 0x33, + 0xF0, 0x28, 0x2F, 0x01, 0xDA, 0xD3, 0xE4, 0x01, + 0x3D, 0xC1, 0xAF, 0xC7, 0xDD, 0x70, 0x47, 0x0B, + 0x87, 0x41, 0x07, 0xCA, 0x57, 0xE4, 0x55, 0xD1, + 0x52, 0x50, 0x81, 0x08, 0x6A, 0xFD, 0x80, 0xB0, + 0x30, 0xEB, 0x6B, 0x46, 0x9E, 0xEF, 0xB8, 0x7B, + 0x5A, 0xBA, 0x0F, 0xDF, 0xC5, 0xF7, 0x55, 0x6B, + 0xFD, 0x6E, 0xDE, 0xD4, 0x1E, 0x85, 0x5D, 0x97, + 0xF5, 0x22, 0xB0, 0x0E, 0xDD, 0x6A, 0xA8, 0x63, + 0xE5, 0xAC, 0x11, 0x78, 0x70, 0x6A, 0xCA, 0x9D, + 0x37, 0xA5, 0xB1, 0x91, 0x61, 0x33, 0x1F, 0xFA, + 0x58, 0x88, 0x37, 0xA9, 0x7A, 0xC2, 0x50, 0xDC, + 0x7B, 0x82, 0x78, 0x32, 0xE6, 0x44, 0x39, 0x09, + 0x89, 0x52, 0xE8, 0x8E, 0xB3, 0x87, 0xC7, 0x0B, + 0x89, 0x4F, 0x09, 0xDD, 0x0F, 0x6D, 0x01, 0xE9, + 0xCB, 0x1B, 0xAA, 0x44, 0x97, 0x23, 0x99, 0xF3, + 0xD4, 0x27, 0xD7, 0x19, 0x8D, 0x15, 0x57, 0x9C, + 0x15, 0x2C, 0x96, 0xDE, 0xF4, 0x4F, 0x27, 0x15, + 0xD9, 0x25, 0x71, 0x51, 0xAC, 0x3E, 0x12, 0xF4, + 0x78, 0xB1, 0x1A, 0x86, 0x52, 0xE0, 0x9D, 0xAD, + 0x95, 0x44, 0x50, 0x30, 0xC0, 0xA2, 0xC9, 0x0E, + 0x0C, 0xDC, 0x6F, 0xD3, 0xA1, 0xD1, 0x36, 0xDC, + 0x40, 0x39, 0xC3, 0x87, 0x7D, 0xC6, 0xAF, 0x8D, + 0x01, 0xFE, 0xBA, 0xDD, 0x0D, 0x4F, 0x63, 0x84, + 0xE6, 0x71, 0xE2, 0xAC, 0x38, 0xAE, 0xC2, 0x10, + 0x8D, 0xA6, 0x1C, 0x72, 0xB7, 0xF7, 0x9B, 0x59, + 0xC4, 0xEF, 0x6F, 0x42, 0x9A, 0x0B, 0x5D, 0x9E, + 0x9C, 0x65, 0xD3, 0xFE, 0x11, 0xA2, 0x40, 0x98, + 0x4F, 0xA5, 0x21, 0x4E, 0x3A, 0xF2, 0x37, 0xCA, + 0x6F, 0x2C, 0x98, 0x56, 0xE7, 0x75, 0xB9, 0xA3, + 0xAB, 0x4A, 0x74, 0x10, 0x28, 0x90, 0xF0, 0xB8, + 0x9B, 0xA0, 0x1E, 0x72, 0x32, 0x80, 0x62, 0x81, + 0x04, 0x7D, 0xA2, 0xEC, 0xD4, 0x6C, 0x0C, 0x64, + 0xE6, 0x9F, 0x33, 0x08, 0x86, 0x5C, 0xC1, 0xA0, + 0x65, 0xBD, 0xBA, 0x92, 0x49, 0x40, 0x44, 0x21, + 0x0A, 0xF6, 0x5D, 0xC1, 0x19, 0xA9, 0xC9, 0xA8, + 0x6B, 0xB3, 0xC4, 0xEA, 0x31, 0x48, 0x7C, 0x19, + 0x33, 0xCF, 0xA1, 0xCF, 0xC5, 0x68, 0x5F, 0xC9, + 0x34, 0x11, 0xE1, 0x7B, 0x5C, 0xEC, 0xBA, 0x3B, + 0xBB, 0x6C, 0xD0, 0x9D, 0x73, 0xC0, 0xDC, 0xF0, + 0xC8, 0x11, 0x26, 0x74, 0xAF, 0xAD, 0xE6, 0x05, + 0x0D, 0x3E, 0x48, 0x9F, 0x57, 0x07, 0x6F, 0xAF, + 0x87, 0x5E, 0x4A, 0xEC, 0x6C, 0x39, 0xFE, 0x19, + 0x84, 0xAF, 0x2F, 0x02, 0xDA, 0x76, 0xCE, 0x89, + 0x9B, 0x44, 0xD3, 0xF9, 0x22, 0x8F, 0x1F, 0x72, + 0xF0, 0x0E, 0x0E, 0x47, 0xB2, 0x08, 0x75, 0x45, + 0xC5, 0x1E, 0x9E, 0xB3, 0x6B, 0x76, 0x14, 0xB1, + 0x31, 0xEA, 0x50, 0x3E, 0xFB, 0xBB, 0xED, 0x6C, + 0xEC, 0x17, 0x03, 0x4F, 0xB2, 0xE0, 0xA7, 0x56, + 0xED, 0x35, 0x1B, 0x74, 0x0C, 0x34, 0x15, 0x57, + 0x9E, 0x44, 0x50, 0x75, 0xAD, 0x36, 0xF4, 0xD1, + 0xB1, 0x4D, 0x4A, 0x11, 0xCA, 0xF8, 0x9A, 0x5F, + 0x2D, 0xF4, 0x45, 0xFB, 0x21, 0x97, 0x35, 0xF7, + 0x7F, 0x4C, 0xF9, 0x07, 0xDD, 0x69, 0x9B, 0x15, + 0x91, 0xC8, 0x30, 0x59, 0x23, 0xDD, 0xBF, 0xDF, + 0xF7, 0x6D, 0x79, 0x5B, 0x80, 0x92, 0xF0, 0x39, + 0x4B, 0xDE, 0x6F, 0xA1, 0x32, 0xA4, 0x66, 0xE8, + 0x61, 0x78, 0x80, 0xE4, 0xEE, 0x10, 0x76, 0x66, + 0x36, 0x99, 0xEF, 0x43, 0xEF, 0x9D, 0xB6, 0x51, + 0x03, 0x93, 0x0D, 0xCB, 0xCF, 0xAF, 0x1E, 0xFF, + 0xAD, 0x3D, 0xAF, 0xDE, 0xF6, 0x46, 0x10, 0x91, + 0x11, 0x07, 0xB3, 0xD3, 0x06, 0xAD, 0xAE, 0xD3, + 0x55, 0xB9, 0x3B, 0x26, 0xD5, 0x31, 0x61, 0xE5, + 0xA5, 0x65, 0x97, 0xBB, 0xE2, 0x13, 0x74, 0xD0, + 0x56, 0xA6, 0xA3, 0x1D, 0xC7, 0x77, 0x0C, 0x0E, + 0x12, 0xF1, 0xEA, 0x8B, 0x78, 0x73, 0xF1, 0x3D, + 0xBD, 0xB4, 0x0E, 0x63, 0x90, 0xEC, 0x66, 0x0C, + 0x56, 0x27, 0xC6, 0x31, 0x07, 0x6A, 0x00, 0x6D, + 0xE0, 0x86, 0x34, 0x7D, 0xC5, 0x5D, 0xF0, 0x32, + 0x0F, 0xD2, 0x68, 0x09, 0x91, 0xC0, 0xE1, 0x26, + 0xC2, 0x15, 0xB8, 0x16, 0x1C, 0xAE, 0xCE, 0x15, + 0x23, 0x28, 0x44, 0xE8, 0xE0, 0x81, 0x81, 0xDD, + 0xA3, 0x55, 0xEE, 0x10, 0xC4, 0x74, 0x3F, 0x44, + 0x54, 0x15, 0x63, 0x9F, 0xD6, 0x06, 0xFC, 0x1E, + 0x1C, 0xCB, 0x7C, 0x3B, 0x2F, 0x1F, 0xF5, 0xF5, + 0xF5, 0xAF, 0x79, 0x9F, 0x65, 0x82, 0x79, 0x5B, + 0xC6, 0xED, 0x76, 0x17, 0xD2, 0x92, 0xFE, 0x3C, + 0xA1, 0x8A, 0x0A, 0x07, 0xDF, 0xAF, 0xEF, 0x2F, + 0xEE, 0x7C, 0xC9, 0x04, 0x94, 0x27, 0x66, 0xE1, + 0x62, 0xEB, 0xFD, 0x90, 0x1A, 0xC8, 0x29, 0x29, + 0x89, 0x52, 0x76, 0x38, 0x60, 0x10, 0x50, 0x90, + 0xB0, 0xF2, 0x64, 0x9A, 0x20, 0x10, 0xB0, 0x50, + 0xD0, 0x89, 0x1B, 0xF6, 0xEE, 0x7E, 0x1E, 0x8E, + 0x86, 0x7D, 0x49, 0x41, 0x18, 0xCD, 0x8F, 0x6A, + 0xD7, 0x06, 0xA6, 0x80, 0x54, 0x5C, 0x16, 0x6F, + 0xEE, 0x39, 0x84, 0x08, 0xB1, 0x01, 0xB3, 0xD3, + 0x53, 0x59, 0xD8, 0xB7, 0xAF, 0x3F, 0x5F, 0x5D, + 0xFF, 0xA4, 0xD2, 0x9E, 0x46, 0xA6, 0x0A, 0xEA, + 0xB8, 0x7E, 0xC6, 0x68, 0xD2, 0xE2, 0x24, 0xF9, + 0x5C, 0x25, 0x33, 0xA3, 0xB9, 0x28, 0x48, 0x48, + 0xE8, 0x33, 0x77, 0x39, 0x6B, 0x2B, 0xC3, 0x42, + 0x62, 0x46, 0xE0, 0x0B, 0xCC, 0x8C, 0x2C, 0xCC, + 0x4C, 0xDC, 0xD1, 0x3F, 0xC5, 0xF9, 0x1B, 0xB7, + 0x37, 0x2E, 0x54, 0x3C, 0x33, 0xA8, 0x17, 0x86, + 0x4C, 0x94, 0xC2, 0x48, 0x83, 0x23, 0x63, 0xA3, + 0xA1, 0x5F, 0xED, 0x61, 0xB1, 0x01, 0x77, 0xBD, + 0x3A, 0xED, 0x55, 0xF8, 0x1B, 0xA8, 0xB4, 0x9C, + 0x10, 0x81, 0x4B, 0x1E, 0x06, 0x96, 0xF6, 0xE4, + 0x40, 0x1D, 0x6B, 0x27, 0xFF, 0xDF, 0x22, 0xF2, + 0xD2, 0x90, 0x06, 0xF8, 0x44, 0x72, 0xD2, 0x32, + 0xB2, 0x9B, 0x09, 0xE4, 0xFC, 0x6C, 0x0C, 0x4C, + 0x33, 0xF8, 0xBC, 0xB4, 0xED, 0x9D, 0xDD, 0x1D, + 0x4F, 0xF0, 0xC0, 0x6C, 0x94, 0x24, 0x8C, 0x40, + 0x68, 0x90, 0xD4, 0xB4, 0x6C, 0x6E, 0x02, 0xC3, + 0x81, 0x96, 0x22, 0xCE, 0xAD, 0x0C, 0x9C, 0xE7, + 0x47, 0x4E, 0xF4, 0x98, 0x82, 0x3E, 0x5F, 0x7D, + 0x9F, 0xC5, 0xF3, 0x53, 0x9A, 0xFA, 0x56, 0xB6, + 0xD3, 0xE0, 0xA9, 0x4D, 0xA6, 0x3B, 0x51, 0x19, + 0x91, 0xE7, 0x52, 0xDE, 0x0E, 0xBE, 0xC3, 0xF3, + 0x73, 0xA8, 0x12, 0x74, 0x49, 0xAD, 0xED, 0xAB, + 0xE6, 0xC2, 0xFC, 0xD5, 0xED, 0x55, 0x35, 0xE3, + 0x19, 0x3D, 0x4D, 0xC1, 0xE6, 0x56, 0x00, 0x81, + 0x01, 0x7B, 0x86, 0xE9, 0x80, 0x7C, 0x1F, 0x12, + 0x90, 0x2E, 0x70, 0x38, 0x51, 0xAF, 0xCC, 0x2C, + 0x86, 0xFD, 0xEA, 0xCB, 0x10, 0x6D, 0x0F, 0xAA, + 0xCD, 0x32, 0x35, 0x09, 0xD2, 0x42, 0x18, 0x78, + 0x3A, 0x22, 0x84, 0x49, 0xDE, 0x6D, 0x01, 0xC3, + 0x6A, 0xB2, 0x2D, 0x52, 0xA3, 0x30, 0x79, 0x8A, + 0xEF, 0xD1, 0x43, 0x9E, 0x14, 0xA7, 0xF7, 0x0D, + 0x2D, 0x34, 0x41, 0x3D, 0x44, 0xA5, 0xC6, 0xE3, + 0x87, 0x78, 0xC2, 0xA7, 0x4F, 0xC5, 0x05, 0xF7, + 0xB4, 0x7F, 0xE2, 0x17, 0xE6, 0x55, 0x1C, 0xCF, + 0xC4, 0x2C, 0xFC, 0x09, 0x25, 0x38, 0x5B, 0x29, + 0x09, 0x77, 0xED, 0xCD, 0xF0, 0x73, 0x3B, 0x5A, + 0x89, 0x51, 0x56, 0x6E, 0xB5, 0xC7, 0x64, 0x80, + 0x65, 0x5C, 0xCE, 0x13, 0x9D, 0x2E, 0x7E, 0x84, + 0xA4, 0xDE, 0x3D, 0x52, 0xB8, 0xCB, 0x8F, 0x82, + 0x01, 0x3F, 0x6A, 0x22, 0x4B, 0xA3, 0xC0, 0x30, + 0x8A, 0xF1, 0xE6, 0xDD, 0x06, 0x7B, 0x18, 0xBD, + 0xD8, 0x27, 0x20, 0x16, 0xCD, 0x4D, 0x17, 0x77, + 0x56, 0xD4, 0x61, 0xC0, 0x1B, 0x0E, 0x8A, 0x6E, + 0x5F, 0xD8, 0x6D, 0x31, 0xD3, 0xC3, 0x02, 0x99, + 0x1A, 0x0C, 0xB9, 0x70, 0x4B, 0xDF, 0x8F, 0x65, + 0x45, 0x83, 0xC5, 0xA9, 0x71, 0xC1, 0xBB, 0x7A, + 0xFA, 0x21, 0x97, 0xFB, 0x23, 0x93, 0x7F, 0xB2, + 0x30, 0x8B, 0xA9, 0xD3, 0x0B, 0xDB, 0xA6, 0x66, + 0xEC, 0x37, 0x03, 0x6B, 0x30, 0x84, 0x44, 0x97, + 0x15, 0xAE, 0x19, 0x75, 0xAD, 0x1D, 0x01, 0xD7, + 0x57, 0xEC, 0x26, 0x5C, 0x84, 0x54, 0x9C, 0x4A, + 0xCA, 0x71, 0x4F, 0x35, 0xED, 0x3D, 0xD5, 0x03, + 0x83, 0x38, 0x22, 0x58, 0x80, 0x50, 0x30, 0xF0, + 0x70, 0xAB, 0x1D, 0x71, 0xA9, 0x19, 0x79, 0xB9, + 0x39, 0xE2, 0x54, 0x38, 0xE0, 0x50, 0x30, 0xF0, + 0x70, 0xAB, 0x1D, 0x71, 0xA9, 0x19, 0x79, 0xB9, + 0x39, 0xE2, 0x54, 0x38, 0xE0, 0x50, 0x30, 0xF0, + 0x70, 0xAB, 0x1D, 0x71, 0xA9, 0x19, 0x79, 0xB9, + 0x39, 0xE2, 0x7C, 0x19, 0xC1, 0x11, 0x55, 0x9C, + 0x1C, 0xA7, 0x03, 0x5F, 0x87, 0x37, 0x97, 0x41, + 0xC1, 0x7A, 0x7C, 0x10, 0xC8, 0x78, 0x64, 0xA3, + 0x23, 0x98, 0x82, 0xE3, 0x39, 0xE9, 0x79, 0xBE, + 0x3E, 0x85, 0xC3, 0xA2, 0x78, 0xA8, 0xB8, 0x76, + 0xF4, 0x4F, 0xF1, 0x92, 0x48, 0x98, 0x44, 0x83, + 0x03, 0xB8, 0x86, 0xF9, 0x23, 0xF3, 0x3F, 0xEA, + 0x68, 0xD3, 0x53, 0x7E, 0xA6, 0x97, 0x45, 0x80, + 0xB1, 0xDA, 0x69, 0xA7, 0xDF, 0x6C, 0x9D, 0xEC, + 0x69, 0x10, 0xED, 0x81, 0xDB, 0x02, 0x62, 0xC7, + 0x46, 0x9D, 0x0E, 0x60, 0xB8, 0x2D, 0x49, 0x89, + 0xA8, 0xC0, 0x73, 0xAE, 0xC2, 0x77, 0xF2, 0xA3, + 0x04, 0xC2, 0x84, 0xE8, 0x30, 0x80, 0xD6, 0x57, + 0xD7, 0x3D, 0x3E, 0x57, 0xAE, 0xA8, 0xCD, 0x24, + 0x77, 0xB1, 0xF7, 0x9B, 0x43, 0xF3, 0xA5, 0x24, + 0xA4, 0xCE, 0xC0, 0xA9, 0x40, 0x4B, 0x2E, 0xCF, + 0xF3, 0x2D, 0x1A, 0xCC, 0x11, 0x30, 0xE7, 0x22, + 0x03, 0x61, 0xD2, 0x17, 0x16, 0x24, 0x2D, 0xFD, + 0x54, 0xAC, 0xA3, 0x56, 0x93, 0xD3, 0x85, 0x04, + 0x84, 0x6E, 0x6D, 0x04, 0xFD, 0xF0, 0x95, 0x7C, + 0x6F, 0xA9, 0xEF, 0x83, 0x5B, 0xEB, 0x8B, 0x4B, + 0xCB, 0x10, 0xA6, 0xCA, 0x12, 0xA2, 0xC2, 0x02, + 0x82, 0x59, 0xEE, 0x82, 0x5E, 0xEE, 0x76, 0xA0, + 0x22, 0x99, }; static unsigned char vfs5011_init_06[] = { /* 2855 B */ - 0x02, 0xB0, 0x00, 0x62, 0x00, 0x03, 0x00, 0x09, - 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, - 0x04, 0x30, 0x01, 0x80, 0x64, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, - 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, - 0x20, 0x04, 0x30, 0xE6, 0x03, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, - 0xE7, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x4C, 0x20, 0x04, 0x30, 0xE8, 0x03, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, - 0x04, 0x30, 0x00, 0x92, 0x01, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, - 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x40, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x60, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xD8, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, - 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, - 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, - 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, - 0x30, 0x00, 0x02, 0xA8, 0x02, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, - 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, - 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, - 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, - 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, - 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, - 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, - 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, - 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, - 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, - 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, - 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, - 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, - 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, - 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, - 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, - 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, - 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, - 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, - 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, - 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, - 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, - 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, - 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, - 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, - 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, - 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, - 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, - 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, - 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, - 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, - 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, - 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, - 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, - 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, - 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, - 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, - 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, - 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, - 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, - 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, - 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, - 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, - 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, - 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, - 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, - 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, - 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, - 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, - 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, - 0xFF, 0x83, 0xA7, 0x00, 0x5F, 0x82, 0xA7, 0x00, - 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, - 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, - 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, - 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, - 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, - 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, - 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, - 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, - 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, - 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, - 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, - 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, - 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, - 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, - 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, - 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, - 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, - 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, - 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, - 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, - 0xFF, 0x83, 0x27, 0x20, 0x5F, 0x82, 0x27, 0x20, - 0xFF, 0x8B, 0x27, 0x20, 0x60, 0x8A, 0x27, 0x20, - 0xFF, 0x93, 0x27, 0x20, 0x61, 0x92, 0x27, 0x20, - 0xFF, 0x9B, 0x27, 0x20, 0x62, 0x9A, 0x27, 0x20, - 0xFF, 0xA3, 0x27, 0x20, 0x63, 0xA2, 0x27, 0x20, - 0xFF, 0xAB, 0x27, 0x20, 0x64, 0xAA, 0x27, 0x20, - 0xFF, 0xB3, 0x27, 0x20, 0x65, 0xB2, 0x27, 0x20, - 0xFF, 0xBB, 0x27, 0x20, 0x66, 0xBA, 0x27, 0x20, - 0xFF, 0xC3, 0x27, 0x20, 0x67, 0xC2, 0x27, 0x20, - 0xFF, 0xCB, 0x27, 0x20, 0x68, 0xCA, 0x27, 0x20, - 0xFF, 0xD3, 0x27, 0x20, 0x69, 0xD2, 0x27, 0x20, - 0xFF, 0xDB, 0x27, 0x20, 0x6A, 0xDA, 0x27, 0x20, - 0xFF, 0xE3, 0x27, 0x20, 0x6B, 0xE2, 0x27, 0x20, - 0xFF, 0xEB, 0x27, 0x20, 0x6C, 0xEA, 0x27, 0x20, - 0xFF, 0xF3, 0x27, 0x20, 0x6D, 0xF2, 0x27, 0x20, - 0xFF, 0xFB, 0x27, 0x20, 0x6E, 0xFA, 0x27, 0x20, - 0xFF, 0x85, 0x27, 0x20, 0x6F, 0x84, 0x27, 0x20, - 0xFF, 0x8D, 0x27, 0x20, 0x70, 0x8C, 0x27, 0x20, - 0xFF, 0x95, 0x27, 0x20, 0x71, 0x94, 0x27, 0x20, - 0xFF, 0x9D, 0x27, 0x20, 0x72, 0x9C, 0x27, 0x20, - 0xFF, 0xA5, 0x27, 0x20, 0x73, 0xA4, 0x27, 0x20, - 0xFF, 0xAD, 0x27, 0x20, 0x74, 0xAC, 0x27, 0x20, - 0xFF, 0xB5, 0x27, 0x20, 0x75, 0xB4, 0x27, 0x20, - 0xFF, 0xBD, 0x27, 0x20, 0x76, 0xBC, 0x27, 0x20, - 0xFF, 0xC5, 0x27, 0x20, 0x77, 0xC4, 0x27, 0x20, - 0xFF, 0xCD, 0x27, 0x20, 0x78, 0xCC, 0x27, 0x20, - 0xFF, 0xD5, 0x27, 0x20, 0x79, 0xD4, 0x27, 0x20, - 0xFF, 0xDD, 0x27, 0x20, 0x7A, 0xDC, 0x27, 0x20, - 0xFF, 0xE5, 0x27, 0x20, 0x7B, 0xE4, 0x27, 0x20, - 0xFF, 0xED, 0x27, 0x20, 0x7C, 0xEC, 0x27, 0x20, - 0xFF, 0xF5, 0x27, 0x20, 0x7D, 0xF4, 0x27, 0x20, - 0xFF, 0xFD, 0x27, 0x20, 0x7E, 0xFC, 0x27, 0x20, - 0xFF, 0x87, 0x27, 0x20, 0x7F, 0x86, 0x27, 0x20, - 0xFF, 0x8F, 0x27, 0x20, 0x80, 0x8E, 0x27, 0x20, - 0xFF, 0x97, 0x27, 0x20, 0x81, 0x96, 0x27, 0x20, - 0xFF, 0x9F, 0x27, 0x20, 0x82, 0x9E, 0x27, 0x20, - 0xFF, 0xA7, 0x27, 0x20, 0x83, 0xA6, 0x27, 0x20, - 0xFF, 0xAF, 0x27, 0x20, 0x84, 0xAE, 0x27, 0x20, - 0xFF, 0xB7, 0x27, 0x20, 0x85, 0xB6, 0x27, 0x20, - 0xFF, 0xBF, 0x27, 0x20, 0x86, 0xBE, 0x27, 0x20, - 0xFF, 0xC7, 0x27, 0x20, 0x87, 0xC6, 0x27, 0x20, - 0xFF, 0xCF, 0x27, 0x20, 0x88, 0xCE, 0x27, 0x20, - 0xFF, 0xD7, 0x27, 0x20, 0x89, 0xD6, 0x27, 0x20, - 0xFF, 0xDF, 0x27, 0x20, 0x8A, 0xDE, 0x27, 0x20, - 0xFF, 0xE7, 0x27, 0x20, 0x8B, 0xE6, 0x27, 0x20, - 0xFF, 0xEF, 0x27, 0x20, 0x8C, 0xEE, 0x27, 0x20, - 0xFF, 0xF7, 0x27, 0x20, 0x8D, 0xF6, 0x27, 0x20, - 0xFF, 0xFF, 0x27, 0x20, 0x8E, 0xFE, 0x27, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, - 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, - 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, - 0x04, 0x0C, 0x00, 0x01, 0x00, 0x00, 0x0D, 0x00, - 0x78, 0x01, 0x50, 0x01, 0x00, 0x00, 0x0E, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x6E, - 0x00, 0x65, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, - 0x00, 0x6E, 0x00, 0x67, 0x00, 0x5C, 0x00, 0x70, - 0x00, 0x72, 0x00, 0x69, 0x00, 0x76, 0x03, 0x00, - 0x00, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x07, - 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, - 0x00, 0x38, 0x02, 0x07, 0x00, 0x00, 0xFD, 0x00, - 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x08, - 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, - 0x00, 0x38, 0x02, 0x08, 0x00, 0x00, 0xFD, 0x00, - 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x02, - 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, - 0x00, 0x38, 0x02, 0x02, 0x00, 0x00, 0xFD, 0x00, - 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x03, - 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, - 0x00, 0x38, 0x02, 0x03, 0x00, 0x00, 0xFD, 0x00, - 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x04, - 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, - 0x00, 0x38, 0x02, 0x04, 0x00, 0x00, 0xFD, 0x00, - 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x05, - 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, - 0x00, 0x38, 0x02, 0x05, 0x00, 0x00, 0xFD, 0x00, - 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x06, - 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, - 0x00, 0x38, 0x02, 0x06, 0x00, 0x00, 0xFD, 0x00, - 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x03, - 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, - 0x00, 0x38, 0x00, 0x04, 0x00, 0x00, 0xFD, 0x00, - 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x04, - 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, - 0x00, 0x38, 0x00, 0x05, 0x00, 0x00, 0xFD, 0x00, - 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x05, - 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, - 0x00, 0x38, 0x00, 0x06, 0x00, 0x00, 0xFD, 0x00, - 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x06, - 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, - 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xFD, 0x00, - 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x07, - 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, - 0x00, 0x38, 0x00, 0x08, 0x00, 0x00, 0xFD, 0x00, - 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x08, - 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, - 0x00, 0x38, 0x00, 0x09, 0x00, 0x00, 0xFD, 0x00, - 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x09, - 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, - 0x00, 0x38, 0x00, 0x0A, 0x00, 0x00, 0xFD, 0x00, - 0xFF, 0xFF, 0x0E, 0x00, 0xE0, 0x00, 0x00, 0x01, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x1F, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, - 0x01, 0x01, 0x00, 0x01, 0x00, 0x1F, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x00, 0x1F, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, - 0x02, 0x01, 0x01, 0x01, 0x00, 0x1F, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x1F, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, - 0x02, 0x01, 0x01, 0x01, 0x01, 0x1F, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, - 0x04, 0x01, 0x01, 0x01, 0x01, 0x1F, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, - 0x04, 0x01, 0x02, 0x01, 0x01, 0x1F, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, - 0x08, 0x01, 0x02, 0x01, 0x01, 0x1F, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, - 0x08, 0x01, 0x04, 0x01, 0x01, 0x1F, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, - 0x10, 0x01, 0x04, 0x01, 0x01, 0x1F, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, - 0x10, 0x01, 0x08, 0x01, 0x01, 0x1F, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, - 0x10, 0x01, 0x08, 0x01, 0x02, 0x1F, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, - 0x10, 0x01, 0x10, 0x01, 0x02, 0x1F, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x0F, 0x00, - 0x01, 0x00, 0x02, 0x10, 0x00, 0x01, 0x00, 0x01, - 0x11, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x12, 0x00, - 0x01, 0x00, 0x0E, 0x15, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x28, 0x00, 0x00, + 0x02, 0xB0, 0x00, 0x62, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x01, 0x80, 0x64, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE6, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xE7, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0xE8, 0x03, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x00, 0x92, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x02, 0xA8, 0x02, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, + 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, + 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, + 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, + 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, + 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, + 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, + 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, + 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, + 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, + 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, + 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, + 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, + 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, + 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, + 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, + 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, + 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, + 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, + 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, + 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, + 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, + 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, + 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, + 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, + 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, + 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, + 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, + 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, + 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, + 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, + 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, + 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, + 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, + 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, + 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, + 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, + 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, + 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, + 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, + 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, + 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, + 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, + 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, + 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, + 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, + 0xFF, 0x83, 0xA7, 0x00, 0x5F, 0x82, 0xA7, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x20, 0x5F, 0x82, 0x27, 0x20, + 0xFF, 0x8B, 0x27, 0x20, 0x60, 0x8A, 0x27, 0x20, + 0xFF, 0x93, 0x27, 0x20, 0x61, 0x92, 0x27, 0x20, + 0xFF, 0x9B, 0x27, 0x20, 0x62, 0x9A, 0x27, 0x20, + 0xFF, 0xA3, 0x27, 0x20, 0x63, 0xA2, 0x27, 0x20, + 0xFF, 0xAB, 0x27, 0x20, 0x64, 0xAA, 0x27, 0x20, + 0xFF, 0xB3, 0x27, 0x20, 0x65, 0xB2, 0x27, 0x20, + 0xFF, 0xBB, 0x27, 0x20, 0x66, 0xBA, 0x27, 0x20, + 0xFF, 0xC3, 0x27, 0x20, 0x67, 0xC2, 0x27, 0x20, + 0xFF, 0xCB, 0x27, 0x20, 0x68, 0xCA, 0x27, 0x20, + 0xFF, 0xD3, 0x27, 0x20, 0x69, 0xD2, 0x27, 0x20, + 0xFF, 0xDB, 0x27, 0x20, 0x6A, 0xDA, 0x27, 0x20, + 0xFF, 0xE3, 0x27, 0x20, 0x6B, 0xE2, 0x27, 0x20, + 0xFF, 0xEB, 0x27, 0x20, 0x6C, 0xEA, 0x27, 0x20, + 0xFF, 0xF3, 0x27, 0x20, 0x6D, 0xF2, 0x27, 0x20, + 0xFF, 0xFB, 0x27, 0x20, 0x6E, 0xFA, 0x27, 0x20, + 0xFF, 0x85, 0x27, 0x20, 0x6F, 0x84, 0x27, 0x20, + 0xFF, 0x8D, 0x27, 0x20, 0x70, 0x8C, 0x27, 0x20, + 0xFF, 0x95, 0x27, 0x20, 0x71, 0x94, 0x27, 0x20, + 0xFF, 0x9D, 0x27, 0x20, 0x72, 0x9C, 0x27, 0x20, + 0xFF, 0xA5, 0x27, 0x20, 0x73, 0xA4, 0x27, 0x20, + 0xFF, 0xAD, 0x27, 0x20, 0x74, 0xAC, 0x27, 0x20, + 0xFF, 0xB5, 0x27, 0x20, 0x75, 0xB4, 0x27, 0x20, + 0xFF, 0xBD, 0x27, 0x20, 0x76, 0xBC, 0x27, 0x20, + 0xFF, 0xC5, 0x27, 0x20, 0x77, 0xC4, 0x27, 0x20, + 0xFF, 0xCD, 0x27, 0x20, 0x78, 0xCC, 0x27, 0x20, + 0xFF, 0xD5, 0x27, 0x20, 0x79, 0xD4, 0x27, 0x20, + 0xFF, 0xDD, 0x27, 0x20, 0x7A, 0xDC, 0x27, 0x20, + 0xFF, 0xE5, 0x27, 0x20, 0x7B, 0xE4, 0x27, 0x20, + 0xFF, 0xED, 0x27, 0x20, 0x7C, 0xEC, 0x27, 0x20, + 0xFF, 0xF5, 0x27, 0x20, 0x7D, 0xF4, 0x27, 0x20, + 0xFF, 0xFD, 0x27, 0x20, 0x7E, 0xFC, 0x27, 0x20, + 0xFF, 0x87, 0x27, 0x20, 0x7F, 0x86, 0x27, 0x20, + 0xFF, 0x8F, 0x27, 0x20, 0x80, 0x8E, 0x27, 0x20, + 0xFF, 0x97, 0x27, 0x20, 0x81, 0x96, 0x27, 0x20, + 0xFF, 0x9F, 0x27, 0x20, 0x82, 0x9E, 0x27, 0x20, + 0xFF, 0xA7, 0x27, 0x20, 0x83, 0xA6, 0x27, 0x20, + 0xFF, 0xAF, 0x27, 0x20, 0x84, 0xAE, 0x27, 0x20, + 0xFF, 0xB7, 0x27, 0x20, 0x85, 0xB6, 0x27, 0x20, + 0xFF, 0xBF, 0x27, 0x20, 0x86, 0xBE, 0x27, 0x20, + 0xFF, 0xC7, 0x27, 0x20, 0x87, 0xC6, 0x27, 0x20, + 0xFF, 0xCF, 0x27, 0x20, 0x88, 0xCE, 0x27, 0x20, + 0xFF, 0xD7, 0x27, 0x20, 0x89, 0xD6, 0x27, 0x20, + 0xFF, 0xDF, 0x27, 0x20, 0x8A, 0xDE, 0x27, 0x20, + 0xFF, 0xE7, 0x27, 0x20, 0x8B, 0xE6, 0x27, 0x20, + 0xFF, 0xEF, 0x27, 0x20, 0x8C, 0xEE, 0x27, 0x20, + 0xFF, 0xF7, 0x27, 0x20, 0x8D, 0xF6, 0x27, 0x20, + 0xFF, 0xFF, 0x27, 0x20, 0x8E, 0xFE, 0x27, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x0C, 0x00, 0x01, 0x00, 0x00, 0x0D, 0x00, + 0x78, 0x01, 0x50, 0x01, 0x00, 0x00, 0x0E, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x6E, + 0x00, 0x65, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, + 0x00, 0x6E, 0x00, 0x67, 0x00, 0x5C, 0x00, 0x70, + 0x00, 0x72, 0x00, 0x69, 0x00, 0x76, 0x03, 0x00, + 0x00, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x07, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, + 0x00, 0x38, 0x02, 0x07, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x08, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, + 0x00, 0x38, 0x02, 0x08, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x02, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, + 0x00, 0x38, 0x02, 0x02, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x03, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, + 0x00, 0x38, 0x02, 0x03, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x04, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, + 0x00, 0x38, 0x02, 0x04, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x05, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, + 0x00, 0x38, 0x02, 0x05, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x06, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, + 0x00, 0x38, 0x02, 0x06, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x03, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, + 0x00, 0x38, 0x00, 0x04, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x04, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, + 0x00, 0x38, 0x00, 0x05, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x05, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, + 0x00, 0x38, 0x00, 0x06, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x06, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, + 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x07, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, + 0x00, 0x38, 0x00, 0x08, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x08, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, + 0x00, 0x38, 0x00, 0x09, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x09, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, + 0x00, 0x38, 0x00, 0x0A, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x0E, 0x00, 0xE0, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x00, 0x01, 0x00, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x02, 0x01, 0x01, 0x01, 0x00, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x02, 0x01, 0x01, 0x01, 0x01, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x04, 0x01, 0x01, 0x01, 0x01, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x04, 0x01, 0x02, 0x01, 0x01, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x08, 0x01, 0x02, 0x01, 0x01, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x08, 0x01, 0x04, 0x01, 0x01, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x10, 0x01, 0x04, 0x01, 0x01, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x10, 0x01, 0x08, 0x01, 0x01, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x10, 0x01, 0x08, 0x01, 0x02, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x10, 0x01, 0x10, 0x01, 0x02, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x0F, 0x00, + 0x01, 0x00, 0x02, 0x10, 0x00, 0x01, 0x00, 0x01, + 0x11, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x12, 0x00, + 0x01, 0x00, 0x0E, 0x15, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x28, 0x00, 0x00, }; static unsigned char vfs5011_init_07[] = { /* 2503 B */ - 0x02, 0xB0, 0x00, 0x00, 0x01, 0x03, 0x00, 0x09, - 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, - 0x04, 0x30, 0x01, 0x80, 0x4F, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, - 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, - 0x20, 0x04, 0x30, 0xE6, 0x03, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, - 0xE7, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x4C, 0x20, 0x04, 0x30, 0xE8, 0x03, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, - 0x04, 0x30, 0x00, 0x3E, 0x01, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x04, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, - 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x18, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, - 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x40, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, - 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x54, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x60, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, - 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, - 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xCC, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, - 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, - 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, - 0x00, 0x40, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, - 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, - 0x30, 0x00, 0x02, 0xA8, 0x02, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, - 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, - 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, - 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, - 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, - 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, - 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, - 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, - 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, - 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, - 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, - 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, - 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, - 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, - 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, - 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, - 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, - 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, - 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, - 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, - 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, - 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, - 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, - 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, - 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, - 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, - 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, - 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, - 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, - 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, - 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, - 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, - 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, - 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, - 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, - 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, - 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, - 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, - 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, - 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, - 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, - 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, - 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, - 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, - 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, - 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, - 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, - 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, - 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, - 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, - 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, - 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, - 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, - 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, - 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, - 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, - 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, - 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, - 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, - 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, - 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, - 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, - 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, - 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, - 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, - 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, - 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, - 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, - 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, - 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, - 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, - 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, - 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, - 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, - 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, - 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, - 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, - 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, - 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, - 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, - 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, - 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, - 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, - 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, - 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, - 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, - 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, - 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, - 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, - 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, - 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, - 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, - 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, - 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, - 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, - 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, - 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, - 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, - 0x04, 0x0C, 0x00, 0x01, 0x00, 0x03, 0x0D, 0x00, - 0x28, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, - 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0x00, - 0x00, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x1C, 0x02, 0xB0, 0x01, 0x00, - 0x00, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x00, 0x01, - 0x01, 0x01, 0x01, 0x00, 0x01, 0x1F, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x00, - 0x01, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x01, - 0x11, 0x00, 0x02, 0x00, 0x00, 0x01, 0x12, 0x00, - 0x01, 0x00, 0x01, 0x05, 0x00, 0x0E, 0x00, 0x0C, - 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, - 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, - 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x15, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x28, 0x00, 0x00, + 0x02, 0xB0, 0x00, 0x00, 0x01, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x01, 0x80, 0x4F, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE6, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xE7, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0xE8, 0x03, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x00, 0x3E, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x40, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x02, 0xA8, 0x02, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, + 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, + 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, + 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, + 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, + 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, + 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, + 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, + 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, + 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, + 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, + 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, + 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, + 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, + 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, + 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, + 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, + 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, + 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, + 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, + 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, + 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, + 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, + 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, + 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, + 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, + 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, + 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, + 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, + 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, + 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, + 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, + 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, + 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, + 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, + 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, + 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, + 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, + 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, + 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, + 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, + 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, + 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, + 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, + 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, + 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, + 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, + 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, + 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, + 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, + 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, + 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, + 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, + 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, + 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, + 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, + 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, + 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, + 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, + 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, + 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, + 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, + 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, + 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, + 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, + 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, + 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, + 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, + 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, + 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, + 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, + 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, + 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, + 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, + 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, + 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, + 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, + 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, + 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, + 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, + 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, + 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, + 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, + 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, + 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, + 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, + 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, + 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, + 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, + 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, + 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, + 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x0C, 0x00, 0x01, 0x00, 0x03, 0x0D, 0x00, + 0x28, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0x00, + 0x00, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x1C, 0x02, 0xB0, 0x01, 0x00, + 0x00, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x01, 0x1F, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x00, + 0x01, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x01, + 0x11, 0x00, 0x02, 0x00, 0x00, 0x01, 0x12, 0x00, + 0x01, 0x00, 0x01, 0x05, 0x00, 0x0E, 0x00, 0x0C, + 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, + 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x15, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x28, 0x00, 0x00, }; static unsigned char vfs5011_init_08[] = { /* 2516 B */ - 0x02, 0xB0, 0x00, 0x60, 0x00, 0x03, 0x00, 0x09, - 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, - 0x04, 0x30, 0x01, 0x80, 0x4F, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, - 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, - 0x20, 0x04, 0x30, 0xE6, 0x03, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, - 0xE7, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x4C, 0x20, 0x04, 0x30, 0xE8, 0x03, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, - 0x04, 0x30, 0x00, 0x3E, 0x01, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, - 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x05, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x40, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x60, 0x21, 0x04, 0x30, 0x05, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, - 0x30, 0x05, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xD8, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, - 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x05, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, - 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, - 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, - 0x30, 0x00, 0x02, 0xA8, 0x02, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, - 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, - 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, - 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, - 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, - 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, - 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, - 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, - 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, - 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, - 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, - 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, - 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, - 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, - 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, - 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, - 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, - 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, - 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, - 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, - 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, - 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, - 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, - 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, - 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, - 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, - 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, - 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, - 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, - 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, - 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, - 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, - 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, - 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, - 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, - 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, - 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, - 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, - 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, - 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, - 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, - 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, - 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, - 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, - 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, - 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, - 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, - 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, - 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, - 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, - 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, - 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, - 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, - 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, - 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, - 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, - 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, - 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, - 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, - 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, - 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, - 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, - 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, - 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, - 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, - 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, - 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, - 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, - 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, - 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, - 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, - 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, - 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, - 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, - 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, - 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, - 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, - 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, - 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, - 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, - 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, - 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, - 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, - 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, - 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, - 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, - 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, - 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, - 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, - 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, - 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, - 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, - 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, - 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, - 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, - 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, - 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, - 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, - 0x04, 0x0C, 0x00, 0x01, 0x00, 0x02, 0x0D, 0x00, - 0x28, 0x00, 0x14, 0x00, 0x00, 0x38, 0x00, 0x00, - 0x6E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x8F, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x00, - 0x01, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x02, - 0x11, 0x00, 0x02, 0x00, 0x60, 0x00, 0x12, 0x00, - 0x01, 0x00, 0x01, 0x05, 0x00, 0x0E, 0x00, 0x0C, - 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, - 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, - 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, - 0x20, 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, - 0x15, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x28, 0x00, 0x00, + 0x02, 0xB0, 0x00, 0x60, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x01, 0x80, 0x4F, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE6, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xE7, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0xE8, 0x03, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x00, 0x3E, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x05, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x05, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x05, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x05, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x02, 0xA8, 0x02, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, + 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, + 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, + 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, + 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, + 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, + 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, + 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, + 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, + 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, + 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, + 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, + 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, + 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, + 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, + 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, + 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, + 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, + 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, + 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, + 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, + 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, + 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, + 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, + 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, + 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, + 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, + 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, + 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, + 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, + 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, + 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, + 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, + 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, + 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, + 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, + 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, + 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, + 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, + 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, + 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, + 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, + 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, + 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, + 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, + 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, + 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, + 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, + 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, + 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, + 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, + 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, + 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, + 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, + 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, + 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, + 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, + 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, + 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, + 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, + 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, + 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, + 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, + 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, + 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, + 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, + 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, + 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, + 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, + 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, + 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, + 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, + 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, + 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, + 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, + 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, + 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, + 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, + 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, + 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, + 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, + 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, + 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, + 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, + 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, + 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, + 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, + 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, + 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, + 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, + 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, + 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x0C, 0x00, 0x01, 0x00, 0x02, 0x0D, 0x00, + 0x28, 0x00, 0x14, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x6E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x8F, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x00, + 0x01, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x02, + 0x11, 0x00, 0x02, 0x00, 0x60, 0x00, 0x12, 0x00, + 0x01, 0x00, 0x01, 0x05, 0x00, 0x0E, 0x00, 0x0C, + 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, + 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, + 0x20, 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x15, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x28, 0x00, 0x00, }; static unsigned char vfs5011_init_09[] = { /* 2742 B */ - 0x02, 0xB0, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x09, - 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, - 0x04, 0x30, 0x01, 0x80, 0x4F, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, - 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, - 0x20, 0x04, 0x30, 0xE7, 0x03, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, - 0xFF, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x4C, 0x20, 0x04, 0x30, 0xFF, 0x03, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, - 0x04, 0x30, 0x00, 0x3E, 0x01, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x30, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, - 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x40, 0x21, 0x04, 0x30, 0x30, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x60, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, - 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xD8, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, - 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, - 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, - 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, - 0x30, 0x00, 0x02, 0xA8, 0x02, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, - 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, - 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, - 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, - 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, - 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, - 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, - 0x04, 0x0C, 0x00, 0x01, 0x00, 0x00, 0x0D, 0x00, - 0x28, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x73, 0x00, 0x00, 0x10, 0x01, 0x00, - 0x00, 0x00, 0x0E, 0x00, 0xE0, 0x00, 0x00, 0x01, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, - 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, - 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, - 0x04, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, - 0x08, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, - 0x10, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, - 0x10, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, - 0x10, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, - 0x10, 0x01, 0x08, 0x01, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, - 0x10, 0x01, 0x10, 0x01, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, - 0x10, 0x01, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, - 0x10, 0x01, 0x10, 0x01, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0x00, - 0x01, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x02, - 0x11, 0x00, 0x02, 0x00, 0x02, 0x00, 0x12, 0x00, - 0x01, 0x00, 0x0E, 0x05, 0x00, 0x0E, 0x00, 0x0C, - 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, - 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, - 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, - 0x20, 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, - 0x05, 0x00, 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, - 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x83, 0x00, 0x15, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x28, 0x00, 0x00, + 0x02, 0xB0, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x01, 0x80, 0x4F, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE7, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xFF, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0xFF, 0x03, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x00, 0x3E, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x30, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x30, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x02, 0xA8, 0x02, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x0C, 0x00, 0x01, 0x00, 0x00, 0x0D, 0x00, + 0x28, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x73, 0x00, 0x00, 0x10, 0x01, 0x00, + 0x00, 0x00, 0x0E, 0x00, 0xE0, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x04, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x08, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x10, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x10, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x10, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x10, 0x01, 0x08, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x10, 0x01, 0x10, 0x01, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x10, 0x01, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x10, 0x01, 0x10, 0x01, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0x00, + 0x01, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x02, + 0x11, 0x00, 0x02, 0x00, 0x02, 0x00, 0x12, 0x00, + 0x01, 0x00, 0x0E, 0x05, 0x00, 0x0E, 0x00, 0x0C, + 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, + 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, + 0x20, 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x05, 0x00, 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, + 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x83, 0x00, 0x15, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x28, 0x00, 0x00, }; static unsigned char vfs5011_init_10[] = { /* 2612 B */ - 0x02, 0xB0, 0x00, 0x20, 0x00, 0x03, 0x00, 0x09, - 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, - 0x04, 0x30, 0x01, 0x80, 0x4F, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, - 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, - 0x20, 0x04, 0x30, 0xE7, 0x03, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, - 0xFF, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x4C, 0x20, 0x04, 0x30, 0xFF, 0x03, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, - 0x04, 0x30, 0x00, 0x3E, 0x01, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x30, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, - 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x18, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, - 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x04, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x40, 0x21, 0x04, 0x30, 0x30, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x60, 0x21, 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, - 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, - 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, - 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, - 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, - 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, - 0x30, 0x00, 0x02, 0xA8, 0x02, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, - 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, - 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, - 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, - 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, - 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, - 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, - 0x04, 0x0C, 0x00, 0x01, 0x00, 0x01, 0x0D, 0x00, - 0x28, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, - 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0x00, - 0x00, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x1C, 0x02, 0xB0, 0x01, 0x00, - 0x00, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, - 0x01, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x02, - 0x11, 0x00, 0x02, 0x00, 0x20, 0x00, 0x12, 0x00, - 0x01, 0x00, 0x01, 0x05, 0x00, 0x0E, 0x00, 0x0C, - 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, - 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, - 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, - 0x20, 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, - 0x05, 0x00, 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, - 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x83, 0x00, 0x03, 0x00, 0x09, 0x00, 0x84, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x88, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x8C, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x90, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x94, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x98, - 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x15, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x28, 0x00, 0x00, + 0x02, 0xB0, 0x00, 0x20, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x01, 0x80, 0x4F, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE7, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xFF, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0xFF, 0x03, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x00, 0x3E, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x30, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x30, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x02, 0xA8, 0x02, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x0C, 0x00, 0x01, 0x00, 0x01, 0x0D, 0x00, + 0x28, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0x00, + 0x00, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x1C, 0x02, 0xB0, 0x01, 0x00, + 0x00, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, + 0x01, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x02, + 0x11, 0x00, 0x02, 0x00, 0x20, 0x00, 0x12, 0x00, + 0x01, 0x00, 0x01, 0x05, 0x00, 0x0E, 0x00, 0x0C, + 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, + 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, + 0x20, 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x05, 0x00, 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, + 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x83, 0x00, 0x03, 0x00, 0x09, 0x00, 0x84, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x88, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x8C, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x90, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x94, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x98, + 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x15, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x28, 0x00, 0x00, }; static unsigned char vfs5011_init_11[] = { /* 2625 B */ - 0x02, 0xB0, 0x00, 0x20, 0x00, 0x03, 0x00, 0x09, - 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, - 0x04, 0x30, 0x01, 0x80, 0x4F, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, - 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, - 0x20, 0x04, 0x30, 0xE6, 0x03, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, - 0xE7, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x4C, 0x20, 0x04, 0x30, 0xE8, 0x03, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, - 0x04, 0x30, 0x00, 0x3E, 0x01, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, - 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x40, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, - 0x30, 0x08, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xD8, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, - 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x08, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, - 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, - 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, - 0x30, 0x00, 0x02, 0xA8, 0x02, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, - 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, - 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, - 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, - 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, - 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, - 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, - 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, - 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, - 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, - 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, - 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, - 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, - 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, - 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, - 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, - 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, - 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, - 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, - 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, - 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, - 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, - 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, - 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, - 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, - 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, - 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, - 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, - 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, - 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, - 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, - 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, - 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, - 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, - 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, - 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, - 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, - 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, - 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, - 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, - 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, - 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, - 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, - 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, - 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, - 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, - 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, - 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, - 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, - 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, - 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, - 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, - 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, - 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, - 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, - 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, - 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, - 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, - 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, - 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, - 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, - 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, - 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, - 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, - 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, - 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, - 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, - 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, - 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, - 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, - 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, - 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, - 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, - 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, - 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, - 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, - 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, - 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, - 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, - 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, - 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, - 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, - 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, - 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, - 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, - 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, - 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, - 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, - 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, - 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, - 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, - 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, - 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, - 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, - 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, - 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, - 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, - 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, - 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, - 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, - 0x04, 0x0C, 0x00, 0x01, 0x00, 0x01, 0x0D, 0x00, - 0x28, 0x00, 0x20, 0x21, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, - 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0x00, - 0x00, 0x00, 0x20, 0x21, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x1C, 0x02, 0xB0, 0x01, 0x00, - 0x00, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x00, - 0x01, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x02, - 0x11, 0x00, 0x02, 0x00, 0x20, 0x00, 0x12, 0x00, - 0x01, 0x00, 0x01, 0x05, 0x00, 0x0E, 0x00, 0x0C, - 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, - 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, - 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, - 0x20, 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, - 0x05, 0x00, 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, - 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x83, 0x00, 0x03, 0x00, 0x09, 0x00, 0x84, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x88, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x8C, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x90, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x94, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x98, - 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x15, 0x00, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x28, 0x00, - 0x00, + 0x02, 0xB0, 0x00, 0x20, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x01, 0x80, 0x4F, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE6, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xE7, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0xE8, 0x03, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x00, 0x3E, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x08, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x08, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x02, 0xA8, 0x02, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, + 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, + 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, + 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, + 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, + 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, + 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, + 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, + 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, + 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, + 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, + 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, + 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, + 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, + 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, + 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, + 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, + 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, + 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, + 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, + 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, + 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, + 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, + 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, + 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, + 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, + 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, + 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, + 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, + 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, + 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, + 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, + 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, + 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, + 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, + 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, + 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, + 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, + 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, + 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, + 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, + 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, + 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, + 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, + 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, + 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, + 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, + 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, + 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, + 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, + 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, + 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, + 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, + 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, + 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, + 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, + 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, + 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, + 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, + 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, + 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, + 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, + 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, + 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, + 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, + 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, + 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, + 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, + 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, + 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, + 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, + 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, + 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, + 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, + 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, + 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, + 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, + 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, + 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, + 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, + 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, + 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, + 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, + 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, + 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, + 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, + 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, + 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, + 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, + 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, + 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, + 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x0C, 0x00, 0x01, 0x00, 0x01, 0x0D, 0x00, + 0x28, 0x00, 0x20, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0x00, + 0x00, 0x00, 0x20, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x1C, 0x02, 0xB0, 0x01, 0x00, + 0x00, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x00, + 0x01, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x02, + 0x11, 0x00, 0x02, 0x00, 0x20, 0x00, 0x12, 0x00, + 0x01, 0x00, 0x01, 0x05, 0x00, 0x0E, 0x00, 0x0C, + 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, + 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, + 0x20, 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x05, 0x00, 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, + 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x83, 0x00, 0x03, 0x00, 0x09, 0x00, 0x84, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x88, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x8C, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x90, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x94, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x98, + 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x15, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x28, 0x00, + 0x00, }; static unsigned char vfs5011_init_12[] = { /* 2666 B */ - 0x02, 0xF0, 0x00, 0x0E, 0x00, 0x03, 0x00, 0x09, - 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, - 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, - 0x20, 0x04, 0x30, 0xE5, 0x03, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, - 0xEA, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x4C, 0x20, 0x04, 0x30, 0x0A, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, - 0x04, 0x30, 0x01, 0xDE, 0x01, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, - 0x30, 0x02, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, - 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x40, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, - 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, - 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, - 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, - 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, - 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, - 0x30, 0x00, 0x00, 0x74, 0x01, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, - 0x74, 0x01, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, - 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, - 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, - 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, - 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, - 0xFF, 0xF9, 0x87, 0x20, 0xBB, 0xF8, 0x87, 0x00, - 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, - 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, - 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x07, 0x20, - 0xBA, 0xF8, 0x07, 0x20, 0xB9, 0xF8, 0x07, 0x20, - 0xB8, 0xF8, 0x07, 0x20, 0xB7, 0xF8, 0x07, 0x20, - 0xB6, 0xF8, 0x07, 0x20, 0xB5, 0xF8, 0x07, 0x20, - 0xB4, 0xF8, 0x07, 0x20, 0xB3, 0xF8, 0x07, 0x20, - 0xB2, 0xF8, 0x07, 0x20, 0xB1, 0xF8, 0x07, 0x22, - 0xB0, 0xF8, 0x07, 0x22, 0xAF, 0xF8, 0x07, 0x22, - 0xAE, 0xF8, 0x07, 0x22, 0xAD, 0xF8, 0x07, 0x22, - 0xAC, 0xF8, 0x07, 0x22, 0xAB, 0xF8, 0x07, 0x22, - 0xAA, 0xF8, 0x07, 0x22, 0xA9, 0xF8, 0x07, 0x22, - 0xA8, 0xF8, 0x07, 0x22, 0xA7, 0xF8, 0x07, 0x22, - 0xA6, 0xF8, 0x07, 0x22, 0xA5, 0xF8, 0x07, 0x22, - 0xA4, 0xF8, 0x07, 0x22, 0xA3, 0xF8, 0x07, 0x22, - 0xA2, 0xF8, 0x07, 0x22, 0xA1, 0xF8, 0x07, 0x22, - 0xA0, 0xF8, 0x07, 0x22, 0x9F, 0xF8, 0x07, 0x22, - 0x9E, 0xF8, 0x07, 0x22, 0x9D, 0xF8, 0x07, 0x22, - 0x9C, 0xF8, 0x07, 0x22, 0x9B, 0xF8, 0x07, 0x22, - 0x9A, 0xF8, 0x07, 0x22, 0x99, 0xF8, 0x07, 0x22, - 0x98, 0xF8, 0x07, 0x22, 0x97, 0xF8, 0x07, 0x22, - 0x96, 0xF8, 0x07, 0x22, 0x95, 0xF8, 0x07, 0x22, - 0x94, 0xF8, 0x07, 0x22, 0x93, 0xF8, 0x07, 0x22, - 0x92, 0xF8, 0x07, 0x22, 0x91, 0xF8, 0x07, 0x22, - 0x90, 0xF8, 0x07, 0x22, 0x8F, 0xF8, 0x07, 0x22, - 0x8E, 0xF8, 0x07, 0x22, 0x8D, 0xF8, 0x07, 0x22, - 0x8C, 0xF8, 0x07, 0x22, 0x8B, 0xF8, 0x07, 0x22, - 0x8A, 0xF8, 0x07, 0x22, 0x89, 0xF8, 0x07, 0x22, - 0x88, 0xF8, 0x07, 0x22, 0x87, 0xF8, 0x07, 0x22, - 0x86, 0xF8, 0x07, 0x22, 0x85, 0xF8, 0x07, 0x22, - 0x84, 0xF8, 0x07, 0x22, 0x83, 0xF8, 0x07, 0x22, - 0x82, 0xF8, 0x07, 0x22, 0x81, 0xF8, 0x07, 0x22, - 0x80, 0xF8, 0x07, 0x22, 0x7F, 0xF8, 0x07, 0x22, - 0x7E, 0xF8, 0x07, 0x22, 0x7D, 0xF8, 0x07, 0x22, - 0x7C, 0xF8, 0x07, 0x22, 0x7B, 0xF8, 0x07, 0x22, - 0x7A, 0xF8, 0x07, 0x22, 0x79, 0xF8, 0x07, 0x22, - 0x78, 0xF8, 0x07, 0x22, 0x77, 0xF8, 0x07, 0x22, - 0x76, 0xF8, 0x07, 0x22, 0x75, 0xF8, 0x07, 0x22, - 0x74, 0xF8, 0x07, 0x22, 0x73, 0xF8, 0x07, 0x22, - 0x72, 0xF8, 0x07, 0x22, 0x71, 0xF8, 0x07, 0x22, - 0x70, 0xF8, 0x07, 0x22, 0x6F, 0xF8, 0x07, 0x22, - 0x6E, 0xF8, 0x07, 0x22, 0x6D, 0xF8, 0x07, 0x22, - 0x6C, 0xF8, 0x07, 0x22, 0x6B, 0xF8, 0x07, 0x22, - 0x6A, 0xF8, 0x07, 0x22, 0x69, 0xF8, 0x07, 0x22, - 0x68, 0xF8, 0x07, 0x22, 0x67, 0xF8, 0x07, 0x22, - 0x66, 0xF8, 0x07, 0x22, 0x65, 0xF8, 0x07, 0x22, - 0x64, 0xF8, 0x07, 0x22, 0x63, 0xF8, 0x07, 0x22, - 0x62, 0xF8, 0x07, 0x22, 0x61, 0xF8, 0x07, 0x22, - 0x60, 0xF8, 0x07, 0x22, 0x5F, 0xF8, 0x07, 0x22, - 0x5E, 0xF8, 0x07, 0x22, 0x5D, 0xF8, 0x07, 0x22, - 0x5C, 0xF8, 0x07, 0x22, 0x5B, 0xF8, 0x07, 0x22, - 0x5A, 0xF8, 0x07, 0x22, 0x59, 0xF8, 0x07, 0x22, - 0x58, 0xF8, 0x07, 0x22, 0x57, 0xF8, 0x07, 0x22, - 0x56, 0xF8, 0x07, 0x22, 0x55, 0xF8, 0x07, 0x22, - 0x54, 0xF8, 0x07, 0x22, 0x53, 0xF8, 0x07, 0x22, - 0x52, 0xF8, 0x07, 0x22, 0x51, 0xF8, 0x07, 0x22, - 0x50, 0xF8, 0x07, 0x22, 0x4F, 0xF8, 0x07, 0x22, - 0x4E, 0xF8, 0x07, 0x22, 0x4D, 0xF8, 0x07, 0x22, - 0x4C, 0xF8, 0x07, 0x22, 0x4B, 0xF8, 0x07, 0x22, - 0x4A, 0xF8, 0x07, 0x22, 0x49, 0xF8, 0x07, 0x22, - 0x48, 0xF8, 0x07, 0x22, 0x47, 0xF8, 0x07, 0x22, - 0x46, 0xF8, 0x07, 0x22, 0x45, 0xF8, 0x07, 0x22, - 0x44, 0xF8, 0x07, 0x22, 0x43, 0xF8, 0x07, 0x22, - 0x42, 0xF8, 0x07, 0x22, 0x41, 0xF8, 0x07, 0x22, - 0x40, 0xF8, 0x07, 0x22, 0x3F, 0xF8, 0x07, 0x22, - 0x3E, 0xF8, 0x07, 0x22, 0x3D, 0xF8, 0x07, 0x22, - 0x3C, 0xF8, 0x07, 0x22, 0x3B, 0xF8, 0x07, 0x22, - 0x3A, 0xF8, 0x07, 0x22, 0x39, 0xF8, 0x07, 0x22, - 0x38, 0xF8, 0x07, 0x22, 0x37, 0xF8, 0x07, 0x22, - 0x36, 0xF8, 0x07, 0x22, 0x35, 0xF8, 0x07, 0x22, - 0x34, 0xF8, 0x07, 0x22, 0x33, 0xF8, 0x07, 0x22, - 0x32, 0xF8, 0x07, 0x22, 0x31, 0xF8, 0x07, 0x22, - 0x30, 0xF8, 0x07, 0x22, 0x2F, 0xF8, 0x07, 0x22, - 0x2E, 0xF8, 0x07, 0x22, 0x2D, 0xF8, 0x07, 0x22, - 0x2C, 0xF8, 0x07, 0x22, 0x2B, 0xF8, 0x07, 0x22, - 0x2A, 0xF8, 0x07, 0x22, 0x29, 0xF8, 0x07, 0x22, - 0x28, 0xF8, 0x07, 0x22, 0x27, 0xF8, 0x07, 0x22, - 0x26, 0xF8, 0x07, 0x22, 0x25, 0xF8, 0x07, 0x22, - 0x24, 0xF8, 0x07, 0x22, 0x23, 0xF8, 0x07, 0x20, - 0x22, 0xF8, 0x07, 0x20, 0x21, 0xF8, 0x07, 0x20, - 0x20, 0xF8, 0x07, 0x20, 0x1F, 0xF8, 0x07, 0x20, - 0x1E, 0xF8, 0x07, 0x20, 0x1D, 0xF8, 0x07, 0x20, - 0x1C, 0xF8, 0x07, 0x20, 0x1C, 0xF8, 0x07, 0x00, - 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, - 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, - 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, - 0xD8, 0xF8, 0x27, 0x20, 0xD9, 0xF8, 0x27, 0x20, - 0xDA, 0xF8, 0x27, 0x20, 0xDB, 0xF8, 0x27, 0x20, - 0xDC, 0xF8, 0x27, 0x20, 0xDD, 0xF8, 0x27, 0x20, - 0xDE, 0xF8, 0x27, 0x20, 0xDF, 0xF8, 0x27, 0x20, - 0xE0, 0xF8, 0x27, 0x20, 0xE1, 0xF8, 0x27, 0x20, - 0xE2, 0xF8, 0x27, 0x20, 0xE3, 0xF8, 0x27, 0x20, - 0xE4, 0xF8, 0x27, 0x20, 0xE5, 0xF8, 0x27, 0x20, - 0xE6, 0xF8, 0x27, 0x20, 0xE7, 0xF8, 0x27, 0x20, - 0xE8, 0xF8, 0x27, 0x20, 0xE9, 0xF8, 0x27, 0x20, - 0xEA, 0xF8, 0x27, 0x20, 0xEB, 0xF8, 0x27, 0x20, - 0xEC, 0xF8, 0x27, 0x20, 0xED, 0xF8, 0x27, 0x20, - 0xEE, 0xF8, 0x27, 0x20, 0xEF, 0xF8, 0x27, 0x20, - 0xF0, 0xF8, 0x27, 0x20, 0xF1, 0xF8, 0x27, 0x20, - 0xF2, 0xF8, 0x27, 0x20, 0xF3, 0xF8, 0x27, 0x20, - 0xF4, 0xF8, 0x27, 0x20, 0xF5, 0xF8, 0x27, 0x20, - 0xF6, 0xF8, 0x27, 0x20, 0xF7, 0xF8, 0x27, 0x20, - 0xF8, 0xF8, 0x27, 0x20, 0xF9, 0xF8, 0x27, 0x20, - 0xFA, 0xF8, 0x27, 0x20, 0xFB, 0xF8, 0x27, 0x20, - 0xFC, 0xF8, 0x27, 0x20, 0xFD, 0xF8, 0x27, 0x20, - 0xFE, 0xF8, 0x27, 0x20, 0xFF, 0xF8, 0x27, 0x20, - 0x00, 0xF9, 0x27, 0x20, 0xD7, 0xF8, 0x27, 0x20, - 0x00, 0xF8, 0x27, 0x20, 0x01, 0xF8, 0x27, 0x20, - 0x02, 0xF8, 0x27, 0x20, 0x03, 0xF8, 0x27, 0x20, - 0x04, 0xF8, 0x27, 0x20, 0x05, 0xF8, 0x27, 0x20, - 0x06, 0xF8, 0x27, 0x20, 0x07, 0xF8, 0x27, 0x20, - 0x08, 0xF8, 0x27, 0x20, 0x09, 0xF8, 0x27, 0x20, - 0x0A, 0xF8, 0x27, 0x20, 0x0B, 0xF8, 0x27, 0x20, - 0x0C, 0xF8, 0x27, 0x20, 0x0D, 0xF8, 0x27, 0x20, - 0x0E, 0xF8, 0x27, 0x20, 0x0F, 0xF8, 0x27, 0x20, - 0x10, 0xF8, 0x27, 0x20, 0x11, 0xF8, 0x27, 0x20, - 0x12, 0xF8, 0x27, 0x20, 0x13, 0xF8, 0x27, 0x20, - 0x14, 0xF8, 0x27, 0x20, 0x15, 0xF8, 0x27, 0x20, - 0x15, 0xF8, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, - 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, - 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, - 0x04, 0x0C, 0x00, 0x01, 0x00, 0x04, 0x11, 0x00, - 0x02, 0x00, 0x0E, 0x00, 0x13, 0x00, 0x04, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x14, 0x00, 0x04, 0x00, - 0x1E, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x0A, 0x00, - 0x08, 0x00, 0xA8, 0x00, 0xE6, 0x82, 0xA0, 0x0A, - 0x26, 0x06, 0x07, 0x00, 0x3C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0x78, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0xA2, 0x55, 0x03, 0xD3, 0xA2, - 0x5D, 0x00, 0x18, 0xA2, 0x55, 0x03, 0xD3, 0xA2, - 0x5D, 0x00, 0x18, 0xA2, 0x55, 0x03, 0x20, 0x80, - 0x80, 0x00, 0xFF, 0x10, 0x0F, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, - 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, 0x0C, 0x20, - 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, - 0x10, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, 0x00, - 0x09, 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, 0x20, - 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x05, - 0x00, 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, 0x00, - 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, - 0x00, 0x03, 0x00, 0x09, 0x00, 0x84, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x88, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x8C, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x90, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x94, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x98, 0x21, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x20, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x60, 0x21, 0x04, - 0x30, 0x08, 0x00, 0x00, 0x00, 0x04, 0x15, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x28, - 0x00, 0x00, + 0x02, 0xF0, 0x00, 0x0E, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE5, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xEA, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0x0A, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x01, 0xDE, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x02, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x00, 0x74, 0x01, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x74, 0x01, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0xF9, 0x87, 0x20, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x07, 0x20, + 0xBA, 0xF8, 0x07, 0x20, 0xB9, 0xF8, 0x07, 0x20, + 0xB8, 0xF8, 0x07, 0x20, 0xB7, 0xF8, 0x07, 0x20, + 0xB6, 0xF8, 0x07, 0x20, 0xB5, 0xF8, 0x07, 0x20, + 0xB4, 0xF8, 0x07, 0x20, 0xB3, 0xF8, 0x07, 0x20, + 0xB2, 0xF8, 0x07, 0x20, 0xB1, 0xF8, 0x07, 0x22, + 0xB0, 0xF8, 0x07, 0x22, 0xAF, 0xF8, 0x07, 0x22, + 0xAE, 0xF8, 0x07, 0x22, 0xAD, 0xF8, 0x07, 0x22, + 0xAC, 0xF8, 0x07, 0x22, 0xAB, 0xF8, 0x07, 0x22, + 0xAA, 0xF8, 0x07, 0x22, 0xA9, 0xF8, 0x07, 0x22, + 0xA8, 0xF8, 0x07, 0x22, 0xA7, 0xF8, 0x07, 0x22, + 0xA6, 0xF8, 0x07, 0x22, 0xA5, 0xF8, 0x07, 0x22, + 0xA4, 0xF8, 0x07, 0x22, 0xA3, 0xF8, 0x07, 0x22, + 0xA2, 0xF8, 0x07, 0x22, 0xA1, 0xF8, 0x07, 0x22, + 0xA0, 0xF8, 0x07, 0x22, 0x9F, 0xF8, 0x07, 0x22, + 0x9E, 0xF8, 0x07, 0x22, 0x9D, 0xF8, 0x07, 0x22, + 0x9C, 0xF8, 0x07, 0x22, 0x9B, 0xF8, 0x07, 0x22, + 0x9A, 0xF8, 0x07, 0x22, 0x99, 0xF8, 0x07, 0x22, + 0x98, 0xF8, 0x07, 0x22, 0x97, 0xF8, 0x07, 0x22, + 0x96, 0xF8, 0x07, 0x22, 0x95, 0xF8, 0x07, 0x22, + 0x94, 0xF8, 0x07, 0x22, 0x93, 0xF8, 0x07, 0x22, + 0x92, 0xF8, 0x07, 0x22, 0x91, 0xF8, 0x07, 0x22, + 0x90, 0xF8, 0x07, 0x22, 0x8F, 0xF8, 0x07, 0x22, + 0x8E, 0xF8, 0x07, 0x22, 0x8D, 0xF8, 0x07, 0x22, + 0x8C, 0xF8, 0x07, 0x22, 0x8B, 0xF8, 0x07, 0x22, + 0x8A, 0xF8, 0x07, 0x22, 0x89, 0xF8, 0x07, 0x22, + 0x88, 0xF8, 0x07, 0x22, 0x87, 0xF8, 0x07, 0x22, + 0x86, 0xF8, 0x07, 0x22, 0x85, 0xF8, 0x07, 0x22, + 0x84, 0xF8, 0x07, 0x22, 0x83, 0xF8, 0x07, 0x22, + 0x82, 0xF8, 0x07, 0x22, 0x81, 0xF8, 0x07, 0x22, + 0x80, 0xF8, 0x07, 0x22, 0x7F, 0xF8, 0x07, 0x22, + 0x7E, 0xF8, 0x07, 0x22, 0x7D, 0xF8, 0x07, 0x22, + 0x7C, 0xF8, 0x07, 0x22, 0x7B, 0xF8, 0x07, 0x22, + 0x7A, 0xF8, 0x07, 0x22, 0x79, 0xF8, 0x07, 0x22, + 0x78, 0xF8, 0x07, 0x22, 0x77, 0xF8, 0x07, 0x22, + 0x76, 0xF8, 0x07, 0x22, 0x75, 0xF8, 0x07, 0x22, + 0x74, 0xF8, 0x07, 0x22, 0x73, 0xF8, 0x07, 0x22, + 0x72, 0xF8, 0x07, 0x22, 0x71, 0xF8, 0x07, 0x22, + 0x70, 0xF8, 0x07, 0x22, 0x6F, 0xF8, 0x07, 0x22, + 0x6E, 0xF8, 0x07, 0x22, 0x6D, 0xF8, 0x07, 0x22, + 0x6C, 0xF8, 0x07, 0x22, 0x6B, 0xF8, 0x07, 0x22, + 0x6A, 0xF8, 0x07, 0x22, 0x69, 0xF8, 0x07, 0x22, + 0x68, 0xF8, 0x07, 0x22, 0x67, 0xF8, 0x07, 0x22, + 0x66, 0xF8, 0x07, 0x22, 0x65, 0xF8, 0x07, 0x22, + 0x64, 0xF8, 0x07, 0x22, 0x63, 0xF8, 0x07, 0x22, + 0x62, 0xF8, 0x07, 0x22, 0x61, 0xF8, 0x07, 0x22, + 0x60, 0xF8, 0x07, 0x22, 0x5F, 0xF8, 0x07, 0x22, + 0x5E, 0xF8, 0x07, 0x22, 0x5D, 0xF8, 0x07, 0x22, + 0x5C, 0xF8, 0x07, 0x22, 0x5B, 0xF8, 0x07, 0x22, + 0x5A, 0xF8, 0x07, 0x22, 0x59, 0xF8, 0x07, 0x22, + 0x58, 0xF8, 0x07, 0x22, 0x57, 0xF8, 0x07, 0x22, + 0x56, 0xF8, 0x07, 0x22, 0x55, 0xF8, 0x07, 0x22, + 0x54, 0xF8, 0x07, 0x22, 0x53, 0xF8, 0x07, 0x22, + 0x52, 0xF8, 0x07, 0x22, 0x51, 0xF8, 0x07, 0x22, + 0x50, 0xF8, 0x07, 0x22, 0x4F, 0xF8, 0x07, 0x22, + 0x4E, 0xF8, 0x07, 0x22, 0x4D, 0xF8, 0x07, 0x22, + 0x4C, 0xF8, 0x07, 0x22, 0x4B, 0xF8, 0x07, 0x22, + 0x4A, 0xF8, 0x07, 0x22, 0x49, 0xF8, 0x07, 0x22, + 0x48, 0xF8, 0x07, 0x22, 0x47, 0xF8, 0x07, 0x22, + 0x46, 0xF8, 0x07, 0x22, 0x45, 0xF8, 0x07, 0x22, + 0x44, 0xF8, 0x07, 0x22, 0x43, 0xF8, 0x07, 0x22, + 0x42, 0xF8, 0x07, 0x22, 0x41, 0xF8, 0x07, 0x22, + 0x40, 0xF8, 0x07, 0x22, 0x3F, 0xF8, 0x07, 0x22, + 0x3E, 0xF8, 0x07, 0x22, 0x3D, 0xF8, 0x07, 0x22, + 0x3C, 0xF8, 0x07, 0x22, 0x3B, 0xF8, 0x07, 0x22, + 0x3A, 0xF8, 0x07, 0x22, 0x39, 0xF8, 0x07, 0x22, + 0x38, 0xF8, 0x07, 0x22, 0x37, 0xF8, 0x07, 0x22, + 0x36, 0xF8, 0x07, 0x22, 0x35, 0xF8, 0x07, 0x22, + 0x34, 0xF8, 0x07, 0x22, 0x33, 0xF8, 0x07, 0x22, + 0x32, 0xF8, 0x07, 0x22, 0x31, 0xF8, 0x07, 0x22, + 0x30, 0xF8, 0x07, 0x22, 0x2F, 0xF8, 0x07, 0x22, + 0x2E, 0xF8, 0x07, 0x22, 0x2D, 0xF8, 0x07, 0x22, + 0x2C, 0xF8, 0x07, 0x22, 0x2B, 0xF8, 0x07, 0x22, + 0x2A, 0xF8, 0x07, 0x22, 0x29, 0xF8, 0x07, 0x22, + 0x28, 0xF8, 0x07, 0x22, 0x27, 0xF8, 0x07, 0x22, + 0x26, 0xF8, 0x07, 0x22, 0x25, 0xF8, 0x07, 0x22, + 0x24, 0xF8, 0x07, 0x22, 0x23, 0xF8, 0x07, 0x20, + 0x22, 0xF8, 0x07, 0x20, 0x21, 0xF8, 0x07, 0x20, + 0x20, 0xF8, 0x07, 0x20, 0x1F, 0xF8, 0x07, 0x20, + 0x1E, 0xF8, 0x07, 0x20, 0x1D, 0xF8, 0x07, 0x20, + 0x1C, 0xF8, 0x07, 0x20, 0x1C, 0xF8, 0x07, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD8, 0xF8, 0x27, 0x20, 0xD9, 0xF8, 0x27, 0x20, + 0xDA, 0xF8, 0x27, 0x20, 0xDB, 0xF8, 0x27, 0x20, + 0xDC, 0xF8, 0x27, 0x20, 0xDD, 0xF8, 0x27, 0x20, + 0xDE, 0xF8, 0x27, 0x20, 0xDF, 0xF8, 0x27, 0x20, + 0xE0, 0xF8, 0x27, 0x20, 0xE1, 0xF8, 0x27, 0x20, + 0xE2, 0xF8, 0x27, 0x20, 0xE3, 0xF8, 0x27, 0x20, + 0xE4, 0xF8, 0x27, 0x20, 0xE5, 0xF8, 0x27, 0x20, + 0xE6, 0xF8, 0x27, 0x20, 0xE7, 0xF8, 0x27, 0x20, + 0xE8, 0xF8, 0x27, 0x20, 0xE9, 0xF8, 0x27, 0x20, + 0xEA, 0xF8, 0x27, 0x20, 0xEB, 0xF8, 0x27, 0x20, + 0xEC, 0xF8, 0x27, 0x20, 0xED, 0xF8, 0x27, 0x20, + 0xEE, 0xF8, 0x27, 0x20, 0xEF, 0xF8, 0x27, 0x20, + 0xF0, 0xF8, 0x27, 0x20, 0xF1, 0xF8, 0x27, 0x20, + 0xF2, 0xF8, 0x27, 0x20, 0xF3, 0xF8, 0x27, 0x20, + 0xF4, 0xF8, 0x27, 0x20, 0xF5, 0xF8, 0x27, 0x20, + 0xF6, 0xF8, 0x27, 0x20, 0xF7, 0xF8, 0x27, 0x20, + 0xF8, 0xF8, 0x27, 0x20, 0xF9, 0xF8, 0x27, 0x20, + 0xFA, 0xF8, 0x27, 0x20, 0xFB, 0xF8, 0x27, 0x20, + 0xFC, 0xF8, 0x27, 0x20, 0xFD, 0xF8, 0x27, 0x20, + 0xFE, 0xF8, 0x27, 0x20, 0xFF, 0xF8, 0x27, 0x20, + 0x00, 0xF9, 0x27, 0x20, 0xD7, 0xF8, 0x27, 0x20, + 0x00, 0xF8, 0x27, 0x20, 0x01, 0xF8, 0x27, 0x20, + 0x02, 0xF8, 0x27, 0x20, 0x03, 0xF8, 0x27, 0x20, + 0x04, 0xF8, 0x27, 0x20, 0x05, 0xF8, 0x27, 0x20, + 0x06, 0xF8, 0x27, 0x20, 0x07, 0xF8, 0x27, 0x20, + 0x08, 0xF8, 0x27, 0x20, 0x09, 0xF8, 0x27, 0x20, + 0x0A, 0xF8, 0x27, 0x20, 0x0B, 0xF8, 0x27, 0x20, + 0x0C, 0xF8, 0x27, 0x20, 0x0D, 0xF8, 0x27, 0x20, + 0x0E, 0xF8, 0x27, 0x20, 0x0F, 0xF8, 0x27, 0x20, + 0x10, 0xF8, 0x27, 0x20, 0x11, 0xF8, 0x27, 0x20, + 0x12, 0xF8, 0x27, 0x20, 0x13, 0xF8, 0x27, 0x20, + 0x14, 0xF8, 0x27, 0x20, 0x15, 0xF8, 0x27, 0x20, + 0x15, 0xF8, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x0C, 0x00, 0x01, 0x00, 0x04, 0x11, 0x00, + 0x02, 0x00, 0x0E, 0x00, 0x13, 0x00, 0x04, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x14, 0x00, 0x04, 0x00, + 0x1E, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x0A, 0x00, + 0x08, 0x00, 0xA8, 0x00, 0xE6, 0x82, 0xA0, 0x0A, + 0x26, 0x06, 0x07, 0x00, 0x3C, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0x78, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0xA2, 0x55, 0x03, 0xD3, 0xA2, + 0x5D, 0x00, 0x18, 0xA2, 0x55, 0x03, 0xD3, 0xA2, + 0x5D, 0x00, 0x18, 0xA2, 0x55, 0x03, 0x20, 0x80, + 0x80, 0x00, 0xFF, 0x10, 0x0F, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, + 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, 0x0C, 0x20, + 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, + 0x10, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, 0x00, + 0x09, 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, 0x20, + 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x05, + 0x00, 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, 0x00, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, + 0x00, 0x03, 0x00, 0x09, 0x00, 0x84, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x88, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x8C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x90, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x94, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x98, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x20, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x60, 0x21, 0x04, + 0x30, 0x08, 0x00, 0x00, 0x00, 0x04, 0x15, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x28, + 0x00, 0x00, }; static unsigned char vfs5011_init_13[] = { /* 57 B */ - 0x12, 0x90, 0x02, 0x00, 0x00, 0xFE, 0x03, 0x00, - 0x00, 0xFF, 0x1F, 0xFF, 0x1F, 0x00, 0x00, 0x00, - 0x00, 0x18, 0xA2, 0x55, 0x03, 0xD3, 0xA2, 0x5D, - 0x00, 0x18, 0xA2, 0x55, 0x03, 0xD3, 0xA2, 0x5D, - 0x00, 0x18, 0xA2, 0x55, 0x03, 0x20, 0xFF, 0x80, - 0x00, 0xFF, 0x04, 0x0F, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x00, - 0x00, + 0x12, 0x90, 0x02, 0x00, 0x00, 0xFE, 0x03, 0x00, + 0x00, 0xFF, 0x1F, 0xFF, 0x1F, 0x00, 0x00, 0x00, + 0x00, 0x18, 0xA2, 0x55, 0x03, 0xD3, 0xA2, 0x5D, + 0x00, 0x18, 0xA2, 0x55, 0x03, 0xD3, 0xA2, 0x5D, + 0x00, 0x18, 0xA2, 0x55, 0x03, 0x20, 0xFF, 0x80, + 0x00, 0xFF, 0x04, 0x0F, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x00, + 0x00, }; static unsigned char vfs5011_init_14[] = { /* 2561 B */ - 0x02, 0xF0, 0x00, 0x14, 0x00, 0x03, 0x00, 0x09, - 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, - 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, - 0x20, 0x04, 0x30, 0xE5, 0x03, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, - 0xEA, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x4C, 0x20, 0x04, 0x30, 0x0A, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, - 0x04, 0x30, 0x01, 0xDE, 0x01, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, - 0x30, 0x02, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, - 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x40, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, - 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, - 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, - 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, - 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, - 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, - 0x30, 0x00, 0x00, 0x74, 0x01, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, - 0x74, 0x01, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, - 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, - 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, - 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, - 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, - 0xFF, 0xF9, 0x87, 0x20, 0xBB, 0xF8, 0x87, 0x00, - 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, - 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, - 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x07, 0x20, - 0xBA, 0xF8, 0x07, 0x20, 0xB9, 0xF8, 0x07, 0x20, - 0xB8, 0xF8, 0x07, 0x20, 0xB7, 0xF8, 0x07, 0x20, - 0xB6, 0xF8, 0x07, 0x20, 0xB5, 0xF8, 0x07, 0x20, - 0xB4, 0xF8, 0x07, 0x20, 0xB3, 0xF8, 0x07, 0x20, - 0xB2, 0xF8, 0x07, 0x20, 0xB1, 0xF8, 0x07, 0x22, - 0xB0, 0xF8, 0x07, 0x22, 0xAF, 0xF8, 0x07, 0x22, - 0xAE, 0xF8, 0x07, 0x22, 0xAD, 0xF8, 0x07, 0x22, - 0xAC, 0xF8, 0x07, 0x22, 0xAB, 0xF8, 0x07, 0x22, - 0xAA, 0xF8, 0x07, 0x22, 0xA9, 0xF8, 0x07, 0x22, - 0xA8, 0xF8, 0x07, 0x22, 0xA7, 0xF8, 0x07, 0x22, - 0xA6, 0xF8, 0x07, 0x22, 0xA5, 0xF8, 0x07, 0x22, - 0xA4, 0xF8, 0x07, 0x22, 0xA3, 0xF8, 0x07, 0x22, - 0xA2, 0xF8, 0x07, 0x22, 0xA1, 0xF8, 0x07, 0x22, - 0xA0, 0xF8, 0x07, 0x22, 0x9F, 0xF8, 0x07, 0x22, - 0x9E, 0xF8, 0x07, 0x22, 0x9D, 0xF8, 0x07, 0x22, - 0x9C, 0xF8, 0x07, 0x22, 0x9B, 0xF8, 0x07, 0x22, - 0x9A, 0xF8, 0x07, 0x22, 0x99, 0xF8, 0x07, 0x22, - 0x98, 0xF8, 0x07, 0x22, 0x97, 0xF8, 0x07, 0x22, - 0x96, 0xF8, 0x07, 0x22, 0x95, 0xF8, 0x07, 0x22, - 0x94, 0xF8, 0x07, 0x22, 0x93, 0xF8, 0x07, 0x22, - 0x92, 0xF8, 0x07, 0x22, 0x91, 0xF8, 0x07, 0x22, - 0x90, 0xF8, 0x07, 0x22, 0x8F, 0xF8, 0x07, 0x22, - 0x8E, 0xF8, 0x07, 0x22, 0x8D, 0xF8, 0x07, 0x22, - 0x8C, 0xF8, 0x07, 0x22, 0x8B, 0xF8, 0x07, 0x22, - 0x8A, 0xF8, 0x07, 0x22, 0x89, 0xF8, 0x07, 0x22, - 0x88, 0xF8, 0x07, 0x22, 0x87, 0xF8, 0x07, 0x22, - 0x86, 0xF8, 0x07, 0x22, 0x85, 0xF8, 0x07, 0x22, - 0x84, 0xF8, 0x07, 0x22, 0x83, 0xF8, 0x07, 0x22, - 0x82, 0xF8, 0x07, 0x22, 0x81, 0xF8, 0x07, 0x22, - 0x80, 0xF8, 0x07, 0x22, 0x7F, 0xF8, 0x07, 0x22, - 0x7E, 0xF8, 0x07, 0x22, 0x7D, 0xF8, 0x07, 0x22, - 0x7C, 0xF8, 0x07, 0x22, 0x7B, 0xF8, 0x07, 0x22, - 0x7A, 0xF8, 0x07, 0x22, 0x79, 0xF8, 0x07, 0x22, - 0x78, 0xF8, 0x07, 0x22, 0x77, 0xF8, 0x07, 0x22, - 0x76, 0xF8, 0x07, 0x22, 0x75, 0xF8, 0x07, 0x22, - 0x74, 0xF8, 0x07, 0x22, 0x73, 0xF8, 0x07, 0x22, - 0x72, 0xF8, 0x07, 0x22, 0x71, 0xF8, 0x07, 0x22, - 0x70, 0xF8, 0x07, 0x22, 0x6F, 0xF8, 0x07, 0x22, - 0x6E, 0xF8, 0x07, 0x22, 0x6D, 0xF8, 0x07, 0x22, - 0x6C, 0xF8, 0x07, 0x22, 0x6B, 0xF8, 0x07, 0x22, - 0x6A, 0xF8, 0x07, 0x22, 0x69, 0xF8, 0x07, 0x22, - 0x68, 0xF8, 0x07, 0x22, 0x67, 0xF8, 0x07, 0x22, - 0x66, 0xF8, 0x07, 0x22, 0x65, 0xF8, 0x07, 0x22, - 0x64, 0xF8, 0x07, 0x22, 0x63, 0xF8, 0x07, 0x22, - 0x62, 0xF8, 0x07, 0x22, 0x61, 0xF8, 0x07, 0x22, - 0x60, 0xF8, 0x07, 0x22, 0x5F, 0xF8, 0x07, 0x22, - 0x5E, 0xF8, 0x07, 0x22, 0x5D, 0xF8, 0x07, 0x22, - 0x5C, 0xF8, 0x07, 0x22, 0x5B, 0xF8, 0x07, 0x22, - 0x5A, 0xF8, 0x07, 0x22, 0x59, 0xF8, 0x07, 0x22, - 0x58, 0xF8, 0x07, 0x22, 0x57, 0xF8, 0x07, 0x22, - 0x56, 0xF8, 0x07, 0x22, 0x55, 0xF8, 0x07, 0x22, - 0x54, 0xF8, 0x07, 0x22, 0x53, 0xF8, 0x07, 0x22, - 0x52, 0xF8, 0x07, 0x22, 0x51, 0xF8, 0x07, 0x22, - 0x50, 0xF8, 0x07, 0x22, 0x4F, 0xF8, 0x07, 0x22, - 0x4E, 0xF8, 0x07, 0x22, 0x4D, 0xF8, 0x07, 0x22, - 0x4C, 0xF8, 0x07, 0x22, 0x4B, 0xF8, 0x07, 0x22, - 0x4A, 0xF8, 0x07, 0x22, 0x49, 0xF8, 0x07, 0x22, - 0x48, 0xF8, 0x07, 0x22, 0x47, 0xF8, 0x07, 0x22, - 0x46, 0xF8, 0x07, 0x22, 0x45, 0xF8, 0x07, 0x22, - 0x44, 0xF8, 0x07, 0x22, 0x43, 0xF8, 0x07, 0x22, - 0x42, 0xF8, 0x07, 0x22, 0x41, 0xF8, 0x07, 0x22, - 0x40, 0xF8, 0x07, 0x22, 0x3F, 0xF8, 0x07, 0x22, - 0x3E, 0xF8, 0x07, 0x22, 0x3D, 0xF8, 0x07, 0x22, - 0x3C, 0xF8, 0x07, 0x22, 0x3B, 0xF8, 0x07, 0x22, - 0x3A, 0xF8, 0x07, 0x22, 0x39, 0xF8, 0x07, 0x22, - 0x38, 0xF8, 0x07, 0x22, 0x37, 0xF8, 0x07, 0x22, - 0x36, 0xF8, 0x07, 0x22, 0x35, 0xF8, 0x07, 0x22, - 0x34, 0xF8, 0x07, 0x22, 0x33, 0xF8, 0x07, 0x22, - 0x32, 0xF8, 0x07, 0x22, 0x31, 0xF8, 0x07, 0x22, - 0x30, 0xF8, 0x07, 0x22, 0x2F, 0xF8, 0x07, 0x22, - 0x2E, 0xF8, 0x07, 0x22, 0x2D, 0xF8, 0x07, 0x22, - 0x2C, 0xF8, 0x07, 0x22, 0x2B, 0xF8, 0x07, 0x22, - 0x2A, 0xF8, 0x07, 0x22, 0x29, 0xF8, 0x07, 0x22, - 0x28, 0xF8, 0x07, 0x22, 0x27, 0xF8, 0x07, 0x22, - 0x26, 0xF8, 0x07, 0x22, 0x25, 0xF8, 0x07, 0x22, - 0x24, 0xF8, 0x07, 0x22, 0x23, 0xF8, 0x07, 0x20, - 0x22, 0xF8, 0x07, 0x20, 0x21, 0xF8, 0x07, 0x20, - 0x20, 0xF8, 0x07, 0x20, 0x1F, 0xF8, 0x07, 0x20, - 0x1E, 0xF8, 0x07, 0x20, 0x1D, 0xF8, 0x07, 0x20, - 0x1C, 0xF8, 0x07, 0x20, 0x1C, 0xF8, 0x07, 0x00, - 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, - 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, - 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, - 0xD8, 0xF8, 0x27, 0x20, 0xD9, 0xF8, 0x27, 0x20, - 0xDA, 0xF8, 0x27, 0x20, 0xDB, 0xF8, 0x27, 0x20, - 0xDC, 0xF8, 0x27, 0x20, 0xDD, 0xF8, 0x27, 0x20, - 0xDE, 0xF8, 0x27, 0x20, 0xDF, 0xF8, 0x27, 0x20, - 0xE0, 0xF8, 0x27, 0x20, 0xE1, 0xF8, 0x27, 0x20, - 0xE2, 0xF8, 0x27, 0x20, 0xE3, 0xF8, 0x27, 0x20, - 0xE4, 0xF8, 0x27, 0x20, 0xE5, 0xF8, 0x27, 0x20, - 0xE6, 0xF8, 0x27, 0x20, 0xE7, 0xF8, 0x27, 0x20, - 0xE8, 0xF8, 0x27, 0x20, 0xE9, 0xF8, 0x27, 0x20, - 0xEA, 0xF8, 0x27, 0x20, 0xEB, 0xF8, 0x27, 0x20, - 0xEC, 0xF8, 0x27, 0x20, 0xED, 0xF8, 0x27, 0x20, - 0xEE, 0xF8, 0x27, 0x20, 0xEF, 0xF8, 0x27, 0x20, - 0xF0, 0xF8, 0x27, 0x20, 0xF1, 0xF8, 0x27, 0x20, - 0xF2, 0xF8, 0x27, 0x20, 0xF3, 0xF8, 0x27, 0x20, - 0xF4, 0xF8, 0x27, 0x20, 0xF5, 0xF8, 0x27, 0x20, - 0xF6, 0xF8, 0x27, 0x20, 0xF7, 0xF8, 0x27, 0x20, - 0xF8, 0xF8, 0x27, 0x20, 0xF9, 0xF8, 0x27, 0x20, - 0xFA, 0xF8, 0x27, 0x20, 0xFB, 0xF8, 0x27, 0x20, - 0xFC, 0xF8, 0x27, 0x20, 0xFD, 0xF8, 0x27, 0x20, - 0xFE, 0xF8, 0x27, 0x20, 0xFF, 0xF8, 0x27, 0x20, - 0x00, 0xF9, 0x27, 0x20, 0xD7, 0xF8, 0x27, 0x20, - 0x00, 0xF8, 0x27, 0x20, 0x01, 0xF8, 0x27, 0x20, - 0x02, 0xF8, 0x27, 0x20, 0x03, 0xF8, 0x27, 0x20, - 0x04, 0xF8, 0x27, 0x20, 0x05, 0xF8, 0x27, 0x20, - 0x06, 0xF8, 0x27, 0x20, 0x07, 0xF8, 0x27, 0x20, - 0x08, 0xF8, 0x27, 0x20, 0x09, 0xF8, 0x27, 0x20, - 0x0A, 0xF8, 0x27, 0x20, 0x0B, 0xF8, 0x27, 0x20, - 0x0C, 0xF8, 0x27, 0x20, 0x0D, 0xF8, 0x27, 0x20, - 0x0E, 0xF8, 0x27, 0x20, 0x0F, 0xF8, 0x27, 0x20, - 0x10, 0xF8, 0x27, 0x20, 0x11, 0xF8, 0x27, 0x20, - 0x12, 0xF8, 0x27, 0x20, 0x13, 0xF8, 0x27, 0x20, - 0x14, 0xF8, 0x27, 0x20, 0x15, 0xF8, 0x27, 0x20, - 0x15, 0xF8, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, - 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, - 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, - 0x04, 0x05, 0x00, 0x0E, 0x00, 0x0C, 0x20, 0xFD, - 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, 0x10, - 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, 0x00, 0x09, - 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, - 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, - 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, 0x00, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x00, - 0x03, 0x00, 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x88, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x94, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x20, - 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x60, 0x21, 0x04, 0x30, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x15, 0x00, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x28, 0x00, - 0x00, + 0x02, 0xF0, 0x00, 0x14, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE5, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xEA, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0x0A, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x01, 0xDE, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x02, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x00, 0x74, 0x01, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x74, 0x01, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0xF9, 0x87, 0x20, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x07, 0x20, + 0xBA, 0xF8, 0x07, 0x20, 0xB9, 0xF8, 0x07, 0x20, + 0xB8, 0xF8, 0x07, 0x20, 0xB7, 0xF8, 0x07, 0x20, + 0xB6, 0xF8, 0x07, 0x20, 0xB5, 0xF8, 0x07, 0x20, + 0xB4, 0xF8, 0x07, 0x20, 0xB3, 0xF8, 0x07, 0x20, + 0xB2, 0xF8, 0x07, 0x20, 0xB1, 0xF8, 0x07, 0x22, + 0xB0, 0xF8, 0x07, 0x22, 0xAF, 0xF8, 0x07, 0x22, + 0xAE, 0xF8, 0x07, 0x22, 0xAD, 0xF8, 0x07, 0x22, + 0xAC, 0xF8, 0x07, 0x22, 0xAB, 0xF8, 0x07, 0x22, + 0xAA, 0xF8, 0x07, 0x22, 0xA9, 0xF8, 0x07, 0x22, + 0xA8, 0xF8, 0x07, 0x22, 0xA7, 0xF8, 0x07, 0x22, + 0xA6, 0xF8, 0x07, 0x22, 0xA5, 0xF8, 0x07, 0x22, + 0xA4, 0xF8, 0x07, 0x22, 0xA3, 0xF8, 0x07, 0x22, + 0xA2, 0xF8, 0x07, 0x22, 0xA1, 0xF8, 0x07, 0x22, + 0xA0, 0xF8, 0x07, 0x22, 0x9F, 0xF8, 0x07, 0x22, + 0x9E, 0xF8, 0x07, 0x22, 0x9D, 0xF8, 0x07, 0x22, + 0x9C, 0xF8, 0x07, 0x22, 0x9B, 0xF8, 0x07, 0x22, + 0x9A, 0xF8, 0x07, 0x22, 0x99, 0xF8, 0x07, 0x22, + 0x98, 0xF8, 0x07, 0x22, 0x97, 0xF8, 0x07, 0x22, + 0x96, 0xF8, 0x07, 0x22, 0x95, 0xF8, 0x07, 0x22, + 0x94, 0xF8, 0x07, 0x22, 0x93, 0xF8, 0x07, 0x22, + 0x92, 0xF8, 0x07, 0x22, 0x91, 0xF8, 0x07, 0x22, + 0x90, 0xF8, 0x07, 0x22, 0x8F, 0xF8, 0x07, 0x22, + 0x8E, 0xF8, 0x07, 0x22, 0x8D, 0xF8, 0x07, 0x22, + 0x8C, 0xF8, 0x07, 0x22, 0x8B, 0xF8, 0x07, 0x22, + 0x8A, 0xF8, 0x07, 0x22, 0x89, 0xF8, 0x07, 0x22, + 0x88, 0xF8, 0x07, 0x22, 0x87, 0xF8, 0x07, 0x22, + 0x86, 0xF8, 0x07, 0x22, 0x85, 0xF8, 0x07, 0x22, + 0x84, 0xF8, 0x07, 0x22, 0x83, 0xF8, 0x07, 0x22, + 0x82, 0xF8, 0x07, 0x22, 0x81, 0xF8, 0x07, 0x22, + 0x80, 0xF8, 0x07, 0x22, 0x7F, 0xF8, 0x07, 0x22, + 0x7E, 0xF8, 0x07, 0x22, 0x7D, 0xF8, 0x07, 0x22, + 0x7C, 0xF8, 0x07, 0x22, 0x7B, 0xF8, 0x07, 0x22, + 0x7A, 0xF8, 0x07, 0x22, 0x79, 0xF8, 0x07, 0x22, + 0x78, 0xF8, 0x07, 0x22, 0x77, 0xF8, 0x07, 0x22, + 0x76, 0xF8, 0x07, 0x22, 0x75, 0xF8, 0x07, 0x22, + 0x74, 0xF8, 0x07, 0x22, 0x73, 0xF8, 0x07, 0x22, + 0x72, 0xF8, 0x07, 0x22, 0x71, 0xF8, 0x07, 0x22, + 0x70, 0xF8, 0x07, 0x22, 0x6F, 0xF8, 0x07, 0x22, + 0x6E, 0xF8, 0x07, 0x22, 0x6D, 0xF8, 0x07, 0x22, + 0x6C, 0xF8, 0x07, 0x22, 0x6B, 0xF8, 0x07, 0x22, + 0x6A, 0xF8, 0x07, 0x22, 0x69, 0xF8, 0x07, 0x22, + 0x68, 0xF8, 0x07, 0x22, 0x67, 0xF8, 0x07, 0x22, + 0x66, 0xF8, 0x07, 0x22, 0x65, 0xF8, 0x07, 0x22, + 0x64, 0xF8, 0x07, 0x22, 0x63, 0xF8, 0x07, 0x22, + 0x62, 0xF8, 0x07, 0x22, 0x61, 0xF8, 0x07, 0x22, + 0x60, 0xF8, 0x07, 0x22, 0x5F, 0xF8, 0x07, 0x22, + 0x5E, 0xF8, 0x07, 0x22, 0x5D, 0xF8, 0x07, 0x22, + 0x5C, 0xF8, 0x07, 0x22, 0x5B, 0xF8, 0x07, 0x22, + 0x5A, 0xF8, 0x07, 0x22, 0x59, 0xF8, 0x07, 0x22, + 0x58, 0xF8, 0x07, 0x22, 0x57, 0xF8, 0x07, 0x22, + 0x56, 0xF8, 0x07, 0x22, 0x55, 0xF8, 0x07, 0x22, + 0x54, 0xF8, 0x07, 0x22, 0x53, 0xF8, 0x07, 0x22, + 0x52, 0xF8, 0x07, 0x22, 0x51, 0xF8, 0x07, 0x22, + 0x50, 0xF8, 0x07, 0x22, 0x4F, 0xF8, 0x07, 0x22, + 0x4E, 0xF8, 0x07, 0x22, 0x4D, 0xF8, 0x07, 0x22, + 0x4C, 0xF8, 0x07, 0x22, 0x4B, 0xF8, 0x07, 0x22, + 0x4A, 0xF8, 0x07, 0x22, 0x49, 0xF8, 0x07, 0x22, + 0x48, 0xF8, 0x07, 0x22, 0x47, 0xF8, 0x07, 0x22, + 0x46, 0xF8, 0x07, 0x22, 0x45, 0xF8, 0x07, 0x22, + 0x44, 0xF8, 0x07, 0x22, 0x43, 0xF8, 0x07, 0x22, + 0x42, 0xF8, 0x07, 0x22, 0x41, 0xF8, 0x07, 0x22, + 0x40, 0xF8, 0x07, 0x22, 0x3F, 0xF8, 0x07, 0x22, + 0x3E, 0xF8, 0x07, 0x22, 0x3D, 0xF8, 0x07, 0x22, + 0x3C, 0xF8, 0x07, 0x22, 0x3B, 0xF8, 0x07, 0x22, + 0x3A, 0xF8, 0x07, 0x22, 0x39, 0xF8, 0x07, 0x22, + 0x38, 0xF8, 0x07, 0x22, 0x37, 0xF8, 0x07, 0x22, + 0x36, 0xF8, 0x07, 0x22, 0x35, 0xF8, 0x07, 0x22, + 0x34, 0xF8, 0x07, 0x22, 0x33, 0xF8, 0x07, 0x22, + 0x32, 0xF8, 0x07, 0x22, 0x31, 0xF8, 0x07, 0x22, + 0x30, 0xF8, 0x07, 0x22, 0x2F, 0xF8, 0x07, 0x22, + 0x2E, 0xF8, 0x07, 0x22, 0x2D, 0xF8, 0x07, 0x22, + 0x2C, 0xF8, 0x07, 0x22, 0x2B, 0xF8, 0x07, 0x22, + 0x2A, 0xF8, 0x07, 0x22, 0x29, 0xF8, 0x07, 0x22, + 0x28, 0xF8, 0x07, 0x22, 0x27, 0xF8, 0x07, 0x22, + 0x26, 0xF8, 0x07, 0x22, 0x25, 0xF8, 0x07, 0x22, + 0x24, 0xF8, 0x07, 0x22, 0x23, 0xF8, 0x07, 0x20, + 0x22, 0xF8, 0x07, 0x20, 0x21, 0xF8, 0x07, 0x20, + 0x20, 0xF8, 0x07, 0x20, 0x1F, 0xF8, 0x07, 0x20, + 0x1E, 0xF8, 0x07, 0x20, 0x1D, 0xF8, 0x07, 0x20, + 0x1C, 0xF8, 0x07, 0x20, 0x1C, 0xF8, 0x07, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD8, 0xF8, 0x27, 0x20, 0xD9, 0xF8, 0x27, 0x20, + 0xDA, 0xF8, 0x27, 0x20, 0xDB, 0xF8, 0x27, 0x20, + 0xDC, 0xF8, 0x27, 0x20, 0xDD, 0xF8, 0x27, 0x20, + 0xDE, 0xF8, 0x27, 0x20, 0xDF, 0xF8, 0x27, 0x20, + 0xE0, 0xF8, 0x27, 0x20, 0xE1, 0xF8, 0x27, 0x20, + 0xE2, 0xF8, 0x27, 0x20, 0xE3, 0xF8, 0x27, 0x20, + 0xE4, 0xF8, 0x27, 0x20, 0xE5, 0xF8, 0x27, 0x20, + 0xE6, 0xF8, 0x27, 0x20, 0xE7, 0xF8, 0x27, 0x20, + 0xE8, 0xF8, 0x27, 0x20, 0xE9, 0xF8, 0x27, 0x20, + 0xEA, 0xF8, 0x27, 0x20, 0xEB, 0xF8, 0x27, 0x20, + 0xEC, 0xF8, 0x27, 0x20, 0xED, 0xF8, 0x27, 0x20, + 0xEE, 0xF8, 0x27, 0x20, 0xEF, 0xF8, 0x27, 0x20, + 0xF0, 0xF8, 0x27, 0x20, 0xF1, 0xF8, 0x27, 0x20, + 0xF2, 0xF8, 0x27, 0x20, 0xF3, 0xF8, 0x27, 0x20, + 0xF4, 0xF8, 0x27, 0x20, 0xF5, 0xF8, 0x27, 0x20, + 0xF6, 0xF8, 0x27, 0x20, 0xF7, 0xF8, 0x27, 0x20, + 0xF8, 0xF8, 0x27, 0x20, 0xF9, 0xF8, 0x27, 0x20, + 0xFA, 0xF8, 0x27, 0x20, 0xFB, 0xF8, 0x27, 0x20, + 0xFC, 0xF8, 0x27, 0x20, 0xFD, 0xF8, 0x27, 0x20, + 0xFE, 0xF8, 0x27, 0x20, 0xFF, 0xF8, 0x27, 0x20, + 0x00, 0xF9, 0x27, 0x20, 0xD7, 0xF8, 0x27, 0x20, + 0x00, 0xF8, 0x27, 0x20, 0x01, 0xF8, 0x27, 0x20, + 0x02, 0xF8, 0x27, 0x20, 0x03, 0xF8, 0x27, 0x20, + 0x04, 0xF8, 0x27, 0x20, 0x05, 0xF8, 0x27, 0x20, + 0x06, 0xF8, 0x27, 0x20, 0x07, 0xF8, 0x27, 0x20, + 0x08, 0xF8, 0x27, 0x20, 0x09, 0xF8, 0x27, 0x20, + 0x0A, 0xF8, 0x27, 0x20, 0x0B, 0xF8, 0x27, 0x20, + 0x0C, 0xF8, 0x27, 0x20, 0x0D, 0xF8, 0x27, 0x20, + 0x0E, 0xF8, 0x27, 0x20, 0x0F, 0xF8, 0x27, 0x20, + 0x10, 0xF8, 0x27, 0x20, 0x11, 0xF8, 0x27, 0x20, + 0x12, 0xF8, 0x27, 0x20, 0x13, 0xF8, 0x27, 0x20, + 0x14, 0xF8, 0x27, 0x20, 0x15, 0xF8, 0x27, 0x20, + 0x15, 0xF8, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x05, 0x00, 0x0E, 0x00, 0x0C, 0x20, 0xFD, + 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, 0x10, + 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, + 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, + 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x00, + 0x03, 0x00, 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x88, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x94, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x20, + 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x60, 0x21, 0x04, 0x30, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x15, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x28, 0x00, + 0x00, }; static unsigned char vfs5011_cmd_27[] = { /* 1 B */ - 0x27, + 0x27, }; static unsigned char vfs5011_init_15[] = { /* 3794 B */ - 0x06, 0x6B, 0x06, 0x6A, 0x76, 0xC8, 0x18, 0xD4, - 0x54, 0xEF, 0x71, 0x14, 0xCC, 0x1C, 0x58, 0x91, - 0x11, 0xAA, 0x80, 0xF4, 0x2C, 0xFC, 0x9F, 0x5F, - 0xDF, 0x04, 0x02, 0x62, 0xBA, 0x6A, 0x5A, 0x97, - 0x17, 0xCC, 0x46, 0x22, 0xFA, 0x2A, 0xBE, 0x03, - 0x87, 0x3C, 0x9E, 0xFE, 0x26, 0xF6, 0x96, 0x7E, - 0xFA, 0x11, 0x27, 0x66, 0xBA, 0x3A, 0x5A, 0xBA, - 0x3E, 0xD5, 0x4F, 0x03, 0xDF, 0x5F, 0x7F, 0x9F, - 0x1B, 0xF0, 0xA2, 0xEF, 0x33, 0xB3, 0xD3, 0x13, - 0x93, 0x70, 0xFA, 0x96, 0x4E, 0xC6, 0xA6, 0xC6, - 0x46, 0xA5, 0x2F, 0xE3, 0x3B, 0xB3, 0xD3, 0x33, - 0xB3, 0x50, 0xE8, 0xA4, 0x7C, 0xF4, 0x94, 0x14, - 0x94, 0x77, 0xC9, 0xE5, 0x3D, 0xB5, 0xD5, 0x75, - 0xF5, 0x16, 0xA8, 0xA4, 0x7C, 0xF4, 0x94, 0xD4, - 0x54, 0xB7, 0x09, 0xE5, 0x3D, 0xB5, 0x2D, 0xF4, - 0x74, 0xCF, 0x29, 0x5C, 0x84, 0x54, 0x14, 0xAA, - 0x2E, 0x95, 0xF7, 0xE0, 0x3C, 0xEC, 0x8C, 0x52, - 0xD6, 0x3D, 0x7B, 0x0E, 0xD6, 0x06, 0x82, 0x49, - 0xC9, 0x72, 0x7C, 0x18, 0xC0, 0x10, 0x10, 0xF6, - 0x72, 0xC9, 0xC3, 0xA8, 0x70, 0xA0, 0xD8, 0x77, - 0xF3, 0x48, 0x06, 0x04, 0xD8, 0x08, 0x90, 0x5B, - 0xDB, 0x60, 0x36, 0x43, 0x9B, 0x4B, 0xD4, 0xE3, - 0x9C, 0xB8, 0xF1, 0x72, 0x55, 0x1A, 0x8E, 0x57, - 0xD7, 0x6C, 0xDA, 0xBE, 0x66, 0xD6, 0xEA, 0x3D, - 0xBF, 0x04, 0xB2, 0xCE, 0x16, 0xA6, 0x06, 0xDE, - 0x5E, 0xE5, 0xB7, 0xC3, 0x1B, 0xCB, 0x47, 0x9F, - 0x1F, 0xA4, 0x3E, 0x5B, 0x83, 0x53, 0x53, 0x8A, - 0x0A, 0xB1, 0x93, 0xF9, 0x21, 0xF1, 0x31, 0xE6, - 0x64, 0xDF, 0x95, 0xE0, 0x38, 0xE8, 0xB4, 0x6D, - 0xED, 0x56, 0x1D, 0x8E, 0x56, 0xE6, 0x79, 0xB9, - 0xC6, 0xE2, 0x62, 0x4F, 0x97, 0x02, 0x40, 0x80, - 0x65, 0xB8, 0x0E, 0x07, 0xC2, 0x72, 0x37, 0xBE, - 0x3E, 0x00, 0xF2, 0xB8, 0xF1, 0x6D, 0x0E, 0x6F, - 0xC2, 0x1A, 0xA0, 0xC4, 0x95, 0x2F, 0xCD, 0x44, - 0xC4, 0x02, 0x44, 0x28, 0xF0, 0x40, 0x16, 0x97, - 0x17, 0x7D, 0xE4, 0x8B, 0xFE, 0x4C, 0x0D, 0xE3, - 0x60, 0xFD, 0x4B, 0x27, 0x34, 0xA6, 0xCD, 0xB6, - 0x10, 0xC0, 0x7C, 0x98, 0x42, 0x72, 0x92, 0x26, - 0x21, 0x60, 0x26, 0x4C, 0x95, 0x25, 0xA0, 0x03, - 0xA6, 0x50, 0xEC, 0x9D, 0xB5, 0x05, 0x53, 0xD2, - 0x52, 0xA9, 0x7E, 0x12, 0x2F, 0x65, 0xFA, 0x1A, - 0x7C, 0xB4, 0x12, 0x5E, 0x86, 0x3A, 0x50, 0xF5, - 0x53, 0xAD, 0xBA, 0xE6, 0x3D, 0x3C, 0x6D, 0xAE, - 0xCB, 0x33, 0xAD, 0xDC, 0xF4, 0x44, 0x12, 0x93, - 0x13, 0xF9, 0x7D, 0x12, 0xEB, 0x68, 0x0B, 0xE2, - 0x21, 0xE7, 0xA1, 0xCD, 0x15, 0xA5, 0xF3, 0x72, - 0xF2, 0xAB, 0x1F, 0x7E, 0xAA, 0x01, 0xE1, 0xA1, - 0x25, 0xA8, 0x06, 0x6D, 0xB9, 0x0C, 0x60, 0xA6, - 0x64, 0xAD, 0x15, 0x65, 0xBA, 0x30, 0x14, 0x66, - 0x22, 0x78, 0xFC, 0x94, 0x4C, 0x4E, 0x25, 0x9B, - 0xD9, 0x06, 0xB1, 0xEA, 0x89, 0x35, 0x62, 0x1E, - 0x8F, 0x69, 0xD4, 0x7F, 0x1C, 0xA0, 0xFD, 0x31, - 0x77, 0xAD, 0x1B, 0x40, 0xA4, 0x10, 0xB7, 0xCC, - 0x4D, 0xAB, 0x16, 0xD7, 0x0C, 0x01, 0x62, 0x87, - 0xBF, 0x4C, 0x50, 0x5A, 0xD8, 0x3B, 0x50, 0xE7, - 0x2C, 0xB3, 0xB7, 0x1F, 0x46, 0xA0, 0x57, 0x6B, - 0x46, 0x98, 0x93, 0xFA, 0xC7, 0xC1, 0x89, 0x45, - 0xDE, 0xD7, 0xC3, 0xC3, 0xBB, 0xCF, 0xEE, 0xEE, - 0xA8, 0xB3, 0xDF, 0x61, 0x4B, 0xE6, 0x04, 0x04, - 0x40, 0xDA, 0xAC, 0x43, 0xDA, 0x9A, 0x15, 0x25, - 0x45, 0x7D, 0xEA, 0x0C, 0x3A, 0x7A, 0xD4, 0x87, - 0xC5, 0x43, 0x77, 0x1D, 0xC6, 0x76, 0xD4, 0xB6, - 0x5A, 0x4B, 0x3F, 0x91, 0x55, 0x98, 0xC2, 0xCE, - 0x8C, 0x5B, 0xED, 0x53, 0x99, 0x20, 0x6D, 0xA6, - 0xF1, 0x96, 0x21, 0x41, 0xBB, 0x16, 0x86, 0x46, - 0xC6, 0x1D, 0x9D, 0xB0, 0x68, 0x69, 0x3D, 0xFE, - 0xC6, 0x16, 0x2C, 0x2B, 0x51, 0x40, 0x40, 0x2A, - 0x01, 0xBF, 0xB3, 0xFF, 0x8A, 0x38, 0x3D, 0x51, - 0xF4, 0x32, 0x74, 0x18, 0xC0, 0x70, 0x26, 0xA7, - 0x27, 0x5D, 0xDE, 0xB1, 0xD8, 0x5E, 0x3D, 0x30, - 0xB2, 0x0C, 0xEC, 0xA5, 0xCC, 0x44, 0x27, 0xC7, - 0x6D, 0x16, 0x01, 0x5A, 0x81, 0xFC, 0x9E, 0x3B, - 0xEE, 0x10, 0x17, 0x41, 0x9A, 0x0A, 0x50, 0x30, - 0x72, 0x6A, 0xCC, 0x01, 0xE0, 0x53, 0x3F, 0xFD, - 0x54, 0x8C, 0x13, 0x6C, 0x9D, 0x0E, 0x47, 0xB4, - 0xD1, 0x59, 0xCA, 0x17, 0xF3, 0x40, 0x10, 0xEA, - 0xCA, 0xD3, 0xA6, 0xDA, 0xA3, 0x28, 0x4B, 0x6E, - 0xBC, 0x42, 0xF8, 0x9D, 0x75, 0xFF, 0x3F, 0xCD, - 0x8E, 0x45, 0xE8, 0x1D, 0xEC, 0x5F, 0x74, 0x87, - 0x61, 0x23, 0x63, 0xA2, 0x79, 0x7B, 0xBB, 0xDE, - 0x72, 0xE5, 0xB6, 0x7B, 0x8B, 0x9A, 0xC7, 0x04, - 0x35, 0xD0, 0x65, 0xCB, 0xD0, 0x44, 0x41, 0xD1, - 0x74, 0x1E, 0xE8, 0x87, 0x6F, 0xE5, 0x25, 0x44, - 0xFB, 0x23, 0xA7, 0x08, 0xF4, 0x89, 0xEA, 0xCF, - 0x1E, 0xE0, 0xE7, 0xC9, 0x12, 0x92, 0xC8, 0xA8, - 0x89, 0x13, 0xA6, 0x07, 0xDC, 0xC9, 0xFA, 0x1F, - 0x2E, 0xB1, 0x04, 0x58, 0xBA, 0xAA, 0x6B, 0xE8, - 0x6B, 0x7D, 0xC8, 0x01, 0x8B, 0x1E, 0xCF, 0x49, - 0xCA, 0x21, 0xAD, 0x61, 0x18, 0xED, 0x8E, 0x83, - 0x00, 0x3E, 0xD9, 0x90, 0x78, 0xE2, 0x22, 0xFF, - 0x8F, 0x54, 0xD4, 0xF9, 0x21, 0x10, 0x37, 0xF4, - 0xFC, 0x2F, 0x15, 0x31, 0x48, 0xB0, 0xD3, 0x36, - 0xC1, 0x32, 0x99, 0x05, 0xDD, 0x6D, 0x3B, 0xBA, - 0x3A, 0x60, 0x91, 0xFE, 0xAE, 0x16, 0xFA, 0x72, - 0x53, 0xC0, 0x75, 0xFC, 0x51, 0xC9, 0x0C, 0x38, - 0x99, 0x5F, 0x19, 0x75, 0xAD, 0x1D, 0x4B, 0xCA, - 0x4A, 0x3C, 0x88, 0x01, 0x40, 0xD2, 0x33, 0xB4, - 0x37, 0x64, 0xDA, 0x3A, 0xAA, 0xBB, 0x93, 0x50, - 0xF5, 0x5A, 0xC4, 0xB5, 0x9D, 0x2D, 0x7B, 0xFA, - 0x7A, 0x84, 0x17, 0x7B, 0x22, 0xD8, 0xBB, 0xEA, - 0x58, 0x80, 0x97, 0xB2, 0x69, 0x70, 0x49, 0x00, - 0x89, 0x4F, 0x09, 0x65, 0xBD, 0x0D, 0x5B, 0xDA, - 0x5A, 0xB0, 0x32, 0x5D, 0x89, 0x1E, 0x46, 0x85, - 0x54, 0xC4, 0x71, 0x8F, 0x54, 0xEC, 0xEE, 0x8F, - 0x7F, 0xAF, 0x90, 0xEA, 0x7A, 0xCC, 0x7D, 0xF1, - 0x72, 0xA5, 0x79, 0x19, 0xC6, 0xF4, 0x5D, 0x61, - 0xF7, 0x24, 0x98, 0xD2, 0x53, 0xEB, 0x26, 0xE4, - 0x01, 0x67, 0xF7, 0xB6, 0x64, 0xC9, 0x59, 0xF3, - 0x30, 0x59, 0xFC, 0x9B, 0xD1, 0x65, 0x05, 0xD3, - 0x68, 0xB8, 0x68, 0x7D, 0xB5, 0xC7, 0xB3, 0x8F, - 0x59, 0x2E, 0x92, 0x5C, 0xC7, 0x7F, 0x3D, 0xFE, - 0x73, 0x88, 0x1F, 0x77, 0xB2, 0xF2, 0x9E, 0x55, - 0x57, 0x8F, 0x34, 0x9A, 0x61, 0x0C, 0x7B, 0xD3, - 0x5C, 0x15, 0xAE, 0xC2, 0x16, 0xB4, 0xC2, 0x2B, - 0xA5, 0x75, 0x6A, 0xA4, 0x31, 0x81, 0xA7, 0x67, - 0xE7, 0x30, 0x84, 0x28, 0xD0, 0x60, 0xA2, 0x71, - 0xF9, 0xE0, 0x33, 0xFF, 0xAB, 0x01, 0x04, 0x22, - 0x84, 0x42, 0x04, 0x02, 0x99, 0xFB, 0x9F, 0x5F, - 0xB9, 0x7F, 0xF5, 0x21, 0xDB, 0xC6, 0xA5, 0x00, - 0x60, 0x9D, 0x8B, 0x07, 0xAB, 0x7D, 0x03, 0xE2, - 0xD3, 0x45, 0xF0, 0x6E, 0xBD, 0x0D, 0x4B, 0xA4, - 0x23, 0x8A, 0x77, 0x1B, 0xCF, 0x75, 0x30, 0x96, - 0x33, 0xE4, 0x6A, 0x94, 0x6F, 0x01, 0xA1, 0x41, - 0xC1, 0x88, 0x5B, 0x97, 0xCD, 0x3E, 0x56, 0xD0, - 0x53, 0x88, 0x9C, 0xE3, 0x3C, 0x00, 0x1A, 0xA8, - 0x6C, 0xB7, 0xA3, 0xDC, 0x03, 0x96, 0x14, 0xF2, - 0x7E, 0xB7, 0x1C, 0x80, 0xEA, 0x49, 0x21, 0x8B, - 0x48, 0x85, 0xF8, 0x93, 0x89, 0x3D, 0x5D, 0x5F, - 0x13, 0x33, 0x93, 0xC3, 0x1C, 0x4E, 0x2D, 0xE0, - 0xE2, 0x1D, 0x2A, 0x51, 0xE7, 0x07, 0xF5, 0x38, - 0xB8, 0x75, 0x4A, 0x2A, 0xFE, 0x5C, 0x37, 0x0E, - 0x7C, 0xEA, 0x5C, 0xB6, 0x7E, 0xCE, 0x2C, 0x25, - 0x5C, 0xD1, 0xFF, 0x66, 0x06, 0x94, 0x59, 0x9A, - 0x7F, 0x7D, 0xED, 0x21, 0x69, 0xAD, 0xC6, 0x9F, - 0x49, 0x7B, 0xC7, 0xA7, 0x74, 0xC8, 0xE4, 0xC6, - 0x65, 0x63, 0x07, 0xC9, 0x65, 0x0F, 0xBC, 0xBC, - 0x1C, 0xC7, 0xD3, 0xAC, 0x7C, 0x2E, 0x2B, 0x4B, - 0xB9, 0x3F, 0xF7, 0x59, 0xC2, 0x7A, 0x0C, 0x86, - 0xF4, 0x23, 0xFB, 0x75, 0xE9, 0x59, 0x9B, 0x48, - 0xC0, 0x7E, 0x13, 0x59, 0x07, 0x72, 0xED, 0x00, - 0x87, 0x50, 0xE9, 0x45, 0xBD, 0x0D, 0xCF, 0x1C, - 0x94, 0xCD, 0x1E, 0xD2, 0x1C, 0x36, 0xA5, 0x80, - 0xD9, 0x24, 0x8F, 0x13, 0xC7, 0x75, 0x53, 0x5B, - 0x24, 0x47, 0xD3, 0x12, 0xC9, 0x5C, 0xE8, 0x0E, - 0x2E, 0x65, 0xA7, 0xAD, 0x6C, 0xFB, 0x97, 0x5C, - 0x0E, 0xF6, 0x9D, 0x33, 0x49, 0x8D, 0x27, 0x24, - 0x64, 0x9F, 0x29, 0x97, 0x2A, 0x3A, 0xF8, 0x2B, - 0xA3, 0x0A, 0xE0, 0xF2, 0x96, 0x7C, 0x76, 0x55, - 0xD9, 0x6F, 0x0B, 0x29, 0xF1, 0xE3, 0x90, 0x58, - 0xBD, 0xB0, 0x20, 0xCA, 0x1B, 0xAB, 0xC7, 0x78, - 0xF4, 0x7B, 0x8F, 0xA0, 0x70, 0xAA, 0x89, 0xBB, - 0x7F, 0xA4, 0xA0, 0xDF, 0x0C, 0x20, 0x0B, 0x79, - 0xAD, 0x8A, 0x30, 0xA6, 0x72, 0x4A, 0xA8, 0x2C, - 0xAC, 0x12, 0x70, 0x3A, 0x70, 0xD4, 0x48, 0x1A, - 0x53, 0x79, 0x5D, 0x65, 0x41, 0xD3, 0xB0, 0x7D, - 0xDD, 0x27, 0x95, 0xE4, 0xCC, 0x51, 0x36, 0x70, - 0x2F, 0x0B, 0x1F, 0x67, 0x43, 0xE5, 0x5F, 0x77, - 0xFB, 0xA8, 0x9C, 0xB4, 0x6C, 0x6A, 0xB0, 0x60, - 0xEC, 0xCD, 0xDE, 0x63, 0x9D, 0x0F, 0x7B, 0x47, - 0xE5, 0xFC, 0xBB, 0xF5, 0x79, 0x35, 0x53, 0x0E, - 0x71, 0x4F, 0x29, 0x63, 0x96, 0x21, 0x07, 0x3B, - 0x44, 0x9F, 0x1F, 0x32, 0xEA, 0x0B, 0x5F, 0x9C, - 0x44, 0x9A, 0x6E, 0xA2, 0x8A, 0x70, 0x55, 0xA7, - 0x23, 0x78, 0xE8, 0xA7, 0x4E, 0xD8, 0xFB, 0x08, - 0xE9, 0x79, 0xCC, 0xD1, 0x45, 0xF6, 0x9A, 0xF2, - 0x54, 0xEC, 0x75, 0x7F, 0x24, 0x8A, 0xE6, 0x55, - 0x47, 0xB9, 0xD1, 0x7D, 0x85, 0x35, 0xC7, 0x61, - 0x41, 0xA8, 0x5A, 0xB6, 0xDC, 0x69, 0x04, 0x66, - 0xE1, 0x3A, 0x3C, 0xE1, 0x3D, 0x3D, 0xF5, 0xA6, - 0x84, 0x18, 0xAE, 0xDF, 0xF7, 0x5A, 0xCA, 0x06, - 0x95, 0x08, 0xBE, 0xD2, 0x06, 0x85, 0xD7, 0x53, - 0x53, 0x95, 0xD3, 0xB3, 0x38, 0x4A, 0x0F, 0x11, - 0x51, 0xAA, 0x1C, 0xB2, 0x0C, 0x1C, 0xBA, 0x89, - 0xF6, 0x2D, 0xAD, 0x80, 0x58, 0xD9, 0xF7, 0x34, - 0x95, 0x01, 0xB4, 0xF1, 0x3A, 0x97, 0x07, 0xC7, - 0x47, 0x9C, 0x1C, 0x31, 0xE9, 0xC8, 0x9C, 0x5F, - 0x47, 0x95, 0xAF, 0x6A, 0x10, 0x89, 0x34, 0x54, - 0x74, 0xBB, 0x2B, 0x7D, 0xA7, 0xF2, 0xD0, 0x31, - 0xAC, 0x87, 0x07, 0x2A, 0xF2, 0xE3, 0xD2, 0x11, - 0xB0, 0x21, 0x94, 0xC9, 0x23, 0x90, 0x61, 0xF1, - 0x72, 0x28, 0xCC, 0xA3, 0xF2, 0x6B, 0x22, 0xE1, - 0xC8, 0x4A, 0xE1, 0x7D, 0xA5, 0x15, 0x43, 0xC2, - 0x42, 0xB8, 0x5D, 0x32, 0x62, 0xF0, 0x57, 0xFF, - 0x62, 0x18, 0xFA, 0x95, 0x28, 0xD1, 0x99, 0xC8, - 0x1D, 0xC5, 0xB2, 0x88, 0x53, 0x52, 0x65, 0xA6, - 0x8E, 0x77, 0x79, 0x1E, 0x06, 0x1C, 0x6C, 0x3C, - 0x26, 0xED, 0xEB, 0x1D, 0x56, 0x7F, 0x3D, 0x58, - 0x11, 0xEF, 0x44, 0xD8, 0x00, 0xB0, 0xE6, 0x67, - 0xE7, 0x9D, 0x7F, 0x10, 0x2D, 0xDF, 0x97, 0xB6, - 0x6E, 0xB6, 0x41, 0x1F, 0xC4, 0x45, 0x76, 0xB5, - 0x39, 0xEE, 0x80, 0xCF, 0xE6, 0x01, 0x62, 0x15, - 0xF8, 0x01, 0x0A, 0x69, 0x79, 0xCD, 0x64, 0xAB, - 0x86, 0x5F, 0x68, 0x5D, 0x86, 0xD6, 0x2B, 0xCB, - 0xD2, 0x2A, 0x15, 0x7D, 0xC0, 0x38, 0x58, 0x29, - 0xF3, 0x2B, 0x35, 0x7A, 0xAE, 0x1C, 0xCC, 0xA6, - 0x06, 0x74, 0xE1, 0x90, 0xB8, 0x04, 0x6F, 0x69, - 0x1F, 0x3B, 0xBB, 0x96, 0x4E, 0xE2, 0x4A, 0x0D, - 0x1F, 0xC0, 0x57, 0x60, 0xBB, 0x16, 0x86, 0xEB, - 0x69, 0x97, 0xE3, 0xAA, 0x5F, 0xE5, 0x98, 0xA8, - 0x28, 0xF3, 0x73, 0x5E, 0x86, 0x47, 0x60, 0xA3, - 0xFF, 0x70, 0x4E, 0x25, 0x71, 0x89, 0x4C, 0x92, - 0x12, 0x8F, 0x38, 0x54, 0x2D, 0xD5, 0xB6, 0x53, - 0xEF, 0x1C, 0x02, 0x69, 0xBD, 0x04, 0xF6, 0x7C, - 0x64, 0x0D, 0x1B, 0x04, 0x96, 0x45, 0xE7, 0x87, - 0x73, 0xCF, 0x45, 0x3A, 0x5F, 0xED, 0x25, 0xE2, - 0xAF, 0x77, 0x8B, 0x4D, 0x37, 0x4D, 0x09, 0x6C, - 0xA9, 0x5A, 0x5E, 0x92, 0x39, 0x4F, 0x2A, 0xEA, - 0x2D, 0xCD, 0x6F, 0xBE, 0x64, 0x7C, 0x1B, 0x19, - 0x39, 0x96, 0x60, 0xC0, 0xD8, 0x22, 0xE8, 0x8A, - 0xC0, 0x3F, 0x6C, 0x43, 0xB3, 0xB1, 0x71, 0xC2, - 0xFE, 0x70, 0xA1, 0xF6, 0x26, 0x34, 0xF0, 0x35, - 0x50, 0x5A, 0xC8, 0xE2, 0x3D, 0x8D, 0x5F, 0x3F, - 0xCB, 0x77, 0x7A, 0x1E, 0x64, 0x70, 0x16, 0x33, - 0x63, 0x9C, 0xAC, 0xC3, 0x1B, 0xA7, 0xCD, 0xD5, - 0x52, 0x85, 0x2F, 0x81, 0x14, 0x3C, 0xB9, 0xB6, - 0x12, 0xEC, 0x5E, 0x32, 0x02, 0xB5, 0x37, 0xF9, - 0xE1, 0xF6, 0x0E, 0xC3, 0x53, 0xE0, 0x25, 0xDD, - 0x75, 0xB3, 0xF5, 0x99, 0x41, 0xF1, 0xA7, 0x26, - 0xA6, 0x4C, 0xBD, 0xD2, 0x32, 0x81, 0xC0, 0x5C, - 0xDF, 0x2D, 0xE8, 0x0F, 0x54, 0x76, 0xD5, 0x01, - 0x18, 0xA0, 0x8F, 0xB0, 0xE1, 0x62, 0x8B, 0x68, - 0xCA, 0xD3, 0x99, 0xDC, 0x47, 0xEA, 0x7A, 0xBA, - 0x3A, 0xE1, 0x61, 0x4C, 0x94, 0xC1, 0xB2, 0x72, - 0xEF, 0xC4, 0x44, 0x69, 0xB1, 0x0D, 0x27, 0x42, - 0xE2, 0x1B, 0x8C, 0xA7, 0x7C, 0x41, 0x2B, 0x73, - 0xF1, 0x26, 0x8A, 0x64, 0xD5, 0x42, 0x87, 0x58, - 0xFA, 0x5D, 0x37, 0x27, 0x11, 0xAD, 0xE5, 0x9D, - 0x1F, 0xC8, 0x69, 0xA7, 0x14, 0x8C, 0x5D, 0xD6, - 0x55, 0x4E, 0xD8, 0xB4, 0xFE, 0x65, 0xAD, 0xAD, - 0x0D, 0xD6, 0x10, 0xE5, 0x1D, 0x3F, 0x34, 0x5C, - 0x1C, 0xE7, 0x51, 0xCF, 0x3C, 0x24, 0x84, 0x64, - 0xE4, 0xBF, 0xF6, 0xBA, 0x90, 0x4B, 0x83, 0x83, - 0x23, 0xF8, 0x9C, 0xDB, 0xA9, 0xD9, 0x99, 0x59, - 0x39, 0x3F, 0x99, 0x27, 0x94, 0x8E, 0x2E, 0xCE, - 0x4E, 0x37, 0xAA, 0x6C, 0x74, 0xE4, 0x84, 0x84, - 0xAE, 0x65, 0x71, 0x76, 0x04, 0x15, 0x28, 0xEB, - 0xCE, 0x00, 0x94, 0xF4, 0x2F, 0x27, 0x45, 0x89, - 0x0F, 0xD8, 0x2B, 0xA7, 0x3C, 0x9D, 0xF1, 0x38, - 0x88, 0xB0, 0xF6, 0x7A, 0x4C, 0xED, 0x3D, 0x0E, - 0x2E, 0x97, 0x4E, 0x08, 0xDC, 0x73, 0xDB, 0x19, - 0x09, 0x7B, 0x3D, 0x4A, 0x0B, 0x2B, 0xDB, 0x6F, - 0x05, 0x12, 0x6E, 0xC8, 0xC2, 0x7E, 0x37, 0x75, - 0xF9, 0x08, 0x0C, 0x6C, 0x91, 0xA1, 0x49, 0x98, - 0xA8, 0xC0, 0x37, 0xE9, 0x7D, 0xE8, 0x58, 0x10, - 0xB0, 0xB3, 0x07, 0xD6, 0x06, 0x36, 0xE9, 0xAA, - 0xC0, 0xC6, 0xC0, 0x54, 0xCD, 0x8F, 0xA3, 0x49, - 0x13, 0x62, 0x56, 0x30, 0xC0, 0xC2, 0xEE, 0x07, - 0x07, 0x58, 0xAF, 0x41, 0xD3, 0x4B, 0x4D, 0xC4, - 0xFE, 0xAD, 0x19, 0xD8, 0x03, 0x39, 0xCA, 0x80, - 0xB4, 0xDD, 0x40, 0x06, 0x54, 0x6A, 0xBA, 0xC1, - 0xB1, 0xD0, 0xEE, 0x00, 0xD0, 0x47, 0xA5, 0x2C, - 0x44, 0x17, 0xA3, 0xC3, 0x10, 0x20, 0x93, 0xC3, - 0xC9, 0xE6, 0xA2, 0xE1, 0x13, 0x29, 0xA7, 0x97, - 0xE8, 0xC3, 0x8F, 0x0D, 0x17, 0xA9, 0xE3, 0xC1, - 0x4F, 0xBD, 0x8B, 0x2B, 0xE2, 0xB2, 0x1E, 0xFE, - 0xBC, 0x3A, 0xE0, 0xE9, 0x20, 0x90, 0xFC, 0x35, - 0xBE, 0x30, 0x3E, 0x50, 0x93, 0x10, 0x40, 0xB0, - 0x44, 0xAF, 0xFA, 0x66, 0x04, 0x70, 0x62, 0xCE, - 0x60, 0x5B, 0xAE, 0xD3, 0x5D, 0x58, 0xCD, 0xAF, - 0xE4, 0x2B, 0x1C, 0x2E, 0xF5, 0xD7, 0x9C, 0x79, - 0x6B, 0xDB, 0x44, 0xE8, 0x10, 0xA0, 0x48, 0x80, - 0x89, 0xD9, 0xCA, 0xF1, 0x09, 0xA4, 0x34, 0xF4, - 0x74, 0xAF, 0x2F, 0x02, 0xDA, 0x4B, 0x6C, 0xAF, - 0x87, 0x5E, 0x4A, 0xEC, 0x20, 0xB5, 0x8D, 0x6D, - 0x45, 0x9C, 0xA1, 0x67, 0x9A, 0xB9, 0xFE, 0x32, - 0xF8, 0xC1, 0xD8, 0x34, 0x3D, 0xC6, 0xA5, 0xA5, - 0x05, 0xDE, 0xAA, 0xEB, 0x87, 0xF7, 0xB7, 0x77, - 0x4F, 0x96, 0xC0, 0x60, 0xA8, 0xDA, 0xD7, 0xA3, - 0x91, 0x61, 0xF0, 0xF9, 0x29, 0xBB, 0x63, 0xA1, - 0x2D, 0xEC, 0xE8, 0xAF, 0x5F, 0x0A, 0x6D, 0x8F, - 0x12, 0x39, 0xB9, 0x94, 0x4C, 0xAD, 0x86, 0x45, - 0x05, 0xFE, 0x48, 0x66, 0x9B, 0x9F, 0x3F, 0xDF, - 0x5F, 0xB4, 0x46, 0x3A, 0xA2, 0x50, 0x10, 0x92, - 0x77, 0x18, 0xB3, 0x2F, 0xF7, 0x47, 0x11, 0x90, - 0x10, 0xC7, 0x72, 0x6C, 0x14, 0xD4, 0xE5, 0x62, - 0xE1, 0x36, 0x96, 0x42, 0x9F, 0x1F, 0xBC, 0x8C, - 0xBC, 0xC4, 0xD2, 0x6C, 0x9E, 0x04, 0xD4, 0xD8, - 0xF8, 0xF3, 0x98, 0x04, 0x06, 0x7A, 0x98, 0x54, - 0xF0, 0xCB, 0x3E, 0x43, 0xFD, 0x55, 0x09, 0x2B, - 0x81, 0x74, 0x10, 0x56, 0xBC, 0x47, 0x94, 0xB3, - 0x3E, 0xF2, 0xE6, 0x86, 0x76, 0xC6, 0xBD, 0x3D, - 0xBD, 0xD0, 0xC7, 0xDB, 0xB8, 0x18, 0xD8, 0xB8, - 0x0C, 0x67, 0x7B, 0x37, 0x4F, 0x5F, 0x4B, 0xCD, - 0x4D, 0x96, 0x2C, 0x4A, 0x20, 0x3F, 0xDF, 0x3A, - 0x43, 0x67, 0x69, 0x00, 0x62, 0x06, 0x94, 0x79, - 0xD7, 0x00, 0xAA, 0x36, 0x01, 0xA0, 0x30, 0x3E, - 0x2D, 0x34, 0xEF, 0xAD, 0x6E, 0xED, 0xBD, 0x4D, - 0xB9, 0x04, 0xF1, 0x3D, 0x6E, 0x75, 0xB0, 0xF5, - 0x52, 0x24, 0x90, 0x7D, 0xFB, 0x48, 0xE8, 0x08, - 0x88, 0xDB, 0x65, 0x80, 0x6A, 0x7F, 0x56, 0xB6, - 0x2B, 0x00, 0x80, 0xAD, 0x75, 0x44, 0x63, 0xA0, - 0x00, 0xB9, 0xFF, 0x1B, 0xCB, 0x70, 0x53, 0x13, - 0xA1, 0xEA, 0xDC, 0xE2, 0x9A, 0x58, 0x1D, 0xF7, - 0xF7, 0x4A, 0x5C, 0x40, 0xEF, 0xAF, 0xB5, 0x53, - 0x85, 0xBA, 0x08, 0x46, 0x9C, 0x0A, 0x28, 0x7B, - 0x8B, 0xD0, 0x44, 0x29, 0xD1, 0x49, 0x18, 0x92, - 0x30, 0xEB, 0x7F, 0x02, 0xFA, 0x6A, 0x3B, 0xD9, - 0x0A, 0xA1, 0x55, 0x1C, 0xEE, 0x1E, 0x3A, 0x0A, - 0xC0, 0x5D, 0xA9, 0xC1, 0x3F, 0x2E, 0x11, 0xD2, - 0xD2, 0x4D, 0xFA, 0xD6, 0x46, 0xC7, 0x01, 0xD5, - 0x59, 0x24, 0x50, 0x2F, 0xEB, 0xA9, 0xD5, 0xED, - 0xEF, 0x67, 0xA1, 0x8B, 0x51, 0xE1, 0x67, 0xB5, - 0x33, 0xE4, 0x50, 0x30, 0xE1, 0xC3, 0xF0, 0x40, - 0x60, 0x19, 0x0F, 0xCB, 0x19, 0x0B, 0x0E, 0xFC, - 0x61, 0x4A, 0xDE, 0xB0, 0x4D, 0x7B, 0xF4, 0xCB, - 0x4B, 0x90, 0x10, 0x3D, 0xE5, 0x59, 0x3B, 0xF7, - 0x72, 0xE8, 0x19, 0x76, 0xA2, 0x51, 0xF9, 0x3D, - 0x7D, 0x74, 0x52, 0xAC, 0x69, 0xB5, 0xC3, 0x5A, - 0xDD, 0x0D, 0x32, 0xDE, 0x86, 0xC2, 0x20, 0xBD, - 0x51, 0xDC, 0xE2, 0x88, 0x90, 0xD2, 0x12, 0x30, - 0x9F, 0x6E, 0x64, 0x16, 0xE8, 0x46, 0x09, 0xEF, - 0x41, 0xB6, 0x66, 0x34, 0xBB, 0x59, 0x56, 0xBC, - 0x1C, 0x55, 0x13, 0xBF, 0xFE, 0xEE, 0x2C, 0xE5, - 0x4F, 0x26, 0x99, 0xDC, 0x84, 0x9E, 0xEF, 0x9F, - 0xB5, 0x4E, 0xF4, 0x93, 0xE9, 0x04, 0x08, 0xE2, - 0xCE, 0x87, 0x38, 0x73, 0x39, 0xC3, 0x4B, 0x26, - 0xA4, 0x5A, 0x1F, 0x8C, 0x12, 0xA9, 0xC9, 0x12, - 0x2C, 0xD7, 0xC3, 0x5F, 0x47, 0x5D, 0x9D, 0xEF, - 0x00, 0xF1, 0xF7, 0x20, 0x08, 0x02, 0xC8, 0xBA, - 0x30, 0xC1, 0x95, 0xF3, 0x02, 0x32, 0xE9, 0x38, - 0x58, 0x38, 0xAE, 0x70, 0xF5, 0x29, 0x63, 0x1F, - 0x3D, 0xEC, 0x7D, 0xB3, 0x20, 0x78, 0xB5, 0x77, - 0xFB, 0x2B, 0x78, 0xFB, 0xDC, 0xA4, 0xC0, 0x2A, - 0x76, 0x3F, 0x84, 0x00, 0x74, 0x0D, 0x66, 0x5F, - 0x2D, 0xBB, 0xE5, 0x41, 0x9D, 0x07, 0xBB, 0x99, - 0x14, 0x27, 0x4D, 0xEF, 0x9A, 0x28, 0x44, 0x9F, - 0x3F, 0x66, 0x20, 0x8C, 0xC6, 0xD6, 0x24, 0xCD, - 0x67, 0x7C, 0x42, 0x8E, 0xC6, 0xEF, 0x7F, 0x25, - 0x2D, 0x74, 0xCA, 0x81, 0xDB, 0x26, 0xAE, 0xCB, - 0xA7, 0x83, 0xFD, 0x95, 0x46, 0xC5, 0xBE, 0x5C, - 0xFC, 0x07, 0xC5, 0xFF, 0x34, 0x70, 0x82, 0x6E, - 0xC7, 0x90, 0xAF, 0xC8, 0x99, 0xAB, 0xA7, 0x4E, - 0x02, 0xC1, 0x92, 0x22, 0x05, 0xA8, 0x38, 0xF8, - 0x78, 0xA3, 0x23, 0x0E, 0xD6, 0x27, 0x27, 0xE4, - 0x55, 0xEF, 0x5A, 0xBE, 0x22, 0x1B, 0xF9, 0x00, - 0xC4, 0x02, 0x44, 0x28, 0xF0, 0x40, 0x16, 0x97, - 0x17, 0x6E, 0x1A, 0x66, 0x1B, 0x98, 0xD8, 0x89, - 0x69, 0xB1, 0x8F, 0x61, 0x30, 0xC9, 0xB4, 0x84, - 0x04, 0xDF, 0x5F, 0x72, 0xAA, 0xA7, 0xC5, 0x24, - 0xC6, 0x1E, 0x80, 0xEE, 0x3A, 0x06, 0xED, 0x8F, - 0xAA, 0x73, 0xED, 0x00, 0xBB, 0x08, 0xFA, 0xF8, - 0x68, 0x2A, 0xCE, 0x3B, 0xA1, 0x98, 0x9A, 0xD6, - 0x55, 0xB7, 0x93, 0xE2, 0xCA, 0x7A, 0x2C, 0xAD, - 0x2D, 0xC7, 0x13, 0x7C, 0x9C, 0x2F, 0xFD, 0x2E, - 0xB6, 0x61, 0xCB, 0xA0, 0x93, 0x39, 0xC8, 0x56, - 0xD5, 0xCE, 0xD3, 0x9F, 0xE5, 0x06, 0x7E, 0x7E, - 0xDE, 0x05, 0x2B, 0x4E, 0x14, 0xB7, 0xD1, 0xB3, - 0xF0, 0x3B, 0x17, 0xF3, 0xA2, 0x61, 0x64, 0x88, - 0x28, 0x41, 0xE4, 0x90, 0x5F, 0x04, 0x6A, 0x12, - 0x01, 0x56, 0x7B, 0x9F, 0x4C, 0x51, 0x33, 0x13, - 0x9B, 0x40, 0xDB, 0xBD, 0x78, 0x38, 0x54, 0x96, - 0x0B, 0x20, 0xA0, 0x8D, 0x55, 0xD4, 0xD6, 0x15, - 0xAD, 0x75, 0x71, 0x0F, 0xC3, 0xBB, 0x78, 0x10, - 0xB3, 0xA2, 0xAF, 0x7A, 0x01, 0x16, 0x4D, 0xDC, - 0xFC, 0xBC, 0xCA, 0x24, 0xEF, 0x47, 0xBE, 0xDD, - 0x4A, 0xF9, 0x64, 0xCA, 0xBA, 0xF5, 0x74, 0xD0, - 0x53, 0x70, 0x75, 0xD9, 0x21, 0x91, 0x23, 0xF0, - 0x68, 0x02, 0xFF, 0x90, 0xA8, 0xC5, 0xB5, 0x87, - 0x6C, 0x17, 0x73, 0x4C, 0x8C, 0xFC, 0xBC, 0x7C, - 0x5E, 0xAE, 0x98, 0x34, 0xCC, 0x7C, 0xDC, 0xB6, - 0x26, 0x5F, 0x82, 0x6E, 0xF0, 0x41, 0x21, 0x43, - 0x00, 0xCB, 0x58, 0x13, 0xEB, 0x9B, 0xDB, 0x1B, - 0x0A, 0x8F, 0x3A, 0xD4, 0x1F, 0xA9, 0x51, 0x98, - 0xBA, 0xA2, 0x04, 0xF2, 0xA2, 0x9B, 0x88, 0x2D, - 0x89, 0x72, 0x4C, 0xA3, 0xD6, 0x64, 0xE4, 0x2C, - 0xAC, 0x6A, 0x2C, 0x40, 0x98, 0x28, 0x7E, 0xFF, - 0x7F, 0xE6, 0xF8, 0x6B, 0x22, 0xF7, 0x94, 0xE5, - 0x07, 0xDF, 0x58, 0x7F, 0xA4, 0xAC, 0xC7, 0xC5, - 0x5E, 0x9D, 0x27, 0x66, 0x6E, 0x12, 0x52, 0x50, - 0x8B, 0x48, 0x3E, 0x72, 0xAA, 0xB8, 0xFB, 0x9B, - 0xB2, 0xD2, 0xA4, 0xE8, 0x30, 0x02, 0x41, 0x21, - 0x61, 0x9A, 0x2C, 0xD0, 0x80, 0x20, 0xD2, 0xB3, - 0x33, 0x78, 0x46, 0x0A, 0x50, 0x83, 0x43, 0x43, - 0xE3, 0x38, 0xAC, 0xE3, 0xBB, 0xCB, 0x8B, 0x4B, - 0x8B, 0x72, 0xD4, 0xFA, 0x86, 0x36, 0x16, 0xF4, - 0x54, 0xAD, 0x78, 0x94, 0x51, 0x11, 0x47, 0xC6, - 0x46, 0xFB, 0x79, 0x1D, 0x47, 0xF4, 0xB3, 0xB1, - 0x32, 0xCF, 0x1F, 0x4B, 0x99, 0x84, 0xE6, 0x9B, - 0x18, 0x0E, 0xBC, 0xF5, 0xB5, 0x27, 0x5A, 0x6A, - 0x42, 0xCA, 0xCE, 0x02, 0x21, 0x21, 0x8D, 0x5D, - 0x1F, 0x87, 0x17, 0xBB, 0x43, 0xF3, 0x01, 0xCB, - 0x47, 0x5C, 0xCA, 0xA6, 0xCE, 0xE7, 0x97, 0xC5, - 0x0F, 0xD8, 0x73, 0xEF, 0x37, 0x87, 0xFD, 0x3C, - 0xBC, 0x67, 0xD1, 0xBD, 0x65, 0xD5, 0x51, 0x9C, - 0x1E, 0xA5, 0x17, 0x7A, 0xA2, 0x12, 0x72, 0xB2, - 0x32, 0xE9, 0xEF, 0x8D, 0x57, 0x87, 0xCD, 0x0F, - 0x8F, 0x54, 0xE2, 0x8E, 0x56, 0xE6, 0x66, 0xB4, - 0x36, 0x8D, 0x27, 0x4B, 0x9B, 0x2B, 0x36, 0xF2, - 0x0C, 0xD3, 0xE1, 0x9F, 0x45, 0x95, 0x81, 0x52, - 0xD0, 0x6B, 0x45, 0x3A, 0xE0, 0x30, 0xF0, 0x23, - 0xA1, 0x1A, 0x74, 0x0C, 0xD6, 0x06, 0x7E, 0xAB, - 0x29, 0x92, 0x14, 0x6E, 0xB4, 0x64, 0x30, 0xE5, - 0x67, 0xDC, 0xD2, 0xAB, 0x71, 0xA1, 0xC1, 0x01, - 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, - 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, - 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, - 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, - 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, - 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, - 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, - 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, - 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x97, 0x40, - 0xC2, 0x79, 0xEB, 0x90, 0x4A, 0x9A, 0xEE, 0x36, - 0xB4, 0x0F, 0x19, 0x62, 0xB8, 0x68, 0x08, 0xC8, - 0x48, 0x93, 0x25, 0x49, 0x91, 0x21, 0x41, 0x81, - 0x01, 0xDA, 0xA0, 0xD4, 0x0C, 0xDC, 0x6C, 0xB4, - 0x34, 0x8F, 0xC1, 0xB4, 0x6C, 0xBC, 0x30, 0xF0, - 0x70, 0xAB, 0x1D, 0x71, 0xA9, 0x19, 0x78, 0xB8, - 0x38, 0xE3, 0x54, 0x38, 0xE1, 0x51, 0x30, 0xF8, - 0x38, 0xE3, 0x54, 0x39, 0xE0, 0x51, 0x70, 0xA0, - 0x24, 0xFD, 0x6A, 0x02, 0xFB, 0x4F, 0x0E, 0x4A, - 0xDA, 0x43, 0xE4, 0x99, 0x50, 0xF1, 0xD8, 0x3A, - 0x9E, 0x67, 0x98, 0xE6, 0x77, 0xD5, 0xFC, 0x6E, - 0xD7, 0x1E, 0xFD, 0x80, 0x0D, 0xAC, 0x99, 0x4C, - 0x99, 0x53, 0x4F, 0x09, 0x7B, 0xE1, 0x2B, 0x41, - 0x6B, 0x9A, 0x79, 0x40, 0xCD, 0x28, 0x1D, 0x88, - 0x5D, 0x53, 0xB0, 0x09, 0x84, 0xE1, 0x2B, 0x01, - 0x2B, 0x1E, 0x02, 0x80, 0xF2, 0xAC, 0x7A, 0x17, - 0x21, 0x17, 0x17, 0x96, 0xF8, 0xA5, 0x73, 0x6E, - 0x35, 0x33, 0x6B, 0xE9, 0xDF, 0x81, 0x3F, 0x84, - 0xEB, 0x8D, 0xE5, 0x72, 0x74, 0x3F, 0xE1, 0xCE, - 0xB5, 0x93, 0xDB, 0x49, 0x6F, 0x21, 0xBF, 0x88, - 0xB7, 0x93, 0xDB, 0x48, 0x6E, 0x21, 0xBE, 0x81, - 0xFE, 0xDA, 0x58, 0x2D, 0xF5, 0x25, 0x7D, 0xA4, - 0x24, 0x9F, 0xD5, 0xA0, 0x78, 0xA8, 0xFC, 0x3C, - 0xBC, 0x67, 0xD1, 0xBD, 0x65, 0xD5, 0xB5, 0x75, - 0xF5, 0x2E, 0x98, 0xF4, 0x2C, 0x9C, 0xFC, 0x3C, - 0xBC, 0x67, 0xF9, 0x9C, 0x44, 0x94, 0xD0, 0x19, - 0x99, 0x22, 0x84, 0x58, 0x82, 0x32, 0x52, 0x88, - 0x08, 0xB3, 0x75, 0x18, 0xC0, 0x70, 0x6C, 0xAB, - 0x2B, 0x90, 0x9A, 0xFB, 0x21, 0xF1, 0xAD, 0x65, - 0xE5, 0x5E, 0xFC, 0x9E, 0x44, 0x94, 0x38, 0xF6, - 0x74, 0xCF, 0xED, 0x87, 0x5F, 0x8F, 0x4B, 0x84, - 0x06, 0xBD, 0x4F, 0x25, 0xFD, 0x2D, 0xC1, 0x0E, - 0x8C, 0x37, 0x71, 0x04, 0xDC, 0x0C, 0xB8, 0x77, - 0xF5, 0x4E, 0x48, 0x35, 0xEF, 0x3F, 0xE7, 0x2F, - 0xAF, 0x14, 0x82, 0xFC, 0x26, 0xF6, 0x2A, 0xED, - 0x6D, 0xD6, 0x34, 0x4A, 0x90, 0x40, 0xE8, 0x3A, - 0xB8, 0x03, 0x5D, 0x37, 0xEF, 0x3F, 0x3B, 0xE3, - 0x61, 0xDA, 0x2C, 0x4A, 0x92, 0x42, 0x14, 0x95, - 0x15, 0x4F, 0x7B, 0x11, 0x78, 0x48, 0x2E, 0xF2, - 0x78, 0x32, 0x05, 0x6F, 0x15, 0xEE, 0x8E, 0xC7, - 0x4E, 0xB0, 0x04, 0x68, 0x55, 0xE1, 0x81, 0xE4, - 0x66, 0xBD, 0xEE, 0x87, 0x5F, 0x0A, 0x62, 0xA2, - 0x07, 0xDF, 0x69, 0xA0, 0x71, 0xC1, 0x00, 0x43, - 0xC5, 0xAF, 0x9D, 0xF7, 0x8A, 0x60, 0x27, 0xFA, - 0x8A, 0x51, 0xD1, 0xFC, 0x24, 0xA5, 0x40, 0x86, - 0x27, 0x7A, 0xCA, 0x8F, 0x84, 0x29, 0xB9, 0x79, - 0xF9, 0x22, 0xA2, 0x8F, 0x57, 0xD6, 0x31, 0xF7, - 0x56, 0x05, 0xB5, 0xF0, 0x6B, 0xC6, 0x56, 0x96, - 0x16, 0xCD, 0x4D, 0x60, 0xB8, 0x39, 0xDC, 0x1A, - 0xBB, 0xE9, 0x59, 0x1C, 0x57, 0xFA, 0x6A, 0xAA, - 0x2A, 0xF1, 0x71, 0x5C, 0x84, 0x15, 0xF8, 0x3E, - 0x8F, 0xD8, 0x68, 0x95, 0xC7, 0x71, 0x90, 0xDB, - 0x5D, 0x0F, 0xF0, 0xB5, 0x6E, 0xC3, 0x53, 0x93, - 0x13, 0xC8, 0x48, 0x65, 0xBD, 0x9C, 0x72, 0xB4, - 0x38, 0xEB, 0xDF, 0xFA, 0x22, 0xF7, 0x96, 0x56, - 0x77, 0x3C, 0x8C, 0x51, 0x0E, 0xB8, 0x19, 0x56, - 0xD0, 0xC2, 0x7F, 0xBA, 0x39, 0x94, 0x04, 0xC4, - 0x44, 0x9F, 0x1F, 0x32, 0xEA, 0x6B, 0x9A, 0x5C, - 0xFD, 0xB4, 0x04, 0x41, 0x8A, 0x27, 0xB7, 0x77, - 0xF7, 0x2C, 0xAC, 0x81, 0x59, 0x68, 0x9C, 0x5A, - 0xEB, 0xA3, 0x13, 0x5E, 0x13, 0xA5, 0xEC, 0x0F, - 0x06, 0x8E, 0x25, 0xB9, 0x61, 0xD1, 0x87, 0x06, - 0x86, 0xCC, 0xEC, 0x86, 0xDF, 0xF8, 0x9E, 0xD7, - 0x7E, 0xC0, 0x76, 0x1A, 0xDF, 0x9F, 0xC9, 0x48, - 0xC8, 0xB2, 0x9C, 0xF6, 0x9C, 0x8C, 0x60, 0x08, - 0x82, 0x79, 0xAE, 0xC2, 0x92, 0x08, 0xD2, 0xA8, - 0xB4, 0x77, 0xCD, 0xBD, 0x69, 0x54, 0xD6, 0x3C, - 0x94, 0x8F, 0x19, 0x75, 0x7F, 0x81, 0xED, 0xEF, - 0x24, 0xD8, 0x4B, 0x80, 0x7B, 0xEB, 0x6D, 0xBE, - 0x2E, 0xD5, 0x63, 0x12, 0x3A, 0x8A, 0xEA, 0x2A, - 0xAA, 0x71, 0xC7, 0xAB, 0x73, 0xC3, 0xA3, 0x63, - 0xE3, 0x38, 0x8F, 0xE3, 0x3F, 0x8F, 0x8B, 0x51, - 0xD3, 0x68, + 0x06, 0x6B, 0x06, 0x6A, 0x76, 0xC8, 0x18, 0xD4, + 0x54, 0xEF, 0x71, 0x14, 0xCC, 0x1C, 0x58, 0x91, + 0x11, 0xAA, 0x80, 0xF4, 0x2C, 0xFC, 0x9F, 0x5F, + 0xDF, 0x04, 0x02, 0x62, 0xBA, 0x6A, 0x5A, 0x97, + 0x17, 0xCC, 0x46, 0x22, 0xFA, 0x2A, 0xBE, 0x03, + 0x87, 0x3C, 0x9E, 0xFE, 0x26, 0xF6, 0x96, 0x7E, + 0xFA, 0x11, 0x27, 0x66, 0xBA, 0x3A, 0x5A, 0xBA, + 0x3E, 0xD5, 0x4F, 0x03, 0xDF, 0x5F, 0x7F, 0x9F, + 0x1B, 0xF0, 0xA2, 0xEF, 0x33, 0xB3, 0xD3, 0x13, + 0x93, 0x70, 0xFA, 0x96, 0x4E, 0xC6, 0xA6, 0xC6, + 0x46, 0xA5, 0x2F, 0xE3, 0x3B, 0xB3, 0xD3, 0x33, + 0xB3, 0x50, 0xE8, 0xA4, 0x7C, 0xF4, 0x94, 0x14, + 0x94, 0x77, 0xC9, 0xE5, 0x3D, 0xB5, 0xD5, 0x75, + 0xF5, 0x16, 0xA8, 0xA4, 0x7C, 0xF4, 0x94, 0xD4, + 0x54, 0xB7, 0x09, 0xE5, 0x3D, 0xB5, 0x2D, 0xF4, + 0x74, 0xCF, 0x29, 0x5C, 0x84, 0x54, 0x14, 0xAA, + 0x2E, 0x95, 0xF7, 0xE0, 0x3C, 0xEC, 0x8C, 0x52, + 0xD6, 0x3D, 0x7B, 0x0E, 0xD6, 0x06, 0x82, 0x49, + 0xC9, 0x72, 0x7C, 0x18, 0xC0, 0x10, 0x10, 0xF6, + 0x72, 0xC9, 0xC3, 0xA8, 0x70, 0xA0, 0xD8, 0x77, + 0xF3, 0x48, 0x06, 0x04, 0xD8, 0x08, 0x90, 0x5B, + 0xDB, 0x60, 0x36, 0x43, 0x9B, 0x4B, 0xD4, 0xE3, + 0x9C, 0xB8, 0xF1, 0x72, 0x55, 0x1A, 0x8E, 0x57, + 0xD7, 0x6C, 0xDA, 0xBE, 0x66, 0xD6, 0xEA, 0x3D, + 0xBF, 0x04, 0xB2, 0xCE, 0x16, 0xA6, 0x06, 0xDE, + 0x5E, 0xE5, 0xB7, 0xC3, 0x1B, 0xCB, 0x47, 0x9F, + 0x1F, 0xA4, 0x3E, 0x5B, 0x83, 0x53, 0x53, 0x8A, + 0x0A, 0xB1, 0x93, 0xF9, 0x21, 0xF1, 0x31, 0xE6, + 0x64, 0xDF, 0x95, 0xE0, 0x38, 0xE8, 0xB4, 0x6D, + 0xED, 0x56, 0x1D, 0x8E, 0x56, 0xE6, 0x79, 0xB9, + 0xC6, 0xE2, 0x62, 0x4F, 0x97, 0x02, 0x40, 0x80, + 0x65, 0xB8, 0x0E, 0x07, 0xC2, 0x72, 0x37, 0xBE, + 0x3E, 0x00, 0xF2, 0xB8, 0xF1, 0x6D, 0x0E, 0x6F, + 0xC2, 0x1A, 0xA0, 0xC4, 0x95, 0x2F, 0xCD, 0x44, + 0xC4, 0x02, 0x44, 0x28, 0xF0, 0x40, 0x16, 0x97, + 0x17, 0x7D, 0xE4, 0x8B, 0xFE, 0x4C, 0x0D, 0xE3, + 0x60, 0xFD, 0x4B, 0x27, 0x34, 0xA6, 0xCD, 0xB6, + 0x10, 0xC0, 0x7C, 0x98, 0x42, 0x72, 0x92, 0x26, + 0x21, 0x60, 0x26, 0x4C, 0x95, 0x25, 0xA0, 0x03, + 0xA6, 0x50, 0xEC, 0x9D, 0xB5, 0x05, 0x53, 0xD2, + 0x52, 0xA9, 0x7E, 0x12, 0x2F, 0x65, 0xFA, 0x1A, + 0x7C, 0xB4, 0x12, 0x5E, 0x86, 0x3A, 0x50, 0xF5, + 0x53, 0xAD, 0xBA, 0xE6, 0x3D, 0x3C, 0x6D, 0xAE, + 0xCB, 0x33, 0xAD, 0xDC, 0xF4, 0x44, 0x12, 0x93, + 0x13, 0xF9, 0x7D, 0x12, 0xEB, 0x68, 0x0B, 0xE2, + 0x21, 0xE7, 0xA1, 0xCD, 0x15, 0xA5, 0xF3, 0x72, + 0xF2, 0xAB, 0x1F, 0x7E, 0xAA, 0x01, 0xE1, 0xA1, + 0x25, 0xA8, 0x06, 0x6D, 0xB9, 0x0C, 0x60, 0xA6, + 0x64, 0xAD, 0x15, 0x65, 0xBA, 0x30, 0x14, 0x66, + 0x22, 0x78, 0xFC, 0x94, 0x4C, 0x4E, 0x25, 0x9B, + 0xD9, 0x06, 0xB1, 0xEA, 0x89, 0x35, 0x62, 0x1E, + 0x8F, 0x69, 0xD4, 0x7F, 0x1C, 0xA0, 0xFD, 0x31, + 0x77, 0xAD, 0x1B, 0x40, 0xA4, 0x10, 0xB7, 0xCC, + 0x4D, 0xAB, 0x16, 0xD7, 0x0C, 0x01, 0x62, 0x87, + 0xBF, 0x4C, 0x50, 0x5A, 0xD8, 0x3B, 0x50, 0xE7, + 0x2C, 0xB3, 0xB7, 0x1F, 0x46, 0xA0, 0x57, 0x6B, + 0x46, 0x98, 0x93, 0xFA, 0xC7, 0xC1, 0x89, 0x45, + 0xDE, 0xD7, 0xC3, 0xC3, 0xBB, 0xCF, 0xEE, 0xEE, + 0xA8, 0xB3, 0xDF, 0x61, 0x4B, 0xE6, 0x04, 0x04, + 0x40, 0xDA, 0xAC, 0x43, 0xDA, 0x9A, 0x15, 0x25, + 0x45, 0x7D, 0xEA, 0x0C, 0x3A, 0x7A, 0xD4, 0x87, + 0xC5, 0x43, 0x77, 0x1D, 0xC6, 0x76, 0xD4, 0xB6, + 0x5A, 0x4B, 0x3F, 0x91, 0x55, 0x98, 0xC2, 0xCE, + 0x8C, 0x5B, 0xED, 0x53, 0x99, 0x20, 0x6D, 0xA6, + 0xF1, 0x96, 0x21, 0x41, 0xBB, 0x16, 0x86, 0x46, + 0xC6, 0x1D, 0x9D, 0xB0, 0x68, 0x69, 0x3D, 0xFE, + 0xC6, 0x16, 0x2C, 0x2B, 0x51, 0x40, 0x40, 0x2A, + 0x01, 0xBF, 0xB3, 0xFF, 0x8A, 0x38, 0x3D, 0x51, + 0xF4, 0x32, 0x74, 0x18, 0xC0, 0x70, 0x26, 0xA7, + 0x27, 0x5D, 0xDE, 0xB1, 0xD8, 0x5E, 0x3D, 0x30, + 0xB2, 0x0C, 0xEC, 0xA5, 0xCC, 0x44, 0x27, 0xC7, + 0x6D, 0x16, 0x01, 0x5A, 0x81, 0xFC, 0x9E, 0x3B, + 0xEE, 0x10, 0x17, 0x41, 0x9A, 0x0A, 0x50, 0x30, + 0x72, 0x6A, 0xCC, 0x01, 0xE0, 0x53, 0x3F, 0xFD, + 0x54, 0x8C, 0x13, 0x6C, 0x9D, 0x0E, 0x47, 0xB4, + 0xD1, 0x59, 0xCA, 0x17, 0xF3, 0x40, 0x10, 0xEA, + 0xCA, 0xD3, 0xA6, 0xDA, 0xA3, 0x28, 0x4B, 0x6E, + 0xBC, 0x42, 0xF8, 0x9D, 0x75, 0xFF, 0x3F, 0xCD, + 0x8E, 0x45, 0xE8, 0x1D, 0xEC, 0x5F, 0x74, 0x87, + 0x61, 0x23, 0x63, 0xA2, 0x79, 0x7B, 0xBB, 0xDE, + 0x72, 0xE5, 0xB6, 0x7B, 0x8B, 0x9A, 0xC7, 0x04, + 0x35, 0xD0, 0x65, 0xCB, 0xD0, 0x44, 0x41, 0xD1, + 0x74, 0x1E, 0xE8, 0x87, 0x6F, 0xE5, 0x25, 0x44, + 0xFB, 0x23, 0xA7, 0x08, 0xF4, 0x89, 0xEA, 0xCF, + 0x1E, 0xE0, 0xE7, 0xC9, 0x12, 0x92, 0xC8, 0xA8, + 0x89, 0x13, 0xA6, 0x07, 0xDC, 0xC9, 0xFA, 0x1F, + 0x2E, 0xB1, 0x04, 0x58, 0xBA, 0xAA, 0x6B, 0xE8, + 0x6B, 0x7D, 0xC8, 0x01, 0x8B, 0x1E, 0xCF, 0x49, + 0xCA, 0x21, 0xAD, 0x61, 0x18, 0xED, 0x8E, 0x83, + 0x00, 0x3E, 0xD9, 0x90, 0x78, 0xE2, 0x22, 0xFF, + 0x8F, 0x54, 0xD4, 0xF9, 0x21, 0x10, 0x37, 0xF4, + 0xFC, 0x2F, 0x15, 0x31, 0x48, 0xB0, 0xD3, 0x36, + 0xC1, 0x32, 0x99, 0x05, 0xDD, 0x6D, 0x3B, 0xBA, + 0x3A, 0x60, 0x91, 0xFE, 0xAE, 0x16, 0xFA, 0x72, + 0x53, 0xC0, 0x75, 0xFC, 0x51, 0xC9, 0x0C, 0x38, + 0x99, 0x5F, 0x19, 0x75, 0xAD, 0x1D, 0x4B, 0xCA, + 0x4A, 0x3C, 0x88, 0x01, 0x40, 0xD2, 0x33, 0xB4, + 0x37, 0x64, 0xDA, 0x3A, 0xAA, 0xBB, 0x93, 0x50, + 0xF5, 0x5A, 0xC4, 0xB5, 0x9D, 0x2D, 0x7B, 0xFA, + 0x7A, 0x84, 0x17, 0x7B, 0x22, 0xD8, 0xBB, 0xEA, + 0x58, 0x80, 0x97, 0xB2, 0x69, 0x70, 0x49, 0x00, + 0x89, 0x4F, 0x09, 0x65, 0xBD, 0x0D, 0x5B, 0xDA, + 0x5A, 0xB0, 0x32, 0x5D, 0x89, 0x1E, 0x46, 0x85, + 0x54, 0xC4, 0x71, 0x8F, 0x54, 0xEC, 0xEE, 0x8F, + 0x7F, 0xAF, 0x90, 0xEA, 0x7A, 0xCC, 0x7D, 0xF1, + 0x72, 0xA5, 0x79, 0x19, 0xC6, 0xF4, 0x5D, 0x61, + 0xF7, 0x24, 0x98, 0xD2, 0x53, 0xEB, 0x26, 0xE4, + 0x01, 0x67, 0xF7, 0xB6, 0x64, 0xC9, 0x59, 0xF3, + 0x30, 0x59, 0xFC, 0x9B, 0xD1, 0x65, 0x05, 0xD3, + 0x68, 0xB8, 0x68, 0x7D, 0xB5, 0xC7, 0xB3, 0x8F, + 0x59, 0x2E, 0x92, 0x5C, 0xC7, 0x7F, 0x3D, 0xFE, + 0x73, 0x88, 0x1F, 0x77, 0xB2, 0xF2, 0x9E, 0x55, + 0x57, 0x8F, 0x34, 0x9A, 0x61, 0x0C, 0x7B, 0xD3, + 0x5C, 0x15, 0xAE, 0xC2, 0x16, 0xB4, 0xC2, 0x2B, + 0xA5, 0x75, 0x6A, 0xA4, 0x31, 0x81, 0xA7, 0x67, + 0xE7, 0x30, 0x84, 0x28, 0xD0, 0x60, 0xA2, 0x71, + 0xF9, 0xE0, 0x33, 0xFF, 0xAB, 0x01, 0x04, 0x22, + 0x84, 0x42, 0x04, 0x02, 0x99, 0xFB, 0x9F, 0x5F, + 0xB9, 0x7F, 0xF5, 0x21, 0xDB, 0xC6, 0xA5, 0x00, + 0x60, 0x9D, 0x8B, 0x07, 0xAB, 0x7D, 0x03, 0xE2, + 0xD3, 0x45, 0xF0, 0x6E, 0xBD, 0x0D, 0x4B, 0xA4, + 0x23, 0x8A, 0x77, 0x1B, 0xCF, 0x75, 0x30, 0x96, + 0x33, 0xE4, 0x6A, 0x94, 0x6F, 0x01, 0xA1, 0x41, + 0xC1, 0x88, 0x5B, 0x97, 0xCD, 0x3E, 0x56, 0xD0, + 0x53, 0x88, 0x9C, 0xE3, 0x3C, 0x00, 0x1A, 0xA8, + 0x6C, 0xB7, 0xA3, 0xDC, 0x03, 0x96, 0x14, 0xF2, + 0x7E, 0xB7, 0x1C, 0x80, 0xEA, 0x49, 0x21, 0x8B, + 0x48, 0x85, 0xF8, 0x93, 0x89, 0x3D, 0x5D, 0x5F, + 0x13, 0x33, 0x93, 0xC3, 0x1C, 0x4E, 0x2D, 0xE0, + 0xE2, 0x1D, 0x2A, 0x51, 0xE7, 0x07, 0xF5, 0x38, + 0xB8, 0x75, 0x4A, 0x2A, 0xFE, 0x5C, 0x37, 0x0E, + 0x7C, 0xEA, 0x5C, 0xB6, 0x7E, 0xCE, 0x2C, 0x25, + 0x5C, 0xD1, 0xFF, 0x66, 0x06, 0x94, 0x59, 0x9A, + 0x7F, 0x7D, 0xED, 0x21, 0x69, 0xAD, 0xC6, 0x9F, + 0x49, 0x7B, 0xC7, 0xA7, 0x74, 0xC8, 0xE4, 0xC6, + 0x65, 0x63, 0x07, 0xC9, 0x65, 0x0F, 0xBC, 0xBC, + 0x1C, 0xC7, 0xD3, 0xAC, 0x7C, 0x2E, 0x2B, 0x4B, + 0xB9, 0x3F, 0xF7, 0x59, 0xC2, 0x7A, 0x0C, 0x86, + 0xF4, 0x23, 0xFB, 0x75, 0xE9, 0x59, 0x9B, 0x48, + 0xC0, 0x7E, 0x13, 0x59, 0x07, 0x72, 0xED, 0x00, + 0x87, 0x50, 0xE9, 0x45, 0xBD, 0x0D, 0xCF, 0x1C, + 0x94, 0xCD, 0x1E, 0xD2, 0x1C, 0x36, 0xA5, 0x80, + 0xD9, 0x24, 0x8F, 0x13, 0xC7, 0x75, 0x53, 0x5B, + 0x24, 0x47, 0xD3, 0x12, 0xC9, 0x5C, 0xE8, 0x0E, + 0x2E, 0x65, 0xA7, 0xAD, 0x6C, 0xFB, 0x97, 0x5C, + 0x0E, 0xF6, 0x9D, 0x33, 0x49, 0x8D, 0x27, 0x24, + 0x64, 0x9F, 0x29, 0x97, 0x2A, 0x3A, 0xF8, 0x2B, + 0xA3, 0x0A, 0xE0, 0xF2, 0x96, 0x7C, 0x76, 0x55, + 0xD9, 0x6F, 0x0B, 0x29, 0xF1, 0xE3, 0x90, 0x58, + 0xBD, 0xB0, 0x20, 0xCA, 0x1B, 0xAB, 0xC7, 0x78, + 0xF4, 0x7B, 0x8F, 0xA0, 0x70, 0xAA, 0x89, 0xBB, + 0x7F, 0xA4, 0xA0, 0xDF, 0x0C, 0x20, 0x0B, 0x79, + 0xAD, 0x8A, 0x30, 0xA6, 0x72, 0x4A, 0xA8, 0x2C, + 0xAC, 0x12, 0x70, 0x3A, 0x70, 0xD4, 0x48, 0x1A, + 0x53, 0x79, 0x5D, 0x65, 0x41, 0xD3, 0xB0, 0x7D, + 0xDD, 0x27, 0x95, 0xE4, 0xCC, 0x51, 0x36, 0x70, + 0x2F, 0x0B, 0x1F, 0x67, 0x43, 0xE5, 0x5F, 0x77, + 0xFB, 0xA8, 0x9C, 0xB4, 0x6C, 0x6A, 0xB0, 0x60, + 0xEC, 0xCD, 0xDE, 0x63, 0x9D, 0x0F, 0x7B, 0x47, + 0xE5, 0xFC, 0xBB, 0xF5, 0x79, 0x35, 0x53, 0x0E, + 0x71, 0x4F, 0x29, 0x63, 0x96, 0x21, 0x07, 0x3B, + 0x44, 0x9F, 0x1F, 0x32, 0xEA, 0x0B, 0x5F, 0x9C, + 0x44, 0x9A, 0x6E, 0xA2, 0x8A, 0x70, 0x55, 0xA7, + 0x23, 0x78, 0xE8, 0xA7, 0x4E, 0xD8, 0xFB, 0x08, + 0xE9, 0x79, 0xCC, 0xD1, 0x45, 0xF6, 0x9A, 0xF2, + 0x54, 0xEC, 0x75, 0x7F, 0x24, 0x8A, 0xE6, 0x55, + 0x47, 0xB9, 0xD1, 0x7D, 0x85, 0x35, 0xC7, 0x61, + 0x41, 0xA8, 0x5A, 0xB6, 0xDC, 0x69, 0x04, 0x66, + 0xE1, 0x3A, 0x3C, 0xE1, 0x3D, 0x3D, 0xF5, 0xA6, + 0x84, 0x18, 0xAE, 0xDF, 0xF7, 0x5A, 0xCA, 0x06, + 0x95, 0x08, 0xBE, 0xD2, 0x06, 0x85, 0xD7, 0x53, + 0x53, 0x95, 0xD3, 0xB3, 0x38, 0x4A, 0x0F, 0x11, + 0x51, 0xAA, 0x1C, 0xB2, 0x0C, 0x1C, 0xBA, 0x89, + 0xF6, 0x2D, 0xAD, 0x80, 0x58, 0xD9, 0xF7, 0x34, + 0x95, 0x01, 0xB4, 0xF1, 0x3A, 0x97, 0x07, 0xC7, + 0x47, 0x9C, 0x1C, 0x31, 0xE9, 0xC8, 0x9C, 0x5F, + 0x47, 0x95, 0xAF, 0x6A, 0x10, 0x89, 0x34, 0x54, + 0x74, 0xBB, 0x2B, 0x7D, 0xA7, 0xF2, 0xD0, 0x31, + 0xAC, 0x87, 0x07, 0x2A, 0xF2, 0xE3, 0xD2, 0x11, + 0xB0, 0x21, 0x94, 0xC9, 0x23, 0x90, 0x61, 0xF1, + 0x72, 0x28, 0xCC, 0xA3, 0xF2, 0x6B, 0x22, 0xE1, + 0xC8, 0x4A, 0xE1, 0x7D, 0xA5, 0x15, 0x43, 0xC2, + 0x42, 0xB8, 0x5D, 0x32, 0x62, 0xF0, 0x57, 0xFF, + 0x62, 0x18, 0xFA, 0x95, 0x28, 0xD1, 0x99, 0xC8, + 0x1D, 0xC5, 0xB2, 0x88, 0x53, 0x52, 0x65, 0xA6, + 0x8E, 0x77, 0x79, 0x1E, 0x06, 0x1C, 0x6C, 0x3C, + 0x26, 0xED, 0xEB, 0x1D, 0x56, 0x7F, 0x3D, 0x58, + 0x11, 0xEF, 0x44, 0xD8, 0x00, 0xB0, 0xE6, 0x67, + 0xE7, 0x9D, 0x7F, 0x10, 0x2D, 0xDF, 0x97, 0xB6, + 0x6E, 0xB6, 0x41, 0x1F, 0xC4, 0x45, 0x76, 0xB5, + 0x39, 0xEE, 0x80, 0xCF, 0xE6, 0x01, 0x62, 0x15, + 0xF8, 0x01, 0x0A, 0x69, 0x79, 0xCD, 0x64, 0xAB, + 0x86, 0x5F, 0x68, 0x5D, 0x86, 0xD6, 0x2B, 0xCB, + 0xD2, 0x2A, 0x15, 0x7D, 0xC0, 0x38, 0x58, 0x29, + 0xF3, 0x2B, 0x35, 0x7A, 0xAE, 0x1C, 0xCC, 0xA6, + 0x06, 0x74, 0xE1, 0x90, 0xB8, 0x04, 0x6F, 0x69, + 0x1F, 0x3B, 0xBB, 0x96, 0x4E, 0xE2, 0x4A, 0x0D, + 0x1F, 0xC0, 0x57, 0x60, 0xBB, 0x16, 0x86, 0xEB, + 0x69, 0x97, 0xE3, 0xAA, 0x5F, 0xE5, 0x98, 0xA8, + 0x28, 0xF3, 0x73, 0x5E, 0x86, 0x47, 0x60, 0xA3, + 0xFF, 0x70, 0x4E, 0x25, 0x71, 0x89, 0x4C, 0x92, + 0x12, 0x8F, 0x38, 0x54, 0x2D, 0xD5, 0xB6, 0x53, + 0xEF, 0x1C, 0x02, 0x69, 0xBD, 0x04, 0xF6, 0x7C, + 0x64, 0x0D, 0x1B, 0x04, 0x96, 0x45, 0xE7, 0x87, + 0x73, 0xCF, 0x45, 0x3A, 0x5F, 0xED, 0x25, 0xE2, + 0xAF, 0x77, 0x8B, 0x4D, 0x37, 0x4D, 0x09, 0x6C, + 0xA9, 0x5A, 0x5E, 0x92, 0x39, 0x4F, 0x2A, 0xEA, + 0x2D, 0xCD, 0x6F, 0xBE, 0x64, 0x7C, 0x1B, 0x19, + 0x39, 0x96, 0x60, 0xC0, 0xD8, 0x22, 0xE8, 0x8A, + 0xC0, 0x3F, 0x6C, 0x43, 0xB3, 0xB1, 0x71, 0xC2, + 0xFE, 0x70, 0xA1, 0xF6, 0x26, 0x34, 0xF0, 0x35, + 0x50, 0x5A, 0xC8, 0xE2, 0x3D, 0x8D, 0x5F, 0x3F, + 0xCB, 0x77, 0x7A, 0x1E, 0x64, 0x70, 0x16, 0x33, + 0x63, 0x9C, 0xAC, 0xC3, 0x1B, 0xA7, 0xCD, 0xD5, + 0x52, 0x85, 0x2F, 0x81, 0x14, 0x3C, 0xB9, 0xB6, + 0x12, 0xEC, 0x5E, 0x32, 0x02, 0xB5, 0x37, 0xF9, + 0xE1, 0xF6, 0x0E, 0xC3, 0x53, 0xE0, 0x25, 0xDD, + 0x75, 0xB3, 0xF5, 0x99, 0x41, 0xF1, 0xA7, 0x26, + 0xA6, 0x4C, 0xBD, 0xD2, 0x32, 0x81, 0xC0, 0x5C, + 0xDF, 0x2D, 0xE8, 0x0F, 0x54, 0x76, 0xD5, 0x01, + 0x18, 0xA0, 0x8F, 0xB0, 0xE1, 0x62, 0x8B, 0x68, + 0xCA, 0xD3, 0x99, 0xDC, 0x47, 0xEA, 0x7A, 0xBA, + 0x3A, 0xE1, 0x61, 0x4C, 0x94, 0xC1, 0xB2, 0x72, + 0xEF, 0xC4, 0x44, 0x69, 0xB1, 0x0D, 0x27, 0x42, + 0xE2, 0x1B, 0x8C, 0xA7, 0x7C, 0x41, 0x2B, 0x73, + 0xF1, 0x26, 0x8A, 0x64, 0xD5, 0x42, 0x87, 0x58, + 0xFA, 0x5D, 0x37, 0x27, 0x11, 0xAD, 0xE5, 0x9D, + 0x1F, 0xC8, 0x69, 0xA7, 0x14, 0x8C, 0x5D, 0xD6, + 0x55, 0x4E, 0xD8, 0xB4, 0xFE, 0x65, 0xAD, 0xAD, + 0x0D, 0xD6, 0x10, 0xE5, 0x1D, 0x3F, 0x34, 0x5C, + 0x1C, 0xE7, 0x51, 0xCF, 0x3C, 0x24, 0x84, 0x64, + 0xE4, 0xBF, 0xF6, 0xBA, 0x90, 0x4B, 0x83, 0x83, + 0x23, 0xF8, 0x9C, 0xDB, 0xA9, 0xD9, 0x99, 0x59, + 0x39, 0x3F, 0x99, 0x27, 0x94, 0x8E, 0x2E, 0xCE, + 0x4E, 0x37, 0xAA, 0x6C, 0x74, 0xE4, 0x84, 0x84, + 0xAE, 0x65, 0x71, 0x76, 0x04, 0x15, 0x28, 0xEB, + 0xCE, 0x00, 0x94, 0xF4, 0x2F, 0x27, 0x45, 0x89, + 0x0F, 0xD8, 0x2B, 0xA7, 0x3C, 0x9D, 0xF1, 0x38, + 0x88, 0xB0, 0xF6, 0x7A, 0x4C, 0xED, 0x3D, 0x0E, + 0x2E, 0x97, 0x4E, 0x08, 0xDC, 0x73, 0xDB, 0x19, + 0x09, 0x7B, 0x3D, 0x4A, 0x0B, 0x2B, 0xDB, 0x6F, + 0x05, 0x12, 0x6E, 0xC8, 0xC2, 0x7E, 0x37, 0x75, + 0xF9, 0x08, 0x0C, 0x6C, 0x91, 0xA1, 0x49, 0x98, + 0xA8, 0xC0, 0x37, 0xE9, 0x7D, 0xE8, 0x58, 0x10, + 0xB0, 0xB3, 0x07, 0xD6, 0x06, 0x36, 0xE9, 0xAA, + 0xC0, 0xC6, 0xC0, 0x54, 0xCD, 0x8F, 0xA3, 0x49, + 0x13, 0x62, 0x56, 0x30, 0xC0, 0xC2, 0xEE, 0x07, + 0x07, 0x58, 0xAF, 0x41, 0xD3, 0x4B, 0x4D, 0xC4, + 0xFE, 0xAD, 0x19, 0xD8, 0x03, 0x39, 0xCA, 0x80, + 0xB4, 0xDD, 0x40, 0x06, 0x54, 0x6A, 0xBA, 0xC1, + 0xB1, 0xD0, 0xEE, 0x00, 0xD0, 0x47, 0xA5, 0x2C, + 0x44, 0x17, 0xA3, 0xC3, 0x10, 0x20, 0x93, 0xC3, + 0xC9, 0xE6, 0xA2, 0xE1, 0x13, 0x29, 0xA7, 0x97, + 0xE8, 0xC3, 0x8F, 0x0D, 0x17, 0xA9, 0xE3, 0xC1, + 0x4F, 0xBD, 0x8B, 0x2B, 0xE2, 0xB2, 0x1E, 0xFE, + 0xBC, 0x3A, 0xE0, 0xE9, 0x20, 0x90, 0xFC, 0x35, + 0xBE, 0x30, 0x3E, 0x50, 0x93, 0x10, 0x40, 0xB0, + 0x44, 0xAF, 0xFA, 0x66, 0x04, 0x70, 0x62, 0xCE, + 0x60, 0x5B, 0xAE, 0xD3, 0x5D, 0x58, 0xCD, 0xAF, + 0xE4, 0x2B, 0x1C, 0x2E, 0xF5, 0xD7, 0x9C, 0x79, + 0x6B, 0xDB, 0x44, 0xE8, 0x10, 0xA0, 0x48, 0x80, + 0x89, 0xD9, 0xCA, 0xF1, 0x09, 0xA4, 0x34, 0xF4, + 0x74, 0xAF, 0x2F, 0x02, 0xDA, 0x4B, 0x6C, 0xAF, + 0x87, 0x5E, 0x4A, 0xEC, 0x20, 0xB5, 0x8D, 0x6D, + 0x45, 0x9C, 0xA1, 0x67, 0x9A, 0xB9, 0xFE, 0x32, + 0xF8, 0xC1, 0xD8, 0x34, 0x3D, 0xC6, 0xA5, 0xA5, + 0x05, 0xDE, 0xAA, 0xEB, 0x87, 0xF7, 0xB7, 0x77, + 0x4F, 0x96, 0xC0, 0x60, 0xA8, 0xDA, 0xD7, 0xA3, + 0x91, 0x61, 0xF0, 0xF9, 0x29, 0xBB, 0x63, 0xA1, + 0x2D, 0xEC, 0xE8, 0xAF, 0x5F, 0x0A, 0x6D, 0x8F, + 0x12, 0x39, 0xB9, 0x94, 0x4C, 0xAD, 0x86, 0x45, + 0x05, 0xFE, 0x48, 0x66, 0x9B, 0x9F, 0x3F, 0xDF, + 0x5F, 0xB4, 0x46, 0x3A, 0xA2, 0x50, 0x10, 0x92, + 0x77, 0x18, 0xB3, 0x2F, 0xF7, 0x47, 0x11, 0x90, + 0x10, 0xC7, 0x72, 0x6C, 0x14, 0xD4, 0xE5, 0x62, + 0xE1, 0x36, 0x96, 0x42, 0x9F, 0x1F, 0xBC, 0x8C, + 0xBC, 0xC4, 0xD2, 0x6C, 0x9E, 0x04, 0xD4, 0xD8, + 0xF8, 0xF3, 0x98, 0x04, 0x06, 0x7A, 0x98, 0x54, + 0xF0, 0xCB, 0x3E, 0x43, 0xFD, 0x55, 0x09, 0x2B, + 0x81, 0x74, 0x10, 0x56, 0xBC, 0x47, 0x94, 0xB3, + 0x3E, 0xF2, 0xE6, 0x86, 0x76, 0xC6, 0xBD, 0x3D, + 0xBD, 0xD0, 0xC7, 0xDB, 0xB8, 0x18, 0xD8, 0xB8, + 0x0C, 0x67, 0x7B, 0x37, 0x4F, 0x5F, 0x4B, 0xCD, + 0x4D, 0x96, 0x2C, 0x4A, 0x20, 0x3F, 0xDF, 0x3A, + 0x43, 0x67, 0x69, 0x00, 0x62, 0x06, 0x94, 0x79, + 0xD7, 0x00, 0xAA, 0x36, 0x01, 0xA0, 0x30, 0x3E, + 0x2D, 0x34, 0xEF, 0xAD, 0x6E, 0xED, 0xBD, 0x4D, + 0xB9, 0x04, 0xF1, 0x3D, 0x6E, 0x75, 0xB0, 0xF5, + 0x52, 0x24, 0x90, 0x7D, 0xFB, 0x48, 0xE8, 0x08, + 0x88, 0xDB, 0x65, 0x80, 0x6A, 0x7F, 0x56, 0xB6, + 0x2B, 0x00, 0x80, 0xAD, 0x75, 0x44, 0x63, 0xA0, + 0x00, 0xB9, 0xFF, 0x1B, 0xCB, 0x70, 0x53, 0x13, + 0xA1, 0xEA, 0xDC, 0xE2, 0x9A, 0x58, 0x1D, 0xF7, + 0xF7, 0x4A, 0x5C, 0x40, 0xEF, 0xAF, 0xB5, 0x53, + 0x85, 0xBA, 0x08, 0x46, 0x9C, 0x0A, 0x28, 0x7B, + 0x8B, 0xD0, 0x44, 0x29, 0xD1, 0x49, 0x18, 0x92, + 0x30, 0xEB, 0x7F, 0x02, 0xFA, 0x6A, 0x3B, 0xD9, + 0x0A, 0xA1, 0x55, 0x1C, 0xEE, 0x1E, 0x3A, 0x0A, + 0xC0, 0x5D, 0xA9, 0xC1, 0x3F, 0x2E, 0x11, 0xD2, + 0xD2, 0x4D, 0xFA, 0xD6, 0x46, 0xC7, 0x01, 0xD5, + 0x59, 0x24, 0x50, 0x2F, 0xEB, 0xA9, 0xD5, 0xED, + 0xEF, 0x67, 0xA1, 0x8B, 0x51, 0xE1, 0x67, 0xB5, + 0x33, 0xE4, 0x50, 0x30, 0xE1, 0xC3, 0xF0, 0x40, + 0x60, 0x19, 0x0F, 0xCB, 0x19, 0x0B, 0x0E, 0xFC, + 0x61, 0x4A, 0xDE, 0xB0, 0x4D, 0x7B, 0xF4, 0xCB, + 0x4B, 0x90, 0x10, 0x3D, 0xE5, 0x59, 0x3B, 0xF7, + 0x72, 0xE8, 0x19, 0x76, 0xA2, 0x51, 0xF9, 0x3D, + 0x7D, 0x74, 0x52, 0xAC, 0x69, 0xB5, 0xC3, 0x5A, + 0xDD, 0x0D, 0x32, 0xDE, 0x86, 0xC2, 0x20, 0xBD, + 0x51, 0xDC, 0xE2, 0x88, 0x90, 0xD2, 0x12, 0x30, + 0x9F, 0x6E, 0x64, 0x16, 0xE8, 0x46, 0x09, 0xEF, + 0x41, 0xB6, 0x66, 0x34, 0xBB, 0x59, 0x56, 0xBC, + 0x1C, 0x55, 0x13, 0xBF, 0xFE, 0xEE, 0x2C, 0xE5, + 0x4F, 0x26, 0x99, 0xDC, 0x84, 0x9E, 0xEF, 0x9F, + 0xB5, 0x4E, 0xF4, 0x93, 0xE9, 0x04, 0x08, 0xE2, + 0xCE, 0x87, 0x38, 0x73, 0x39, 0xC3, 0x4B, 0x26, + 0xA4, 0x5A, 0x1F, 0x8C, 0x12, 0xA9, 0xC9, 0x12, + 0x2C, 0xD7, 0xC3, 0x5F, 0x47, 0x5D, 0x9D, 0xEF, + 0x00, 0xF1, 0xF7, 0x20, 0x08, 0x02, 0xC8, 0xBA, + 0x30, 0xC1, 0x95, 0xF3, 0x02, 0x32, 0xE9, 0x38, + 0x58, 0x38, 0xAE, 0x70, 0xF5, 0x29, 0x63, 0x1F, + 0x3D, 0xEC, 0x7D, 0xB3, 0x20, 0x78, 0xB5, 0x77, + 0xFB, 0x2B, 0x78, 0xFB, 0xDC, 0xA4, 0xC0, 0x2A, + 0x76, 0x3F, 0x84, 0x00, 0x74, 0x0D, 0x66, 0x5F, + 0x2D, 0xBB, 0xE5, 0x41, 0x9D, 0x07, 0xBB, 0x99, + 0x14, 0x27, 0x4D, 0xEF, 0x9A, 0x28, 0x44, 0x9F, + 0x3F, 0x66, 0x20, 0x8C, 0xC6, 0xD6, 0x24, 0xCD, + 0x67, 0x7C, 0x42, 0x8E, 0xC6, 0xEF, 0x7F, 0x25, + 0x2D, 0x74, 0xCA, 0x81, 0xDB, 0x26, 0xAE, 0xCB, + 0xA7, 0x83, 0xFD, 0x95, 0x46, 0xC5, 0xBE, 0x5C, + 0xFC, 0x07, 0xC5, 0xFF, 0x34, 0x70, 0x82, 0x6E, + 0xC7, 0x90, 0xAF, 0xC8, 0x99, 0xAB, 0xA7, 0x4E, + 0x02, 0xC1, 0x92, 0x22, 0x05, 0xA8, 0x38, 0xF8, + 0x78, 0xA3, 0x23, 0x0E, 0xD6, 0x27, 0x27, 0xE4, + 0x55, 0xEF, 0x5A, 0xBE, 0x22, 0x1B, 0xF9, 0x00, + 0xC4, 0x02, 0x44, 0x28, 0xF0, 0x40, 0x16, 0x97, + 0x17, 0x6E, 0x1A, 0x66, 0x1B, 0x98, 0xD8, 0x89, + 0x69, 0xB1, 0x8F, 0x61, 0x30, 0xC9, 0xB4, 0x84, + 0x04, 0xDF, 0x5F, 0x72, 0xAA, 0xA7, 0xC5, 0x24, + 0xC6, 0x1E, 0x80, 0xEE, 0x3A, 0x06, 0xED, 0x8F, + 0xAA, 0x73, 0xED, 0x00, 0xBB, 0x08, 0xFA, 0xF8, + 0x68, 0x2A, 0xCE, 0x3B, 0xA1, 0x98, 0x9A, 0xD6, + 0x55, 0xB7, 0x93, 0xE2, 0xCA, 0x7A, 0x2C, 0xAD, + 0x2D, 0xC7, 0x13, 0x7C, 0x9C, 0x2F, 0xFD, 0x2E, + 0xB6, 0x61, 0xCB, 0xA0, 0x93, 0x39, 0xC8, 0x56, + 0xD5, 0xCE, 0xD3, 0x9F, 0xE5, 0x06, 0x7E, 0x7E, + 0xDE, 0x05, 0x2B, 0x4E, 0x14, 0xB7, 0xD1, 0xB3, + 0xF0, 0x3B, 0x17, 0xF3, 0xA2, 0x61, 0x64, 0x88, + 0x28, 0x41, 0xE4, 0x90, 0x5F, 0x04, 0x6A, 0x12, + 0x01, 0x56, 0x7B, 0x9F, 0x4C, 0x51, 0x33, 0x13, + 0x9B, 0x40, 0xDB, 0xBD, 0x78, 0x38, 0x54, 0x96, + 0x0B, 0x20, 0xA0, 0x8D, 0x55, 0xD4, 0xD6, 0x15, + 0xAD, 0x75, 0x71, 0x0F, 0xC3, 0xBB, 0x78, 0x10, + 0xB3, 0xA2, 0xAF, 0x7A, 0x01, 0x16, 0x4D, 0xDC, + 0xFC, 0xBC, 0xCA, 0x24, 0xEF, 0x47, 0xBE, 0xDD, + 0x4A, 0xF9, 0x64, 0xCA, 0xBA, 0xF5, 0x74, 0xD0, + 0x53, 0x70, 0x75, 0xD9, 0x21, 0x91, 0x23, 0xF0, + 0x68, 0x02, 0xFF, 0x90, 0xA8, 0xC5, 0xB5, 0x87, + 0x6C, 0x17, 0x73, 0x4C, 0x8C, 0xFC, 0xBC, 0x7C, + 0x5E, 0xAE, 0x98, 0x34, 0xCC, 0x7C, 0xDC, 0xB6, + 0x26, 0x5F, 0x82, 0x6E, 0xF0, 0x41, 0x21, 0x43, + 0x00, 0xCB, 0x58, 0x13, 0xEB, 0x9B, 0xDB, 0x1B, + 0x0A, 0x8F, 0x3A, 0xD4, 0x1F, 0xA9, 0x51, 0x98, + 0xBA, 0xA2, 0x04, 0xF2, 0xA2, 0x9B, 0x88, 0x2D, + 0x89, 0x72, 0x4C, 0xA3, 0xD6, 0x64, 0xE4, 0x2C, + 0xAC, 0x6A, 0x2C, 0x40, 0x98, 0x28, 0x7E, 0xFF, + 0x7F, 0xE6, 0xF8, 0x6B, 0x22, 0xF7, 0x94, 0xE5, + 0x07, 0xDF, 0x58, 0x7F, 0xA4, 0xAC, 0xC7, 0xC5, + 0x5E, 0x9D, 0x27, 0x66, 0x6E, 0x12, 0x52, 0x50, + 0x8B, 0x48, 0x3E, 0x72, 0xAA, 0xB8, 0xFB, 0x9B, + 0xB2, 0xD2, 0xA4, 0xE8, 0x30, 0x02, 0x41, 0x21, + 0x61, 0x9A, 0x2C, 0xD0, 0x80, 0x20, 0xD2, 0xB3, + 0x33, 0x78, 0x46, 0x0A, 0x50, 0x83, 0x43, 0x43, + 0xE3, 0x38, 0xAC, 0xE3, 0xBB, 0xCB, 0x8B, 0x4B, + 0x8B, 0x72, 0xD4, 0xFA, 0x86, 0x36, 0x16, 0xF4, + 0x54, 0xAD, 0x78, 0x94, 0x51, 0x11, 0x47, 0xC6, + 0x46, 0xFB, 0x79, 0x1D, 0x47, 0xF4, 0xB3, 0xB1, + 0x32, 0xCF, 0x1F, 0x4B, 0x99, 0x84, 0xE6, 0x9B, + 0x18, 0x0E, 0xBC, 0xF5, 0xB5, 0x27, 0x5A, 0x6A, + 0x42, 0xCA, 0xCE, 0x02, 0x21, 0x21, 0x8D, 0x5D, + 0x1F, 0x87, 0x17, 0xBB, 0x43, 0xF3, 0x01, 0xCB, + 0x47, 0x5C, 0xCA, 0xA6, 0xCE, 0xE7, 0x97, 0xC5, + 0x0F, 0xD8, 0x73, 0xEF, 0x37, 0x87, 0xFD, 0x3C, + 0xBC, 0x67, 0xD1, 0xBD, 0x65, 0xD5, 0x51, 0x9C, + 0x1E, 0xA5, 0x17, 0x7A, 0xA2, 0x12, 0x72, 0xB2, + 0x32, 0xE9, 0xEF, 0x8D, 0x57, 0x87, 0xCD, 0x0F, + 0x8F, 0x54, 0xE2, 0x8E, 0x56, 0xE6, 0x66, 0xB4, + 0x36, 0x8D, 0x27, 0x4B, 0x9B, 0x2B, 0x36, 0xF2, + 0x0C, 0xD3, 0xE1, 0x9F, 0x45, 0x95, 0x81, 0x52, + 0xD0, 0x6B, 0x45, 0x3A, 0xE0, 0x30, 0xF0, 0x23, + 0xA1, 0x1A, 0x74, 0x0C, 0xD6, 0x06, 0x7E, 0xAB, + 0x29, 0x92, 0x14, 0x6E, 0xB4, 0x64, 0x30, 0xE5, + 0x67, 0xDC, 0xD2, 0xAB, 0x71, 0xA1, 0xC1, 0x01, + 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, + 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, + 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, + 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, + 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, + 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, + 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, + 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, + 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x97, 0x40, + 0xC2, 0x79, 0xEB, 0x90, 0x4A, 0x9A, 0xEE, 0x36, + 0xB4, 0x0F, 0x19, 0x62, 0xB8, 0x68, 0x08, 0xC8, + 0x48, 0x93, 0x25, 0x49, 0x91, 0x21, 0x41, 0x81, + 0x01, 0xDA, 0xA0, 0xD4, 0x0C, 0xDC, 0x6C, 0xB4, + 0x34, 0x8F, 0xC1, 0xB4, 0x6C, 0xBC, 0x30, 0xF0, + 0x70, 0xAB, 0x1D, 0x71, 0xA9, 0x19, 0x78, 0xB8, + 0x38, 0xE3, 0x54, 0x38, 0xE1, 0x51, 0x30, 0xF8, + 0x38, 0xE3, 0x54, 0x39, 0xE0, 0x51, 0x70, 0xA0, + 0x24, 0xFD, 0x6A, 0x02, 0xFB, 0x4F, 0x0E, 0x4A, + 0xDA, 0x43, 0xE4, 0x99, 0x50, 0xF1, 0xD8, 0x3A, + 0x9E, 0x67, 0x98, 0xE6, 0x77, 0xD5, 0xFC, 0x6E, + 0xD7, 0x1E, 0xFD, 0x80, 0x0D, 0xAC, 0x99, 0x4C, + 0x99, 0x53, 0x4F, 0x09, 0x7B, 0xE1, 0x2B, 0x41, + 0x6B, 0x9A, 0x79, 0x40, 0xCD, 0x28, 0x1D, 0x88, + 0x5D, 0x53, 0xB0, 0x09, 0x84, 0xE1, 0x2B, 0x01, + 0x2B, 0x1E, 0x02, 0x80, 0xF2, 0xAC, 0x7A, 0x17, + 0x21, 0x17, 0x17, 0x96, 0xF8, 0xA5, 0x73, 0x6E, + 0x35, 0x33, 0x6B, 0xE9, 0xDF, 0x81, 0x3F, 0x84, + 0xEB, 0x8D, 0xE5, 0x72, 0x74, 0x3F, 0xE1, 0xCE, + 0xB5, 0x93, 0xDB, 0x49, 0x6F, 0x21, 0xBF, 0x88, + 0xB7, 0x93, 0xDB, 0x48, 0x6E, 0x21, 0xBE, 0x81, + 0xFE, 0xDA, 0x58, 0x2D, 0xF5, 0x25, 0x7D, 0xA4, + 0x24, 0x9F, 0xD5, 0xA0, 0x78, 0xA8, 0xFC, 0x3C, + 0xBC, 0x67, 0xD1, 0xBD, 0x65, 0xD5, 0xB5, 0x75, + 0xF5, 0x2E, 0x98, 0xF4, 0x2C, 0x9C, 0xFC, 0x3C, + 0xBC, 0x67, 0xF9, 0x9C, 0x44, 0x94, 0xD0, 0x19, + 0x99, 0x22, 0x84, 0x58, 0x82, 0x32, 0x52, 0x88, + 0x08, 0xB3, 0x75, 0x18, 0xC0, 0x70, 0x6C, 0xAB, + 0x2B, 0x90, 0x9A, 0xFB, 0x21, 0xF1, 0xAD, 0x65, + 0xE5, 0x5E, 0xFC, 0x9E, 0x44, 0x94, 0x38, 0xF6, + 0x74, 0xCF, 0xED, 0x87, 0x5F, 0x8F, 0x4B, 0x84, + 0x06, 0xBD, 0x4F, 0x25, 0xFD, 0x2D, 0xC1, 0x0E, + 0x8C, 0x37, 0x71, 0x04, 0xDC, 0x0C, 0xB8, 0x77, + 0xF5, 0x4E, 0x48, 0x35, 0xEF, 0x3F, 0xE7, 0x2F, + 0xAF, 0x14, 0x82, 0xFC, 0x26, 0xF6, 0x2A, 0xED, + 0x6D, 0xD6, 0x34, 0x4A, 0x90, 0x40, 0xE8, 0x3A, + 0xB8, 0x03, 0x5D, 0x37, 0xEF, 0x3F, 0x3B, 0xE3, + 0x61, 0xDA, 0x2C, 0x4A, 0x92, 0x42, 0x14, 0x95, + 0x15, 0x4F, 0x7B, 0x11, 0x78, 0x48, 0x2E, 0xF2, + 0x78, 0x32, 0x05, 0x6F, 0x15, 0xEE, 0x8E, 0xC7, + 0x4E, 0xB0, 0x04, 0x68, 0x55, 0xE1, 0x81, 0xE4, + 0x66, 0xBD, 0xEE, 0x87, 0x5F, 0x0A, 0x62, 0xA2, + 0x07, 0xDF, 0x69, 0xA0, 0x71, 0xC1, 0x00, 0x43, + 0xC5, 0xAF, 0x9D, 0xF7, 0x8A, 0x60, 0x27, 0xFA, + 0x8A, 0x51, 0xD1, 0xFC, 0x24, 0xA5, 0x40, 0x86, + 0x27, 0x7A, 0xCA, 0x8F, 0x84, 0x29, 0xB9, 0x79, + 0xF9, 0x22, 0xA2, 0x8F, 0x57, 0xD6, 0x31, 0xF7, + 0x56, 0x05, 0xB5, 0xF0, 0x6B, 0xC6, 0x56, 0x96, + 0x16, 0xCD, 0x4D, 0x60, 0xB8, 0x39, 0xDC, 0x1A, + 0xBB, 0xE9, 0x59, 0x1C, 0x57, 0xFA, 0x6A, 0xAA, + 0x2A, 0xF1, 0x71, 0x5C, 0x84, 0x15, 0xF8, 0x3E, + 0x8F, 0xD8, 0x68, 0x95, 0xC7, 0x71, 0x90, 0xDB, + 0x5D, 0x0F, 0xF0, 0xB5, 0x6E, 0xC3, 0x53, 0x93, + 0x13, 0xC8, 0x48, 0x65, 0xBD, 0x9C, 0x72, 0xB4, + 0x38, 0xEB, 0xDF, 0xFA, 0x22, 0xF7, 0x96, 0x56, + 0x77, 0x3C, 0x8C, 0x51, 0x0E, 0xB8, 0x19, 0x56, + 0xD0, 0xC2, 0x7F, 0xBA, 0x39, 0x94, 0x04, 0xC4, + 0x44, 0x9F, 0x1F, 0x32, 0xEA, 0x6B, 0x9A, 0x5C, + 0xFD, 0xB4, 0x04, 0x41, 0x8A, 0x27, 0xB7, 0x77, + 0xF7, 0x2C, 0xAC, 0x81, 0x59, 0x68, 0x9C, 0x5A, + 0xEB, 0xA3, 0x13, 0x5E, 0x13, 0xA5, 0xEC, 0x0F, + 0x06, 0x8E, 0x25, 0xB9, 0x61, 0xD1, 0x87, 0x06, + 0x86, 0xCC, 0xEC, 0x86, 0xDF, 0xF8, 0x9E, 0xD7, + 0x7E, 0xC0, 0x76, 0x1A, 0xDF, 0x9F, 0xC9, 0x48, + 0xC8, 0xB2, 0x9C, 0xF6, 0x9C, 0x8C, 0x60, 0x08, + 0x82, 0x79, 0xAE, 0xC2, 0x92, 0x08, 0xD2, 0xA8, + 0xB4, 0x77, 0xCD, 0xBD, 0x69, 0x54, 0xD6, 0x3C, + 0x94, 0x8F, 0x19, 0x75, 0x7F, 0x81, 0xED, 0xEF, + 0x24, 0xD8, 0x4B, 0x80, 0x7B, 0xEB, 0x6D, 0xBE, + 0x2E, 0xD5, 0x63, 0x12, 0x3A, 0x8A, 0xEA, 0x2A, + 0xAA, 0x71, 0xC7, 0xAB, 0x73, 0xC3, 0xA3, 0x63, + 0xE3, 0x38, 0x8F, 0xE3, 0x3F, 0x8F, 0x8B, 0x51, + 0xD3, 0x68, }; static unsigned char vfs5011_init_16[] = { /* 2565 B */ - 0x02, 0xF0, 0x00, 0x14, 0x00, 0x03, 0x00, 0x09, - 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, - 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, - 0x20, 0x04, 0x30, 0xE5, 0x03, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, - 0xEA, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x4C, 0x20, 0x04, 0x30, 0x0A, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, - 0x04, 0x30, 0x01, 0xDE, 0x01, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, - 0x30, 0x02, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, - 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x40, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, - 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, - 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, - 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, - 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, - 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, - 0x30, 0x00, 0x00, 0x74, 0x01, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, - 0x74, 0x01, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, - 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, - 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, - 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, - 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, - 0xFF, 0xF9, 0x87, 0x20, 0xBB, 0xF8, 0x87, 0x00, - 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, - 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, - 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x07, 0x20, - 0xBA, 0xF8, 0x07, 0x20, 0xB9, 0xF8, 0x07, 0x20, - 0xB8, 0xF8, 0x07, 0x20, 0xB7, 0xF8, 0x07, 0x20, - 0xB6, 0xF8, 0x07, 0x20, 0xB5, 0xF8, 0x07, 0x20, - 0xB4, 0xF8, 0x07, 0x20, 0xB3, 0xF8, 0x07, 0x20, - 0xB2, 0xF8, 0x07, 0x20, 0xB1, 0xF8, 0x07, 0x22, - 0xB0, 0xF8, 0x07, 0x22, 0xAF, 0xF8, 0x07, 0x22, - 0xAE, 0xF8, 0x07, 0x22, 0xAD, 0xF8, 0x07, 0x22, - 0xAC, 0xF8, 0x07, 0x22, 0xAB, 0xF8, 0x07, 0x22, - 0xAA, 0xF8, 0x07, 0x22, 0xA9, 0xF8, 0x07, 0x22, - 0xA8, 0xF8, 0x07, 0x22, 0xA7, 0xF8, 0x07, 0x22, - 0xA6, 0xF8, 0x07, 0x22, 0xA5, 0xF8, 0x07, 0x22, - 0xA4, 0xF8, 0x07, 0x22, 0xA3, 0xF8, 0x07, 0x22, - 0xA2, 0xF8, 0x07, 0x22, 0xA1, 0xF8, 0x07, 0x22, - 0xA0, 0xF8, 0x07, 0x22, 0x9F, 0xF8, 0x07, 0x22, - 0x9E, 0xF8, 0x07, 0x22, 0x9D, 0xF8, 0x07, 0x22, - 0x9C, 0xF8, 0x07, 0x22, 0x9B, 0xF8, 0x07, 0x22, - 0x9A, 0xF8, 0x07, 0x22, 0x99, 0xF8, 0x07, 0x22, - 0x98, 0xF8, 0x07, 0x22, 0x97, 0xF8, 0x07, 0x22, - 0x96, 0xF8, 0x07, 0x22, 0x95, 0xF8, 0x07, 0x22, - 0x94, 0xF8, 0x07, 0x22, 0x93, 0xF8, 0x07, 0x22, - 0x92, 0xF8, 0x07, 0x22, 0x91, 0xF8, 0x07, 0x22, - 0x90, 0xF8, 0x07, 0x22, 0x8F, 0xF8, 0x07, 0x22, - 0x8E, 0xF8, 0x07, 0x22, 0x8D, 0xF8, 0x07, 0x22, - 0x8C, 0xF8, 0x07, 0x22, 0x8B, 0xF8, 0x07, 0x22, - 0x8A, 0xF8, 0x07, 0x22, 0x89, 0xF8, 0x07, 0x22, - 0x88, 0xF8, 0x07, 0x22, 0x87, 0xF8, 0x07, 0x22, - 0x86, 0xF8, 0x07, 0x22, 0x85, 0xF8, 0x07, 0x22, - 0x84, 0xF8, 0x07, 0x22, 0x83, 0xF8, 0x07, 0x22, - 0x82, 0xF8, 0x07, 0x22, 0x81, 0xF8, 0x07, 0x22, - 0x80, 0xF8, 0x07, 0x22, 0x7F, 0xF8, 0x07, 0x22, - 0x7E, 0xF8, 0x07, 0x22, 0x7D, 0xF8, 0x07, 0x22, - 0x7C, 0xF8, 0x07, 0x22, 0x7B, 0xF8, 0x07, 0x22, - 0x7A, 0xF8, 0x07, 0x22, 0x79, 0xF8, 0x07, 0x22, - 0x78, 0xF8, 0x07, 0x22, 0x77, 0xF8, 0x07, 0x22, - 0x76, 0xF8, 0x07, 0x22, 0x75, 0xF8, 0x07, 0x22, - 0x74, 0xF8, 0x07, 0x22, 0x73, 0xF8, 0x07, 0x22, - 0x72, 0xF8, 0x07, 0x22, 0x71, 0xF8, 0x07, 0x22, - 0x70, 0xF8, 0x07, 0x22, 0x6F, 0xF8, 0x07, 0x22, - 0x6E, 0xF8, 0x07, 0x22, 0x6D, 0xF8, 0x07, 0x22, - 0x6C, 0xF8, 0x07, 0x22, 0x6B, 0xF8, 0x07, 0x22, - 0x6A, 0xF8, 0x07, 0x22, 0x69, 0xF8, 0x07, 0x22, - 0x68, 0xF8, 0x07, 0x22, 0x67, 0xF8, 0x07, 0x22, - 0x66, 0xF8, 0x07, 0x22, 0x65, 0xF8, 0x07, 0x22, - 0x64, 0xF8, 0x07, 0x22, 0x63, 0xF8, 0x07, 0x22, - 0x62, 0xF8, 0x07, 0x22, 0x61, 0xF8, 0x07, 0x22, - 0x60, 0xF8, 0x07, 0x22, 0x5F, 0xF8, 0x07, 0x22, - 0x5E, 0xF8, 0x07, 0x22, 0x5D, 0xF8, 0x07, 0x22, - 0x5C, 0xF8, 0x07, 0x22, 0x5B, 0xF8, 0x07, 0x22, - 0x5A, 0xF8, 0x07, 0x22, 0x59, 0xF8, 0x07, 0x22, - 0x58, 0xF8, 0x07, 0x22, 0x57, 0xF8, 0x07, 0x22, - 0x56, 0xF8, 0x07, 0x22, 0x55, 0xF8, 0x07, 0x22, - 0x54, 0xF8, 0x07, 0x22, 0x53, 0xF8, 0x07, 0x22, - 0x52, 0xF8, 0x07, 0x22, 0x51, 0xF8, 0x07, 0x22, - 0x50, 0xF8, 0x07, 0x22, 0x4F, 0xF8, 0x07, 0x22, - 0x4E, 0xF8, 0x07, 0x22, 0x4D, 0xF8, 0x07, 0x22, - 0x4C, 0xF8, 0x07, 0x22, 0x4B, 0xF8, 0x07, 0x22, - 0x4A, 0xF8, 0x07, 0x22, 0x49, 0xF8, 0x07, 0x22, - 0x48, 0xF8, 0x07, 0x22, 0x47, 0xF8, 0x07, 0x22, - 0x46, 0xF8, 0x07, 0x22, 0x45, 0xF8, 0x07, 0x22, - 0x44, 0xF8, 0x07, 0x22, 0x43, 0xF8, 0x07, 0x22, - 0x42, 0xF8, 0x07, 0x22, 0x41, 0xF8, 0x07, 0x22, - 0x40, 0xF8, 0x07, 0x22, 0x3F, 0xF8, 0x07, 0x22, - 0x3E, 0xF8, 0x07, 0x22, 0x3D, 0xF8, 0x07, 0x22, - 0x3C, 0xF8, 0x07, 0x22, 0x3B, 0xF8, 0x07, 0x22, - 0x3A, 0xF8, 0x07, 0x22, 0x39, 0xF8, 0x07, 0x22, - 0x38, 0xF8, 0x07, 0x22, 0x37, 0xF8, 0x07, 0x22, - 0x36, 0xF8, 0x07, 0x22, 0x35, 0xF8, 0x07, 0x22, - 0x34, 0xF8, 0x07, 0x22, 0x33, 0xF8, 0x07, 0x22, - 0x32, 0xF8, 0x07, 0x22, 0x31, 0xF8, 0x07, 0x22, - 0x30, 0xF8, 0x07, 0x22, 0x2F, 0xF8, 0x07, 0x22, - 0x2E, 0xF8, 0x07, 0x22, 0x2D, 0xF8, 0x07, 0x22, - 0x2C, 0xF8, 0x07, 0x22, 0x2B, 0xF8, 0x07, 0x22, - 0x2A, 0xF8, 0x07, 0x22, 0x29, 0xF8, 0x07, 0x22, - 0x28, 0xF8, 0x07, 0x22, 0x27, 0xF8, 0x07, 0x22, - 0x26, 0xF8, 0x07, 0x22, 0x25, 0xF8, 0x07, 0x22, - 0x24, 0xF8, 0x07, 0x22, 0x23, 0xF8, 0x07, 0x20, - 0x22, 0xF8, 0x07, 0x20, 0x21, 0xF8, 0x07, 0x20, - 0x20, 0xF8, 0x07, 0x20, 0x1F, 0xF8, 0x07, 0x20, - 0x1E, 0xF8, 0x07, 0x20, 0x1D, 0xF8, 0x07, 0x20, - 0x1C, 0xF8, 0x07, 0x20, 0x1C, 0xF8, 0x07, 0x00, - 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, - 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, - 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, - 0xD8, 0xF8, 0x27, 0x20, 0xD9, 0xF8, 0x27, 0x20, - 0xDA, 0xF8, 0x27, 0x20, 0xDB, 0xF8, 0x27, 0x20, - 0xDC, 0xF8, 0x27, 0x20, 0xDD, 0xF8, 0x27, 0x20, - 0xDE, 0xF8, 0x27, 0x20, 0xDF, 0xF8, 0x27, 0x20, - 0xE0, 0xF8, 0x27, 0x20, 0xE1, 0xF8, 0x27, 0x20, - 0xE2, 0xF8, 0x27, 0x20, 0xE3, 0xF8, 0x27, 0x20, - 0xE4, 0xF8, 0x27, 0x20, 0xE5, 0xF8, 0x27, 0x20, - 0xE6, 0xF8, 0x27, 0x20, 0xE7, 0xF8, 0x27, 0x20, - 0xE8, 0xF8, 0x27, 0x20, 0xE9, 0xF8, 0x27, 0x20, - 0xEA, 0xF8, 0x27, 0x20, 0xEB, 0xF8, 0x27, 0x20, - 0xEC, 0xF8, 0x27, 0x20, 0xED, 0xF8, 0x27, 0x20, - 0xEE, 0xF8, 0x27, 0x20, 0xEF, 0xF8, 0x27, 0x20, - 0xF0, 0xF8, 0x27, 0x20, 0xF1, 0xF8, 0x27, 0x20, - 0xF2, 0xF8, 0x27, 0x20, 0xF3, 0xF8, 0x27, 0x20, - 0xF4, 0xF8, 0x27, 0x20, 0xF5, 0xF8, 0x27, 0x20, - 0xF6, 0xF8, 0x27, 0x20, 0xF7, 0xF8, 0x27, 0x20, - 0xF8, 0xF8, 0x27, 0x20, 0xF9, 0xF8, 0x27, 0x20, - 0xFA, 0xF8, 0x27, 0x20, 0xFB, 0xF8, 0x27, 0x20, - 0xFC, 0xF8, 0x27, 0x20, 0xFD, 0xF8, 0x27, 0x20, - 0xFE, 0xF8, 0x27, 0x20, 0xFF, 0xF8, 0x27, 0x20, - 0x00, 0xF9, 0x27, 0x20, 0xD7, 0xF8, 0x27, 0x20, - 0x00, 0xF8, 0x27, 0x20, 0x01, 0xF8, 0x27, 0x20, - 0x02, 0xF8, 0x27, 0x20, 0x03, 0xF8, 0x27, 0x20, - 0x04, 0xF8, 0x27, 0x20, 0x05, 0xF8, 0x27, 0x20, - 0x06, 0xF8, 0x27, 0x20, 0x07, 0xF8, 0x27, 0x20, - 0x08, 0xF8, 0x27, 0x20, 0x09, 0xF8, 0x27, 0x20, - 0x0A, 0xF8, 0x27, 0x20, 0x0B, 0xF8, 0x27, 0x20, - 0x0C, 0xF8, 0x27, 0x20, 0x0D, 0xF8, 0x27, 0x20, - 0x0E, 0xF8, 0x27, 0x20, 0x0F, 0xF8, 0x27, 0x20, - 0x10, 0xF8, 0x27, 0x20, 0x11, 0xF8, 0x27, 0x20, - 0x12, 0xF8, 0x27, 0x20, 0x13, 0xF8, 0x27, 0x20, - 0x14, 0xF8, 0x27, 0x20, 0x15, 0xF8, 0x27, 0x20, - 0x15, 0xF8, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, - 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, - 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, - 0x04, 0x17, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0E, - 0x00, 0x0C, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x05, - 0x00, 0x0E, 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, - 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, - 0x00, 0x03, 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x14, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xC8, 0x20, 0x04, 0x30, 0x04, 0x00, 0x00, - 0x00, 0x04, 0x05, 0x00, 0x0E, 0x00, 0x14, 0x20, - 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x83, 0x00, 0x03, 0x00, 0x09, 0x00, - 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x90, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x15, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x28, 0x00, 0x00, + 0x02, 0xF0, 0x00, 0x14, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE5, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xEA, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0x0A, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x01, 0xDE, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x02, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x00, 0x74, 0x01, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x74, 0x01, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0xF9, 0x87, 0x20, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x07, 0x20, + 0xBA, 0xF8, 0x07, 0x20, 0xB9, 0xF8, 0x07, 0x20, + 0xB8, 0xF8, 0x07, 0x20, 0xB7, 0xF8, 0x07, 0x20, + 0xB6, 0xF8, 0x07, 0x20, 0xB5, 0xF8, 0x07, 0x20, + 0xB4, 0xF8, 0x07, 0x20, 0xB3, 0xF8, 0x07, 0x20, + 0xB2, 0xF8, 0x07, 0x20, 0xB1, 0xF8, 0x07, 0x22, + 0xB0, 0xF8, 0x07, 0x22, 0xAF, 0xF8, 0x07, 0x22, + 0xAE, 0xF8, 0x07, 0x22, 0xAD, 0xF8, 0x07, 0x22, + 0xAC, 0xF8, 0x07, 0x22, 0xAB, 0xF8, 0x07, 0x22, + 0xAA, 0xF8, 0x07, 0x22, 0xA9, 0xF8, 0x07, 0x22, + 0xA8, 0xF8, 0x07, 0x22, 0xA7, 0xF8, 0x07, 0x22, + 0xA6, 0xF8, 0x07, 0x22, 0xA5, 0xF8, 0x07, 0x22, + 0xA4, 0xF8, 0x07, 0x22, 0xA3, 0xF8, 0x07, 0x22, + 0xA2, 0xF8, 0x07, 0x22, 0xA1, 0xF8, 0x07, 0x22, + 0xA0, 0xF8, 0x07, 0x22, 0x9F, 0xF8, 0x07, 0x22, + 0x9E, 0xF8, 0x07, 0x22, 0x9D, 0xF8, 0x07, 0x22, + 0x9C, 0xF8, 0x07, 0x22, 0x9B, 0xF8, 0x07, 0x22, + 0x9A, 0xF8, 0x07, 0x22, 0x99, 0xF8, 0x07, 0x22, + 0x98, 0xF8, 0x07, 0x22, 0x97, 0xF8, 0x07, 0x22, + 0x96, 0xF8, 0x07, 0x22, 0x95, 0xF8, 0x07, 0x22, + 0x94, 0xF8, 0x07, 0x22, 0x93, 0xF8, 0x07, 0x22, + 0x92, 0xF8, 0x07, 0x22, 0x91, 0xF8, 0x07, 0x22, + 0x90, 0xF8, 0x07, 0x22, 0x8F, 0xF8, 0x07, 0x22, + 0x8E, 0xF8, 0x07, 0x22, 0x8D, 0xF8, 0x07, 0x22, + 0x8C, 0xF8, 0x07, 0x22, 0x8B, 0xF8, 0x07, 0x22, + 0x8A, 0xF8, 0x07, 0x22, 0x89, 0xF8, 0x07, 0x22, + 0x88, 0xF8, 0x07, 0x22, 0x87, 0xF8, 0x07, 0x22, + 0x86, 0xF8, 0x07, 0x22, 0x85, 0xF8, 0x07, 0x22, + 0x84, 0xF8, 0x07, 0x22, 0x83, 0xF8, 0x07, 0x22, + 0x82, 0xF8, 0x07, 0x22, 0x81, 0xF8, 0x07, 0x22, + 0x80, 0xF8, 0x07, 0x22, 0x7F, 0xF8, 0x07, 0x22, + 0x7E, 0xF8, 0x07, 0x22, 0x7D, 0xF8, 0x07, 0x22, + 0x7C, 0xF8, 0x07, 0x22, 0x7B, 0xF8, 0x07, 0x22, + 0x7A, 0xF8, 0x07, 0x22, 0x79, 0xF8, 0x07, 0x22, + 0x78, 0xF8, 0x07, 0x22, 0x77, 0xF8, 0x07, 0x22, + 0x76, 0xF8, 0x07, 0x22, 0x75, 0xF8, 0x07, 0x22, + 0x74, 0xF8, 0x07, 0x22, 0x73, 0xF8, 0x07, 0x22, + 0x72, 0xF8, 0x07, 0x22, 0x71, 0xF8, 0x07, 0x22, + 0x70, 0xF8, 0x07, 0x22, 0x6F, 0xF8, 0x07, 0x22, + 0x6E, 0xF8, 0x07, 0x22, 0x6D, 0xF8, 0x07, 0x22, + 0x6C, 0xF8, 0x07, 0x22, 0x6B, 0xF8, 0x07, 0x22, + 0x6A, 0xF8, 0x07, 0x22, 0x69, 0xF8, 0x07, 0x22, + 0x68, 0xF8, 0x07, 0x22, 0x67, 0xF8, 0x07, 0x22, + 0x66, 0xF8, 0x07, 0x22, 0x65, 0xF8, 0x07, 0x22, + 0x64, 0xF8, 0x07, 0x22, 0x63, 0xF8, 0x07, 0x22, + 0x62, 0xF8, 0x07, 0x22, 0x61, 0xF8, 0x07, 0x22, + 0x60, 0xF8, 0x07, 0x22, 0x5F, 0xF8, 0x07, 0x22, + 0x5E, 0xF8, 0x07, 0x22, 0x5D, 0xF8, 0x07, 0x22, + 0x5C, 0xF8, 0x07, 0x22, 0x5B, 0xF8, 0x07, 0x22, + 0x5A, 0xF8, 0x07, 0x22, 0x59, 0xF8, 0x07, 0x22, + 0x58, 0xF8, 0x07, 0x22, 0x57, 0xF8, 0x07, 0x22, + 0x56, 0xF8, 0x07, 0x22, 0x55, 0xF8, 0x07, 0x22, + 0x54, 0xF8, 0x07, 0x22, 0x53, 0xF8, 0x07, 0x22, + 0x52, 0xF8, 0x07, 0x22, 0x51, 0xF8, 0x07, 0x22, + 0x50, 0xF8, 0x07, 0x22, 0x4F, 0xF8, 0x07, 0x22, + 0x4E, 0xF8, 0x07, 0x22, 0x4D, 0xF8, 0x07, 0x22, + 0x4C, 0xF8, 0x07, 0x22, 0x4B, 0xF8, 0x07, 0x22, + 0x4A, 0xF8, 0x07, 0x22, 0x49, 0xF8, 0x07, 0x22, + 0x48, 0xF8, 0x07, 0x22, 0x47, 0xF8, 0x07, 0x22, + 0x46, 0xF8, 0x07, 0x22, 0x45, 0xF8, 0x07, 0x22, + 0x44, 0xF8, 0x07, 0x22, 0x43, 0xF8, 0x07, 0x22, + 0x42, 0xF8, 0x07, 0x22, 0x41, 0xF8, 0x07, 0x22, + 0x40, 0xF8, 0x07, 0x22, 0x3F, 0xF8, 0x07, 0x22, + 0x3E, 0xF8, 0x07, 0x22, 0x3D, 0xF8, 0x07, 0x22, + 0x3C, 0xF8, 0x07, 0x22, 0x3B, 0xF8, 0x07, 0x22, + 0x3A, 0xF8, 0x07, 0x22, 0x39, 0xF8, 0x07, 0x22, + 0x38, 0xF8, 0x07, 0x22, 0x37, 0xF8, 0x07, 0x22, + 0x36, 0xF8, 0x07, 0x22, 0x35, 0xF8, 0x07, 0x22, + 0x34, 0xF8, 0x07, 0x22, 0x33, 0xF8, 0x07, 0x22, + 0x32, 0xF8, 0x07, 0x22, 0x31, 0xF8, 0x07, 0x22, + 0x30, 0xF8, 0x07, 0x22, 0x2F, 0xF8, 0x07, 0x22, + 0x2E, 0xF8, 0x07, 0x22, 0x2D, 0xF8, 0x07, 0x22, + 0x2C, 0xF8, 0x07, 0x22, 0x2B, 0xF8, 0x07, 0x22, + 0x2A, 0xF8, 0x07, 0x22, 0x29, 0xF8, 0x07, 0x22, + 0x28, 0xF8, 0x07, 0x22, 0x27, 0xF8, 0x07, 0x22, + 0x26, 0xF8, 0x07, 0x22, 0x25, 0xF8, 0x07, 0x22, + 0x24, 0xF8, 0x07, 0x22, 0x23, 0xF8, 0x07, 0x20, + 0x22, 0xF8, 0x07, 0x20, 0x21, 0xF8, 0x07, 0x20, + 0x20, 0xF8, 0x07, 0x20, 0x1F, 0xF8, 0x07, 0x20, + 0x1E, 0xF8, 0x07, 0x20, 0x1D, 0xF8, 0x07, 0x20, + 0x1C, 0xF8, 0x07, 0x20, 0x1C, 0xF8, 0x07, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD8, 0xF8, 0x27, 0x20, 0xD9, 0xF8, 0x27, 0x20, + 0xDA, 0xF8, 0x27, 0x20, 0xDB, 0xF8, 0x27, 0x20, + 0xDC, 0xF8, 0x27, 0x20, 0xDD, 0xF8, 0x27, 0x20, + 0xDE, 0xF8, 0x27, 0x20, 0xDF, 0xF8, 0x27, 0x20, + 0xE0, 0xF8, 0x27, 0x20, 0xE1, 0xF8, 0x27, 0x20, + 0xE2, 0xF8, 0x27, 0x20, 0xE3, 0xF8, 0x27, 0x20, + 0xE4, 0xF8, 0x27, 0x20, 0xE5, 0xF8, 0x27, 0x20, + 0xE6, 0xF8, 0x27, 0x20, 0xE7, 0xF8, 0x27, 0x20, + 0xE8, 0xF8, 0x27, 0x20, 0xE9, 0xF8, 0x27, 0x20, + 0xEA, 0xF8, 0x27, 0x20, 0xEB, 0xF8, 0x27, 0x20, + 0xEC, 0xF8, 0x27, 0x20, 0xED, 0xF8, 0x27, 0x20, + 0xEE, 0xF8, 0x27, 0x20, 0xEF, 0xF8, 0x27, 0x20, + 0xF0, 0xF8, 0x27, 0x20, 0xF1, 0xF8, 0x27, 0x20, + 0xF2, 0xF8, 0x27, 0x20, 0xF3, 0xF8, 0x27, 0x20, + 0xF4, 0xF8, 0x27, 0x20, 0xF5, 0xF8, 0x27, 0x20, + 0xF6, 0xF8, 0x27, 0x20, 0xF7, 0xF8, 0x27, 0x20, + 0xF8, 0xF8, 0x27, 0x20, 0xF9, 0xF8, 0x27, 0x20, + 0xFA, 0xF8, 0x27, 0x20, 0xFB, 0xF8, 0x27, 0x20, + 0xFC, 0xF8, 0x27, 0x20, 0xFD, 0xF8, 0x27, 0x20, + 0xFE, 0xF8, 0x27, 0x20, 0xFF, 0xF8, 0x27, 0x20, + 0x00, 0xF9, 0x27, 0x20, 0xD7, 0xF8, 0x27, 0x20, + 0x00, 0xF8, 0x27, 0x20, 0x01, 0xF8, 0x27, 0x20, + 0x02, 0xF8, 0x27, 0x20, 0x03, 0xF8, 0x27, 0x20, + 0x04, 0xF8, 0x27, 0x20, 0x05, 0xF8, 0x27, 0x20, + 0x06, 0xF8, 0x27, 0x20, 0x07, 0xF8, 0x27, 0x20, + 0x08, 0xF8, 0x27, 0x20, 0x09, 0xF8, 0x27, 0x20, + 0x0A, 0xF8, 0x27, 0x20, 0x0B, 0xF8, 0x27, 0x20, + 0x0C, 0xF8, 0x27, 0x20, 0x0D, 0xF8, 0x27, 0x20, + 0x0E, 0xF8, 0x27, 0x20, 0x0F, 0xF8, 0x27, 0x20, + 0x10, 0xF8, 0x27, 0x20, 0x11, 0xF8, 0x27, 0x20, + 0x12, 0xF8, 0x27, 0x20, 0x13, 0xF8, 0x27, 0x20, + 0x14, 0xF8, 0x27, 0x20, 0x15, 0xF8, 0x27, 0x20, + 0x15, 0xF8, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x17, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0E, + 0x00, 0x0C, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x05, + 0x00, 0x0E, 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x03, 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x14, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xC8, 0x20, 0x04, 0x30, 0x04, 0x00, 0x00, + 0x00, 0x04, 0x05, 0x00, 0x0E, 0x00, 0x14, 0x20, + 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x83, 0x00, 0x03, 0x00, 0x09, 0x00, + 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x90, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x15, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x28, 0x00, 0x00, }; static unsigned char vfs5011_init_17[] = { /* 117 B */ - 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0xFF, 0x00, 0x00, 0xFF, 0xF4, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0xF4, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0xBF, 0x02, 0x00, + 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xFF, 0x00, 0x00, 0xFF, 0xF4, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0xF4, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0xBF, 0x02, 0x00, }; static unsigned char vfs5011_init_18[] = { /* 2903 B */ - 0x02, 0xF0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, - 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, - 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, - 0x20, 0x04, 0x30, 0xE5, 0x03, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, - 0xEA, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x4C, 0x20, 0x04, 0x30, 0x0A, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, - 0x04, 0x30, 0x01, 0xDE, 0x01, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, - 0x30, 0x02, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, - 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x40, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, - 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, - 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, - 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, - 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, - 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, - 0x30, 0x00, 0x00, 0x74, 0x01, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, - 0x74, 0x01, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, - 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, - 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, - 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, - 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, - 0xFF, 0xF9, 0x87, 0x20, 0xBB, 0xF8, 0x87, 0x00, - 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, - 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, - 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x07, 0x20, - 0xBA, 0xF8, 0x07, 0x20, 0xB9, 0xF8, 0x07, 0x20, - 0xB8, 0xF8, 0x07, 0x20, 0xB7, 0xF8, 0x07, 0x20, - 0xB6, 0xF8, 0x07, 0x20, 0xB5, 0xF8, 0x07, 0x20, - 0xB4, 0xF8, 0x07, 0x20, 0xB3, 0xF8, 0x07, 0x20, - 0xB2, 0xF8, 0x07, 0x20, 0xB1, 0xF8, 0x07, 0x22, - 0xB0, 0xF8, 0x07, 0x22, 0xAF, 0xF8, 0x07, 0x22, - 0xAE, 0xF8, 0x07, 0x22, 0xAD, 0xF8, 0x07, 0x22, - 0xAC, 0xF8, 0x07, 0x22, 0xAB, 0xF8, 0x07, 0x22, - 0xAA, 0xF8, 0x07, 0x22, 0xA9, 0xF8, 0x07, 0x22, - 0xA8, 0xF8, 0x07, 0x22, 0xA7, 0xF8, 0x07, 0x22, - 0xA6, 0xF8, 0x07, 0x22, 0xA5, 0xF8, 0x07, 0x22, - 0xA4, 0xF8, 0x07, 0x22, 0xA3, 0xF8, 0x07, 0x22, - 0xA2, 0xF8, 0x07, 0x22, 0xA1, 0xF8, 0x07, 0x22, - 0xA0, 0xF8, 0x07, 0x22, 0x9F, 0xF8, 0x07, 0x22, - 0x9E, 0xF8, 0x07, 0x22, 0x9D, 0xF8, 0x07, 0x22, - 0x9C, 0xF8, 0x07, 0x22, 0x9B, 0xF8, 0x07, 0x22, - 0x9A, 0xF8, 0x07, 0x22, 0x99, 0xF8, 0x07, 0x22, - 0x98, 0xF8, 0x07, 0x22, 0x97, 0xF8, 0x07, 0x22, - 0x96, 0xF8, 0x07, 0x22, 0x95, 0xF8, 0x07, 0x22, - 0x94, 0xF8, 0x07, 0x22, 0x93, 0xF8, 0x07, 0x22, - 0x92, 0xF8, 0x07, 0x22, 0x91, 0xF8, 0x07, 0x22, - 0x90, 0xF8, 0x07, 0x22, 0x8F, 0xF8, 0x07, 0x22, - 0x8E, 0xF8, 0x07, 0x22, 0x8D, 0xF8, 0x07, 0x22, - 0x8C, 0xF8, 0x07, 0x22, 0x8B, 0xF8, 0x07, 0x22, - 0x8A, 0xF8, 0x07, 0x22, 0x89, 0xF8, 0x07, 0x22, - 0x88, 0xF8, 0x07, 0x22, 0x87, 0xF8, 0x07, 0x22, - 0x86, 0xF8, 0x07, 0x22, 0x85, 0xF8, 0x07, 0x22, - 0x84, 0xF8, 0x07, 0x22, 0x83, 0xF8, 0x07, 0x22, - 0x82, 0xF8, 0x07, 0x22, 0x81, 0xF8, 0x07, 0x22, - 0x80, 0xF8, 0x07, 0x22, 0x7F, 0xF8, 0x07, 0x22, - 0x7E, 0xF8, 0x07, 0x22, 0x7D, 0xF8, 0x07, 0x22, - 0x7C, 0xF8, 0x07, 0x22, 0x7B, 0xF8, 0x07, 0x22, - 0x7A, 0xF8, 0x07, 0x22, 0x79, 0xF8, 0x07, 0x22, - 0x78, 0xF8, 0x07, 0x22, 0x77, 0xF8, 0x07, 0x22, - 0x76, 0xF8, 0x07, 0x22, 0x75, 0xF8, 0x07, 0x22, - 0x74, 0xF8, 0x07, 0x22, 0x73, 0xF8, 0x07, 0x22, - 0x72, 0xF8, 0x07, 0x22, 0x71, 0xF8, 0x07, 0x22, - 0x70, 0xF8, 0x07, 0x22, 0x6F, 0xF8, 0x07, 0x22, - 0x6E, 0xF8, 0x07, 0x22, 0x6D, 0xF8, 0x07, 0x22, - 0x6C, 0xF8, 0x07, 0x22, 0x6B, 0xF8, 0x07, 0x22, - 0x6A, 0xF8, 0x07, 0x22, 0x69, 0xF8, 0x07, 0x22, - 0x68, 0xF8, 0x07, 0x22, 0x67, 0xF8, 0x07, 0x22, - 0x66, 0xF8, 0x07, 0x22, 0x65, 0xF8, 0x07, 0x22, - 0x64, 0xF8, 0x07, 0x22, 0x63, 0xF8, 0x07, 0x22, - 0x62, 0xF8, 0x07, 0x22, 0x61, 0xF8, 0x07, 0x22, - 0x60, 0xF8, 0x07, 0x22, 0x5F, 0xF8, 0x07, 0x22, - 0x5E, 0xF8, 0x07, 0x22, 0x5D, 0xF8, 0x07, 0x22, - 0x5C, 0xF8, 0x07, 0x22, 0x5B, 0xF8, 0x07, 0x22, - 0x5A, 0xF8, 0x07, 0x22, 0x59, 0xF8, 0x07, 0x22, - 0x58, 0xF8, 0x07, 0x22, 0x57, 0xF8, 0x07, 0x22, - 0x56, 0xF8, 0x07, 0x22, 0x55, 0xF8, 0x07, 0x22, - 0x54, 0xF8, 0x07, 0x22, 0x53, 0xF8, 0x07, 0x22, - 0x52, 0xF8, 0x07, 0x22, 0x51, 0xF8, 0x07, 0x22, - 0x50, 0xF8, 0x07, 0x22, 0x4F, 0xF8, 0x07, 0x22, - 0x4E, 0xF8, 0x07, 0x22, 0x4D, 0xF8, 0x07, 0x22, - 0x4C, 0xF8, 0x07, 0x22, 0x4B, 0xF8, 0x07, 0x22, - 0x4A, 0xF8, 0x07, 0x22, 0x49, 0xF8, 0x07, 0x22, - 0x48, 0xF8, 0x07, 0x22, 0x47, 0xF8, 0x07, 0x22, - 0x46, 0xF8, 0x07, 0x22, 0x45, 0xF8, 0x07, 0x22, - 0x44, 0xF8, 0x07, 0x22, 0x43, 0xF8, 0x07, 0x22, - 0x42, 0xF8, 0x07, 0x22, 0x41, 0xF8, 0x07, 0x22, - 0x40, 0xF8, 0x07, 0x22, 0x3F, 0xF8, 0x07, 0x22, - 0x3E, 0xF8, 0x07, 0x22, 0x3D, 0xF8, 0x07, 0x22, - 0x3C, 0xF8, 0x07, 0x22, 0x3B, 0xF8, 0x07, 0x22, - 0x3A, 0xF8, 0x07, 0x22, 0x39, 0xF8, 0x07, 0x22, - 0x38, 0xF8, 0x07, 0x22, 0x37, 0xF8, 0x07, 0x22, - 0x36, 0xF8, 0x07, 0x22, 0x35, 0xF8, 0x07, 0x22, - 0x34, 0xF8, 0x07, 0x22, 0x33, 0xF8, 0x07, 0x22, - 0x32, 0xF8, 0x07, 0x22, 0x31, 0xF8, 0x07, 0x22, - 0x30, 0xF8, 0x07, 0x22, 0x2F, 0xF8, 0x07, 0x22, - 0x2E, 0xF8, 0x07, 0x22, 0x2D, 0xF8, 0x07, 0x22, - 0x2C, 0xF8, 0x07, 0x22, 0x2B, 0xF8, 0x07, 0x22, - 0x2A, 0xF8, 0x07, 0x22, 0x29, 0xF8, 0x07, 0x22, - 0x28, 0xF8, 0x07, 0x22, 0x27, 0xF8, 0x07, 0x22, - 0x26, 0xF8, 0x07, 0x22, 0x25, 0xF8, 0x07, 0x22, - 0x24, 0xF8, 0x07, 0x22, 0x23, 0xF8, 0x07, 0x20, - 0x22, 0xF8, 0x07, 0x20, 0x21, 0xF8, 0x07, 0x20, - 0x20, 0xF8, 0x07, 0x20, 0x1F, 0xF8, 0x07, 0x20, - 0x1E, 0xF8, 0x07, 0x20, 0x1D, 0xF8, 0x07, 0x20, - 0x1C, 0xF8, 0x07, 0x20, 0x1C, 0xF8, 0x07, 0x00, - 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, - 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, - 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, - 0xD8, 0xF8, 0x27, 0x20, 0xD9, 0xF8, 0x27, 0x20, - 0xDA, 0xF8, 0x27, 0x20, 0xDB, 0xF8, 0x27, 0x20, - 0xDC, 0xF8, 0x27, 0x20, 0xDD, 0xF8, 0x27, 0x20, - 0xDE, 0xF8, 0x27, 0x20, 0xDF, 0xF8, 0x27, 0x20, - 0xE0, 0xF8, 0x27, 0x20, 0xE1, 0xF8, 0x27, 0x20, - 0xE2, 0xF8, 0x27, 0x20, 0xE3, 0xF8, 0x27, 0x20, - 0xE4, 0xF8, 0x27, 0x20, 0xE5, 0xF8, 0x27, 0x20, - 0xE6, 0xF8, 0x27, 0x20, 0xE7, 0xF8, 0x27, 0x20, - 0xE8, 0xF8, 0x27, 0x20, 0xE9, 0xF8, 0x27, 0x20, - 0xEA, 0xF8, 0x27, 0x20, 0xEB, 0xF8, 0x27, 0x20, - 0xEC, 0xF8, 0x27, 0x20, 0xED, 0xF8, 0x27, 0x20, - 0xEE, 0xF8, 0x27, 0x20, 0xEF, 0xF8, 0x27, 0x20, - 0xF0, 0xF8, 0x27, 0x20, 0xF1, 0xF8, 0x27, 0x20, - 0xF2, 0xF8, 0x27, 0x20, 0xF3, 0xF8, 0x27, 0x20, - 0xF4, 0xF8, 0x27, 0x20, 0xF5, 0xF8, 0x27, 0x20, - 0xF6, 0xF8, 0x27, 0x20, 0xF7, 0xF8, 0x27, 0x20, - 0xF8, 0xF8, 0x27, 0x20, 0xF9, 0xF8, 0x27, 0x20, - 0xFA, 0xF8, 0x27, 0x20, 0xFB, 0xF8, 0x27, 0x20, - 0xFC, 0xF8, 0x27, 0x20, 0xFD, 0xF8, 0x27, 0x20, - 0xFE, 0xF8, 0x27, 0x20, 0xFF, 0xF8, 0x27, 0x20, - 0x00, 0xF9, 0x27, 0x20, 0xD7, 0xF8, 0x27, 0x20, - 0x00, 0xF8, 0x27, 0x20, 0x01, 0xF8, 0x27, 0x20, - 0x02, 0xF8, 0x27, 0x20, 0x03, 0xF8, 0x27, 0x20, - 0x04, 0xF8, 0x27, 0x20, 0x05, 0xF8, 0x27, 0x20, - 0x06, 0xF8, 0x27, 0x20, 0x07, 0xF8, 0x27, 0x20, - 0x08, 0xF8, 0x27, 0x20, 0x09, 0xF8, 0x27, 0x20, - 0x0A, 0xF8, 0x27, 0x20, 0x0B, 0xF8, 0x27, 0x20, - 0x0C, 0xF8, 0x27, 0x20, 0x0D, 0xF8, 0x27, 0x20, - 0x0E, 0xF8, 0x27, 0x20, 0x0F, 0xF8, 0x27, 0x20, - 0x10, 0xF8, 0x27, 0x20, 0x11, 0xF8, 0x27, 0x20, - 0x12, 0xF8, 0x27, 0x20, 0x13, 0xF8, 0x27, 0x20, - 0x14, 0xF8, 0x27, 0x20, 0x15, 0xF8, 0x27, 0x20, - 0x15, 0xF8, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, - 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, - 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, - 0x04, 0x05, 0x00, 0x0E, 0x00, 0x0C, 0x20, 0xFD, - 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, 0x10, - 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, 0x00, 0x09, - 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, - 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, - 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, 0x00, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x00, - 0x03, 0x00, 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x88, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x94, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x20, - 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x60, 0x21, 0x04, 0x30, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x15, 0x00, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x28, 0x00, - 0x00, 0x18, 0x00, 0x52, 0x01, 0x08, 0x00, 0x05, - 0x00, 0x0A, 0x00, 0xFA, 0x00, 0x1E, 0x00, 0xC8, - 0x00, 0x00, 0x00, 0x9F, 0x00, 0x38, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x03, 0xFF, 0xF9, 0xFD, 0xFE, 0xFE, 0x00, 0xFD, - 0x02, 0x03, 0x02, 0x01, 0x01, 0xFF, 0x03, 0x06, - 0x0C, 0x08, 0x08, 0x0C, 0x06, 0x0A, 0x0B, 0x06, - 0x0B, 0x0A, 0x0C, 0x0A, 0x0A, 0x07, 0x02, 0x05, - 0x07, 0x06, 0x0A, 0x09, 0x09, 0x0C, 0x0C, 0x11, - 0x0B, 0x0D, 0x08, 0x07, 0x09, 0x09, 0x09, 0x08, - 0x06, 0x09, 0xFE, 0xFF, 0xFF, 0x01, 0x06, 0x01, - 0xFD, 0xFB, 0x00, 0x01, 0x04, 0x01, 0x02, 0x05, - 0x04, 0x00, 0x02, 0x02, 0x05, 0x07, 0x05, 0x03, - 0x05, 0x02, 0x0A, 0x06, 0x03, 0x04, 0x00, 0x01, - 0x02, 0x04, 0x01, 0x01, 0xFA, 0xF7, 0xFA, 0xF9, - 0xF6, 0xF7, 0xFD, 0xFE, 0x02, 0xFE, 0xFC, 0xF7, - 0xF9, 0xFB, 0xF7, 0xFB, 0xF5, 0xF8, 0xF8, 0xF9, - 0xEF, 0xEE, 0xF2, 0xEF, 0xF0, 0xED, 0xF2, 0xF7, - 0xF9, 0xFA, 0xF6, 0xF6, 0xF5, 0xF4, 0xF3, 0xEF, - 0xF1, 0xF5, 0xF4, 0xF1, 0xF5, 0xFA, 0xF8, 0xFA, - 0xF9, 0xFA, 0xFE, 0x01, 0x02, 0xFE, 0xFE, 0x03, - 0x01, 0xFC, 0xF9, 0xF7, 0xF6, 0xF4, 0xF9, 0xF7, - 0xF7, 0xF5, 0xF7, 0xFA, 0xFB, 0x00, 0xFC, 0xFD, - 0xFD, 0xF6, 0xF2, 0xF4, 0xED, 0xDC, 0xCE, 0xFF, - 0x05, 0x07, 0x08, 0x0E, 0x0E, 0x0F, 0x0A, 0x0C, - 0x06, 0x05, 0x05, 0xF6, 0xF2, 0xF1, 0xEF, 0xF4, - 0xF6, 0xF4, 0xF5, 0xF6, 0xF7, 0xF5, 0xF8, 0xF8, - 0xF8, 0xF2, 0xF7, 0xF3, 0xF0, 0xF3, 0xF5, 0xFD, - 0xFB, 0xFC, 0xF9, 0xF9, 0xFC, 0xFA, 0xF8, 0xFD, - 0x0B, 0x1C, 0x17, 0x13, 0x14, 0x0F, 0x0D, 0x0C, - 0x0B, 0x0B, 0x0F, 0x0C, 0x0E, 0x10, 0x0E, 0x11, - 0x12, 0x14, 0x1C, 0x1C, 0x20, 0x20, 0x24, 0xF4, - 0xF6, 0xF4, 0xF5, 0xF6, 0xF7, 0xF5, 0xF8, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x02, 0xF0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE5, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xEA, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0x0A, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x01, 0xDE, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x02, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x00, 0x74, 0x01, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x74, 0x01, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0xF9, 0x87, 0x20, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x07, 0x20, + 0xBA, 0xF8, 0x07, 0x20, 0xB9, 0xF8, 0x07, 0x20, + 0xB8, 0xF8, 0x07, 0x20, 0xB7, 0xF8, 0x07, 0x20, + 0xB6, 0xF8, 0x07, 0x20, 0xB5, 0xF8, 0x07, 0x20, + 0xB4, 0xF8, 0x07, 0x20, 0xB3, 0xF8, 0x07, 0x20, + 0xB2, 0xF8, 0x07, 0x20, 0xB1, 0xF8, 0x07, 0x22, + 0xB0, 0xF8, 0x07, 0x22, 0xAF, 0xF8, 0x07, 0x22, + 0xAE, 0xF8, 0x07, 0x22, 0xAD, 0xF8, 0x07, 0x22, + 0xAC, 0xF8, 0x07, 0x22, 0xAB, 0xF8, 0x07, 0x22, + 0xAA, 0xF8, 0x07, 0x22, 0xA9, 0xF8, 0x07, 0x22, + 0xA8, 0xF8, 0x07, 0x22, 0xA7, 0xF8, 0x07, 0x22, + 0xA6, 0xF8, 0x07, 0x22, 0xA5, 0xF8, 0x07, 0x22, + 0xA4, 0xF8, 0x07, 0x22, 0xA3, 0xF8, 0x07, 0x22, + 0xA2, 0xF8, 0x07, 0x22, 0xA1, 0xF8, 0x07, 0x22, + 0xA0, 0xF8, 0x07, 0x22, 0x9F, 0xF8, 0x07, 0x22, + 0x9E, 0xF8, 0x07, 0x22, 0x9D, 0xF8, 0x07, 0x22, + 0x9C, 0xF8, 0x07, 0x22, 0x9B, 0xF8, 0x07, 0x22, + 0x9A, 0xF8, 0x07, 0x22, 0x99, 0xF8, 0x07, 0x22, + 0x98, 0xF8, 0x07, 0x22, 0x97, 0xF8, 0x07, 0x22, + 0x96, 0xF8, 0x07, 0x22, 0x95, 0xF8, 0x07, 0x22, + 0x94, 0xF8, 0x07, 0x22, 0x93, 0xF8, 0x07, 0x22, + 0x92, 0xF8, 0x07, 0x22, 0x91, 0xF8, 0x07, 0x22, + 0x90, 0xF8, 0x07, 0x22, 0x8F, 0xF8, 0x07, 0x22, + 0x8E, 0xF8, 0x07, 0x22, 0x8D, 0xF8, 0x07, 0x22, + 0x8C, 0xF8, 0x07, 0x22, 0x8B, 0xF8, 0x07, 0x22, + 0x8A, 0xF8, 0x07, 0x22, 0x89, 0xF8, 0x07, 0x22, + 0x88, 0xF8, 0x07, 0x22, 0x87, 0xF8, 0x07, 0x22, + 0x86, 0xF8, 0x07, 0x22, 0x85, 0xF8, 0x07, 0x22, + 0x84, 0xF8, 0x07, 0x22, 0x83, 0xF8, 0x07, 0x22, + 0x82, 0xF8, 0x07, 0x22, 0x81, 0xF8, 0x07, 0x22, + 0x80, 0xF8, 0x07, 0x22, 0x7F, 0xF8, 0x07, 0x22, + 0x7E, 0xF8, 0x07, 0x22, 0x7D, 0xF8, 0x07, 0x22, + 0x7C, 0xF8, 0x07, 0x22, 0x7B, 0xF8, 0x07, 0x22, + 0x7A, 0xF8, 0x07, 0x22, 0x79, 0xF8, 0x07, 0x22, + 0x78, 0xF8, 0x07, 0x22, 0x77, 0xF8, 0x07, 0x22, + 0x76, 0xF8, 0x07, 0x22, 0x75, 0xF8, 0x07, 0x22, + 0x74, 0xF8, 0x07, 0x22, 0x73, 0xF8, 0x07, 0x22, + 0x72, 0xF8, 0x07, 0x22, 0x71, 0xF8, 0x07, 0x22, + 0x70, 0xF8, 0x07, 0x22, 0x6F, 0xF8, 0x07, 0x22, + 0x6E, 0xF8, 0x07, 0x22, 0x6D, 0xF8, 0x07, 0x22, + 0x6C, 0xF8, 0x07, 0x22, 0x6B, 0xF8, 0x07, 0x22, + 0x6A, 0xF8, 0x07, 0x22, 0x69, 0xF8, 0x07, 0x22, + 0x68, 0xF8, 0x07, 0x22, 0x67, 0xF8, 0x07, 0x22, + 0x66, 0xF8, 0x07, 0x22, 0x65, 0xF8, 0x07, 0x22, + 0x64, 0xF8, 0x07, 0x22, 0x63, 0xF8, 0x07, 0x22, + 0x62, 0xF8, 0x07, 0x22, 0x61, 0xF8, 0x07, 0x22, + 0x60, 0xF8, 0x07, 0x22, 0x5F, 0xF8, 0x07, 0x22, + 0x5E, 0xF8, 0x07, 0x22, 0x5D, 0xF8, 0x07, 0x22, + 0x5C, 0xF8, 0x07, 0x22, 0x5B, 0xF8, 0x07, 0x22, + 0x5A, 0xF8, 0x07, 0x22, 0x59, 0xF8, 0x07, 0x22, + 0x58, 0xF8, 0x07, 0x22, 0x57, 0xF8, 0x07, 0x22, + 0x56, 0xF8, 0x07, 0x22, 0x55, 0xF8, 0x07, 0x22, + 0x54, 0xF8, 0x07, 0x22, 0x53, 0xF8, 0x07, 0x22, + 0x52, 0xF8, 0x07, 0x22, 0x51, 0xF8, 0x07, 0x22, + 0x50, 0xF8, 0x07, 0x22, 0x4F, 0xF8, 0x07, 0x22, + 0x4E, 0xF8, 0x07, 0x22, 0x4D, 0xF8, 0x07, 0x22, + 0x4C, 0xF8, 0x07, 0x22, 0x4B, 0xF8, 0x07, 0x22, + 0x4A, 0xF8, 0x07, 0x22, 0x49, 0xF8, 0x07, 0x22, + 0x48, 0xF8, 0x07, 0x22, 0x47, 0xF8, 0x07, 0x22, + 0x46, 0xF8, 0x07, 0x22, 0x45, 0xF8, 0x07, 0x22, + 0x44, 0xF8, 0x07, 0x22, 0x43, 0xF8, 0x07, 0x22, + 0x42, 0xF8, 0x07, 0x22, 0x41, 0xF8, 0x07, 0x22, + 0x40, 0xF8, 0x07, 0x22, 0x3F, 0xF8, 0x07, 0x22, + 0x3E, 0xF8, 0x07, 0x22, 0x3D, 0xF8, 0x07, 0x22, + 0x3C, 0xF8, 0x07, 0x22, 0x3B, 0xF8, 0x07, 0x22, + 0x3A, 0xF8, 0x07, 0x22, 0x39, 0xF8, 0x07, 0x22, + 0x38, 0xF8, 0x07, 0x22, 0x37, 0xF8, 0x07, 0x22, + 0x36, 0xF8, 0x07, 0x22, 0x35, 0xF8, 0x07, 0x22, + 0x34, 0xF8, 0x07, 0x22, 0x33, 0xF8, 0x07, 0x22, + 0x32, 0xF8, 0x07, 0x22, 0x31, 0xF8, 0x07, 0x22, + 0x30, 0xF8, 0x07, 0x22, 0x2F, 0xF8, 0x07, 0x22, + 0x2E, 0xF8, 0x07, 0x22, 0x2D, 0xF8, 0x07, 0x22, + 0x2C, 0xF8, 0x07, 0x22, 0x2B, 0xF8, 0x07, 0x22, + 0x2A, 0xF8, 0x07, 0x22, 0x29, 0xF8, 0x07, 0x22, + 0x28, 0xF8, 0x07, 0x22, 0x27, 0xF8, 0x07, 0x22, + 0x26, 0xF8, 0x07, 0x22, 0x25, 0xF8, 0x07, 0x22, + 0x24, 0xF8, 0x07, 0x22, 0x23, 0xF8, 0x07, 0x20, + 0x22, 0xF8, 0x07, 0x20, 0x21, 0xF8, 0x07, 0x20, + 0x20, 0xF8, 0x07, 0x20, 0x1F, 0xF8, 0x07, 0x20, + 0x1E, 0xF8, 0x07, 0x20, 0x1D, 0xF8, 0x07, 0x20, + 0x1C, 0xF8, 0x07, 0x20, 0x1C, 0xF8, 0x07, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD8, 0xF8, 0x27, 0x20, 0xD9, 0xF8, 0x27, 0x20, + 0xDA, 0xF8, 0x27, 0x20, 0xDB, 0xF8, 0x27, 0x20, + 0xDC, 0xF8, 0x27, 0x20, 0xDD, 0xF8, 0x27, 0x20, + 0xDE, 0xF8, 0x27, 0x20, 0xDF, 0xF8, 0x27, 0x20, + 0xE0, 0xF8, 0x27, 0x20, 0xE1, 0xF8, 0x27, 0x20, + 0xE2, 0xF8, 0x27, 0x20, 0xE3, 0xF8, 0x27, 0x20, + 0xE4, 0xF8, 0x27, 0x20, 0xE5, 0xF8, 0x27, 0x20, + 0xE6, 0xF8, 0x27, 0x20, 0xE7, 0xF8, 0x27, 0x20, + 0xE8, 0xF8, 0x27, 0x20, 0xE9, 0xF8, 0x27, 0x20, + 0xEA, 0xF8, 0x27, 0x20, 0xEB, 0xF8, 0x27, 0x20, + 0xEC, 0xF8, 0x27, 0x20, 0xED, 0xF8, 0x27, 0x20, + 0xEE, 0xF8, 0x27, 0x20, 0xEF, 0xF8, 0x27, 0x20, + 0xF0, 0xF8, 0x27, 0x20, 0xF1, 0xF8, 0x27, 0x20, + 0xF2, 0xF8, 0x27, 0x20, 0xF3, 0xF8, 0x27, 0x20, + 0xF4, 0xF8, 0x27, 0x20, 0xF5, 0xF8, 0x27, 0x20, + 0xF6, 0xF8, 0x27, 0x20, 0xF7, 0xF8, 0x27, 0x20, + 0xF8, 0xF8, 0x27, 0x20, 0xF9, 0xF8, 0x27, 0x20, + 0xFA, 0xF8, 0x27, 0x20, 0xFB, 0xF8, 0x27, 0x20, + 0xFC, 0xF8, 0x27, 0x20, 0xFD, 0xF8, 0x27, 0x20, + 0xFE, 0xF8, 0x27, 0x20, 0xFF, 0xF8, 0x27, 0x20, + 0x00, 0xF9, 0x27, 0x20, 0xD7, 0xF8, 0x27, 0x20, + 0x00, 0xF8, 0x27, 0x20, 0x01, 0xF8, 0x27, 0x20, + 0x02, 0xF8, 0x27, 0x20, 0x03, 0xF8, 0x27, 0x20, + 0x04, 0xF8, 0x27, 0x20, 0x05, 0xF8, 0x27, 0x20, + 0x06, 0xF8, 0x27, 0x20, 0x07, 0xF8, 0x27, 0x20, + 0x08, 0xF8, 0x27, 0x20, 0x09, 0xF8, 0x27, 0x20, + 0x0A, 0xF8, 0x27, 0x20, 0x0B, 0xF8, 0x27, 0x20, + 0x0C, 0xF8, 0x27, 0x20, 0x0D, 0xF8, 0x27, 0x20, + 0x0E, 0xF8, 0x27, 0x20, 0x0F, 0xF8, 0x27, 0x20, + 0x10, 0xF8, 0x27, 0x20, 0x11, 0xF8, 0x27, 0x20, + 0x12, 0xF8, 0x27, 0x20, 0x13, 0xF8, 0x27, 0x20, + 0x14, 0xF8, 0x27, 0x20, 0x15, 0xF8, 0x27, 0x20, + 0x15, 0xF8, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x05, 0x00, 0x0E, 0x00, 0x0C, 0x20, 0xFD, + 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, 0x10, + 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, + 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, + 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x00, + 0x03, 0x00, 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x88, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x94, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x20, + 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x60, 0x21, 0x04, 0x30, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x15, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x28, 0x00, + 0x00, 0x18, 0x00, 0x52, 0x01, 0x08, 0x00, 0x05, + 0x00, 0x0A, 0x00, 0xFA, 0x00, 0x1E, 0x00, 0xC8, + 0x00, 0x00, 0x00, 0x9F, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x03, 0xFF, 0xF9, 0xFD, 0xFE, 0xFE, 0x00, 0xFD, + 0x02, 0x03, 0x02, 0x01, 0x01, 0xFF, 0x03, 0x06, + 0x0C, 0x08, 0x08, 0x0C, 0x06, 0x0A, 0x0B, 0x06, + 0x0B, 0x0A, 0x0C, 0x0A, 0x0A, 0x07, 0x02, 0x05, + 0x07, 0x06, 0x0A, 0x09, 0x09, 0x0C, 0x0C, 0x11, + 0x0B, 0x0D, 0x08, 0x07, 0x09, 0x09, 0x09, 0x08, + 0x06, 0x09, 0xFE, 0xFF, 0xFF, 0x01, 0x06, 0x01, + 0xFD, 0xFB, 0x00, 0x01, 0x04, 0x01, 0x02, 0x05, + 0x04, 0x00, 0x02, 0x02, 0x05, 0x07, 0x05, 0x03, + 0x05, 0x02, 0x0A, 0x06, 0x03, 0x04, 0x00, 0x01, + 0x02, 0x04, 0x01, 0x01, 0xFA, 0xF7, 0xFA, 0xF9, + 0xF6, 0xF7, 0xFD, 0xFE, 0x02, 0xFE, 0xFC, 0xF7, + 0xF9, 0xFB, 0xF7, 0xFB, 0xF5, 0xF8, 0xF8, 0xF9, + 0xEF, 0xEE, 0xF2, 0xEF, 0xF0, 0xED, 0xF2, 0xF7, + 0xF9, 0xFA, 0xF6, 0xF6, 0xF5, 0xF4, 0xF3, 0xEF, + 0xF1, 0xF5, 0xF4, 0xF1, 0xF5, 0xFA, 0xF8, 0xFA, + 0xF9, 0xFA, 0xFE, 0x01, 0x02, 0xFE, 0xFE, 0x03, + 0x01, 0xFC, 0xF9, 0xF7, 0xF6, 0xF4, 0xF9, 0xF7, + 0xF7, 0xF5, 0xF7, 0xFA, 0xFB, 0x00, 0xFC, 0xFD, + 0xFD, 0xF6, 0xF2, 0xF4, 0xED, 0xDC, 0xCE, 0xFF, + 0x05, 0x07, 0x08, 0x0E, 0x0E, 0x0F, 0x0A, 0x0C, + 0x06, 0x05, 0x05, 0xF6, 0xF2, 0xF1, 0xEF, 0xF4, + 0xF6, 0xF4, 0xF5, 0xF6, 0xF7, 0xF5, 0xF8, 0xF8, + 0xF8, 0xF2, 0xF7, 0xF3, 0xF0, 0xF3, 0xF5, 0xFD, + 0xFB, 0xFC, 0xF9, 0xF9, 0xFC, 0xFA, 0xF8, 0xFD, + 0x0B, 0x1C, 0x17, 0x13, 0x14, 0x0F, 0x0D, 0x0C, + 0x0B, 0x0B, 0x0F, 0x0C, 0x0E, 0x10, 0x0E, 0x11, + 0x12, 0x14, 0x1C, 0x1C, 0x20, 0x20, 0x24, 0xF4, + 0xF6, 0xF4, 0xF5, 0xF6, 0xF7, 0xF5, 0xF8, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, }; static unsigned char vfs5011_cmd_04[] = { /* 1 B */ - 0x04, + 0x04, }; static unsigned char vfs5011_prepare_00[] = { /* 578 B */ - 0x06, 0x9C, 0xF1, 0x9D, 0x71, 0xC3, 0x13, 0xDF, - 0x5F, 0xE4, 0x7A, 0x1F, 0xC7, 0x17, 0x53, 0x9A, - 0x1A, 0xA1, 0xD7, 0xB6, 0x6E, 0xBE, 0xDF, 0x1F, - 0x9F, 0x44, 0x42, 0x22, 0xFA, 0x2A, 0x6A, 0xAB, - 0x2B, 0xF0, 0x56, 0x39, 0xE3, 0x7B, 0x53, 0x9A, - 0x1A, 0xA1, 0xDB, 0xBA, 0x62, 0xB2, 0xE4, 0x65, - 0xE5, 0xDB, 0x68, 0x04, 0x79, 0x98, 0xDE, 0x8F, - 0x23, 0xFB, 0xEC, 0xAD, 0x76, 0xCA, 0xA2, 0xEB, - 0x61, 0x38, 0xC7, 0xAB, 0x6E, 0x2E, 0x78, 0xF9, - 0x79, 0x13, 0x8A, 0xE5, 0x90, 0x22, 0x63, 0x8D, - 0x0E, 0x93, 0x25, 0x49, 0x5A, 0xC8, 0xA3, 0xD8, - 0x7E, 0xAE, 0x12, 0xF6, 0x2C, 0x1C, 0xFC, 0x48, - 0x4F, 0x0E, 0x48, 0x22, 0xFB, 0x4B, 0xCE, 0x7E, - 0xDB, 0x2D, 0x91, 0xE0, 0xC8, 0x78, 0x2E, 0xAF, - 0x2F, 0xD4, 0x03, 0x6F, 0x12, 0x59, 0xC6, 0x26, - 0x40, 0x88, 0x2E, 0x62, 0xBA, 0x06, 0x6C, 0xC9, - 0x7A, 0x84, 0x93, 0xCF, 0x14, 0x15, 0x44, 0x87, - 0xE2, 0x09, 0x97, 0xE6, 0xCE, 0x7E, 0x28, 0xA9, - 0x29, 0x53, 0xD7, 0xB8, 0xD1, 0x53, 0x30, 0x15, - 0x6E, 0x95, 0x3E, 0xA2, 0x7A, 0xCA, 0x9C, 0x1D, - 0x9D, 0xEB, 0x5F, 0x15, 0xEF, 0x48, 0x34, 0xCC, - 0xCB, 0x02, 0xA6, 0xD6, 0xA7, 0x80, 0xF2, 0x3F, - 0x7E, 0x96, 0x23, 0xAE, 0x42, 0xF1, 0x29, 0xF5, - 0xAD, 0x5A, 0x35, 0x57, 0x36, 0xAA, 0xAF, 0x97, - 0xE8, 0x1E, 0xA2, 0xD3, 0xFB, 0x4B, 0x1D, 0x9C, - 0x1C, 0x06, 0x84, 0xEB, 0x9E, 0x2C, 0xD4, 0x18, - 0x94, 0x44, 0x7E, 0x4B, 0x12, 0x91, 0xF2, 0x8B, - 0x07, 0x45, 0xDB, 0x52, 0xBB, 0x2E, 0x53, 0x63, - 0xE3, 0x38, 0xB8, 0x95, 0x4D, 0x9B, 0xCF, 0x07, - 0x05, 0xDD, 0x4C, 0xE2, 0x39, 0xAF, 0xA9, 0x51, - 0xDB, 0xAD, 0x19, 0xC8, 0x13, 0x6E, 0x0A, 0x2F, - 0xEA, 0x12, 0xB9, 0x25, 0x55, 0xB6, 0x64, 0x04, - 0x7F, 0x14, 0x6E, 0x12, 0x08, 0xFB, 0xBD, 0xBD, - 0x1D, 0xC6, 0xE2, 0x84, 0x50, 0x20, 0x60, 0xA0, - 0x90, 0xD2, 0x74, 0x8A, 0x18, 0xA4, 0xD9, 0xE9, - 0x69, 0xB2, 0x1E, 0x73, 0xAB, 0x1B, 0x7B, 0xBB, - 0x3B, 0xE0, 0x42, 0x23, 0xF9, 0x29, 0x49, 0x89, - 0x09, 0xD2, 0x4C, 0x29, 0xF1, 0x21, 0x65, 0xAC, - 0x2C, 0x97, 0x30, 0x6C, 0xB4, 0x04, 0xF4, 0x3D, - 0xBD, 0x06, 0xA0, 0xC6, 0x1E, 0xCE, 0x7E, 0xB3, - 0x33, 0x88, 0x2E, 0x43, 0x9B, 0x2B, 0x37, 0xF0, - 0x70, 0xCB, 0x91, 0xF1, 0x2B, 0xFB, 0x8B, 0x48, - 0xCA, 0x39, 0x97, 0xFB, 0x21, 0xB9, 0xCD, 0x0E, - 0x8C, 0x7F, 0x8D, 0xEC, 0x36, 0xE6, 0xEA, 0x27, - 0xA5, 0x1E, 0x40, 0x2A, 0xF2, 0x22, 0xCA, 0x07, - 0x85, 0x3E, 0xC8, 0xAE, 0x76, 0xA6, 0xF0, 0x71, - 0xF1, 0xAB, 0x6B, 0x04, 0x6D, 0xA9, 0xCA, 0x06, - 0x2C, 0x66, 0xA5, 0xCA, 0xB0, 0x4B, 0x2B, 0x62, - 0xEB, 0xD5, 0x61, 0x0D, 0xF0, 0x46, 0x26, 0xC3, - 0x44, 0x9F, 0x0C, 0x63, 0xBB, 0xAA, 0xBD, 0x7E, - 0xF2, 0x74, 0x00, 0x66, 0x2B, 0x7A, 0x62, 0xA1, - 0x07, 0x80, 0x33, 0x8D, 0x1F, 0xF7, 0x45, 0xCB, - 0x5E, 0x24, 0xEB, 0x84, 0xED, 0x27, 0x44, 0x61, - 0xFF, 0x0C, 0xA7, 0x3B, 0xE3, 0x53, 0x05, 0x84, - 0x04, 0xEE, 0x23, 0x4C, 0xB5, 0x79, 0x1A, 0xF3, - 0xA0, 0x66, 0x20, 0x4C, 0x94, 0x24, 0x72, 0xF3, - 0x73, 0x39, 0xF8, 0x97, 0xDD, 0x64, 0x54, 0xF2, - 0x6B, 0xBA, 0xAD, 0xBC, 0x67, 0x66, 0x78, 0xBB, - 0x5E, 0x6D, 0xFB, 0x8A, 0xA2, 0x74, 0x3D, 0xF5, - 0xD4, 0x72, 0xC7, 0x1A, 0xBD, 0x0E, 0x0B, 0x2C, - 0x8C, 0x4A, 0x0C, 0x60, 0xB8, 0x08, 0x5E, 0xDF, - 0x5F, 0x05, 0x33, 0x5C, 0xB5, 0x7E, 0x1D, 0xFC, - 0xFD, 0x25, 0xBA, 0x95, 0xC4, 0xA7, 0xDA, 0xEA, - 0x6A, 0xB1, 0x31, 0x1C, 0xC4, 0xE5, 0x07, 0xC4, - 0xC5, 0x9D, 0x28, 0xCD, 0x3C, 0xE9, 0x89, 0x49, - 0xD4, 0xFF, 0x7F, 0x52, 0x8A, 0x9B, 0x7F, 0xBC, - 0x8E, 0xF5, 0xCF, 0x0B, 0xD9, 0x49, 0x48, 0x88, - 0x80, 0x71, 0x7D, 0xAB, 0xEF, 0x47, 0x2B, 0xF7, - 0x7B, 0x2D, 0x79, 0x3F, 0xCF, 0xBF, 0xFF, 0x3F, - 0x6D, 0xF8, 0x42, 0xEC, 0x7F, 0xE8, 0xED, 0x42, - 0xE6, 0x1D, 0x4D, 0x32, 0xFA, 0x6A, 0x0A, 0xD7, - 0xA7, 0x7C, 0xCB, 0xA7, 0x7B, 0xCB, 0xBF, 0x71, - 0xF3, 0x48, + 0x06, 0x9C, 0xF1, 0x9D, 0x71, 0xC3, 0x13, 0xDF, + 0x5F, 0xE4, 0x7A, 0x1F, 0xC7, 0x17, 0x53, 0x9A, + 0x1A, 0xA1, 0xD7, 0xB6, 0x6E, 0xBE, 0xDF, 0x1F, + 0x9F, 0x44, 0x42, 0x22, 0xFA, 0x2A, 0x6A, 0xAB, + 0x2B, 0xF0, 0x56, 0x39, 0xE3, 0x7B, 0x53, 0x9A, + 0x1A, 0xA1, 0xDB, 0xBA, 0x62, 0xB2, 0xE4, 0x65, + 0xE5, 0xDB, 0x68, 0x04, 0x79, 0x98, 0xDE, 0x8F, + 0x23, 0xFB, 0xEC, 0xAD, 0x76, 0xCA, 0xA2, 0xEB, + 0x61, 0x38, 0xC7, 0xAB, 0x6E, 0x2E, 0x78, 0xF9, + 0x79, 0x13, 0x8A, 0xE5, 0x90, 0x22, 0x63, 0x8D, + 0x0E, 0x93, 0x25, 0x49, 0x5A, 0xC8, 0xA3, 0xD8, + 0x7E, 0xAE, 0x12, 0xF6, 0x2C, 0x1C, 0xFC, 0x48, + 0x4F, 0x0E, 0x48, 0x22, 0xFB, 0x4B, 0xCE, 0x7E, + 0xDB, 0x2D, 0x91, 0xE0, 0xC8, 0x78, 0x2E, 0xAF, + 0x2F, 0xD4, 0x03, 0x6F, 0x12, 0x59, 0xC6, 0x26, + 0x40, 0x88, 0x2E, 0x62, 0xBA, 0x06, 0x6C, 0xC9, + 0x7A, 0x84, 0x93, 0xCF, 0x14, 0x15, 0x44, 0x87, + 0xE2, 0x09, 0x97, 0xE6, 0xCE, 0x7E, 0x28, 0xA9, + 0x29, 0x53, 0xD7, 0xB8, 0xD1, 0x53, 0x30, 0x15, + 0x6E, 0x95, 0x3E, 0xA2, 0x7A, 0xCA, 0x9C, 0x1D, + 0x9D, 0xEB, 0x5F, 0x15, 0xEF, 0x48, 0x34, 0xCC, + 0xCB, 0x02, 0xA6, 0xD6, 0xA7, 0x80, 0xF2, 0x3F, + 0x7E, 0x96, 0x23, 0xAE, 0x42, 0xF1, 0x29, 0xF5, + 0xAD, 0x5A, 0x35, 0x57, 0x36, 0xAA, 0xAF, 0x97, + 0xE8, 0x1E, 0xA2, 0xD3, 0xFB, 0x4B, 0x1D, 0x9C, + 0x1C, 0x06, 0x84, 0xEB, 0x9E, 0x2C, 0xD4, 0x18, + 0x94, 0x44, 0x7E, 0x4B, 0x12, 0x91, 0xF2, 0x8B, + 0x07, 0x45, 0xDB, 0x52, 0xBB, 0x2E, 0x53, 0x63, + 0xE3, 0x38, 0xB8, 0x95, 0x4D, 0x9B, 0xCF, 0x07, + 0x05, 0xDD, 0x4C, 0xE2, 0x39, 0xAF, 0xA9, 0x51, + 0xDB, 0xAD, 0x19, 0xC8, 0x13, 0x6E, 0x0A, 0x2F, + 0xEA, 0x12, 0xB9, 0x25, 0x55, 0xB6, 0x64, 0x04, + 0x7F, 0x14, 0x6E, 0x12, 0x08, 0xFB, 0xBD, 0xBD, + 0x1D, 0xC6, 0xE2, 0x84, 0x50, 0x20, 0x60, 0xA0, + 0x90, 0xD2, 0x74, 0x8A, 0x18, 0xA4, 0xD9, 0xE9, + 0x69, 0xB2, 0x1E, 0x73, 0xAB, 0x1B, 0x7B, 0xBB, + 0x3B, 0xE0, 0x42, 0x23, 0xF9, 0x29, 0x49, 0x89, + 0x09, 0xD2, 0x4C, 0x29, 0xF1, 0x21, 0x65, 0xAC, + 0x2C, 0x97, 0x30, 0x6C, 0xB4, 0x04, 0xF4, 0x3D, + 0xBD, 0x06, 0xA0, 0xC6, 0x1E, 0xCE, 0x7E, 0xB3, + 0x33, 0x88, 0x2E, 0x43, 0x9B, 0x2B, 0x37, 0xF0, + 0x70, 0xCB, 0x91, 0xF1, 0x2B, 0xFB, 0x8B, 0x48, + 0xCA, 0x39, 0x97, 0xFB, 0x21, 0xB9, 0xCD, 0x0E, + 0x8C, 0x7F, 0x8D, 0xEC, 0x36, 0xE6, 0xEA, 0x27, + 0xA5, 0x1E, 0x40, 0x2A, 0xF2, 0x22, 0xCA, 0x07, + 0x85, 0x3E, 0xC8, 0xAE, 0x76, 0xA6, 0xF0, 0x71, + 0xF1, 0xAB, 0x6B, 0x04, 0x6D, 0xA9, 0xCA, 0x06, + 0x2C, 0x66, 0xA5, 0xCA, 0xB0, 0x4B, 0x2B, 0x62, + 0xEB, 0xD5, 0x61, 0x0D, 0xF0, 0x46, 0x26, 0xC3, + 0x44, 0x9F, 0x0C, 0x63, 0xBB, 0xAA, 0xBD, 0x7E, + 0xF2, 0x74, 0x00, 0x66, 0x2B, 0x7A, 0x62, 0xA1, + 0x07, 0x80, 0x33, 0x8D, 0x1F, 0xF7, 0x45, 0xCB, + 0x5E, 0x24, 0xEB, 0x84, 0xED, 0x27, 0x44, 0x61, + 0xFF, 0x0C, 0xA7, 0x3B, 0xE3, 0x53, 0x05, 0x84, + 0x04, 0xEE, 0x23, 0x4C, 0xB5, 0x79, 0x1A, 0xF3, + 0xA0, 0x66, 0x20, 0x4C, 0x94, 0x24, 0x72, 0xF3, + 0x73, 0x39, 0xF8, 0x97, 0xDD, 0x64, 0x54, 0xF2, + 0x6B, 0xBA, 0xAD, 0xBC, 0x67, 0x66, 0x78, 0xBB, + 0x5E, 0x6D, 0xFB, 0x8A, 0xA2, 0x74, 0x3D, 0xF5, + 0xD4, 0x72, 0xC7, 0x1A, 0xBD, 0x0E, 0x0B, 0x2C, + 0x8C, 0x4A, 0x0C, 0x60, 0xB8, 0x08, 0x5E, 0xDF, + 0x5F, 0x05, 0x33, 0x5C, 0xB5, 0x7E, 0x1D, 0xFC, + 0xFD, 0x25, 0xBA, 0x95, 0xC4, 0xA7, 0xDA, 0xEA, + 0x6A, 0xB1, 0x31, 0x1C, 0xC4, 0xE5, 0x07, 0xC4, + 0xC5, 0x9D, 0x28, 0xCD, 0x3C, 0xE9, 0x89, 0x49, + 0xD4, 0xFF, 0x7F, 0x52, 0x8A, 0x9B, 0x7F, 0xBC, + 0x8E, 0xF5, 0xCF, 0x0B, 0xD9, 0x49, 0x48, 0x88, + 0x80, 0x71, 0x7D, 0xAB, 0xEF, 0x47, 0x2B, 0xF7, + 0x7B, 0x2D, 0x79, 0x3F, 0xCF, 0xBF, 0xFF, 0x3F, + 0x6D, 0xF8, 0x42, 0xEC, 0x7F, 0xE8, 0xED, 0x42, + 0xE6, 0x1D, 0x4D, 0x32, 0xFA, 0x6A, 0x0A, 0xD7, + 0xA7, 0x7C, 0xCB, 0xA7, 0x7B, 0xCB, 0xBF, 0x71, + 0xF3, 0x48, }; static unsigned char vfs5011_prepare_01[] = { /* 3794 B */ - 0x06, 0x6B, 0x06, 0x6A, 0x76, 0xC8, 0x18, 0xD4, - 0x54, 0xEF, 0x71, 0x14, 0xCC, 0x1C, 0x58, 0x91, - 0x11, 0xAA, 0x80, 0xF4, 0x2C, 0xFC, 0x9F, 0x5F, - 0xDF, 0x04, 0x02, 0x62, 0xBA, 0x6A, 0x5A, 0x97, - 0x17, 0xCC, 0x46, 0x22, 0xFA, 0x2A, 0xBE, 0x03, - 0x87, 0x3C, 0x9E, 0xFE, 0x26, 0xF6, 0x96, 0x7E, - 0xFA, 0x11, 0x27, 0x66, 0xBA, 0x3A, 0x5A, 0xBA, - 0x3E, 0xD5, 0x4F, 0x03, 0xDF, 0x5F, 0x7F, 0x9F, - 0x1B, 0xF0, 0xA2, 0xEF, 0x33, 0xB3, 0xD3, 0x13, - 0x93, 0x70, 0xFA, 0x96, 0x4E, 0xC6, 0xA6, 0xC6, - 0x46, 0xA5, 0x2F, 0xE3, 0x3B, 0xB3, 0xD3, 0x33, - 0xB3, 0x50, 0xE8, 0xA4, 0x7C, 0xF4, 0x94, 0x14, - 0x94, 0x77, 0xC9, 0xE5, 0x3D, 0xB5, 0xD5, 0x75, - 0xF5, 0x16, 0xA8, 0xA4, 0x7C, 0xF4, 0x94, 0xD4, - 0x54, 0xB7, 0x09, 0xE5, 0x3D, 0xB5, 0x2D, 0xF4, - 0x74, 0xCF, 0x29, 0x5C, 0x84, 0x54, 0x14, 0xAA, - 0x2E, 0x95, 0xF7, 0xE0, 0x3C, 0xEC, 0x8C, 0x52, - 0xD6, 0x3D, 0x7B, 0x0E, 0xD6, 0x06, 0x82, 0x49, - 0xC9, 0x72, 0x7C, 0x18, 0xC0, 0x10, 0x10, 0xF6, - 0x72, 0xC9, 0xC3, 0xA8, 0x70, 0xA0, 0xD8, 0x77, - 0xF3, 0x48, 0x06, 0x04, 0xD8, 0x08, 0x90, 0x5B, - 0xDB, 0x60, 0x36, 0x43, 0x9B, 0x4B, 0xD4, 0xE3, - 0x9C, 0xB8, 0xF1, 0x72, 0x55, 0x1A, 0x8E, 0x57, - 0xD7, 0x6C, 0xDA, 0xBE, 0x66, 0xD6, 0xEA, 0x3D, - 0xBF, 0x04, 0xB2, 0xCE, 0x16, 0xA6, 0x06, 0xDE, - 0x5E, 0xE5, 0xB7, 0xC3, 0x1B, 0xCB, 0x47, 0x9F, - 0x1F, 0xA4, 0x3E, 0x5B, 0x83, 0x53, 0x53, 0x8A, - 0x0A, 0xB1, 0x93, 0xF9, 0x21, 0xF1, 0x31, 0xE6, - 0x64, 0xDF, 0x95, 0xE0, 0x38, 0xE8, 0xB4, 0x6D, - 0xED, 0x56, 0x1D, 0x8E, 0x56, 0xE6, 0x79, 0xB9, - 0xC6, 0xE2, 0x62, 0x4F, 0x97, 0x02, 0x40, 0x80, - 0x65, 0xB8, 0x0E, 0x07, 0xC2, 0x72, 0x37, 0xBE, - 0x3E, 0x00, 0xF2, 0xB8, 0xF1, 0x6D, 0x0E, 0x6F, - 0xC2, 0x1A, 0xA0, 0xC4, 0x95, 0x2F, 0xCD, 0x44, - 0xC4, 0x02, 0x44, 0x28, 0xF0, 0x40, 0x16, 0x97, - 0x17, 0x7D, 0xE4, 0x8B, 0xFE, 0x4C, 0x0D, 0xE3, - 0x60, 0xFD, 0x4B, 0x27, 0x34, 0xA6, 0xCD, 0xB6, - 0x10, 0xC0, 0x7C, 0x98, 0x42, 0x72, 0x92, 0x26, - 0x21, 0x60, 0x26, 0x4C, 0x95, 0x25, 0xA0, 0x03, - 0xA6, 0x50, 0xEC, 0x9D, 0xB5, 0x05, 0x53, 0xD2, - 0x52, 0xA9, 0x7E, 0x12, 0x2F, 0x65, 0xFA, 0x1A, - 0x7C, 0xB4, 0x12, 0x5E, 0x86, 0x3A, 0x50, 0xF5, - 0x53, 0xAD, 0xBA, 0xE6, 0x3D, 0x3C, 0x6D, 0xAE, - 0xCB, 0x33, 0xAD, 0xDC, 0xF4, 0x44, 0x12, 0x93, - 0x13, 0xF9, 0x7D, 0x12, 0xEB, 0x68, 0x0B, 0xE2, - 0x21, 0xE7, 0xA1, 0xCD, 0x15, 0xA5, 0xF3, 0x72, - 0xF2, 0xAB, 0x1F, 0x7E, 0xAA, 0x01, 0xE1, 0xA1, - 0x25, 0xA8, 0x06, 0x6D, 0xB9, 0x0C, 0x60, 0xA6, - 0x64, 0xAD, 0x15, 0x65, 0xBA, 0x30, 0x14, 0x66, - 0x22, 0x78, 0xFC, 0x94, 0x4C, 0x4E, 0x25, 0x9B, - 0xD9, 0x06, 0xB1, 0xEA, 0x89, 0x35, 0x62, 0x1E, - 0x8F, 0x69, 0xD4, 0x7F, 0x1C, 0xA0, 0xFD, 0x31, - 0x77, 0xAD, 0x1B, 0x40, 0xA4, 0x10, 0xB7, 0xCC, - 0x4D, 0xAB, 0x16, 0xD7, 0x0C, 0x01, 0x62, 0x87, - 0xBF, 0x4C, 0x50, 0x5A, 0xD8, 0x3B, 0x50, 0xE7, - 0x2C, 0xB3, 0xB7, 0x1F, 0x46, 0xA0, 0x57, 0x6B, - 0x46, 0x98, 0x93, 0xFA, 0xC7, 0xC1, 0x89, 0x45, - 0xDE, 0xD7, 0xC3, 0xC3, 0xBB, 0xCF, 0xEE, 0xEE, - 0xA8, 0xB3, 0xDF, 0x61, 0x4B, 0xE6, 0x04, 0x04, - 0x40, 0xDA, 0xAC, 0x43, 0xDA, 0x9A, 0x15, 0x25, - 0x45, 0x7D, 0xEA, 0x0C, 0x3A, 0x7A, 0xD4, 0x87, - 0xC5, 0x43, 0x77, 0x1D, 0xC6, 0x76, 0xD4, 0xB6, - 0x5A, 0x4B, 0x3F, 0x91, 0x55, 0x98, 0xC2, 0xCE, - 0x8C, 0x5B, 0xED, 0x53, 0x99, 0x20, 0x6D, 0xA6, - 0xF1, 0x96, 0x21, 0x41, 0xBB, 0x16, 0x86, 0x46, - 0xC6, 0x1D, 0x9D, 0xB0, 0x68, 0x69, 0x3D, 0xFE, - 0xC6, 0x16, 0x2C, 0x2B, 0x51, 0x40, 0x40, 0x2A, - 0x01, 0xBF, 0xB3, 0xFF, 0x8A, 0x38, 0x3D, 0x51, - 0xF4, 0x32, 0x74, 0x18, 0xC0, 0x70, 0x26, 0xA7, - 0x27, 0x5D, 0xDE, 0xB1, 0xD8, 0x5E, 0x3D, 0x30, - 0xB2, 0x0C, 0xEC, 0xA5, 0xCC, 0x44, 0x27, 0xC7, - 0x6D, 0x16, 0x01, 0x5A, 0x81, 0xFC, 0x9E, 0x3B, - 0xEE, 0x10, 0x17, 0x41, 0x9A, 0x0A, 0x50, 0x30, - 0x72, 0x6A, 0xCC, 0x01, 0xE0, 0x53, 0x3F, 0xFD, - 0x54, 0x8C, 0x13, 0x6C, 0x9D, 0x0E, 0x47, 0xB4, - 0xD1, 0x59, 0xCA, 0x17, 0xF3, 0x40, 0x10, 0xEA, - 0xCA, 0xD3, 0xA6, 0xDA, 0xA3, 0x28, 0x4B, 0x6E, - 0xBC, 0x42, 0xF8, 0x9D, 0x75, 0xFF, 0x3F, 0xCD, - 0x8E, 0x45, 0xE8, 0x1D, 0xEC, 0x5F, 0x74, 0x87, - 0x61, 0x23, 0x63, 0xA2, 0x79, 0x7B, 0xBB, 0xDE, - 0x72, 0xE5, 0xB6, 0x7B, 0x8B, 0x9A, 0xC7, 0x04, - 0x35, 0xD0, 0x65, 0xCB, 0xD0, 0x44, 0x41, 0xD1, - 0x74, 0x1E, 0xE8, 0x87, 0x6F, 0xE5, 0x25, 0x44, - 0xFB, 0x23, 0xA7, 0x08, 0xF4, 0x89, 0xEA, 0xCF, - 0x1E, 0xE0, 0xE7, 0xC9, 0x12, 0x92, 0xC8, 0xA8, - 0x89, 0x13, 0xA6, 0x07, 0xDC, 0xC9, 0xFA, 0x1F, - 0x2E, 0xB1, 0x04, 0x58, 0xBA, 0xAA, 0x6B, 0xE8, - 0x6B, 0x7D, 0xC8, 0x01, 0x8B, 0x1E, 0xCF, 0x49, - 0xCA, 0x21, 0xAD, 0x61, 0x18, 0xED, 0x8E, 0x83, - 0x00, 0x3E, 0xD9, 0x90, 0x78, 0xE2, 0x22, 0xFF, - 0x8F, 0x54, 0xD4, 0xF9, 0x21, 0x10, 0x37, 0xF4, - 0xFC, 0x2F, 0x15, 0x31, 0x48, 0xB0, 0xD3, 0x36, - 0xC1, 0x32, 0x99, 0x05, 0xDD, 0x6D, 0x3B, 0xBA, - 0x3A, 0x60, 0x91, 0xFE, 0xAE, 0x16, 0xFA, 0x72, - 0x53, 0xC0, 0x75, 0xFC, 0x51, 0xC9, 0x0C, 0x38, - 0x99, 0x5F, 0x19, 0x75, 0xAD, 0x1D, 0x4B, 0xCA, - 0x4A, 0x3C, 0x88, 0x01, 0x40, 0xD2, 0x33, 0xB4, - 0x37, 0x64, 0xDA, 0x3A, 0xAA, 0xBB, 0x93, 0x50, - 0xF5, 0x5A, 0xC4, 0xB5, 0x9D, 0x2D, 0x7B, 0xFA, - 0x7A, 0x84, 0x17, 0x7B, 0x22, 0xD8, 0xBB, 0xEA, - 0x58, 0x80, 0x97, 0xB2, 0x69, 0x70, 0x49, 0x00, - 0x89, 0x4F, 0x09, 0x65, 0xBD, 0x0D, 0x5B, 0xDA, - 0x5A, 0xB0, 0x32, 0x5D, 0x89, 0x1E, 0x46, 0x85, - 0x54, 0xC4, 0x71, 0x8F, 0x54, 0xEC, 0xEE, 0x8F, - 0x7F, 0xAF, 0x90, 0xEA, 0x7A, 0xCC, 0x7D, 0xF1, - 0x72, 0xA5, 0x79, 0x19, 0xC6, 0xF4, 0x5D, 0x61, - 0xF7, 0x24, 0x98, 0xD2, 0x53, 0xEB, 0x26, 0xE4, - 0x01, 0x67, 0xF7, 0xB6, 0x64, 0xC9, 0x59, 0xF3, - 0x30, 0x59, 0xFC, 0x9B, 0xD1, 0x65, 0x05, 0xD3, - 0x68, 0xB8, 0x68, 0x7D, 0xB5, 0xC7, 0xB3, 0x8F, - 0x59, 0x2E, 0x92, 0x5C, 0xC7, 0x7F, 0x3D, 0xFE, - 0x73, 0x88, 0x1F, 0x77, 0xB2, 0xF2, 0x9E, 0x55, - 0x57, 0x8F, 0x34, 0x9A, 0x61, 0x0C, 0x7B, 0xD3, - 0x5C, 0x15, 0xAE, 0xC2, 0x16, 0xB4, 0xC2, 0x2B, - 0xA5, 0x75, 0x6A, 0xA4, 0x31, 0x81, 0xA7, 0x67, - 0xE7, 0x30, 0x84, 0x28, 0xD0, 0x60, 0xA2, 0x71, - 0xF9, 0xE0, 0x33, 0xFF, 0xAB, 0x01, 0x04, 0x22, - 0x84, 0x42, 0x04, 0x02, 0x99, 0xFB, 0x9F, 0x5F, - 0xB9, 0x7F, 0xF5, 0x21, 0xDB, 0xC6, 0xA5, 0x00, - 0x60, 0x9D, 0x8B, 0x07, 0xAB, 0x7D, 0x03, 0xE2, - 0xD3, 0x45, 0xF0, 0x6E, 0xBD, 0x0D, 0x4B, 0xA4, - 0x23, 0x8A, 0x77, 0x1B, 0xCF, 0x75, 0x30, 0x96, - 0x33, 0xE4, 0x6A, 0x94, 0x6F, 0x01, 0xA1, 0x41, - 0xC1, 0x88, 0x5B, 0x97, 0xCD, 0x3E, 0x56, 0xD0, - 0x53, 0x88, 0x9C, 0xE3, 0x3C, 0x00, 0x1A, 0xA8, - 0x6C, 0xB7, 0xA3, 0xDC, 0x03, 0x96, 0x14, 0xF2, - 0x7E, 0xB7, 0x1C, 0x80, 0xEA, 0x49, 0x21, 0x8B, - 0x48, 0x85, 0xF8, 0x93, 0x89, 0x3D, 0x5D, 0x5F, - 0x13, 0x33, 0x93, 0xC3, 0x1C, 0x4E, 0x2D, 0xE0, - 0xE2, 0x1D, 0x2A, 0x51, 0xE7, 0x07, 0xF5, 0x38, - 0xB8, 0x75, 0x4A, 0x2A, 0xFE, 0x5C, 0x37, 0x0E, - 0x7C, 0xEA, 0x5C, 0xB6, 0x7E, 0xCE, 0x2C, 0x25, - 0x5C, 0xD1, 0xFF, 0x66, 0x06, 0x94, 0x59, 0x9A, - 0x7F, 0x7D, 0xED, 0x21, 0x69, 0xAD, 0xC6, 0x9F, - 0x49, 0x7B, 0xC7, 0xA7, 0x74, 0xC8, 0xE4, 0xC6, - 0x65, 0x63, 0x07, 0xC9, 0x65, 0x0F, 0xBC, 0xBC, - 0x1C, 0xC7, 0xD3, 0xAC, 0x7C, 0x2E, 0x2B, 0x4B, - 0xB9, 0x3F, 0xF7, 0x59, 0xC2, 0x7A, 0x0C, 0x86, - 0xF4, 0x23, 0xFB, 0x75, 0xE9, 0x59, 0x9B, 0x48, - 0xC0, 0x7E, 0x13, 0x59, 0x07, 0x72, 0xED, 0x00, - 0x87, 0x50, 0xE9, 0x45, 0xBD, 0x0D, 0xCF, 0x1C, - 0x94, 0xCD, 0x1E, 0xD2, 0x1C, 0x36, 0xA5, 0x80, - 0xD9, 0x24, 0x8F, 0x13, 0xC7, 0x75, 0x53, 0x5B, - 0x24, 0x47, 0xD3, 0x12, 0xC9, 0x5C, 0xE8, 0x0E, - 0x2E, 0x65, 0xA7, 0xAD, 0x6C, 0xFB, 0x97, 0x5C, - 0x0E, 0xF6, 0x9D, 0x33, 0x49, 0x8D, 0x27, 0x24, - 0x64, 0x9F, 0x29, 0x97, 0x2A, 0x3A, 0xF8, 0x2B, - 0xA3, 0x0A, 0xE0, 0xF2, 0x96, 0x7C, 0x76, 0x55, - 0xD9, 0x6F, 0x0B, 0x29, 0xF1, 0xE3, 0x90, 0x58, - 0xBD, 0xB0, 0x20, 0xCA, 0x1B, 0xAB, 0xC7, 0x78, - 0xF4, 0x7B, 0x8F, 0xA0, 0x70, 0xAA, 0x89, 0xBB, - 0x7F, 0xA4, 0xA0, 0xDF, 0x0C, 0x20, 0x0B, 0x79, - 0xAD, 0x8A, 0x30, 0xA6, 0x72, 0x4A, 0xA8, 0x2C, - 0xAC, 0x12, 0x70, 0x3A, 0x70, 0xD4, 0x48, 0x1A, - 0x53, 0x79, 0x5D, 0x65, 0x41, 0xD3, 0xB0, 0x7D, - 0xDD, 0x27, 0x95, 0xE4, 0xCC, 0x51, 0x36, 0x70, - 0x2F, 0x0B, 0x1F, 0x67, 0x43, 0xE5, 0x5F, 0x77, - 0xFB, 0xA8, 0x9C, 0xB4, 0x6C, 0x6A, 0xB0, 0x60, - 0xEC, 0xCD, 0xDE, 0x63, 0x9D, 0x0F, 0x7B, 0x47, - 0xE5, 0xFC, 0xBB, 0xF5, 0x79, 0x35, 0x53, 0x0E, - 0x71, 0x4F, 0x29, 0x63, 0x96, 0x21, 0x07, 0x3B, - 0x44, 0x9F, 0x1F, 0x32, 0xEA, 0x0B, 0x5F, 0x9C, - 0x44, 0x9A, 0x6E, 0xA2, 0x8A, 0x70, 0x55, 0xA7, - 0x23, 0x78, 0xE8, 0xA7, 0x4E, 0xD8, 0xFB, 0x08, - 0xE9, 0x79, 0xCC, 0xD1, 0x45, 0xF6, 0x9A, 0xF2, - 0x54, 0xEC, 0x75, 0x7F, 0x24, 0x8A, 0xE6, 0x55, - 0x47, 0xB9, 0xD1, 0x7D, 0x85, 0x35, 0xC7, 0x61, - 0x41, 0xA8, 0x5A, 0xB6, 0xDC, 0x69, 0x04, 0x66, - 0xE1, 0x3A, 0x3C, 0xE1, 0x3D, 0x3D, 0xF5, 0xA6, - 0x84, 0x18, 0xAE, 0xDF, 0xF7, 0x5A, 0xCA, 0x06, - 0x95, 0x08, 0xBE, 0xD2, 0x06, 0x85, 0xD7, 0x53, - 0x53, 0x95, 0xD3, 0xB3, 0x38, 0x4A, 0x0F, 0x11, - 0x51, 0xAA, 0x1C, 0xB2, 0x0C, 0x1C, 0xBA, 0x89, - 0xF6, 0x2D, 0xAD, 0x80, 0x58, 0xD9, 0xF7, 0x34, - 0x95, 0x01, 0xB4, 0xF1, 0x3A, 0x97, 0x07, 0xC7, - 0x47, 0x9C, 0x1C, 0x31, 0xE9, 0xC8, 0x9C, 0x5F, - 0x47, 0x95, 0xAF, 0x6A, 0x10, 0x89, 0x34, 0x54, - 0x74, 0xBB, 0x2B, 0x7D, 0xA7, 0xF2, 0xD0, 0x31, - 0xAC, 0x87, 0x07, 0x2A, 0xF2, 0xE3, 0xD2, 0x11, - 0xB0, 0x21, 0x94, 0xC9, 0x23, 0x90, 0x61, 0xF1, - 0x72, 0x28, 0xCC, 0xA3, 0xF2, 0x6B, 0x22, 0xE1, - 0xC8, 0x4A, 0xE1, 0x7D, 0xA5, 0x15, 0x43, 0xC2, - 0x42, 0xB8, 0x5D, 0x32, 0x62, 0xF0, 0x57, 0xFF, - 0x62, 0x18, 0xFA, 0x95, 0x28, 0xD1, 0x99, 0xC8, - 0x1D, 0xC5, 0xB2, 0x88, 0x53, 0x52, 0x65, 0xA6, - 0x8E, 0x77, 0x79, 0x1E, 0x06, 0x1C, 0x6C, 0x3C, - 0x26, 0xED, 0xEB, 0x1D, 0x56, 0x7F, 0x3D, 0x58, - 0x11, 0xEF, 0x44, 0xD8, 0x00, 0xB0, 0xE6, 0x67, - 0xE7, 0x9D, 0x7F, 0x10, 0x2D, 0xDF, 0x97, 0xB6, - 0x6E, 0xB6, 0x41, 0x1F, 0xC4, 0x45, 0x76, 0xB5, - 0x39, 0xEE, 0x80, 0xCF, 0xE6, 0x01, 0x62, 0x15, - 0xF8, 0x01, 0x0A, 0x69, 0x79, 0xCD, 0x64, 0xAB, - 0x86, 0x5F, 0x68, 0x5D, 0x86, 0xD6, 0x2B, 0xCB, - 0xD2, 0x2A, 0x15, 0x7D, 0xC0, 0x38, 0x58, 0x29, - 0xF3, 0x2B, 0x35, 0x7A, 0xAE, 0x1C, 0xCC, 0xA6, - 0x06, 0x74, 0xE1, 0x90, 0xB8, 0x04, 0x6F, 0x69, - 0x1F, 0x3B, 0xBB, 0x96, 0x4E, 0xE2, 0x4A, 0x0D, - 0x1F, 0xC0, 0x57, 0x60, 0xBB, 0x16, 0x86, 0xEB, - 0x69, 0x97, 0xE3, 0xAA, 0x5F, 0xE5, 0x98, 0xA8, - 0x28, 0xF3, 0x73, 0x5E, 0x86, 0x47, 0x60, 0xA3, - 0xFF, 0x70, 0x4E, 0x25, 0x71, 0x89, 0x4C, 0x92, - 0x12, 0x8F, 0x38, 0x54, 0x2D, 0xD5, 0xB6, 0x53, - 0xEF, 0x1C, 0x02, 0x69, 0xBD, 0x04, 0xF6, 0x7C, - 0x64, 0x0D, 0x1B, 0x04, 0x96, 0x45, 0xE7, 0x87, - 0x73, 0xCF, 0x45, 0x3A, 0x5F, 0xED, 0x25, 0xE2, - 0xAF, 0x77, 0x8B, 0x4D, 0x37, 0x4D, 0x09, 0x6C, - 0xA9, 0x5A, 0x5E, 0x92, 0x39, 0x4F, 0x2A, 0xEA, - 0x2D, 0xCD, 0x6F, 0xBE, 0x64, 0x7C, 0x1B, 0x19, - 0x39, 0x96, 0x60, 0xC0, 0xD8, 0x22, 0xE8, 0x8A, - 0xC0, 0x3F, 0x6C, 0x43, 0xB3, 0xB1, 0x71, 0xC2, - 0xFE, 0x70, 0xA1, 0xF6, 0x26, 0x34, 0xF0, 0x35, - 0x50, 0x5A, 0xC8, 0xE2, 0x3D, 0x8D, 0x5F, 0x3F, - 0xCB, 0x77, 0x7A, 0x1E, 0x64, 0x70, 0x16, 0x33, - 0x63, 0x9C, 0xAC, 0xC3, 0x1B, 0xA7, 0xCD, 0xD5, - 0x52, 0x85, 0x2F, 0x81, 0x14, 0x3C, 0xB9, 0xB6, - 0x12, 0xEC, 0x5E, 0x32, 0x02, 0xB5, 0x37, 0xF9, - 0xE1, 0xF6, 0x0E, 0xC3, 0x53, 0xE0, 0x25, 0xDD, - 0x75, 0xB3, 0xF5, 0x99, 0x41, 0xF1, 0xA7, 0x26, - 0xA6, 0x4C, 0xBD, 0xD2, 0x32, 0x81, 0xC0, 0x5C, - 0xDF, 0x2D, 0xE8, 0x0F, 0x54, 0x76, 0xD5, 0x01, - 0x18, 0xA0, 0x8F, 0xB0, 0xE1, 0x62, 0x8B, 0x68, - 0xCA, 0xD3, 0x99, 0xDC, 0x47, 0xEA, 0x7A, 0xBA, - 0x3A, 0xE1, 0x61, 0x4C, 0x94, 0xC1, 0xB2, 0x72, - 0xEF, 0xC4, 0x44, 0x69, 0xB1, 0x0D, 0x27, 0x42, - 0xE2, 0x1B, 0x8C, 0xA7, 0x7C, 0x41, 0x2B, 0x73, - 0xF1, 0x26, 0x8A, 0x64, 0xD5, 0x42, 0x87, 0x58, - 0xFA, 0x5D, 0x37, 0x27, 0x11, 0xAD, 0xE5, 0x9D, - 0x1F, 0xC8, 0x69, 0xA7, 0x14, 0x8C, 0x5D, 0xD6, - 0x55, 0x4E, 0xD8, 0xB4, 0xFE, 0x65, 0xAD, 0xAD, - 0x0D, 0xD6, 0x10, 0xE5, 0x1D, 0x3F, 0x34, 0x5C, - 0x1C, 0xE7, 0x51, 0xCF, 0x3C, 0x24, 0x84, 0x64, - 0xE4, 0xBF, 0xF6, 0xBA, 0x90, 0x4B, 0x83, 0x83, - 0x23, 0xF8, 0x9C, 0xDB, 0xA9, 0xD9, 0x99, 0x59, - 0x39, 0x3F, 0x99, 0x27, 0x94, 0x8E, 0x2E, 0xCE, - 0x4E, 0x37, 0xAA, 0x6C, 0x74, 0xE4, 0x84, 0x84, - 0xAE, 0x65, 0x71, 0x76, 0x04, 0x15, 0x28, 0xEB, - 0xCE, 0x00, 0x94, 0xF4, 0x2F, 0x27, 0x45, 0x89, - 0x0F, 0xD8, 0x2B, 0xA7, 0x3C, 0x9D, 0xF1, 0x38, - 0x88, 0xB0, 0xF6, 0x7A, 0x4C, 0xED, 0x3D, 0x0E, - 0x2E, 0x97, 0x4E, 0x08, 0xDC, 0x73, 0xDB, 0x19, - 0x09, 0x7B, 0x3D, 0x4A, 0x0B, 0x2B, 0xDB, 0x6F, - 0x05, 0x12, 0x6E, 0xC8, 0xC2, 0x7E, 0x37, 0x75, - 0xF9, 0x08, 0x0C, 0x6C, 0x91, 0xA1, 0x49, 0x98, - 0xA8, 0xC0, 0x37, 0xE9, 0x7D, 0xE8, 0x58, 0x10, - 0xB0, 0xB3, 0x07, 0xD6, 0x06, 0x36, 0xE9, 0xAA, - 0xC0, 0xC6, 0xC0, 0x54, 0xCD, 0x8F, 0xA3, 0x49, - 0x13, 0x62, 0x56, 0x30, 0xC0, 0xC2, 0xEE, 0x07, - 0x07, 0x58, 0xAF, 0x41, 0xD3, 0x4B, 0x4D, 0xC4, - 0xFE, 0xAD, 0x19, 0xD8, 0x03, 0x39, 0xCA, 0x80, - 0xB4, 0xDD, 0x40, 0x06, 0x54, 0x6A, 0xBA, 0xC1, - 0xB1, 0xD0, 0xEE, 0x00, 0xD0, 0x47, 0xA5, 0x2C, - 0x44, 0x17, 0xA3, 0xC3, 0x10, 0x20, 0x93, 0xC3, - 0xC9, 0xE6, 0xA2, 0xE1, 0x13, 0x29, 0xA7, 0x97, - 0xE8, 0xC3, 0x8F, 0x0D, 0x17, 0xA9, 0xE3, 0xC1, - 0x4F, 0xBD, 0x8B, 0x2B, 0xE2, 0xB2, 0x1E, 0xFE, - 0xBC, 0x3A, 0xE0, 0xE9, 0x20, 0x90, 0xFC, 0x35, - 0xBE, 0x30, 0x3E, 0x50, 0x93, 0x10, 0x40, 0xB0, - 0x44, 0xAF, 0xFA, 0x66, 0x04, 0x70, 0x62, 0xCE, - 0x60, 0x5B, 0xAE, 0xD3, 0x5D, 0x58, 0xCD, 0xAF, - 0xE4, 0x2B, 0x1C, 0x2E, 0xF5, 0xD7, 0x9C, 0x79, - 0x6B, 0xDB, 0x44, 0xE8, 0x10, 0xA0, 0x48, 0x80, - 0x89, 0xD9, 0xCA, 0xF1, 0x09, 0xA4, 0x34, 0xF4, - 0x74, 0xAF, 0x2F, 0x02, 0xDA, 0x4B, 0x6C, 0xAF, - 0x87, 0x5E, 0x4A, 0xEC, 0x20, 0xB5, 0x8D, 0x6D, - 0x45, 0x9C, 0xA1, 0x67, 0x9A, 0xB9, 0xFE, 0x32, - 0xF8, 0xC1, 0xD8, 0x34, 0x3D, 0xC6, 0xA5, 0xA5, - 0x05, 0xDE, 0xAA, 0xEB, 0x87, 0xF7, 0xB7, 0x77, - 0x4F, 0x96, 0xC0, 0x60, 0xA8, 0xDA, 0xD7, 0xA3, - 0x91, 0x61, 0xF0, 0xF9, 0x29, 0xBB, 0x63, 0xA1, - 0x2D, 0xEC, 0xE8, 0xAF, 0x5F, 0x0A, 0x6D, 0x8F, - 0x12, 0x39, 0xB9, 0x94, 0x4C, 0xAD, 0x86, 0x45, - 0x05, 0xFE, 0x48, 0x66, 0x9B, 0x9F, 0x3F, 0xDF, - 0x5F, 0xB4, 0x46, 0x3A, 0xA2, 0x50, 0x10, 0x92, - 0x77, 0x18, 0xB3, 0x2F, 0xF7, 0x47, 0x11, 0x90, - 0x10, 0xC7, 0x72, 0x6C, 0x14, 0xD4, 0xE5, 0x62, - 0xE1, 0x36, 0x96, 0x42, 0x9F, 0x1F, 0xBC, 0x8C, - 0xBC, 0xC4, 0xD2, 0x6C, 0x9E, 0x04, 0xD4, 0xD8, - 0xF8, 0xF3, 0x98, 0x04, 0x06, 0x7A, 0x98, 0x54, - 0xF0, 0xCB, 0x3E, 0x43, 0xFD, 0x55, 0x09, 0x2B, - 0x81, 0x74, 0x10, 0x56, 0xBC, 0x47, 0x94, 0xB3, - 0x3E, 0xF2, 0xE6, 0x86, 0x76, 0xC6, 0xBD, 0x3D, - 0xBD, 0xD0, 0xC7, 0xDB, 0xB8, 0x18, 0xD8, 0xB8, - 0x0C, 0x67, 0x7B, 0x37, 0x4F, 0x5F, 0x4B, 0xCD, - 0x4D, 0x96, 0x2C, 0x4A, 0x20, 0x3F, 0xDF, 0x3A, - 0x43, 0x67, 0x69, 0x00, 0x62, 0x06, 0x94, 0x79, - 0xD7, 0x00, 0xAA, 0x36, 0x01, 0xA0, 0x30, 0x3E, - 0x2D, 0x34, 0xEF, 0xAD, 0x6E, 0xED, 0xBD, 0x4D, - 0xB9, 0x04, 0xF1, 0x3D, 0x6E, 0x75, 0xB0, 0xF5, - 0x52, 0x24, 0x90, 0x7D, 0xFB, 0x48, 0xE8, 0x08, - 0x88, 0xDB, 0x65, 0x80, 0x6A, 0x7F, 0x56, 0xB6, - 0x2B, 0x00, 0x80, 0xAD, 0x75, 0x44, 0x63, 0xA0, - 0x00, 0xB9, 0xFF, 0x1B, 0xCB, 0x70, 0x53, 0x13, - 0xA1, 0xEA, 0xDC, 0xE2, 0x9A, 0x58, 0x1D, 0xF7, - 0xF7, 0x4A, 0x5C, 0x40, 0xEF, 0xAF, 0xB5, 0x53, - 0x85, 0xBA, 0x08, 0x46, 0x9C, 0x0A, 0x28, 0x7B, - 0x8B, 0xD0, 0x44, 0x29, 0xD1, 0x49, 0x18, 0x92, - 0x30, 0xEB, 0x7F, 0x02, 0xFA, 0x6A, 0x3B, 0xD9, - 0x0A, 0xA1, 0x55, 0x1C, 0xEE, 0x1E, 0x3A, 0x0A, - 0xC0, 0x5D, 0xA9, 0xC1, 0x3F, 0x2E, 0x11, 0xD2, - 0xD2, 0x4D, 0xFA, 0xD6, 0x46, 0xC7, 0x01, 0xD5, - 0x59, 0x24, 0x50, 0x2F, 0xEB, 0xA9, 0xD5, 0xED, - 0xEF, 0x67, 0xA1, 0x8B, 0x51, 0xE1, 0x67, 0xB5, - 0x33, 0xE4, 0x50, 0x30, 0xE1, 0xC3, 0xF0, 0x40, - 0x60, 0x19, 0x0F, 0xCB, 0x19, 0x0B, 0x0E, 0xFC, - 0x61, 0x4A, 0xDE, 0xB0, 0x4D, 0x7B, 0xF4, 0xCB, - 0x4B, 0x90, 0x10, 0x3D, 0xE5, 0x59, 0x3B, 0xF7, - 0x72, 0xE8, 0x19, 0x76, 0xA2, 0x51, 0xF9, 0x3D, - 0x7D, 0x74, 0x52, 0xAC, 0x69, 0xB5, 0xC3, 0x5A, - 0xDD, 0x0D, 0x32, 0xDE, 0x86, 0xC2, 0x20, 0xBD, - 0x51, 0xDC, 0xE2, 0x88, 0x90, 0xD2, 0x12, 0x30, - 0x9F, 0x6E, 0x64, 0x16, 0xE8, 0x46, 0x09, 0xEF, - 0x41, 0xB6, 0x66, 0x34, 0xBB, 0x59, 0x56, 0xBC, - 0x1C, 0x55, 0x13, 0xBF, 0xFE, 0xEE, 0x2C, 0xE5, - 0x4F, 0x26, 0x99, 0xDC, 0x84, 0x9E, 0xEF, 0x9F, - 0xB5, 0x4E, 0xF4, 0x93, 0xE9, 0x04, 0x08, 0xE2, - 0xCE, 0x87, 0x38, 0x73, 0x39, 0xC3, 0x4B, 0x26, - 0xA4, 0x5A, 0x1F, 0x8C, 0x12, 0xA9, 0xC9, 0x12, - 0x2C, 0xD7, 0xC3, 0x5F, 0x47, 0x5D, 0x9D, 0xEF, - 0x00, 0xF1, 0xF7, 0x20, 0x08, 0x02, 0xC8, 0xBA, - 0x30, 0xC1, 0x95, 0xF3, 0x02, 0x32, 0xE9, 0x38, - 0x58, 0x38, 0xAE, 0x70, 0xF5, 0x29, 0x63, 0x1F, - 0x3D, 0xEC, 0x7D, 0xB3, 0x20, 0x78, 0xB5, 0x77, - 0xFB, 0x2B, 0x78, 0xFB, 0xDC, 0xA4, 0xC0, 0x2A, - 0x76, 0x3F, 0x84, 0x00, 0x74, 0x0D, 0x66, 0x5F, - 0x2D, 0xBB, 0xE5, 0x41, 0x9D, 0x07, 0xBB, 0x99, - 0x14, 0x27, 0x4D, 0xEF, 0x9A, 0x28, 0x44, 0x9F, - 0x3F, 0x66, 0x20, 0x8C, 0xC6, 0xD6, 0x24, 0xCD, - 0x67, 0x7C, 0x42, 0x8E, 0xC6, 0xEF, 0x7F, 0x25, - 0x2D, 0x74, 0xCA, 0x81, 0xDB, 0x26, 0xAE, 0xCB, - 0xA7, 0x83, 0xFD, 0x95, 0x46, 0xC5, 0xBE, 0x5C, - 0xFC, 0x07, 0xC5, 0xFF, 0x34, 0x70, 0x82, 0x6E, - 0xC7, 0x90, 0xAF, 0xC8, 0x99, 0xAB, 0xA7, 0x4E, - 0x02, 0xC1, 0x92, 0x22, 0x05, 0xA8, 0x38, 0xF8, - 0x78, 0xA3, 0x23, 0x0E, 0xD6, 0x27, 0x27, 0xE4, - 0x55, 0xEF, 0x5A, 0xBE, 0x22, 0x1B, 0xF9, 0x00, - 0xC4, 0x02, 0x44, 0x28, 0xF0, 0x40, 0x16, 0x97, - 0x17, 0x6E, 0x1A, 0x66, 0x1B, 0x98, 0xD8, 0x89, - 0x69, 0xB1, 0x8F, 0x61, 0x30, 0xC9, 0xB4, 0x84, - 0x04, 0xDF, 0x5F, 0x72, 0xAA, 0xA7, 0xC5, 0x24, - 0xC6, 0x1E, 0x80, 0xEE, 0x3A, 0x06, 0xED, 0x8F, - 0xAA, 0x73, 0xED, 0x00, 0xBB, 0x08, 0xFA, 0xF8, - 0x68, 0x2A, 0xCE, 0x3B, 0xA1, 0x98, 0x9A, 0xD6, - 0x55, 0xB7, 0x93, 0xE2, 0xCA, 0x7A, 0x2C, 0xAD, - 0x2D, 0xC7, 0x13, 0x7C, 0x9C, 0x2F, 0xFD, 0x2E, - 0xB6, 0x61, 0xCB, 0xA0, 0x93, 0x39, 0xC8, 0x56, - 0xD5, 0xCE, 0xD3, 0x9F, 0xE5, 0x06, 0x7E, 0x7E, - 0xDE, 0x05, 0x2B, 0x4E, 0x14, 0xB7, 0xD1, 0xB3, - 0xF0, 0x3B, 0x17, 0xF3, 0xA2, 0x61, 0x64, 0x88, - 0x28, 0x41, 0xE4, 0x90, 0x5F, 0x04, 0x6A, 0x12, - 0x01, 0x56, 0x7B, 0x9F, 0x4C, 0x51, 0x33, 0x13, - 0x9B, 0x40, 0xDB, 0xBD, 0x78, 0x38, 0x54, 0x96, - 0x0B, 0x20, 0xA0, 0x8D, 0x55, 0xD4, 0xD6, 0x15, - 0xAD, 0x75, 0x71, 0x0F, 0xC3, 0xBB, 0x78, 0x10, - 0xB3, 0xA2, 0xAF, 0x7A, 0x01, 0x16, 0x4D, 0xDC, - 0xFC, 0xBC, 0xCA, 0x24, 0xEF, 0x47, 0xBE, 0xDD, - 0x4A, 0xF9, 0x64, 0xCA, 0xBA, 0xF5, 0x74, 0xD0, - 0x53, 0x70, 0x75, 0xD9, 0x21, 0x91, 0x23, 0xF0, - 0x68, 0x02, 0xFF, 0x90, 0xA8, 0xC5, 0xB5, 0x87, - 0x6C, 0x17, 0x73, 0x4C, 0x8C, 0xFC, 0xBC, 0x7C, - 0x5E, 0xAE, 0x98, 0x34, 0xCC, 0x7C, 0xDC, 0xB6, - 0x26, 0x5F, 0x82, 0x6E, 0xF0, 0x41, 0x21, 0x43, - 0x00, 0xCB, 0x58, 0x13, 0xEB, 0x9B, 0xDB, 0x1B, - 0x0A, 0x8F, 0x3A, 0xD4, 0x1F, 0xA9, 0x51, 0x98, - 0xBA, 0xA2, 0x04, 0xF2, 0xA2, 0x9B, 0x88, 0x2D, - 0x89, 0x72, 0x4C, 0xA3, 0xD6, 0x64, 0xE4, 0x2C, - 0xAC, 0x6A, 0x2C, 0x40, 0x98, 0x28, 0x7E, 0xFF, - 0x7F, 0xE6, 0xF8, 0x6B, 0x22, 0xF7, 0x94, 0xE5, - 0x07, 0xDF, 0x58, 0x7F, 0xA4, 0xAC, 0xC7, 0xC5, - 0x5E, 0x9D, 0x27, 0x66, 0x6E, 0x12, 0x52, 0x50, - 0x8B, 0x48, 0x3E, 0x72, 0xAA, 0xB8, 0xFB, 0x9B, - 0xB2, 0xD2, 0xA4, 0xE8, 0x30, 0x02, 0x41, 0x21, - 0x61, 0x9A, 0x2C, 0xD0, 0x80, 0x20, 0xD2, 0xB3, - 0x33, 0x78, 0x46, 0x0A, 0x50, 0x83, 0x43, 0x43, - 0xE3, 0x38, 0xAC, 0xE3, 0xBB, 0xCB, 0x8B, 0x4B, - 0x8B, 0x72, 0xD4, 0xFA, 0x86, 0x36, 0x16, 0xF4, - 0x54, 0xAD, 0x78, 0x94, 0x51, 0x11, 0x47, 0xC6, - 0x46, 0xFB, 0x79, 0x1D, 0x47, 0xF4, 0xB3, 0xB1, - 0x32, 0xCF, 0x1F, 0x4B, 0x99, 0x84, 0xE6, 0x9B, - 0x18, 0x0E, 0xBC, 0xF5, 0xB5, 0x27, 0x5A, 0x6A, - 0x42, 0xCA, 0xCE, 0x02, 0x21, 0x21, 0x8D, 0x5D, - 0x1F, 0x87, 0x17, 0xBB, 0x43, 0xF3, 0x01, 0xCB, - 0x47, 0x5C, 0xCA, 0xA6, 0xCE, 0xE7, 0x97, 0xC5, - 0x0F, 0xD8, 0x73, 0xEF, 0x37, 0x87, 0xFD, 0x3C, - 0xBC, 0x67, 0xD1, 0xBD, 0x65, 0xD5, 0x51, 0x9C, - 0x1E, 0xA5, 0x17, 0x7A, 0xA2, 0x12, 0x72, 0xB2, - 0x32, 0xE9, 0xEF, 0x8D, 0x57, 0x87, 0xCD, 0x0F, - 0x8F, 0x54, 0xE2, 0x8E, 0x56, 0xE6, 0x66, 0xB4, - 0x36, 0x8D, 0x27, 0x4B, 0x9B, 0x2B, 0x36, 0xF2, - 0x0C, 0xD3, 0xE1, 0x9F, 0x45, 0x95, 0x81, 0x52, - 0xD0, 0x6B, 0x45, 0x3A, 0xE0, 0x30, 0xF0, 0x23, - 0xA1, 0x1A, 0x74, 0x0C, 0xD6, 0x06, 0x7E, 0xAB, - 0x29, 0x92, 0x14, 0x6E, 0xB4, 0x64, 0x30, 0xE5, - 0x67, 0xDC, 0xD2, 0xAB, 0x71, 0xA1, 0xC1, 0x01, - 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, - 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, - 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, - 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, - 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, - 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, - 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, - 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, - 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x97, 0x40, - 0xC2, 0x79, 0xEB, 0x90, 0x4A, 0x9A, 0xEE, 0x36, - 0xB4, 0x0F, 0x19, 0x62, 0xB8, 0x68, 0x08, 0xC8, - 0x48, 0x93, 0x25, 0x49, 0x91, 0x21, 0x41, 0x81, - 0x01, 0xDA, 0xA0, 0xD4, 0x0C, 0xDC, 0x6C, 0xB4, - 0x34, 0x8F, 0xC1, 0xB4, 0x6C, 0xBC, 0x30, 0xF0, - 0x70, 0xAB, 0x1D, 0x71, 0xA9, 0x19, 0x78, 0xB8, - 0x38, 0xE3, 0x54, 0x38, 0xE1, 0x51, 0x30, 0xF8, - 0x38, 0xE3, 0x54, 0x39, 0xE0, 0x51, 0x70, 0xA0, - 0x24, 0xFD, 0x6A, 0x02, 0xFB, 0x4F, 0x0E, 0x4A, - 0xDA, 0x43, 0xE4, 0x99, 0x50, 0xF1, 0xD8, 0x3A, - 0x9E, 0x67, 0x98, 0xE6, 0x77, 0xD5, 0xFC, 0x6E, - 0xD7, 0x1E, 0xFD, 0x80, 0x0D, 0xAC, 0x99, 0x4C, - 0x99, 0x53, 0x4F, 0x09, 0x7B, 0xE1, 0x2B, 0x41, - 0x6B, 0x9A, 0x79, 0x40, 0xCD, 0x28, 0x1D, 0x88, - 0x5D, 0x53, 0xB0, 0x09, 0x84, 0xE1, 0x2B, 0x01, - 0x2B, 0x1E, 0x02, 0x80, 0xF2, 0xAC, 0x7A, 0x17, - 0x21, 0x17, 0x17, 0x96, 0xF8, 0xA5, 0x73, 0x6E, - 0x35, 0x33, 0x6B, 0xE9, 0xDF, 0x81, 0x3F, 0x84, - 0xEB, 0x8D, 0xE5, 0x72, 0x74, 0x3F, 0xE1, 0xCE, - 0xB5, 0x93, 0xDB, 0x49, 0x6F, 0x21, 0xBF, 0x88, - 0xB7, 0x93, 0xDB, 0x48, 0x6E, 0x21, 0xBE, 0x81, - 0xFE, 0xDA, 0x58, 0x2D, 0xF5, 0x25, 0x7D, 0xA4, - 0x24, 0x9F, 0xD5, 0xA0, 0x78, 0xA8, 0xFC, 0x3C, - 0xBC, 0x67, 0xD1, 0xBD, 0x65, 0xD5, 0xB5, 0x75, - 0xF5, 0x2E, 0x98, 0xF4, 0x2C, 0x9C, 0xFC, 0x3C, - 0xBC, 0x67, 0xF9, 0x9C, 0x44, 0x94, 0xD0, 0x19, - 0x99, 0x22, 0x84, 0x58, 0x82, 0x32, 0x52, 0x88, - 0x08, 0xB3, 0x75, 0x18, 0xC0, 0x70, 0x6C, 0xAB, - 0x2B, 0x90, 0x9A, 0xFB, 0x21, 0xF1, 0xAD, 0x65, - 0xE5, 0x5E, 0xFC, 0x9E, 0x44, 0x94, 0x38, 0xF6, - 0x74, 0xCF, 0xED, 0x87, 0x5F, 0x8F, 0x4B, 0x84, - 0x06, 0xBD, 0x4F, 0x25, 0xFD, 0x2D, 0xC1, 0x0E, - 0x8C, 0x37, 0x71, 0x04, 0xDC, 0x0C, 0xB8, 0x77, - 0xF5, 0x4E, 0x48, 0x35, 0xEF, 0x3F, 0xE7, 0x2F, - 0xAF, 0x14, 0x82, 0xFC, 0x26, 0xF6, 0x2A, 0xED, - 0x6D, 0xD6, 0x34, 0x4A, 0x90, 0x40, 0xE8, 0x3A, - 0xB8, 0x03, 0x5D, 0x37, 0xEF, 0x3F, 0x3B, 0xE3, - 0x61, 0xDA, 0x2C, 0x4A, 0x92, 0x42, 0x14, 0x95, - 0x15, 0x4F, 0x7B, 0x11, 0x78, 0x48, 0x2E, 0xF2, - 0x78, 0x32, 0x05, 0x6F, 0x15, 0xEE, 0x8E, 0xC7, - 0x4E, 0xB0, 0x04, 0x68, 0x55, 0xE1, 0x81, 0xE4, - 0x66, 0xBD, 0xEE, 0x87, 0x5F, 0x0A, 0x62, 0xA2, - 0x07, 0xDF, 0x69, 0xA0, 0x71, 0xC1, 0x00, 0x43, - 0xC5, 0xAF, 0x9D, 0xF7, 0x8A, 0x60, 0x27, 0xFA, - 0x8A, 0x51, 0xD1, 0xFC, 0x24, 0xA5, 0x40, 0x86, - 0x27, 0x7A, 0xCA, 0x8F, 0x84, 0x29, 0xB9, 0x79, - 0xF9, 0x22, 0xA2, 0x8F, 0x57, 0xD6, 0x31, 0xF7, - 0x56, 0x05, 0xB5, 0xF0, 0x6B, 0xC6, 0x56, 0x96, - 0x16, 0xCD, 0x4D, 0x60, 0xB8, 0x39, 0xDC, 0x1A, - 0xBB, 0xE9, 0x59, 0x1C, 0x57, 0xFA, 0x6A, 0xAA, - 0x2A, 0xF1, 0x71, 0x5C, 0x84, 0x15, 0xF8, 0x3E, - 0x8F, 0xD8, 0x68, 0x95, 0xC7, 0x71, 0x90, 0xDB, - 0x5D, 0x0F, 0xF0, 0xB5, 0x6E, 0xC3, 0x53, 0x93, - 0x13, 0xC8, 0x48, 0x65, 0xBD, 0x9C, 0x72, 0xB4, - 0x38, 0xEB, 0xDF, 0xFA, 0x22, 0xF7, 0x96, 0x56, - 0x77, 0x3C, 0x8C, 0x51, 0x0E, 0xB8, 0x19, 0x56, - 0xD0, 0xC2, 0x7F, 0xBA, 0x39, 0x94, 0x04, 0xC4, - 0x44, 0x9F, 0x1F, 0x32, 0xEA, 0x6B, 0x9A, 0x5C, - 0xFD, 0xB4, 0x04, 0x41, 0x8A, 0x27, 0xB7, 0x77, - 0xF7, 0x2C, 0xAC, 0x81, 0x59, 0x68, 0x9C, 0x5A, - 0xEB, 0xA3, 0x13, 0x5E, 0x13, 0xA5, 0xEC, 0x0F, - 0x06, 0x8E, 0x25, 0xB9, 0x61, 0xD1, 0x87, 0x06, - 0x86, 0xCC, 0xEC, 0x86, 0xDF, 0xF8, 0x9E, 0xD7, - 0x7E, 0xC0, 0x76, 0x1A, 0xDF, 0x9F, 0xC9, 0x48, - 0xC8, 0xB2, 0x9C, 0xF6, 0x9C, 0x8C, 0x60, 0x08, - 0x82, 0x79, 0xAE, 0xC2, 0x92, 0x08, 0xD2, 0xA8, - 0xB4, 0x77, 0xCD, 0xBD, 0x69, 0x54, 0xD6, 0x3C, - 0x94, 0x8F, 0x19, 0x75, 0x7F, 0x81, 0xED, 0xEF, - 0x24, 0xD8, 0x4B, 0x80, 0x7B, 0xEB, 0x6D, 0xBE, - 0x2E, 0xD5, 0x63, 0x12, 0x3A, 0x8A, 0xEA, 0x2A, - 0xAA, 0x71, 0xC7, 0xAB, 0x73, 0xC3, 0xA3, 0x63, - 0xE3, 0x38, 0x8F, 0xE3, 0x3F, 0x8F, 0x8B, 0x51, - 0xD3, 0x68, + 0x06, 0x6B, 0x06, 0x6A, 0x76, 0xC8, 0x18, 0xD4, + 0x54, 0xEF, 0x71, 0x14, 0xCC, 0x1C, 0x58, 0x91, + 0x11, 0xAA, 0x80, 0xF4, 0x2C, 0xFC, 0x9F, 0x5F, + 0xDF, 0x04, 0x02, 0x62, 0xBA, 0x6A, 0x5A, 0x97, + 0x17, 0xCC, 0x46, 0x22, 0xFA, 0x2A, 0xBE, 0x03, + 0x87, 0x3C, 0x9E, 0xFE, 0x26, 0xF6, 0x96, 0x7E, + 0xFA, 0x11, 0x27, 0x66, 0xBA, 0x3A, 0x5A, 0xBA, + 0x3E, 0xD5, 0x4F, 0x03, 0xDF, 0x5F, 0x7F, 0x9F, + 0x1B, 0xF0, 0xA2, 0xEF, 0x33, 0xB3, 0xD3, 0x13, + 0x93, 0x70, 0xFA, 0x96, 0x4E, 0xC6, 0xA6, 0xC6, + 0x46, 0xA5, 0x2F, 0xE3, 0x3B, 0xB3, 0xD3, 0x33, + 0xB3, 0x50, 0xE8, 0xA4, 0x7C, 0xF4, 0x94, 0x14, + 0x94, 0x77, 0xC9, 0xE5, 0x3D, 0xB5, 0xD5, 0x75, + 0xF5, 0x16, 0xA8, 0xA4, 0x7C, 0xF4, 0x94, 0xD4, + 0x54, 0xB7, 0x09, 0xE5, 0x3D, 0xB5, 0x2D, 0xF4, + 0x74, 0xCF, 0x29, 0x5C, 0x84, 0x54, 0x14, 0xAA, + 0x2E, 0x95, 0xF7, 0xE0, 0x3C, 0xEC, 0x8C, 0x52, + 0xD6, 0x3D, 0x7B, 0x0E, 0xD6, 0x06, 0x82, 0x49, + 0xC9, 0x72, 0x7C, 0x18, 0xC0, 0x10, 0x10, 0xF6, + 0x72, 0xC9, 0xC3, 0xA8, 0x70, 0xA0, 0xD8, 0x77, + 0xF3, 0x48, 0x06, 0x04, 0xD8, 0x08, 0x90, 0x5B, + 0xDB, 0x60, 0x36, 0x43, 0x9B, 0x4B, 0xD4, 0xE3, + 0x9C, 0xB8, 0xF1, 0x72, 0x55, 0x1A, 0x8E, 0x57, + 0xD7, 0x6C, 0xDA, 0xBE, 0x66, 0xD6, 0xEA, 0x3D, + 0xBF, 0x04, 0xB2, 0xCE, 0x16, 0xA6, 0x06, 0xDE, + 0x5E, 0xE5, 0xB7, 0xC3, 0x1B, 0xCB, 0x47, 0x9F, + 0x1F, 0xA4, 0x3E, 0x5B, 0x83, 0x53, 0x53, 0x8A, + 0x0A, 0xB1, 0x93, 0xF9, 0x21, 0xF1, 0x31, 0xE6, + 0x64, 0xDF, 0x95, 0xE0, 0x38, 0xE8, 0xB4, 0x6D, + 0xED, 0x56, 0x1D, 0x8E, 0x56, 0xE6, 0x79, 0xB9, + 0xC6, 0xE2, 0x62, 0x4F, 0x97, 0x02, 0x40, 0x80, + 0x65, 0xB8, 0x0E, 0x07, 0xC2, 0x72, 0x37, 0xBE, + 0x3E, 0x00, 0xF2, 0xB8, 0xF1, 0x6D, 0x0E, 0x6F, + 0xC2, 0x1A, 0xA0, 0xC4, 0x95, 0x2F, 0xCD, 0x44, + 0xC4, 0x02, 0x44, 0x28, 0xF0, 0x40, 0x16, 0x97, + 0x17, 0x7D, 0xE4, 0x8B, 0xFE, 0x4C, 0x0D, 0xE3, + 0x60, 0xFD, 0x4B, 0x27, 0x34, 0xA6, 0xCD, 0xB6, + 0x10, 0xC0, 0x7C, 0x98, 0x42, 0x72, 0x92, 0x26, + 0x21, 0x60, 0x26, 0x4C, 0x95, 0x25, 0xA0, 0x03, + 0xA6, 0x50, 0xEC, 0x9D, 0xB5, 0x05, 0x53, 0xD2, + 0x52, 0xA9, 0x7E, 0x12, 0x2F, 0x65, 0xFA, 0x1A, + 0x7C, 0xB4, 0x12, 0x5E, 0x86, 0x3A, 0x50, 0xF5, + 0x53, 0xAD, 0xBA, 0xE6, 0x3D, 0x3C, 0x6D, 0xAE, + 0xCB, 0x33, 0xAD, 0xDC, 0xF4, 0x44, 0x12, 0x93, + 0x13, 0xF9, 0x7D, 0x12, 0xEB, 0x68, 0x0B, 0xE2, + 0x21, 0xE7, 0xA1, 0xCD, 0x15, 0xA5, 0xF3, 0x72, + 0xF2, 0xAB, 0x1F, 0x7E, 0xAA, 0x01, 0xE1, 0xA1, + 0x25, 0xA8, 0x06, 0x6D, 0xB9, 0x0C, 0x60, 0xA6, + 0x64, 0xAD, 0x15, 0x65, 0xBA, 0x30, 0x14, 0x66, + 0x22, 0x78, 0xFC, 0x94, 0x4C, 0x4E, 0x25, 0x9B, + 0xD9, 0x06, 0xB1, 0xEA, 0x89, 0x35, 0x62, 0x1E, + 0x8F, 0x69, 0xD4, 0x7F, 0x1C, 0xA0, 0xFD, 0x31, + 0x77, 0xAD, 0x1B, 0x40, 0xA4, 0x10, 0xB7, 0xCC, + 0x4D, 0xAB, 0x16, 0xD7, 0x0C, 0x01, 0x62, 0x87, + 0xBF, 0x4C, 0x50, 0x5A, 0xD8, 0x3B, 0x50, 0xE7, + 0x2C, 0xB3, 0xB7, 0x1F, 0x46, 0xA0, 0x57, 0x6B, + 0x46, 0x98, 0x93, 0xFA, 0xC7, 0xC1, 0x89, 0x45, + 0xDE, 0xD7, 0xC3, 0xC3, 0xBB, 0xCF, 0xEE, 0xEE, + 0xA8, 0xB3, 0xDF, 0x61, 0x4B, 0xE6, 0x04, 0x04, + 0x40, 0xDA, 0xAC, 0x43, 0xDA, 0x9A, 0x15, 0x25, + 0x45, 0x7D, 0xEA, 0x0C, 0x3A, 0x7A, 0xD4, 0x87, + 0xC5, 0x43, 0x77, 0x1D, 0xC6, 0x76, 0xD4, 0xB6, + 0x5A, 0x4B, 0x3F, 0x91, 0x55, 0x98, 0xC2, 0xCE, + 0x8C, 0x5B, 0xED, 0x53, 0x99, 0x20, 0x6D, 0xA6, + 0xF1, 0x96, 0x21, 0x41, 0xBB, 0x16, 0x86, 0x46, + 0xC6, 0x1D, 0x9D, 0xB0, 0x68, 0x69, 0x3D, 0xFE, + 0xC6, 0x16, 0x2C, 0x2B, 0x51, 0x40, 0x40, 0x2A, + 0x01, 0xBF, 0xB3, 0xFF, 0x8A, 0x38, 0x3D, 0x51, + 0xF4, 0x32, 0x74, 0x18, 0xC0, 0x70, 0x26, 0xA7, + 0x27, 0x5D, 0xDE, 0xB1, 0xD8, 0x5E, 0x3D, 0x30, + 0xB2, 0x0C, 0xEC, 0xA5, 0xCC, 0x44, 0x27, 0xC7, + 0x6D, 0x16, 0x01, 0x5A, 0x81, 0xFC, 0x9E, 0x3B, + 0xEE, 0x10, 0x17, 0x41, 0x9A, 0x0A, 0x50, 0x30, + 0x72, 0x6A, 0xCC, 0x01, 0xE0, 0x53, 0x3F, 0xFD, + 0x54, 0x8C, 0x13, 0x6C, 0x9D, 0x0E, 0x47, 0xB4, + 0xD1, 0x59, 0xCA, 0x17, 0xF3, 0x40, 0x10, 0xEA, + 0xCA, 0xD3, 0xA6, 0xDA, 0xA3, 0x28, 0x4B, 0x6E, + 0xBC, 0x42, 0xF8, 0x9D, 0x75, 0xFF, 0x3F, 0xCD, + 0x8E, 0x45, 0xE8, 0x1D, 0xEC, 0x5F, 0x74, 0x87, + 0x61, 0x23, 0x63, 0xA2, 0x79, 0x7B, 0xBB, 0xDE, + 0x72, 0xE5, 0xB6, 0x7B, 0x8B, 0x9A, 0xC7, 0x04, + 0x35, 0xD0, 0x65, 0xCB, 0xD0, 0x44, 0x41, 0xD1, + 0x74, 0x1E, 0xE8, 0x87, 0x6F, 0xE5, 0x25, 0x44, + 0xFB, 0x23, 0xA7, 0x08, 0xF4, 0x89, 0xEA, 0xCF, + 0x1E, 0xE0, 0xE7, 0xC9, 0x12, 0x92, 0xC8, 0xA8, + 0x89, 0x13, 0xA6, 0x07, 0xDC, 0xC9, 0xFA, 0x1F, + 0x2E, 0xB1, 0x04, 0x58, 0xBA, 0xAA, 0x6B, 0xE8, + 0x6B, 0x7D, 0xC8, 0x01, 0x8B, 0x1E, 0xCF, 0x49, + 0xCA, 0x21, 0xAD, 0x61, 0x18, 0xED, 0x8E, 0x83, + 0x00, 0x3E, 0xD9, 0x90, 0x78, 0xE2, 0x22, 0xFF, + 0x8F, 0x54, 0xD4, 0xF9, 0x21, 0x10, 0x37, 0xF4, + 0xFC, 0x2F, 0x15, 0x31, 0x48, 0xB0, 0xD3, 0x36, + 0xC1, 0x32, 0x99, 0x05, 0xDD, 0x6D, 0x3B, 0xBA, + 0x3A, 0x60, 0x91, 0xFE, 0xAE, 0x16, 0xFA, 0x72, + 0x53, 0xC0, 0x75, 0xFC, 0x51, 0xC9, 0x0C, 0x38, + 0x99, 0x5F, 0x19, 0x75, 0xAD, 0x1D, 0x4B, 0xCA, + 0x4A, 0x3C, 0x88, 0x01, 0x40, 0xD2, 0x33, 0xB4, + 0x37, 0x64, 0xDA, 0x3A, 0xAA, 0xBB, 0x93, 0x50, + 0xF5, 0x5A, 0xC4, 0xB5, 0x9D, 0x2D, 0x7B, 0xFA, + 0x7A, 0x84, 0x17, 0x7B, 0x22, 0xD8, 0xBB, 0xEA, + 0x58, 0x80, 0x97, 0xB2, 0x69, 0x70, 0x49, 0x00, + 0x89, 0x4F, 0x09, 0x65, 0xBD, 0x0D, 0x5B, 0xDA, + 0x5A, 0xB0, 0x32, 0x5D, 0x89, 0x1E, 0x46, 0x85, + 0x54, 0xC4, 0x71, 0x8F, 0x54, 0xEC, 0xEE, 0x8F, + 0x7F, 0xAF, 0x90, 0xEA, 0x7A, 0xCC, 0x7D, 0xF1, + 0x72, 0xA5, 0x79, 0x19, 0xC6, 0xF4, 0x5D, 0x61, + 0xF7, 0x24, 0x98, 0xD2, 0x53, 0xEB, 0x26, 0xE4, + 0x01, 0x67, 0xF7, 0xB6, 0x64, 0xC9, 0x59, 0xF3, + 0x30, 0x59, 0xFC, 0x9B, 0xD1, 0x65, 0x05, 0xD3, + 0x68, 0xB8, 0x68, 0x7D, 0xB5, 0xC7, 0xB3, 0x8F, + 0x59, 0x2E, 0x92, 0x5C, 0xC7, 0x7F, 0x3D, 0xFE, + 0x73, 0x88, 0x1F, 0x77, 0xB2, 0xF2, 0x9E, 0x55, + 0x57, 0x8F, 0x34, 0x9A, 0x61, 0x0C, 0x7B, 0xD3, + 0x5C, 0x15, 0xAE, 0xC2, 0x16, 0xB4, 0xC2, 0x2B, + 0xA5, 0x75, 0x6A, 0xA4, 0x31, 0x81, 0xA7, 0x67, + 0xE7, 0x30, 0x84, 0x28, 0xD0, 0x60, 0xA2, 0x71, + 0xF9, 0xE0, 0x33, 0xFF, 0xAB, 0x01, 0x04, 0x22, + 0x84, 0x42, 0x04, 0x02, 0x99, 0xFB, 0x9F, 0x5F, + 0xB9, 0x7F, 0xF5, 0x21, 0xDB, 0xC6, 0xA5, 0x00, + 0x60, 0x9D, 0x8B, 0x07, 0xAB, 0x7D, 0x03, 0xE2, + 0xD3, 0x45, 0xF0, 0x6E, 0xBD, 0x0D, 0x4B, 0xA4, + 0x23, 0x8A, 0x77, 0x1B, 0xCF, 0x75, 0x30, 0x96, + 0x33, 0xE4, 0x6A, 0x94, 0x6F, 0x01, 0xA1, 0x41, + 0xC1, 0x88, 0x5B, 0x97, 0xCD, 0x3E, 0x56, 0xD0, + 0x53, 0x88, 0x9C, 0xE3, 0x3C, 0x00, 0x1A, 0xA8, + 0x6C, 0xB7, 0xA3, 0xDC, 0x03, 0x96, 0x14, 0xF2, + 0x7E, 0xB7, 0x1C, 0x80, 0xEA, 0x49, 0x21, 0x8B, + 0x48, 0x85, 0xF8, 0x93, 0x89, 0x3D, 0x5D, 0x5F, + 0x13, 0x33, 0x93, 0xC3, 0x1C, 0x4E, 0x2D, 0xE0, + 0xE2, 0x1D, 0x2A, 0x51, 0xE7, 0x07, 0xF5, 0x38, + 0xB8, 0x75, 0x4A, 0x2A, 0xFE, 0x5C, 0x37, 0x0E, + 0x7C, 0xEA, 0x5C, 0xB6, 0x7E, 0xCE, 0x2C, 0x25, + 0x5C, 0xD1, 0xFF, 0x66, 0x06, 0x94, 0x59, 0x9A, + 0x7F, 0x7D, 0xED, 0x21, 0x69, 0xAD, 0xC6, 0x9F, + 0x49, 0x7B, 0xC7, 0xA7, 0x74, 0xC8, 0xE4, 0xC6, + 0x65, 0x63, 0x07, 0xC9, 0x65, 0x0F, 0xBC, 0xBC, + 0x1C, 0xC7, 0xD3, 0xAC, 0x7C, 0x2E, 0x2B, 0x4B, + 0xB9, 0x3F, 0xF7, 0x59, 0xC2, 0x7A, 0x0C, 0x86, + 0xF4, 0x23, 0xFB, 0x75, 0xE9, 0x59, 0x9B, 0x48, + 0xC0, 0x7E, 0x13, 0x59, 0x07, 0x72, 0xED, 0x00, + 0x87, 0x50, 0xE9, 0x45, 0xBD, 0x0D, 0xCF, 0x1C, + 0x94, 0xCD, 0x1E, 0xD2, 0x1C, 0x36, 0xA5, 0x80, + 0xD9, 0x24, 0x8F, 0x13, 0xC7, 0x75, 0x53, 0x5B, + 0x24, 0x47, 0xD3, 0x12, 0xC9, 0x5C, 0xE8, 0x0E, + 0x2E, 0x65, 0xA7, 0xAD, 0x6C, 0xFB, 0x97, 0x5C, + 0x0E, 0xF6, 0x9D, 0x33, 0x49, 0x8D, 0x27, 0x24, + 0x64, 0x9F, 0x29, 0x97, 0x2A, 0x3A, 0xF8, 0x2B, + 0xA3, 0x0A, 0xE0, 0xF2, 0x96, 0x7C, 0x76, 0x55, + 0xD9, 0x6F, 0x0B, 0x29, 0xF1, 0xE3, 0x90, 0x58, + 0xBD, 0xB0, 0x20, 0xCA, 0x1B, 0xAB, 0xC7, 0x78, + 0xF4, 0x7B, 0x8F, 0xA0, 0x70, 0xAA, 0x89, 0xBB, + 0x7F, 0xA4, 0xA0, 0xDF, 0x0C, 0x20, 0x0B, 0x79, + 0xAD, 0x8A, 0x30, 0xA6, 0x72, 0x4A, 0xA8, 0x2C, + 0xAC, 0x12, 0x70, 0x3A, 0x70, 0xD4, 0x48, 0x1A, + 0x53, 0x79, 0x5D, 0x65, 0x41, 0xD3, 0xB0, 0x7D, + 0xDD, 0x27, 0x95, 0xE4, 0xCC, 0x51, 0x36, 0x70, + 0x2F, 0x0B, 0x1F, 0x67, 0x43, 0xE5, 0x5F, 0x77, + 0xFB, 0xA8, 0x9C, 0xB4, 0x6C, 0x6A, 0xB0, 0x60, + 0xEC, 0xCD, 0xDE, 0x63, 0x9D, 0x0F, 0x7B, 0x47, + 0xE5, 0xFC, 0xBB, 0xF5, 0x79, 0x35, 0x53, 0x0E, + 0x71, 0x4F, 0x29, 0x63, 0x96, 0x21, 0x07, 0x3B, + 0x44, 0x9F, 0x1F, 0x32, 0xEA, 0x0B, 0x5F, 0x9C, + 0x44, 0x9A, 0x6E, 0xA2, 0x8A, 0x70, 0x55, 0xA7, + 0x23, 0x78, 0xE8, 0xA7, 0x4E, 0xD8, 0xFB, 0x08, + 0xE9, 0x79, 0xCC, 0xD1, 0x45, 0xF6, 0x9A, 0xF2, + 0x54, 0xEC, 0x75, 0x7F, 0x24, 0x8A, 0xE6, 0x55, + 0x47, 0xB9, 0xD1, 0x7D, 0x85, 0x35, 0xC7, 0x61, + 0x41, 0xA8, 0x5A, 0xB6, 0xDC, 0x69, 0x04, 0x66, + 0xE1, 0x3A, 0x3C, 0xE1, 0x3D, 0x3D, 0xF5, 0xA6, + 0x84, 0x18, 0xAE, 0xDF, 0xF7, 0x5A, 0xCA, 0x06, + 0x95, 0x08, 0xBE, 0xD2, 0x06, 0x85, 0xD7, 0x53, + 0x53, 0x95, 0xD3, 0xB3, 0x38, 0x4A, 0x0F, 0x11, + 0x51, 0xAA, 0x1C, 0xB2, 0x0C, 0x1C, 0xBA, 0x89, + 0xF6, 0x2D, 0xAD, 0x80, 0x58, 0xD9, 0xF7, 0x34, + 0x95, 0x01, 0xB4, 0xF1, 0x3A, 0x97, 0x07, 0xC7, + 0x47, 0x9C, 0x1C, 0x31, 0xE9, 0xC8, 0x9C, 0x5F, + 0x47, 0x95, 0xAF, 0x6A, 0x10, 0x89, 0x34, 0x54, + 0x74, 0xBB, 0x2B, 0x7D, 0xA7, 0xF2, 0xD0, 0x31, + 0xAC, 0x87, 0x07, 0x2A, 0xF2, 0xE3, 0xD2, 0x11, + 0xB0, 0x21, 0x94, 0xC9, 0x23, 0x90, 0x61, 0xF1, + 0x72, 0x28, 0xCC, 0xA3, 0xF2, 0x6B, 0x22, 0xE1, + 0xC8, 0x4A, 0xE1, 0x7D, 0xA5, 0x15, 0x43, 0xC2, + 0x42, 0xB8, 0x5D, 0x32, 0x62, 0xF0, 0x57, 0xFF, + 0x62, 0x18, 0xFA, 0x95, 0x28, 0xD1, 0x99, 0xC8, + 0x1D, 0xC5, 0xB2, 0x88, 0x53, 0x52, 0x65, 0xA6, + 0x8E, 0x77, 0x79, 0x1E, 0x06, 0x1C, 0x6C, 0x3C, + 0x26, 0xED, 0xEB, 0x1D, 0x56, 0x7F, 0x3D, 0x58, + 0x11, 0xEF, 0x44, 0xD8, 0x00, 0xB0, 0xE6, 0x67, + 0xE7, 0x9D, 0x7F, 0x10, 0x2D, 0xDF, 0x97, 0xB6, + 0x6E, 0xB6, 0x41, 0x1F, 0xC4, 0x45, 0x76, 0xB5, + 0x39, 0xEE, 0x80, 0xCF, 0xE6, 0x01, 0x62, 0x15, + 0xF8, 0x01, 0x0A, 0x69, 0x79, 0xCD, 0x64, 0xAB, + 0x86, 0x5F, 0x68, 0x5D, 0x86, 0xD6, 0x2B, 0xCB, + 0xD2, 0x2A, 0x15, 0x7D, 0xC0, 0x38, 0x58, 0x29, + 0xF3, 0x2B, 0x35, 0x7A, 0xAE, 0x1C, 0xCC, 0xA6, + 0x06, 0x74, 0xE1, 0x90, 0xB8, 0x04, 0x6F, 0x69, + 0x1F, 0x3B, 0xBB, 0x96, 0x4E, 0xE2, 0x4A, 0x0D, + 0x1F, 0xC0, 0x57, 0x60, 0xBB, 0x16, 0x86, 0xEB, + 0x69, 0x97, 0xE3, 0xAA, 0x5F, 0xE5, 0x98, 0xA8, + 0x28, 0xF3, 0x73, 0x5E, 0x86, 0x47, 0x60, 0xA3, + 0xFF, 0x70, 0x4E, 0x25, 0x71, 0x89, 0x4C, 0x92, + 0x12, 0x8F, 0x38, 0x54, 0x2D, 0xD5, 0xB6, 0x53, + 0xEF, 0x1C, 0x02, 0x69, 0xBD, 0x04, 0xF6, 0x7C, + 0x64, 0x0D, 0x1B, 0x04, 0x96, 0x45, 0xE7, 0x87, + 0x73, 0xCF, 0x45, 0x3A, 0x5F, 0xED, 0x25, 0xE2, + 0xAF, 0x77, 0x8B, 0x4D, 0x37, 0x4D, 0x09, 0x6C, + 0xA9, 0x5A, 0x5E, 0x92, 0x39, 0x4F, 0x2A, 0xEA, + 0x2D, 0xCD, 0x6F, 0xBE, 0x64, 0x7C, 0x1B, 0x19, + 0x39, 0x96, 0x60, 0xC0, 0xD8, 0x22, 0xE8, 0x8A, + 0xC0, 0x3F, 0x6C, 0x43, 0xB3, 0xB1, 0x71, 0xC2, + 0xFE, 0x70, 0xA1, 0xF6, 0x26, 0x34, 0xF0, 0x35, + 0x50, 0x5A, 0xC8, 0xE2, 0x3D, 0x8D, 0x5F, 0x3F, + 0xCB, 0x77, 0x7A, 0x1E, 0x64, 0x70, 0x16, 0x33, + 0x63, 0x9C, 0xAC, 0xC3, 0x1B, 0xA7, 0xCD, 0xD5, + 0x52, 0x85, 0x2F, 0x81, 0x14, 0x3C, 0xB9, 0xB6, + 0x12, 0xEC, 0x5E, 0x32, 0x02, 0xB5, 0x37, 0xF9, + 0xE1, 0xF6, 0x0E, 0xC3, 0x53, 0xE0, 0x25, 0xDD, + 0x75, 0xB3, 0xF5, 0x99, 0x41, 0xF1, 0xA7, 0x26, + 0xA6, 0x4C, 0xBD, 0xD2, 0x32, 0x81, 0xC0, 0x5C, + 0xDF, 0x2D, 0xE8, 0x0F, 0x54, 0x76, 0xD5, 0x01, + 0x18, 0xA0, 0x8F, 0xB0, 0xE1, 0x62, 0x8B, 0x68, + 0xCA, 0xD3, 0x99, 0xDC, 0x47, 0xEA, 0x7A, 0xBA, + 0x3A, 0xE1, 0x61, 0x4C, 0x94, 0xC1, 0xB2, 0x72, + 0xEF, 0xC4, 0x44, 0x69, 0xB1, 0x0D, 0x27, 0x42, + 0xE2, 0x1B, 0x8C, 0xA7, 0x7C, 0x41, 0x2B, 0x73, + 0xF1, 0x26, 0x8A, 0x64, 0xD5, 0x42, 0x87, 0x58, + 0xFA, 0x5D, 0x37, 0x27, 0x11, 0xAD, 0xE5, 0x9D, + 0x1F, 0xC8, 0x69, 0xA7, 0x14, 0x8C, 0x5D, 0xD6, + 0x55, 0x4E, 0xD8, 0xB4, 0xFE, 0x65, 0xAD, 0xAD, + 0x0D, 0xD6, 0x10, 0xE5, 0x1D, 0x3F, 0x34, 0x5C, + 0x1C, 0xE7, 0x51, 0xCF, 0x3C, 0x24, 0x84, 0x64, + 0xE4, 0xBF, 0xF6, 0xBA, 0x90, 0x4B, 0x83, 0x83, + 0x23, 0xF8, 0x9C, 0xDB, 0xA9, 0xD9, 0x99, 0x59, + 0x39, 0x3F, 0x99, 0x27, 0x94, 0x8E, 0x2E, 0xCE, + 0x4E, 0x37, 0xAA, 0x6C, 0x74, 0xE4, 0x84, 0x84, + 0xAE, 0x65, 0x71, 0x76, 0x04, 0x15, 0x28, 0xEB, + 0xCE, 0x00, 0x94, 0xF4, 0x2F, 0x27, 0x45, 0x89, + 0x0F, 0xD8, 0x2B, 0xA7, 0x3C, 0x9D, 0xF1, 0x38, + 0x88, 0xB0, 0xF6, 0x7A, 0x4C, 0xED, 0x3D, 0x0E, + 0x2E, 0x97, 0x4E, 0x08, 0xDC, 0x73, 0xDB, 0x19, + 0x09, 0x7B, 0x3D, 0x4A, 0x0B, 0x2B, 0xDB, 0x6F, + 0x05, 0x12, 0x6E, 0xC8, 0xC2, 0x7E, 0x37, 0x75, + 0xF9, 0x08, 0x0C, 0x6C, 0x91, 0xA1, 0x49, 0x98, + 0xA8, 0xC0, 0x37, 0xE9, 0x7D, 0xE8, 0x58, 0x10, + 0xB0, 0xB3, 0x07, 0xD6, 0x06, 0x36, 0xE9, 0xAA, + 0xC0, 0xC6, 0xC0, 0x54, 0xCD, 0x8F, 0xA3, 0x49, + 0x13, 0x62, 0x56, 0x30, 0xC0, 0xC2, 0xEE, 0x07, + 0x07, 0x58, 0xAF, 0x41, 0xD3, 0x4B, 0x4D, 0xC4, + 0xFE, 0xAD, 0x19, 0xD8, 0x03, 0x39, 0xCA, 0x80, + 0xB4, 0xDD, 0x40, 0x06, 0x54, 0x6A, 0xBA, 0xC1, + 0xB1, 0xD0, 0xEE, 0x00, 0xD0, 0x47, 0xA5, 0x2C, + 0x44, 0x17, 0xA3, 0xC3, 0x10, 0x20, 0x93, 0xC3, + 0xC9, 0xE6, 0xA2, 0xE1, 0x13, 0x29, 0xA7, 0x97, + 0xE8, 0xC3, 0x8F, 0x0D, 0x17, 0xA9, 0xE3, 0xC1, + 0x4F, 0xBD, 0x8B, 0x2B, 0xE2, 0xB2, 0x1E, 0xFE, + 0xBC, 0x3A, 0xE0, 0xE9, 0x20, 0x90, 0xFC, 0x35, + 0xBE, 0x30, 0x3E, 0x50, 0x93, 0x10, 0x40, 0xB0, + 0x44, 0xAF, 0xFA, 0x66, 0x04, 0x70, 0x62, 0xCE, + 0x60, 0x5B, 0xAE, 0xD3, 0x5D, 0x58, 0xCD, 0xAF, + 0xE4, 0x2B, 0x1C, 0x2E, 0xF5, 0xD7, 0x9C, 0x79, + 0x6B, 0xDB, 0x44, 0xE8, 0x10, 0xA0, 0x48, 0x80, + 0x89, 0xD9, 0xCA, 0xF1, 0x09, 0xA4, 0x34, 0xF4, + 0x74, 0xAF, 0x2F, 0x02, 0xDA, 0x4B, 0x6C, 0xAF, + 0x87, 0x5E, 0x4A, 0xEC, 0x20, 0xB5, 0x8D, 0x6D, + 0x45, 0x9C, 0xA1, 0x67, 0x9A, 0xB9, 0xFE, 0x32, + 0xF8, 0xC1, 0xD8, 0x34, 0x3D, 0xC6, 0xA5, 0xA5, + 0x05, 0xDE, 0xAA, 0xEB, 0x87, 0xF7, 0xB7, 0x77, + 0x4F, 0x96, 0xC0, 0x60, 0xA8, 0xDA, 0xD7, 0xA3, + 0x91, 0x61, 0xF0, 0xF9, 0x29, 0xBB, 0x63, 0xA1, + 0x2D, 0xEC, 0xE8, 0xAF, 0x5F, 0x0A, 0x6D, 0x8F, + 0x12, 0x39, 0xB9, 0x94, 0x4C, 0xAD, 0x86, 0x45, + 0x05, 0xFE, 0x48, 0x66, 0x9B, 0x9F, 0x3F, 0xDF, + 0x5F, 0xB4, 0x46, 0x3A, 0xA2, 0x50, 0x10, 0x92, + 0x77, 0x18, 0xB3, 0x2F, 0xF7, 0x47, 0x11, 0x90, + 0x10, 0xC7, 0x72, 0x6C, 0x14, 0xD4, 0xE5, 0x62, + 0xE1, 0x36, 0x96, 0x42, 0x9F, 0x1F, 0xBC, 0x8C, + 0xBC, 0xC4, 0xD2, 0x6C, 0x9E, 0x04, 0xD4, 0xD8, + 0xF8, 0xF3, 0x98, 0x04, 0x06, 0x7A, 0x98, 0x54, + 0xF0, 0xCB, 0x3E, 0x43, 0xFD, 0x55, 0x09, 0x2B, + 0x81, 0x74, 0x10, 0x56, 0xBC, 0x47, 0x94, 0xB3, + 0x3E, 0xF2, 0xE6, 0x86, 0x76, 0xC6, 0xBD, 0x3D, + 0xBD, 0xD0, 0xC7, 0xDB, 0xB8, 0x18, 0xD8, 0xB8, + 0x0C, 0x67, 0x7B, 0x37, 0x4F, 0x5F, 0x4B, 0xCD, + 0x4D, 0x96, 0x2C, 0x4A, 0x20, 0x3F, 0xDF, 0x3A, + 0x43, 0x67, 0x69, 0x00, 0x62, 0x06, 0x94, 0x79, + 0xD7, 0x00, 0xAA, 0x36, 0x01, 0xA0, 0x30, 0x3E, + 0x2D, 0x34, 0xEF, 0xAD, 0x6E, 0xED, 0xBD, 0x4D, + 0xB9, 0x04, 0xF1, 0x3D, 0x6E, 0x75, 0xB0, 0xF5, + 0x52, 0x24, 0x90, 0x7D, 0xFB, 0x48, 0xE8, 0x08, + 0x88, 0xDB, 0x65, 0x80, 0x6A, 0x7F, 0x56, 0xB6, + 0x2B, 0x00, 0x80, 0xAD, 0x75, 0x44, 0x63, 0xA0, + 0x00, 0xB9, 0xFF, 0x1B, 0xCB, 0x70, 0x53, 0x13, + 0xA1, 0xEA, 0xDC, 0xE2, 0x9A, 0x58, 0x1D, 0xF7, + 0xF7, 0x4A, 0x5C, 0x40, 0xEF, 0xAF, 0xB5, 0x53, + 0x85, 0xBA, 0x08, 0x46, 0x9C, 0x0A, 0x28, 0x7B, + 0x8B, 0xD0, 0x44, 0x29, 0xD1, 0x49, 0x18, 0x92, + 0x30, 0xEB, 0x7F, 0x02, 0xFA, 0x6A, 0x3B, 0xD9, + 0x0A, 0xA1, 0x55, 0x1C, 0xEE, 0x1E, 0x3A, 0x0A, + 0xC0, 0x5D, 0xA9, 0xC1, 0x3F, 0x2E, 0x11, 0xD2, + 0xD2, 0x4D, 0xFA, 0xD6, 0x46, 0xC7, 0x01, 0xD5, + 0x59, 0x24, 0x50, 0x2F, 0xEB, 0xA9, 0xD5, 0xED, + 0xEF, 0x67, 0xA1, 0x8B, 0x51, 0xE1, 0x67, 0xB5, + 0x33, 0xE4, 0x50, 0x30, 0xE1, 0xC3, 0xF0, 0x40, + 0x60, 0x19, 0x0F, 0xCB, 0x19, 0x0B, 0x0E, 0xFC, + 0x61, 0x4A, 0xDE, 0xB0, 0x4D, 0x7B, 0xF4, 0xCB, + 0x4B, 0x90, 0x10, 0x3D, 0xE5, 0x59, 0x3B, 0xF7, + 0x72, 0xE8, 0x19, 0x76, 0xA2, 0x51, 0xF9, 0x3D, + 0x7D, 0x74, 0x52, 0xAC, 0x69, 0xB5, 0xC3, 0x5A, + 0xDD, 0x0D, 0x32, 0xDE, 0x86, 0xC2, 0x20, 0xBD, + 0x51, 0xDC, 0xE2, 0x88, 0x90, 0xD2, 0x12, 0x30, + 0x9F, 0x6E, 0x64, 0x16, 0xE8, 0x46, 0x09, 0xEF, + 0x41, 0xB6, 0x66, 0x34, 0xBB, 0x59, 0x56, 0xBC, + 0x1C, 0x55, 0x13, 0xBF, 0xFE, 0xEE, 0x2C, 0xE5, + 0x4F, 0x26, 0x99, 0xDC, 0x84, 0x9E, 0xEF, 0x9F, + 0xB5, 0x4E, 0xF4, 0x93, 0xE9, 0x04, 0x08, 0xE2, + 0xCE, 0x87, 0x38, 0x73, 0x39, 0xC3, 0x4B, 0x26, + 0xA4, 0x5A, 0x1F, 0x8C, 0x12, 0xA9, 0xC9, 0x12, + 0x2C, 0xD7, 0xC3, 0x5F, 0x47, 0x5D, 0x9D, 0xEF, + 0x00, 0xF1, 0xF7, 0x20, 0x08, 0x02, 0xC8, 0xBA, + 0x30, 0xC1, 0x95, 0xF3, 0x02, 0x32, 0xE9, 0x38, + 0x58, 0x38, 0xAE, 0x70, 0xF5, 0x29, 0x63, 0x1F, + 0x3D, 0xEC, 0x7D, 0xB3, 0x20, 0x78, 0xB5, 0x77, + 0xFB, 0x2B, 0x78, 0xFB, 0xDC, 0xA4, 0xC0, 0x2A, + 0x76, 0x3F, 0x84, 0x00, 0x74, 0x0D, 0x66, 0x5F, + 0x2D, 0xBB, 0xE5, 0x41, 0x9D, 0x07, 0xBB, 0x99, + 0x14, 0x27, 0x4D, 0xEF, 0x9A, 0x28, 0x44, 0x9F, + 0x3F, 0x66, 0x20, 0x8C, 0xC6, 0xD6, 0x24, 0xCD, + 0x67, 0x7C, 0x42, 0x8E, 0xC6, 0xEF, 0x7F, 0x25, + 0x2D, 0x74, 0xCA, 0x81, 0xDB, 0x26, 0xAE, 0xCB, + 0xA7, 0x83, 0xFD, 0x95, 0x46, 0xC5, 0xBE, 0x5C, + 0xFC, 0x07, 0xC5, 0xFF, 0x34, 0x70, 0x82, 0x6E, + 0xC7, 0x90, 0xAF, 0xC8, 0x99, 0xAB, 0xA7, 0x4E, + 0x02, 0xC1, 0x92, 0x22, 0x05, 0xA8, 0x38, 0xF8, + 0x78, 0xA3, 0x23, 0x0E, 0xD6, 0x27, 0x27, 0xE4, + 0x55, 0xEF, 0x5A, 0xBE, 0x22, 0x1B, 0xF9, 0x00, + 0xC4, 0x02, 0x44, 0x28, 0xF0, 0x40, 0x16, 0x97, + 0x17, 0x6E, 0x1A, 0x66, 0x1B, 0x98, 0xD8, 0x89, + 0x69, 0xB1, 0x8F, 0x61, 0x30, 0xC9, 0xB4, 0x84, + 0x04, 0xDF, 0x5F, 0x72, 0xAA, 0xA7, 0xC5, 0x24, + 0xC6, 0x1E, 0x80, 0xEE, 0x3A, 0x06, 0xED, 0x8F, + 0xAA, 0x73, 0xED, 0x00, 0xBB, 0x08, 0xFA, 0xF8, + 0x68, 0x2A, 0xCE, 0x3B, 0xA1, 0x98, 0x9A, 0xD6, + 0x55, 0xB7, 0x93, 0xE2, 0xCA, 0x7A, 0x2C, 0xAD, + 0x2D, 0xC7, 0x13, 0x7C, 0x9C, 0x2F, 0xFD, 0x2E, + 0xB6, 0x61, 0xCB, 0xA0, 0x93, 0x39, 0xC8, 0x56, + 0xD5, 0xCE, 0xD3, 0x9F, 0xE5, 0x06, 0x7E, 0x7E, + 0xDE, 0x05, 0x2B, 0x4E, 0x14, 0xB7, 0xD1, 0xB3, + 0xF0, 0x3B, 0x17, 0xF3, 0xA2, 0x61, 0x64, 0x88, + 0x28, 0x41, 0xE4, 0x90, 0x5F, 0x04, 0x6A, 0x12, + 0x01, 0x56, 0x7B, 0x9F, 0x4C, 0x51, 0x33, 0x13, + 0x9B, 0x40, 0xDB, 0xBD, 0x78, 0x38, 0x54, 0x96, + 0x0B, 0x20, 0xA0, 0x8D, 0x55, 0xD4, 0xD6, 0x15, + 0xAD, 0x75, 0x71, 0x0F, 0xC3, 0xBB, 0x78, 0x10, + 0xB3, 0xA2, 0xAF, 0x7A, 0x01, 0x16, 0x4D, 0xDC, + 0xFC, 0xBC, 0xCA, 0x24, 0xEF, 0x47, 0xBE, 0xDD, + 0x4A, 0xF9, 0x64, 0xCA, 0xBA, 0xF5, 0x74, 0xD0, + 0x53, 0x70, 0x75, 0xD9, 0x21, 0x91, 0x23, 0xF0, + 0x68, 0x02, 0xFF, 0x90, 0xA8, 0xC5, 0xB5, 0x87, + 0x6C, 0x17, 0x73, 0x4C, 0x8C, 0xFC, 0xBC, 0x7C, + 0x5E, 0xAE, 0x98, 0x34, 0xCC, 0x7C, 0xDC, 0xB6, + 0x26, 0x5F, 0x82, 0x6E, 0xF0, 0x41, 0x21, 0x43, + 0x00, 0xCB, 0x58, 0x13, 0xEB, 0x9B, 0xDB, 0x1B, + 0x0A, 0x8F, 0x3A, 0xD4, 0x1F, 0xA9, 0x51, 0x98, + 0xBA, 0xA2, 0x04, 0xF2, 0xA2, 0x9B, 0x88, 0x2D, + 0x89, 0x72, 0x4C, 0xA3, 0xD6, 0x64, 0xE4, 0x2C, + 0xAC, 0x6A, 0x2C, 0x40, 0x98, 0x28, 0x7E, 0xFF, + 0x7F, 0xE6, 0xF8, 0x6B, 0x22, 0xF7, 0x94, 0xE5, + 0x07, 0xDF, 0x58, 0x7F, 0xA4, 0xAC, 0xC7, 0xC5, + 0x5E, 0x9D, 0x27, 0x66, 0x6E, 0x12, 0x52, 0x50, + 0x8B, 0x48, 0x3E, 0x72, 0xAA, 0xB8, 0xFB, 0x9B, + 0xB2, 0xD2, 0xA4, 0xE8, 0x30, 0x02, 0x41, 0x21, + 0x61, 0x9A, 0x2C, 0xD0, 0x80, 0x20, 0xD2, 0xB3, + 0x33, 0x78, 0x46, 0x0A, 0x50, 0x83, 0x43, 0x43, + 0xE3, 0x38, 0xAC, 0xE3, 0xBB, 0xCB, 0x8B, 0x4B, + 0x8B, 0x72, 0xD4, 0xFA, 0x86, 0x36, 0x16, 0xF4, + 0x54, 0xAD, 0x78, 0x94, 0x51, 0x11, 0x47, 0xC6, + 0x46, 0xFB, 0x79, 0x1D, 0x47, 0xF4, 0xB3, 0xB1, + 0x32, 0xCF, 0x1F, 0x4B, 0x99, 0x84, 0xE6, 0x9B, + 0x18, 0x0E, 0xBC, 0xF5, 0xB5, 0x27, 0x5A, 0x6A, + 0x42, 0xCA, 0xCE, 0x02, 0x21, 0x21, 0x8D, 0x5D, + 0x1F, 0x87, 0x17, 0xBB, 0x43, 0xF3, 0x01, 0xCB, + 0x47, 0x5C, 0xCA, 0xA6, 0xCE, 0xE7, 0x97, 0xC5, + 0x0F, 0xD8, 0x73, 0xEF, 0x37, 0x87, 0xFD, 0x3C, + 0xBC, 0x67, 0xD1, 0xBD, 0x65, 0xD5, 0x51, 0x9C, + 0x1E, 0xA5, 0x17, 0x7A, 0xA2, 0x12, 0x72, 0xB2, + 0x32, 0xE9, 0xEF, 0x8D, 0x57, 0x87, 0xCD, 0x0F, + 0x8F, 0x54, 0xE2, 0x8E, 0x56, 0xE6, 0x66, 0xB4, + 0x36, 0x8D, 0x27, 0x4B, 0x9B, 0x2B, 0x36, 0xF2, + 0x0C, 0xD3, 0xE1, 0x9F, 0x45, 0x95, 0x81, 0x52, + 0xD0, 0x6B, 0x45, 0x3A, 0xE0, 0x30, 0xF0, 0x23, + 0xA1, 0x1A, 0x74, 0x0C, 0xD6, 0x06, 0x7E, 0xAB, + 0x29, 0x92, 0x14, 0x6E, 0xB4, 0x64, 0x30, 0xE5, + 0x67, 0xDC, 0xD2, 0xAB, 0x71, 0xA1, 0xC1, 0x01, + 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, + 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, + 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, + 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, + 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, + 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, + 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, + 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, + 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x97, 0x40, + 0xC2, 0x79, 0xEB, 0x90, 0x4A, 0x9A, 0xEE, 0x36, + 0xB4, 0x0F, 0x19, 0x62, 0xB8, 0x68, 0x08, 0xC8, + 0x48, 0x93, 0x25, 0x49, 0x91, 0x21, 0x41, 0x81, + 0x01, 0xDA, 0xA0, 0xD4, 0x0C, 0xDC, 0x6C, 0xB4, + 0x34, 0x8F, 0xC1, 0xB4, 0x6C, 0xBC, 0x30, 0xF0, + 0x70, 0xAB, 0x1D, 0x71, 0xA9, 0x19, 0x78, 0xB8, + 0x38, 0xE3, 0x54, 0x38, 0xE1, 0x51, 0x30, 0xF8, + 0x38, 0xE3, 0x54, 0x39, 0xE0, 0x51, 0x70, 0xA0, + 0x24, 0xFD, 0x6A, 0x02, 0xFB, 0x4F, 0x0E, 0x4A, + 0xDA, 0x43, 0xE4, 0x99, 0x50, 0xF1, 0xD8, 0x3A, + 0x9E, 0x67, 0x98, 0xE6, 0x77, 0xD5, 0xFC, 0x6E, + 0xD7, 0x1E, 0xFD, 0x80, 0x0D, 0xAC, 0x99, 0x4C, + 0x99, 0x53, 0x4F, 0x09, 0x7B, 0xE1, 0x2B, 0x41, + 0x6B, 0x9A, 0x79, 0x40, 0xCD, 0x28, 0x1D, 0x88, + 0x5D, 0x53, 0xB0, 0x09, 0x84, 0xE1, 0x2B, 0x01, + 0x2B, 0x1E, 0x02, 0x80, 0xF2, 0xAC, 0x7A, 0x17, + 0x21, 0x17, 0x17, 0x96, 0xF8, 0xA5, 0x73, 0x6E, + 0x35, 0x33, 0x6B, 0xE9, 0xDF, 0x81, 0x3F, 0x84, + 0xEB, 0x8D, 0xE5, 0x72, 0x74, 0x3F, 0xE1, 0xCE, + 0xB5, 0x93, 0xDB, 0x49, 0x6F, 0x21, 0xBF, 0x88, + 0xB7, 0x93, 0xDB, 0x48, 0x6E, 0x21, 0xBE, 0x81, + 0xFE, 0xDA, 0x58, 0x2D, 0xF5, 0x25, 0x7D, 0xA4, + 0x24, 0x9F, 0xD5, 0xA0, 0x78, 0xA8, 0xFC, 0x3C, + 0xBC, 0x67, 0xD1, 0xBD, 0x65, 0xD5, 0xB5, 0x75, + 0xF5, 0x2E, 0x98, 0xF4, 0x2C, 0x9C, 0xFC, 0x3C, + 0xBC, 0x67, 0xF9, 0x9C, 0x44, 0x94, 0xD0, 0x19, + 0x99, 0x22, 0x84, 0x58, 0x82, 0x32, 0x52, 0x88, + 0x08, 0xB3, 0x75, 0x18, 0xC0, 0x70, 0x6C, 0xAB, + 0x2B, 0x90, 0x9A, 0xFB, 0x21, 0xF1, 0xAD, 0x65, + 0xE5, 0x5E, 0xFC, 0x9E, 0x44, 0x94, 0x38, 0xF6, + 0x74, 0xCF, 0xED, 0x87, 0x5F, 0x8F, 0x4B, 0x84, + 0x06, 0xBD, 0x4F, 0x25, 0xFD, 0x2D, 0xC1, 0x0E, + 0x8C, 0x37, 0x71, 0x04, 0xDC, 0x0C, 0xB8, 0x77, + 0xF5, 0x4E, 0x48, 0x35, 0xEF, 0x3F, 0xE7, 0x2F, + 0xAF, 0x14, 0x82, 0xFC, 0x26, 0xF6, 0x2A, 0xED, + 0x6D, 0xD6, 0x34, 0x4A, 0x90, 0x40, 0xE8, 0x3A, + 0xB8, 0x03, 0x5D, 0x37, 0xEF, 0x3F, 0x3B, 0xE3, + 0x61, 0xDA, 0x2C, 0x4A, 0x92, 0x42, 0x14, 0x95, + 0x15, 0x4F, 0x7B, 0x11, 0x78, 0x48, 0x2E, 0xF2, + 0x78, 0x32, 0x05, 0x6F, 0x15, 0xEE, 0x8E, 0xC7, + 0x4E, 0xB0, 0x04, 0x68, 0x55, 0xE1, 0x81, 0xE4, + 0x66, 0xBD, 0xEE, 0x87, 0x5F, 0x0A, 0x62, 0xA2, + 0x07, 0xDF, 0x69, 0xA0, 0x71, 0xC1, 0x00, 0x43, + 0xC5, 0xAF, 0x9D, 0xF7, 0x8A, 0x60, 0x27, 0xFA, + 0x8A, 0x51, 0xD1, 0xFC, 0x24, 0xA5, 0x40, 0x86, + 0x27, 0x7A, 0xCA, 0x8F, 0x84, 0x29, 0xB9, 0x79, + 0xF9, 0x22, 0xA2, 0x8F, 0x57, 0xD6, 0x31, 0xF7, + 0x56, 0x05, 0xB5, 0xF0, 0x6B, 0xC6, 0x56, 0x96, + 0x16, 0xCD, 0x4D, 0x60, 0xB8, 0x39, 0xDC, 0x1A, + 0xBB, 0xE9, 0x59, 0x1C, 0x57, 0xFA, 0x6A, 0xAA, + 0x2A, 0xF1, 0x71, 0x5C, 0x84, 0x15, 0xF8, 0x3E, + 0x8F, 0xD8, 0x68, 0x95, 0xC7, 0x71, 0x90, 0xDB, + 0x5D, 0x0F, 0xF0, 0xB5, 0x6E, 0xC3, 0x53, 0x93, + 0x13, 0xC8, 0x48, 0x65, 0xBD, 0x9C, 0x72, 0xB4, + 0x38, 0xEB, 0xDF, 0xFA, 0x22, 0xF7, 0x96, 0x56, + 0x77, 0x3C, 0x8C, 0x51, 0x0E, 0xB8, 0x19, 0x56, + 0xD0, 0xC2, 0x7F, 0xBA, 0x39, 0x94, 0x04, 0xC4, + 0x44, 0x9F, 0x1F, 0x32, 0xEA, 0x6B, 0x9A, 0x5C, + 0xFD, 0xB4, 0x04, 0x41, 0x8A, 0x27, 0xB7, 0x77, + 0xF7, 0x2C, 0xAC, 0x81, 0x59, 0x68, 0x9C, 0x5A, + 0xEB, 0xA3, 0x13, 0x5E, 0x13, 0xA5, 0xEC, 0x0F, + 0x06, 0x8E, 0x25, 0xB9, 0x61, 0xD1, 0x87, 0x06, + 0x86, 0xCC, 0xEC, 0x86, 0xDF, 0xF8, 0x9E, 0xD7, + 0x7E, 0xC0, 0x76, 0x1A, 0xDF, 0x9F, 0xC9, 0x48, + 0xC8, 0xB2, 0x9C, 0xF6, 0x9C, 0x8C, 0x60, 0x08, + 0x82, 0x79, 0xAE, 0xC2, 0x92, 0x08, 0xD2, 0xA8, + 0xB4, 0x77, 0xCD, 0xBD, 0x69, 0x54, 0xD6, 0x3C, + 0x94, 0x8F, 0x19, 0x75, 0x7F, 0x81, 0xED, 0xEF, + 0x24, 0xD8, 0x4B, 0x80, 0x7B, 0xEB, 0x6D, 0xBE, + 0x2E, 0xD5, 0x63, 0x12, 0x3A, 0x8A, 0xEA, 0x2A, + 0xAA, 0x71, 0xC7, 0xAB, 0x73, 0xC3, 0xA3, 0x63, + 0xE3, 0x38, 0x8F, 0xE3, 0x3F, 0x8F, 0x8B, 0x51, + 0xD3, 0x68, }; static unsigned char vfs5011_prepare_02[] = { /* 2565 B */ - 0x02, 0xF0, 0x00, 0x14, 0x00, 0x03, 0x00, 0x09, - 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, - 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, - 0x20, 0x04, 0x30, 0xE5, 0x03, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, - 0xEA, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x4C, 0x20, 0x04, 0x30, 0x0A, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, - 0x04, 0x30, 0x01, 0xDE, 0x01, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, - 0x30, 0x02, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, - 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x40, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, - 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, - 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, - 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, - 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, - 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, - 0x30, 0x00, 0x00, 0x74, 0x01, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, - 0x74, 0x01, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, - 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, - 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, - 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, - 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, - 0xFF, 0xF9, 0x87, 0x20, 0xBB, 0xF8, 0x87, 0x00, - 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, - 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, - 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x07, 0x20, - 0xBA, 0xF8, 0x07, 0x20, 0xB9, 0xF8, 0x07, 0x20, - 0xB8, 0xF8, 0x07, 0x20, 0xB7, 0xF8, 0x07, 0x20, - 0xB6, 0xF8, 0x07, 0x20, 0xB5, 0xF8, 0x07, 0x20, - 0xB4, 0xF8, 0x07, 0x20, 0xB3, 0xF8, 0x07, 0x20, - 0xB2, 0xF8, 0x07, 0x20, 0xB1, 0xF8, 0x07, 0x22, - 0xB0, 0xF8, 0x07, 0x22, 0xAF, 0xF8, 0x07, 0x22, - 0xAE, 0xF8, 0x07, 0x22, 0xAD, 0xF8, 0x07, 0x22, - 0xAC, 0xF8, 0x07, 0x22, 0xAB, 0xF8, 0x07, 0x22, - 0xAA, 0xF8, 0x07, 0x22, 0xA9, 0xF8, 0x07, 0x22, - 0xA8, 0xF8, 0x07, 0x22, 0xA7, 0xF8, 0x07, 0x22, - 0xA6, 0xF8, 0x07, 0x22, 0xA5, 0xF8, 0x07, 0x22, - 0xA4, 0xF8, 0x07, 0x22, 0xA3, 0xF8, 0x07, 0x22, - 0xA2, 0xF8, 0x07, 0x22, 0xA1, 0xF8, 0x07, 0x22, - 0xA0, 0xF8, 0x07, 0x22, 0x9F, 0xF8, 0x07, 0x22, - 0x9E, 0xF8, 0x07, 0x22, 0x9D, 0xF8, 0x07, 0x22, - 0x9C, 0xF8, 0x07, 0x22, 0x9B, 0xF8, 0x07, 0x22, - 0x9A, 0xF8, 0x07, 0x22, 0x99, 0xF8, 0x07, 0x22, - 0x98, 0xF8, 0x07, 0x22, 0x97, 0xF8, 0x07, 0x22, - 0x96, 0xF8, 0x07, 0x22, 0x95, 0xF8, 0x07, 0x22, - 0x94, 0xF8, 0x07, 0x22, 0x93, 0xF8, 0x07, 0x22, - 0x92, 0xF8, 0x07, 0x22, 0x91, 0xF8, 0x07, 0x22, - 0x90, 0xF8, 0x07, 0x22, 0x8F, 0xF8, 0x07, 0x22, - 0x8E, 0xF8, 0x07, 0x22, 0x8D, 0xF8, 0x07, 0x22, - 0x8C, 0xF8, 0x07, 0x22, 0x8B, 0xF8, 0x07, 0x22, - 0x8A, 0xF8, 0x07, 0x22, 0x89, 0xF8, 0x07, 0x22, - 0x88, 0xF8, 0x07, 0x22, 0x87, 0xF8, 0x07, 0x22, - 0x86, 0xF8, 0x07, 0x22, 0x85, 0xF8, 0x07, 0x22, - 0x84, 0xF8, 0x07, 0x22, 0x83, 0xF8, 0x07, 0x22, - 0x82, 0xF8, 0x07, 0x22, 0x81, 0xF8, 0x07, 0x22, - 0x80, 0xF8, 0x07, 0x22, 0x7F, 0xF8, 0x07, 0x22, - 0x7E, 0xF8, 0x07, 0x22, 0x7D, 0xF8, 0x07, 0x22, - 0x7C, 0xF8, 0x07, 0x22, 0x7B, 0xF8, 0x07, 0x22, - 0x7A, 0xF8, 0x07, 0x22, 0x79, 0xF8, 0x07, 0x22, - 0x78, 0xF8, 0x07, 0x22, 0x77, 0xF8, 0x07, 0x22, - 0x76, 0xF8, 0x07, 0x22, 0x75, 0xF8, 0x07, 0x22, - 0x74, 0xF8, 0x07, 0x22, 0x73, 0xF8, 0x07, 0x22, - 0x72, 0xF8, 0x07, 0x22, 0x71, 0xF8, 0x07, 0x22, - 0x70, 0xF8, 0x07, 0x22, 0x6F, 0xF8, 0x07, 0x22, - 0x6E, 0xF8, 0x07, 0x22, 0x6D, 0xF8, 0x07, 0x22, - 0x6C, 0xF8, 0x07, 0x22, 0x6B, 0xF8, 0x07, 0x22, - 0x6A, 0xF8, 0x07, 0x22, 0x69, 0xF8, 0x07, 0x22, - 0x68, 0xF8, 0x07, 0x22, 0x67, 0xF8, 0x07, 0x22, - 0x66, 0xF8, 0x07, 0x22, 0x65, 0xF8, 0x07, 0x22, - 0x64, 0xF8, 0x07, 0x22, 0x63, 0xF8, 0x07, 0x22, - 0x62, 0xF8, 0x07, 0x22, 0x61, 0xF8, 0x07, 0x22, - 0x60, 0xF8, 0x07, 0x22, 0x5F, 0xF8, 0x07, 0x22, - 0x5E, 0xF8, 0x07, 0x22, 0x5D, 0xF8, 0x07, 0x22, - 0x5C, 0xF8, 0x07, 0x22, 0x5B, 0xF8, 0x07, 0x22, - 0x5A, 0xF8, 0x07, 0x22, 0x59, 0xF8, 0x07, 0x22, - 0x58, 0xF8, 0x07, 0x22, 0x57, 0xF8, 0x07, 0x22, - 0x56, 0xF8, 0x07, 0x22, 0x55, 0xF8, 0x07, 0x22, - 0x54, 0xF8, 0x07, 0x22, 0x53, 0xF8, 0x07, 0x22, - 0x52, 0xF8, 0x07, 0x22, 0x51, 0xF8, 0x07, 0x22, - 0x50, 0xF8, 0x07, 0x22, 0x4F, 0xF8, 0x07, 0x22, - 0x4E, 0xF8, 0x07, 0x22, 0x4D, 0xF8, 0x07, 0x22, - 0x4C, 0xF8, 0x07, 0x22, 0x4B, 0xF8, 0x07, 0x22, - 0x4A, 0xF8, 0x07, 0x22, 0x49, 0xF8, 0x07, 0x22, - 0x48, 0xF8, 0x07, 0x22, 0x47, 0xF8, 0x07, 0x22, - 0x46, 0xF8, 0x07, 0x22, 0x45, 0xF8, 0x07, 0x22, - 0x44, 0xF8, 0x07, 0x22, 0x43, 0xF8, 0x07, 0x22, - 0x42, 0xF8, 0x07, 0x22, 0x41, 0xF8, 0x07, 0x22, - 0x40, 0xF8, 0x07, 0x22, 0x3F, 0xF8, 0x07, 0x22, - 0x3E, 0xF8, 0x07, 0x22, 0x3D, 0xF8, 0x07, 0x22, - 0x3C, 0xF8, 0x07, 0x22, 0x3B, 0xF8, 0x07, 0x22, - 0x3A, 0xF8, 0x07, 0x22, 0x39, 0xF8, 0x07, 0x22, - 0x38, 0xF8, 0x07, 0x22, 0x37, 0xF8, 0x07, 0x22, - 0x36, 0xF8, 0x07, 0x22, 0x35, 0xF8, 0x07, 0x22, - 0x34, 0xF8, 0x07, 0x22, 0x33, 0xF8, 0x07, 0x22, - 0x32, 0xF8, 0x07, 0x22, 0x31, 0xF8, 0x07, 0x22, - 0x30, 0xF8, 0x07, 0x22, 0x2F, 0xF8, 0x07, 0x22, - 0x2E, 0xF8, 0x07, 0x22, 0x2D, 0xF8, 0x07, 0x22, - 0x2C, 0xF8, 0x07, 0x22, 0x2B, 0xF8, 0x07, 0x22, - 0x2A, 0xF8, 0x07, 0x22, 0x29, 0xF8, 0x07, 0x22, - 0x28, 0xF8, 0x07, 0x22, 0x27, 0xF8, 0x07, 0x22, - 0x26, 0xF8, 0x07, 0x22, 0x25, 0xF8, 0x07, 0x22, - 0x24, 0xF8, 0x07, 0x22, 0x23, 0xF8, 0x07, 0x20, - 0x22, 0xF8, 0x07, 0x20, 0x21, 0xF8, 0x07, 0x20, - 0x20, 0xF8, 0x07, 0x20, 0x1F, 0xF8, 0x07, 0x20, - 0x1E, 0xF8, 0x07, 0x20, 0x1D, 0xF8, 0x07, 0x20, - 0x1C, 0xF8, 0x07, 0x20, 0x1C, 0xF8, 0x07, 0x00, - 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, - 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, - 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, - 0xD8, 0xF8, 0x27, 0x20, 0xD9, 0xF8, 0x27, 0x20, - 0xDA, 0xF8, 0x27, 0x20, 0xDB, 0xF8, 0x27, 0x20, - 0xDC, 0xF8, 0x27, 0x20, 0xDD, 0xF8, 0x27, 0x20, - 0xDE, 0xF8, 0x27, 0x20, 0xDF, 0xF8, 0x27, 0x20, - 0xE0, 0xF8, 0x27, 0x20, 0xE1, 0xF8, 0x27, 0x20, - 0xE2, 0xF8, 0x27, 0x20, 0xE3, 0xF8, 0x27, 0x20, - 0xE4, 0xF8, 0x27, 0x20, 0xE5, 0xF8, 0x27, 0x20, - 0xE6, 0xF8, 0x27, 0x20, 0xE7, 0xF8, 0x27, 0x20, - 0xE8, 0xF8, 0x27, 0x20, 0xE9, 0xF8, 0x27, 0x20, - 0xEA, 0xF8, 0x27, 0x20, 0xEB, 0xF8, 0x27, 0x20, - 0xEC, 0xF8, 0x27, 0x20, 0xED, 0xF8, 0x27, 0x20, - 0xEE, 0xF8, 0x27, 0x20, 0xEF, 0xF8, 0x27, 0x20, - 0xF0, 0xF8, 0x27, 0x20, 0xF1, 0xF8, 0x27, 0x20, - 0xF2, 0xF8, 0x27, 0x20, 0xF3, 0xF8, 0x27, 0x20, - 0xF4, 0xF8, 0x27, 0x20, 0xF5, 0xF8, 0x27, 0x20, - 0xF6, 0xF8, 0x27, 0x20, 0xF7, 0xF8, 0x27, 0x20, - 0xF8, 0xF8, 0x27, 0x20, 0xF9, 0xF8, 0x27, 0x20, - 0xFA, 0xF8, 0x27, 0x20, 0xFB, 0xF8, 0x27, 0x20, - 0xFC, 0xF8, 0x27, 0x20, 0xFD, 0xF8, 0x27, 0x20, - 0xFE, 0xF8, 0x27, 0x20, 0xFF, 0xF8, 0x27, 0x20, - 0x00, 0xF9, 0x27, 0x20, 0xD7, 0xF8, 0x27, 0x20, - 0x00, 0xF8, 0x27, 0x20, 0x01, 0xF8, 0x27, 0x20, - 0x02, 0xF8, 0x27, 0x20, 0x03, 0xF8, 0x27, 0x20, - 0x04, 0xF8, 0x27, 0x20, 0x05, 0xF8, 0x27, 0x20, - 0x06, 0xF8, 0x27, 0x20, 0x07, 0xF8, 0x27, 0x20, - 0x08, 0xF8, 0x27, 0x20, 0x09, 0xF8, 0x27, 0x20, - 0x0A, 0xF8, 0x27, 0x20, 0x0B, 0xF8, 0x27, 0x20, - 0x0C, 0xF8, 0x27, 0x20, 0x0D, 0xF8, 0x27, 0x20, - 0x0E, 0xF8, 0x27, 0x20, 0x0F, 0xF8, 0x27, 0x20, - 0x10, 0xF8, 0x27, 0x20, 0x11, 0xF8, 0x27, 0x20, - 0x12, 0xF8, 0x27, 0x20, 0x13, 0xF8, 0x27, 0x20, - 0x14, 0xF8, 0x27, 0x20, 0x15, 0xF8, 0x27, 0x20, - 0x15, 0xF8, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, - 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, - 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, - 0x04, 0x17, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0E, - 0x00, 0x0C, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x05, - 0x00, 0x0E, 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, - 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x00, - 0x00, 0x03, 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x14, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xC8, 0x20, 0x04, 0x30, 0x04, 0x00, 0x00, - 0x00, 0x04, 0x05, 0x00, 0x0E, 0x00, 0x14, 0x20, - 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x84, 0x00, 0x03, 0x00, 0x09, 0x00, - 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x90, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x07, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x60, 0x21, 0x04, 0x30, 0x07, 0x00, 0x00, 0x00, - 0x04, 0x15, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x28, 0x00, 0x00, + 0x02, 0xF0, 0x00, 0x14, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE5, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xEA, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0x0A, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x01, 0xDE, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x02, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x00, 0x74, 0x01, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x74, 0x01, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0xF9, 0x87, 0x20, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x07, 0x20, + 0xBA, 0xF8, 0x07, 0x20, 0xB9, 0xF8, 0x07, 0x20, + 0xB8, 0xF8, 0x07, 0x20, 0xB7, 0xF8, 0x07, 0x20, + 0xB6, 0xF8, 0x07, 0x20, 0xB5, 0xF8, 0x07, 0x20, + 0xB4, 0xF8, 0x07, 0x20, 0xB3, 0xF8, 0x07, 0x20, + 0xB2, 0xF8, 0x07, 0x20, 0xB1, 0xF8, 0x07, 0x22, + 0xB0, 0xF8, 0x07, 0x22, 0xAF, 0xF8, 0x07, 0x22, + 0xAE, 0xF8, 0x07, 0x22, 0xAD, 0xF8, 0x07, 0x22, + 0xAC, 0xF8, 0x07, 0x22, 0xAB, 0xF8, 0x07, 0x22, + 0xAA, 0xF8, 0x07, 0x22, 0xA9, 0xF8, 0x07, 0x22, + 0xA8, 0xF8, 0x07, 0x22, 0xA7, 0xF8, 0x07, 0x22, + 0xA6, 0xF8, 0x07, 0x22, 0xA5, 0xF8, 0x07, 0x22, + 0xA4, 0xF8, 0x07, 0x22, 0xA3, 0xF8, 0x07, 0x22, + 0xA2, 0xF8, 0x07, 0x22, 0xA1, 0xF8, 0x07, 0x22, + 0xA0, 0xF8, 0x07, 0x22, 0x9F, 0xF8, 0x07, 0x22, + 0x9E, 0xF8, 0x07, 0x22, 0x9D, 0xF8, 0x07, 0x22, + 0x9C, 0xF8, 0x07, 0x22, 0x9B, 0xF8, 0x07, 0x22, + 0x9A, 0xF8, 0x07, 0x22, 0x99, 0xF8, 0x07, 0x22, + 0x98, 0xF8, 0x07, 0x22, 0x97, 0xF8, 0x07, 0x22, + 0x96, 0xF8, 0x07, 0x22, 0x95, 0xF8, 0x07, 0x22, + 0x94, 0xF8, 0x07, 0x22, 0x93, 0xF8, 0x07, 0x22, + 0x92, 0xF8, 0x07, 0x22, 0x91, 0xF8, 0x07, 0x22, + 0x90, 0xF8, 0x07, 0x22, 0x8F, 0xF8, 0x07, 0x22, + 0x8E, 0xF8, 0x07, 0x22, 0x8D, 0xF8, 0x07, 0x22, + 0x8C, 0xF8, 0x07, 0x22, 0x8B, 0xF8, 0x07, 0x22, + 0x8A, 0xF8, 0x07, 0x22, 0x89, 0xF8, 0x07, 0x22, + 0x88, 0xF8, 0x07, 0x22, 0x87, 0xF8, 0x07, 0x22, + 0x86, 0xF8, 0x07, 0x22, 0x85, 0xF8, 0x07, 0x22, + 0x84, 0xF8, 0x07, 0x22, 0x83, 0xF8, 0x07, 0x22, + 0x82, 0xF8, 0x07, 0x22, 0x81, 0xF8, 0x07, 0x22, + 0x80, 0xF8, 0x07, 0x22, 0x7F, 0xF8, 0x07, 0x22, + 0x7E, 0xF8, 0x07, 0x22, 0x7D, 0xF8, 0x07, 0x22, + 0x7C, 0xF8, 0x07, 0x22, 0x7B, 0xF8, 0x07, 0x22, + 0x7A, 0xF8, 0x07, 0x22, 0x79, 0xF8, 0x07, 0x22, + 0x78, 0xF8, 0x07, 0x22, 0x77, 0xF8, 0x07, 0x22, + 0x76, 0xF8, 0x07, 0x22, 0x75, 0xF8, 0x07, 0x22, + 0x74, 0xF8, 0x07, 0x22, 0x73, 0xF8, 0x07, 0x22, + 0x72, 0xF8, 0x07, 0x22, 0x71, 0xF8, 0x07, 0x22, + 0x70, 0xF8, 0x07, 0x22, 0x6F, 0xF8, 0x07, 0x22, + 0x6E, 0xF8, 0x07, 0x22, 0x6D, 0xF8, 0x07, 0x22, + 0x6C, 0xF8, 0x07, 0x22, 0x6B, 0xF8, 0x07, 0x22, + 0x6A, 0xF8, 0x07, 0x22, 0x69, 0xF8, 0x07, 0x22, + 0x68, 0xF8, 0x07, 0x22, 0x67, 0xF8, 0x07, 0x22, + 0x66, 0xF8, 0x07, 0x22, 0x65, 0xF8, 0x07, 0x22, + 0x64, 0xF8, 0x07, 0x22, 0x63, 0xF8, 0x07, 0x22, + 0x62, 0xF8, 0x07, 0x22, 0x61, 0xF8, 0x07, 0x22, + 0x60, 0xF8, 0x07, 0x22, 0x5F, 0xF8, 0x07, 0x22, + 0x5E, 0xF8, 0x07, 0x22, 0x5D, 0xF8, 0x07, 0x22, + 0x5C, 0xF8, 0x07, 0x22, 0x5B, 0xF8, 0x07, 0x22, + 0x5A, 0xF8, 0x07, 0x22, 0x59, 0xF8, 0x07, 0x22, + 0x58, 0xF8, 0x07, 0x22, 0x57, 0xF8, 0x07, 0x22, + 0x56, 0xF8, 0x07, 0x22, 0x55, 0xF8, 0x07, 0x22, + 0x54, 0xF8, 0x07, 0x22, 0x53, 0xF8, 0x07, 0x22, + 0x52, 0xF8, 0x07, 0x22, 0x51, 0xF8, 0x07, 0x22, + 0x50, 0xF8, 0x07, 0x22, 0x4F, 0xF8, 0x07, 0x22, + 0x4E, 0xF8, 0x07, 0x22, 0x4D, 0xF8, 0x07, 0x22, + 0x4C, 0xF8, 0x07, 0x22, 0x4B, 0xF8, 0x07, 0x22, + 0x4A, 0xF8, 0x07, 0x22, 0x49, 0xF8, 0x07, 0x22, + 0x48, 0xF8, 0x07, 0x22, 0x47, 0xF8, 0x07, 0x22, + 0x46, 0xF8, 0x07, 0x22, 0x45, 0xF8, 0x07, 0x22, + 0x44, 0xF8, 0x07, 0x22, 0x43, 0xF8, 0x07, 0x22, + 0x42, 0xF8, 0x07, 0x22, 0x41, 0xF8, 0x07, 0x22, + 0x40, 0xF8, 0x07, 0x22, 0x3F, 0xF8, 0x07, 0x22, + 0x3E, 0xF8, 0x07, 0x22, 0x3D, 0xF8, 0x07, 0x22, + 0x3C, 0xF8, 0x07, 0x22, 0x3B, 0xF8, 0x07, 0x22, + 0x3A, 0xF8, 0x07, 0x22, 0x39, 0xF8, 0x07, 0x22, + 0x38, 0xF8, 0x07, 0x22, 0x37, 0xF8, 0x07, 0x22, + 0x36, 0xF8, 0x07, 0x22, 0x35, 0xF8, 0x07, 0x22, + 0x34, 0xF8, 0x07, 0x22, 0x33, 0xF8, 0x07, 0x22, + 0x32, 0xF8, 0x07, 0x22, 0x31, 0xF8, 0x07, 0x22, + 0x30, 0xF8, 0x07, 0x22, 0x2F, 0xF8, 0x07, 0x22, + 0x2E, 0xF8, 0x07, 0x22, 0x2D, 0xF8, 0x07, 0x22, + 0x2C, 0xF8, 0x07, 0x22, 0x2B, 0xF8, 0x07, 0x22, + 0x2A, 0xF8, 0x07, 0x22, 0x29, 0xF8, 0x07, 0x22, + 0x28, 0xF8, 0x07, 0x22, 0x27, 0xF8, 0x07, 0x22, + 0x26, 0xF8, 0x07, 0x22, 0x25, 0xF8, 0x07, 0x22, + 0x24, 0xF8, 0x07, 0x22, 0x23, 0xF8, 0x07, 0x20, + 0x22, 0xF8, 0x07, 0x20, 0x21, 0xF8, 0x07, 0x20, + 0x20, 0xF8, 0x07, 0x20, 0x1F, 0xF8, 0x07, 0x20, + 0x1E, 0xF8, 0x07, 0x20, 0x1D, 0xF8, 0x07, 0x20, + 0x1C, 0xF8, 0x07, 0x20, 0x1C, 0xF8, 0x07, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD8, 0xF8, 0x27, 0x20, 0xD9, 0xF8, 0x27, 0x20, + 0xDA, 0xF8, 0x27, 0x20, 0xDB, 0xF8, 0x27, 0x20, + 0xDC, 0xF8, 0x27, 0x20, 0xDD, 0xF8, 0x27, 0x20, + 0xDE, 0xF8, 0x27, 0x20, 0xDF, 0xF8, 0x27, 0x20, + 0xE0, 0xF8, 0x27, 0x20, 0xE1, 0xF8, 0x27, 0x20, + 0xE2, 0xF8, 0x27, 0x20, 0xE3, 0xF8, 0x27, 0x20, + 0xE4, 0xF8, 0x27, 0x20, 0xE5, 0xF8, 0x27, 0x20, + 0xE6, 0xF8, 0x27, 0x20, 0xE7, 0xF8, 0x27, 0x20, + 0xE8, 0xF8, 0x27, 0x20, 0xE9, 0xF8, 0x27, 0x20, + 0xEA, 0xF8, 0x27, 0x20, 0xEB, 0xF8, 0x27, 0x20, + 0xEC, 0xF8, 0x27, 0x20, 0xED, 0xF8, 0x27, 0x20, + 0xEE, 0xF8, 0x27, 0x20, 0xEF, 0xF8, 0x27, 0x20, + 0xF0, 0xF8, 0x27, 0x20, 0xF1, 0xF8, 0x27, 0x20, + 0xF2, 0xF8, 0x27, 0x20, 0xF3, 0xF8, 0x27, 0x20, + 0xF4, 0xF8, 0x27, 0x20, 0xF5, 0xF8, 0x27, 0x20, + 0xF6, 0xF8, 0x27, 0x20, 0xF7, 0xF8, 0x27, 0x20, + 0xF8, 0xF8, 0x27, 0x20, 0xF9, 0xF8, 0x27, 0x20, + 0xFA, 0xF8, 0x27, 0x20, 0xFB, 0xF8, 0x27, 0x20, + 0xFC, 0xF8, 0x27, 0x20, 0xFD, 0xF8, 0x27, 0x20, + 0xFE, 0xF8, 0x27, 0x20, 0xFF, 0xF8, 0x27, 0x20, + 0x00, 0xF9, 0x27, 0x20, 0xD7, 0xF8, 0x27, 0x20, + 0x00, 0xF8, 0x27, 0x20, 0x01, 0xF8, 0x27, 0x20, + 0x02, 0xF8, 0x27, 0x20, 0x03, 0xF8, 0x27, 0x20, + 0x04, 0xF8, 0x27, 0x20, 0x05, 0xF8, 0x27, 0x20, + 0x06, 0xF8, 0x27, 0x20, 0x07, 0xF8, 0x27, 0x20, + 0x08, 0xF8, 0x27, 0x20, 0x09, 0xF8, 0x27, 0x20, + 0x0A, 0xF8, 0x27, 0x20, 0x0B, 0xF8, 0x27, 0x20, + 0x0C, 0xF8, 0x27, 0x20, 0x0D, 0xF8, 0x27, 0x20, + 0x0E, 0xF8, 0x27, 0x20, 0x0F, 0xF8, 0x27, 0x20, + 0x10, 0xF8, 0x27, 0x20, 0x11, 0xF8, 0x27, 0x20, + 0x12, 0xF8, 0x27, 0x20, 0x13, 0xF8, 0x27, 0x20, + 0x14, 0xF8, 0x27, 0x20, 0x15, 0xF8, 0x27, 0x20, + 0x15, 0xF8, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x17, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0E, + 0x00, 0x0C, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x05, + 0x00, 0x0E, 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x00, + 0x00, 0x03, 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x14, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xC8, 0x20, 0x04, 0x30, 0x04, 0x00, 0x00, + 0x00, 0x04, 0x05, 0x00, 0x0E, 0x00, 0x14, 0x20, + 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x84, 0x00, 0x03, 0x00, 0x09, 0x00, + 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x90, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x07, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x07, 0x00, 0x00, 0x00, + 0x04, 0x15, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x28, 0x00, 0x00, }; static unsigned char vfs5011_prepare_03[] = { /* 117 B */ - 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0xFF, 0x00, 0x00, 0xFF, 0xF4, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0xF4, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0xBF, 0x02, 0x00, + 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xFF, 0x00, 0x00, 0xFF, 0xF4, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0xF4, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0xBF, 0x02, 0x00, }; static unsigned char vfs5011_prepare_04[] = { /* 2903 B */ - 0x02, 0xF0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, - 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, - 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, - 0x20, 0x04, 0x30, 0xE5, 0x03, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, - 0xEA, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x4C, 0x20, 0x04, 0x30, 0x0A, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, - 0x04, 0x30, 0x01, 0xDE, 0x01, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, - 0x30, 0x02, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, - 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x40, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, - 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, - 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, - 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, - 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, - 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, - 0x30, 0x00, 0x00, 0x74, 0x01, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, - 0x74, 0x01, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, - 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, - 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, - 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, - 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, - 0xFF, 0xF9, 0x87, 0x20, 0xBB, 0xF8, 0x87, 0x00, - 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, - 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, - 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x07, 0x20, - 0xBA, 0xF8, 0x07, 0x20, 0xB9, 0xF8, 0x07, 0x20, - 0xB8, 0xF8, 0x07, 0x20, 0xB7, 0xF8, 0x07, 0x20, - 0xB6, 0xF8, 0x07, 0x20, 0xB5, 0xF8, 0x07, 0x20, - 0xB4, 0xF8, 0x07, 0x20, 0xB3, 0xF8, 0x07, 0x20, - 0xB2, 0xF8, 0x07, 0x20, 0xB1, 0xF8, 0x07, 0x22, - 0xB0, 0xF8, 0x07, 0x22, 0xAF, 0xF8, 0x07, 0x22, - 0xAE, 0xF8, 0x07, 0x22, 0xAD, 0xF8, 0x07, 0x22, - 0xAC, 0xF8, 0x07, 0x22, 0xAB, 0xF8, 0x07, 0x22, - 0xAA, 0xF8, 0x07, 0x22, 0xA9, 0xF8, 0x07, 0x22, - 0xA8, 0xF8, 0x07, 0x22, 0xA7, 0xF8, 0x07, 0x22, - 0xA6, 0xF8, 0x07, 0x22, 0xA5, 0xF8, 0x07, 0x22, - 0xA4, 0xF8, 0x07, 0x22, 0xA3, 0xF8, 0x07, 0x22, - 0xA2, 0xF8, 0x07, 0x22, 0xA1, 0xF8, 0x07, 0x22, - 0xA0, 0xF8, 0x07, 0x22, 0x9F, 0xF8, 0x07, 0x22, - 0x9E, 0xF8, 0x07, 0x22, 0x9D, 0xF8, 0x07, 0x22, - 0x9C, 0xF8, 0x07, 0x22, 0x9B, 0xF8, 0x07, 0x22, - 0x9A, 0xF8, 0x07, 0x22, 0x99, 0xF8, 0x07, 0x22, - 0x98, 0xF8, 0x07, 0x22, 0x97, 0xF8, 0x07, 0x22, - 0x96, 0xF8, 0x07, 0x22, 0x95, 0xF8, 0x07, 0x22, - 0x94, 0xF8, 0x07, 0x22, 0x93, 0xF8, 0x07, 0x22, - 0x92, 0xF8, 0x07, 0x22, 0x91, 0xF8, 0x07, 0x22, - 0x90, 0xF8, 0x07, 0x22, 0x8F, 0xF8, 0x07, 0x22, - 0x8E, 0xF8, 0x07, 0x22, 0x8D, 0xF8, 0x07, 0x22, - 0x8C, 0xF8, 0x07, 0x22, 0x8B, 0xF8, 0x07, 0x22, - 0x8A, 0xF8, 0x07, 0x22, 0x89, 0xF8, 0x07, 0x22, - 0x88, 0xF8, 0x07, 0x22, 0x87, 0xF8, 0x07, 0x22, - 0x86, 0xF8, 0x07, 0x22, 0x85, 0xF8, 0x07, 0x22, - 0x84, 0xF8, 0x07, 0x22, 0x83, 0xF8, 0x07, 0x22, - 0x82, 0xF8, 0x07, 0x22, 0x81, 0xF8, 0x07, 0x22, - 0x80, 0xF8, 0x07, 0x22, 0x7F, 0xF8, 0x07, 0x22, - 0x7E, 0xF8, 0x07, 0x22, 0x7D, 0xF8, 0x07, 0x22, - 0x7C, 0xF8, 0x07, 0x22, 0x7B, 0xF8, 0x07, 0x22, - 0x7A, 0xF8, 0x07, 0x22, 0x79, 0xF8, 0x07, 0x22, - 0x78, 0xF8, 0x07, 0x22, 0x77, 0xF8, 0x07, 0x22, - 0x76, 0xF8, 0x07, 0x22, 0x75, 0xF8, 0x07, 0x22, - 0x74, 0xF8, 0x07, 0x22, 0x73, 0xF8, 0x07, 0x22, - 0x72, 0xF8, 0x07, 0x22, 0x71, 0xF8, 0x07, 0x22, - 0x70, 0xF8, 0x07, 0x22, 0x6F, 0xF8, 0x07, 0x22, - 0x6E, 0xF8, 0x07, 0x22, 0x6D, 0xF8, 0x07, 0x22, - 0x6C, 0xF8, 0x07, 0x22, 0x6B, 0xF8, 0x07, 0x22, - 0x6A, 0xF8, 0x07, 0x22, 0x69, 0xF8, 0x07, 0x22, - 0x68, 0xF8, 0x07, 0x22, 0x67, 0xF8, 0x07, 0x22, - 0x66, 0xF8, 0x07, 0x22, 0x65, 0xF8, 0x07, 0x22, - 0x64, 0xF8, 0x07, 0x22, 0x63, 0xF8, 0x07, 0x22, - 0x62, 0xF8, 0x07, 0x22, 0x61, 0xF8, 0x07, 0x22, - 0x60, 0xF8, 0x07, 0x22, 0x5F, 0xF8, 0x07, 0x22, - 0x5E, 0xF8, 0x07, 0x22, 0x5D, 0xF8, 0x07, 0x22, - 0x5C, 0xF8, 0x07, 0x22, 0x5B, 0xF8, 0x07, 0x22, - 0x5A, 0xF8, 0x07, 0x22, 0x59, 0xF8, 0x07, 0x22, - 0x58, 0xF8, 0x07, 0x22, 0x57, 0xF8, 0x07, 0x22, - 0x56, 0xF8, 0x07, 0x22, 0x55, 0xF8, 0x07, 0x22, - 0x54, 0xF8, 0x07, 0x22, 0x53, 0xF8, 0x07, 0x22, - 0x52, 0xF8, 0x07, 0x22, 0x51, 0xF8, 0x07, 0x22, - 0x50, 0xF8, 0x07, 0x22, 0x4F, 0xF8, 0x07, 0x22, - 0x4E, 0xF8, 0x07, 0x22, 0x4D, 0xF8, 0x07, 0x22, - 0x4C, 0xF8, 0x07, 0x22, 0x4B, 0xF8, 0x07, 0x22, - 0x4A, 0xF8, 0x07, 0x22, 0x49, 0xF8, 0x07, 0x22, - 0x48, 0xF8, 0x07, 0x22, 0x47, 0xF8, 0x07, 0x22, - 0x46, 0xF8, 0x07, 0x22, 0x45, 0xF8, 0x07, 0x22, - 0x44, 0xF8, 0x07, 0x22, 0x43, 0xF8, 0x07, 0x22, - 0x42, 0xF8, 0x07, 0x22, 0x41, 0xF8, 0x07, 0x22, - 0x40, 0xF8, 0x07, 0x22, 0x3F, 0xF8, 0x07, 0x22, - 0x3E, 0xF8, 0x07, 0x22, 0x3D, 0xF8, 0x07, 0x22, - 0x3C, 0xF8, 0x07, 0x22, 0x3B, 0xF8, 0x07, 0x22, - 0x3A, 0xF8, 0x07, 0x22, 0x39, 0xF8, 0x07, 0x22, - 0x38, 0xF8, 0x07, 0x22, 0x37, 0xF8, 0x07, 0x22, - 0x36, 0xF8, 0x07, 0x22, 0x35, 0xF8, 0x07, 0x22, - 0x34, 0xF8, 0x07, 0x22, 0x33, 0xF8, 0x07, 0x22, - 0x32, 0xF8, 0x07, 0x22, 0x31, 0xF8, 0x07, 0x22, - 0x30, 0xF8, 0x07, 0x22, 0x2F, 0xF8, 0x07, 0x22, - 0x2E, 0xF8, 0x07, 0x22, 0x2D, 0xF8, 0x07, 0x22, - 0x2C, 0xF8, 0x07, 0x22, 0x2B, 0xF8, 0x07, 0x22, - 0x2A, 0xF8, 0x07, 0x22, 0x29, 0xF8, 0x07, 0x22, - 0x28, 0xF8, 0x07, 0x22, 0x27, 0xF8, 0x07, 0x22, - 0x26, 0xF8, 0x07, 0x22, 0x25, 0xF8, 0x07, 0x22, - 0x24, 0xF8, 0x07, 0x22, 0x23, 0xF8, 0x07, 0x20, - 0x22, 0xF8, 0x07, 0x20, 0x21, 0xF8, 0x07, 0x20, - 0x20, 0xF8, 0x07, 0x20, 0x1F, 0xF8, 0x07, 0x20, - 0x1E, 0xF8, 0x07, 0x20, 0x1D, 0xF8, 0x07, 0x20, - 0x1C, 0xF8, 0x07, 0x20, 0x1C, 0xF8, 0x07, 0x00, - 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, - 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, - 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, - 0xD8, 0xF8, 0x27, 0x20, 0xD9, 0xF8, 0x27, 0x20, - 0xDA, 0xF8, 0x27, 0x20, 0xDB, 0xF8, 0x27, 0x20, - 0xDC, 0xF8, 0x27, 0x20, 0xDD, 0xF8, 0x27, 0x20, - 0xDE, 0xF8, 0x27, 0x20, 0xDF, 0xF8, 0x27, 0x20, - 0xE0, 0xF8, 0x27, 0x20, 0xE1, 0xF8, 0x27, 0x20, - 0xE2, 0xF8, 0x27, 0x20, 0xE3, 0xF8, 0x27, 0x20, - 0xE4, 0xF8, 0x27, 0x20, 0xE5, 0xF8, 0x27, 0x20, - 0xE6, 0xF8, 0x27, 0x20, 0xE7, 0xF8, 0x27, 0x20, - 0xE8, 0xF8, 0x27, 0x20, 0xE9, 0xF8, 0x27, 0x20, - 0xEA, 0xF8, 0x27, 0x20, 0xEB, 0xF8, 0x27, 0x20, - 0xEC, 0xF8, 0x27, 0x20, 0xED, 0xF8, 0x27, 0x20, - 0xEE, 0xF8, 0x27, 0x20, 0xEF, 0xF8, 0x27, 0x20, - 0xF0, 0xF8, 0x27, 0x20, 0xF1, 0xF8, 0x27, 0x20, - 0xF2, 0xF8, 0x27, 0x20, 0xF3, 0xF8, 0x27, 0x20, - 0xF4, 0xF8, 0x27, 0x20, 0xF5, 0xF8, 0x27, 0x20, - 0xF6, 0xF8, 0x27, 0x20, 0xF7, 0xF8, 0x27, 0x20, - 0xF8, 0xF8, 0x27, 0x20, 0xF9, 0xF8, 0x27, 0x20, - 0xFA, 0xF8, 0x27, 0x20, 0xFB, 0xF8, 0x27, 0x20, - 0xFC, 0xF8, 0x27, 0x20, 0xFD, 0xF8, 0x27, 0x20, - 0xFE, 0xF8, 0x27, 0x20, 0xFF, 0xF8, 0x27, 0x20, - 0x00, 0xF9, 0x27, 0x20, 0xD7, 0xF8, 0x27, 0x20, - 0x00, 0xF8, 0x27, 0x20, 0x01, 0xF8, 0x27, 0x20, - 0x02, 0xF8, 0x27, 0x20, 0x03, 0xF8, 0x27, 0x20, - 0x04, 0xF8, 0x27, 0x20, 0x05, 0xF8, 0x27, 0x20, - 0x06, 0xF8, 0x27, 0x20, 0x07, 0xF8, 0x27, 0x20, - 0x08, 0xF8, 0x27, 0x20, 0x09, 0xF8, 0x27, 0x20, - 0x0A, 0xF8, 0x27, 0x20, 0x0B, 0xF8, 0x27, 0x20, - 0x0C, 0xF8, 0x27, 0x20, 0x0D, 0xF8, 0x27, 0x20, - 0x0E, 0xF8, 0x27, 0x20, 0x0F, 0xF8, 0x27, 0x20, - 0x10, 0xF8, 0x27, 0x20, 0x11, 0xF8, 0x27, 0x20, - 0x12, 0xF8, 0x27, 0x20, 0x13, 0xF8, 0x27, 0x20, - 0x14, 0xF8, 0x27, 0x20, 0x15, 0xF8, 0x27, 0x20, - 0x15, 0xF8, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, - 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, - 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, - 0x04, 0x05, 0x00, 0x0E, 0x00, 0x0C, 0x20, 0xFD, - 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, 0x10, - 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x05, 0x00, 0x00, 0x03, 0x00, 0x09, - 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, - 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, - 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, - 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, - 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, 0x00, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, - 0x03, 0x00, 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, - 0x00, 0x88, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, - 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, - 0x00, 0x09, 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, - 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, - 0x94, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x03, 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, - 0x09, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x20, - 0x21, 0x04, 0x30, 0x07, 0x00, 0x00, 0x00, 0x04, - 0x03, 0x00, 0x09, 0x00, 0x60, 0x21, 0x04, 0x30, - 0x07, 0x00, 0x00, 0x00, 0x04, 0x15, 0x00, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x28, 0x00, - 0x00, 0x18, 0x00, 0x52, 0x01, 0x08, 0x00, 0x05, - 0x00, 0x0A, 0x00, 0xFA, 0x00, 0x1E, 0x00, 0xC8, - 0x00, 0x00, 0x00, 0x9F, 0x00, 0x38, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, - 0xFF, 0xFB, 0xF9, 0xFC, 0xFD, 0xFF, 0xFD, 0xFE, - 0x00, 0x01, 0x00, 0x00, 0x03, 0x01, 0x01, 0x02, - 0x06, 0x05, 0x05, 0x06, 0x05, 0x08, 0x0A, 0x06, - 0x09, 0x09, 0x06, 0x08, 0x05, 0x04, 0x03, 0x04, - 0x03, 0x05, 0x07, 0x07, 0x09, 0x05, 0x04, 0x03, - 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0xFF, 0x00, - 0xFF, 0x00, 0xFB, 0xFD, 0xFF, 0xFF, 0x01, 0xFF, - 0xFD, 0xFF, 0x01, 0x02, 0x01, 0xFE, 0xFF, 0x01, - 0xFE, 0xFC, 0x00, 0xFF, 0x01, 0x01, 0x00, 0x00, - 0xFF, 0xFF, 0x04, 0x03, 0x00, 0x01, 0xFE, 0x02, - 0x02, 0x03, 0x03, 0x00, 0xFF, 0xFA, 0xFB, 0xFC, - 0xFF, 0xFF, 0x02, 0xFF, 0x01, 0xFF, 0xFE, 0xFD, - 0xFF, 0xFE, 0xFB, 0xF9, 0xF9, 0xFC, 0xFC, 0xFC, - 0xF5, 0xF3, 0xF8, 0xF5, 0xF5, 0xF5, 0xF9, 0xFB, - 0xFE, 0xFC, 0xFA, 0xF8, 0xFC, 0xF9, 0xF7, 0xF6, - 0xF6, 0xF7, 0xFB, 0xF7, 0xF9, 0xF9, 0xF8, 0xF8, - 0xF1, 0xF6, 0xF9, 0xFC, 0xFE, 0xFC, 0xFE, 0x00, - 0xFB, 0xFE, 0xFC, 0xFC, 0xFC, 0xFB, 0xFD, 0xFB, - 0xFC, 0xFA, 0xFC, 0xFA, 0x01, 0x02, 0xFE, 0xFE, - 0xFC, 0xF7, 0xF4, 0xF4, 0xED, 0xE1, 0xD7, 0x01, - 0x04, 0x03, 0x04, 0x08, 0x0B, 0x09, 0x09, 0x09, - 0x05, 0x06, 0x08, 0x05, 0x03, 0x00, 0x00, 0x01, - 0x00, 0xFF, 0xFF, 0xFE, 0xFD, 0xFD, 0xFC, 0xFF, - 0x02, 0xFD, 0xFB, 0xFC, 0xFA, 0xFC, 0xFD, 0xFF, - 0xFF, 0xFC, 0xFC, 0xFB, 0xFC, 0xFE, 0xFF, 0x00, - 0x01, 0x0B, 0x09, 0x07, 0x06, 0x03, 0x06, 0x08, - 0x07, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0B, 0x0D, - 0x0E, 0x10, 0x15, 0x15, 0x19, 0x1B, 0x20, 0x01, - 0x00, 0xFF, 0xFF, 0xFE, 0xFD, 0xFD, 0xFC, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x02, 0xF0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE5, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xEA, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0x0A, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x01, 0xDE, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x02, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x00, 0x74, 0x01, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x74, 0x01, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0xF9, 0x87, 0x20, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x07, 0x20, + 0xBA, 0xF8, 0x07, 0x20, 0xB9, 0xF8, 0x07, 0x20, + 0xB8, 0xF8, 0x07, 0x20, 0xB7, 0xF8, 0x07, 0x20, + 0xB6, 0xF8, 0x07, 0x20, 0xB5, 0xF8, 0x07, 0x20, + 0xB4, 0xF8, 0x07, 0x20, 0xB3, 0xF8, 0x07, 0x20, + 0xB2, 0xF8, 0x07, 0x20, 0xB1, 0xF8, 0x07, 0x22, + 0xB0, 0xF8, 0x07, 0x22, 0xAF, 0xF8, 0x07, 0x22, + 0xAE, 0xF8, 0x07, 0x22, 0xAD, 0xF8, 0x07, 0x22, + 0xAC, 0xF8, 0x07, 0x22, 0xAB, 0xF8, 0x07, 0x22, + 0xAA, 0xF8, 0x07, 0x22, 0xA9, 0xF8, 0x07, 0x22, + 0xA8, 0xF8, 0x07, 0x22, 0xA7, 0xF8, 0x07, 0x22, + 0xA6, 0xF8, 0x07, 0x22, 0xA5, 0xF8, 0x07, 0x22, + 0xA4, 0xF8, 0x07, 0x22, 0xA3, 0xF8, 0x07, 0x22, + 0xA2, 0xF8, 0x07, 0x22, 0xA1, 0xF8, 0x07, 0x22, + 0xA0, 0xF8, 0x07, 0x22, 0x9F, 0xF8, 0x07, 0x22, + 0x9E, 0xF8, 0x07, 0x22, 0x9D, 0xF8, 0x07, 0x22, + 0x9C, 0xF8, 0x07, 0x22, 0x9B, 0xF8, 0x07, 0x22, + 0x9A, 0xF8, 0x07, 0x22, 0x99, 0xF8, 0x07, 0x22, + 0x98, 0xF8, 0x07, 0x22, 0x97, 0xF8, 0x07, 0x22, + 0x96, 0xF8, 0x07, 0x22, 0x95, 0xF8, 0x07, 0x22, + 0x94, 0xF8, 0x07, 0x22, 0x93, 0xF8, 0x07, 0x22, + 0x92, 0xF8, 0x07, 0x22, 0x91, 0xF8, 0x07, 0x22, + 0x90, 0xF8, 0x07, 0x22, 0x8F, 0xF8, 0x07, 0x22, + 0x8E, 0xF8, 0x07, 0x22, 0x8D, 0xF8, 0x07, 0x22, + 0x8C, 0xF8, 0x07, 0x22, 0x8B, 0xF8, 0x07, 0x22, + 0x8A, 0xF8, 0x07, 0x22, 0x89, 0xF8, 0x07, 0x22, + 0x88, 0xF8, 0x07, 0x22, 0x87, 0xF8, 0x07, 0x22, + 0x86, 0xF8, 0x07, 0x22, 0x85, 0xF8, 0x07, 0x22, + 0x84, 0xF8, 0x07, 0x22, 0x83, 0xF8, 0x07, 0x22, + 0x82, 0xF8, 0x07, 0x22, 0x81, 0xF8, 0x07, 0x22, + 0x80, 0xF8, 0x07, 0x22, 0x7F, 0xF8, 0x07, 0x22, + 0x7E, 0xF8, 0x07, 0x22, 0x7D, 0xF8, 0x07, 0x22, + 0x7C, 0xF8, 0x07, 0x22, 0x7B, 0xF8, 0x07, 0x22, + 0x7A, 0xF8, 0x07, 0x22, 0x79, 0xF8, 0x07, 0x22, + 0x78, 0xF8, 0x07, 0x22, 0x77, 0xF8, 0x07, 0x22, + 0x76, 0xF8, 0x07, 0x22, 0x75, 0xF8, 0x07, 0x22, + 0x74, 0xF8, 0x07, 0x22, 0x73, 0xF8, 0x07, 0x22, + 0x72, 0xF8, 0x07, 0x22, 0x71, 0xF8, 0x07, 0x22, + 0x70, 0xF8, 0x07, 0x22, 0x6F, 0xF8, 0x07, 0x22, + 0x6E, 0xF8, 0x07, 0x22, 0x6D, 0xF8, 0x07, 0x22, + 0x6C, 0xF8, 0x07, 0x22, 0x6B, 0xF8, 0x07, 0x22, + 0x6A, 0xF8, 0x07, 0x22, 0x69, 0xF8, 0x07, 0x22, + 0x68, 0xF8, 0x07, 0x22, 0x67, 0xF8, 0x07, 0x22, + 0x66, 0xF8, 0x07, 0x22, 0x65, 0xF8, 0x07, 0x22, + 0x64, 0xF8, 0x07, 0x22, 0x63, 0xF8, 0x07, 0x22, + 0x62, 0xF8, 0x07, 0x22, 0x61, 0xF8, 0x07, 0x22, + 0x60, 0xF8, 0x07, 0x22, 0x5F, 0xF8, 0x07, 0x22, + 0x5E, 0xF8, 0x07, 0x22, 0x5D, 0xF8, 0x07, 0x22, + 0x5C, 0xF8, 0x07, 0x22, 0x5B, 0xF8, 0x07, 0x22, + 0x5A, 0xF8, 0x07, 0x22, 0x59, 0xF8, 0x07, 0x22, + 0x58, 0xF8, 0x07, 0x22, 0x57, 0xF8, 0x07, 0x22, + 0x56, 0xF8, 0x07, 0x22, 0x55, 0xF8, 0x07, 0x22, + 0x54, 0xF8, 0x07, 0x22, 0x53, 0xF8, 0x07, 0x22, + 0x52, 0xF8, 0x07, 0x22, 0x51, 0xF8, 0x07, 0x22, + 0x50, 0xF8, 0x07, 0x22, 0x4F, 0xF8, 0x07, 0x22, + 0x4E, 0xF8, 0x07, 0x22, 0x4D, 0xF8, 0x07, 0x22, + 0x4C, 0xF8, 0x07, 0x22, 0x4B, 0xF8, 0x07, 0x22, + 0x4A, 0xF8, 0x07, 0x22, 0x49, 0xF8, 0x07, 0x22, + 0x48, 0xF8, 0x07, 0x22, 0x47, 0xF8, 0x07, 0x22, + 0x46, 0xF8, 0x07, 0x22, 0x45, 0xF8, 0x07, 0x22, + 0x44, 0xF8, 0x07, 0x22, 0x43, 0xF8, 0x07, 0x22, + 0x42, 0xF8, 0x07, 0x22, 0x41, 0xF8, 0x07, 0x22, + 0x40, 0xF8, 0x07, 0x22, 0x3F, 0xF8, 0x07, 0x22, + 0x3E, 0xF8, 0x07, 0x22, 0x3D, 0xF8, 0x07, 0x22, + 0x3C, 0xF8, 0x07, 0x22, 0x3B, 0xF8, 0x07, 0x22, + 0x3A, 0xF8, 0x07, 0x22, 0x39, 0xF8, 0x07, 0x22, + 0x38, 0xF8, 0x07, 0x22, 0x37, 0xF8, 0x07, 0x22, + 0x36, 0xF8, 0x07, 0x22, 0x35, 0xF8, 0x07, 0x22, + 0x34, 0xF8, 0x07, 0x22, 0x33, 0xF8, 0x07, 0x22, + 0x32, 0xF8, 0x07, 0x22, 0x31, 0xF8, 0x07, 0x22, + 0x30, 0xF8, 0x07, 0x22, 0x2F, 0xF8, 0x07, 0x22, + 0x2E, 0xF8, 0x07, 0x22, 0x2D, 0xF8, 0x07, 0x22, + 0x2C, 0xF8, 0x07, 0x22, 0x2B, 0xF8, 0x07, 0x22, + 0x2A, 0xF8, 0x07, 0x22, 0x29, 0xF8, 0x07, 0x22, + 0x28, 0xF8, 0x07, 0x22, 0x27, 0xF8, 0x07, 0x22, + 0x26, 0xF8, 0x07, 0x22, 0x25, 0xF8, 0x07, 0x22, + 0x24, 0xF8, 0x07, 0x22, 0x23, 0xF8, 0x07, 0x20, + 0x22, 0xF8, 0x07, 0x20, 0x21, 0xF8, 0x07, 0x20, + 0x20, 0xF8, 0x07, 0x20, 0x1F, 0xF8, 0x07, 0x20, + 0x1E, 0xF8, 0x07, 0x20, 0x1D, 0xF8, 0x07, 0x20, + 0x1C, 0xF8, 0x07, 0x20, 0x1C, 0xF8, 0x07, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD8, 0xF8, 0x27, 0x20, 0xD9, 0xF8, 0x27, 0x20, + 0xDA, 0xF8, 0x27, 0x20, 0xDB, 0xF8, 0x27, 0x20, + 0xDC, 0xF8, 0x27, 0x20, 0xDD, 0xF8, 0x27, 0x20, + 0xDE, 0xF8, 0x27, 0x20, 0xDF, 0xF8, 0x27, 0x20, + 0xE0, 0xF8, 0x27, 0x20, 0xE1, 0xF8, 0x27, 0x20, + 0xE2, 0xF8, 0x27, 0x20, 0xE3, 0xF8, 0x27, 0x20, + 0xE4, 0xF8, 0x27, 0x20, 0xE5, 0xF8, 0x27, 0x20, + 0xE6, 0xF8, 0x27, 0x20, 0xE7, 0xF8, 0x27, 0x20, + 0xE8, 0xF8, 0x27, 0x20, 0xE9, 0xF8, 0x27, 0x20, + 0xEA, 0xF8, 0x27, 0x20, 0xEB, 0xF8, 0x27, 0x20, + 0xEC, 0xF8, 0x27, 0x20, 0xED, 0xF8, 0x27, 0x20, + 0xEE, 0xF8, 0x27, 0x20, 0xEF, 0xF8, 0x27, 0x20, + 0xF0, 0xF8, 0x27, 0x20, 0xF1, 0xF8, 0x27, 0x20, + 0xF2, 0xF8, 0x27, 0x20, 0xF3, 0xF8, 0x27, 0x20, + 0xF4, 0xF8, 0x27, 0x20, 0xF5, 0xF8, 0x27, 0x20, + 0xF6, 0xF8, 0x27, 0x20, 0xF7, 0xF8, 0x27, 0x20, + 0xF8, 0xF8, 0x27, 0x20, 0xF9, 0xF8, 0x27, 0x20, + 0xFA, 0xF8, 0x27, 0x20, 0xFB, 0xF8, 0x27, 0x20, + 0xFC, 0xF8, 0x27, 0x20, 0xFD, 0xF8, 0x27, 0x20, + 0xFE, 0xF8, 0x27, 0x20, 0xFF, 0xF8, 0x27, 0x20, + 0x00, 0xF9, 0x27, 0x20, 0xD7, 0xF8, 0x27, 0x20, + 0x00, 0xF8, 0x27, 0x20, 0x01, 0xF8, 0x27, 0x20, + 0x02, 0xF8, 0x27, 0x20, 0x03, 0xF8, 0x27, 0x20, + 0x04, 0xF8, 0x27, 0x20, 0x05, 0xF8, 0x27, 0x20, + 0x06, 0xF8, 0x27, 0x20, 0x07, 0xF8, 0x27, 0x20, + 0x08, 0xF8, 0x27, 0x20, 0x09, 0xF8, 0x27, 0x20, + 0x0A, 0xF8, 0x27, 0x20, 0x0B, 0xF8, 0x27, 0x20, + 0x0C, 0xF8, 0x27, 0x20, 0x0D, 0xF8, 0x27, 0x20, + 0x0E, 0xF8, 0x27, 0x20, 0x0F, 0xF8, 0x27, 0x20, + 0x10, 0xF8, 0x27, 0x20, 0x11, 0xF8, 0x27, 0x20, + 0x12, 0xF8, 0x27, 0x20, 0x13, 0xF8, 0x27, 0x20, + 0x14, 0xF8, 0x27, 0x20, 0x15, 0xF8, 0x27, 0x20, + 0x15, 0xF8, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 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, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x05, 0x00, 0x0E, 0x00, 0x0C, 0x20, 0xFD, + 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, 0x10, + 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x05, 0x00, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, + 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, + 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, + 0x03, 0x00, 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x88, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x94, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x20, + 0x21, 0x04, 0x30, 0x07, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x60, 0x21, 0x04, 0x30, + 0x07, 0x00, 0x00, 0x00, 0x04, 0x15, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x28, 0x00, + 0x00, 0x18, 0x00, 0x52, 0x01, 0x08, 0x00, 0x05, + 0x00, 0x0A, 0x00, 0xFA, 0x00, 0x1E, 0x00, 0xC8, + 0x00, 0x00, 0x00, 0x9F, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xFF, 0xFB, 0xF9, 0xFC, 0xFD, 0xFF, 0xFD, 0xFE, + 0x00, 0x01, 0x00, 0x00, 0x03, 0x01, 0x01, 0x02, + 0x06, 0x05, 0x05, 0x06, 0x05, 0x08, 0x0A, 0x06, + 0x09, 0x09, 0x06, 0x08, 0x05, 0x04, 0x03, 0x04, + 0x03, 0x05, 0x07, 0x07, 0x09, 0x05, 0x04, 0x03, + 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0xFF, 0x00, + 0xFF, 0x00, 0xFB, 0xFD, 0xFF, 0xFF, 0x01, 0xFF, + 0xFD, 0xFF, 0x01, 0x02, 0x01, 0xFE, 0xFF, 0x01, + 0xFE, 0xFC, 0x00, 0xFF, 0x01, 0x01, 0x00, 0x00, + 0xFF, 0xFF, 0x04, 0x03, 0x00, 0x01, 0xFE, 0x02, + 0x02, 0x03, 0x03, 0x00, 0xFF, 0xFA, 0xFB, 0xFC, + 0xFF, 0xFF, 0x02, 0xFF, 0x01, 0xFF, 0xFE, 0xFD, + 0xFF, 0xFE, 0xFB, 0xF9, 0xF9, 0xFC, 0xFC, 0xFC, + 0xF5, 0xF3, 0xF8, 0xF5, 0xF5, 0xF5, 0xF9, 0xFB, + 0xFE, 0xFC, 0xFA, 0xF8, 0xFC, 0xF9, 0xF7, 0xF6, + 0xF6, 0xF7, 0xFB, 0xF7, 0xF9, 0xF9, 0xF8, 0xF8, + 0xF1, 0xF6, 0xF9, 0xFC, 0xFE, 0xFC, 0xFE, 0x00, + 0xFB, 0xFE, 0xFC, 0xFC, 0xFC, 0xFB, 0xFD, 0xFB, + 0xFC, 0xFA, 0xFC, 0xFA, 0x01, 0x02, 0xFE, 0xFE, + 0xFC, 0xF7, 0xF4, 0xF4, 0xED, 0xE1, 0xD7, 0x01, + 0x04, 0x03, 0x04, 0x08, 0x0B, 0x09, 0x09, 0x09, + 0x05, 0x06, 0x08, 0x05, 0x03, 0x00, 0x00, 0x01, + 0x00, 0xFF, 0xFF, 0xFE, 0xFD, 0xFD, 0xFC, 0xFF, + 0x02, 0xFD, 0xFB, 0xFC, 0xFA, 0xFC, 0xFD, 0xFF, + 0xFF, 0xFC, 0xFC, 0xFB, 0xFC, 0xFE, 0xFF, 0x00, + 0x01, 0x0B, 0x09, 0x07, 0x06, 0x03, 0x06, 0x08, + 0x07, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0B, 0x0D, + 0x0E, 0x10, 0x15, 0x15, 0x19, 0x1B, 0x20, 0x01, + 0x00, 0xFF, 0xFF, 0xFE, 0xFD, 0xFD, 0xFC, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, }; #endif diff --git a/libfprint/drivers/virtual-image.c b/libfprint/drivers/virtual-image.c index 17ebb14..6fdd3db 100644 --- a/libfprint/drivers/virtual-image.c +++ b/libfprint/drivers/virtual-image.c @@ -36,60 +36,64 @@ #include #include -struct _FpDeviceVirtualImage { - FpImageDevice parent; +struct _FpDeviceVirtualImage +{ + FpImageDevice parent; - GSocketListener *listener; - GSocketConnection *connection; - GCancellable *cancellable; + GSocketListener *listener; + GSocketConnection *connection; + GCancellable *cancellable; - gint socket_fd; - gint client_fd; + gint socket_fd; + gint client_fd; - FpImage *recv_img; - gint recv_img_hdr[2]; + FpImage *recv_img; + gint recv_img_hdr[2]; }; G_DECLARE_FINAL_TYPE (FpDeviceVirtualImage, fpi_device_virtual_image, FPI, DEVICE_VIRTUAL_IMAGE, FpImageDevice) G_DEFINE_TYPE (FpDeviceVirtualImage, fpi_device_virtual_image, FP_TYPE_IMAGE_DEVICE) static void start_listen (FpDeviceVirtualImage *dev); -static void recv_image (FpDeviceVirtualImage *dev, GInputStream *stream); +static void recv_image (FpDeviceVirtualImage *dev, + GInputStream *stream); static void recv_image_img_recv_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { - g_autoptr(GError) error = NULL; - FpDeviceVirtualImage *self; - FpImageDevice *device; - gssize bytes; + g_autoptr(GError) error = NULL; + FpDeviceVirtualImage *self; + FpImageDevice *device; + gssize bytes; - bytes = g_input_stream_read_finish (G_INPUT_STREAM (source_object), res, &error); + bytes = g_input_stream_read_finish (G_INPUT_STREAM (source_object), res, &error); - if (bytes <= 0) { - if (bytes < 0) { - g_warning ("Error receiving header for image data: %s", error->message); - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - return; - } + if (bytes <= 0) + { + if (bytes < 0) + { + g_warning ("Error receiving header for image data: %s", error->message); + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + } - self = FPI_DEVICE_VIRTUAL_IMAGE (user_data); - g_io_stream_close (G_IO_STREAM (self->connection), NULL, NULL); - self->connection = NULL; - return; - } + self = FPI_DEVICE_VIRTUAL_IMAGE (user_data); + g_io_stream_close (G_IO_STREAM (self->connection), NULL, NULL); + self->connection = NULL; + return; + } - self = FPI_DEVICE_VIRTUAL_IMAGE (user_data); - device = FP_IMAGE_DEVICE (self); + self = FPI_DEVICE_VIRTUAL_IMAGE (user_data); + device = FP_IMAGE_DEVICE (self); - fpi_image_device_report_finger_status (device, TRUE); - fpi_image_device_image_captured (device, g_steal_pointer (&self->recv_img)); - fpi_image_device_report_finger_status (device, FALSE); + fpi_image_device_report_finger_status (device, TRUE); + fpi_image_device_image_captured (device, g_steal_pointer (&self->recv_img)); + fpi_image_device_report_finger_status (device, FALSE); - /* And, listen for more images from the same client. */ - recv_image(self, G_INPUT_STREAM (source_object)); + /* And, listen for more images from the same client. */ + recv_image (self, G_INPUT_STREAM (source_object)); } static void @@ -97,180 +101,189 @@ recv_image_hdr_recv_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { - g_autoptr(GError) error = NULL; - FpDeviceVirtualImage *self; - gssize bytes; + g_autoptr(GError) error = NULL; + FpDeviceVirtualImage *self; + gssize bytes; - bytes = g_input_stream_read_finish (G_INPUT_STREAM (source_object), res, &error); + bytes = g_input_stream_read_finish (G_INPUT_STREAM (source_object), res, &error); - if (bytes <= 0) { - if (bytes < 0) { - g_warning ("Error receiving header for image data: %s", error->message); - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - return; - } + if (bytes <= 0) + { + if (bytes < 0) + { + g_warning ("Error receiving header for image data: %s", error->message); + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + } - self = FPI_DEVICE_VIRTUAL_IMAGE (user_data); - g_io_stream_close (G_IO_STREAM (self->connection), NULL, NULL); - self->connection = NULL; - return; - } + self = FPI_DEVICE_VIRTUAL_IMAGE (user_data); + g_io_stream_close (G_IO_STREAM (self->connection), NULL, NULL); + self->connection = NULL; + return; + } - self = FPI_DEVICE_VIRTUAL_IMAGE (user_data); - if (self->recv_img_hdr[0] > 5000 || self->recv_img_hdr[1] > 5000) { - g_warning ("Image header suggests an unrealistically large image, disconnecting client."); - g_io_stream_close (G_IO_STREAM (self->connection), NULL, NULL); - self->connection = NULL; - } + self = FPI_DEVICE_VIRTUAL_IMAGE (user_data); + if (self->recv_img_hdr[0] > 5000 || self->recv_img_hdr[1] > 5000) + { + g_warning ("Image header suggests an unrealistically large image, disconnecting client."); + g_io_stream_close (G_IO_STREAM (self->connection), NULL, NULL); + self->connection = NULL; + } - if (self->recv_img_hdr[0] < 0 || self->recv_img_hdr[1] < 0) { - switch (self->recv_img_hdr[0]) { - case -1: - /* -1 is a retry error, just pass it through */ - fpi_image_device_retry_scan (FP_IMAGE_DEVICE (self), self->recv_img_hdr[1]); - break; + if (self->recv_img_hdr[0] < 0 || self->recv_img_hdr[1] < 0) + { + switch (self->recv_img_hdr[0]) + { + case -1: + /* -1 is a retry error, just pass it through */ + fpi_image_device_retry_scan (FP_IMAGE_DEVICE (self), self->recv_img_hdr[1]); + break; - case -2: - /* -2 is a fatal error, just pass it through*/ - fpi_image_device_session_error (FP_IMAGE_DEVICE (self), - fpi_device_error_new (self->recv_img_hdr[1])); - break; + case -2: + /* -2 is a fatal error, just pass it through*/ + fpi_image_device_session_error (FP_IMAGE_DEVICE (self), + fpi_device_error_new (self->recv_img_hdr[1])); + break; - default: - /* disconnect client, it didn't play fair */ - g_io_stream_close (G_IO_STREAM (self->connection), NULL, NULL); - self->connection = NULL; - } + default: + /* disconnect client, it didn't play fair */ + g_io_stream_close (G_IO_STREAM (self->connection), NULL, NULL); + self->connection = NULL; + } - /* And, listen for more images from the same client. */ - recv_image(self, G_INPUT_STREAM (source_object)); - return; - } + /* And, listen for more images from the same client. */ + recv_image (self, G_INPUT_STREAM (source_object)); + return; + } - self->recv_img = fp_image_new (self->recv_img_hdr[0], self->recv_img_hdr[1]); - g_debug ("image data: %p", self->recv_img->data); - g_input_stream_read_async (G_INPUT_STREAM (source_object), - (guint8*)self->recv_img->data, - self->recv_img->width * self->recv_img->height, - G_PRIORITY_DEFAULT, - self->cancellable, - recv_image_img_recv_cb, - self); + self->recv_img = fp_image_new (self->recv_img_hdr[0], self->recv_img_hdr[1]); + g_debug ("image data: %p", self->recv_img->data); + g_input_stream_read_async (G_INPUT_STREAM (source_object), + (guint8 *) self->recv_img->data, + self->recv_img->width * self->recv_img->height, + G_PRIORITY_DEFAULT, + self->cancellable, + recv_image_img_recv_cb, + self); } static void recv_image (FpDeviceVirtualImage *dev, GInputStream *stream) { - g_input_stream_read_async (stream, - dev->recv_img_hdr, - sizeof(dev->recv_img_hdr), - G_PRIORITY_DEFAULT, - dev->cancellable, - recv_image_hdr_recv_cb, - dev); + g_input_stream_read_async (stream, + dev->recv_img_hdr, + sizeof (dev->recv_img_hdr), + G_PRIORITY_DEFAULT, + dev->cancellable, + recv_image_hdr_recv_cb, + dev); } static void new_connection_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { - g_autoptr(GError) error = NULL; - GSocketConnection *connection; - GInputStream *stream; - FpDeviceVirtualImage *dev = user_data; + g_autoptr(GError) error = NULL; + GSocketConnection *connection; + GInputStream *stream; + FpDeviceVirtualImage *dev = user_data; - connection = g_socket_listener_accept_finish (G_SOCKET_LISTENER (source_object), - res, - NULL, - &error); - if (!connection) { - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - return; + connection = g_socket_listener_accept_finish (G_SOCKET_LISTENER (source_object), + res, + NULL, + &error); + if (!connection) + { + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; - g_warning ("Error accepting a new connection: %s", error->message); - start_listen(dev); - } + g_warning ("Error accepting a new connection: %s", error->message); + start_listen (dev); + } - /* Always further connections (but we disconnect them immediately - * if we already have a connection). */ - start_listen(dev); - if (dev->connection) { - g_io_stream_close (G_IO_STREAM (connection), NULL, NULL); - return; - } + /* Always further connections (but we disconnect them immediately + * if we already have a connection). */ + start_listen (dev); + if (dev->connection) + { + g_io_stream_close (G_IO_STREAM (connection), NULL, NULL); + return; + } - dev->connection = connection; - stream = g_io_stream_get_input_stream (G_IO_STREAM (connection)); + dev->connection = connection; + stream = g_io_stream_get_input_stream (G_IO_STREAM (connection)); - recv_image (dev, stream); + recv_image (dev, stream); - fp_dbg("Got a new connection!"); + fp_dbg ("Got a new connection!"); } static void start_listen (FpDeviceVirtualImage *dev) { - g_socket_listener_accept_async (dev->listener, - dev->cancellable, - new_connection_cb, - dev); + g_socket_listener_accept_async (dev->listener, + dev->cancellable, + new_connection_cb, + dev); } static void -dev_init(FpImageDevice *dev) +dev_init (FpImageDevice *dev) { - g_autoptr(GError) error = NULL; - g_autoptr(GSocketListener) listener = NULL; - FpDeviceVirtualImage *self = FPI_DEVICE_VIRTUAL_IMAGE (dev); - const char *env; - g_autoptr(GSocketAddress) addr = NULL; - G_DEBUG_HERE(); + g_autoptr(GError) error = NULL; + g_autoptr(GSocketListener) listener = NULL; + FpDeviceVirtualImage *self = FPI_DEVICE_VIRTUAL_IMAGE (dev); + const char *env; + g_autoptr(GSocketAddress) addr = NULL; + G_DEBUG_HERE (); - self->client_fd = -1; + self->client_fd = -1; - env = fpi_device_get_virtual_env (FP_DEVICE (self)); + env = fpi_device_get_virtual_env (FP_DEVICE (self)); - listener = g_socket_listener_new (); - g_socket_listener_set_backlog (listener, 1); + listener = g_socket_listener_new (); + g_socket_listener_set_backlog (listener, 1); - /* Remove any left over socket. */ - g_unlink (env); + /* Remove any left over socket. */ + g_unlink (env); - addr = g_unix_socket_address_new (env); + addr = g_unix_socket_address_new (env); - if (!g_socket_listener_add_address (listener, - addr, - G_SOCKET_TYPE_STREAM, - G_SOCKET_PROTOCOL_DEFAULT, - NULL, - NULL, - &error)) { - g_warning ("Could not listen on unix socket: %s", error->message); + if (!g_socket_listener_add_address (listener, + addr, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT, + NULL, + NULL, + &error)) + { + g_warning ("Could not listen on unix socket: %s", error->message); - fpi_image_device_open_complete (FP_IMAGE_DEVICE (dev), g_steal_pointer (&error)); + fpi_image_device_open_complete (FP_IMAGE_DEVICE (dev), g_steal_pointer (&error)); - return; - } + return; + } - self->listener = g_steal_pointer (&listener); - self->cancellable = g_cancellable_new (); + self->listener = g_steal_pointer (&listener); + self->cancellable = g_cancellable_new (); - start_listen (self); + start_listen (self); - fpi_image_device_open_complete (dev, NULL); + fpi_image_device_open_complete (dev, NULL); } -static void dev_deinit(FpImageDevice *dev) +static void +dev_deinit (FpImageDevice *dev) { - FpDeviceVirtualImage *self = FPI_DEVICE_VIRTUAL_IMAGE (dev); + FpDeviceVirtualImage *self = FPI_DEVICE_VIRTUAL_IMAGE (dev); - G_DEBUG_HERE(); + G_DEBUG_HERE (); - g_cancellable_cancel (self->cancellable); - g_clear_object (&self->cancellable); - g_clear_object (&self->listener); - g_clear_object (&self->connection); + g_cancellable_cancel (self->cancellable); + g_clear_object (&self->cancellable); + g_clear_object (&self->listener); + g_clear_object (&self->connection); - fpi_image_device_close_complete(dev, NULL); + fpi_image_device_close_complete (dev, NULL); } static void @@ -279,22 +292,21 @@ fpi_device_virtual_image_init (FpDeviceVirtualImage *self) } static const FpIdEntry driver_ids[] = { - { .virtual_envvar = "FP_VIRTUAL_IMAGE" }, - { .virtual_envvar = NULL } + { .virtual_envvar = "FP_VIRTUAL_IMAGE" }, + { .virtual_envvar = NULL } }; static void fpi_device_virtual_image_class_init (FpDeviceVirtualImageClass *klass) { - FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); - FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); + FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); + FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); - dev_class->id = FP_COMPONENT; - dev_class->full_name = "Virtual image device for debugging"; - dev_class->type = FP_DEVICE_TYPE_VIRTUAL; - dev_class->id_table = driver_ids; + dev_class->id = FP_COMPONENT; + dev_class->full_name = "Virtual image device for debugging"; + dev_class->type = FP_DEVICE_TYPE_VIRTUAL; + dev_class->id_table = driver_ids; - img_class->img_open = dev_init; - img_class->img_close = dev_deinit; + img_class->img_open = dev_init; + img_class->img_close = dev_deinit; } - diff --git a/libfprint/fp_internal.h b/libfprint/fp_internal.h index 0f4df4a..8147089 100644 --- a/libfprint/fp_internal.h +++ b/libfprint/fp_internal.h @@ -26,26 +26,28 @@ #include "fpi-image-device.h" /* fp_minutia structure definition */ -struct fp_minutia { - int x; - int y; - int ex; - int ey; - int direction; - double reliability; - int type; - int appearing; - int feature_id; - int *nbrs; - int *ridge_counts; - int num_nbrs; +struct fp_minutia +{ + int x; + int y; + int ex; + int ey; + int direction; + double reliability; + int type; + int appearing; + int feature_id; + int *nbrs; + int *ridge_counts; + int num_nbrs; }; /* fp_minutiae structure definition */ -struct fp_minutiae { - int alloc; - int num; - struct fp_minutia **list; +struct fp_minutiae +{ + int alloc; + int num; + struct fp_minutia **list; }; diff --git a/libfprint/fprint-list-supported-devices.c b/libfprint/fprint-list-supported-devices.c index 23096ea..124e9d9 100644 --- a/libfprint/fprint-list-supported-devices.c +++ b/libfprint/fprint-list-supported-devices.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Red Hat + * Copyright (C) 2009 Red Hat * Copyright (C) 2008 Bastien Nocera * Copyright (C) 2008 Timo Hoenig , * Coypright (C) 2019 Benjamin Berg @@ -28,9 +28,10 @@ GHashTable *printed = NULL; -static GList *insert_drivers (GList *list) +static GList * +insert_drivers (GList *list) { - g_autoptr(GArray) drivers = g_array_new (FALSE, FALSE, sizeof(GType)); + g_autoptr(GArray) drivers = g_array_new (FALSE, FALSE, sizeof (GType)); gint i; fpi_get_driver_types (drivers); @@ -42,10 +43,11 @@ static GList *insert_drivers (GList *list) FpDeviceClass *cls = FP_DEVICE_CLASS (g_type_class_ref (driver)); const FpIdEntry *entry; - if (cls->type != FP_DEVICE_TYPE_USB) { - g_type_class_unref (cls); - continue; - } + if (cls->type != FP_DEVICE_TYPE_USB) + { + g_type_class_unref (cls); + continue; + } for (entry = cls->id_table; entry->vid; entry++) { @@ -53,53 +55,55 @@ static GList *insert_drivers (GList *list) key = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid); - if (g_hash_table_lookup (printed, key) != NULL) { - g_free (key); - continue; - } + if (g_hash_table_lookup (printed, key) != NULL) + { + g_free (key); + continue; + } - g_hash_table_insert (printed, key, GINT_TO_POINTER (1)); + g_hash_table_insert (printed, key, GINT_TO_POINTER (1)); - list = g_list_prepend (list, g_strdup_printf ("%s | %s\n", key, cls->full_name)); + list = g_list_prepend (list, g_strdup_printf ("%s | %s\n", key, cls->full_name)); } g_type_class_unref (cls); } - return list; + return list; } -int main (int argc, char **argv) +int +main (int argc, char **argv) { - GList *list, *l; + GList *list, *l; - setlocale (LC_ALL, ""); + setlocale (LC_ALL, ""); - printed = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + printed = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); - g_print ("%% lifprint — Supported Devices\n"); - g_print ("%% Bastien Nocera, Daniel Drake\n"); - g_print ("%% 2018\n"); - g_print ("\n"); + g_print ("%% lifprint — Supported Devices\n"); + g_print ("%% Bastien Nocera, Daniel Drake\n"); + g_print ("%% 2018\n"); + g_print ("\n"); - g_print ("# Supported Devices\n"); - g_print ("\n"); - g_print ("This is a list of supported devices in libfprint's development version. Those drivers might not all be available in the stable, released version. If in doubt, contact your distribution or systems integrator for details.\n"); - g_print ("\n"); - g_print ("## USB devices\n"); - g_print ("\n"); - g_print ("USB ID | Driver\n"); - g_print ("------------ | ------------\n"); + g_print ("# Supported Devices\n"); + g_print ("\n"); + g_print ("This is a list of supported devices in libfprint's development version. Those drivers might not all be available in the stable, released version. If in doubt, contact your distribution or systems integrator for details.\n"); + g_print ("\n"); + g_print ("## USB devices\n"); + g_print ("\n"); + g_print ("USB ID | Driver\n"); + g_print ("------------ | ------------\n"); - list = NULL; - list = insert_drivers (list); + list = NULL; + list = insert_drivers (list); - list = g_list_sort (list, (GCompareFunc) g_strcmp0); - for (l = list; l != NULL; l = l->next) - g_print ("%s", (char *) l->data); + list = g_list_sort (list, (GCompareFunc) g_strcmp0); + for (l = list; l != NULL; l = l->next) + g_print ("%s", (char *) l->data); - g_list_free_full (list, g_free); - g_hash_table_destroy (printed); + g_list_free_full (list, g_free); + g_hash_table_destroy (printed); - return 0; + return 0; } diff --git a/libfprint/fprint-list-udev-rules.c b/libfprint/fprint-list-udev-rules.c index 76f8486..0c1b059 100644 --- a/libfprint/fprint-list-udev-rules.c +++ b/libfprint/fprint-list-udev-rules.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Red Hat + * Copyright (C) 2009 Red Hat * Copyright (C) 2008 Bastien Nocera * Copyright (C) 2008 Timo Hoenig , * Coypright (C) 2019 Benjamin Berg @@ -25,100 +25,105 @@ #include "fpi-device.h" static const FpIdEntry whitelist_id_table[] = { - /* Unsupported (for now) Validity Sensors finger print readers */ - { .vid = 0x138a, .pid = 0x0090 }, /* Found on e.g. Lenovo T460s */ - { .vid = 0x138a, .pid = 0x0091 }, - { .vid = 0x138a, .pid = 0x0094 }, - { .vid = 0x138a, .pid = 0x0097 }, /* Found on e.g. Lenovo T470s */ - { .vid = 0 }, + /* Unsupported (for now) Validity Sensors finger print readers */ + { .vid = 0x138a, .pid = 0x0090 }, /* Found on e.g. Lenovo T460s */ + { .vid = 0x138a, .pid = 0x0091 }, + { .vid = 0x138a, .pid = 0x0094 }, + { .vid = 0x138a, .pid = 0x0097 }, /* Found on e.g. Lenovo T470s */ + { .vid = 0 }, }; static const FpIdEntry blacklist_id_table[] = { - { .vid = 0x0483, .pid = 0x2016 }, - /* https://bugs.freedesktop.org/show_bug.cgi?id=66659 */ - { .vid = 0x045e, .pid = 0x00bb }, - { .vid = 0 }, + { .vid = 0x0483, .pid = 0x2016 }, + /* https://bugs.freedesktop.org/show_bug.cgi?id=66659 */ + { .vid = 0x045e, .pid = 0x00bb }, + { .vid = 0 }, }; static const FpDeviceClass whitelist = { - .type = FP_DEVICE_TYPE_USB, - .id_table = whitelist_id_table, - .full_name = "Hardcoded whitelist" + .type = FP_DEVICE_TYPE_USB, + .id_table = whitelist_id_table, + .full_name = "Hardcoded whitelist" }; GHashTable *printed = NULL; -static void print_driver (const FpDeviceClass *cls) +static void +print_driver (const FpDeviceClass *cls) { - const FpIdEntry *entry; - gint num_printed = 0; + const FpIdEntry *entry; + gint num_printed = 0; - if (cls->type != FP_DEVICE_TYPE_USB) - return; + if (cls->type != FP_DEVICE_TYPE_USB) + return; - for (entry = cls->id_table; entry->vid != 0; entry++) { - const FpIdEntry *bl_entry; - char *key; + for (entry = cls->id_table; entry->vid != 0; entry++) + { + const FpIdEntry *bl_entry; + char *key; - for (bl_entry = blacklist_id_table; bl_entry->vid != 0; bl_entry++) { - if (entry->vid == bl_entry->vid && entry->pid == bl_entry->pid) { - break; - } - } - if (bl_entry->vid != 0) - continue; + for (bl_entry = blacklist_id_table; bl_entry->vid != 0; bl_entry++) + if (entry->vid == bl_entry->vid && entry->pid == bl_entry->pid) + break; - key = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid); + if (bl_entry->vid != 0) + continue; - if (g_hash_table_lookup (printed, key) != NULL) { - g_free (key); - continue; - } + key = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid); - g_hash_table_insert (printed, key, GINT_TO_POINTER (1)); + if (g_hash_table_lookup (printed, key) != NULL) + { + g_free (key); + continue; + } - if (num_printed == 0) - g_print ("# %s\n", cls->full_name); + g_hash_table_insert (printed, key, GINT_TO_POINTER (1)); - g_print ("SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", ATTRS{dev}==\"*\", TEST==\"power/control\", ATTR{power/control}=\"auto\"\n", - entry->vid, entry->pid); - g_print ("SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", ENV{LIBFPRINT_DRIVER}=\"%s\"\n", - entry->vid, entry->pid, cls->full_name); - num_printed++; + if (num_printed == 0) + g_print ("# %s\n", cls->full_name); + + g_print ("SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", ATTRS{dev}==\"*\", TEST==\"power/control\", ATTR{power/control}=\"auto\"\n", + entry->vid, entry->pid); + g_print ("SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", ENV{LIBFPRINT_DRIVER}=\"%s\"\n", + entry->vid, entry->pid, cls->full_name); + num_printed++; } - if (num_printed > 0) - g_print ("\n"); + if (num_printed > 0) + g_print ("\n"); } -int main (int argc, char **argv) +int +main (int argc, char **argv) { - g_autoptr(GArray) drivers = g_array_new (FALSE, FALSE, sizeof(GType)); - guint i; + g_autoptr(GArray) drivers = g_array_new (FALSE, FALSE, sizeof (GType)); + guint i; - g_print ("%p\n", drivers); - g_print ("%p\n", fpi_get_driver_types); - fpi_get_driver_types (drivers); + g_print ("%p\n", drivers); + g_print ("%p\n", fpi_get_driver_types); + fpi_get_driver_types (drivers); - printed = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + printed = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); - for (i = 0; i < drivers->len; i++) { - GType driver = g_array_index (drivers, GType, i); - FpDeviceClass *cls = FP_DEVICE_CLASS (g_type_class_ref (driver)); + for (i = 0; i < drivers->len; i++) + { + GType driver = g_array_index (drivers, GType, i); + FpDeviceClass *cls = FP_DEVICE_CLASS (g_type_class_ref (driver)); - if (cls->type != FP_DEVICE_TYPE_USB) { - g_type_class_unref (cls); - continue; - } + if (cls->type != FP_DEVICE_TYPE_USB) + { + g_type_class_unref (cls); + continue; + } - print_driver (cls); + print_driver (cls); - g_type_class_unref (cls); + g_type_class_unref (cls); } - print_driver (&whitelist); + print_driver (&whitelist); - g_hash_table_destroy (printed); + g_hash_table_destroy (printed); - return 0; + return 0; } diff --git a/libfprint/fprint.h b/libfprint/fprint.h index a4729ea..6db6cfd 100644 --- a/libfprint/fprint.h +++ b/libfprint/fprint.h @@ -22,4 +22,3 @@ #include "fp-context.h" #include "fp-device.h" #include "fp-image.h" - diff --git a/scripts/uncrustify.sh b/scripts/uncrustify.sh index 9a82320..cb03906 100755 --- a/scripts/uncrustify.sh +++ b/scripts/uncrustify.sh @@ -13,7 +13,7 @@ case "$1" in esac pushd "$SRCROOT" -uncrustify -c "$CFG" $OPTS `git ls-tree --name-only -r HEAD | grep -E '(fp|fpi)-.*\.[ch]$' | grep -v nbis | grep -v fpi-byte | grep -v build/` +uncrustify -c "$CFG" $OPTS `git ls-tree --name-only -r HEAD | grep -E '.*\.[ch]$' | grep -v nbis | grep -v fpi-byte | grep -v build/` RES=$? popd exit $RES \ No newline at end of file