summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Plattner <aplattner@nvidia.com>2010-12-14 10:48:42 -0800
committerAaron Plattner <aplattner@nvidia.com>2010-12-14 10:48:42 -0800
commit6eac0b939afb588abfedb5065954e06d96b4497d (patch)
tree859e5a12f8260c62fa62a2ea30b71ca01485332d
parent9cfad8a57eccf129d51ef50f1bbd4cdaf7556b9a (diff)
260.19.29260.19.29
-rw-r--r--samples/nv-control-events.c36
-rw-r--r--src/gtk+-2.x/ctk3dvisionpro.c1936
-rw-r--r--src/gtk+-2.x/ctk3dvisionpro.h155
-rw-r--r--src/gtk+-2.x/ctkbanner.c3
-rw-r--r--src/gtk+-2.x/ctkbanner.h1
-rw-r--r--src/gtk+-2.x/ctkevent.c14
-rw-r--r--src/gtk+-2.x/ctkscreen.c1
-rw-r--r--src/gtk+-2.x/ctkwindow.c24
-rw-r--r--src/gtk+-2.x/src.mk2
-rw-r--r--src/image_data/src.mk2
-rw-r--r--src/image_data/svp_3dvp.pngbin0 -> 4877 bytes
-rw-r--r--src/image_data/svp_3dvp_pixdata.h519
-rw-r--r--src/libXNVCtrl/NVCtrl.h215
-rw-r--r--src/libXNVCtrl/nv_control.h3
-rw-r--r--src/parse.c35
-rw-r--r--src/parse.h3
-rw-r--r--src/query-assign.c16
-rw-r--r--src/xpm_data/src.mk13
-rw-r--r--src/xpm_data/svp_add_glasses.h1590
-rw-r--r--src/xpm_data/svp_autopick_next_channel.h498
-rw-r--r--src/xpm_data/svp_battery_0.h23
-rw-r--r--src/xpm_data/svp_battery_100.h22
-rw-r--r--src/xpm_data/svp_battery_25.h23
-rw-r--r--src/xpm_data/svp_battery_50.h23
-rw-r--r--src/xpm_data/svp_battery_75.h23
-rw-r--r--src/xpm_data/svp_status_excellent.h37
-rw-r--r--src/xpm_data/svp_status_good.h34
-rw-r--r--src/xpm_data/svp_status_low.h29
-rw-r--r--src/xpm_data/svp_status_nosignal.h21
-rw-r--r--src/xpm_data/svp_status_verygood.h37
-rw-r--r--src/xpm_data/svp_status_verylow.h24
-rw-r--r--version.mk2
32 files changed, 5337 insertions, 27 deletions
diff --git a/samples/nv-control-events.c b/samples/nv-control-events.c
index 5b627d7..43dade2 100644
--- a/samples/nv-control-events.c
+++ b/samples/nv-control-events.c
@@ -428,14 +428,20 @@ static const char *target2str(int n)
static char unknown[24];
switch (n) {
- case NV_CTRL_TARGET_TYPE_X_SCREEN: return "X Screen"; break;
- case NV_CTRL_TARGET_TYPE_GPU: return "GPU"; break;
- case NV_CTRL_TARGET_TYPE_FRAMELOCK: return "Frame Lock"; break;
- case NV_CTRL_TARGET_TYPE_VCSC: return "VCS"; break;
- case NV_CTRL_TARGET_TYPE_GVI: return "GVI"; break;
- case NV_CTRL_TARGET_TYPE_COOLER: return "Cooler"; break;
- case NV_CTRL_TARGET_TYPE_THERMAL_SENSOR: return "Thermal Sensor"; break;
-
+ case NV_CTRL_TARGET_TYPE_X_SCREEN:
+ return "X Screen";
+ case NV_CTRL_TARGET_TYPE_GPU:
+ return "GPU";
+ case NV_CTRL_TARGET_TYPE_FRAMELOCK:
+ return "Frame Lock";
+ case NV_CTRL_TARGET_TYPE_VCSC:
+ return "VCS";
+ case NV_CTRL_TARGET_TYPE_GVI:
+ return "GVI";
+ case NV_CTRL_TARGET_TYPE_COOLER:
+ return "Cooler";
+ case NV_CTRL_TARGET_TYPE_THERMAL_SENSOR:
+ return "Thermal Sensor";
default:
snprintf(unknown, 24, "Unknown (%d)", n);
return unknown;
@@ -483,6 +489,7 @@ static const char *attr2str(int n)
static AttrEntry attr_table[] = {
MAKE_ENTRY(NV_CTRL_FLATPANEL_SCALING),
MAKE_ENTRY(NV_CTRL_FLATPANEL_DITHERING),
+ MAKE_ENTRY(NV_CTRL_DITHERING),
MAKE_ENTRY(NV_CTRL_DIGITAL_VIBRANCE),
MAKE_ENTRY(NV_CTRL_BUS_TYPE),
MAKE_ENTRY(NV_CTRL_VIDEO_RAM),
@@ -702,11 +709,18 @@ static AttrEntry attr_table[] = {
MAKE_ENTRY(NV_CTRL_COLOR_RANGE),
MAKE_ENTRY(NV_CTRL_GPU_SCALING_DEFAULT_TARGET),
MAKE_ENTRY(NV_CTRL_GPU_SCALING_DEFAULT_METHOD),
- MAKE_ENTRY(NV_CTRL_FLATPANEL_DITHERING_MODE),
- // MAKE_ENTRY(NV_CTRL_FLATPANEL_DEFAULT_DITHERING),
- // MAKE_ENTRY(NV_CTRL_FLATPANEL_DEFAULT_DITHERING_MODE),
+ MAKE_ENTRY(NV_CTRL_DITHERING_MODE),
+ MAKE_ENTRY(NV_CTRL_CURRENT_DITHERING),
+ MAKE_ENTRY(NV_CTRL_CURRENT_DITHERING_MODE),
MAKE_ENTRY(NV_CTRL_THERMAL_SENSOR_READING),
MAKE_ENTRY(NV_CTRL_THERMAL_SENSOR_PROVIDER),
MAKE_ENTRY(NV_CTRL_THERMAL_SENSOR_TARGET),
+ MAKE_ENTRY(NV_CTRL_SHOW_MULTIGPU_VISUAL_INDICATOR),
+ MAKE_ENTRY(NV_CTRL_GPU_CURRENT_PROCESSOR_CLOCK_FREQS),
+ MAKE_ENTRY(NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS),
+ MAKE_ENTRY(NV_CTRL_GPU_PCIE_MAX_LINK_SPEED),
+ MAKE_ENTRY(NV_CTRL_DITHERING_DEPTH),
+ MAKE_ENTRY(NV_CTRL_CURRENT_DITHERING_DEPTH),
+ MAKE_ENTRY(NV_CTRL_GVO_ANC_PARITY_COMPUTATION),
{ -1, NULL, NULL }
};
diff --git a/src/gtk+-2.x/ctk3dvisionpro.c b/src/gtk+-2.x/ctk3dvisionpro.c
new file mode 100644
index 0000000..cede791
--- /dev/null
+++ b/src/gtk+-2.x/ctk3dvisionpro.c
@@ -0,0 +1,1936 @@
+/*
+ * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix
+ * and Linux systems.
+ *
+ * Copyright (C) 2010 NVIDIA Corporation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of Version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See Version 2
+ * of the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the:
+ *
+ * Free Software Foundation, Inc.
+ * 59 Temple Place - Suite 330
+ * Boston, MA 02111-1307, USA
+ *
+ */
+
+#include <gtk/gtk.h>
+
+#include "NvCtrlAttributes.h"
+#include "NVCtrlLib.h"
+
+#include "ctkbanner.h"
+#include "ctk3dvisionpro.h"
+#include "ctkconfig.h"
+#include "ctkhelp.h"
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+
+/*
+ * Icons.
+ */
+#include "svp_battery_0.h"
+#include "svp_battery_25.h"
+#include "svp_battery_50.h"
+#include "svp_battery_75.h"
+#include "svp_battery_100.h"
+#include "svp_status_nosignal.h"
+#include "svp_status_verylow.h"
+#include "svp_status_low.h"
+#include "svp_status_good.h"
+#include "svp_status_verygood.h"
+#include "svp_status_excellent.h"
+#include "svp_add_glasses.h"
+
+//-----------------------------------------------------------------------------
+
+#define HTU(idx) (ctk_3d_vision_pro->htu_info[(idx)])
+#define MAX_ATTRIB_LENGTH 128
+
+#define PAIRING_TIMEOUT 3
+#define PAIRING_DURATION 60
+#define POLL_PAIRING_TIMEOUT 2000 //mS
+#define POLL_PAIRING_CYCLE ((POLL_PAIRING_TIMEOUT / 1000) * 2)
+
+enum {
+ CHANGED,
+ LAST_SIGNAL
+};
+
+typedef struct _RenameGlassesDlg {
+ GtkWidget *parent;
+ GtkWidget *mnu_glasses_name;
+ GtkWidget *dlg_rename_glasses;
+ int glasses_selected_index;
+ char *glasses_new_name;
+} RenameGlassesDlg;
+
+typedef struct _IdentifyGlassesDlg {
+ GtkWidget *parent;
+ GtkWidget *mnu_glasses_name;
+ GtkWidget *dlg_identify_glasses;
+ int glasses_selected_index;
+} IdentifyGlassesDlg;
+
+typedef struct _ChannelRangeDlg {
+ GtkWidget *parent;
+ GtkWidget *dlg_channel_range;
+} ChannelRangeDlg;
+
+typedef struct _SelectChannelDlg {
+ GtkWidget *parent;
+ GtkWidget *dlg_select_channel;
+} SelectChannelDlg;
+
+typedef struct _RemoveGlassesDlg {
+ GtkWidget *parent;
+ GtkWidget *dlg_remove_glasses;
+ GtkWidget *mnu_glasses_name;
+ int glasses_selected_index;
+} RemoveGlassesDlg;
+
+typedef void (*BUTTON_CLICK)(GtkButton *button, gpointer user_data);
+
+static void channel_range_changed(GtkOptionMenu *option_menu, gpointer user_data);
+
+//-----------------------------------------------------------------------------
+
+static guint __signals[LAST_SIGNAL] = { 0 };
+
+const char *__mnu_glasses_name_tooltip = "Select glasses name";
+const char *__goggle_info_tooltip = "Displays the list of glasses synced "
+ "to the hub and their battery levels";
+const char *__channel_range_tooltip = "Change the 3D Vision Pro Hub range. "
+ "Click the arrow and then select the hub range that you want.";
+const char *__add_glasses_tooltip = "Add more glasses to sync to the hub. "
+ "Click this button to open the Add glasses dialog that lets you synchronize "
+ "another pair of stereo glasses with the hub.";
+const char *__refresh_tooltip = "Updates the list of glasses that are "
+ "synchronized with the hub.";
+const char *__identify_tooltip = "Identify a pair of glasses. "
+ "Causes the LED on the selected pair of glasses to blink.";
+const char *__rename_tooltip = "Rename a pair of glasses. "
+ "Opens the Rename glasses dialog that lets you assign a different name to "
+ "the selected pair of glasses.";
+const char *__remove_glasses_tooltip = "Remove a pair of glasses currently "
+ "synced to the hub. This removes the selected pair of glasses from the "
+ "glasses information table and disconnects the glasses from the hub.";
+
+/******************************************************************************
+ *
+ * Various helper and Widget callback functions
+ *
+ ******************************************************************************/
+
+static const char** get_battery_status_icon(int battery)
+{
+ if (battery == 0) {
+ return (const char **)&svp_battery_0_xpm;
+ } else if (battery < 50) {
+ return (const char **)&svp_battery_25_xpm;
+ } else if (battery < 75) {
+ return (const char **)&svp_battery_50_xpm;
+ } else if (battery < 100) {
+ return (const char **)&svp_battery_75_xpm;
+ } else if (battery == 100) {
+ return (const char **)&svp_battery_100_xpm;
+ }
+
+ return NULL;
+}
+
+static const char** get_signal_strength_icon(int signal_strength)
+{
+ if (signal_strength == 0) {
+ return (const char **)&svp_status_nosignal_xpm;
+ } else if (signal_strength < 25) {
+ return (const char **)&svp_status_verylow_xpm;
+ } else if (signal_strength < 50) {
+ return (const char **)&svp_status_low_xpm;
+ } else if (signal_strength < 75) {
+ return (const char **)&svp_status_good_xpm;
+ } else if (signal_strength < 100) {
+ return (const char **)&svp_status_verygood_xpm;
+ } else if (signal_strength == 100) {
+ return (const char **)&svp_status_excellent_xpm;
+ }
+
+ return NULL;
+}
+
+static void ctk_3d_vision_pro_class_init(Ctk3DVisionProClass
+ *ctk_3d_vision_pro_class)
+{
+ GObjectClass *gobject_class;
+
+ gobject_class = (GObjectClass *) ctk_3d_vision_pro_class;
+
+ __signals[CHANGED] = g_signal_new("changed",
+ G_OBJECT_CLASS_TYPE(ctk_3d_vision_pro_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET(Ctk3DVisionProClass, changed),
+ NULL, NULL, g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+}
+
+GType ctk_3d_vision_pro_get_type(void)
+{
+ static GType ctk_3d_vision_pro_type = 0;
+
+ if (!ctk_3d_vision_pro_type) {
+ static const GTypeInfo ctk_3d_vision_pro_info = {
+ sizeof (Ctk3DVisionProClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) ctk_3d_vision_pro_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (Ctk3DVisionPro),
+ 0, /* n_preallocs */
+ NULL, /* instance_init */
+ };
+
+ ctk_3d_vision_pro_type = g_type_register_static(GTK_TYPE_VBOX,
+ "Ctk3DVisionPro", &ctk_3d_vision_pro_info, 0);
+ }
+
+ return ctk_3d_vision_pro_type;
+}
+
+static GtkWidget *add_button(char *label, BUTTON_CLICK handler,
+ Ctk3DVisionPro *ctk_3d_vision_pro,
+ GtkWidget *pack_in, const char *tooltip)
+{
+ GtkWidget *button;
+ GtkWidget *hbox;
+ GtkWidget *alignment;
+
+ hbox = gtk_hbox_new(FALSE, 0);
+ button = gtk_button_new_with_label(label);
+ gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(handler),
+ (gpointer) ctk_3d_vision_pro);
+ ctk_config_set_tooltip(ctk_3d_vision_pro->ctk_config, button, tooltip);
+
+ alignment = gtk_alignment_new(0, 1, 0, 0);
+ gtk_container_add(GTK_CONTAINER(alignment), hbox);
+ gtk_box_pack_start(GTK_BOX(pack_in), alignment, TRUE, TRUE, 0);
+
+ return button;
+}
+
+static GtkWidget * add_label(char *text, GtkWidget *pack_in)
+{
+ GtkWidget *hbox;
+ GtkWidget *alignment;
+ GtkWidget *label;
+
+ hbox = gtk_hbox_new(FALSE, 5);
+ alignment = gtk_alignment_new(0, 1, 0, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), alignment, TRUE, TRUE, 0);
+ label = gtk_label_new(text);
+ gtk_container_add(GTK_CONTAINER(alignment), label);
+ gtk_box_pack_start(GTK_BOX(pack_in), hbox, FALSE, FALSE, 0);
+
+ return label;
+}
+
+static void glasses_name_changed(GtkOptionMenu *option_menu,
+ gpointer user_data)
+{
+ RemoveGlassesDlg *dlg = (RemoveGlassesDlg *)user_data;
+ dlg->glasses_selected_index = gtk_option_menu_get_history(option_menu);
+}
+
+static GtkWidget *create_glasses_list_menu(Ctk3DVisionPro *ctk_3d_vision_pro,
+ GlassesInfo **glasses_info,
+ guint num_glasses, gpointer dlg)
+{
+ GtkWidget *menu;
+ GtkWidget *menu_item;
+ GtkWidget *mnu_glasses_name;
+ int i;
+
+ mnu_glasses_name = gtk_option_menu_new();
+ g_signal_connect(G_OBJECT(mnu_glasses_name), "changed",
+ G_CALLBACK(glasses_name_changed),
+ (gpointer) dlg);
+ menu = gtk_menu_new();
+
+ ctk_config_set_tooltip(ctk_3d_vision_pro->ctk_config, mnu_glasses_name,
+ __mnu_glasses_name_tooltip);
+
+ for (i = 0; i < num_glasses; i++) {
+ menu_item = gtk_menu_item_new_with_label(glasses_info[i]->name);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
+ gtk_widget_show(menu_item);
+ }
+
+ /* Setup the menu and select the glasses name */
+ g_signal_handlers_block_by_func(G_OBJECT(mnu_glasses_name),
+ G_CALLBACK(glasses_name_changed),
+ (gpointer) dlg);
+
+ gtk_option_menu_set_menu(GTK_OPTION_MENU(mnu_glasses_name), menu);
+ gtk_option_menu_set_history(GTK_OPTION_MENU(mnu_glasses_name), 0);
+
+ /* If dropdown has only one item, disable menu selection */
+ if (num_glasses > 1) {
+ gtk_widget_set_sensitive(mnu_glasses_name, True);
+ } else {
+ gtk_widget_set_sensitive(mnu_glasses_name, False);
+ }
+
+ g_signal_handlers_unblock_by_func
+ (G_OBJECT(mnu_glasses_name),
+ G_CALLBACK(glasses_name_changed), (gpointer) dlg);
+
+ return mnu_glasses_name;
+}
+
+static const char *new_glasses_name_activate(GtkWidget *widget,
+ gpointer user_data)
+{
+ RenameGlassesDlg *dlg = (RenameGlassesDlg *)user_data;
+ const gchar *str = gtk_entry_get_text(GTK_ENTRY(widget));
+
+ // Store new glasses name in dialog box
+ dlg->glasses_new_name = realloc(dlg->glasses_new_name, strlen(str) + 1);
+ strncpy(dlg->glasses_new_name, str, strlen(str) + 1);
+
+ return str;
+}
+
+static gboolean new_glasses_name_focus_out(GtkWidget *widget, GdkEvent *event,
+ gpointer user_data)
+{
+ new_glasses_name_activate(widget, user_data);
+
+ return FALSE;
+
+} /* display_panning_focus_out() */
+
+static void update_glasses_info_data_table(GlassesInfoTable *table, GlassesInfo** glasses_info)
+{
+ int i;
+ GtkRequisition req;
+
+ if (table->rows > 0) {
+ gtk_table_resize(GTK_TABLE(table->data_table), table->rows, table->columns);
+ }
+
+ for (i = 0; i < table->rows; i++) {
+ char str[NUM_GLASSES_INFO_ATTRIBS + 1][MAX_ATTRIB_LENGTH];
+ int cell = 0;
+
+ snprintf((char *)(&(str[cell++])), MAX_ATTRIB_LENGTH, "%s", glasses_info[i]->name);
+ snprintf((char *)(&(str[cell++])), MAX_ATTRIB_LENGTH, "%d", glasses_info[i]->battery);
+
+ // destroy older widgets
+ if (glasses_info[i]->image) {
+ gtk_widget_destroy (glasses_info[i]->image);
+ }
+ for (cell = 0; cell < NUM_GLASSES_INFO_ATTRIBS; cell++) {
+ if (glasses_info[i]->label[cell]) {
+ gtk_widget_destroy (glasses_info[i]->label[cell]);
+ }
+ if (glasses_info[i]->hbox[cell]) {
+ gtk_widget_destroy (glasses_info[i]->hbox[cell]);
+ }
+ }
+
+ for (cell = 0; cell < NUM_GLASSES_INFO_ATTRIBS; cell++) {
+ GtkWidget *hbox;
+ GtkWidget * label;
+ GtkWidget *image;
+
+ hbox = gtk_hbox_new(FALSE, 0);
+ glasses_info[i]->hbox[cell] = hbox;
+
+ label = gtk_label_new(str[cell]);
+ glasses_info[i]->label[cell] = label;
+ gtk_label_set_justify( GTK_LABEL(label), GTK_JUSTIFY_CENTER);
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
+ gtk_table_attach(GTK_TABLE(table->data_table), hbox,
+ cell, cell+1,
+ i+1, i+2,
+ GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0);
+
+ if (cell == 1) {
+ const char **bat_icon = get_battery_status_icon(glasses_info[i]->battery);
+ GdkPixbuf *pixbuf = gdk_pixbuf_new_from_xpm_data(bat_icon);
+ image = gtk_image_new_from_pixbuf(pixbuf);
+ glasses_info[i]->image = image;
+ gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0);
+ }
+ /* Make sure the table headers are the same width
+ * as their table data column
+ */
+ gtk_widget_size_request(label, &req);
+
+ if (table->glasses_header_sizes[cell].width > req.width ) {
+ gtk_widget_set_size_request(label,
+ table->glasses_header_sizes[cell].width,
+ -1);
+ } else if (table->glasses_header_sizes[cell].width < req.width ) {
+ table->glasses_header_sizes[cell].width = req.width + 6;
+ gtk_widget_set_size_request(table->glasses_header_sizes[cell].widget,
+ table->glasses_header_sizes[cell].width,
+ -1);
+ }
+ }
+ }
+}
+
+static void create_glasses_info_table(GlassesInfoTable *table, GlassesInfo** glasses_info,
+ GtkWidget *pack_in, CtkConfig *ctk_config)
+{
+ GtkWidget *hbox, *hbox1;
+ GtkWidget *vbox, *vbox2;
+ GtkWidget *label;
+ GtkWidget *hseparator;
+ GtkWidget *data_viewport, *full_viewport;
+ GtkWidget *vscrollbar, *hscrollbar, *vpan;
+ GtkWidget *data_table, *header_table;
+ GtkRequisition req;
+ GtkWidget *event; /* For setting the background color to white */
+ gchar *goggle_info_titles[NUM_GLASSES_INFO_ATTRIBS] =
+ {"Glasses Name", "Battery Level (%)"};
+ int i;
+
+ /* Create clist in a scroll box */
+ hbox1 = gtk_hbox_new(FALSE, 0);
+ label = gtk_label_new("Glasses Information");
+ hseparator = gtk_hseparator_new();
+ gtk_box_pack_start(GTK_BOX(hbox1), label, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox1), hseparator, TRUE, TRUE, 5);
+
+ hbox = gtk_hbox_new(FALSE, 0);
+ vbox = gtk_vbox_new(FALSE, 5);
+ vbox2 = gtk_vbox_new(FALSE, 5);
+ vpan = gtk_vpaned_new();
+
+ data_viewport = gtk_viewport_new(NULL, NULL);
+ gtk_widget_set_size_request(data_viewport, 250, 100);
+ vscrollbar = gtk_vscrollbar_new(gtk_viewport_get_vadjustment
+ (GTK_VIEWPORT(data_viewport)));
+
+ full_viewport = gtk_viewport_new(NULL, NULL);
+ gtk_widget_set_size_request(full_viewport, 300, 150);
+ hscrollbar = gtk_hscrollbar_new(gtk_viewport_get_hadjustment
+ (GTK_VIEWPORT(full_viewport)));
+
+ table->data_viewport = data_viewport;
+ table->full_viewport = full_viewport;
+ table->vscrollbar = vscrollbar;
+ table->hscrollbar = hscrollbar;
+
+ /* Create the header table */
+ header_table = gtk_table_new(1, NUM_GLASSES_INFO_ATTRIBS, FALSE);
+ for ( i = 0; i < NUM_GLASSES_INFO_ATTRIBS; i++ ) {
+ GtkWidget * btn = gtk_button_new_with_label(goggle_info_titles[i]);
+ ctk_config_set_tooltip(ctk_config, btn, __goggle_info_tooltip);
+ gtk_table_attach(GTK_TABLE(header_table), btn, i, i+1, 0, 1,
+ GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0);
+
+ table->glasses_header_sizes[i].widget = btn;
+ gtk_widget_size_request(btn, &req);
+ table->glasses_header_sizes[i].width = req.width;
+ }
+
+ /* Create the data table */
+ data_table = gtk_table_new(table->rows, table->columns, FALSE);
+ event = gtk_event_box_new();
+
+ gtk_widget_modify_fg(data_table, GTK_STATE_NORMAL,
+ &(data_table->style->text[GTK_STATE_NORMAL]));
+ gtk_widget_modify_bg(data_table, GTK_STATE_NORMAL,
+ &(data_table->style->base[GTK_STATE_NORMAL]));
+ gtk_container_add (GTK_CONTAINER(event), data_table);
+ gtk_widget_modify_fg(event, GTK_STATE_NORMAL,
+ &(event->style->text[GTK_STATE_NORMAL]));
+ gtk_widget_modify_bg(event, GTK_STATE_NORMAL,
+ &(event->style->base[GTK_STATE_NORMAL]));
+ gtk_container_add(GTK_CONTAINER(data_viewport), event);
+
+ /* Pack the glasses info header and data tables */
+ vbox = gtk_vbox_new(FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), header_table, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), data_viewport, TRUE, TRUE, 0);
+ gtk_container_add (GTK_CONTAINER(full_viewport), vbox);
+
+ vbox = gtk_vbox_new(FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), full_viewport, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), hscrollbar, FALSE, FALSE, 0);
+
+ hbox = gtk_hbox_new(FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), vscrollbar, FALSE, FALSE, 0);
+
+ vbox = gtk_vbox_new(FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 5);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+
+// gtk_paned_pack1 (GTK_PANED (vpan), scrollWin, TRUE, FALSE);
+ gtk_paned_pack2 (GTK_PANED (vpan), vbox, TRUE, FALSE);
+ gtk_box_pack_start(GTK_BOX(pack_in), vpan, TRUE, TRUE, 0);
+
+ /* Fill the data table */
+ table->data_table = data_table;
+ update_glasses_info_data_table(table, glasses_info);
+}
+
+static void add_menu_item(GtkWidget *menu, const char *caption)
+{
+ GtkWidget *menu_item;
+ GtkWidget *hbox;
+ GtkWidget *label;
+
+ menu_item = gtk_menu_item_new();
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
+
+ hbox = gtk_hbox_new(FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(menu_item), hbox);
+
+ label = gtk_label_new(caption);
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+}
+
+static void init_glasses_info_widgets(GlassesInfo *glasses)
+{
+ int i;
+
+ for (i = 0; i < NUM_GLASSES_INFO_ATTRIBS; i++) {
+ glasses->label[i] = NULL;
+ glasses->hbox[i] = NULL;
+ }
+ glasses->image = NULL;
+}
+
+static void callback_glasses_paired(GtkObject *object, gpointer arg1,
+ gpointer user_data)
+{
+ int battery_level;
+ char *glasses_name = NULL;
+ int target_id = 0;
+ unsigned int glasses_id;
+ GlassesInfo *glasses;
+ Bool ret;
+ CtkEventStruct *event_struct;
+ char temp[64]; //scratchpad memory used to construct labels.
+
+ Ctk3DVisionPro *ctk_3d_vision_pro = CTK_3D_VISION_PRO(user_data);
+ AddGlassesDlg *dlg = ctk_3d_vision_pro->add_glasses_dlg;
+ event_struct = (CtkEventStruct *) arg1;
+
+ glasses_id = event_struct->value;
+ ret = XNVCTRLQueryTargetStringAttribute(NvCtrlGetDisplayPtr(ctk_3d_vision_pro->handle),
+ NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER,
+ target_id, glasses_id,
+ NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME,
+ &glasses_name);
+ if (ret != TRUE) {
+ glasses_name = NULL;
+ }
+
+ ret = XNVCTRLQueryTargetAttribute(NvCtrlGetDisplayPtr(ctk_3d_vision_pro->handle),
+ NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER,
+ target_id, glasses_id,
+ NV_CTRL_3D_VISION_PRO_GLASSES_BATTERY_LEVEL,
+ (int *)&battery_level);
+ if (ret != TRUE) {
+ battery_level = 0;
+ }
+ // Create glasses_info
+ glasses = (GlassesInfo *)malloc(sizeof(GlassesInfo));
+ strncpy(glasses->name, glasses_name, sizeof(glasses->name));;
+ glasses->name[sizeof(glasses->name) - 1] = '\0';
+ glasses->battery = battery_level;
+ glasses->glasses_id = glasses_id;
+ init_glasses_info_widgets(glasses);
+
+ if (dlg) {
+ // add entry into local glasses_info structure.
+ dlg->new_glasses++;
+
+ dlg->glasses_info = (GlassesInfo **)realloc(dlg->glasses_info,
+ sizeof(GlassesInfo *) * dlg->new_glasses);
+
+ dlg->glasses_info[dlg->new_glasses - 1] = glasses;
+
+ // update dialog boxes glasses info table
+ dlg->table.rows++;
+ update_glasses_info_data_table(&(dlg->table), dlg->glasses_info);
+ gtk_widget_show_all(GTK_WIDGET(dlg->table.data_table));
+ }
+
+ // Add glasses_info into HTU(0)->glasses_info list.
+ HTU(0)->glasses_info = realloc(HTU(0)->glasses_info,
+ (HTU(0)->num_glasses + 1) * sizeof(GlassesInfo *));
+
+ HTU(0)->glasses_info[HTU(0)->num_glasses] = glasses;
+ init_glasses_info_widgets(HTU(0)->glasses_info[HTU(0)->num_glasses]);
+ HTU(0)->num_glasses += 1;
+
+ // update glasses info table
+ ctk_3d_vision_pro->table.rows += 1;
+ update_glasses_info_data_table(&(ctk_3d_vision_pro->table), HTU(0)->glasses_info);
+ gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->table.data_table));
+
+ snprintf(temp, sizeof(temp), "Glasses Connected: %d", HTU(0)->num_glasses);
+ gtk_label_set_text(ctk_3d_vision_pro->glasses_num_label, temp);
+ gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->glasses_num_label));
+
+ free(glasses_name);
+}
+
+static void callback_glasses_unpaired(GtkObject *object, gpointer arg1,
+ gpointer user_data)
+{
+ int j;
+ unsigned int glasses_id = 0;
+ GlassesInfo *glasses = NULL;
+ char temp[64]; //scratchpad memory used to construct labels.
+ CtkEventStruct *event_struct;
+ int overwrite = FALSE;
+
+ Ctk3DVisionPro *ctk_3d_vision_pro = CTK_3D_VISION_PRO(user_data);
+ event_struct = (CtkEventStruct *) arg1;
+
+ glasses_id = event_struct->value;
+
+ for (j = 0; j < (HTU(0)->num_glasses); j++) {
+ if (!overwrite && HTU(0)->glasses_info[j]->glasses_id == glasses_id) {
+ if (j != HTU(0)->num_glasses - 1) {
+ overwrite = TRUE;
+ }
+ glasses = HTU(0)->glasses_info[j];
+ }
+ if (overwrite && HTU(0)->num_glasses > 1) {
+ HTU(0)->glasses_info[j] = HTU(0)->glasses_info[j + 1];
+ }
+ }
+
+ HTU(0)->num_glasses--;
+ HTU(0)->glasses_info = (GlassesInfo **)realloc(HTU(0)->glasses_info,
+ sizeof(GlassesInfo *) * HTU(0)->num_glasses);
+
+ gtk_widget_destroy (glasses->label[0]);
+ gtk_widget_destroy (glasses->label[1]);
+ gtk_widget_destroy (glasses->image);
+ gtk_widget_destroy (glasses->hbox[0]);
+ gtk_widget_destroy (glasses->hbox[1]);
+
+ // update glasses info table
+ ctk_3d_vision_pro->table.rows--;
+ update_glasses_info_data_table(&(ctk_3d_vision_pro->table), HTU(0)->glasses_info);
+ gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->table.data_table));
+
+ snprintf(temp, sizeof(temp), "Glasses Connected: %d", HTU(0)->num_glasses);
+ gtk_label_set_text(ctk_3d_vision_pro->glasses_num_label, temp);
+ gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->glasses_num_label));
+
+ free(glasses);
+}
+
+static gboolean poll_pairing(gpointer user_data)
+{
+ Ctk3DVisionPro *ctk_3d_vision_pro = CTK_3D_VISION_PRO(user_data);
+
+ if (ctk_3d_vision_pro->add_glasses_dlg->pairing_attempts >
+ PAIRING_DURATION / POLL_PAIRING_CYCLE) {
+ return FALSE;
+ }
+
+ if (ctk_3d_vision_pro->add_glasses_dlg->in_pairing) {
+
+ XNVCTRLSetTargetAttribute(NvCtrlGetDisplayPtr(ctk_3d_vision_pro->handle),
+ NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER,
+ 0, 0,
+ NV_CTRL_3D_VISION_PRO_PAIR_GLASSES,
+ PAIRING_TIMEOUT); // pairing on
+ XFlush(NvCtrlGetDisplayPtr(ctk_3d_vision_pro->handle));
+ }
+
+ ctk_3d_vision_pro->add_glasses_dlg->in_pairing =
+ !(ctk_3d_vision_pro->add_glasses_dlg->in_pairing);
+ ctk_3d_vision_pro->add_glasses_dlg->pairing_attempts++;
+ return TRUE;
+}
+
+static void enable_widgets(Ctk3DVisionPro *ctk_3d_vision_pro, Bool enable)
+{
+ gtk_widget_set_sensitive(ctk_3d_vision_pro->refresh_button, enable);
+ gtk_widget_set_sensitive(ctk_3d_vision_pro->identify_button, enable);
+ gtk_widget_set_sensitive(ctk_3d_vision_pro->rename_button, enable);
+ gtk_widget_set_sensitive(ctk_3d_vision_pro->remove_button, enable);
+ gtk_widget_set_sensitive(ctk_3d_vision_pro->table.data_viewport, enable);
+ gtk_widget_set_sensitive(ctk_3d_vision_pro->table.full_viewport, enable);
+ gtk_widget_set_sensitive(ctk_3d_vision_pro->table.vscrollbar, enable);
+ gtk_widget_set_sensitive(ctk_3d_vision_pro->table.hscrollbar, enable);
+}
+
+static void svp_config_changed(GtkObject *object, gpointer arg1,
+ gpointer user_data)
+{
+ CtkEventStruct *event_struct;
+ Ctk3DVisionPro *ctk_3d_vision_pro;
+ char temp[64];
+
+ event_struct = (CtkEventStruct *) arg1;
+ ctk_3d_vision_pro = CTK_3D_VISION_PRO(user_data);
+
+ switch (event_struct->attribute) {
+ case NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL:
+ if (HTU(0)->channel_num != event_struct->value) {
+ HTU(0)->channel_num = event_struct->value;
+ snprintf(temp, sizeof(temp), "Current Channel ID: %d", HTU(0)->channel_num);
+ gtk_label_set_text(ctk_3d_vision_pro->channel_num_label, temp);
+ gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->channel_num_label));
+ }
+ break;
+ case NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE:
+ {
+ SVP_RANGE range;
+ range = gtk_option_menu_get_history(GTK_OPTION_MENU(ctk_3d_vision_pro->option_menu));
+
+ if (event_struct->value != SVP_INVALID_RANGE && range != event_struct->value) {
+ g_signal_handlers_block_by_func(ctk_3d_vision_pro->option_menu,
+ channel_range_changed, ctk_3d_vision_pro);
+ HTU(0)->channel_range = event_struct->value;
+ gtk_option_menu_set_history(GTK_OPTION_MENU(ctk_3d_vision_pro->option_menu),
+ event_struct->value);
+ enable_widgets(ctk_3d_vision_pro,
+ (HTU(0)->channel_range == SVP_LONG_RANGE ? FALSE : TRUE));
+ g_signal_handlers_unblock_by_func(ctk_3d_vision_pro->option_menu,
+ channel_range_changed, ctk_3d_vision_pro);
+ }
+ break;
+ }
+ case NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_QUALITY:
+ if (HTU(0)->signal_strength != event_struct->value) {
+ const char **signal_strength_icon;
+ GdkPixbuf *pixbuf;
+
+ HTU(0)->signal_strength = event_struct->value;
+ snprintf(temp, sizeof(temp), "[%d%%]", HTU(0)->signal_strength);
+ gtk_label_set_text(ctk_3d_vision_pro->signal_strength_label, temp);
+
+ signal_strength_icon = get_signal_strength_icon(HTU(0)->signal_strength);
+ pixbuf = gdk_pixbuf_new_from_xpm_data(signal_strength_icon);
+ gtk_image_set_from_pixbuf(GTK_IMAGE(ctk_3d_vision_pro->signal_strength_image), pixbuf);
+
+ gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->signal_strength_label));
+ gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->signal_strength_image));
+ }
+ break;
+ case NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME:
+ {
+ int i;
+ for (i = 0; i < HTU(0)->num_glasses; i++) {
+ int target_id = 0;
+ Bool ret;
+ char *glasses_name = NULL;
+ GlassesInfo *glasses = glasses = HTU(0)->glasses_info[i];
+
+ ret = XNVCTRLQueryTargetStringAttribute(NvCtrlGetDisplayPtr(ctk_3d_vision_pro->handle),
+ NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER,
+ target_id, glasses->glasses_id,
+ NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME,
+ &glasses_name);
+
+ if (ret != TRUE || glasses_name == NULL) {
+ continue;
+ }
+ strncpy(glasses->name, glasses_name, sizeof(glasses->name));
+ glasses->name[sizeof(glasses->name)-1] = '\0';
+ free(glasses_name);
+ }
+ update_glasses_info_data_table(&(ctk_3d_vision_pro->table), HTU(0)->glasses_info);
+ gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->table.data_table));
+ break;
+ }
+ default:
+ ;
+ }
+
+}
+
+/******************************************************************************
+ *
+ * Create dialog boxes and Button click callbacks
+ *
+ ******************************************************************************/
+
+static void refresh_button_clicked(GtkButton *button, gpointer user_data)
+{
+ Ctk3DVisionPro *ctk_3d_vision_pro = CTK_3D_VISION_PRO(user_data);
+ int i;
+ char temp[64];
+ const char **signal_strength_icon;
+ GdkPixbuf *pixbuf;
+ Bool ret;
+
+ for (i = 0; i < HTU(0)->num_glasses; i++) {
+ int target_id = 0;
+ int battery_level;
+ GlassesInfo *glasses = glasses = HTU(0)->glasses_info[i];
+
+ ret = XNVCTRLQueryTargetAttribute(NvCtrlGetDisplayPtr(ctk_3d_vision_pro->handle),
+ NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER,
+ target_id, glasses->glasses_id,
+ NV_CTRL_3D_VISION_PRO_GLASSES_BATTERY_LEVEL,
+ (int *)&battery_level);
+ if (ret != TRUE) {
+ battery_level = 0;
+ }
+
+ glasses->battery = battery_level;
+ }
+ update_glasses_info_data_table(&(ctk_3d_vision_pro->table), HTU(0)->glasses_info);
+ gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->table.data_table));
+
+ ret = XNVCTRLQueryTargetAttribute(NvCtrlGetDisplayPtr(ctk_3d_vision_pro->handle),
+ NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER,
+ 0, HTU(0)->channel_num,
+ NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_QUALITY,
+ (int *)&(HTU(0)->signal_strength));
+ if (ret != TRUE) {
+ HTU(0)->signal_strength = 0;
+ }
+ snprintf(temp, sizeof(temp), "[%d%%]", HTU(0)->signal_strength);
+ gtk_label_set_text(ctk_3d_vision_pro->signal_strength_label, temp);
+
+ signal_strength_icon = get_signal_strength_icon(HTU(0)->signal_strength);
+ pixbuf = gdk_pixbuf_new_from_xpm_data(signal_strength_icon);
+ gtk_image_set_from_pixbuf(GTK_IMAGE(ctk_3d_vision_pro->signal_strength_image), pixbuf);
+
+ gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->signal_strength_label));
+ gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->signal_strength_image));
+}
+
+//=============================================================================
+
+static AddGlassesDlg *create_add_glasses_dlg(Ctk3DVisionPro *ctk_3d_vision_pro)
+{
+ AddGlassesDlg *dlg;
+ GtkWidget *label;
+ GtkWidget *hbox;
+ GtkWidget *image;
+ GtkWidget *parent = GTK_WIDGET(ctk_3d_vision_pro);
+
+ dlg = (AddGlassesDlg *)malloc(sizeof(AddGlassesDlg));
+ if (dlg == NULL) {
+ return NULL;
+ }
+
+ dlg->parent = parent;
+ dlg->new_glasses = 0;
+ dlg->glasses_info = NULL;
+ dlg->in_pairing = TRUE;
+ dlg->pairing_attempts = 0;
+
+ /* Create the dialog */
+ dlg->dlg_add_glasses = gtk_dialog_new_with_buttons
+ ("Add glasses",
+ ctk_3d_vision_pro->parent_wnd,
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT |
+ GTK_DIALOG_NO_SEPARATOR,
+ GTK_STOCK_SAVE,
+ GTK_RESPONSE_ACCEPT,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_REJECT,
+ NULL);
+
+ gtk_dialog_set_default_response(GTK_DIALOG(dlg->dlg_add_glasses),
+ GTK_RESPONSE_REJECT);
+
+ label = gtk_label_new("1. Press button on the glasses\n"
+ " to initiate the connection.");
+ hbox = gtk_hbox_new(TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 10);
+
+ gtk_box_pack_start
+ (GTK_BOX(GTK_DIALOG(dlg->dlg_add_glasses)->vbox),
+ hbox, TRUE, TRUE, 5);
+
+ hbox = gtk_hbox_new(TRUE, 0);
+ gtk_box_pack_start
+ (GTK_BOX(GTK_DIALOG(dlg->dlg_add_glasses)->vbox),
+ hbox, TRUE, TRUE, 5);
+
+ image = gtk_image_new_from_pixbuf(gdk_pixbuf_new_from_xpm_data(
+ svp_add_glasses_xpm));
+ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg->dlg_add_glasses)->vbox),
+ image, FALSE, FALSE, 0);
+
+ label = gtk_label_new("2. List of glasses connected:");
+ hbox = gtk_hbox_new(TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
+ gtk_box_pack_start
+ (GTK_BOX(GTK_DIALOG(dlg->dlg_add_glasses)->vbox),
+ hbox, TRUE, TRUE, 5);
+
+ //generate menu option for glasses' name
+ hbox = gtk_hbox_new(TRUE, 0);
+
+ // create glasses info table
+ dlg->table.rows = 0;
+ dlg->table.columns = NUM_GLASSES_INFO_ATTRIBS;
+ create_glasses_info_table(&(dlg->table), dlg->glasses_info, hbox,
+ ctk_3d_vision_pro->ctk_config);
+
+ gtk_box_pack_start
+ (GTK_BOX(GTK_DIALOG(dlg->dlg_add_glasses)->vbox),
+ hbox, TRUE, TRUE, 5);
+ gtk_dialog_set_has_separator(GTK_DIALOG(dlg->dlg_add_glasses), TRUE);
+
+ gtk_widget_show_all(GTK_DIALOG(dlg->dlg_add_glasses)->vbox);
+
+ return dlg;
+}
+
+static void add_glasses_button_clicked(GtkButton *button, gpointer user_data)
+{
+ Ctk3DVisionPro *ctk_3d_vision_pro = CTK_3D_VISION_PRO(user_data);
+ AddGlassesDlg *dlg;
+ gint result;
+ int i;
+ char *s;
+
+ dlg = create_add_glasses_dlg(ctk_3d_vision_pro);
+ if (dlg == NULL) {
+ return;
+ }
+
+ ctk_3d_vision_pro->add_glasses_dlg = dlg;
+
+ if (HTU(0)->channel_range == SVP_LONG_RANGE) {
+ gtk_widget_set_sensitive(dlg->table.data_viewport, FALSE);
+ gtk_widget_set_sensitive(dlg->table.full_viewport, FALSE);
+ gtk_widget_set_sensitive(dlg->table.vscrollbar, FALSE);
+ gtk_widget_set_sensitive(dlg->table.hscrollbar, FALSE);
+ }
+
+ s = g_strdup_printf("NVIDIA 3D VisionPro Pairing");
+ ctk_config_add_timer(ctk_3d_vision_pro->ctk_config,
+ POLL_PAIRING_TIMEOUT,
+ s,
+ (GSourceFunc) poll_pairing,
+ (gpointer)ctk_3d_vision_pro);
+ g_free(s);
+
+ gtk_window_set_transient_for
+ (GTK_WINDOW(dlg->dlg_add_glasses),
+ GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(dlg->parent))));
+
+ gtk_window_resize(GTK_WINDOW(dlg->dlg_add_glasses), 350, 1);
+ gtk_window_set_resizable(GTK_WINDOW(dlg->dlg_add_glasses),
+ FALSE);
+
+ ctk_config_start_timer(ctk_3d_vision_pro->ctk_config,
+ (GSourceFunc) poll_pairing,
+ (gpointer) ctk_3d_vision_pro);
+
+ gtk_widget_show(dlg->dlg_add_glasses);
+ result = gtk_dialog_run(GTK_DIALOG(dlg->dlg_add_glasses));
+ gtk_widget_hide(dlg->dlg_add_glasses);
+
+ ctk_config_stop_timer(ctk_3d_vision_pro->ctk_config,
+ (GSourceFunc) poll_pairing,
+ (gpointer)ctk_3d_vision_pro);
+
+ /* Handle user's response */
+ switch (result) {
+ case GTK_RESPONSE_ACCEPT:
+ break;
+ default:
+ for (i = 0; i < dlg->new_glasses; i++) {
+ XNVCTRLSetTargetAttribute(NvCtrlGetDisplayPtr(ctk_3d_vision_pro->handle),
+ NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER,
+ 0, 0,
+ NV_CTRL_3D_VISION_PRO_UNPAIR_GLASSES,
+ dlg->glasses_info[i]->glasses_id);
+ }
+ break;
+ }
+
+ free(dlg->glasses_info);
+ free(dlg);
+ ctk_3d_vision_pro->add_glasses_dlg = NULL;
+}
+
+//=============================================================================
+
+static RemoveGlassesDlg *create_remove_glasses_dlg(Ctk3DVisionPro *ctk_3d_vision_pro)
+{
+ RemoveGlassesDlg *dlg;
+ GtkWidget *label;
+ GtkWidget *hbox;
+ GtkWidget *parent = GTK_WIDGET(ctk_3d_vision_pro);
+
+ dlg = (RemoveGlassesDlg *)malloc(sizeof(RemoveGlassesDlg));
+ if (dlg == NULL) {
+ return NULL;
+ }
+
+ dlg->parent = parent;
+
+ /* Create the dialog */
+ dlg->dlg_remove_glasses = gtk_dialog_new_with_buttons
+ ("Remove glasses",
+ ctk_3d_vision_pro->parent_wnd,
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT |
+ GTK_DIALOG_NO_SEPARATOR,
+ GTK_STOCK_OK,
+ GTK_RESPONSE_OK,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_REJECT,
+ NULL);
+
+ gtk_dialog_set_default_response(GTK_DIALOG(dlg->dlg_remove_glasses),
+ GTK_RESPONSE_REJECT);
+
+ label = gtk_label_new("Remove glasses synced to this hub:");
+ hbox = gtk_hbox_new(TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 20);
+
+ //generate menu option for glasses' name
+ dlg->mnu_glasses_name = create_glasses_list_menu(ctk_3d_vision_pro,
+ HTU(0)->glasses_info, HTU(0)->num_glasses,
+ (gpointer)dlg);
+ gtk_box_pack_start(GTK_BOX(hbox), dlg->mnu_glasses_name,
+ TRUE, TRUE, 0);
+ gtk_box_pack_start
+ (GTK_BOX(GTK_DIALOG(dlg->dlg_remove_glasses)->vbox),
+ hbox, TRUE, TRUE, 20);
+
+ gtk_dialog_set_has_separator(GTK_DIALOG(dlg->dlg_remove_glasses), TRUE);
+
+ gtk_widget_show_all(GTK_DIALOG(dlg->dlg_remove_glasses)->vbox);
+
+ return dlg;
+}
+
+static void remove_button_clicked(GtkButton *button, gpointer user_data)
+{
+ Ctk3DVisionPro *ctk_3d_vision_pro = CTK_3D_VISION_PRO(user_data);
+ RemoveGlassesDlg *dlg;
+ gint result;
+
+ dlg = create_remove_glasses_dlg(ctk_3d_vision_pro);
+
+ if (dlg == NULL) {
+ return;
+ }
+
+ dlg->glasses_selected_index = -1;
+ gtk_window_set_transient_for
+ (GTK_WINDOW(dlg->dlg_remove_glasses),
+ GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(dlg->parent))));
+
+ gtk_window_resize(GTK_WINDOW(dlg->dlg_remove_glasses), 350, 1);
+ gtk_window_set_resizable(GTK_WINDOW(dlg->dlg_remove_glasses),
+ FALSE);
+
+ gtk_widget_show(dlg->dlg_remove_glasses);
+ result = gtk_dialog_run(GTK_DIALOG(dlg->dlg_remove_glasses));
+ gtk_widget_hide(dlg->dlg_remove_glasses);
+
+ /* Handle user's response */
+ switch (result) {
+ case GTK_RESPONSE_OK:
+ dlg->glasses_selected_index = gtk_option_menu_get_history(GTK_OPTION_MENU(dlg->mnu_glasses_name));
+
+ if (dlg->glasses_selected_index >= 0 &&
+ dlg->glasses_selected_index < HTU(0)->num_glasses) {
+ unsigned int glasses_id = HTU(0)->glasses_info[dlg->glasses_selected_index]->glasses_id;
+
+ XNVCTRLSetTargetAttribute(NvCtrlGetDisplayPtr(ctk_3d_vision_pro->handle),
+ NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER,
+ 0, 0,
+ NV_CTRL_3D_VISION_PRO_UNPAIR_GLASSES,
+ glasses_id);
+ }
+ break;
+ default:
+ /* do nothing. */
+ break;
+ }
+
+ free(dlg);
+}
+
+//=============================================================================
+
+static IdentifyGlassesDlg *create_identify_glasses_dlg(Ctk3DVisionPro *ctk_3d_vision_pro)
+{
+ IdentifyGlassesDlg *dlg;
+ GtkWidget *label;
+ GtkWidget *hbox;
+ GtkWidget *parent = GTK_WIDGET(ctk_3d_vision_pro);
+
+ dlg = (IdentifyGlassesDlg *)malloc(sizeof(IdentifyGlassesDlg));
+ if (dlg == NULL) {
+ return NULL;
+ }
+
+ dlg->parent = parent;
+
+ /* Create the dialog */
+ dlg->dlg_identify_glasses = gtk_dialog_new_with_buttons
+ ("Identify glasses",
+ ctk_3d_vision_pro->parent_wnd,
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT |
+ GTK_DIALOG_NO_SEPARATOR,
+ GTK_STOCK_OK,
+ GTK_RESPONSE_OK,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_REJECT,
+ NULL);
+
+ gtk_dialog_set_default_response(GTK_DIALOG(dlg->dlg_identify_glasses),
+ GTK_RESPONSE_REJECT);
+
+ label = gtk_label_new("Identify selected glasses:");
+ hbox = gtk_hbox_new(TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 20);
+
+ /* Select glasses to identify */
+ dlg->mnu_glasses_name = create_glasses_list_menu(ctk_3d_vision_pro,
+ HTU(0)->glasses_info, HTU(0)->num_glasses,
+ (gpointer)dlg);
+ gtk_box_pack_start(GTK_BOX(hbox), dlg->mnu_glasses_name,
+ TRUE, TRUE, 0);
+ gtk_box_pack_start
+ (GTK_BOX(GTK_DIALOG(dlg->dlg_identify_glasses)->vbox),
+ hbox, TRUE, TRUE, 20);
+
+ gtk_dialog_set_has_separator(GTK_DIALOG(dlg->dlg_identify_glasses), TRUE);
+
+ gtk_widget_show_all(GTK_DIALOG(dlg->dlg_identify_glasses)->vbox);
+
+ return dlg;
+}
+
+static void identify_button_clicked(GtkButton *button, gpointer user_data)
+{
+ Ctk3DVisionPro *ctk_3d_vision_pro = CTK_3D_VISION_PRO(user_data);
+ IdentifyGlassesDlg *dlg;
+ gint result;
+ unsigned int glasses_id;
+
+ dlg = create_identify_glasses_dlg(ctk_3d_vision_pro);
+
+ if (dlg == NULL) {
+ return;
+ }
+
+ dlg->glasses_selected_index = -1;
+ gtk_window_set_transient_for
+ (GTK_WINDOW(dlg->dlg_identify_glasses),
+ GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(dlg->parent))));
+
+ gtk_window_resize(GTK_WINDOW(dlg->dlg_identify_glasses), 350, 1);
+ gtk_window_set_resizable(GTK_WINDOW(dlg->dlg_identify_glasses),
+ FALSE);
+
+ gtk_widget_show(dlg->dlg_identify_glasses);
+ result = gtk_dialog_run(GTK_DIALOG(dlg->dlg_identify_glasses));
+ gtk_widget_hide(dlg->dlg_identify_glasses);
+
+ /* Handle user's response */
+ switch (result) {
+ case GTK_RESPONSE_OK:
+ dlg->glasses_selected_index = gtk_option_menu_get_history(GTK_OPTION_MENU(dlg->mnu_glasses_name));
+
+ if (dlg->glasses_selected_index >= 0 &&
+ dlg->glasses_selected_index < HTU(0)->num_glasses) {
+ glasses_id = HTU(0)->glasses_info[dlg->glasses_selected_index]->glasses_id;
+
+ XNVCTRLSetTargetAttribute(NvCtrlGetDisplayPtr(ctk_3d_vision_pro->handle),
+ NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER,
+ 0, 0,
+ NV_CTRL_3D_VISION_PRO_IDENTIFY_GLASSES,
+ glasses_id);
+ }
+ break;
+ default:
+ /* do nothing. */
+ break;
+ }
+
+ free(dlg);
+}
+
+//=============================================================================
+
+static RenameGlassesDlg *create_rename_glasses_dlg(Ctk3DVisionPro *ctk_3d_vision_pro)
+{
+ RenameGlassesDlg *dlg;
+ GtkWidget *label;
+ GtkWidget *hbox;
+ GtkWidget *new_glasses_name;
+ const char *__new_glasses_name_tooltip = "Add new glasses name";
+
+ GtkWidget *parent = GTK_WIDGET(ctk_3d_vision_pro);
+ dlg = (RenameGlassesDlg *)malloc(sizeof(RenameGlassesDlg));
+ if (dlg == NULL) {
+ return NULL;
+ }
+
+ dlg->parent = parent;
+
+ /* Create the dialog */
+ dlg->dlg_rename_glasses = gtk_dialog_new_with_buttons
+ ("Rename glasses",
+ ctk_3d_vision_pro->parent_wnd,
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT |
+ GTK_DIALOG_NO_SEPARATOR,
+ GTK_STOCK_SAVE,
+ GTK_RESPONSE_ACCEPT,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_REJECT,
+ NULL);
+
+ gtk_dialog_set_default_response(GTK_DIALOG(dlg->dlg_rename_glasses),
+ GTK_RESPONSE_REJECT);
+
+
+ label = gtk_label_new("Name:");
+ hbox = gtk_hbox_new(TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 20);
+
+ /* Select glasses to remove */
+ dlg->mnu_glasses_name = create_glasses_list_menu(ctk_3d_vision_pro,
+ HTU(0)->glasses_info, HTU(0)->num_glasses,
+ (gpointer)dlg);
+ gtk_box_pack_start(GTK_BOX(hbox), dlg->mnu_glasses_name,
+ TRUE, TRUE, 0);
+
+ gtk_box_pack_start
+ (GTK_BOX(GTK_DIALOG(dlg->dlg_rename_glasses)->vbox),
+ hbox, TRUE, TRUE, 20);
+
+ new_glasses_name = gtk_entry_new();
+ ctk_config_set_tooltip(ctk_3d_vision_pro->ctk_config, new_glasses_name,
+ __new_glasses_name_tooltip);
+ g_signal_connect(G_OBJECT(new_glasses_name), "activate",
+ G_CALLBACK(new_glasses_name_activate),
+ (gpointer) dlg);
+ g_signal_connect(G_OBJECT(new_glasses_name), "focus-out-event",
+ G_CALLBACK(new_glasses_name_focus_out),
+ (gpointer) dlg);
+
+ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg->dlg_rename_glasses)->vbox),
+ new_glasses_name, TRUE, TRUE, 0);
+
+ gtk_dialog_set_has_separator(GTK_DIALOG(dlg->dlg_rename_glasses), TRUE);
+
+ gtk_widget_show_all(GTK_DIALOG(dlg->dlg_rename_glasses)->vbox);
+
+ return dlg;
+}
+
+static void rename_button_clicked(GtkButton *button, gpointer user_data)
+{
+ Ctk3DVisionPro *ctk_3d_vision_pro = CTK_3D_VISION_PRO(user_data);
+ RenameGlassesDlg *dlg;
+ gint result;
+
+ dlg = create_rename_glasses_dlg(ctk_3d_vision_pro);
+
+ if (dlg == NULL) {
+ return;
+ }
+
+ dlg->glasses_new_name = NULL;
+
+ dlg->glasses_selected_index = -1;
+ gtk_window_set_transient_for
+ (GTK_WINDOW(dlg->dlg_rename_glasses),
+ GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(dlg->parent))));
+
+ gtk_window_resize(GTK_WINDOW(dlg->dlg_rename_glasses), 350, 1);
+ gtk_window_set_resizable(GTK_WINDOW(dlg->dlg_rename_glasses),
+ FALSE);
+
+ gtk_widget_show(dlg->dlg_rename_glasses);
+
+ do {
+ result = gtk_dialog_run(GTK_DIALOG(dlg->dlg_rename_glasses));
+
+ if (result == GTK_RESPONSE_ACCEPT) {
+ int i;
+ dlg->glasses_selected_index =
+ gtk_option_menu_get_history(GTK_OPTION_MENU(dlg->mnu_glasses_name));
+
+ if (dlg->glasses_new_name == NULL || strlen(dlg->glasses_new_name) == 0) {
+ continue;
+ }
+
+ for (i = 0; i < HTU(0)->num_glasses; i++) {
+ if (!strncmp(dlg->glasses_new_name, HTU(0)->glasses_info[i]->name,
+ sizeof(HTU(0)->glasses_info[i]->name))) {
+ break;
+ }
+ }
+ if (i == HTU(0)->num_glasses) {
+ goto new_unique_name_set;
+ }
+ }
+
+ } while (result != GTK_RESPONSE_REJECT);
+ goto no_name_set;
+
+new_unique_name_set:
+ if (dlg->glasses_selected_index >= 0 &&
+ dlg->glasses_selected_index < HTU(0)->num_glasses) {
+ unsigned int glasses_id = HTU(0)->glasses_info[dlg->glasses_selected_index]->glasses_id;
+
+ XNVCTRLSetTargetStringAttribute(NvCtrlGetDisplayPtr(ctk_3d_vision_pro->handle),
+ NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER,
+ 0, glasses_id,
+ NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME,
+ dlg->glasses_new_name);
+
+ strncpy(HTU(0)->glasses_info[dlg->glasses_selected_index]->name, dlg->glasses_new_name,
+ sizeof(HTU(0)->glasses_info[dlg->glasses_selected_index]->name));
+ HTU(0)->glasses_info[dlg->glasses_selected_index]->name[GLASSES_NAME_MAX_LENGTH - 1] = '\0';
+
+ update_glasses_info_data_table(&(ctk_3d_vision_pro->table), HTU(0)->glasses_info);
+ gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->table.data_table));
+ }
+no_name_set:
+
+ gtk_widget_hide(dlg->dlg_rename_glasses);
+
+ free(dlg->glasses_new_name);
+ free(dlg);
+}
+
+//=============================================================================
+
+static ChannelRangeDlg *create_channel_range_change_dlg(Ctk3DVisionPro *ctk_3d_vision_pro,
+ SVP_RANGE range)
+{
+ ChannelRangeDlg *dlg;
+ GtkWidget *label = NULL;
+ GtkWidget *hbox;
+ GtkWidget *parent = GTK_WIDGET(ctk_3d_vision_pro);
+
+ dlg = (ChannelRangeDlg *)malloc(sizeof(ChannelRangeDlg));
+ if (dlg == NULL) {
+ return NULL;
+ }
+
+ dlg->parent = parent;
+
+ /* Create the dialog */
+ dlg->dlg_channel_range = gtk_dialog_new_with_buttons
+ ("Modify Hub Range",
+ ctk_3d_vision_pro->parent_wnd,
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT |
+ GTK_DIALOG_NO_SEPARATOR,
+ GTK_STOCK_YES,
+ GTK_RESPONSE_YES,
+ GTK_STOCK_NO,
+ GTK_RESPONSE_NO,
+ NULL);
+
+ gtk_dialog_set_default_response(GTK_DIALOG(dlg->dlg_channel_range),
+ GTK_RESPONSE_REJECT);
+
+ switch (range) {
+ case SVP_SHORT_RANGE:
+ label = gtk_label_new("You have changed transceiver range to short range (less than 2m.).\n"
+ "Only glasses in this range will be available.\n\n"
+ "Do you want to apply changes?");
+ break;
+ case SVP_MEDIUM_RANGE:
+ label = gtk_label_new("You have changed transceiver range to medium range (less than 10m.).\n"
+ "Only glasses in this range will be available.\n\n"
+ "Do you want to apply changes?");
+ break;
+ case SVP_LONG_RANGE:
+ label = gtk_label_new("You have changed transceiver range to long range.\n"
+ "Only glasses in this range will be available.\n\n"
+ "Do you want to apply changes?");
+ break;
+ case SVP_INVALID_RANGE:
+ label = gtk_label_new("Invalid selection.\n");
+ break;
+ }
+
+ hbox = gtk_hbox_new(TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 20);
+ gtk_box_pack_start
+ (GTK_BOX(GTK_DIALOG(dlg->dlg_channel_range)->vbox),
+ hbox, TRUE, TRUE, 20);
+
+ gtk_dialog_set_has_separator(GTK_DIALOG(dlg->dlg_channel_range), TRUE);
+
+ gtk_widget_show_all(GTK_DIALOG(dlg->dlg_channel_range)->vbox);
+
+ return dlg;
+}
+
+static void channel_range_changed(
+ GtkOptionMenu *option_menu,
+ gpointer user_data
+)
+{
+ Ctk3DVisionPro *ctk_3d_vision_pro = CTK_3D_VISION_PRO(user_data);
+ ChannelRangeDlg *dlg;
+ gint result;
+ SVP_RANGE range;
+ SVP_RANGE prev_range;
+
+ range = gtk_option_menu_get_history(option_menu);
+ prev_range = HTU(0)->channel_range;
+
+ if (HTU(0)->channel_range == range) {
+ return;
+ }
+ if (range == SVP_INVALID_RANGE) {
+ gtk_option_menu_set_history(GTK_OPTION_MENU(ctk_3d_vision_pro->option_menu), prev_range);
+ return;
+ }
+
+ dlg = create_channel_range_change_dlg(ctk_3d_vision_pro, range);
+
+ gtk_window_set_transient_for
+ (GTK_WINDOW(dlg->dlg_channel_range),
+ GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(dlg->parent))));
+
+ gtk_window_resize(GTK_WINDOW(dlg->dlg_channel_range), 350, 1);
+ gtk_window_set_resizable(GTK_WINDOW(dlg->dlg_channel_range),
+ FALSE);
+
+ gtk_widget_show(dlg->dlg_channel_range);
+ result = gtk_dialog_run(GTK_DIALOG(dlg->dlg_channel_range));
+ gtk_widget_hide(dlg->dlg_channel_range);
+
+ /* Handle user's response */
+ switch (result) {
+ case GTK_RESPONSE_YES:
+ HTU(0)->channel_range = range;
+ /* Send NV-Control command */
+ XNVCTRLSetTargetAttribute(NvCtrlGetDisplayPtr(ctk_3d_vision_pro->handle),
+ NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER,
+ 0, 0,
+ NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE,
+ (HTU(0)->channel_range));
+
+ enable_widgets(ctk_3d_vision_pro, (HTU(0)->channel_range == SVP_LONG_RANGE ? FALSE : TRUE));
+
+ break;
+ case GTK_RESPONSE_NO:
+ gtk_option_menu_set_history(GTK_OPTION_MENU(ctk_3d_vision_pro->option_menu), prev_range);
+ break;
+ default:
+ /* do nothing. */
+ break;
+ }
+ free(dlg);
+}
+
+//*****************************************************************************
+
+GtkWidget* ctk_3d_vision_pro_new(NvCtrlAttributeHandle *handle,
+ CtkConfig *ctk_config, ParsedAttribute *p,
+ CtkEvent *ctk_event)
+{
+ GObject *object;
+ Ctk3DVisionPro *ctk_3d_vision_pro;
+ GtkWidget *mainhbox;
+ GtkWidget *leftvbox;
+ GtkWidget *rightvbox;
+ GtkWidget *banner;
+ GtkWidget *alignment;
+ GtkWidget *vbox;
+ GtkWidget *vbox1, *vbox2;
+ GtkWidget *frame_vbox;
+ GtkWidget *label;
+ GtkWidget *frame;
+ GtkWidget *hbox;
+ GtkWidget *hbox1;
+ GtkWidget *hseparator;
+ int i;
+ GtkWidget *image;
+ GtkWidget *menu;
+ char temp[64]; //scratchpad memory used to construct labels.
+ unsigned char *paired_glasses_list = NULL;
+ int len;
+ int target_id = 0;
+ Bool ret;
+
+ object = g_object_new(CTK_TYPE_3D_VISION_PRO, NULL);
+ ctk_3d_vision_pro = CTK_3D_VISION_PRO(object);
+
+ ctk_3d_vision_pro->handle = handle;
+ ctk_3d_vision_pro->ctk_config = ctk_config;
+ ctk_3d_vision_pro->add_glasses_dlg = NULL;
+
+ // populate ctk_3d_vision_pro...
+ // query attributes and fill the data ..
+ ctk_3d_vision_pro->num_htu = 1;
+ ctk_3d_vision_pro->htu_info = (HtuInfo **) malloc(sizeof(HtuInfo *) *
+ ctk_3d_vision_pro->num_htu);;
+ for (i = 0; i < ctk_3d_vision_pro->num_htu; i++) {
+ HtuInfo *htu = (HtuInfo*) malloc(sizeof(HtuInfo));
+ HTU(i) = htu;
+ }
+
+ ret = XNVCTRLQueryTargetAttribute(NvCtrlGetDisplayPtr(handle),
+ NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER,
+ 0, 0,
+ NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL,
+ (int *)&(HTU(0)->channel_num));
+ if (ret != TRUE) {
+ HTU(0)->channel_num = 0;
+ }
+
+ ret = XNVCTRLQueryTargetAttribute(NvCtrlGetDisplayPtr(handle),
+ NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER,
+ 0, HTU(0)->channel_num,
+ NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_QUALITY,
+ (int *)&(HTU(0)->signal_strength));
+ if (ret != TRUE) {
+ HTU(0)->signal_strength = 0;
+ }
+
+ ret = XNVCTRLQueryTargetAttribute(NvCtrlGetDisplayPtr(handle),
+ NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER,
+ 0, 0,
+ NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE,
+ (int *)&(HTU(0)->channel_range));
+ if (ret != TRUE) {
+ HTU(0)->channel_range = SVP_INVALID_RANGE;
+ }
+
+ // validate channel range
+ if (!(HTU(0)->channel_range == SVP_SHORT_RANGE ||
+ HTU(0)->channel_range == SVP_MEDIUM_RANGE ||
+ HTU(0)->channel_range == SVP_LONG_RANGE)) {
+ HTU(0)->channel_range = SVP_INVALID_RANGE;
+ }
+
+ ret = XNVCTRLQueryTargetBinaryData(NvCtrlGetDisplayPtr(ctk_3d_vision_pro->handle),
+ NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER,
+ target_id, 0,
+ NV_CTRL_BINARY_DATA_GLASSES_PAIRED_TO_3D_VISION_PRO_TRANSCEIVER,
+ &paired_glasses_list, &len);
+
+ if (ret != TRUE) {
+ HTU(0)->num_glasses = 0;
+ HTU(0)->glasses_info = NULL;
+ } else {
+ HTU(0)->num_glasses = ((unsigned int *)paired_glasses_list)[0];
+ HTU(0)->glasses_info = (GlassesInfo **)malloc(sizeof(GlassesInfo *) *
+ HTU(0)->num_glasses);
+ }
+
+ for (i = 0; i < HTU(0)->num_glasses; i++) {
+ int battery_level;
+ char *glasses_name;
+ GlassesInfo *glasses = (GlassesInfo *)malloc(sizeof(GlassesInfo));
+ unsigned int glasses_id = ((unsigned int *)paired_glasses_list)[i+1];
+
+ HTU(0)->glasses_info[i] = glasses;
+
+ ret = XNVCTRLQueryTargetStringAttribute(NvCtrlGetDisplayPtr(ctk_3d_vision_pro->handle),
+ NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER,
+ target_id, glasses_id,
+ NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME,
+ &glasses_name);
+ if (ret != TRUE) {
+ glasses_name = NULL;
+ }
+
+ ret = XNVCTRLQueryTargetAttribute(NvCtrlGetDisplayPtr(ctk_3d_vision_pro->handle),
+ NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER,
+ target_id, glasses_id,
+ NV_CTRL_3D_VISION_PRO_GLASSES_BATTERY_LEVEL,
+ (int *)&battery_level);
+ if (ret != TRUE) {
+ battery_level = 0;
+ }
+
+ strncpy(glasses->name, glasses_name, sizeof(glasses->name));
+ glasses->name[sizeof(glasses->name) - 1] = '\0';
+ glasses->battery = battery_level;
+ glasses->glasses_id = glasses_id;
+ init_glasses_info_widgets(glasses);
+ free(glasses_name);
+ }
+
+//-----------------------------------------------------------------------------
+// Construct and display NVIDIA 3D VisionPro page
+
+ gtk_box_set_spacing(GTK_BOX(ctk_3d_vision_pro), 5);
+
+ /*
+ * Banner: TOP - LEFT -> RIGHT
+ *
+ * This image serves as a visual reference for basic color_box correction
+ * purposes.
+ */
+
+ banner = ctk_banner_image_new(BANNER_ARTWORK_SVP);
+ gtk_box_pack_start(GTK_BOX(ctk_3d_vision_pro), banner, FALSE, FALSE, 0);
+
+ mainhbox = gtk_hbox_new(FALSE, 5);
+ gtk_box_pack_start(GTK_BOX(ctk_3d_vision_pro), mainhbox,
+ FALSE, FALSE, 0);
+
+//-----------------------------------------------------------------------------
+// left vertical box
+
+ leftvbox = gtk_vbox_new(FALSE, 5);
+ gtk_box_pack_start(GTK_BOX(mainhbox), leftvbox, FALSE, FALSE, 0);
+
+ frame = gtk_frame_new("Glasses");
+ gtk_box_pack_start(GTK_BOX(leftvbox), frame, FALSE, FALSE, 0);
+
+
+ frame_vbox = gtk_vbox_new(FALSE, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(frame_vbox), 5);
+ gtk_container_add(GTK_CONTAINER(frame), frame_vbox);
+ alignment = gtk_alignment_new(0, 1, 0, 0);
+ gtk_box_pack_start(GTK_BOX(frame_vbox), alignment, TRUE, TRUE, 0);
+
+ snprintf(temp, sizeof(temp), "Glasses Connected: %d", HTU(0)->num_glasses);
+ label = gtk_label_new(temp);
+ gtk_container_add(GTK_CONTAINER(alignment), label);
+ ctk_3d_vision_pro->glasses_num_label = GTK_LABEL(label);
+
+
+ hbox = gtk_hbox_new(FALSE, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
+ alignment = gtk_alignment_new(0, 1, 0, 0);
+ gtk_box_pack_start(GTK_BOX(frame_vbox), alignment, TRUE, TRUE, 0);
+ gtk_container_add(GTK_CONTAINER(alignment), hbox);
+
+ add_button("Add Glasses", add_glasses_button_clicked, ctk_3d_vision_pro,
+ hbox, __add_glasses_tooltip);
+ ctk_3d_vision_pro->refresh_button =
+ add_button("Refresh", refresh_button_clicked, ctk_3d_vision_pro,
+ hbox, __refresh_tooltip);
+ ctk_3d_vision_pro->identify_button =
+ add_button("Identify", identify_button_clicked, ctk_3d_vision_pro,
+ hbox, __identify_tooltip);
+ ctk_3d_vision_pro->rename_button =
+ add_button("Rename", rename_button_clicked, ctk_3d_vision_pro,
+ hbox, __rename_tooltip);
+ ctk_3d_vision_pro->remove_button =
+ add_button("Remove", remove_button_clicked, ctk_3d_vision_pro,
+ hbox, __remove_glasses_tooltip);
+
+ ctk_3d_vision_pro->table.rows = HTU(0)->num_glasses;
+ ctk_3d_vision_pro->table.columns = NUM_GLASSES_INFO_ATTRIBS;
+ create_glasses_info_table(&(ctk_3d_vision_pro->table), HTU(0)->glasses_info,
+ frame_vbox, ctk_3d_vision_pro->ctk_config);
+
+//-----------------------------------------------------------------------------
+// right vertical box
+
+ rightvbox = gtk_vbox_new(FALSE, 10);
+ gtk_box_pack_start(GTK_BOX(mainhbox), rightvbox, FALSE, FALSE, 0);
+
+ frame = gtk_frame_new("RF Hub");
+ gtk_box_pack_start(GTK_BOX(rightvbox), frame, FALSE, FALSE, 0);
+
+ vbox = gtk_vbox_new(FALSE, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
+ gtk_container_add(GTK_CONTAINER(frame), vbox);
+
+ hbox = gtk_hbox_new(FALSE, 5);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+
+ vbox1 = gtk_vbox_new(FALSE, 5);
+ gtk_box_pack_start(GTK_BOX(hbox), vbox1, FALSE, FALSE, 0);
+ vbox2 = gtk_vbox_new(FALSE, 5);
+ gtk_box_pack_start(GTK_BOX(hbox), vbox2, FALSE, FALSE, 0);
+
+ snprintf(temp, sizeof(temp), "RF Hubs Connected:");
+ label = add_label(temp, vbox1);
+
+ hbox1 = gtk_hbox_new(FALSE, 5);
+ snprintf(temp, sizeof(temp), "Signal Strength:");
+ label = add_label(temp, hbox1);
+ gtk_box_pack_start(GTK_BOX(vbox1), hbox1, FALSE, FALSE, 0);
+
+ snprintf(temp, sizeof(temp), "%d", ctk_3d_vision_pro->num_htu);
+ hbox1 = gtk_hbox_new(FALSE, 5);
+ label = add_label(temp, hbox1);
+ gtk_box_pack_start(GTK_BOX(vbox2), hbox1, FALSE, FALSE, 0);
+
+ hbox1 = gtk_hbox_new(FALSE, 5);
+ snprintf(temp, sizeof(temp), "[%d%%]", HTU(0)->signal_strength);
+ image = gtk_image_new_from_pixbuf(gdk_pixbuf_new_from_xpm_data(
+ get_signal_strength_icon(HTU(0)->signal_strength)));
+ gtk_box_pack_start(GTK_BOX(hbox1), image, FALSE, FALSE, 0);
+ label = add_label(temp, hbox1);
+ ctk_3d_vision_pro->signal_strength_label = GTK_LABEL(label);
+ ctk_3d_vision_pro->signal_strength_image = image;
+ gtk_box_pack_start(GTK_BOX(vbox2), hbox1, FALSE, FALSE, 0);
+
+ snprintf(temp, sizeof(temp), "Current Channel ID:");
+ label = add_label(temp, vbox1);
+
+ snprintf(temp, sizeof(temp), "%d", HTU(0)->channel_num);
+ label = add_label(temp, vbox2);
+ ctk_3d_vision_pro->channel_num_label = GTK_LABEL(label);
+
+ hseparator = gtk_hseparator_new();
+ gtk_box_pack_start(GTK_BOX(vbox), hseparator, FALSE, FALSE, 0);
+
+ hbox = gtk_hbox_new(FALSE, 5);
+ label = add_label("Hub Range:", hbox);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+
+ hbox = gtk_hbox_new(FALSE, 5);
+ menu = gtk_menu_new();
+ add_menu_item(menu, "Invalid Range");
+ add_menu_item(menu, "Short Range (up to 2 meter)");
+ add_menu_item(menu, "Medium Range (up to 10 meter)");
+ add_menu_item(menu, "Long Range");
+ ctk_3d_vision_pro->option_menu = gtk_option_menu_new ();
+ gtk_option_menu_set_menu
+ (GTK_OPTION_MENU(ctk_3d_vision_pro->option_menu), menu);
+
+ alignment = gtk_alignment_new(0, 1, 0, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), alignment, TRUE, TRUE, 0);
+ gtk_container_add(GTK_CONTAINER(alignment), ctk_3d_vision_pro->option_menu);
+
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+
+ g_object_set_data(G_OBJECT(ctk_3d_vision_pro->option_menu),
+ "channel_range", GINT_TO_POINTER(0));
+
+ gtk_option_menu_set_history(GTK_OPTION_MENU(ctk_3d_vision_pro->option_menu),
+ HTU(0)->channel_range);
+ g_signal_connect(G_OBJECT(ctk_3d_vision_pro->option_menu), "changed",
+ G_CALLBACK(channel_range_changed),
+ (gpointer) ctk_3d_vision_pro);
+ enable_widgets(ctk_3d_vision_pro, (HTU(0)->channel_range == SVP_LONG_RANGE ? FALSE : TRUE));
+
+ ctk_config_set_tooltip(ctk_config, ctk_3d_vision_pro->option_menu,
+ __channel_range_tooltip);
+
+ ctk_3d_vision_pro->parent_wnd = GTK_WINDOW(gtk_widget_get_parent(GTK_WIDGET(ctk_3d_vision_pro)));
+
+ /* finally, show the widget */
+ gtk_widget_show_all(GTK_WIDGET(object));
+
+ g_signal_connect(G_OBJECT(ctk_event),
+ CTK_EVENT_NAME(NV_CTRL_3D_VISION_PRO_GLASSES_PAIR_EVENT),
+ G_CALLBACK(callback_glasses_paired),
+ (gpointer) ctk_3d_vision_pro);
+
+ g_signal_connect(G_OBJECT(ctk_event),
+ CTK_EVENT_NAME(NV_CTRL_3D_VISION_PRO_GLASSES_UNPAIR_EVENT),
+ G_CALLBACK(callback_glasses_unpaired),
+ (gpointer) ctk_3d_vision_pro);
+
+ g_signal_connect(G_OBJECT(ctk_event),
+ CTK_EVENT_NAME(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL),
+ G_CALLBACK(svp_config_changed),
+ (gpointer) ctk_3d_vision_pro);
+
+
+ g_signal_connect(G_OBJECT(ctk_event),
+ CTK_EVENT_NAME(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE),
+ G_CALLBACK(svp_config_changed),
+ (gpointer) ctk_3d_vision_pro);
+
+ g_signal_connect(G_OBJECT(ctk_event),
+ CTK_EVENT_NAME(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_QUALITY),
+ G_CALLBACK(svp_config_changed),
+ (gpointer) ctk_3d_vision_pro);
+
+ g_signal_connect(G_OBJECT(ctk_event),
+ CTK_EVENT_NAME(NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME),
+ G_CALLBACK(svp_config_changed),
+ (gpointer) ctk_3d_vision_pro);
+
+ return GTK_WIDGET(object);
+}
+
+
+GtkTextBuffer *ctk_3d_vision_pro_create_help(GtkTextTagTable *table)
+{
+ GtkTextIter i;
+ GtkTextBuffer *b;
+
+ b = gtk_text_buffer_new(table);
+ gtk_text_buffer_get_iter_at_offset(b, &i, 0);
+
+ ctk_help_title(b, &i, "NVIDIA® 3D VisionPro™ help");
+ ctk_help_para(b, &i, "Use this page to configure the NVIDIA® 3D VisionPro™ hub "
+ "and glasses. You can set up new glasses, change the "
+ "hub's range, view which glasses are synchronized with "
+ "the hub, and select a different channel to improve the "
+ "hub-to-glasses signal strength.");
+
+ ctk_help_para(b, &i, "NVIDIA® 3D Vision™ Pro is the professional version "
+ "of the 3D Visionâ„¢ stereo glasses and emitter. While "
+ "the 3D Vision kit uses infrared (IR) communication "
+ "from the emitter to the stereo glasses, the 3D Vision "
+ "Pro kit uses radio frequency (RF) bi-directional "
+ "communication between the emitter and the stereo "
+ "glasses. This allows multiple 3D Vision Pro hubs to "
+ "be used in the same area without conflicts.");
+
+ ctk_help_para(b, &i, "3D Vision Pro does not require line of sight between "
+ "the hub and the 3D Vision Pro glasses. This provides "
+ "more flexibility in the location, distance, and "
+ "position of the glasses with respect to the emitter.");
+
+
+ ctk_help_heading(b, &i, "Glasses Section");
+ ctk_help_para(b, &i, "This section contains various actions/configurations "
+ "that can be performed with the NVIDIA 3D VisionPro RF "
+ "glasses. This section also displays a list of glasses "
+ "synced to the hub and their battery levels.");
+
+ ctk_help_heading(b, &i, "Glasses Connected");
+ ctk_help_para(b, &i, "Shows how many glasses are connected and synchronized "
+ "with the hub.");
+
+ ctk_help_heading(b, &i, "Add glasses");
+ ctk_help_para(b, &i, __add_glasses_tooltip);
+ ctk_help_para(b, &i, "This action is used to set up new 3D Vision Pro Glasses. "
+ "On clicking this button the hub enters into pairing mode. "
+ "Follow the instructions on Add Glasses dialog box. "
+ "On pairing the new glasses, they appear in the glasses "
+ "information table. Choose 'Save' to save the newly paired "
+ " glasses or 'Cancel' if do not wish to store them.");
+
+ ctk_help_heading(b, &i, "Refresh Glasses' Information");
+ ctk_help_para(b, &i, __refresh_tooltip);
+ ctk_help_para(b, &i, "Refresh glasses information is typically required when- \n"
+ "o Glasses move in and out of the range.\n"
+ "o Get the updated battery level of all the glasses.");
+
+ ctk_help_heading(b, &i, "Identify glasses");
+ ctk_help_para(b, &i, "Select the glasses from the list of paired glasses that "
+ "you want to identify. Hub will communicate with the "
+ "selected glasses and make LED on the glasses blink "
+ "for a few seconds.");
+
+ ctk_help_heading(b, &i, "Rename glasses");
+ ctk_help_para(b, &i, __rename_tooltip);
+ ctk_help_para(b, &i, "Select the glasses from the list of paired glasses "
+ "that you want to rename and provide an unique new name.");
+
+ ctk_help_heading(b, &i, "Remove glasses");
+ ctk_help_para(b, &i, __remove_glasses_tooltip);
+ ctk_help_para(b, &i, "Select the glasses from the list of paired glasses "
+ "that you want to remove. On removal glasses get "
+ "unpaired and will not sync to the hub.");
+
+ ctk_help_heading(b, &i, "Glasses Information");
+ ctk_help_para(b, &i, __goggle_info_tooltip);
+
+ ctk_help_heading(b, &i, "Glasses Name");
+ ctk_help_para(b, &i, "Each pair of glasses has an unique name. "
+ "Glasses can be renamed using Rename button.");
+
+ ctk_help_heading(b, &i, "Battery Level");
+ ctk_help_para(b, &i, "Displays battery level icon along with the value in "
+ "percentage.");
+
+ ctk_help_heading(b, &i, "RF Hub section");
+ ctk_help_para(b, &i, "This section contains various actions that can be "
+ "performed on the NVIDIA® 3D VisionPro™ hub. This "
+ "section also displays signal strength of the channel "
+ "currently used and current channel ID.");
+
+ ctk_help_heading(b, &i, "Signal strength");
+ ctk_help_para(b, &i, "Shows the signal strength of the current hub channel as an icon "
+ "and also value in percentage. \n"
+ "Signal strength is from one of the six ranges below-\n"
+ "\tExcellent\t\t [100%]\n"
+ "\tVery Good\t [>75% - <100%]\n"
+ "\tGood \t\t [>50% - <75%]\n"
+ "\tLow \t\t [>25% - <50%]\n"
+ "\tVery Low \t\t [>0% - <25%]\n"
+ "\tNo Signal\t\t [0%]");
+
+ ctk_help_heading(b, &i, "Hub Range");
+ ctk_help_para(b, &i, __channel_range_tooltip);
+ ctk_help_para(b, &i, "The hub range is the farthest distance that the "
+ "glasses can synchronize with the 3D Vision Pro Hub. "
+ "You can reduce the hub range to limit the experience "
+ "to a small group, or increase the range to include "
+ "everyone in a large room.\n"
+ "Possible values for transeiver range are 'Short Range' "
+ "'Medium Range' and 'Long Range'.");
+ ctk_help_para(b, &i, "Short Range: \n"
+ "Allows glasses within a 2-meter (6.5-foot) range to "
+ "be synced with the hub. This range is typically used "
+ "for sharing 3D simulations and training information "
+ "on a local workstation.");
+ ctk_help_para(b, &i, "Medium Range: \n"
+ "Allows glasses within a 10-meter (32-foot) range to "
+ "be synced with the hub. This range is typically used "
+ "for sharing a presentation with a limited audience. or "
+ "interacting with 3D CAD models during a collaborative "
+ "design session.");
+ ctk_help_para(b, &i, "Long Range: \n"
+ "All glasses detected within the range and frequency of "
+ "the hub will be synced. This range is typically used "
+ "in a theater or visualization center.");
+
+ ctk_help_finish(b);
+
+ return b;
+}
+
+/* ctk_3d_vision_pro_select() *******************************************
+ *
+ * Callback function for when the 3D Vision Pro page is being displayed
+ * in the control panel.
+ *
+ */
+void ctk_3d_vision_pro_select(GtkWidget *w)
+{
+
+}
+
+/* ctk_3d_vision_pro_unselect() *****************************************
+ *
+ * Callback function for when the 3D VisionPro page is no longer being
+ * displayed by the control panel. (User clicked on another page.)
+ *
+ */
+void ctk_3d_vision_pro_unselect(GtkWidget *w)
+{
+
+}
+
+/* ctk_3d_vision_pro_config_file_attributes() ****************************
+ *
+ * Add to the ParsedAttribute list any attributes that we want saved
+ * in the config file.
+ *
+ */
+void ctk_3d_vision_pro_config_file_attributes(GtkWidget *w,
+ ParsedAttribute *head)
+{
+
+}
+
diff --git a/src/gtk+-2.x/ctk3dvisionpro.h b/src/gtk+-2.x/ctk3dvisionpro.h
new file mode 100644
index 0000000..ecf932d
--- /dev/null
+++ b/src/gtk+-2.x/ctk3dvisionpro.h
@@ -0,0 +1,155 @@
+/*
+ * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix
+ * and Linux systems.
+ *
+ * Copyright (C) 2010 NVIDIA Corporation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of Version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See Version 2
+ * of the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the:
+ *
+ * Free Software Foundation, Inc.
+ * 59 Temple Place - Suite 330
+ * Boston, MA 02111-1307, USA
+ *
+ */
+
+#ifndef __CTK_3D_VISION_PRO_H__
+#define __CTK_3D_VISION_PRO_H__
+
+#include "parse.h"
+#include "ctkevent.h"
+#include "ctkconfig.h"
+
+#define NUM_GLASSES_INFO_ATTRIBS 2
+#define GLASSES_NAME_MAX_LENGTH 128
+
+G_BEGIN_DECLS
+
+#define CTK_TYPE_3D_VISION_PRO (ctk_3d_vision_pro_get_type())
+
+#define CTK_3D_VISION_PRO(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), CTK_TYPE_3D_VISION_PRO, \
+ Ctk3DVisionPro))
+
+#define CTK_3D_VISION_PRO_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), CTK_TYPE_3D_VISION_PRO, \
+ Ctk3DVisionProClass))
+
+#define CTK_IS_3D_VISION_PRO(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), CTK_TYPE_3D_VISION_PRO))
+
+#define CTK_IS_3D_VISION_PRO_CLASS(class) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), CTK_TYPE_3D_VISION_PRO))
+
+#define CTK_3D_VISION_PRO_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS((obj), CTK_TYPE_3D_VISION_PRO, \
+ Ctk3DVisionProClass))
+
+typedef struct _Ctk3DVisionPro Ctk3DVisionPro;
+
+typedef struct _Ctk3DVisionProClass Ctk3DVisionProClass;
+
+typedef enum {
+ SVP_INVALID_RANGE = 0,
+ SVP_SHORT_RANGE,
+ SVP_MEDIUM_RANGE,
+ SVP_LONG_RANGE
+} SVP_RANGE;
+
+typedef struct GlassesInfoRec {
+ unsigned int glasses_id;
+ char name[GLASSES_NAME_MAX_LENGTH];
+ int battery;
+ GtkWidget *label[NUM_GLASSES_INFO_ATTRIBS];
+ GtkWidget *hbox[NUM_GLASSES_INFO_ATTRIBS];
+ GtkWidget *image;
+} GlassesInfo;
+
+typedef struct HtuInfoRec {
+ SVP_RANGE channel_range;
+ int channel_num;
+ int signal_strength;
+ guint num_glasses;
+ GlassesInfo** glasses_info;
+ struct HtuInfoRec *next;
+} HtuInfo;
+
+typedef struct WidgetSizeRec {
+ GtkWidget *widget;
+ int width;
+} WidgetSize;
+
+typedef struct GlassesInfoTableRec {
+ WidgetSize glasses_header_sizes[NUM_GLASSES_INFO_ATTRIBS];
+ GtkWidget *data_table;
+ GtkWidget *data_viewport, *full_viewport;
+ GtkWidget *vscrollbar, *hscrollbar;
+ int rows;
+ int columns;
+} GlassesInfoTable;
+
+
+typedef struct _AddGlassesDlg {
+ GtkWidget *parent;
+ GtkWidget *dlg_add_glasses;
+ GlassesInfo** glasses_info;
+ GlassesInfoTable table;
+ int new_glasses;
+ Bool in_pairing;
+ int pairing_attempts;
+} AddGlassesDlg;
+
+struct _Ctk3DVisionPro
+{
+ GtkVBox parent;
+ NvCtrlAttributeHandle *handle;
+ GtkWindow *parent_wnd;
+ CtkConfig *ctk_config;
+ GtkWidget *option_menu;
+ guint num_htu;
+ HtuInfo** htu_info;
+
+ GlassesInfoTable table;
+
+ GtkLabel *glasses_num_label;
+ GtkWidget *identify_button;
+ GtkWidget *refresh_button;
+ GtkWidget *rename_button;
+ GtkWidget *remove_button;
+ GtkLabel *channel_num_label;
+ GtkLabel *signal_strength_label;
+ GtkWidget *signal_strength_image;
+
+ AddGlassesDlg *add_glasses_dlg;
+};
+
+struct _Ctk3DVisionProClass
+{
+ GtkVBoxClass parent_class;
+ void (*changed) (Ctk3DVisionPro *);
+};
+
+GType ctk_3d_vision_pro_get_type (void) G_GNUC_CONST;
+GtkWidget* ctk_3d_vision_pro_new (NvCtrlAttributeHandle *,
+ CtkConfig *, ParsedAttribute *,
+ CtkEvent *);
+GtkTextBuffer *ctk_3d_vision_pro_create_help (GtkTextTagTable *);
+void ctk_3d_vision_pro_select (GtkWidget *w);
+void ctk_3d_vision_pro_unselect (GtkWidget *w);
+
+void ctk_3d_vision_pro_config_file_attributes(GtkWidget *w,
+ ParsedAttribute *head);
+
+G_END_DECLS
+
+#endif /* __CTK_3D_VISION_PRO_H__ */
+
diff --git a/src/gtk+-2.x/ctkbanner.c b/src/gtk+-2.x/ctkbanner.c
index ab0199c..2cd1f3e 100644
--- a/src/gtk+-2.x/ctkbanner.c
+++ b/src/gtk+-2.x/ctkbanner.c
@@ -63,7 +63,7 @@
#include "vcs_pixdata.h"
#include "x_pixdata.h"
#include "xvideo_pixdata.h"
-
+#include "svp_3dvp_pixdata.h"
static void
@@ -379,6 +379,7 @@ static gboolean select_artwork(BannerArtworkType artwork,
{ BANNER_ARTWORK_VCS, FALSE, 16, &vcs_pixdata },
{ BANNER_ARTWORK_X, FALSE, 16, &x_pixdata },
{ BANNER_ARTWORK_XVIDEO, FALSE, 16, &xvideo_pixdata },
+ { BANNER_ARTWORK_SVP, FALSE, 16, &svp_3dvp_pixdata },
{ BANNER_ARTWORK_INVALID, FALSE, 16, NULL },
};
diff --git a/src/gtk+-2.x/ctkbanner.h b/src/gtk+-2.x/ctkbanner.h
index ad4d493..61b9590 100644
--- a/src/gtk+-2.x/ctkbanner.h
+++ b/src/gtk+-2.x/ctkbanner.h
@@ -75,6 +75,7 @@ typedef enum {
BANNER_ARTWORK_VCS,
BANNER_ARTWORK_X,
BANNER_ARTWORK_XVIDEO,
+ BANNER_ARTWORK_SVP,
BANNER_ARTWORK_INVALID
} BannerArtworkType;
diff --git a/src/gtk+-2.x/ctkevent.c b/src/gtk+-2.x/ctkevent.c
index 66f243c..c1d6841 100644
--- a/src/gtk+-2.x/ctkevent.c
+++ b/src/gtk+-2.x/ctkevent.c
@@ -316,8 +316,13 @@ static void ctk_event_class_init(CtkEventClass *ctk_event_class)
MAKE_SIGNAL(NV_CTRL_GPU_CURRENT_PROCESSOR_CLOCK_FREQS);
MAKE_SIGNAL(NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS);
MAKE_SIGNAL(NV_CTRL_GPU_PCIE_MAX_LINK_SPEED);
+ MAKE_SIGNAL(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL);
+ MAKE_SIGNAL(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE);
+ MAKE_SIGNAL(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_QUALITY);
+ MAKE_SIGNAL(NV_CTRL_3D_VISION_PRO_GLASSES_MISSED_SYNC_CYCLES);
MAKE_SIGNAL(NV_CTRL_GVO_ANC_PARITY_COMPUTATION);
-
+ MAKE_SIGNAL(NV_CTRL_3D_VISION_PRO_GLASSES_PAIR_EVENT);
+ MAKE_SIGNAL(NV_CTRL_3D_VISION_PRO_GLASSES_UNPAIR_EVENT);
#undef MAKE_SIGNAL
/*
@@ -327,7 +332,7 @@ static void ctk_event_class_init(CtkEventClass *ctk_event_class)
* knows about.
*/
-#if NV_CTRL_LAST_ATTRIBUTE != NV_CTRL_GVO_ANC_PARITY_COMPUTATION
+#if NV_CTRL_LAST_ATTRIBUTE != NV_CTRL_3D_VISION_PRO_GLASSES_UNPAIR_EVENT
#warning "There are attributes that do not emit signals!"
#endif
@@ -370,9 +375,10 @@ static void ctk_event_class_init(CtkEventClass *ctk_event_class)
MAKE_STRING_SIGNAL(NV_CTRL_STRING_PERFORMANCE_MODES);
MAKE_STRING_SIGNAL(NV_CTRL_STRING_GVIO_VIDEO_FORMAT_NAME);
MAKE_STRING_SIGNAL(NV_CTRL_STRING_GPU_CURRENT_CLOCK_FREQS);
+ MAKE_STRING_SIGNAL(NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME);
#undef MAKE_STRING_SIGNAL
-#if NV_CTRL_STRING_LAST_ATTRIBUTE != NV_CTRL_STRING_GPU_CURRENT_CLOCK_FREQS
+#if NV_CTRL_STRING_LAST_ATTRIBUTE != NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME
#warning "There are attributes that do not emit signals!"
#endif
@@ -401,7 +407,7 @@ static void ctk_event_class_init(CtkEventClass *ctk_event_class)
#undef MAKE_BINARY_SIGNAL
-#if NV_CTRL_BINARY_DATA_LAST_ATTRIBUTE != NV_CTRL_BINARY_DATA_THERMAL_SENSORS_USED_BY_GPU
+#if NV_CTRL_BINARY_DATA_LAST_ATTRIBUTE != NV_CTRL_BINARY_DATA_GLASSES_PAIRED_TO_3D_VISION_PRO_TRANSCEIVER
#warning "There are attributes that do not emit signals!"
#endif
diff --git a/src/gtk+-2.x/ctkscreen.c b/src/gtk+-2.x/ctkscreen.c
index 2d3f764..2fdf384 100644
--- a/src/gtk+-2.x/ctkscreen.c
+++ b/src/gtk+-2.x/ctkscreen.c
@@ -51,6 +51,7 @@ static const _CtkStereoMode stereoMode[] = {
{ NV_CTRL_STEREO_CHECKERBOARD_PATTERN, "Checkerboard Pattern Stereo" },
{ NV_CTRL_STEREO_INVERSE_CHECKERBOARD_PATTERN, "Inverse Checkerboard Stereo" },
{ NV_CTRL_STEREO_3D_VISION, "NVIDIA 3D Vision Stereo" },
+ { NV_CTRL_STEREO_3D_VISION_PRO, "NVIDIA 3D Vision Pro Stereo" },
{ -1, NULL},
};
diff --git a/src/gtk+-2.x/ctkwindow.c b/src/gtk+-2.x/ctkwindow.c
index 11daaa2..f638326 100644
--- a/src/gtk+-2.x/ctkwindow.c
+++ b/src/gtk+-2.x/ctkwindow.c
@@ -59,6 +59,7 @@
#include "ctkclocks.h"
#include "ctkvcs.h"
#include "ctkpowersavings.h"
+#include "ctk3dvisionpro.h"
#include "ctkdisplaydevice-crt.h"
#include "ctkdisplaydevice-tv.h"
@@ -988,6 +989,29 @@ GtkWidget *ctk_window_new(ParsedAttribute *p, ConfigProperties *conf,
break;
}
+ /* add NVIDIA 3D VisionPro dongle configuration page */
+
+ for (i = 0; i < h->targets[NVIDIA_3D_VISION_PRO_TRANSCEIVER_TARGET].n; i++) {
+ NvCtrlAttributeHandle *svp_handle = h->targets[NVIDIA_3D_VISION_PRO_TRANSCEIVER_TARGET].t[i].h;
+
+ if (!svp_handle) continue;
+
+ /* create the object for receiving NV-CONTROL events */
+
+ ctk_event = CTK_EVENT(ctk_event_new(svp_handle));
+
+ widget = ctk_3d_vision_pro_new(svp_handle, ctk_config,
+ ctk_window->attribute_list,
+ ctk_event);
+ if (!widget) continue;
+
+ help = ctk_3d_vision_pro_create_help(tag_table);
+ add_page(widget, help, ctk_window, NULL, NULL,
+ "NVIDIA 3D VisionPro", ctk_3d_vision_pro_config_file_attributes,
+ ctk_3d_vision_pro_select, ctk_3d_vision_pro_unselect);
+ }
+
+
/* nvidia-settings configuration */
add_page(GTK_WIDGET(ctk_window->ctk_config),
diff --git a/src/gtk+-2.x/src.mk b/src/gtk+-2.x/src.mk
index 4b7ad45..1ba1b5d 100644
--- a/src/gtk+-2.x/src.mk
+++ b/src/gtk+-2.x/src.mk
@@ -47,6 +47,7 @@ GTK_SRC += ctkgvi.c
GTK_SRC += ctklicense.c
GTK_SRC += ctkecc.c
GTK_SRC += ctkcolorcontrols.c
+GTK_SRC += ctk3dvisionpro.c
GTK_EXTRA_DIST += ctkxvideo.h
GTK_EXTRA_DIST += ctkcursorshadow.h
@@ -94,4 +95,5 @@ GTK_EXTRA_DIST += ctkgvi.h
GTK_EXTRA_DIST += ctklicense.h
GTK_EXTRA_DIST += ctkecc.h
GTK_EXTRA_DIST += ctkcolorcontrols.h
+GTK_EXTRA_DIST += ctk3dvisionpro.h
GTK_EXTRA_DIST += src.mk
diff --git a/src/image_data/src.mk b/src/image_data/src.mk
index 6cef856..52c10e1 100644
--- a/src/image_data/src.mk
+++ b/src/image_data/src.mk
@@ -85,6 +85,8 @@ IMAGE_DATA_EXTRA_DIST += slimm_pixdata.h
IMAGE_DATA_EXTRA_DIST += solaris.png
IMAGE_DATA_EXTRA_DIST += solaris_pixdata.h
IMAGE_DATA_EXTRA_DIST += src.mk
+IMAGE_DATA_EXTRA_DIST += svp_3dvp.png
+IMAGE_DATA_EXTRA_DIST += svp_3dvp_pixdata.h
IMAGE_DATA_EXTRA_DIST += thermal.png
IMAGE_DATA_EXTRA_DIST += thermal_pixdata.h
IMAGE_DATA_EXTRA_DIST += tv.png
diff --git a/src/image_data/svp_3dvp.png b/src/image_data/svp_3dvp.png
new file mode 100644
index 0000000..f21a16c
--- /dev/null
+++ b/src/image_data/svp_3dvp.png
Binary files differ
diff --git a/src/image_data/svp_3dvp_pixdata.h b/src/image_data/svp_3dvp_pixdata.h
new file mode 100644
index 0000000..a910414
--- /dev/null
+++ b/src/image_data/svp_3dvp_pixdata.h
@@ -0,0 +1,519 @@
+/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */
+
+static guint8 svp_3dvp_pixdata_pixel_data[] = {
+ 0xe6,0x00,0x00,0x00,0x00,0x0b,0x80,0xe9,0x06,0x04,0x82,0xe9,0x06,0x0c,0x83,
+ 0xe9,0x06,0x12,0x84,0xe9,0x06,0x16,0x85,0xe9,0x06,0x18,0x86,0xe9,0x06,0x19,
+ 0x85,0xe9,0x06,0x18,0x84,0xe9,0x06,0x15,0x83,0xe9,0x06,0x10,0x81,0xe9,0x06,
+ 0x0a,0x80,0xe9,0x06,0x03,0xaf,0x00,0x00,0x00,0x00,0x0f,0x80,0xe9,0x06,0x07,
+ 0x82,0xe9,0x06,0x15,0x82,0xe9,0x06,0x3b,0x82,0xe9,0x06,0x67,0x83,0xe9,0x06,
+ 0x86,0x84,0xe9,0x06,0x98,0x85,0xe9,0x06,0xa2,0x86,0xe9,0x06,0xa5,0x85,0xe9,
+ 0x06,0x9f,0x83,0xe9,0x06,0x93,0x83,0xe9,0x06,0x7e,0x82,0xe9,0x06,0x5a,0x82,
+ 0xe9,0x06,0x2e,0x81,0xe9,0x06,0x11,0x80,0xe9,0x06,0x04,0xac,0x00,0x00,0x00,
+ 0x00,0x11,0x81,0xe9,0x06,0x10,0x81,0xe9,0x06,0x3f,0x82,0xe9,0x06,0x72,0x83,
+ 0xe9,0x06,0x83,0x83,0xe9,0x06,0x6c,0x81,0xe9,0x06,0x4a,0x80,0xe9,0x06,0x28,
+ 0x7f,0xe9,0x06,0x0f,0x80,0xe9,0x06,0x04,0x7f,0xe9,0x06,0x17,0x80,0xe9,0x06,
+ 0x33,0x82,0xe9,0x06,0x54,0x83,0xe9,0x06,0x75,0x83,0xe9,0x06,0x81,0x82,0xe9,
+ 0x06,0x64,0x81,0xe9,0x06,0x2e,0x81,0xe9,0x06,0x08,0x97,0x00,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x84,0x00,0x00,0x00,0x03,0x01,
+ 0x00,0x00,0x00,0x02,0x83,0x00,0x00,0x00,0x01,0x88,0x00,0x00,0x00,0x00,0x07,
+ 0x80,0xe9,0x06,0x02,0x82,0xe9,0x06,0x18,0x82,0xe9,0x06,0x56,0x82,0xe9,0x06,
+ 0x75,0x82,0xe9,0x06,0x57,0x81,0xe9,0x06,0x21,0x80,0xe9,0x06,0x03,0x87,0x00,
+ 0x00,0x00,0x00,0x07,0x80,0xe9,0x06,0x0a,0x82,0xe9,0x06,0x32,0x82,0xe9,0x06,
+ 0x64,0x82,0xe9,0x06,0x74,0x82,0xe9,0x06,0x3f,0x82,0xe9,0x06,0x0d,0x80,0xe9,
+ 0x06,0x01,0x94,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x82,0x00,0x00,0x00,0x05,0x01,
+ 0x00,0x00,0x00,0x06,0x82,0x00,0x00,0x00,0x07,0x05,0x00,0x00,0x00,0x06,0x00,
+ 0x00,0x00,0x05,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,
+ 0x83,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x05,0x82,0xe9,0x06,0x1c,
+ 0x82,0xe9,0x06,0x5d,0x83,0xe9,0x06,0x64,0x82,0xe9,0x06,0x2f,0x80,0xe9,0x06,
+ 0x07,0x8b,0x00,0x00,0x00,0x00,0x05,0x80,0xe9,0x06,0x10,0x82,0xe9,0x06,0x41,
+ 0x82,0xe9,0x06,0x6f,0x82,0xe9,0x06,0x48,0x82,0xe9,0x06,0x0a,0x94,0x00,0x00,
+ 0x00,0x00,0x17,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,
+ 0x0e,0x0e,0x0e,0x1f,0x16,0x16,0x16,0x44,0x17,0x17,0x17,0x3c,0x0e,0x0e,0x0e,
+ 0x28,0x07,0x07,0x07,0x1b,0x02,0x02,0x02,0x14,0x00,0x00,0x00,0x0e,0x00,0x00,
+ 0x00,0x0b,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x08,0x00,
+ 0x00,0x00,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,
+ 0x76,0xd4,0x06,0x16,0x81,0xe7,0x06,0x59,0x82,0xe8,0x06,0x5f,0x80,0xe5,0x06,
+ 0x1a,0x5d,0xa8,0x04,0x00,0x82,0x00,0x00,0x00,0x00,0x09,0x80,0xe9,0x06,0x10,
+ 0x82,0xe9,0x06,0x2e,0x83,0xe9,0x06,0x46,0x85,0xe9,0x06,0x53,0x86,0xe9,0x06,
+ 0x57,0x85,0xe9,0x06,0x4f,0x83,0xe9,0x06,0x3e,0x82,0xe9,0x06,0x25,0x80,0xe9,
+ 0x06,0x0a,0x82,0x00,0x00,0x00,0x00,0x05,0x81,0xe9,0x06,0x01,0x82,0xe9,0x06,
+ 0x2e,0x82,0xe9,0x06,0x73,0x82,0xe9,0x06,0x3d,0x81,0xe9,0x06,0x06,0x93,0x00,
+ 0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,
+ 0x08,0x0c,0x0c,0x0c,0x31,0x16,0x16,0x16,0x89,0x1e,0x1e,0x1e,0xaa,0x27,0x27,
+ 0x27,0xa2,0x2f,0x2f,0x2f,0x96,0x31,0x31,0x31,0x85,0x2d,0x2d,0x2d,0x71,0x24,
+ 0x24,0x24,0x5d,0x1a,0x1a,0x1a,0x4a,0x11,0x11,0x11,0x37,0x09,0x09,0x09,0x27,
+ 0x03,0x03,0x03,0x1a,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0b,0x49,0x84,0x03,
+ 0x12,0x79,0xd8,0x06,0x4d,0x7e,0xe1,0x06,0x71,0x75,0xd2,0x05,0x2d,0x0c,0x16,
+ 0x01,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x80,0xe6,0x06,0x2a,0x82,
+ 0xe9,0x06,0x5d,0x82,0xe9,0x06,0x78,0x82,0xe9,0x06,0x76,0x84,0xe9,0x06,0x6e,
+ 0x86,0xe9,0x06,0x68,0x84,0xe9,0x06,0x71,0x82,0xe9,0x06,0x77,0x82,0xe9,0x06,
+ 0x71,0x82,0xe9,0x06,0x4e,0x82,0xe9,0x06,0x19,0x82,0x00,0x00,0x00,0x00,0x05,
+ 0x81,0xe9,0x06,0x01,0x82,0xe9,0x06,0x45,0x82,0xe9,0x06,0x79,0x81,0xe9,0x06,
+ 0x28,0x80,0xe9,0x06,0x02,0x92,0x00,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x02,
+ 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0a,0x04,0x04,0x04,0x17,0x12,0x12,0x12,
+ 0x3d,0x1e,0x1e,0x1e,0x68,0x26,0x26,0x26,0x89,0x2a,0x2a,0x2a,0xa5,0x2e,0x2e,
+ 0x2e,0xc0,0x31,0x31,0x31,0xd5,0x33,0x33,0x33,0xda,0x32,0x32,0x32,0xcd,0x2f,
+ 0x2f,0x2f,0xbc,0x29,0x29,0x29,0xac,0x24,0x24,0x24,0x93,0x1e,0x1e,0x1e,0x77,
+ 0x18,0x18,0x18,0x59,0x40,0x6c,0x0c,0x56,0x71,0xca,0x06,0x81,0x70,0xc9,0x05,
+ 0x56,0x3c,0x6d,0x03,0x13,0x82,0x00,0x00,0x00,0x08,0x0d,0x78,0xd8,0x06,0x37,
+ 0x80,0xe6,0x06,0x72,0x81,0xe7,0x06,0x65,0x81,0xe7,0x06,0x3d,0x81,0xe9,0x06,
+ 0x22,0x80,0xe9,0x06,0x0d,0x80,0xe9,0x06,0x04,0x80,0xe9,0x06,0x14,0x81,0xe9,
+ 0x06,0x2a,0x82,0xe9,0x06,0x48,0x83,0xe9,0x06,0x6c,0x82,0xe9,0x06,0x5f,0x82,
+ 0xe9,0x06,0x1d,0x82,0x00,0x00,0x00,0x00,0x04,0x80,0xe9,0x06,0x0f,0x82,0xe9,
+ 0x06,0x6c,0x82,0xe9,0x06,0x66,0x82,0xe9,0x06,0x06,0x92,0x00,0x00,0x00,0x00,
+ 0x1b,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,
+ 0x00,0x0d,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x16,0x04,0x04,0x04,0x22,0x0e,
+ 0x0e,0x0e,0x32,0x1c,0x1c,0x1c,0x49,0x27,0x27,0x27,0x69,0x2b,0x2b,0x2b,0x89,
+ 0x2b,0x2b,0x2b,0xa8,0x2d,0x2d,0x2d,0xd2,0x30,0x30,0x30,0xf3,0x2f,0x2f,0x2f,
+ 0xf6,0x2a,0x2a,0x2a,0xe8,0x29,0x2d,0x24,0xd7,0x44,0x69,0x18,0xcf,0x56,0x8e,
+ 0x11,0xcc,0x30,0x46,0x16,0x95,0x14,0x14,0x14,0x59,0x0c,0x0c,0x0c,0x35,0x59,
+ 0x9f,0x05,0x41,0x7c,0xde,0x06,0x78,0x78,0xd7,0x06,0x4a,0x68,0xbb,0x05,0x1d,
+ 0x20,0x3a,0x02,0x05,0x82,0x00,0x00,0x00,0x01,0x83,0x00,0x00,0x00,0x00,0x05,
+ 0x81,0xe9,0x06,0x07,0x82,0xe9,0x06,0x22,0x83,0xe9,0x06,0x5c,0x82,0xe9,0x06,
+ 0x5d,0x82,0xe9,0x06,0x18,0x82,0x00,0x00,0x00,0x00,0x03,0x81,0xe9,0x06,0x33,
+ 0x83,0xe9,0x06,0x8d,0x81,0xe9,0x06,0x23,0x92,0x00,0x00,0x00,0x00,0x1a,0x00,
+ 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x08,
+ 0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x13,0x00,0x00,0x00,
+ 0x15,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x1f,0x05,0x05,0x05,0x29,0x0d,0x0d,
+ 0x0d,0x38,0x1a,0x1a,0x1a,0x52,0x21,0x21,0x21,0x79,0x25,0x25,0x25,0xaa,0x2b,
+ 0x2b,0x2b,0xdd,0x37,0x42,0x2a,0xfb,0x50,0x7b,0x1b,0xff,0x45,0x69,0x19,0xfa,
+ 0x22,0x24,0x1f,0xec,0x21,0x21,0x21,0xda,0x2b,0x35,0x20,0xc5,0x55,0x8c,0x12,
+ 0xc1,0x56,0x93,0x0d,0x9d,0x2a,0x47,0x09,0x38,0x03,0x03,0x02,0x0d,0x82,0x00,
+ 0x00,0x00,0x07,0x01,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x01,0x82,0x00,
+ 0x00,0x00,0x00,0x09,0x81,0xe9,0x06,0x00,0x82,0xe9,0x06,0x28,0x83,0xe9,0x06,
+ 0x70,0x82,0xe9,0x06,0x46,0x80,0xe9,0x06,0x09,0x00,0x00,0x00,0x00,0x80,0xe9,
+ 0x06,0x09,0x83,0xe9,0x06,0x83,0x82,0xe9,0x06,0x57,0x93,0x00,0x00,0x00,0x00,
+ 0x1f,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,
+ 0x00,0x06,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0e,0x00,
+ 0x00,0x00,0x11,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x1a,
+ 0x00,0x00,0x00,0x21,0x03,0x03,0x03,0x2b,0x0d,0x0d,0x0d,0x3d,0x18,0x18,0x18,
+ 0x5d,0x39,0x54,0x18,0x9d,0x58,0x8e,0x16,0xea,0x40,0x58,0x22,0xfc,0x26,0x26,
+ 0x26,0xff,0x23,0x23,0x23,0xff,0x39,0x51,0x1d,0xfe,0x52,0x84,0x15,0xfb,0x36,
+ 0x49,0x1e,0xe9,0x24,0x26,0x23,0xc3,0x1c,0x1c,0x1c,0x7f,0x0b,0x0b,0x0b,0x35,
+ 0x76,0xd4,0x05,0x52,0x80,0xe3,0x06,0x81,0x83,0xe6,0x06,0x92,0x81,0xe6,0x06,
+ 0x6f,0x7e,0xe4,0x06,0x32,0x82,0x00,0x00,0x00,0x00,0x04,0x81,0xe9,0x06,0x06,
+ 0x82,0xe9,0x06,0x53,0x82,0xe9,0x06,0x6e,0x82,0xe9,0x06,0x1d,0x82,0x00,0x00,
+ 0x00,0x00,0x02,0x82,0xe9,0x06,0x5e,0x83,0xe9,0x06,0x84,0x85,0x00,0x00,0x00,
+ 0x01,0x91,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,
+ 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,
+ 0x09,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x15,0x00,0x00,
+ 0x00,0x1a,0x00,0x00,0x00,0x21,0x01,0x01,0x01,0x2a,0x4b,0x83,0x06,0x5f,0x64,
+ 0xaf,0x0a,0xb0,0x31,0x47,0x17,0xa8,0x24,0x24,0x24,0xe0,0x25,0x25,0x25,0xff,
+ 0x46,0x6b,0x19,0xff,0x4c,0x76,0x16,0xff,0x2b,0x34,0x20,0xff,0x22,0x22,0x22,
+ 0xfc,0x22,0x22,0x22,0xee,0x40,0x62,0x17,0xd8,0x62,0xa8,0x0d,0xbe,0x62,0xae,
+ 0x07,0x72,0x76,0xd2,0x05,0x3c,0x7c,0xdf,0x06,0x69,0x80,0xe4,0x06,0x76,0x7e,
+ 0xe3,0x06,0x32,0x82,0x00,0x00,0x00,0x00,0x03,0x81,0xe9,0x06,0x32,0x82,0xe9,
+ 0x06,0x7e,0x83,0xe9,0x06,0x2e,0x82,0x00,0x00,0x00,0x00,0x02,0x80,0xe9,0x06,
+ 0x38,0x84,0xe9,0x06,0xa2,0x82,0x00,0x00,0x00,0x04,0x82,0x00,0x00,0x00,0x03,
+ 0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x94,0x00,0x00,0x00,0x00,0x1e,
+ 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x11,0x00,0x00,
+ 0x00,0x19,0x5f,0xa6,0x04,0x54,0x70,0xc4,0x05,0x99,0x1e,0x33,0x06,0x48,0x0f,
+ 0x0f,0x0f,0x68,0x1c,0x1c,0x1c,0xbe,0x4f,0x7e,0x15,0xf6,0x43,0x64,0x19,0xff,
+ 0x26,0x2a,0x21,0xff,0x21,0x21,0x21,0xff,0x20,0x20,0x20,0xff,0x58,0x91,0x12,
+ 0xfe,0x40,0x5f,0x1a,0xf9,0x2b,0x2f,0x26,0xd3,0x1e,0x21,0x1a,0x64,0x54,0x97,
+ 0x04,0x2a,0x7d,0xe1,0x06,0x6c,0x80,0xe3,0x06,0x63,0x00,0x00,0x00,0x01,0x00,
+ 0x00,0x00,0x00,0x80,0xe9,0x06,0x16,0x84,0xe9,0x06,0x81,0x85,0xe9,0x06,0x39,
+ 0x82,0x00,0x00,0x00,0x00,0x09,0x7f,0xe9,0x06,0x17,0x85,0xe9,0x06,0xb5,0x00,
+ 0x00,0x00,0x07,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,
+ 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x97,0x00,0x00,
+ 0x00,0x00,0x1a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,
+ 0x00,0x00,0x00,0x0b,0x71,0xc5,0x05,0x4b,0x77,0xd0,0x05,0x90,0x05,0x0a,0x00,
+ 0x29,0x01,0x01,0x01,0x33,0x05,0x05,0x05,0x4f,0x5e,0xa0,0x09,0xbd,0x3e,0x59,
+ 0x1c,0xfc,0x23,0x24,0x23,0xff,0x21,0x21,0x21,0xff,0x20,0x20,0x20,0xff,0x69,
+ 0xb1,0x0d,0xff,0x23,0x29,0x1d,0xff,0x1e,0x1e,0x1e,0xfd,0x24,0x24,0x24,0xea,
+ 0x27,0x2a,0x24,0x8f,0x64,0xaf,0x06,0x60,0x82,0xe3,0x06,0x7e,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x01,0x81,0xe9,0x06,0x03,0x86,0xe9,0x06,0x80,0x86,0xe9,
+ 0x06,0x3f,0x82,0x00,0x00,0x00,0x00,0x0a,0x80,0xe9,0x06,0x03,0x86,0xe9,0x06,
+ 0xbe,0x05,0x05,0x05,0x08,0x09,0x09,0x09,0x6f,0x15,0x15,0x15,0xb0,0x0b,0x0b,
+ 0x0b,0x3d,0x08,0x08,0x08,0x07,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00,
+ 0x00,0x00,0x01,0x98,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,
+ 0x00,0x03,0x7d,0xdb,0x06,0x40,0x7f,0xde,0x06,0x88,0x34,0x5f,0x03,0x21,0x00,
+ 0x00,0x00,0x21,0x00,0x00,0x00,0x2e,0x69,0xb8,0x05,0x93,0x43,0x70,0x0d,0xbc,
+ 0x23,0x27,0x1f,0xe8,0x22,0x22,0x22,0xfd,0x1f,0x1f,0x1f,0xff,0x59,0x94,0x11,
+ 0xff,0x3a,0x57,0x17,0xff,0x1b,0x1c,0x19,0xff,0x1e,0x1f,0x1e,0xff,0x46,0x4f,
+ 0x3a,0xf8,0x62,0x93,0x25,0xd2,0x76,0xd1,0x07,0x6f,0x00,0x00,0x00,0x04,0x00,
+ 0x00,0x00,0x02,0x7d,0xe4,0x06,0x15,0x84,0xe9,0x06,0x82,0x85,0xe9,0x06,0x3a,
+ 0x82,0x00,0x00,0x00,0x00,0x0c,0x7f,0xe9,0x06,0x15,0x85,0xe9,0x06,0xb6,0x00,
+ 0x00,0x00,0x0c,0x04,0x04,0x04,0x26,0x0b,0x0b,0x0b,0x89,0x11,0x11,0x11,0xc2,
+ 0x0e,0x0e,0x0e,0x5a,0x0c,0x0c,0x0c,0x0c,0x00,0x00,0x00,0x06,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x98,0x00,0x00,0x00,0x00,0x16,
+ 0x81,0xe5,0x06,0x36,0x81,0xe6,0x06,0x83,0x69,0xbf,0x05,0x2a,0x00,0x00,0x00,
+ 0x11,0x00,0x00,0x00,0x1e,0x67,0xb6,0x04,0x79,0x61,0xae,0x04,0x8e,0x1e,0x2e,
+ 0x0a,0x89,0x1c,0x1c,0x1c,0xd7,0x1f,0x1f,0x1f,0xfb,0x3e,0x5e,0x19,0xff,0x58,
+ 0x8d,0x17,0xff,0x53,0x71,0x2c,0xff,0x60,0x71,0x4a,0xff,0x68,0x8f,0x39,0xff,
+ 0x63,0x97,0x23,0xeb,0x4e,0x7a,0x19,0x7b,0x02,0x02,0x02,0x07,0x00,0x00,0x00,
+ 0x02,0x80,0xe7,0x06,0x31,0x82,0xe9,0x06,0x7f,0x83,0xe9,0x06,0x2f,0x82,0x00,
+ 0x00,0x00,0x00,0x0e,0x80,0xe9,0x06,0x35,0x84,0xe9,0x06,0xa4,0x00,0x00,0x00,
+ 0x0d,0x00,0x00,0x00,0x11,0x01,0x01,0x01,0x15,0x0a,0x0a,0x0a,0x6b,0x11,0x11,
+ 0x11,0xc6,0x10,0x10,0x10,0x68,0x0e,0x0e,0x0e,0x18,0x01,0x01,0x01,0x09,0x00,
+ 0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,
+ 0x96,0x00,0x00,0x00,0x00,0x16,0x81,0xe7,0x06,0x2b,0x81,0xe7,0x06,0x7d,0x7a,
+ 0xdc,0x06,0x3e,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x14,0x5a,0xa2,0x04,0x57,
+ 0x6b,0xbe,0x05,0x98,0x36,0x5f,0x03,0x65,0x10,0x11,0x0e,0x81,0x2a,0x2a,0x2a,
+ 0xe7,0x46,0x46,0x46,0xfe,0x6b,0x8b,0x41,0xff,0x72,0xa7,0x28,0xff,0x6f,0xab,
+ 0x18,0xff,0x59,0x88,0x19,0xff,0x45,0x5b,0x2b,0xf8,0x33,0x33,0x33,0x9d,0x03,
+ 0x03,0x03,0x13,0x58,0x9e,0x04,0x07,0x81,0xe8,0x06,0x51,0x82,0xe9,0x06,0x70,
+ 0x82,0xe9,0x06,0x1e,0x82,0x00,0x00,0x00,0x00,0x0f,0x82,0xe9,0x06,0x5b,0x83,
+ 0xe9,0x06,0x87,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x16,
+ 0x02,0x02,0x02,0x22,0x0b,0x0b,0x0b,0x7e,0x12,0x12,0x12,0xd0,0x13,0x13,0x13,
+ 0x86,0x0f,0x0f,0x0f,0x32,0x07,0x07,0x07,0x13,0x00,0x00,0x00,0x09,0x00,0x00,
+ 0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x01,
+ 0x91,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x75,
+ 0xd3,0x05,0x1e,0x7f,0xe3,0x06,0x70,0x7b,0xdb,0x06,0x5c,0x1f,0x38,0x01,0x11,
+ 0x00,0x00,0x00,0x17,0x31,0x59,0x02,0x33,0x64,0xb1,0x08,0x91,0x5a,0x8f,0x19,
+ 0xac,0x54,0x5b,0x4b,0xc8,0x6a,0x6a,0x67,0xf1,0x6f,0x6e,0x65,0xf6,0x5b,0x5a,
+ 0x46,0xfc,0x4f,0x4e,0x31,0xff,0x4a,0x49,0x29,0xff,0x36,0x36,0x25,0xff,0x34,
+ 0x34,0x35,0xeb,0x28,0x28,0x28,0x7e,0x02,0x04,0x00,0x0c,0x76,0xd4,0x06,0x28,
+ 0x82,0xe8,0x06,0x70,0x82,0xe9,0x06,0x49,0x80,0xe9,0x06,0x0a,0x00,0x00,0x00,
+ 0x00,0x80,0xe9,0x06,0x07,0x83,0xe9,0x06,0x81,0x82,0xe9,0x06,0x5a,0x00,0x00,
+ 0x00,0x05,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x19,0x03,
+ 0x03,0x03,0x2f,0x0b,0x0b,0x0b,0x90,0x12,0x12,0x12,0xe0,0x14,0x14,0x14,0xba,
+ 0x13,0x13,0x13,0x65,0x0e,0x0e,0x0e,0x2d,0x04,0x04,0x04,0x15,0x00,0x00,0x00,
+ 0x0b,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x04,0x00,0x00,
+ 0x00,0x03,0x83,0x00,0x00,0x00,0x01,0x8b,0x00,0x00,0x00,0x00,0x19,0x00,0x00,
+ 0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x09,0x3b,
+ 0x6c,0x03,0x14,0x75,0xd2,0x06,0x56,0x78,0xd5,0x06,0x7b,0x49,0x84,0x03,0x33,
+ 0x00,0x00,0x00,0x22,0x12,0x12,0x12,0x3f,0x61,0x7d,0x3e,0xac,0x89,0xb9,0x4d,
+ 0xf4,0x8d,0xa5,0x6a,0xfa,0x6d,0x75,0x49,0xe6,0x64,0x64,0x36,0xd7,0x5c,0x5b,
+ 0x33,0xe9,0x4f,0x4e,0x2f,0xfa,0x41,0x40,0x27,0xff,0x31,0x31,0x25,0xfb,0x32,
+ 0x32,0x33,0xc3,0x1e,0x26,0x14,0x48,0x67,0xb9,0x05,0x24,0x7e,0xe1,0x06,0x5c,
+ 0x82,0xe8,0x06,0x61,0x82,0xe9,0x06,0x1a,0x82,0x00,0x00,0x00,0x00,0x18,0x81,
+ 0xe9,0x06,0x2f,0x83,0xe9,0x06,0x8e,0x81,0xe9,0x06,0x26,0x00,0x00,0x00,0x02,
+ 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x15,0x00,0x00,0x00,
+ 0x1d,0x04,0x04,0x04,0x3a,0x0c,0x0c,0x0c,0x97,0x13,0x13,0x13,0xe9,0x16,0x16,
+ 0x16,0xe4,0x15,0x15,0x15,0xa9,0x13,0x13,0x13,0x6e,0x11,0x11,0x11,0x41,0x0a,
+ 0x0a,0x0a,0x24,0x02,0x02,0x02,0x14,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x08,
+ 0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x03,0x00,0x00,0x00,0x02,0x83,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x00,
+ 0x82,0x00,0x00,0x00,0x01,0x1a,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,
+ 0x00,0x00,0x07,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x12,
+ 0x02,0x02,0x02,0x1c,0x4a,0x7a,0x11,0x53,0x6d,0xb5,0x17,0xa2,0x61,0x98,0x1f,
+ 0x86,0x36,0x3d,0x2d,0x6a,0x58,0x58,0x58,0xa5,0x8e,0x8e,0x8e,0xed,0x88,0x9f,
+ 0x62,0xf4,0x79,0xab,0x27,0xe9,0x75,0xa0,0x21,0xdf,0x70,0x88,0x2a,0xd6,0x60,
+ 0x6d,0x28,0xd2,0x4c,0x50,0x26,0xe4,0x39,0x3a,0x21,0xfd,0x37,0x3f,0x27,0xed,
+ 0x3e,0x57,0x21,0x93,0x6a,0xbc,0x05,0x50,0x7c,0xdd,0x06,0x6f,0x81,0xe6,0x06,
+ 0x65,0x80,0xe7,0x06,0x21,0x82,0x00,0x00,0x00,0x00,0x01,0x80,0xe9,0x06,0x0d,
+ 0x82,0x82,0xe9,0x06,0x6a,0x14,0x82,0xe9,0x06,0x06,0x00,0x00,0x00,0x01,0x00,
+ 0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x17,
+ 0x00,0x00,0x00,0x20,0x04,0x04,0x04,0x3d,0x0c,0x0c,0x0c,0x8f,0x12,0x12,0x12,
+ 0xdf,0x16,0x16,0x16,0xfc,0x17,0x17,0x17,0xec,0x17,0x17,0x17,0xc5,0x18,0x18,
+ 0x18,0x9b,0x18,0x18,0x18,0x72,0x14,0x14,0x14,0x4d,0x0c,0x0c,0x0c,0x2e,0x04,
+ 0x04,0x04,0x1b,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0a,0x82,0x00,0x00,0x00,
+ 0x08,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x05,0x82,
+ 0x00,0x00,0x00,0x04,0x1b,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x07,0x00,0x00,
+ 0x00,0x09,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x15,0x0a,
+ 0x0a,0x0a,0x29,0x35,0x35,0x36,0x4c,0x65,0x65,0x66,0x7a,0x78,0x7f,0x71,0xb2,
+ 0x7b,0x9d,0x52,0xe4,0x6c,0x9a,0x33,0xec,0x57,0x68,0x43,0xe6,0x86,0x86,0x86,
+ 0xf7,0x8a,0x8a,0x88,0xfc,0x69,0x68,0x49,0xdd,0x6d,0x83,0x2a,0xd3,0x70,0x9d,
+ 0x1d,0xdb,0x6f,0xa6,0x16,0xdf,0x6a,0x9e,0x16,0xdc,0x64,0x8f,0x17,0xe1,0x54,
+ 0x78,0x19,0xfb,0x59,0x88,0x1e,0xe1,0x69,0xb9,0x09,0x95,0x7c,0xdd,0x06,0x7a,
+ 0x7e,0xe0,0x06,0x58,0x7d,0xe0,0x06,0x1e,0x82,0x00,0x00,0x00,0x00,0x40,0x81,
+ 0xe9,0x06,0x01,0x82,0xe9,0x06,0x41,0x82,0xe9,0x06,0x7a,0x81,0xe9,0x06,0x2c,
+ 0x80,0xe9,0x06,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x18,0x00,0x00,
+ 0x00,0x22,0x02,0x02,0x02,0x39,0x0b,0x0b,0x0b,0x7d,0x12,0x12,0x12,0xd0,0x16,
+ 0x16,0x16,0xf9,0x18,0x18,0x18,0xff,0x1a,0x1a,0x1a,0xfd,0x1b,0x1b,0x1b,0xec,
+ 0x1a,0x1a,0x1a,0xcf,0x1c,0x1c,0x1c,0xae,0x1d,0x1d,0x1d,0x8e,0x1c,0x1c,0x1c,
+ 0x6d,0x17,0x17,0x17,0x50,0x10,0x10,0x10,0x37,0x08,0x08,0x08,0x24,0x02,0x02,
+ 0x02,0x16,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0a,0x00,
+ 0x00,0x00,0x0c,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x12,
+ 0x00,0x00,0x00,0x1d,0x14,0x14,0x14,0x3b,0x51,0x51,0x53,0x68,0x7d,0x7d,0x7f,
+ 0x9c,0x82,0x82,0x81,0xc8,0x84,0x84,0x7e,0xe9,0x88,0x87,0x79,0xef,0x75,0x7e,
+ 0x56,0xf1,0x5f,0x83,0x29,0xfc,0x5f,0x83,0x33,0xff,0x60,0x6a,0x56,0xff,0x51,
+ 0x51,0x4a,0xf6,0x5c,0x5b,0x34,0xd0,0x5d,0x5c,0x2e,0xc3,0x59,0x63,0x26,0xc2,
+ 0x5c,0x76,0x1c,0xcd,0x5b,0x7d,0x1c,0xe8,0x67,0x8d,0x2f,0xf7,0x66,0x95,0x28,
+ 0xd0,0x66,0xad,0x0d,0x7f,0x71,0xc9,0x05,0x52,0x6f,0xc8,0x05,0x31,0x67,0xbd,
+ 0x04,0x0f,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x81,0xe9,0x06,0x01,0x82,
+ 0xe9,0x06,0x29,0x82,0xe9,0x06,0x71,0x82,0xe9,0x06,0x43,0x81,0xe9,0x06,0x07,
+ 0x83,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,
+ 0x00,0x00,0x07,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x23,
+ 0x01,0x01,0x01,0x35,0x09,0x09,0x09,0x6c,0x10,0x10,0x10,0xbe,0x16,0x16,0x16,
+ 0xf5,0x18,0x18,0x18,0xff,0x19,0x19,0x19,0xff,0x1b,0x1b,0x1b,0xff,0x1d,0x1d,
+ 0x1d,0xff,0x1e,0x1e,0x1e,0xf7,0x20,0x20,0x20,0xe5,0x21,0x21,0x21,0xd0,0x22,
+ 0x22,0x22,0xbb,0x24,0x24,0x24,0xa3,0x23,0x23,0x23,0x87,0x1f,0x1f,0x1f,0x6a,
+ 0x17,0x17,0x17,0x51,0x10,0x10,0x10,0x3d,0x09,0x09,0x09,0x30,0x05,0x05,0x05,
+ 0x2d,0x09,0x09,0x09,0x39,0x2c,0x2c,0x2c,0x5d,0x6d,0x6d,0x6e,0x8c,0x91,0x91,
+ 0x94,0xbc,0x8b,0x8b,0x89,0xde,0x89,0x88,0x7d,0xed,0x84,0x84,0x6d,0xe6,0x79,
+ 0x78,0x55,0xde,0x6c,0x6b,0x40,0xda,0x5a,0x59,0x33,0xed,0x49,0x55,0x27,0xfd,
+ 0x4f,0x77,0x1d,0xf5,0x48,0x6f,0x1a,0xf7,0x3e,0x50,0x24,0xf8,0x4f,0x52,0x2b,
+ 0xce,0x52,0x51,0x27,0xbe,0x4a,0x49,0x23,0xc7,0x4d,0x4c,0x32,0xe2,0x55,0x54,
+ 0x48,0xf2,0x49,0x49,0x46,0xb8,0x3c,0x3c,0x3c,0x59,0x03,0x03,0x03,0x17,0x00,
+ 0x00,0x00,0x0b,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+ 0x80,0xe9,0x06,0x0f,0x82,0xe9,0x06,0x3a,0x82,0xe9,0x06,0x6c,0x82,0xe9,0x06,
+ 0x4d,0x82,0xe9,0x06,0x0c,0x85,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x01,
+ 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,
+ 0x18,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x32,0x06,0x06,0x06,0x5a,0x0f,0x0f,
+ 0x0f,0xaa,0x16,0x16,0x16,0xf2,0x83,0x19,0x19,0x19,0xff,0x2a,0x1b,0x1b,0x1b,
+ 0xff,0x1d,0x1d,0x1d,0xff,0x20,0x20,0x20,0xff,0x22,0x22,0x22,0xff,0x25,0x25,
+ 0x25,0xfb,0x26,0x26,0x26,0xf0,0x28,0x28,0x28,0xe1,0x29,0x29,0x29,0xd2,0x2c,
+ 0x2c,0x2c,0xc4,0x2f,0x2f,0x2f,0xb7,0x37,0x37,0x37,0xb2,0x5c,0x5c,0x5c,0xbf,
+ 0x91,0x91,0x92,0xd8,0x9a,0x9a,0x99,0xf1,0x89,0x89,0x7b,0xed,0x7f,0x7e,0x60,
+ 0xde,0x73,0x72,0x48,0xd4,0x70,0x6f,0x3b,0xce,0x6f,0x6e,0x39,0xcf,0x64,0x63,
+ 0x38,0xe4,0x50,0x4f,0x30,0xfb,0x3d,0x3e,0x2d,0xf5,0x35,0x45,0x20,0xb2,0x42,
+ 0x70,0x0b,0xc7,0x4e,0x7c,0x14,0xf8,0x5a,0x7d,0x1d,0xe2,0x51,0x5f,0x22,0xda,
+ 0x55,0x56,0x42,0xec,0x56,0x56,0x50,0xec,0x44,0x43,0x43,0x98,0x29,0x29,0x2a,
+ 0x3f,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x06,0x00,0x00,
+ 0x00,0x02,0x79,0xdc,0x06,0x0a,0x82,0xe9,0x06,0x2d,0x82,0xe9,0x06,0x5d,0x82,
+ 0xe9,0x06,0x73,0x82,0xe9,0x06,0x45,0x82,0xe9,0x06,0x0f,0x80,0xe9,0x06,0x01,
+ 0x86,0x00,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,
+ 0x00,0x00,0x06,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x21,
+ 0x00,0x00,0x00,0x2e,0x04,0x04,0x04,0x4c,0x0c,0x0c,0x0c,0x90,0x14,0x14,0x14,
+ 0xdd,0x19,0x19,0x19,0xfd,0x82,0x1a,0x1a,0x1a,0xff,0x27,0x1b,0x1b,0x1b,0xff,
+ 0x1c,0x1c,0x1c,0xff,0x1d,0x1d,0x1d,0xff,0x1f,0x1f,0x1f,0xff,0x22,0x22,0x22,
+ 0xff,0x27,0x27,0x27,0xff,0x2a,0x2a,0x2a,0xff,0x2f,0x2f,0x2f,0xff,0x41,0x41,
+ 0x41,0xfd,0x55,0x55,0x55,0xfc,0x62,0x62,0x63,0xfe,0x73,0x73,0x6e,0xf7,0x74,
+ 0x73,0x59,0xdd,0x69,0x68,0x3c,0xcc,0x6b,0x6a,0x36,0xc7,0x6f,0x6e,0x38,0xc8,
+ 0x6c,0x6b,0x38,0xc8,0x60,0x5f,0x32,0xd1,0x4c,0x4b,0x2a,0xf1,0x3e,0x3d,0x29,
+ 0xff,0x31,0x31,0x29,0xd0,0x17,0x17,0x17,0x69,0x1b,0x2c,0x06,0x79,0x38,0x58,
+ 0x12,0xe0,0x59,0x88,0x1b,0xfa,0x67,0x9a,0x21,0xf8,0x66,0x92,0x2c,0xe3,0x60,
+ 0x8a,0x2d,0xa2,0x45,0x77,0x0b,0x4d,0x36,0x61,0x02,0x1f,0x1e,0x37,0x01,0x10,
+ 0x63,0xb4,0x05,0x1a,0x7a,0xdd,0x06,0x31,0x81,0xe6,0x06,0x4e,0x83,0xe9,0x06,
+ 0x6d,0x83,0xe9,0x06,0x7c,0x82,0xe9,0x06,0x67,0x81,0xe9,0x06,0x34,0x81,0xe9,
+ 0x06,0x0a,0x89,0x00,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x12,0x00,0x00,
+ 0x00,0x1d,0x00,0x00,0x00,0x2a,0x02,0x02,0x02,0x3e,0x08,0x08,0x08,0x68,0x0f,
+ 0x0f,0x0f,0xb5,0x17,0x17,0x17,0xf9,0x82,0x1a,0x1a,0x1a,0xff,0x01,0x1b,0x1b,
+ 0x1b,0xff,0x82,0x1c,0x1c,0x1c,0xff,0x09,0x1e,0x1e,0x1e,0xff,0x21,0x21,0x21,
+ 0xff,0x25,0x25,0x25,0xff,0x38,0x38,0x38,0xff,0x62,0x62,0x62,0xff,0x60,0x60,
+ 0x60,0xff,0x46,0x46,0x47,0xfe,0x4f,0x4e,0x35,0xda,0x5e,0x5d,0x2e,0xc3,0x82,
+ 0x63,0x62,0x31,0xc2,0x17,0x5d,0x5c,0x2e,0xc2,0x58,0x57,0x2c,0xc2,0x4f,0x4e,
+ 0x28,0xd2,0x40,0x3f,0x25,0xf8,0x37,0x37,0x29,0xf0,0x29,0x29,0x27,0x91,0x06,
+ 0x06,0x06,0x3b,0x02,0x02,0x02,0x3a,0x15,0x1d,0x0c,0x81,0x2b,0x3b,0x18,0xb4,
+ 0x4c,0x78,0x15,0x98,0x6b,0xb9,0x0c,0x8b,0x75,0xd1,0x06,0x93,0x7d,0xdd,0x06,
+ 0x99,0x80,0xe1,0x06,0x9d,0x83,0xe4,0x06,0x9b,0x83,0xe6,0x06,0x96,0x82,0xe8,
+ 0x06,0x8e,0x82,0xe9,0x06,0x7d,0x82,0xe9,0x06,0x5f,0x82,0xe9,0x06,0x36,0x81,
+ 0xe9,0x06,0x16,0x80,0xe9,0x06,0x05,0x8c,0x00,0x00,0x00,0x00,0x0b,0x00,0x00,
+ 0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0e,0x00,
+ 0x00,0x00,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x31,0x04,0x04,0x04,0x47,
+ 0x0b,0x0b,0x0b,0x82,0x13,0x13,0x13,0xd0,0x19,0x19,0x19,0xfe,0x82,0x1b,0x1b,
+ 0x1b,0xff,0x82,0x1c,0x1c,0x1c,0xff,0x1f,0x1d,0x1d,0x1d,0xff,0x1e,0x1e,0x1e,
+ 0xff,0x2b,0x2b,0x2b,0xff,0x40,0x40,0x40,0xff,0x3a,0x3a,0x3b,0xff,0x3c,0x3c,
+ 0x36,0xf7,0x51,0x50,0x2c,0xc9,0x59,0x58,0x2b,0xbf,0x57,0x56,0x2b,0xbe,0x56,
+ 0x55,0x2a,0xbe,0x55,0x54,0x28,0xbe,0x54,0x53,0x28,0xbd,0x4a,0x49,0x23,0xd2,
+ 0x3c,0x3b,0x26,0xfb,0x33,0x33,0x2d,0xc2,0x15,0x15,0x16,0x49,0x00,0x00,0x00,
+ 0x20,0x00,0x00,0x00,0x21,0x03,0x03,0x03,0x27,0x0d,0x0d,0x0d,0x2e,0x1c,0x2e,
+ 0x07,0x27,0x3e,0x70,0x03,0x25,0x59,0x9e,0x04,0x27,0x6e,0xc3,0x05,0x27,0x7d,
+ 0xda,0x06,0x27,0x83,0xe4,0x06,0x27,0x85,0xe8,0x06,0x23,0x83,0xe8,0x06,0x1f,
+ 0x83,0xe9,0x06,0x18,0x81,0xe9,0x06,0x0e,0x80,0xe9,0x06,0x04,0x8f,0x00,0x00,
+ 0x00,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,
+ 0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,
+ 0x28,0x01,0x01,0x01,0x36,0x06,0x06,0x06,0x4f,0x0b,0x0b,0x0b,0x8b,0x12,0x12,
+ 0x12,0xd0,0x19,0x19,0x19,0xfa,0x1b,0x1b,0x1b,0xff,0x1c,0x1c,0x1c,0xff,0x83,
+ 0x1d,0x1d,0x1d,0xff,0x0e,0x1e,0x1e,0x1e,0xff,0x28,0x28,0x29,0xff,0x3e,0x3e,
+ 0x33,0xed,0x52,0x51,0x29,0xc3,0x54,0x53,0x28,0xbc,0x56,0x56,0x29,0xba,0x52,
+ 0x51,0x26,0xba,0x4e,0x4d,0x21,0xc1,0x4e,0x4d,0x26,0xce,0x52,0x51,0x37,0xe8,
+ 0x44,0x44,0x3b,0xe4,0x26,0x26,0x26,0x74,0x04,0x04,0x04,0x19,0x00,0x00,0x00,
+ 0x13,0x82,0x00,0x00,0x00,0x11,0x06,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0e,
+ 0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
+ 0x01,0x97,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,
+ 0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x15,0x00,0x00,0x00,
+ 0x20,0x00,0x00,0x00,0x2a,0x01,0x01,0x01,0x34,0x04,0x04,0x04,0x48,0x08,0x08,
+ 0x08,0x7c,0x10,0x10,0x10,0xc1,0x17,0x17,0x17,0xf1,0x1b,0x1b,0x1b,0xff,0x1c,
+ 0x1c,0x1c,0xff,0x1d,0x1d,0x1d,0xff,0x1c,0x1c,0x1c,0xff,0x27,0x27,0x29,0xff,
+ 0x41,0x40,0x32,0xea,0x4f,0x4e,0x24,0xc1,0x4b,0x4a,0x21,0xc6,0x4c,0x4b,0x26,
+ 0xd4,0x5b,0x5a,0x3f,0xe9,0x70,0x6f,0x5d,0xfb,0x79,0x78,0x70,0xfb,0x68,0x68,
+ 0x65,0xe3,0x37,0x37,0x37,0x81,0x07,0x07,0x08,0x22,0x00,0x00,0x00,0x0d,0x00,
+ 0x00,0x00,0x09,0x82,0x00,0x00,0x00,0x07,0x04,0x00,0x00,0x00,0x06,0x00,0x00,
+ 0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x9a,0x00,0x00,0x00,0x00,
+ 0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,
+ 0x00,0x08,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x1f,0x00,
+ 0x00,0x00,0x27,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x3a,0x05,0x05,0x05,0x63,
+ 0x0c,0x0c,0x0c,0xa3,0x13,0x13,0x13,0xd6,0x18,0x18,0x18,0xf1,0x19,0x19,0x19,
+ 0xf8,0x21,0x21,0x22,0xfb,0x3e,0x3e,0x39,0xfc,0x53,0x52,0x40,0xf9,0x69,0x68,
+ 0x5b,0xf8,0x74,0x74,0x6f,0xf4,0x6e,0x6e,0x6e,0xe2,0x4a,0x4a,0x4c,0xb3,0x1e,
+ 0x1e,0x1f,0x73,0x01,0x01,0x02,0x35,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x0d,
+ 0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x84,0x00,0x00,0x00,0x01,0x9e,0x00,
+ 0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x05,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x15,0x00,0x00,
+ 0x00,0x1c,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x30,0x01,
+ 0x01,0x01,0x42,0x04,0x04,0x04,0x60,0x09,0x09,0x09,0x86,0x0d,0x0d,0x0d,0xa7,
+ 0x1a,0x1a,0x1a,0xb8,0x2f,0x2f,0x31,0xab,0x2c,0x2c,0x2e,0x86,0x11,0x11,0x12,
+ 0x59,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x14,0x00,0x00,
+ 0x00,0x12,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,
+ 0x00,0x00,0x01,0xa4,0x00,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x00,
+ 0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0c,0x00,
+ 0x00,0x00,0x11,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x22,
+ 0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x26,0x00,0x00,0x00,
+ 0x25,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x17,0x00,0x00,
+ 0x00,0x16,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0a,0x00,
+ 0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0xa7,0x00,0x00,0x00,
+ 0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,
+ 0x00,0x00,0x06,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x10,
+ 0x00,0x00,0x00,0x13,0x83,0x00,0x00,0x00,0x16,0x08,0x00,0x00,0x00,0x14,0x00,
+ 0x00,0x00,0x12,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x08,
+ 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0xac,0x00,0x00,
+ 0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,
+ 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x84,0x00,0x00,0x00,0x08,0x03,0x00,
+ 0x00,0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,
+ 0x01,0xb0,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x01,0xb8,0x00,0x00,0x00,
+ 0x00,0x07,0x0c,0x0b,0x0c,0x02,0x0b,0x0b,0x0b,0x11,0x0e,0x0e,0x0e,0x39,0x16,
+ 0x16,0x16,0x57,0x14,0x14,0x14,0x3a,0x10,0x0f,0x0f,0x13,0x11,0x11,0x11,0x03,
+ 0xb3,0x00,0x00,0x00,0x00,0x0b,0x08,0x07,0x08,0x03,0x07,0x07,0x07,0x14,0x0e,
+ 0x0d,0x0e,0x41,0x13,0x12,0x13,0x82,0x14,0x14,0x14,0xbf,0x17,0x17,0x17,0xe3,
+ 0x18,0x18,0x18,0xc1,0x16,0x16,0x16,0x84,0x13,0x13,0x13,0x45,0x14,0x14,0x14,
+ 0x17,0x13,0x13,0x13,0x04,0xaf,0x00,0x00,0x00,0x00,0x0f,0x08,0x08,0x08,0x06,
+ 0x0d,0x0d,0x0d,0x26,0x0f,0x10,0x0f,0x57,0x13,0x13,0x13,0x93,0x15,0x15,0x15,
+ 0xc6,0x17,0x16,0x17,0xf0,0x18,0x18,0x18,0xfe,0x18,0x18,0x18,0xff,0x19,0x19,
+ 0x19,0xfe,0x19,0x19,0x19,0xf0,0x19,0x19,0x19,0xc9,0x19,0x19,0x19,0x96,0x16,
+ 0x16,0x16,0x5a,0x12,0x12,0x12,0x27,0x0f,0x0f,0x0f,0x07,0xab,0x00,0x00,0x00,
+ 0x00,0x07,0x07,0x07,0x06,0x08,0x0d,0x0d,0x0d,0x32,0x11,0x11,0x11,0x71,0x14,
+ 0x14,0x14,0xad,0x16,0x16,0x16,0xd8,0x17,0x17,0x17,0xf5,0x17,0x17,0x17,0xfe,
+ 0x83,0x18,0x18,0x18,0xff,0x01,0x19,0x19,0x19,0xff,0x82,0x1a,0x1a,0x1a,0xff,
+ 0x06,0x1b,0x1b,0x1b,0xf6,0x1a,0x1a,0x1a,0xd9,0x19,0x19,0x19,0xae,0x17,0x17,
+ 0x17,0x72,0x16,0x16,0x16,0x34,0x13,0x13,0x13,0x0a,0xa8,0x00,0x00,0x00,0x00,
+ 0x05,0x02,0x02,0x02,0x08,0x0f,0x0f,0x10,0x4d,0x14,0x14,0x15,0xb6,0x16,0x16,
+ 0x17,0xe6,0x17,0x17,0x17,0xf9,0x83,0x17,0x17,0x17,0xff,0x83,0x18,0x18,0x18,
+ 0xff,0x01,0x19,0x19,0x19,0xff,0x83,0x1a,0x1a,0x1a,0xff,0x06,0x1b,0x1b,0x1b,
+ 0xff,0x1c,0x1c,0x1c,0xf9,0x21,0x21,0x21,0xe6,0x27,0x27,0x27,0xbe,0x21,0x21,
+ 0x22,0x54,0x0c,0x0c,0x0b,0x0b,0xa6,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,
+ 0x01,0x0e,0x0e,0x0e,0x36,0x18,0x18,0x18,0xb8,0x1e,0x1e,0x1f,0xf8,0x1b,0x1b,
+ 0x1c,0xff,0x18,0x18,0x19,0xff,0x83,0x17,0x17,0x17,0xff,0x83,0x18,0x18,0x18,
+ 0xff,0x82,0x19,0x19,0x19,0xff,0x09,0x1a,0x1a,0x1a,0xff,0x1b,0x1b,0x1b,0xff,
+ 0x20,0x20,0x20,0xff,0x28,0x28,0x28,0xff,0x31,0x31,0x31,0xff,0x37,0x37,0x38,
+ 0xfb,0x2f,0x2f,0x2f,0xc2,0x20,0x21,0x20,0x3b,0x05,0x07,0x04,0x03,0xa5,0x00,
+ 0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x20,0x15,0x15,0x15,0x99,0x20,0x20,0x20,
+ 0xf6,0x21,0x21,0x21,0xff,0x20,0x20,0x20,0xff,0x1d,0x1d,0x1d,0xff,0x1a,0x1a,
+ 0x1a,0xff,0x19,0x19,0x19,0xff,0x83,0x18,0x18,0x18,0xff,0x0d,0x17,0x17,0x17,
+ 0xff,0x18,0x18,0x18,0xff,0x1c,0x1c,0x1c,0xff,0x21,0x21,0x21,0xff,0x29,0x29,
+ 0x29,0xff,0x31,0x31,0x31,0xff,0x36,0x36,0x36,0xff,0x39,0x39,0x39,0xff,0x3a,
+ 0x3a,0x3a,0xff,0x38,0x38,0x38,0xf8,0x28,0x28,0x28,0xa2,0x1b,0x1a,0x1a,0x20,
+ 0x0b,0x0b,0x0a,0x00,0xa3,0x00,0x00,0x00,0x00,0x11,0x03,0x03,0x03,0x11,0x11,
+ 0x11,0x11,0x77,0x1e,0x1e,0x1e,0xf0,0x22,0x23,0x22,0xff,0x21,0x21,0x21,0xff,
+ 0x20,0x20,0x20,0xff,0x1e,0x1e,0x1e,0xff,0x1d,0x1d,0x1d,0xff,0x1c,0x1c,0x1c,
+ 0xff,0x1b,0x1b,0x1b,0xff,0x19,0x19,0x19,0xff,0x18,0x18,0x18,0xff,0x1c,0x1c,
+ 0x1c,0xff,0x23,0x23,0x23,0xff,0x28,0x28,0x28,0xff,0x32,0x32,0x32,0xff,0x37,
+ 0x37,0x37,0xff,0x85,0x38,0x38,0x38,0xff,0x03,0x34,0x34,0x34,0xf6,0x23,0x22,
+ 0x22,0x80,0x15,0x14,0x14,0x11,0xa2,0x00,0x00,0x00,0x00,0x13,0x01,0x01,0x01,
+ 0x07,0x0d,0x0d,0x0d,0x50,0x19,0x19,0x19,0xe1,0x23,0x23,0x23,0xff,0x22,0x22,
+ 0x22,0xff,0x21,0x21,0x21,0xff,0x1f,0x1f,0x1f,0xff,0x1e,0x1e,0x1e,0xff,0x1d,
+ 0x1d,0x1d,0xff,0x1c,0x1c,0x1c,0xff,0x1b,0x1b,0x1b,0xff,0x1a,0x1a,0x1a,0xff,
+ 0x16,0x16,0x16,0xff,0x3f,0x3f,0x3f,0xff,0x39,0x39,0x39,0xff,0x26,0x26,0x26,
+ 0xff,0x2d,0x2d,0x2d,0xff,0x32,0x32,0x32,0xff,0x35,0x35,0x35,0xff,0x83,0x37,
+ 0x37,0x37,0xff,0x05,0x36,0x36,0x36,0xff,0x36,0x37,0x36,0xff,0x2d,0x2d,0x2d,
+ 0xed,0x1b,0x1b,0x1b,0x58,0x0d,0x0c,0x0c,0x07,0xa0,0x00,0x00,0x00,0x00,0x0a,
+ 0x04,0x04,0x04,0x03,0x0c,0x0c,0x0c,0x34,0x16,0x16,0x16,0xce,0x23,0x23,0x23,
+ 0xff,0x22,0x22,0x22,0xff,0x23,0x23,0x23,0xff,0x22,0x22,0x22,0xff,0x1f,0x1f,
+ 0x1f,0xff,0x1e,0x1e,0x1e,0xff,0x1d,0x1d,0x1d,0xff,0x82,0x1b,0x1b,0x1b,0xff,
+ 0x05,0x19,0x19,0x19,0xff,0x17,0x17,0x17,0xff,0x48,0x48,0x48,0xff,0x3d,0x3d,
+ 0x3d,0xff,0x24,0x24,0x24,0xff,0x82,0x27,0x27,0x27,0xff,0x01,0x2d,0x2d,0x2d,
+ 0xff,0x82,0x35,0x35,0x35,0xff,0x07,0x34,0x34,0x34,0xff,0x33,0x34,0x33,0xff,
+ 0x33,0x33,0x33,0xff,0x33,0x34,0x34,0xff,0x26,0x26,0x27,0xdc,0x18,0x18,0x18,
+ 0x3b,0x0e,0x0f,0x0e,0x03,0x9e,0x00,0x00,0x00,0x00,0x05,0x03,0x03,0x03,0x01,
+ 0x09,0x09,0x09,0x1e,0x12,0x12,0x12,0xae,0x21,0x21,0x21,0xff,0x24,0x24,0x24,
+ 0xff,0x82,0x23,0x23,0x23,0xff,0x04,0x21,0x21,0x21,0xff,0x1f,0x1f,0x1f,0xff,
+ 0x1e,0x1e,0x1e,0xff,0x1d,0x1d,0x1d,0xff,0x82,0x1b,0x1b,0x1b,0xff,0x05,0x19,
+ 0x19,0x19,0xff,0x17,0x17,0x17,0xff,0x47,0x47,0x47,0xff,0x3d,0x3d,0x3d,0xff,
+ 0x24,0x24,0x24,0xff,0x82,0x27,0x27,0x27,0xff,0x05,0x29,0x29,0x29,0xff,0x31,
+ 0x30,0x30,0xff,0x34,0x34,0x34,0xff,0x33,0x33,0x33,0xff,0x32,0x33,0x32,0xff,
+ 0x82,0x31,0x31,0x31,0xff,0x03,0x30,0x30,0x31,0xff,0x20,0x21,0x20,0xba,0x14,
+ 0x14,0x14,0x1d,0x9e,0x00,0x00,0x00,0x00,0x12,0x06,0x06,0x06,0x12,0x0f,0x0f,
+ 0x0f,0x8c,0x1f,0x1f,0x1f,0xfe,0x24,0x24,0x24,0xff,0x23,0x23,0x23,0xff,0x24,
+ 0x24,0x24,0xff,0x23,0x23,0x23,0xff,0x21,0x21,0x21,0xff,0x20,0x20,0x20,0xff,
+ 0x1f,0x1e,0x1e,0xff,0x1d,0x1d,0x1d,0xff,0x1b,0x1c,0x1b,0xff,0x1b,0x1a,0x1b,
+ 0xff,0x19,0x19,0x19,0xff,0x17,0x17,0x17,0xff,0x48,0x48,0x48,0xff,0x3f,0x3f,
+ 0x3f,0xff,0x24,0x24,0x24,0xff,0x83,0x27,0x27,0x27,0xff,0x05,0x2c,0x2c,0x2c,
+ 0xff,0x33,0x32,0x33,0xff,0x32,0x32,0x32,0xff,0x31,0x31,0x31,0xff,0x30,0x30,
+ 0x30,0xff,0x82,0x2f,0x2f,0x2f,0xff,0x03,0x2d,0x2d,0x2d,0xff,0x1a,0x19,0x1a,
+ 0x98,0x08,0x08,0x08,0x0e,0x9c,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x07,
+ 0x0e,0x0d,0x0d,0x69,0x1c,0x1c,0x1c,0xf2,0x25,0x25,0x25,0xff,0x24,0x24,0x24,
+ 0xff,0x82,0x25,0x25,0x25,0xff,0x15,0x23,0x23,0x23,0xff,0x21,0x21,0x21,0xff,
+ 0x20,0x20,0x20,0xff,0x1f,0x1f,0x1f,0xff,0x1d,0x1d,0x1d,0xff,0x1b,0x1c,0x1b,
+ 0xff,0x1a,0x1a,0x1a,0xff,0x19,0x19,0x19,0xff,0x17,0x17,0x17,0xff,0x4b,0x4a,
+ 0x4a,0xff,0x41,0x41,0x41,0xff,0x24,0x23,0x24,0xff,0x27,0x27,0x27,0xff,0x26,
+ 0x26,0x26,0xff,0x25,0x25,0x25,0xff,0x29,0x29,0x29,0xff,0x31,0x31,0x32,0xff,
+ 0x38,0x38,0x38,0xff,0x3c,0x3c,0x3c,0xff,0x36,0x36,0x36,0xff,0x2f,0x2f,0x2f,
+ 0xff,0x82,0x2e,0x2e,0x2e,0xff,0x03,0x28,0x28,0x28,0xf9,0x12,0x13,0x12,0x6e,
+ 0x0c,0x0b,0x0f,0x0b,0x9b,0x00,0x00,0x00,0x00,0x04,0x0c,0x0c,0x0c,0x43,0x1b,
+ 0x1a,0x1a,0xe2,0x25,0x26,0x26,0xff,0x24,0x24,0x24,0xff,0x83,0x25,0x25,0x25,
+ 0xff,0x15,0x23,0x23,0x23,0xff,0x22,0x22,0x22,0xff,0x20,0x20,0x20,0xff,0x1f,
+ 0x1f,0x1f,0xff,0x1d,0x1d,0x1d,0xff,0x1c,0x1c,0x1c,0xff,0x1b,0x1b,0x1b,0xff,
+ 0x19,0x19,0x19,0xff,0x17,0x17,0x17,0xff,0x4c,0x4c,0x4c,0xff,0x44,0x44,0x44,
+ 0xff,0x23,0x22,0x23,0xff,0x26,0x26,0x26,0xff,0x26,0x26,0x25,0xff,0x27,0x27,
+ 0x27,0xff,0x2e,0x2f,0x2e,0xff,0x3c,0x42,0x38,0xff,0x41,0x4b,0x3c,0xff,0x3c,
+ 0x42,0x39,0xff,0x3b,0x3c,0x3b,0xff,0x32,0x32,0x32,0xff,0x82,0x2c,0x2c,0x2c,
+ 0xff,0x03,0x2d,0x2d,0x2d,0xff,0x23,0x23,0x22,0xe3,0x1b,0x1a,0x1e,0x51,0x9b,
+ 0x00,0x00,0x00,0x00,0x01,0x12,0x12,0x12,0xaf,0x82,0x26,0x26,0x26,0xff,0x01,
+ 0x25,0x26,0x26,0xff,0x83,0x25,0x25,0x25,0xff,0x1a,0x23,0x23,0x23,0xff,0x22,
+ 0x22,0x22,0xff,0x21,0x21,0x21,0xff,0x1f,0x1f,0x1f,0xff,0x1e,0x1e,0x1e,0xff,
+ 0x1c,0x1c,0x1c,0xff,0x1b,0x1b,0x1b,0xff,0x1a,0x1a,0x1a,0xff,0x16,0x16,0x16,
+ 0xff,0x4e,0x4e,0x4e,0xff,0x47,0x47,0x47,0xff,0x22,0x22,0x22,0xff,0x26,0x25,
+ 0x25,0xff,0x27,0x27,0x27,0xff,0x30,0x31,0x30,0xff,0x36,0x3e,0x32,0xff,0x44,
+ 0x60,0x28,0xff,0x50,0x7b,0x1c,0xff,0x36,0x50,0x1d,0xff,0x31,0x37,0x2f,0xff,
+ 0x38,0x38,0x38,0xff,0x2e,0x2e,0x2e,0xff,0x2b,0x2b,0x2b,0xff,0x2e,0x2e,0x2e,
+ 0xff,0x33,0x34,0x33,0xfc,0x27,0x26,0x29,0xb1,0x9b,0x00,0x00,0x00,0x00,0x04,
+ 0x10,0x10,0x10,0xa6,0x1b,0x1b,0x1b,0xff,0x21,0x20,0x21,0xff,0x26,0x26,0x26,
+ 0xff,0x82,0x27,0x27,0x27,0xff,0x06,0x25,0x25,0x25,0xff,0x24,0x24,0x24,0xff,
+ 0x22,0x22,0x22,0xff,0x21,0x21,0x21,0xff,0x1f,0x1f,0x1f,0xff,0x1d,0x1d,0x1d,
+ 0xff,0x82,0x1c,0x1c,0x1c,0xff,0x13,0x1a,0x1a,0x1a,0xff,0x17,0x17,0x17,0xff,
+ 0x50,0x50,0x50,0xff,0x4a,0x4a,0x4a,0xff,0x22,0x22,0x22,0xff,0x25,0x25,0x25,
+ 0xff,0x28,0x28,0x28,0xff,0x31,0x33,0x32,0xff,0x34,0x4a,0x26,0xff,0x58,0x95,
+ 0x12,0xff,0x7d,0xcd,0x0b,0xff,0x51,0x81,0x14,0xff,0x29,0x34,0x22,0xff,0x36,
+ 0x37,0x36,0xff,0x38,0x38,0x38,0xff,0x32,0x32,0x32,0xff,0x34,0x34,0x34,0xff,
+ 0x31,0x31,0x31,0xfb,0x22,0x22,0x23,0xa7,0x9b,0x00,0x00,0x00,0x00,0x05,0x06,
+ 0x06,0x06,0x42,0x0b,0x0b,0x0b,0xd8,0x11,0x11,0x11,0xfb,0x19,0x19,0x19,0xff,
+ 0x20,0x20,0x20,0xff,0x82,0x25,0x25,0x25,0xff,0x1a,0x24,0x24,0x24,0xff,0x22,
+ 0x22,0x22,0xff,0x21,0x21,0x21,0xff,0x1f,0x1f,0x1f,0xff,0x1e,0x1e,0x1e,0xff,
+ 0x1d,0x1d,0x1d,0xff,0x1c,0x1c,0x1c,0xff,0x1a,0x1a,0x1a,0xff,0x16,0x17,0x17,
+ 0xff,0x51,0x51,0x51,0xff,0x4d,0x4d,0x4d,0xff,0x22,0x22,0x22,0xff,0x25,0x25,
+ 0x25,0xff,0x27,0x27,0x28,0xff,0x32,0x34,0x32,0xff,0x37,0x4e,0x26,0xff,0x53,
+ 0x91,0x12,0xff,0x6b,0xb6,0x0f,0xff,0x4d,0x7a,0x19,0xff,0x2f,0x39,0x28,0xff,
+ 0x37,0x38,0x38,0xff,0x3b,0x3b,0x3a,0xff,0x2f,0x2f,0x2f,0xff,0x25,0x25,0x25,
+ 0xfb,0x1a,0x1a,0x1a,0xd0,0x0e,0x0e,0x10,0x4f,0x9b,0x00,0x00,0x00,0x00,0x0b,
+ 0x07,0x07,0x07,0x08,0x07,0x07,0x07,0x50,0x09,0x09,0x09,0x9b,0x0b,0x0b,0x0b,
+ 0xd8,0x10,0x10,0x10,0xfa,0x16,0x16,0x16,0xff,0x1c,0x1c,0x1c,0xff,0x20,0x20,
+ 0x20,0xff,0x22,0x22,0x22,0xff,0x20,0x21,0x20,0xff,0x1e,0x1e,0x1e,0xff,0x83,
+ 0x1d,0x1d,0x1d,0xff,0x13,0x1b,0x1b,0x1b,0xff,0x16,0x16,0x16,0xff,0x51,0x51,
+ 0x51,0xff,0x4e,0x4e,0x4e,0xff,0x22,0x22,0x22,0xff,0x24,0x24,0x24,0xff,0x26,
+ 0x26,0x26,0xff,0x31,0x32,0x31,0xff,0x2f,0x38,0x2a,0xff,0x33,0x4c,0x20,0xff,
+ 0x41,0x61,0x26,0xff,0x3b,0x4f,0x2d,0xff,0x33,0x37,0x30,0xff,0x2e,0x2e,0x2e,
+ 0xff,0x24,0x24,0x24,0xfa,0x1a,0x1a,0x1a,0xd6,0x13,0x13,0x13,0x99,0x0f,0x0f,
+ 0x0e,0x49,0x08,0x08,0x09,0x0c,0x9c,0x00,0x00,0x00,0x00,0x0b,0x06,0x06,0x06,
+ 0x02,0x07,0x07,0x07,0x20,0x08,0x08,0x08,0x4e,0x09,0x09,0x09,0x93,0x0b,0x0b,
+ 0x0b,0xd0,0x0f,0x0f,0x0f,0xf9,0x13,0x13,0x13,0xff,0x18,0x18,0x18,0xff,0x1c,
+ 0x1d,0x1c,0xff,0x1e,0x1e,0x1e,0xff,0x1d,0x1d,0x1d,0xff,0x82,0x1c,0x1c,0x1c,
+ 0xff,0x11,0x1b,0x1b,0x1b,0xff,0x16,0x16,0x16,0xff,0x52,0x52,0x52,0xff,0x4e,
+ 0x4e,0x4f,0xff,0x21,0x20,0x21,0xff,0x23,0x23,0x23,0xff,0x25,0x25,0x25,0xff,
+ 0x31,0x31,0x31,0xff,0x33,0x34,0x33,0xff,0x30,0x33,0x2f,0xff,0x2f,0x34,0x2f,
+ 0xff,0x29,0x2d,0x29,0xff,0x21,0x21,0x21,0xf9,0x18,0x18,0x19,0xce,0x13,0x13,
+ 0x13,0x90,0x0f,0x0f,0x0f,0x4b,0x09,0x09,0x09,0x1e,0x9f,0x00,0x00,0x00,0x00,
+ 0x1d,0x03,0x03,0x03,0x00,0x07,0x07,0x07,0x04,0x07,0x07,0x07,0x1b,0x08,0x08,
+ 0x08,0x41,0x09,0x09,0x09,0x80,0x0b,0x0b,0x0b,0xc7,0x0d,0x0d,0x0d,0xf5,0x11,
+ 0x11,0x11,0xff,0x15,0x15,0x15,0xff,0x19,0x19,0x19,0xff,0x1c,0x1c,0x1c,0xff,
+ 0x1d,0x1d,0x1d,0xff,0x1a,0x1a,0x1a,0xff,0x14,0x14,0x14,0xff,0x53,0x53,0x54,
+ 0xff,0x51,0x51,0x52,0xff,0x21,0x20,0x21,0xff,0x28,0x28,0x28,0xff,0x2d,0x2d,
+ 0x2d,0xff,0x31,0x31,0x31,0xff,0x2e,0x2e,0x2d,0xff,0x26,0x26,0x26,0xff,0x1e,
+ 0x1e,0x1e,0xf5,0x17,0x17,0x17,0xc5,0x13,0x13,0x14,0x7e,0x0f,0x0f,0x0f,0x3f,
+ 0x0a,0x0a,0x0a,0x1a,0x08,0x08,0x08,0x03,0x03,0x03,0x03,0x00,0xa2,0x00,0x00,
+ 0x00,0x00,0x18,0x03,0x03,0x03,0x03,0x06,0x06,0x06,0x13,0x09,0x09,0x09,0x32,
+ 0x09,0x0a,0x0a,0x6d,0x0a,0x0b,0x0b,0xb5,0x0c,0x0c,0x0c,0xe8,0x0f,0x0f,0x0f,
+ 0xfc,0x13,0x14,0x14,0xff,0x16,0x17,0x17,0xff,0x1b,0x1b,0x1a,0xff,0x16,0x16,
+ 0x16,0xff,0x4f,0x4f,0x50,0xff,0x55,0x55,0x56,0xff,0x2b,0x2b,0x2b,0xff,0x2d,
+ 0x2d,0x2c,0xff,0x28,0x28,0x27,0xff,0x21,0x21,0x21,0xfc,0x1b,0x1b,0x1b,0xe6,
+ 0x15,0x15,0x15,0xb2,0x12,0x11,0x12,0x6a,0x0f,0x0e,0x0f,0x31,0x0d,0x0c,0x0d,
+ 0x12,0x0e,0x0e,0x0e,0x03,0x07,0x07,0x07,0x00,0xa6,0x00,0x00,0x00,0x00,0x13,
+ 0x07,0x07,0x06,0x02,0x07,0x08,0x08,0x0c,0x08,0x09,0x09,0x20,0x09,0x08,0x09,
+ 0x50,0x09,0x09,0x09,0x95,0x0c,0x0c,0x0c,0xd8,0x0e,0x0e,0x0e,0xfa,0x10,0x10,
+ 0x10,0xff,0x14,0x14,0x14,0xff,0x2e,0x2e,0x2e,0xff,0x35,0x35,0x35,0xff,0x25,
+ 0x25,0x25,0xff,0x1e,0x1d,0x1d,0xf9,0x17,0x17,0x17,0xd6,0x13,0x13,0x13,0x94,
+ 0x12,0x12,0x12,0x4e,0x0e,0x0e,0x0e,0x20,0x0b,0x0b,0x0b,0x0c,0x05,0x05,0x05,
+ 0x02,0xab,0x00,0x00,0x00,0x00,0x0f,0x02,0x02,0x03,0x00,0x07,0x06,0x07,0x06,
+ 0x08,0x08,0x08,0x10,0x0a,0x0a,0x0a,0x2f,0x07,0x07,0x07,0x69,0x0a,0x0a,0x0a,
+ 0xb8,0x0e,0x0e,0x0e,0xe9,0x16,0x16,0x16,0xec,0x1b,0x1b,0x1b,0xe7,0x15,0x15,
+ 0x15,0xb5,0x0d,0x0d,0x0d,0x68,0x0f,0x0e,0x0e,0x2f,0x0f,0x0f,0x0e,0x10,0x0f,
+ 0x0f,0x0e,0x06,0x01,0x01,0x01,0x01,0xb0,0x00,0x00,0x00,0x00,0x09,0x08,0x08,
+ 0x08,0x02,0x05,0x05,0x05,0x05,0x0a,0x0a,0x0a,0x0b,0x0e,0x0e,0x0e,0x0e,0x13,
+ 0x13,0x13,0x0f,0x17,0x17,0x17,0x0e,0x12,0x12,0x12,0x0b,0x07,0x08,0x08,0x05,
+ 0x0a,0x09,0x09,0x02,0x99,0x00,0x00,0x00,0x00
+};
+
+static const GdkPixdata svp_3dvp_pixdata = {
+ 0x47646b50, /* Pixbuf magic: 'GdkP' */
+ 24 + 7569, /* header length + pixel_data length */
+ 0x2010002, /* pixdata_type */
+ 240, /* rowstride */
+ 60, /* width */
+ 60, /* height */
+ svp_3dvp_pixdata_pixel_data /* pixel_data */
+};
diff --git a/src/libXNVCtrl/NVCtrl.h b/src/libXNVCtrl/NVCtrl.h
index ac0abd0..2825f45 100644
--- a/src/libXNVCtrl/NVCtrl.h
+++ b/src/libXNVCtrl/NVCtrl.h
@@ -46,6 +46,7 @@
#define NV_CTRL_TARGET_TYPE_GVI 4
#define NV_CTRL_TARGET_TYPE_COOLER 5 /* e.g., fan */
#define NV_CTRL_TARGET_TYPE_THERMAL_SENSOR 6
+#define NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER 7
/**************************************************************************/
@@ -102,6 +103,10 @@
*
* S: The attribute may be queried using an NV_CTRL_TARGET_TYPE_THERMAL_SENSOR
* target type via XNVCTRLQueryTargetAttribute().
+ *
+ * T: The attribute may be queried using an
+ * NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER target type
+ * via XNVCTRLQueryTargetAttribute().
*
* NOTE: Unless mentioned otherwise, all attributes may be queried using
* an NV_CTRL_TARGET_TYPE_X_SCREEN target type via
@@ -338,6 +343,7 @@
#define NV_CTRL_STEREO_CHECKERBOARD_PATTERN 8
#define NV_CTRL_STEREO_INVERSE_CHECKERBOARD_PATTERN 9
#define NV_CTRL_STEREO_3D_VISION 10
+#define NV_CTRL_STEREO_3D_VISION_PRO 11
/*
* NV_CTRL_EMULATE - controls OpenGL software emulation of future
@@ -3025,6 +3031,34 @@
#define NV_CTRL_GPU_PCIE_MAX_LINK_SPEED 361 /* R--GI */
+/*
+ * NV_CTRL_3D_VISION_PRO_RESET_TRANSCEIVER_TO_FACTORY_SETTINGS - Resets the
+ * 3D Vision Pro transceiver to its factory settings.
+ */
+#define NV_CTRL_3D_VISION_PRO_RESET_TRANSCEIVER_TO_FACTORY_SETTINGS 363 /* -W-T */
+
+/*
+ * NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL - Controls the channel that is
+ * currently used by the 3D Vision Pro transceiver.
+ */
+#define NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL 364 /* RW-T */
+
+/*
+ * NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE - Controls the mode in which the
+ * 3D Vision Pro transceiver operates.
+ * NV_CTRL_3D_VISION_PRO_TM_LOW_RANGE is bidirectional
+ * NV_CTRL_3D_VISION_PRO_TM_MEDIUM_RANGE is bidirectional
+ * NV_CTRL_3D_VISION_PRO_TM_HIGH_RANGE may be bidirectional just up to a
+ * given range, and unidirectional beyond it
+ * NV_CTRL_3D_VISION_PRO_TM_COUNT is the total number of
+ * 3D Vision Pro transceiver modes
+ */
+#define NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE 365 /* RW-T */
+#define NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE_INVALID 0
+#define NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE_LOW_RANGE 1
+#define NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE_MEDIUM_RANGE 2
+#define NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE_HIGH_RANGE 3
+#define NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE_COUNT 4
/*
* NV_CTRL_DITHERING_DEPTH - Controls the dithering depth when
@@ -3048,17 +3082,106 @@
#define NV_CTRL_CURRENT_DITHERING_DEPTH_8_BITS 2
/*
- * NV_CTRL_GVO_ANC_PARITY_COMPUTATION - Controls the SDI device's computation
- * of the parity bit (bit 8) for ANC data words.
+ * NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_FREQUENCY - Returns the
+ * frequency of the channel(in kHz) of the 3D Vision Pro transceiver.
+ * Use the display_mask parameter to specify the channel number.
+ */
+#define NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_FREQUENCY 370 /* R--T */
+
+/*
+ * NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_QUALITY - Returns the
+ * quality of the channel(in percentage) of the 3D Vision Pro transceiver.
+ * Use the display_mask parameter to specify the channel number.
+ */
+#define NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_QUALITY 371 /* R--T */
+
+/*
+ * NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_COUNT - Returns the number of
+ * channels on the 3D Vision Pro transceiver.
+ */
+#define NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_COUNT 372 /* R--T */
+
+/*
+ * NV_CTRL_3D_VISION_PRO_PAIR_GLASSES - Puts the 3D Vision Pro
+ * transceiver into pairing mode to gather additional glasses.
+ * NV_CTRL_3D_VISION_PRO_PAIR_GLASSES_STOP - stops any pairing
+ * NV_CTRL_3D_VISION_PRO_PAIR_GLASSES_BEACON - starts continuous
+ * pairing via beacon mode
+ * Any other value, N - Puts the 3D Vision Pro transceiver into
+ * authenticated pairing mode for N seconds.
+ */
+#define NV_CTRL_3D_VISION_PRO_PAIR_GLASSES 373 /* -W-T */
+#define NV_CTRL_3D_VISION_PRO_PAIR_GLASSES_STOP 0
+#define NV_CTRL_3D_VISION_PRO_PAIR_GLASSES_BEACON 0xFFFFFFFF
+
+/*
+ * NV_CTRL_3D_VISION_PRO_UNPAIR_GLASSES - Tells a specific pair
+ * of glasses to unpair. The glasses will "forget" the address
+ * of the 3D Vision Pro transceiver to which they have been paired.
+ * To unpair all the currently paired glasses, specify
+ * the glasses id as 0.
+ */
+#define NV_CTRL_3D_VISION_PRO_UNPAIR_GLASSES 374 /* -W-T */
+
+/*
+ * NV_CTRL_3D_VISION_PRO_DISCOVER_GLASSES - Tells the 3D Vision Pro
+ * transceiver about the glasses that have been paired using
+ * NV_CTRL_3D_VISION_PRO_PAIR_GLASSES_BEACON. Unless this is done,
+ * the 3D Vision Pro transceiver will not know about glasses paired in
+ * beacon mode.
+ */
+#define NV_CTRL_3D_VISION_PRO_DISCOVER_GLASSES 375 /* -W-T */
+
+/*
+ * NV_CTRL_3D_VISION_PRO_IDENTIFY_GLASSES - Causes glasses LEDs to
+ * flash for a short period of time.
+ */
+#define NV_CTRL_3D_VISION_PRO_IDENTIFY_GLASSES 376 /* -W-T */
+
+/*
+ * NV_CTRL_3D_VISION_PRO_GLASSES_SYNC_CYCLE - Controls the
+ * sync cycle duration(in milliseconds) of the glasses.
+ * Use the display_mask parameter to specify the glasses id.
*/
+#define NV_CTRL_3D_VISION_PRO_GLASSES_SYNC_CYCLE 378 /* RW-T */
+/*
+ * NV_CTRL_3D_VISION_PRO_GLASSES_MISSED_SYNC_CYCLES - Returns the
+ * number of state sync cycles recently missed by the glasses.
+ * Use the display_mask parameter to specify the glasses id.
+ */
+#define NV_CTRL_3D_VISION_PRO_GLASSES_MISSED_SYNC_CYCLES 379 /* R--T */
+
+/*
+ * NV_CTRL_3D_VISION_PRO_GLASSES_BATTERY_LEVEL - Returns the
+ * battery level(in percentage) of the glasses.
+ * Use the display_mask parameter to specify the glasses id.
+ */
+#define NV_CTRL_3D_VISION_PRO_GLASSES_BATTERY_LEVEL 380 /* R--T */
+
+/* NV_CTRL_GVO_ANC_PARITY_COMPUTATION - Controls the SDI device's computation
+ * of the parity bit (bit 8) for ANC data words.
+ */
#define NV_CTRL_GVO_ANC_PARITY_COMPUTATION 381 /* RW--- */
#define NV_CTRL_GVO_ANC_PARITY_COMPUTATION_AUTO 0
#define NV_CTRL_GVO_ANC_PARITY_COMPUTATION_ON 1
#define NV_CTRL_GVO_ANC_PARITY_COMPUTATION_OFF 2
+/*
+ * NV_CTRL_3D_VISION_PRO_GLASSES_PAIR_EVENT - This attribute is sent
+ * as an event when glasses get paired in response to pair command
+ * from any of the clients.
+ */
+#define NV_CTRL_3D_VISION_PRO_GLASSES_PAIR_EVENT 382 /* ---T */
-#define NV_CTRL_LAST_ATTRIBUTE NV_CTRL_GVO_ANC_PARITY_COMPUTATION
+/*
+ * NV_CTRL_3D_VISION_PRO_GLASSES_UNPAIR_EVENT - This attribute is sent
+ * as an event when glasses get unpaired in response to unpair command
+ * from any of the clients.
+ */
+#define NV_CTRL_3D_VISION_PRO_GLASSES_UNPAIR_EVENT 383 /* ---T */
+
+#define NV_CTRL_LAST_ATTRIBUTE NV_CTRL_3D_VISION_PRO_GLASSES_UNPAIR_EVENT
/**************************************************************************/
@@ -3592,9 +3715,73 @@
#define NV_CTRL_STRING_GPU_CURRENT_CLOCK_FREQS 34 /* RW-G */
+/*
+ * NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_HARDWARE_REVISION - Returns the
+ * hardware revision of the 3D Vision Pro transceiver.
+ */
+#define NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_HARDWARE_REVISION 35 /* R--T */
+
+/*
+ * NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_VERSION_A - Returns the
+ * firmware version of chip A of the 3D Vision Pro transceiver.
+ */
+#define NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_VERSION_A 36 /* R--T */
+
+/*
+ * NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_DATE_A - Returns the
+ * date of the firmware of chip A of the 3D Vision Pro transceiver.
+ */
+#define NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_DATE_A 37 /* R--T */
+
+/*
+ * NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_VERSION_B - Returns the
+ * firmware version of chip B of the 3D Vision Pro transceiver.
+ */
+#define NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_VERSION_B 38 /* R--T */
+
+/*
+ * NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_DATE_B - Returns the
+ * date of the firmware of chip B of the 3D Vision Pro transceiver.
+ */
+#define NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_DATE_B 39 /* R--T */
+
+/*
+ * NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_ADDRESS - Returns the RF address
+ * of the 3D Vision Pro transceiver.
+ */
+#define NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_ADDRESS 40 /* R--T */
+
+/*
+ * NV_CTRL_STRING_3D_VISION_PRO_GLASSES_FIRMWARE_VERSION_A - Returns the
+ * firmware version of chip A of the glasses.
+ * Use the display_mask parameter to specify the glasses id.
+ */
+#define NV_CTRL_STRING_3D_VISION_PRO_GLASSES_FIRMWARE_VERSION_A 41 /* R--T */
+
+/*
+ * NV_CTRL_STRING_3D_VISION_PRO_GLASSES_FIRMWARE_DATE_A - Returns the
+ * date of the firmware of chip A of the glasses.
+ * Use the display_mask parameter to specify the glasses id.
+ */
+#define NV_CTRL_STRING_3D_VISION_PRO_GLASSES_FIRMWARE_DATE_A 42 /* R--T */
+
+/*
+ * NV_CTRL_STRING_3D_VISION_PRO_GLASSES_ADDRESS - Returns the RF address
+ * of the glasses.
+ * Use the display_mask parameter to specify the glasses id.
+ */
+#define NV_CTRL_STRING_3D_VISION_PRO_GLASSES_ADDRESS 43 /* R--T */
+
+/*
+ * NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME - Controls the name the
+ * glasses should use.
+ * Use the display_mask parameter to specify the glasses id.
+ */
+#define NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME 44 /* RW-T */
+
#define NV_CTRL_STRING_LAST_ATTRIBUTE \
- NV_CTRL_STRING_GPU_CURRENT_CLOCK_FREQS
+ NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME
/**************************************************************************/
@@ -3877,8 +4064,23 @@
#define NV_CTRL_BINARY_DATA_THERMAL_SENSORS_USED_BY_GPU 12 /* R--G */
+/*
+ * NV_CTRL_BINARY_DATA_GLASSES_PAIRED_TO_3D_VISION_PRO_TRANSCEIVER - Returns
+ * the id of the glasses that are currently paired to the given
+ * 3D Vision Pro transceiver.
+ *
+ * The format of the returned data is:
+ *
+ * 4 CARD32 number of glasses
+ * 4 * n CARD32 id of glasses
+ *
+ * This attribute can only be queried through XNVCTRLQueryTargetBinaryData()
+ * using a NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER target.
+ */
+#define NV_CTRL_BINARY_DATA_GLASSES_PAIRED_TO_3D_VISION_PRO_TRANSCEIVER 13 /* R--T */
+
#define NV_CTRL_BINARY_DATA_LAST_ATTRIBUTE \
- NV_CTRL_BINARY_DATA_THERMAL_SENSORS_USED_BY_GPU
+ NV_CTRL_BINARY_DATA_GLASSES_PAIRED_TO_3D_VISION_PRO_TRANSCEIVER
/**************************************************************************/
@@ -4121,6 +4323,8 @@
* ATTRIBUTE_TYPE_GVI - Attribute is valid for Graphics Video In target
* types.
* ATTRIBUTE_TYPE_COOLER - Attribute is valid for Cooler target types.
+ * ATTRIBUTE_TYPE_3D_VISION_PRO_TRANSCEIVER - Attribute is valid for 3D Vision
+ * Pro Transceiver target types.
*
* See 'Key to Integer Attribute "Permissions"' at the top of this
* file for a description of what these permission bits mean.
@@ -4146,6 +4350,7 @@
#define ATTRIBUTE_TYPE_GVI 0x100
#define ATTRIBUTE_TYPE_COOLER 0x200
#define ATTRIBUTE_TYPE_THERMAL_SENSOR 0x400
+#define ATTRIBUTE_TYPE_3D_VISION_PRO_TRANSCEIVER 0x800
typedef struct _NVCTRLAttributeValidValues {
int type;
diff --git a/src/libXNVCtrl/nv_control.h b/src/libXNVCtrl/nv_control.h
index a6b8546..6d10389 100644
--- a/src/libXNVCtrl/nv_control.h
+++ b/src/libXNVCtrl/nv_control.h
@@ -50,6 +50,7 @@
* 1.23 Added SENSOR TargetType
* 1.24 Fixed a bug where SLI_MOSAIC_MODE_AVAILABLE attribute would
* report false positives via the GPU and X screen target types
+ * 1.25 Added 3D_VISION_PRO_TRANSCEIVER TargetType
*/
#ifndef __NVCONTROL_H
@@ -60,7 +61,7 @@
#define NV_CONTROL_NAME "NV-CONTROL"
#define NV_CONTROL_MAJOR 1
-#define NV_CONTROL_MINOR 24
+#define NV_CONTROL_MINOR 25
#define X_nvCtrlQueryExtension 0
#define X_nvCtrlIsNv 1
diff --git a/src/parse.c b/src/parse.c
index 576ab5b..10a120b 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -320,6 +320,31 @@ AttributeTableEntry attributeTable[] = {
{ "XVideoBlitterSyncToVBlank", NV_CTRL_ATTR_XV_BLITTER_SYNC_TO_VBLANK, V, "Enables sync to vertical blanking for X video blitter adaptor." },
{ "XVideoSyncToDisplay", NV_CTRL_XV_SYNC_TO_DISPLAY, D|Z, "Controls which display device is synced to by the texture and blitter adaptors when they are set to synchronize to the vertical blanking." },
+ /* 3D Vision Pro */
+ {"3DVisionProResetTransceiverToFactorySettings", NV_CTRL_3D_VISION_PRO_RESET_TRANSCEIVER_TO_FACTORY_SETTINGS, N, "Resets the 3D Vision Pro transceiver to its factory settings."},
+ {"3DVisionProTransceiverChannel", NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL, N, "Controls the channel that is currently used by the 3D Vision Pro transceiver."},
+ {"3DVisionProTransceiverMode", NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE, N, "Controls the mode in which the 3D Vision Pro transceiver operates."},
+ {"3DVisionProTransceiverChannelFrequency", NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_FREQUENCY, N, "Returns the frequency of the channel(in kHz) of the 3D Vision Pro transceiver."},
+ {"3DVisionProTransceiverChannelQuality", NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_QUALITY, N, "Returns the quality of the channel(in percentage) of the 3D Vision Pro transceiver."},
+ {"3DVisionProTransceiverChannelCount", NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_COUNT, N, "Returns the number of channels on the 3D Vision Pro transceiver."},
+ {"3DVisionProPairGlasses", NV_CTRL_3D_VISION_PRO_PAIR_GLASSES, N, "Puts the 3D Vision Pro transceiver into pairing mode to gather additional glasses."},
+ {"3DVisionProUnpairGlasses", NV_CTRL_3D_VISION_PRO_UNPAIR_GLASSES, N, "Tells a specific pair of glasses to unpair."},
+ {"3DVisionProDiscoverGlasses", NV_CTRL_3D_VISION_PRO_DISCOVER_GLASSES, N, "Tells the 3D Vision Pro transceiver about the glasses that have been paired using NV_CTRL_3D_VISION_PRO_PAIR_GLASSES_BEACON."},
+ {"3DVisionProIdentifyGlasses", NV_CTRL_3D_VISION_PRO_IDENTIFY_GLASSES, N, "Causes glasses LEDs to flash for a short period of time."},
+ {"3DVisionProGlassesSyncCycle", NV_CTRL_3D_VISION_PRO_GLASSES_SYNC_CYCLE, N, "Controls the sync cycle duration(in milliseconds) of the glasses."},
+ {"3DVisionProGlassesMissedSyncCycles", NV_CTRL_3D_VISION_PRO_GLASSES_MISSED_SYNC_CYCLES, N, "Returns the number of state sync cycles recently missed by the glasses."},
+ {"3DVisionProGlassesBatteryLevel", NV_CTRL_3D_VISION_PRO_GLASSES_BATTERY_LEVEL, N, "Returns the battery level(in percentage) of the glasses."},
+ {"3DVisionProTransceiverHardwareRevision", NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_HARDWARE_REVISION, S|N, "Returns the hardware revision of the 3D Vision Pro transceiver."},
+ {"3DVisionProTransceiverFirmwareVersionA", NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_VERSION_A, S|N, "Returns the firmware version of chip A of the 3D Vision Pro transceiver."},
+ {"3DVisionProTransceiverFirmwareDateA", NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_DATE_A, S|N, "Returns the date of the firmware of chip A of the 3D Vision Pro transceiver."},
+ {"3DVisionProTransceiverFirmwareVersionB", NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_VERSION_B, S|N, "Returns the firmware version of chip B of the 3D Vision Pro transceiver."},
+ {"3DVisionProTransceiverFirmwareDateB", NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_DATE_B, S|N, "Returns the date of the firmware of chip B of the 3D Vision Pro transceiver."},
+ {"3DVisionProTransceiverAddress", NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_ADDRESS, S|N, "Returns the RF address of the 3D Vision Pro transceiver."},
+ {"3DVisionProGlassesFirmwareVersionA", NV_CTRL_STRING_3D_VISION_PRO_GLASSES_FIRMWARE_VERSION_A, S|N, "Returns the firmware version of chip A of the glasses."},
+ {"3DVisionProGlassesFirmwareDateA", NV_CTRL_STRING_3D_VISION_PRO_GLASSES_FIRMWARE_DATE_A, S|N, "Returns the date of the firmware of chip A of the glasses."},
+ {"3DVisionProGlassesAddress", NV_CTRL_STRING_3D_VISION_PRO_GLASSES_ADDRESS, S|N, "Returns the RF address of the glasses."},
+ {"3DVisionProGlassesName", NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME, S|N, "Controls the name the glasses should use."},
+
{ NULL, 0, 0, NULL }
};
@@ -345,7 +370,7 @@ AttributeTableEntry attributeTable[] = {
* about.
*/
-#if NV_CTRL_LAST_ATTRIBUTE != NV_CTRL_GVO_ANC_PARITY_COMPUTATION
+#if NV_CTRL_LAST_ATTRIBUTE != NV_CTRL_3D_VISION_PRO_GLASSES_UNPAIR_EVENT
#warning "Have you forgotten to add a new integer attribute to attributeTable?"
#endif
@@ -413,6 +438,14 @@ TargetTypeEntry targetTypeTable[] = {
ATTRIBUTE_TYPE_THERMAL_SENSOR, /* permission_bit */
NV_FALSE, /* uses_display_devices */
1, 23 }, /* required major,minor protocol rev */
+
+ { "3D Vision Pro Transceiver", /* name */
+ "svp", /* parsed_name */
+ NVIDIA_3D_VISION_PRO_TRANSCEIVER_TARGET, /* target_index */
+ NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER, /* nvctrl */
+ ATTRIBUTE_TYPE_3D_VISION_PRO_TRANSCEIVER, /* permission_bit */
+ NV_FALSE, /* uses_display_devices */
+ 1, 25 }, /* required major,minor protocol rev */
{ NULL, NULL, 0, 0, 0 },
};
diff --git a/src/parse.h b/src/parse.h
index 852e32b..47d8506 100644
--- a/src/parse.h
+++ b/src/parse.h
@@ -151,7 +151,8 @@ extern AttributeTableEntry attributeTable[];
#define GVI_TARGET 4
#define COOLER_TARGET 5
#define THERMAL_SENSOR_TARGET 6
-#define MAX_TARGET_TYPES 7
+#define NVIDIA_3D_VISION_PRO_TRANSCEIVER_TARGET 7
+#define MAX_TARGET_TYPES 8
diff --git a/src/query-assign.c b/src/query-assign.c
index 61d1df6..5a606df 100644
--- a/src/query-assign.c
+++ b/src/query-assign.c
@@ -424,6 +424,11 @@ static int process_attribute_queries(int num, char **queries,
continue;
}
+ if (nv_strcasecmp(queries[query], "svps")) {
+ query_all_targets(display_name, NVIDIA_3D_VISION_PRO_TRANSCEIVER_TARGET);
+ continue;
+ }
+
/* call the parser to parse queries[query] */
ret = nv_parse_attribute_string(queries[query], NV_PARSER_QUERY, &a);
@@ -1242,7 +1247,8 @@ static int print_target_connections(CtrlHandles *h,
product_name =
get_vcs_name(h->targets[target_index].t[ pData[i] ].h);
break;
-
+
+ case NVIDIA_3D_VISION_PRO_TRANSCEIVER_TARGET:
case THERMAL_SENSOR_TARGET:
case COOLER_TARGET:
case FRAMELOCK_TARGET:
@@ -1348,7 +1354,13 @@ static int query_all_targets(const char *display_name, const int target_index)
t = &h->targets[target_index].t[i];
str = NULL;
- if (target_index == THERMAL_SENSOR_TARGET) {
+ if (target_index == NVIDIA_3D_VISION_PRO_TRANSCEIVER_TARGET) {
+ /* for 3D Vision Pro transceiver, create the product name */
+
+ product_name = malloc(32);
+ snprintf(product_name, 32, "3D Vision Pro Transceiver %d", i);
+
+ } else if (target_index == THERMAL_SENSOR_TARGET) {
/* for sensor, create the product name */
product_name = malloc(32);
diff --git a/src/xpm_data/src.mk b/src/xpm_data/src.mk
index 360d582..a4432b4 100644
--- a/src/xpm_data/src.mk
+++ b/src/xpm_data/src.mk
@@ -9,3 +9,16 @@ LIB_XPM_DATA_EXTRA_DIST += green_xpm.h
LIB_XPM_DATA_EXTRA_DIST += red_xpm.h
LIB_XPM_DATA_EXTRA_DIST += rgb_xpm.h
LIB_XPM_DATA_EXTRA_DIST += src.mk
+LIB_XPM_DATA_EXTRA_DIST += svp_add_glasses.h
+LIB_XPM_DATA_EXTRA_DIST += svp_autopick_next_channel.h
+LIB_XPM_DATA_EXTRA_DIST += svp_battery_0.h
+LIB_XPM_DATA_EXTRA_DIST += svp_battery_100.h
+LIB_XPM_DATA_EXTRA_DIST += svp_battery_25.h
+LIB_XPM_DATA_EXTRA_DIST += svp_battery_50.h
+LIB_XPM_DATA_EXTRA_DIST += svp_battery_75.h
+LIB_XPM_DATA_EXTRA_DIST += svp_status_excellent.h
+LIB_XPM_DATA_EXTRA_DIST += svp_status_good.h
+LIB_XPM_DATA_EXTRA_DIST += svp_status_low.h
+LIB_XPM_DATA_EXTRA_DIST += svp_status_nosignal.h
+LIB_XPM_DATA_EXTRA_DIST += svp_status_verygood.h
+LIB_XPM_DATA_EXTRA_DIST += svp_status_verylow.h
diff --git a/src/xpm_data/svp_add_glasses.h b/src/xpm_data/svp_add_glasses.h
new file mode 100644
index 0000000..5067682
--- /dev/null
+++ b/src/xpm_data/svp_add_glasses.h
@@ -0,0 +1,1590 @@
+/* XPM */
+static const char * svp_add_glasses_xpm[] = {
+"320 80 1507 2",
+" c #878687",
+". c #878787",
+"+ c #868787",
+"@ c #868786",
+"# c #878786",
+"$ c #878686",
+"% c #868687",
+"& c #868686",
+"* c #868685",
+"= c #868586",
+"- c #868585",
+"; c #858585",
+"> c #858586",
+", c #858686",
+"' c #858685",
+") c #858485",
+"! c #848585",
+"~ c #858584",
+"{ c #848485",
+"] c #848584",
+"^ c #858484",
+"/ c #848484",
+"( c #838484",
+"_ c #848384",
+": c #838384",
+"< c #838383",
+"[ c #848483",
+"} c #848383",
+"| c #838483",
+"1 c #828383",
+"2 c #838283",
+"3 c #838382",
+"4 c #888888",
+"5 c #898989",
+"6 c #838282",
+"7 c #828282",
+"8 c #828283",
+"9 c #828382",
+"0 c #8B8B8B",
+"a c #8D8D8D",
+"b c #8D8D8E",
+"c c #8E8D8D",
+"d c #8B8B8C",
+"e c #818282",
+"f c #828182",
+"g c #828181",
+"h c #828281",
+"i c #818182",
+"j c #818281",
+"k c #818181",
+"l c #908F8F",
+"m c #929292",
+"n c #939393",
+"o c #929393",
+"p c #8F9090",
+"q c #808181",
+"r c #818180",
+"s c #818081",
+"t c #808081",
+"u c #959595",
+"v c #989898",
+"w c #989897",
+"x c #808080",
+"y c #7F8180",
+"z c #818080",
+"A c #808180",
+"B c #7F8080",
+"C c #807F80",
+"D c #9A9A9A",
+"E c #9D9D9D",
+"F c #9D9D9E",
+"G c #81807F",
+"H c #80807F",
+"I c #7F807F",
+"J c #7F7F80",
+"K c #7F7F7F",
+"L c #807F7F",
+"M c #9F9F9F",
+"N c #A4A3A3",
+"O c #A3A3A3",
+"P c #A3A3A4",
+"Q c #A4A4A4",
+"R c #7F7F7E",
+"S c #7E7F7F",
+"T c #7F7E7E",
+"U c #7E7E7F",
+"V c #7E7E7E",
+"W c #7F7E7F",
+"X c #7E7F7E",
+"Y c #A5A5A4",
+"Z c #A9A9A9",
+"` c #A9AAAA",
+" . c #AAA9A9",
+".. c #A1A1A2",
+"+. c #7E7D7E",
+"@. c #7E7E7D",
+"#. c #7D7D7E",
+"$. c #7D7E7E",
+"%. c #7E7D7D",
+"&. c #7D7E7D",
+"*. c #7D7D7D",
+"=. c #A8A9A9",
+"-. c #AFAFAF",
+";. c #AFAEAF",
+">. c #AFAFAE",
+",. c #AEAFAE",
+"'. c #A6A6A6",
+"). c #7C7D7D",
+"!. c #7D7C7D",
+"~. c #7D7D7C",
+"{. c #7C7C7D",
+"]. c #ADADAD",
+"^. c #B4B4B4",
+"/. c #B5B5B4",
+"(. c #AAAAAA",
+"_. c #7C7D7C",
+":. c #7D7C7C",
+"<. c #7C7C7C",
+"[. c #B1B1B1",
+"}. c #B9B9B9",
+"|. c #ADAEAD",
+"1. c #7B7B7B",
+"2. c #7C7B7B",
+"3. c #7B7C7B",
+"4. c #7B7B7C",
+"5. c #7C7B7C",
+"6. c #7C7C7B",
+"7. c #7B7C7C",
+"8. c #B3B3B3",
+"9. c #BBBBBB",
+"0. c #B0AFAF",
+"a. c #7B7B7A",
+"b. c #7A7A7A",
+"c. c #7A7B7B",
+"d. c #7A7A7B",
+"e. c #7B7A7A",
+"f. c #7A7B7A",
+"g. c #7B7A7B",
+"h. c #B6B6B6",
+"i. c #BDBDBD",
+"j. c #B2B2B2",
+"k. c #797A7A",
+"l. c #79797A",
+"m. c #7A797A",
+"n. c #7A7979",
+"o. c #7A7A79",
+"p. c #797A79",
+"q. c #797979",
+"r. c #8C8C8C",
+"s. c #BABABA",
+"t. c #BCBCBC",
+"u. c #BCBDBC",
+"v. c #BDBCBD",
+"w. c #BDBCBC",
+"x. c #898888",
+"y. c #787978",
+"z. c #797978",
+"A. c #797878",
+"B. c #787979",
+"C. c #787878",
+"D. c #797879",
+"E. c #787879",
+"F. c #969696",
+"G. c #777877",
+"H. c #777878",
+"I. c #787778",
+"J. c #787777",
+"K. c #787877",
+"L. c #777778",
+"M. c #777777",
+"N. c #A0A0A0",
+"O. c #BBBCBC",
+"P. c #BCBBBB",
+"Q. c #BCBBBC",
+"R. c #BCBCBB",
+"S. c #9C9C9C",
+"T. c #777677",
+"U. c #767777",
+"V. c #777776",
+"W. c #767677",
+"X. c #777676",
+"Y. c #767776",
+"Z. c #767676",
+"`. c #757675",
+" + c #767675",
+".+ c #757676",
+"++ c #757576",
+"@+ c #767876",
+"#+ c #767576",
+"$+ c #747575",
+"%+ c #747474",
+"&+ c #737373",
+"*+ c #727272",
+"=+ c #737474",
+"-+ c #757574",
+";+ c #757575",
+">+ c #767575",
+",+ c #BBBBBA",
+"'+ c #AEAFAF",
+")+ c #757475",
+"!+ c #747574",
+"~+ c #747374",
+"{+ c #727273",
+"]+ c #717171",
+"^+ c #707070",
+"/+ c #6F6F6F",
+"(+ c #6F6F6E",
+"_+ c #6F7070",
+":+ c #707171",
+"<+ c #727172",
+"[+ c #737372",
+"}+ c #747473",
+"|+ c #B7B7B7",
+"1+ c #737473",
+"2+ c #70706F",
+"3+ c #6D6D6D",
+"4+ c #6C6C6C",
+"5+ c #6C6B6C",
+"6+ c #6E6E6E",
+"7+ c #737374",
+"8+ c #909090",
+"9+ c #B8B8B8",
+"0+ c #747373",
+"a+ c #515151",
+"b+ c #393939",
+"c+ c #474747",
+"d+ c #575757",
+"e+ c #666666",
+"f+ c #6B6B6B",
+"g+ c #6A6A6A",
+"h+ c #9B9B9B",
+"i+ c #979797",
+"j+ c #545454",
+"k+ c #343434",
+"l+ c #424142",
+"m+ c #646464",
+"n+ c #737272",
+"o+ c #727372",
+"p+ c #727171",
+"q+ c #6F706F",
+"r+ c #4F4F4F",
+"s+ c #262626",
+"t+ c #2D2D2D",
+"u+ c #2E2E2E",
+"v+ c #353535",
+"w+ c #3D3D3D",
+"x+ c #444444",
+"y+ c #484848",
+"z+ c #4C4C4C",
+"A+ c #525252",
+"B+ c #5B5B5B",
+"C+ c #626263",
+"D+ c #686868",
+"E+ c #696969",
+"F+ c #A0A1A0",
+"G+ c #303030",
+"H+ c #1B1B1B",
+"I+ c #1A1A1A",
+"J+ c #191919",
+"K+ c #232323",
+"L+ c #424242",
+"M+ c #606060",
+"N+ c #727271",
+"O+ c #707072",
+"P+ c #717172",
+"Q+ c #717170",
+"R+ c #717072",
+"S+ c #717271",
+"T+ c #717071",
+"U+ c #696869",
+"V+ c #6C6B6B",
+"W+ c #383838",
+"X+ c #3E3E3E",
+"Y+ c #404040",
+"Z+ c #414141",
+"`+ c #5C5C5C",
+" @ c #656565",
+".@ c #696A69",
+"+@ c #696868",
+"@@ c #717070",
+"#@ c #636463",
+"$@ c #1E1E1F",
+"%@ c #343435",
+"&@ c #545353",
+"*@ c #717272",
+"=@ c #707071",
+"-@ c #706F71",
+";@ c #706F70",
+">@ c #6F6F70",
+",@ c #6F6E6F",
+"'@ c #676767",
+")@ c #6A6A6B",
+"!@ c #626262",
+"~@ c #454545",
+"{@ c #3B3B3B",
+"]@ c #3A3A3A",
+"^@ c #373737",
+"/@ c #363636",
+"(@ c #4A4A4A",
+"_@ c #565656",
+":@ c #616161",
+"<@ c #656666",
+"[@ c #666767",
+"}@ c #686969",
+"|@ c #6D6D6E",
+"1@ c #6E6E6D",
+"2@ c #6F766B",
+"3@ c #6C8361",
+"4@ c #6A9057",
+"5@ c #689B4F",
+"6@ c #679F4C",
+"7@ c #679D4C",
+"8@ c #699652",
+"9@ c #6B8B5A",
+"0@ c #6E7D65",
+"a@ c #70726E",
+"b@ c #707170",
+"c@ c #555555",
+"d@ c #181818",
+"e@ c #191819",
+"f@ c #1B1B1C",
+"g@ c #1C1C1C",
+"h@ c #272727",
+"i@ c #474847",
+"j@ c #6E6F6F",
+"k@ c #706E6F",
+"l@ c #6E706F",
+"m@ c #706F6F",
+"n@ c #5F5F5F",
+"o@ c #3C3C3C",
+"p@ c #323332",
+"q@ c #505150",
+"r@ c #5D5D5D",
+"s@ c #6E6E6F",
+"t@ c #6D7569",
+"u@ c #698C57",
+"v@ c #64AB41",
+"w@ c #60C12F",
+"x@ c #5FC929",
+"y@ c #5ECC28",
+"z@ c #5ECD27",
+"A@ c #5ECC27",
+"B@ c #5ECB28",
+"C@ c #5FC82B",
+"D@ c #62BA36",
+"E@ c #669E4A",
+"F@ c #6C8161",
+"G@ c #6E716E",
+"H@ c #676867",
+"I@ c #464646",
+"J@ c #2A2A2A",
+"K@ c #171717",
+"L@ c #1D1D1D",
+"M@ c #232222",
+"N@ c #585959",
+"O@ c #706F6E",
+"P@ c #6D6E6E",
+"Q@ c #6E6D6D",
+"R@ c #6E6D6E",
+"S@ c #6D6E6D",
+"T@ c #6D6D6C",
+"U@ c #6B6A6B",
+"V@ c #676868",
+"W@ c #636464",
+"X@ c #616262",
+"Y@ c #636363",
+"Z@ c #4B4B4B",
+"`@ c #404041",
+" # c #2C2C2C",
+".# c #292929",
+"+# c #282828",
+"@# c #4D4D4D",
+"## c #656465",
+"$# c #687D5E",
+"%# c #62A541",
+"&# c #5EC729",
+"*# c #5DCD25",
+"=# c #60BE32",
+"-# c #64A942",
+";# c #669A4D",
+"># c #689153",
+",# c #689452",
+"'# c #659F48",
+")# c #63B13C",
+"!# c #5FC62B",
+"~# c #5DCF25",
+"{# c #60BD32",
+"]# c #679550",
+"^# c #6D7667",
+"/# c #5B5A5B",
+"(# c #39393A",
+"_# c #1E1E1E",
+":# c #1F1F1F",
+"<# c #515150",
+"[# c #6E6D6F",
+"}# c #6D6C6D",
+"|# c #6C6D6D",
+"1# c #676766",
+"2# c #626162",
+"3# c #5E5E5E",
+"4# c #595959",
+"5# c #4E4E4E",
+"6# c #222222",
+"7# c #212121",
+"8# c #313131",
+"9# c #373838",
+"0# c #5A5A5A",
+"a# c #627E55",
+"b# c #5EB234",
+"c# c #5BCD23",
+"d# c #5EBA31",
+"e# c #64954B",
+"f# c #687C5F",
+"g# c #6B7169",
+"h# c #6D6F6B",
+"i# c #6C7567",
+"j# c #69875A",
+"k# c #64A642",
+"l# c #5EC72A",
+"m# c #5ECA28",
+"n# c #65A046",
+"o# c #6B7567",
+"p# c #6C6D6C",
+"q# c #6C6C6D",
+"r# c #505050",
+"s# c #2F2F2F",
+"t# c #434343",
+"u# c #646364",
+"v# c #6C6C6B",
+"w# c #6B6C6C",
+"x# c #6B6C6B",
+"y# c #6A6B6B",
+"z# c #666766",
+"A# c #5D5E5E",
+"B# c #5C5B5C",
+"C# c #2B2B2B",
+"D# c #252525",
+"E# c #4A4B4A",
+"F# c #5A724E",
+"G# c #5DB432",
+"H# c #5ACA22",
+"I# c #5EA33C",
+"J# c #647959",
+"K# c #6A696A",
+"L# c #6B7168",
+"M# c #678D54",
+"N# c #5FBC31",
+"O# c #5DCC25",
+"P# c #649F46",
+"Q# c #6B7366",
+"R# c #161616",
+"S# c #191818",
+"T# c #202020",
+"U# c #2C2D2D",
+"V# c #303131",
+"W# c #6B6B6A",
+"X# c #585858",
+"Y# c #242424",
+"Z# c #2D3A27",
+"`# c #438C1E",
+" $ c #4FBF16",
+".$ c #569835",
+"+$ c #636E5E",
+"@$ c #646463",
+"#$ c #678459",
+"$$ c #5FBC30",
+"%$ c #5DC827",
+"&$ c #65914F",
+"*$ c #6B6C6A",
+"=$ c #6A6B6A",
+"-$ c #3A393A",
+";$ c #3A3A39",
+">$ c #69696A",
+",$ c #6A6A69",
+"'$ c #696A6A",
+")$ c #60605F",
+"!$ c #5C5D5C",
+"~$ c #565556",
+"{$ c #232523",
+"]$ c #315F19",
+"^$ c #44B30D",
+"/$ c #3E9015",
+"($ c #34442C",
+"_$ c #505151",
+":$ c #646663",
+"<$ c #656B63",
+"[$ c #666C63",
+"}$ c #686A65",
+"|$ c #658D51",
+"1$ c #5FB832",
+"2$ c #687C5E",
+"3$ c #1C1B1C",
+"4$ c #3D3D3C",
+"5$ c #383737",
+"6$ c #6A6969",
+"7$ c #696968",
+"8$ c #686869",
+"9$ c #686968",
+"0$ c #686867",
+"a$ c #646565",
+"b$ c #5F6060",
+"c$ c #535353",
+"d$ c #333333",
+"e$ c #283521",
+"f$ c #3C9112",
+"g$ c #43AF0C",
+"h$ c #2D5319",
+"i$ c #555854",
+"j$ c #627B55",
+"k$ c #5E9643",
+"l$ c #5CA837",
+"m$ c #5DAB36",
+"n$ c #5F9D41",
+"o$ c #648453",
+"p$ c #666D63",
+"q$ c #676F64",
+"r$ c #61A83D",
+"s$ c #5CCC23",
+"t$ c #639649",
+"u$ c #696B68",
+"v$ c #222121",
+"w$ c #222122",
+"x$ c #2A2929",
+"y$ c #3E3D3D",
+"z$ c #302F30",
+"A$ c #535453",
+"B$ c #686767",
+"C$ c #686768",
+"D$ c #676768",
+"E$ c #676667",
+"F$ c #676666",
+"G$ c #575758",
+"H$ c #525152",
+"I$ c #515051",
+"J$ c #4B4B4A",
+"K$ c #383837",
+"L$ c #2E521C",
+"M$ c #43AE0D",
+"N$ c #3A8A13",
+"O$ c #252F20",
+"P$ c #282E26",
+"Q$ c #3B6527",
+"R$ c #4CA81E",
+"S$ c #56C61E",
+"T$ c #5BC526",
+"U$ c #59C225",
+"V$ c #59C922",
+"W$ c #5BC029",
+"X$ c #609845",
+"Y$ c #667161",
+"Z$ c #648553",
+"`$ c #5CC528",
+" % c #5FB235",
+".% c #667360",
+"+% c #242524",
+"@% c #1A191A",
+"#% c #323232",
+"$% c #666667",
+"%% c #656665",
+"&% c #656564",
+"*% c #646465",
+"=% c #646564",
+"-% c #656566",
+";% c #666665",
+">% c #666566",
+",% c #666565",
+"'% c #626261",
+")% c #606160",
+"!% c #5E5E5F",
+"~% c #595958",
+"{% c #555556",
+"]% c #535354",
+"^% c #414242",
+"/% c #242624",
+"(% c #356F18",
+"_% c #44B10D",
+":% c #326519",
+"<% c #222322",
+"[% c #294A19",
+"}% c #3F9F0E",
+"|% c #47B112",
+"1% c #458625",
+"2% c #4C6C3D",
+"3% c #5F7C52",
+"4% c #5E9443",
+"5% c #5ABC29",
+"6% c #5AC425",
+"7% c #609148",
+"8% c #656762",
+"9% c #65725F",
+"0% c #5CC12A",
+"a% c #647F56",
+"b% c #262727",
+"c% c #1F1E1E",
+"d% c #191A1A",
+"e% c #171617",
+"f% c #373636",
+"g% c #656464",
+"h% c #636364",
+"i% c #626363",
+"j% c #646363",
+"k% c #626362",
+"l% c #616162",
+"m% c #5F5E5F",
+"n% c #59595A",
+"o% c #545554",
+"p% c #4D4D4E",
+"q% c #252A23",
+"r% c #398214",
+"s% c #42A90E",
+"t% c #2B4B1C",
+"u% c #222A1F",
+"v% c #367D13",
+"w% c #43B30B",
+"x% c #2F6714",
+"y% c #272D24",
+"z% c #585A56",
+"A% c #5F844C",
+"B% c #59C025",
+"C% c #5BB52E",
+"D% c #617558",
+"E% c #656864",
+"F% c #5FA040",
+"G% c #5BC725",
+"H% c #62894F",
+"I% c #232423",
+"J% c #1B1C1B",
+"K% c #1A1B1B",
+"L% c #2B2B2C",
+"M% c #2B2C2B",
+"N% c #3B3B3C",
+"O% c #636262",
+"P% c #606061",
+"Q% c #616261",
+"R% c #606161",
+"S% c #636263",
+"T% c #5B5B5A",
+"U% c #555454",
+"V% c #525151",
+"W% c #282E25",
+"X% c #3C8E13",
+"Y% c #40A30F",
+"Z% c #283D1E",
+"`% c #25371D",
+" & c #3D9B0E",
+".& c #3D9A0E",
+"+& c #25371C",
+"@& c #151515",
+"#& c #4F564C",
+"$& c #5CA637",
+"%& c #58C522",
+"&& c #5F814D",
+"*& c #609446",
+"=& c #5ACA23",
+"-& c #608E49",
+";& c #232223",
+">& c #121112",
+",& c #393839",
+"'& c #262625",
+")& c #29292A",
+"!& c #4C4A4B",
+"~& c #565757",
+"{& c #5F5F60",
+"]& c #5F605F",
+"^& c #616160",
+"/& c #626161",
+"(& c #5E5F5E",
+"_& c #5D5D5E",
+":& c #5B5C5C",
+"<& c #565555",
+"[& c #4E4F4E",
+"}& c #3E3E3D",
+"|& c #2A3026",
+"1& c #3D9013",
+"2& c #40A20F",
+"3& c #283B1E",
+"4& c #273C1C",
+"5& c #3FA40D",
+"6& c #3A8D10",
+"7& c #232C1E",
+"8& c #0F0F0F",
+"9& c #4C4D4C",
+"0& c #518D31",
+"a& c #59C921",
+"b& c #5D8548",
+"c& c #5F9245",
+"d& c #608F48",
+"e& c #333332",
+"f& c #242323",
+"g& c #20201F",
+"h& c #131313",
+"i& c #3D3D3E",
+"j& c #252524",
+"k& c #292A29",
+"l& c #575656",
+"m& c #636362",
+"n& c #2B2A2A",
+"o& c #605F5F",
+"p& c #5E5D5D",
+"q& c #5E5D5E",
+"r& c #585958",
+"s& c #4F4E4E",
+"t& c #4A4949",
+"u& c #41453F",
+"v& c #3D8917",
+"w& c #42A80F",
+"x& c #2B481D",
+"y& c #25361D",
+"z& c #3D9A0F",
+"A& c #3D9D0D",
+"B& c #243819",
+"C& c #141414",
+"D& c #5F685B",
+"E& c #4E9B27",
+"F& c #58C422",
+"G& c #5B7D4C",
+"H& c #616360",
+"I& c #5D9B3F",
+"J& c #5AC624",
+"K& c #5F884B",
+"L& c #444544",
+"M& c #151514",
+"N& c #222323",
+"O& c #1E1F1E",
+"P& c #1D1C1D",
+"Q& c #282829",
+"R& c #616060",
+"S& c #5D5C5C",
+"T& c #5D5C5D",
+"U& c #5F5F5E",
+"V& c #605F60",
+"W& c #5C5D5D",
+"X& c #555655",
+"Y& c #4D4E4D",
+"Z& c #494949",
+"`& c #474845",
+" * c #4A882B",
+".* c #46B310",
+"+* c #32601B",
+"@* c #21271E",
+"#* c #347612",
+"$* c #42B20A",
+"%* c #39771A",
+"&* c #485243",
+"** c #646961",
+"=* c #55823F",
+"-* c #52BC1D",
+";* c #50A625",
+">* c #5D6E55",
+",* c #5F695B",
+"'* c #5BAA34",
+")* c #5AC126",
+"!* c #5F7C51",
+"~* c #1C1C1D",
+"{* c #151415",
+"]* c #262526",
+"^* c #292928",
+"/* c #353536",
+"(* c #2D2C2C",
+"_* c #333434",
+":* c #616061",
+"<* c #5E5F5F",
+"[* c #5D5E5D",
+"}* c #5C5C5D",
+"|* c #595858",
+"1* c #535352",
+"2* c #2F2F30",
+"3* c #5A5A5B",
+"4* c #5F5E5E",
+"5* c #5D5D5C",
+"6* c #464647",
+"7* c #487133",
+"8* c #4EBA18",
+"9* c #3F891B",
+"0* c #262D23",
+"a* c #314E23",
+"b* c #50AC23",
+"c* c #5FCB28",
+"d* c #6CB647",
+"e* c #658E51",
+"f* c #4B6F39",
+"g* c #3F7E1F",
+"h* c #48AF14",
+"i* c #4DB41A",
+"j* c #45712F",
+"k* c #4E514E",
+"l* c #5D7A50",
+"m* c #59BF27",
+"n* c #5AB32E",
+"o* c #5F6E58",
+"p* c #5B5C5B",
+"q* c #212021",
+"r* c #151615",
+"s* c #333334",
+"t* c #333233",
+"u* c #252625",
+"v* c #414040",
+"w* c #5B5A5A",
+"x* c #545455",
+"y* c #45553C",
+"z* c #4BA71D",
+"A* c #4EB51A",
+"B* c #365527",
+"C* c #797D78",
+"D* c #7DA06C",
+"E* c #60B536",
+"F* c #4FBD17",
+"G* c #4BB811",
+"H* c #4BB810",
+"I* c #43B209",
+"J* c #47A618",
+"K* c #44742D",
+"L* c #3D4539",
+"M* c #5C6159",
+"N* c #5B993B",
+"O* c #58CA20",
+"P* c #5C973E",
+"Q* c #5F625D",
+"R* c #252425",
+"S* c #212020",
+"T* c #222221",
+"U* c #4F4E4F",
+"V* c #5E5E5D",
+"W* c #585859",
+"X* c #5B5B5C",
+"Y* c #484947",
+"Z* c #48802D",
+"`* c #4ABC11",
+" = c #418A1C",
+".= c #545E4F",
+"+= c #8F8F91",
+"@= c #474843",
+"#= c #42562F",
+"$= c #477525",
+"%= c #4E8E22",
+"&= c #4D9121",
+"*= c #346815",
+"== c #3D5731",
+"-= c #40443D",
+";= c #5A794A",
+">= c #59BE26",
+",= c #59BB28",
+"'= c #5D7650",
+")= c #393838",
+"!= c #242525",
+"~= c #242425",
+"{= c #232322",
+"]= c #202120",
+"^= c #171618",
+"/= c #2B2A2B",
+"(= c #272827",
+"_= c #313030",
+":= c #242423",
+"<= c #5D5E5C",
+"[= c #121212",
+"}= c #585A59",
+"|= c #5C5C5B",
+"1= c #37482F",
+"2= c #56A92C",
+"3= c #68D631",
+"4= c #87BB6D",
+"5= c #747971",
+"6= c #484844",
+"7= c #424137",
+"8= c #4F4E3E",
+"9= c #515041",
+"0= c #4B4B3C",
+"a= c #3B3D2E",
+"b= c #24241E",
+"c= c #3F3F3F",
+"d= c #586A4E",
+"e= c #58AA2F",
+"f= c #57C720",
+"g= c #5A9040",
+"h= c #5D605B",
+"i= c #262525",
+"j= c #3D3C3D",
+"k= c #282827",
+"l= c #353435",
+"m= c #2A2A29",
+"n= c #2B2B2A",
+"o= c #5D5C5E",
+"p= c #5C5D5E",
+"q= c #50504F",
+"r= c #2B2C2C",
+"s= c #555554",
+"t= c #5A5B5B",
+"u= c #B4B4B3",
+"v= c #ADCE9E",
+"w= c #67C937",
+"x= c #53BF1B",
+"y= c #4F8529",
+"z= c #5B6743",
+"A= c #585746",
+"B= c #505041",
+"C= c #4C4C3E",
+"D= c #4A4A3C",
+"E= c #404033",
+"F= c #313025",
+"G= c #252621",
+"H= c #424243",
+"I= c #40413F",
+"J= c #58714A",
+"K= c #56A52E",
+"L= c #56C81D",
+"M= c #58A035",
+"N= c #5B6955",
+"O= c #252626",
+"P= c #262726",
+"Q= c #1D1E1E",
+"R= c #2F302F",
+"S= c #272626",
+"T= c #282728",
+"U= c #313032",
+"V= c #313031",
+"W= c #2F2F2E",
+"X= c #4E4D4E",
+"Y= c #111111",
+"Z= c #343433",
+"`= c #585857",
+" - c #5A595A",
+".- c #595A5A",
+"+- c #494A4A",
+"@- c #C9C9C9",
+"#- c #DBDBDD",
+"$- c #70716C",
+"%- c #4B712D",
+"&- c #58B81F",
+"*- c #5AC91C",
+"=- c #5BA72A",
+"-- c #5B7D3A",
+";- c #525B3D",
+">- c #454437",
+",- c #3D3C30",
+"'- c #3A392E",
+")- c #2C2C21",
+"!- c #292926",
+"~- c #474A46",
+"{- c #3A4B31",
+"]- c #54873B",
+"^- c #55B226",
+"/- c #56C51D",
+"(- c #57A132",
+"_- c #596B51",
+":- c #5A5B5A",
+"<- c #272627",
+"[- c #272728",
+"}- c #3F423D",
+"|- c #53594E",
+"1- c #5B6256",
+"2- c #51554E",
+"3- c #40413E",
+"4- c #4B4A4B",
+"5- c #2E2E2D",
+"6- c #5A5A59",
+"7- c #595A59",
+"8- c #545453",
+"9- c #525251",
+"0- c #353534",
+"a- c #575657",
+"b- c #575858",
+"c- c #BBBBBD",
+"d- c #646461",
+"e- c #52513F",
+"f- c #64644D",
+"g- c #5F7F3F",
+"h- c #5AAC27",
+"i- c #57C819",
+"j- c #56C01A",
+"k- c #52A023",
+"l- c #487B24",
+"m- c #3F6124",
+"n- c #3D5726",
+"o- c #2D4817",
+"p- c #3C6526",
+"q- c #488629",
+"r- c #54C41C",
+"s- c #55BD20",
+"t- c #569237",
+"u- c #58674F",
+"v- c #272726",
+"w- c #201F20",
+"x- c #181819",
+"y- c #444942",
+"z- c #515E4A",
+"A- c #506249",
+"B- c #354333",
+"C- c #222D1E",
+"D- c #21281A",
+"E- c #2C2D2A",
+"F- c #393A39",
+"G- c #4D4C4D",
+"H- c #595859",
+"I- c #585757",
+"J- c #4E4F4F",
+"K- c #535253",
+"L- c #585758",
+"M- c #565657",
+"N- c #4F4F4E",
+"O- c #504F50",
+"P- c #444344",
+"Q- c #C6C6C6",
+"R- c #525240",
+"S- c #64634F",
+"T- c #5F5F4D",
+"U- c #5F5E4B",
+"V- c #5B6A42",
+"W- c #54882F",
+"X- c #51A81E",
+"Y- c #51BC17",
+"Z- c #52BE16",
+"`- c #4DB613",
+" ; c #48AF0F",
+".; c #42AA0C",
+"+; c #50BB1B",
+"@; c #4BB815",
+"#; c #54B821",
+"$; c #539C2E",
+"%; c #547743",
+"&; c #565D53",
+"*; c #202121",
+"=; c #242324",
+"-; c #262627",
+";; c #454445",
+">; c #474B46",
+",; c #3D4A36",
+"'; c #2A3E24",
+"); c #203A19",
+"!; c #3C6414",
+"~; c #34521D",
+"{; c #293822",
+"]; c #252E1F",
+"^; c #343534",
+"/; c #575857",
+"(; c #575756",
+"_; c #4C4C4B",
+":; c #383939",
+"<; c #363737",
+"[; c #444545",
+"}; c #4E4E4F",
+"|; c #545354",
+"1; c #565655",
+"2; c #545555",
+"3; c #4D4E4E",
+"4; c #4F5050",
+"5; c #C3C3C3",
+"6; c #E9E9E9",
+"7; c #46463C",
+"8; c #61614C",
+"9; c #5F5E4C",
+"0; c #5E5D4A",
+"a; c #595847",
+"b; c #505040",
+"c; c #4C4C3D",
+"d; c #4D5938",
+"e; c #4D712F",
+"f; c #50862A",
+"g; c #4B9021",
+"h; c #3A840E",
+"i; c #438D1E",
+"j; c #4D8D2E",
+"k; c #4A7A32",
+"l; c #516C43",
+"m; c #50594E",
+"n; c #272828",
+"o; c #232424",
+"p; c #393B38",
+"q; c #222B1E",
+"r; c #1E2F1B",
+"s; c #3D691A",
+"t; c #7FC80C",
+"u; c #BBFF00",
+"v; c #6EAB11",
+"w; c #243A24",
+"x; c #2A3A20",
+"y; c #282B26",
+"z; c #3F3F40",
+"A; c #2C2B2C",
+"B; c #313231",
+"C; c #565756",
+"D; c #535454",
+"E; c #505051",
+"F; c #4E4D4D",
+"G; c #4A4A49",
+"H; c #474647",
+"I; c #3B3C3C",
+"J; c #3E3D3E",
+"K; c #484949",
+"L; c #525353",
+"M; c #434342",
+"N; c #C5C5C6",
+"O; c #DADADB",
+"P; c #C3C4C4",
+"Q; c #89898B",
+"R; c #ACACAC",
+"S; c #3F3F3D",
+"T; c #5F5F4B",
+"U; c #5C5B49",
+"V; c #555544",
+"W; c #4E4D3E",
+"X; c #4C4B3C",
+"Y; c #4C4B3D",
+"Z; c #4D4C3E",
+"`; c #494A3B",
+" > c #292B1E",
+".> c #393C33",
+"+> c #616361",
+"@> c #3B3E3B",
+"#> c #0D0D0D",
+"$> c #2A2B2A",
+"%> c #1B1A1B",
+"&> c #393A3A",
+"*> c #383D36",
+"=> c #2F4923",
+"-> c #60AB15",
+";> c #70C211",
+">> c #8FD80A",
+",> c #92D809",
+"'> c #2D4F22",
+")> c #283A1F",
+"!> c #252A20",
+"~> c #2E2D2E",
+"{> c #2A292A",
+"]> c #212122",
+"^> c #555656",
+"/> c #4F4F50",
+"(> c #4B4A4A",
+"_> c #464545",
+":> c #474646",
+"<> c #404140",
+"[> c #474748",
+"}> c #504F4F",
+"|> c #4F504F",
+"1> c #4E4E4D",
+"2> c #4D4D4C",
+"3> c #363635",
+"4> c #E3E3E5",
+"5> c #D3D3D4",
+"6> c #949495",
+"7> c #5C5C58",
+"8> c #48483D",
+"9> c #353529",
+"0> c #1A1A18",
+"a> c #41413C",
+"b> c #585846",
+"c> c #434235",
+"d> c #26261B",
+"e> c #494945",
+"f> c #070707",
+"g> c #090909",
+"h> c #101010",
+"i> c #202021",
+"j> c #1E1D1E",
+"k> c #191A19",
+"l> c #8A8A8A",
+"m> c #282727",
+"n> c #363837",
+"o> c #464B43",
+"p> c #252E26",
+"q> c #4E8415",
+"r> c #70C50F",
+"s> c #7ECB0E",
+"t> c #6CB512",
+"u> c #89DE0A",
+"v> c #538617",
+"w> c #202F21",
+"x> c #1F251B",
+"y> c #464645",
+"z> c #555455",
+"A> c #525352",
+"B> c #4C4B4B",
+"C> c #434444",
+"D> c #484748",
+"E> c #4A4B4B",
+"F> c #4C4D4D",
+"G> c #4D4C4C",
+"H> c #4B4B4C",
+"I> c #D7D7D7",
+"J> c #E1E1E2",
+"K> c #B3B3B4",
+"L> c #6C6C6A",
+"M> c #4B4B42",
+"N> c #474738",
+"O> c #565542",
+"P> c #605F4C",
+"Q> c #595846",
+"R> c #3C3B2E",
+"S> c #43423E",
+"T> c #525241",
+"U> c #4B4A3C",
+"V> c #373729",
+"W> c #2C2B23",
+"X> c #666664",
+"Y> c #4A4A4B",
+"Z> c #4C4C4D",
+"`> c #515152",
+" , c #121312",
+"., c #0B0B0B",
+"+, c #080808",
+"@, c #2C2C2B",
+"#, c #19191A",
+"$, c #383839",
+"%, c #232324",
+"&, c #353635",
+"*, c #272D25",
+"=, c #3B6219",
+"-, c #67BA0F",
+";, c #6FCA0E",
+">, c #82D40C",
+",, c #88D607",
+"', c #3D6617",
+"), c #222D20",
+"!, c #292E25",
+"~, c #525253",
+"{, c #515252",
+"], c #414142",
+"^, c #454546",
+"/, c #414041",
+"(, c #C5C5C5",
+"_, c #EEEEEE",
+":, c #D8D8D9",
+"<, c #4E4E49",
+"[, c #47473A",
+"}, c #64644F",
+"|, c #63634F",
+"1, c #5A5948",
+"2, c #555445",
+"3, c #444334",
+"4, c #141413",
+"5, c #4A493C",
+"6, c #49493A",
+"7, c #4B4A3B",
+"8, c #424334",
+"9, c #2A2A1F",
+"0, c #474642",
+"a, c #4B4C4C",
+"b, c #515050",
+"c, c #0E0E0E",
+"d, c #343334",
+"e, c #464944",
+"f, c #2A3125",
+"g, c #222E21",
+"h, c #2C4620",
+"i, c #3E7319",
+"j, c #467817",
+"k, c #294123",
+"l, c #2F3F2B",
+"m, c #3B4534",
+"n, c #424540",
+"o, c #3C3B3C",
+"p, c #1A1B1A",
+"q, c #3A3B3B",
+"r, c #535252",
+"s, c #515251",
+"t, c #454645",
+"u, c #434242",
+"v, c #373738",
+"w, c #A2A2A2",
+"x, c #DCDCDC",
+"y, c #EBEBEC",
+"z, c #C2C2C3",
+"A, c #737371",
+"B, c #49493F",
+"C, c #4D4C3D",
+"D, c #5A5945",
+"E, c #63624F",
+"F, c #646450",
+"G, c #62624E",
+"H, c #5E5D4B",
+"I, c #575647",
+"J, c #515040",
+"K, c #37372B",
+"L, c #2D2D2C",
+"M, c #48473E",
+"N, c #4A4A3B",
+"O, c #4B4B3D",
+"P, c #484739",
+"Q, c #343426",
+"R, c #33332B",
+"S, c #6E6E6C",
+"T, c #3C3D3C",
+"U, c #0C0C0C",
+"V, c #8C8B8C",
+"W, c #323032",
+"X, c #282C26",
+"Y, c #212A1D",
+"Z, c #25301F",
+"`, c #293625",
+" ' c #324430",
+".' c #405538",
+"+' c #43513C",
+"@' c #3D413A",
+"#' c #424342",
+"$' c #40403F",
+"%' c #3A3A3B",
+"&' c #CCCCCC",
+"*' c #D9D9DA",
+"=' c #ACACAD",
+"-' c #5E5E5B",
+";' c #444439",
+">' c #5F5F4A",
+",' c #63624E",
+"'' c #525143",
+")' c #474538",
+"!' c #353528",
+"~' c #30302B",
+"{' c #434340",
+"]' c #48483A",
+"^' c #3E3E2F",
+"/' c #2D2C22",
+"(' c #51514C",
+"_' c #494848",
+":' c #454444",
+"<' c #303031",
+"[' c #0A0A0A",
+"}' c #090908",
+"|' c #111110",
+"1' c #1E1E1D",
+"2' c #262825",
+"3' c #343932",
+"4' c #3E463A",
+"5' c #404A3C",
+"6' c #3C4239",
+"7' c #333531",
+"8' c #403F3F",
+"9' c #3E3F3E",
+"0' c #3D3C3C",
+"a' c #2A2A2B",
+"b' c #5A5A58",
+"c' c #454438",
+"d' c #51513F",
+"e' c #5F5E4A",
+"f' c #61614D",
+"g' c #60604C",
+"h' c #5F5F4C",
+"i' c #595A47",
+"j' c #3D3C31",
+"k' c #39382C",
+"l' c #2D2D22",
+"m' c #393931",
+"n' c #3A3A33",
+"o' c #787876",
+"p' c #494948",
+"q' c #100F10",
+"r' c #161516",
+"s' c #1C1D1D",
+"t' c #8E8E8D",
+"u' c #363536",
+"v' c #1C1A1C",
+"w' c #1D1C1C",
+"x' c #2D2D2E",
+"y' c #454646",
+"z' c #49494A",
+"A' c #3F403F",
+"B' c #383836",
+"C' c #484838",
+"D' c #585845",
+"E' c #5B5B48",
+"F' c #5C5C49",
+"G' c #5D5D4B",
+"H' c #5E5E4A",
+"I' c #555543",
+"J' c #4D4D3E",
+"K' c #49483A",
+"L' c #3B3B2F",
+"M' c #333225",
+"N' c #363530",
+"O' c #363736",
+"P' c #444445",
+"Q' c #4C4B4C",
+"R' c #1F2020",
+"S' c #363637",
+"T' c #919191",
+"U' c #434443",
+"V' c #393938",
+"W' c #424343",
+"X' c #3F4040",
+"Y' c #46463A",
+"Z' c #555542",
+"`' c #545342",
+" ) c #575645",
+".) c #4C4C3C",
+"+) c #4A493B",
+"@) c #474638",
+"#) c #38382C",
+"$) c #2F2E24",
+"%) c #403F40",
+"&) c #0F0E0E",
+"*) c #1C1D1C",
+"=) c #151717",
+"-) c #343535",
+";) c #2E2D2D",
+">) c #3A3B3A",
+",) c #4B4C4B",
+"') c #3C3B3B",
+")) c #333232",
+"!) c #191918",
+"~) c #3D3D3A",
+"{) c #50503F",
+"]) c #515140",
+"^) c #4B493C",
+"/) c #454537",
+"() c #3A3A2E",
+"_) c #303023",
+":) c #383834",
+"<) c #404141",
+"[) c #424141",
+"}) c #343333",
+"|) c #454544",
+"1) c #484948",
+"2) c #414241",
+"3) c #282929",
+"4) c #111011",
+"5) c #1B1A1A",
+"6) c #999999",
+"7) c #3B3A3A",
+"8) c #323132",
+"9) c #1A1A19",
+"0) c #302F2F",
+"a) c #3E3E3F",
+"b) c #3B3B3A",
+"c) c #3A3A3C",
+"d) c #42423B",
+"e) c #444436",
+"f) c #343327",
+"g) c #313028",
+"h) c #434243",
+"i) c #494A49",
+"j) c #474848",
+"k) c #0B0A0A",
+"l) c #201F1F",
+"m) c #383738",
+"n) c #4A494A",
+"o) c #3F3E3F",
+"p) c #373837",
+"q) c #3C3C3D",
+"r) c #44443A",
+"s) c #4A4A3A",
+"t) c #4A493A",
+"u) c #4B4B3B",
+"v) c #3D3C2E",
+"w) c #41413F",
+"x) c #3E3F3F",
+"y) c #484847",
+"z) c #434344",
+"A) c #0D0C0D",
+"B) c #373637",
+"C) c #181718",
+"D) c #161617",
+"E) c #414140",
+"F) c #474746",
+"G) c #444343",
+"H) c #454539",
+"I) c #4B4C3D",
+"J) c #464637",
+"K) c #403F30",
+"L) c #363629",
+"M) c #3B3B30",
+"N) c #51514E",
+"O) c #0B0A0B",
+"P) c #484747",
+"Q) c #363535",
+"R) c #3F3F3E",
+"S) c #454538",
+"T) c #3B3A2C",
+"U) c #38372A",
+"V) c #3F3F32",
+"W) c #5F5F58",
+"X) c #898984",
+"Y) c #A0A09E",
+"Z) c #464746",
+"`) c #484849",
+" ! c #2C2C2D",
+".! c #282928",
+"+! c #494849",
+"@! c #464747",
+"#! c #464546",
+"$! c #444335",
+"%! c #3D3D2E",
+"&! c #37362A",
+"*! c #49483E",
+"=! c #73726D",
+"-! c #969693",
+";! c #9F9F9E",
+">! c #9A9A9B",
+",! c #292828",
+"'! c #323233",
+")! c #41413B",
+"!! c #3C3C2F",
+"~! c #424237",
+"{! c #5F5F57",
+"]! c #999997",
+"^! c #8A8A8B",
+"/! c #5C5C5E",
+"(! c #3D3E3E",
+"_! c #424241",
+":! c #90908E",
+"<! c #353636",
+"[! c #454446",
+"}! c #444443",
+"|! c #434445",
+"1! c #434544",
+"2! c #3B3A3B",
+"3! c #454344",
+"4! c #454443",
+"5! c #3F3E3E",
+"6! c #40403E",
+" . . + @ . + + . @ # + . . + + $ @ + . . . @ + . $ % # + . @ # . . . . % # # $ . . . . + % @ . . . . . # @ . $ . # % + % # $ . @ # # # # # $ # + + . $ + + . $ & . # . . % . & & % . + % . % + . @ + . + + . # & % # . . . . . . + . + $ + . $ + @ $ # . # + @ . % # % # . + . . @ . # + . . # @ # # . % & $ . . % . @ + # # # . $ . $ . . . # + . # # . . . . . % & # # . . . % + $ . + # % $ . . + . . # . . . . . . $ + . . . . @ . . % % + # # # . & # @ + + . . @ . . . + . + . # # % @ . . + & # . # + # . . . . . % . % . # . % + @ % & . @ . . # . + . $ ",
+"& & & & & & & & & & * @ & & & & & & & = & & & & & & & & % & & & @ & & & & & & $ & & & & & & & * & % & & & @ & & & & & @ & $ & & & & & & & % & & & & & & @ & & & & & & & & & & & & & & & & & & & & & & & & & % & * & & & & % & & & & % & & & & & & & & % & & & & & $ & & & & & & & & & & & & & & & & & & % $ & & & & & = $ & & & + & & & & & & & & & $ & @ & & & & & & @ & & & + % & & & & & & & & = & @ @ & @ & & & & & & & @ & & & & & & & & % & & & & & & & = & & & & @ & & & % & & & @ $ @ & & & & & & & & & & & & & & & & & & & & & + @ - % @ $ & $ & & & & & & & & & & & & $ & $ & $ @ @ & & & & & & & & & & & & & & & & & & & @ & & & & @ & & $ & & & & ",
+"- ; & - > = & - ; , * & * = , , = - > = = > = & = , & * - * & - = , - & > = > > * ; > = = - * ; & ' ' ; * - ' > , = > , & * & > ' , = , - * = = * , , = = ' * = ' = > & - - = - & = , , , = > * & , > = , * * ' ' > > & , * * > & * - > , = ' > , * ' = , ; ' = ; & = > > , > , - ' - * = & - ' ' = = * ; ; * ' , & > ; > - & ' , & > = * = - , & - ' & > * & > & > > > = , ; * & * , & ' & * = = * = - > ' ' & = ' > - ' > & > & , > ' ' * , > = , = , > * ; - > - * , , , , = = = , * > > & = > , & = * - * & * - > ' ' ' ' ' , - & * = > , ; ; > = & ' ; * = = , - , , - > = , > > - ' ' ; * ' = & , ; , * = , * & ' , = ; & ' = & = * ; & = - ; & , = = > , ",
+") ; ; ; ; ; ; ; ; ! ; ; ; ) ; ; - ; ; ; ; ; ; ; ! ! ; ; ~ ; ; ~ ~ ) ; ; ; ; ; ; ; ; ; ; ; ; ; ) ~ ; ; ! ; ) ; ! ; ; ; ; ; ; ; ; ) ; ; ; ; ; ) ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ) { ; ; ; ; ; ! ; ; ~ ; ; ; ; ; ; ; ; ) ) ; ~ ; { ; { ; ; ) ) ; ; ; ] ; ; ] ; ; ; ; ; ; ; ; ~ ; ; ^ ; ] ; ; ; ; ; ; { ; ) ; ; ; ; ! ; ; ; ; ) ) ; ; ) ~ ; ; ; ~ ; ! ; ; ; ; ; ' ; ; ; ; ; ; ; ; ) ; ; ; ! ; ; ; ; ; ; ! ; ~ ; ~ ; ; ; ; ! ; ; ) ) ~ ! ; ; ; ! ; ; ; ; ; ; ) ; ! ) ; ; ~ ; ; ) ) ; ; ; ; ~ ; ~ ; ; ; ; ; ; ; ) ; ! ; ; ; ; ; { ; ; ; ; ~ ; ! ; ~ ) ; ; ~ ! ; ; ; ~ ) ; ; ; ; ; ; ; ! ; ; ; ! ; ; ; ; ; ; ; ) ; ; ; ; ; ; ; ; ; ; ; ! ; ! > ; ; ; ; ; ; ; ; ; ; ; ; ) ",
+"/ / / / ] / / / ] ] / ^ / / / / ] / / / / / ) { / / ^ / / / { ] / / / / / / ^ / / { ^ / / ] / / / / / / / / / / ] { { ^ ] / / / / / { ] ] ^ / { / / ^ ^ ] / { { { / / ~ / / / { / / / / / / ^ / / / ^ / / / { { { / / ^ ] ! / / / / / / / ^ / / / ] / / / / ^ { / / / / ^ ) / / { / { ^ / ! / / / ] { / / ^ / / / / / / / / ] / ^ ] ) / ] / / / / / / ] / / / / / { / / / / / ] / / / / / / / / / / / / ^ / ! / ^ ] / / / / / ~ / / / { / / { / / / / { / / ^ / / ] ~ / / / / ] / ^ / { / ^ / ^ ] / { / / / / / { / / ] / / / / / ~ / / ^ ] ^ / / / / ^ ) / / / / / ] / / / ^ / / / / / / / ] / / ] ] / ^ / / / / { / { / ^ ^ ] / / / / ] / { / / ^ / { / / / / ",
+"( _ : ( < / ( < / [ < [ } / < | [ : _ [ / : ( ( [ ( [ } _ [ [ ( _ ( : / } / ( / / } | } : / ( } _ [ / [ [ [ [ / [ } / [ } / / | : / < [ / < < [ } _ ( ( | / : / / / / | : [ } / < ( / } : [ / _ < : } / < | / | [ [ / | | } [ [ < [ } : ( < ( : } / | _ : ( / [ < : < ( [ < [ } : ( ( | ( : | _ ! - , ; = * ^ / / : _ : ( _ | / } | ( _ / } [ | | [ [ _ ( : / ( | [ [ } < } / < / [ } < } } / _ [ ( _ ( [ [ / / / _ / < / _ : ( [ < / | } | [ / | < | [ ( | | ( : : ( / : < ( | ( | / / ( [ _ _ < : _ } < ( [ / < / < [ _ / } / [ / / / | ( } [ } : _ / / | : ( ( _ _ [ [ _ ( [ : _ : ( } < / ( } [ < ( : [ } / : ( } [ : / < / _ [ : : ( / / : _ | [ } : [ _ [ ",
+"< < < < < < < < < < 1 < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < 2 < < < < < < < < < < < < < < 1 < < < < < < 3 < < < < < < < < < < < < < < < < < < 2 < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < 4 5 5 5 5 5 . < < < < < < < < < 3 < < 3 < < < 3 < < < < < < < < < < < < < < < < 3 < < < < 2 < < < < < < < < < 3 < < < < < < < < < < < < < < < < < < < < < 2 2 < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < 1 1 < < 2 < 2 < < 2 < < < < < < < < < < < < < < < < < < < < < < < < < 1 < < < < < < < < < < < 3 < < < < 6 3 ",
+"7 7 7 7 7 7 7 7 8 1 7 7 7 8 7 7 7 7 7 7 7 7 6 7 2 7 7 7 9 7 7 7 7 7 9 7 6 6 7 9 7 8 7 7 6 7 2 7 7 9 9 7 7 7 2 6 7 7 6 7 7 6 8 8 7 7 6 7 7 7 7 7 6 7 7 7 7 7 6 7 6 6 8 8 7 7 7 7 7 7 7 7 7 7 9 9 7 7 7 6 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 7 7 7 7 7 7 7 7 7 8 7 9 7 8 7 7 7 9 7 7 7 7 7 7 7 1 0 a a b b c d 9 7 7 7 7 7 7 7 9 7 7 8 6 7 1 7 6 7 8 1 7 7 8 7 8 7 7 7 7 7 6 7 6 7 8 9 9 7 7 7 8 7 7 9 7 9 7 8 7 9 7 9 9 7 6 7 8 6 7 8 7 7 8 8 8 7 7 7 7 8 7 8 7 7 7 7 8 3 7 7 6 8 1 7 8 7 6 7 6 6 7 7 7 7 6 6 7 7 7 7 8 < 8 7 7 7 2 9 7 3 7 9 7 7 7 7 7 7 7 7 6 7 9 7 7 7 7 7 7 8 7 7 9 8 7 7 3 7 7 9 7 7 8 7 1 1 2 7 2 6 9 8 7 7 6 7 7 7 7 7 7 7 6 7 8 6 6 7 3 ",
+"e 7 7 f 7 g h i j 7 h h g h h f f e k 7 g g e 7 7 7 e 7 k g e 7 f j f 7 7 f j f f 7 h i e f e 7 f h h h g f g 7 g e g g 7 f e 7 7 f h e e f k h i f 7 k f g 7 f i e e g e g e h j h 7 f h j 7 j k 7 i h 7 j i e 7 f f i g f 7 h 7 j h k f f 7 h 7 k j i f 7 e g 7 e e 7 7 g 7 f 7 j e j h f 7 i l m m n o m p f i 7 e j g j f 7 h f f f f i g h 7 7 f e h f f e i i e f 7 e f 7 g 7 7 g g f h j f j i 7 i e g e 7 j 7 i h g 7 7 e 7 e 7 g e 7 7 7 7 k f f i i 7 f i e j e g 7 h f e 7 f j j k g f f 7 e h i g i e 7 7 h 7 i f e h 7 f 7 j h h e h h h j i f j f f 7 7 j 7 f 7 f j 7 j h 7 g h h 7 7 i j 7 7 f e h f f 7 7 7 k h j f 7 h f k f 7 e 7 j 7 e 7 7 f ",
+"k k k k k k k k q k q k r q k k s k k k k k k k k k k k k k k k k k k k k k k k k k k k q k k k k k k k k k k k k k k k k k k k k k k k k k s k k k s r k k r k k r q k k k k k k s k k k k k k k q k k k k k k k k k k k r k r k k k k k k s k k k k k r k q k k k k k k k t k k k k k k q k k u v v v v w n k k k k k k k q k k k k k k q k s q k k r k s k k k k k k k k k k k k s k k k k k k k r k k k r k k k k k k k k k k k k k k r k k k q k k k k k k k k k k k k k k k k k k k k k k q k k k q k k k k k k k r k k k k k k k k k k k k k k k k q k k k q k k k s k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k q k k k k k r k k ",
+"x x x y z x x x x x t x x A t x x z x x x x z x A x x z t z x x t t x x B x x A A x x x x x x x q x z x x x x x x x x x x x x A x z B t x x x x A t A A x x A x x x x x x x t x x x x A x x x x x x x x x C x x x x t x x x x x x x A C t x x x x x z x x x x A x x x x x z x t z x x x x A x x D E E E F E v x x x x z x x A x x x x t x x t x x x x x t x x A A G x x x x x C x z x A x x x q x z z x s x x x A x x x A x x z x x x x x x x x t x x x x z q A z x t A z x x z A x x x x x x t x x x x x x x z x x C B x x x A x x B x x H x A x x x t x x s t x t x x t H x x x x x x x x x t x x x x x A x x x x t x x x x x A x x x x x t x x x x x x x x C ",
+"B I x J H B H C K L K J L K L B B x B J L J I B K L x B L K L K B x K L J H H J K J I L B I K K L K I K L L C x L K K J K K K I x K J I K C B x C K L L B K J K K J L C K I K K I K L K J K K K J B K I L K C J K K L J K K K J L L K K H C K L K J I J I I J J I B K K J K K B K J L I J J J K M N O P N Q E I K H I I H C J H J I J H B B K C L K I K J C K J J I J K B C K J B J L K J L K C J K K K K J J K x J I K K K K H I L J I x L L K I H I H J B J x I L K I I I L L C J J K J L K I I C K K I K L L J H K B L I B K J L I I K L J I H L L L I I J L L L K B L I C J H K I I K L L K B K H K K I J C J I L I I I J K I J I H H C H J x K L K L K H K ",
+"R S R T T U V K V W V W T X T S S W S R U V W K T X R X W V R K V R W K V S U U U V T V R K W V X X X V U W X R V R X S U V R U T T T X V W V K T X V R R W W U V U T V V U U U U X R X V W S X U W X X U W U U V T T R U K T X V T S X X U R R S U V R R V X R S V U V S X V T W V S T U T R T Y Z Z Z ` ...U W T X U S W U X V U T X U U K V W V X K R X V W U R S T V K T R U U V T X R V V W K K U K S U V U T W S S K U U V R S S K W T U U X R T U R X K U X K V T T W V U U V T K T U S V V X X T U V X V V V R X R S K U V V R V X X T X R T S R T T R K U V R V T U S T R X V X X V V S V T V X V U X T T V S V S V V U W R R K R X T R U W R R T V W ",
+"V +.V +.+.V V @.V V V #.#.V $.+.+.+.V +.V $.V V @.$.$.@.$.$.%.$.+.%.&.@.@.+.$.V V @.V V +.%.*.#.&.@.@.+.@.V @.$.@.$.&.V $.&.@.@.+.%.#.+.V V $.V +.%.&.@.V V #.%.V @.#.V @.@.V #.+.&.@.@.V V +.V V V V V @.V @.V +.&.@.V V &.V %.V $.+.+.%.V *.%.#.$.V +.$.+.#.#.@.+.V V V V &.@.V V #.&.&.%.%.+.=.-.;.>.-.,.'.$.$.V &.$.+.V V &.V +.+.$.%.V $.%.$.+.#.&.$.$.V $.V $.+.V @.@.@.%.&.&.@.V V $.$.V @.%.$.+.$.V +.%.+.V V &.V &.%.$.*.V @.V &.V %.V &.V @.#.$.@.@.+.&.V V V V @.#.V @.#.@.V +.V V V +.#.$.$.V +.#.$.@.$.V $.V +.V +.@.$.@.&.#.V #.#.V V +.@.$.V V @.#.V @.V $.V *.V +.+.V V &.#.V V V $.@.V $.+.$.V V $.$.V @.+.$.%.V &.@.+.V V V #.V %.&.#.V @.+.V ",
+"*.*.*.*.*.).*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.!.*.*.*.*.*.*.*.*.*.*.~.*.*.*.*.*.!.*.~.*.*.*.*.*.*.~.*.*.~.*.*.~.*.*.!.).~.*.*.*.*.*.).*.~.*.~.*.*.*.*.*.*.*.*.*.*.!.*.*.*.*.*.*.*.*.~.*.*.*.!.*.*.*.).~.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.!.*.*.*.*.{.*.*.].^.^.^.^./.(.*.*.*.).*.*.*.*.).*.*.*.*.!.*.*.*.*.*.*.~.).*.~.*.*.).*.*._.*.*.*.!.!.*.*.*.*.!.*.*.*.*.*.~.*.*.*.~.*.*.*.*.*.*.*.*.*.~.*.*.*.*.*.~.*.*.*.*.*.*.*.).*.*.*.*.*.*.*.~.~.*.*.*.~.*.*.).:.).*.*.*.*.*.*.*.).*.*.*.*.*.*.*.*.!.*.*.).*.*.*.*.*.*.*.*.*.*.*.~.~.*.*.*.*.*.*.*.*.).*.*.*.*.*.*.*.).!.*.*.).*.*.*.*.~.*.*.).*.*.~.*.*.*.*.*.*.*.*.*.*.*.*.",
+"<.<.<.<.<.<.<._.<.<.<.<.<.<.{.<.<.<.<.<.<.<.<.:.:.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.{.<.<.<.<.<.:.<.<.:.<.<.<.<.<.<.<.<.<.<.<.<.:.<.<.<.<.<.<.<.<.<.<.:.{.<.<.<.:.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.{.{.<.<.<.<.:.<.<.<.<.<.<.:.<.<.<.<.<.<.<.<.<.<.<.<.<.[.}.}.}.}.}.|.<.<.<.<._.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.:.<.<.<.<.<.<._.<.<.<.{.<.<.<.<.<.<.<._.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.{.<.:.<.<.<.<.<.:.<.<.<.<.<.<.<.<.<.<._.<.{.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.{.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.:.",
+"1.2.1.1.2.3.3.1.3.2.1.1.1.1.2.2.3.3.1.1.4.4.1.2.2.2.5.6.4.4.3.1.5.1.3.1.1.1.4.1.1.1.3.5.1.1.1.2.1.1.3.1.2.2.1.1.4.6.1.5.2.2.1.2.4.1.3.3.3.1.2.2.1.7.5.3.1.4.4.7.1.1.1.1.1.2.4.1.1.4.7.1.3.2.2.1.1.1.3.1.1.2.1.1.1.1.4.1.3.1.1.1.2.1.7.3.1.2.1.1.1.7.1.1.1.1.3.3.1.1.1.1.2.1.1.1.1.4.3.3.1.1.1.1.8.9.9.9.9.9.0.5.1.1.1.1.1.1.1.4.2.1.1.6.1.2.1.1.1.1.1.1.3.2.1.1.3.1.1.1.2.4.4.1.2.1.1.1.4.1.1.3.4.1.1.1.3.6.1.1.1.1.1.1.4.2.3.1.1.1.1.1.3.2.1.1.1.3.3.2.1.1.1.1.2.1.3.3.2.6.1.1.1.5.3.1.1.3.2.1.3.1.4.1.1.7.1.1.4.1.3.4.1.1.2.1.1.1.5.1.6.3.1.5.2.1.1.1.1.4.2.1.1.1.3.1.2.2.4.1.1.1.3.1.1.1.4.5.1.1.4.1.2.1.2.1.1.3.3.1.1.1.4.2.1.4.7.4.4.1.3.1.4.3.1.3.1.1.2.1.",
+"a.b.c.d.b.a.e.b.f.b.b.b.f.f.f.f.e.e.e.a.e.c.e.f.g.d.c.c.d.a.b.b.d.b.1.c.d.e.c.1.f.d.1.e.b.e.b.a.b.b.f.e.e.b.d.b.b.d.b.b.e.e.e.g.f.c.e.e.e.b.b.d.b.e.f.b.g.f.f.b.d.c.c.b.d.e.e.a.a.d.g.e.b.g.d.e.g.1.b.b.f.f.d.e.1.e.d.b.a.d.g.b.d.c.f.d.b.e.a.d.b.g.b.b.d.a.d.d.d.d.b.d.d.f.g.b.b.b.a.C k z s r h.i.i.i.i.i.j.q x x k V a.d.e.e.b.b.e.e.e.f.b.f.c.a.a.e.g.g.f.e.f.f.f.1.e.g.d.c.f.g.g.g.1.a.f.a.g.b.e.b.c.f.f.e.c.b.a.d.g.b.d.d.g.b.g.d.b.1.e.b.a.e.g.b.b.g.b.d.g.d.f.1.b.g.b.f.g.a.g.d.a.c.f.g.1.b.d.a.c.c.e.b.a.b.c.g.b.f.c.b.b.b.f.f.b.e.d.e.d.c.g.g.d.a.b.b.b.b.f.d.b.g.g.f.d.a.a.d.e.e.b.c.f.f.1.f.e.b.f.b.1.b.d.b.d.c.b.f.d.f.b.e.g.f.f.f.c.f.d.c.f.e.c.f.",
+"b.k.l.m.n.n.o.p.m.l.k.b.m.m.m.m.m.l.o.q.b.n.k.n.m.m.p.k.n.b.o.o.m.n.p.n.b.p.b.l.b.o.p.b.m.m.o.n.l.o.m.o.n.q.m.m.b.n.o.b.l.o.o.b.k.q.o.o.o.n.k.o.b.p.k.k.m.b.p.l.q.n.m.b.k.p.q.n.k.k.q.b.b.b.o.o.n.b.l.n.p.l.p.b.o.o.p.m.p.o.l.b.n.k.m.n.o.k.p.o.p.q.b.b.l.m.q.b.k.q.m.b.p.o.p.m.k.k.l.r.s.t.t.t.i.i.i.u.i.v.w.t.t.t.}.x.p.o.b.b.o.k.q.p.o.n.b.b.k.l.k.n.p.m.b.m.b.b.p.p.b.q.b.m.n.l.k.m.o.n.l.n.o.o.n.o.n.l.n.k.p.k.o.b.q.p.p.b.o.o.p.n.m.q.k.o.o.l.o.l.b.q.n.q.k.p.q.l.q.k.k.o.l.k.k.b.b.n.q.l.o.b.k.k.m.b.b.m.k.m.m.k.n.k.l.b.o.k.p.n.b.k.o.p.m.p.o.l.n.l.b.b.b.k.k.b.k.b.o.m.b.b.b.o.p.o.b.m.o.o.q.q.m.b.k.q.l.k.p.o.o.o.b.m.b.b.m.b.b.l.b.b.m.n.b.o.m.o.o.b.",
+"y.z.y.A.B.y.q.B.B.z.C.z.z.D.q.B.B.B.E.q.D.y.E.D.z.C.D.q.q.z.z.A.D.D.B.A.q.z.q.D.B.z.q.A.y.B.q.z.y.q.B.q.A.z.D.q.q.E.B.y.z.B.q.q.q.q.B.q.q.z.B.q.B.B.A.D.q.A.q.q.z.z.z.q.z.E.q.q.z.A.z.A.A.D.q.q.q.q.E.E.q.A.C.A.q.D.y.A.y.D.D.E.E.q.D.y.q.y.q.D.q.y.q.C.E.q.y.q.z.y.D.y.z.D.A.B.B.C.q.B.F.t.t.t.t.t.t.t.t.t.t.t.t.t.m C.y.q.B.D.B.D.A.C.y.q.q.B.y.B.q.q.q.D.q.z.q.y.z.z.q.B.B.y.A.q.D.q.A.B.D.C.q.q.y.A.D.q.C.D.B.A.B.B.B.z.D.C.D.z.z.B.z.q.z.B.q.E.z.z.y.q.q.B.C.A.z.y.A.q.B.z.z.B.B.D.B.E.q.q.q.D.C.z.q.z.D.B.q.E.A.q.q.q.D.q.q.D.A.E.D.E.A.A.B.B.E.C.z.D.q.q.A.y.y.y.E.D.q.A.A.D.B.z.q.z.B.z.E.q.B.q.q.z.A.q.E.B.A.q.D.E.C.B.q.q.B.z.z.C.E.q.q.E.B.A.E.z.y.E.",
+"C.C.G.H.I.G.H.C.H.C.C.C.G.H.J.H.I.I.H.C.H.H.K.C.K.L.J.C.I.J.H.G.J.H.L.H.K.C.H.C.K.L.C.L.C.K.I.K.H.C.K.M.K.H.H.I.G.C.K.C.K.I.H.C.J.C.C.I.K.C.L.L.C.C.C.C.J.C.I.G.C.H.I.J.K.K.J.K.K.C.C.K.G.H.L.G.C.C.C.I.M.K.C.M.I.G.I.K.C.K.C.H.I.C.L.H.C.I.H.M.H.C.L.C.M.C.K.C.H.L.M.I.K.K.C.M.M.I.J.G.I.N.O.t.P.Q.O.R.P.9.t.t.Q.S.H.M.C.L.C.L.K.M.J.G.C.C.H.J.H.C.I.H.K.K.M.C.I.L.C.J.H.I.I.C.J.K.C.G.H.C.C.C.C.K.C.C.G.K.J.K.K.L.C.J.C.J.I.I.H.H.H.C.I.K.C.L.C.C.H.I.C.G.C.C.G.C.L.K.H.H.I.H.C.C.K.H.H.K.C.C.K.L.C.H.M.L.C.C.I.J.C.K.L.H.H.L.K.J.G.K.H.G.H.M.G.H.H.C.K.M.H.H.H.H.C.I.H.I.M.H.H.C.J.G.C.C.K.C.C.K.I.I.C.L.K.I.L.C.H.C.I.C.C.G.K.I.G.C.H.H.C.C.L.C.J.C.K.H.H.C.",
+"T.U.V.W.M.M.X.M.U.Y.U.M.M.M.T.U.M.V.Y.V.U.M.U.T.M.V.Y.U.M.M.M.M.M.T.M.M.U.X.T.M.T.M.Y.Y.M.U.M.V.T.M.V.U.M.V.U.M.M.W.M.M.M.U.T.T.V.T.U.U.X.M.T.U.Y.M.Y.W.M.U.Z.M.T.Y.M.Z.M.U.T.U.U.V.M.M.M.X.W.M.Z.Z.`.Z. +.+.+.+.+.+Z..+++X.T.M.W.M.M.M.V.W.M.V.M.T.T.W.M.M.M.T.M.V.U.T.M.M.V.V.M.T.Y.M.V.g.(.9.9.9.9.9.9.9.9.9.'.o.T.M.W.M.M.V.M.M.U.M.T.U.T.M.Y.U.M.U.U.X.T.T.U.M.Y.M.U.V.M.M.M.T.M.M.M.M.V.T.T.V.M.M.V.T.M.W.M.U.M.Y.Y.M.X.W.W.Y.M.M.U.V.Y.M.M.Z.M.V.V.M.U.V.M.M.T.T.Y.V.W.W.V.W.W.M.T.T.X.T.M.Y.Y.V.Z.U.T.U.V.T.U.M.U.Y.U.V.V.M.Y.V.U.V.U.M.V.W.M.X.M.V.U.M.W.T.U.T.T.M.T.U.M.Z.Y.M.U.M.V.V.U.V.M.U.M.M.@+V.M.V.U.V.V.U.U.T.U.U.T.U.M.M.M.M.U.M.U.U.X.M.X.U.",
+"Z.Z.Z.Z.Z.Z.#+Z. +Z. + +Z.Z.Z.Z. +Z.Z.Z.#+Z.Z.#+Z.Z. +Z. +Z.Z.Z.Z.Z. + +Z.Z.Z.Z. +Z.#+Z.Z.Z.#+#+Z.Z.Z. +Z.Z.`. +#+Z.Z.Z.`.Z.Z.#+ +Z.Z.#+Z.Z. +Z.#+Z.#+Z.#+Z.++#+.+++ +Z.#+.+Z.Z.Z.#+Z. +Z.Z.Z.`.$+$+%+&+&+&+*+*+*+&+&+&+&+=+%+%+-+;+;+Z.Z. +Z.Z.Z..+ + + +Z.>+Z.Z. +.+ +Z.Z.Z.Z.>+Z. +Z.Z.#+W j.9.,+9.9.9.9.9.'+7.#+Z..+#+ +.+Z.Z.Z.Z. +Z.#+.+Z.Z. +Z.#+Z. +.+Z.#+Z.Z.Z. +.+Z.Z.Z.>+Z.#+Z.Z.#+Z.Z.Z.Z.Z.Z.Z..+Z.++Z.Z.Z. +Z.++ +.+#+Z. +Z.`.Z.Z.Z. +.+Z.Z.#+Z.Z.Z.#+Z.Z.Z.Z.Z.Z.Z.++#+ + +#+Z.Z.Z.>+Z.Z.#+ +Z.Z.#+Z.Z.Z..+Z.Z.Z.#+Z.>+Z. +Z..+Z.Z.Z.Z.Z.Z.Z.Z.Z..+Z.Z.#+Z.#+#+ +#+Z. +#+.+.+Z.Z.#+Z..+Z.Z.Z. + + +Z.Z..+Z.Z..+Z.Z.Z..+Z.Z.Z.Z.Z.Z.Z.Z.++ +Z.>+Z.",
+";+;+$+;+;+;+;+;+;+;+;+;+;+)+;+;+;+;+$+$+;+)+;+;+$+;+$+;+;+$+;+;+$+;+;+;+;+;+;+;+;+;+)+;+;+;+;+;+;+;+;+;+;+;+;+)+;+;+;+;+;+-+$+-+;+;+)+;+;+;+;+;+;+$+$+;+!+;+;+;+;+;+;+;+$+;+;+;+;+)+;+;+;+)+;+~+%+{+*+]+^+^+/+/+(+/+/+/+_+^+]+:+]+<+*+[+&+&+%+%+}+%+%+;+;+-+;+;+-+;+;+;+;+;+;+$+;+;+$+;+-+;+;+& |+s.s.s.s.s.^.< ;+;+;+$+;+;+;+;+;+;+;+;+-+;+;+$+-+;+-+;+-+;+;+-+;+;+-+;+-+;+;+;+;+$+;+;+;+;+)+;+;+;+;+;+;+;+;+;+;+;+;+;+$+;+;+;+;+;+;+;+-+;+;+;+;+;+)+;+;+$+;+;+;+;+;+;+;+-+)+;+;+-+;+;+)+;+)+;+;+;+;+-+;+;+;+;+;+$+;+;+;+;+;+;+)+)+;+;+;+;+)+;+;+;+-+;+;+;+;+;+;+;+;+)+$+;+;+;+;+;+;+;+;+;+)+;+;+;+-+;+;+;+)+;+;+-+;+;+;+;+)+;+;+;+;+;+-+;+-+;+)+;+;+;+;+;+;+;+",
+"%+%+%+%+%+%+%+%+}+%+%+%+%+}+%+%+%+%+%+%+%+%+}+1+%+%+~+%+%+%+}+%+%+%+%+%+1+=+=+%+%+%+1+%+}+%+%+%+%+%+~+%+%+%+%+~+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+}+%+=+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+=+&+&+*+]+2+/+]+~+%+]+3+4+4+5+4+3+3+3+6+6+6+/+/+^+^+]+]+*+*+&+&+&+%+%+%+7+%+=+=+%+%+%+%+%+%+%+%+%+~+%+8+}.s.s.s.9+0 %+%+=+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+~+~+%+%+%+%+%+%+%+%+~+%+%+~+%+%+%+%+%+%+%+%+%+=+%+%+%+%+%+%+%+=+%+%+%+~+%+%+}+%+~+%+%+%+%+%+%+%+%+}+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+}+%+}+%+7+%+%+%+%+%+%+%+%+%+%+%+%+%+%+0+%+%+}+%+~+%+}+%+%+%+%+%+%+%+%+%+}+%+%+%+%+%+%+}+%+%+%+%+%+%+%+%+%+%+}+%+%+%+",
+"&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+1+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+7+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+*+*+]+^+6+]+a+b+c+d+e+4+/+/+/+6+6+4+f+g+g+g+f+4+4+3+3+6+/+/+^+]+]+*+*+*+*+&+&+&+&+&+&+&+&+&+&+&+&+&+%+h+}.}.}.i+&+&+&+&+&+1+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+4+j+k+l+m+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+",
+"{+*+*+*+*+*+*+{+*+*+*+*+*+*+*+*+*+*+*+*+n+*+*+*+*+*+*+*+*+*+*+*+*+*+{+*+*+*+*+*+*+n+{+o+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+o+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+p+]+q+6+3+^+r+s+t+u+v+w+x+y+z+A+B+C+D+f+4+3+f+g+D+E+E+g+g+f+4+3+6+6+/+^+^+]+]+*+*+*+*+*+*+*+{+*+*+*+*+%+Q }.F+*+*+{+*+*+*+*+*+*+*+*+*+*+*+*+{+*+*+*+*+*+n+*+*+*+*+*+n+*+*+*+*+*+*+*+*+n+*+*+*+*+*+*+*+*+{+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+5+A+G+H+I+J+K+L+M+{+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+o+*+*+*+*+*+*+*+*+*+*+*+{+*+{+{+*+o+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+o+*+*+*+*+*+{+*+{+*+*+{+*+*+*+*+*+*+*+*+*+*+*+*+{+*+*+*+",
+"]+]+]+N+O+]+]+]+P+:+]+]+]+]+]+]+]+]+]+]+]+]+]+P+P+]+]+]+]+]+]+p+]+]+]+p+]+Q+]+]+Q+]+R+]+P+]+]+]+]+]+]+]+p+]+]+]+]+Q+]+]+]+S+]+]+]+]+]+p+:+T+]+]+T+]+S+p+:+]+T+]+]+]+]+]+]+]+]+]+]+]+]+P+]+]+^+^+6+3+f+U+V+A+w+G+u+W+X+Y+Z+Z+Z+X+w+X+L+y+A+`+ @.@E+g+E+E+D++@U+g+f+4+3+3+6+/+^+^+^+]+]+Q+]+]+]+T+]+]+1.S.C.]+]+]+]+]+]+S+]+T+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+Q+]+]+]+]+@@]+<+]+]+]+]+]+P+]+]+]+:+]+]+]+]+Q+<+p+]+]+Q+]+]+]+S+]+Q+]+]+]+#@Z+s+J+H+I+J+I+I+H+$@%@&@6+]+]+]+P+]+]+]+]+]+]+]+p+]+]+]+]+]+]+]+]+p+]+]+:+T+Q+]+T+]+p+]+P+T+]+]+p+P+S+Q+]+N+T+]+S+]+S+]+]+*@]+]+]+]+S+]+]+:+]+:+]+p+:+]+]+]+P+]+]+]+P+]+]+]+]+p+]+]+]+S+P+Q+P+]+p+]+]+p+]+S+]+]+]+",
+"^+^+=@^+^+^+^+^+-@^+^+^+^+^+^+^+^+^+^+^+_+^+^+^+^+^+^+^+2+^+^+^+^+^+^+^+^+^+^+^+^+^+=@^+^+^+2+^+^+;@^+^+^+2+^+=@^+^+^+^+^+^+^+^+^+^+;@^+^+^+^+-@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+2+^+^+^+^+^+^+>@,@3+4+f+E+'@f+)@!@a+~@X+{@w+Y+L+Z+w+]@b+^@k+k+/@w+L+(@_@:@<@E+D+[@e+'@}@E+f+4+4+|@1@/+/+;@^+^+2@3@4@5@6@7@8@9@0@a@2+_+^+^+^+_+^+^+^+^+^+^+^+^+^+^+b@=@^+^+^+^+^+=@^+^+^+^+^+^+^+^+^+^+2+;@^+^+^+^+^+^+=@b@^+;@2+b@^+^+2+^+^+2+^+=@^+^+^+3+c@k+I+d@J+J+e@J+J+I+I+I+f@g@H+h@i@:@^+^+_+^+^+b@;@^+^+^+^+^+^+b@^+^+2+^+^+^+^+2+^+^+^+^+^+^+^+^+^+^+_+^+^+^+^+^+^+^+^+^+^+^+^+^+b@^+^+^+;@^+^+2+:+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+;@^+@@^+^+;@^+^+=@^+^+^+^+^+^+^+",
+"j@/+j@/+/+/+/+/+/+(+/+/+/+/+k@/+/+q+q+/+(+/+/+/+q+/+/+,@l@/+/+(+/+;@/+/+/+,@/+/+l@/+/+/+/+/+/+/+/+/+(+j@/+/+/+/+j@>@/+/+/+/+/+m@/+/+(+/+/+/+(+>@(+/+/+j@/+/+l@>@/+m@j@/+/+/+m@/+j@/+/+/+/+,@6+6+3+4+f+E+'@e+m+m+e+'@<@n@j+(@x+X+o@{@{@^@v+G+u+t+t+t+u+p@^@Z+q@r@m+[@D+D+'@'@D+g+f+4+3+s@t@u@v@w@x@y@z@A@B@C@D@E@F@G@(+/+/+/+m@/+/+,@/+/+k@q+j@/+(+/+/+/+/+m@/+/+/+/+/+/+>@(+/+/+(+>@/+j@/+j@/+/+/+/+/+m@,@/+/+/+/+,@/+/+m@/+(+/+/+H@I@J@K@J+d@d@d@J+J+J+J+I+I+I+H+H+H+g@L@M@b+N@/+/+/+/+/+/+>@/+/+/+/+/+/+/+/+/+>@/+j@/+/+/+/+/+/+/+/+/+/+/+/+>@/+q+/+/+/+O@/+/+/+/+/+/+j@/+m@/+/+>@q+/+/+/+/+(+/+(+>@/+/+/+/+/+/+j@l@/+/+/+/+/+,@/+/+/+,@/+/+/+/+/+/+j@/+,@,@(+",
+"6+6+6+6+6+6+6+6+6+6+6+P@6+6+6+1@6+6+6+6+6+P@6+6+6+6+6+6+1@1@6+6+Q@R@6+P@1@6+1@P@6+S@6+P@6+1@P@6+6+P@6+P@6+6+1@6+6+6+6+6+6+1@6+6+6+6+1@R@6+6+1@6+6+6+6+6+6+6+6+6+6+6+6+P@1@1@1@6+R@6+6+6+6+6+T@3+4+U@f+E+V@'@ @W@X@:@:@:@Y@Y@Y@n@c@Z@`@b+]@b+/@G+ #.#+#s+h@+#+# #v+X+@#B+m+D+ @##'@H@.@$#%#&#*#=#-#;#>#,#'#)#!#~#{#]#^#6+6+6+6+6+6+|@6+6+1@6+6+6+P@6+6+6+6+6+6+6+6+1@6+S@P@P@6+6+R@6+6+6+6+6+R@Q@6+6+6+6+6+6+6+6+6+6+6+1@6+6+1@/#(#_#J+J+d@d@d@d@d@J+J+J+J+I+I+I+H+H+H+g@g@L@L@:#u+<#'@6+6+6+6+6+6+6+R@6+1@6+6+6+6+6+1@6+6+6+1@6+6+6+6+6+Q@6+6+6+Q@6+6+6+6+6+1@6+6+6+6+6+R@6+6+6+6+P@6+6+6+6+6+6+6+R@6+P@6+6+6+6+6+P@6+6+6+6+6+R@6+6+[#1@6+6+6+S@6+6+6+6+6+6+6+6+",
+"3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+}#}#3+3+|#3+3+3+3+3+|#3+3+|#3+3+3+3+3+3+}#3+3+3+3+3+3+3+|#3+3+|#|#|#3+3+3+3+3+3+3+3+3+3+3+3+T@3+3+3+3+}#3+3+3+3+3+3+3+3+}#|#|#3+3+4+4+f+g+E+D+1#e+ @m+Y@2#:@M+n@3#3#3#M+M+4#5#L+]@b+W+k+u+J@+#s+6#7#7#6#s+8#9#c+0#W@'@e+a#b#c#d#e#f#g#S@3+|#h#i#j#k#l#m#n#o#3+3+3+|#3+3+3+3+3+}#T@3+}#|#3+3+3+3+3+T@|#}#|#|#3+|#3+3+3+3+3+}#3+3+3+|#3+}#T@p#3+T@3+q#3+3+3+3+3+r#s#J+J+J+d@d@d@d@d@d@J+J+J+J+J+I+I+I+H+H+H+g@g@g@L@L@_#L@.#t#u#}#3+3+}#3+3+3+3+3+3+}#3+3+3+3+3+3+3+3+3+3+3+}#T@3+}#T@3+|#3+3+3+3+3+3+3+3+3+T@3+}#3+3+3+3+}#3+3+3+3+3+}#|#3+3+3+3+3+3+3+3+3+3+3+3+3+T@3+T@3+3+3+3+3+|#3+3+3+3+3+3+3+}#",
+"4+v#4+4+5+4+v#4+4+4+4+4+v#4+4+4+4+4+4+V+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+w#4+4+4+4+4+5+4+4+4+v#4+4+4+4+4+4+4+4+4+4+5+4+4+4+4+5+4+4+4+4+4+4+4+4+4+4+4+4+4+4+x#4+4+4+4+4+5+4+4+w#4+4+4+4+4+4+4+4+4+4+f+y#g+E+E+D+z#e+ @ @m+Y@!@:@M+n@A#`+B+B+B#`+d+z+X+W+^@k+t+C#.#D#6#7#K+h@+#.#s#b+E#F#G#H#I#J#H@D+E+K#f+4+4+4+4+L#M#N#O#P#Q#4+4+4+4+4+4+4+v#4+4+4+4+4+4+v#4+4+v#4+4+v#4+5+5+w#v#4+4+4+4+4+w#4+v#4+v#4+4+4+4+4+4+4+4+4+4+4+x+R#d@S#d@d@d@d@d@d@d@d@J+J+J+J+J+I+I+I+H+H+H+g@g@g@L@g@g@T#s+U#V# @4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+5+4+4+4+4+4+4+4+v#4+4+4+4+v#4+4+4+4+w#4+4+4+4+4+4+4+4+4+5+4+4+4+4+4+4+4+w#4+v#4+4+4+4+4+x#4+4+4+5+5+4+4+4+4+5+4+4+w#4+4+v#4+4+",
+"y#f+f+f+f+f+U@f+f+f+U@f+f+f+W#f+f+f+U@f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+y#U@f+f+f+U@f+y#y#W#f+f+y#f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+W#f+f+f+f+f+W#f+f+f+f+f+f+U@f+f+)@y#f+f+f+f+f+f+f+f+f+f+f+U@f+f+f+g+g+E+E+D+D+[@e+e+ @ @m+Y@!@:@M+n@3#`+B+4#X#4#4#a+L+b+v+k+t+.#s+D#Y#D#D#K+Y#s+Z#`# $.$+$##Y@@$e+D+E+g+g+f+f+f+x##$$$%$&$*$f+f+f+f+f+W#f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+=$f+W#f+f+y#f+f+f+f+f+f+f+f+f+f+f+f+c@g@6#H+d@K@d@d@d@d@d@d@d@J+J+J+J+J+I+I+I+H+H+H+g@g@H+L@T#s+J@8#-$o@;$g+U@f+f+f+f+f+W#f+f+f+U@f+f+f+f+f+f+f+f+f+y#f+f+f+f+f+U@f+f+U@f+f+f+f+f+f+f+f+y#f+f+f+f+f+f+U@f+U@f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+",
+"g+g+g+g+>$g+g+g+g+g+g+,$g+g+,$g+K#g+g+g+g+g+,$g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+,$g+g+g+g+g+g+g+K#g+g+,$g+g+K#,$K#g+g+,$g+g+g+g+g+g+g+g+'$g+g+'$g+,$'$g+g+,$g+g+g+'$g+g+g+g+g+g+g+g+g+g+g+g+,$g+g+g+g+g+E+E+}@D+V@D+D+'@e+e+ @m+Y@!@:@)$n@!$B+0#X#~$_@_@a+t#/@k+8#s+K+Y#D#Y#Y#Y#{$]$^$/$($X+_$Y@m+!@:$<$[$}$E+E+g+K#g+|$%$1$2$'$g+g+g+g+'$g+g+g+g+g+g+g+g+g+K#g+g+g+g+g+g+g+g+g+g+,$g+'$g+g+g+g+K#g+g+,$K#g+K#g+g+g+,$m+:#K+6#6#T#g@J+d@d@d@d@d@d@J+J+J+J+J+I+I+I+H+H+I+3$L@7#D#C#8#W+o@o@4$5$t#g+g+g+g+g+'$g+g+g+g+g+g+g+6$K#g+g+g+g+g+g+g+g+K#g+g+g+g+K#,$,$g+g+K#K#6$g+g+g+g+g+g+g+,$K#g+g+g+,$g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+,$g+g+'$g+'$,$g+g+g+g+g+g+g+",
+"U+E+7$7$U+E+E+}@U+E+E+U+E+E+E+E+8$E+E+E+E+U+E+9$E+E+}@E+E+E+E+U+9$E+E+E+E+7$E+E+U+E+}@}@E+}@E+U+U+E+E+E+E+7$}@E+E+E+7$E+E+7$E+E+E+E+E+E+E+E+E+U+D+}@}@7$E+E+E+E+}@E+7$7$}@7$E+E+E+7$E+E+}@E+E+E+E+E+7$E+E+E+E+D+0$D+D+'@'@e+e+a$m+Y@!@:@b$3#r@B+N@d+j+A+c$r#X+d$G+h@K+D#Y#Y#Y#e$f$g$h$6#h@s+{@i$j$k$l$m$n$o$p$V@E+E+q$r$s$t$u$E+E+E+}@E+E+E+7$E+E+9$E+E+7$E+E+E+E+E+E+U+U+U+U+E+E+E+E+7$7$+@}@E+E+E+E+E+E+E+E+E+E+E+ #6#K+7#7#v$7#:#g@I+d@d@d@d@J+J+J+J+J+I+I+I+I+H+L@w$D#x$G+^@{@{@{@]@]@y$z$A$}@7$E+E+E+}@E+E+E+E+U+E+E+U+E+E+E+}@E+E+E+E+U+E+E+E+E+E+E+E+E+E+E+7$U+8$E+E+E+E+E+E+E+7$U+E+E+7$7$E+E+E++@E+E+E+U+E+E+E+E+U+E+}@E+E+U+E+E+E+E+E+E+E+E+E+E+E+E+E+",
+"B$V@D+D+C$D+V@D+C$D+D$C$D+D+C$0$'@D+D+D+D$D+C$H@B$D+V@D+D+V@D+D+H@D+D+D+D+D+D+0$D+D+D+D+V@D+C$D+C$0$D+D+V@0$V@D$D+0$D+V@E$'@1#'@1#E$'@E$D+V@H@H@V@D+V@D+D+D+D+D+D+D+D+D+C$V@D+D+D+0$D+D+V@C$D+V@D$D+V@D+B$D+0$D+B$C$D+F$E$'@'@e+<@ @m+m+2#:@M+3#`+B+G$c@H$r#I$J$K$s#.#K+Y#Y#Y#L$M$N$O$7#:#7#P$Q$R$S$T$U$V$W$X$Y$'@D+D+Z$`$ %.%D+D+D+0$0$0$D+C$D+D$V@C$C$0$H@D+D+0$D+C$0$0$D+D+D+D+D+C$H@0$D+V@D+D+D+V@V@0$V@V@0$C$4$L@+%6#6#6#7#7#:#:#_#g@I+J+J+J+J+J+J+J+I+@%H+_#6#s+C##%K${@]@b+]@]@]@b+b+{@u+3#B$0$D+D+V@0$0$D+D+D+D+D+0$D+D+C$V@0$V@V@D+C$0$V@V@0$D+0$D+D+D+B$V@0$V@C$0$D+D+D+D+D+D+V@V@D+D+D+D+D+D+C$D+D+D+D$C$D+0$0$C$0$D+C$D+D$D+C$D+B$D$D+D+0$C$D+D+D+D+",
+"'@E$[@1#1#$%1#E$'@F$'@z#F$E$E$F$z#z#$%1#'@z#z#E$[@[@1#F$$%F$E$[@1#$%[@z#[@'@1#[@[@'@F$'@F$'@F$'@E$[@$%E$E$$%'@F$e+$%[@%% @####&%*%=%a$ @-%;%e+1#'@'@'@'@$%e+'@F$F$$%[@[@z#'@F$$%'@1#F$[@'@1#'@'@z#$%'@$%E$F$z#1#'@[@'@'@1#'@[@ @>%,%*% @m+C+'%)%!%r@B+~%{%]%r#5#r+^%s#h@D#Y#/%(%_%:%<%7#T#T#[%}%|%1%2%3%4%5%6%7%8%>%z#9%b#0%a%'@'@z#'@'@e+'@z#E$E$[@'@[@E$1#1#E$E$1#e+z#z#1#[@[@'@'@'@'@F$1#1#$%'@[@1#1#'@1#F$'@r#d@b%<%K+K+6#7#7#:#c%_#_#L@g@I+I+J+d%I+d@e%:#+%.#G+v+]@]@(#b+b+b+b+b+b+W+W+W+f%#%<@z#$%F$1#E$F$1#[@z#F$z#[@F$$%'@1#E$'@'@e+1#[@1#F$'@[@$%[@F$F$z#$%'@e+e+z#F$'@'@[@$%[@z#[@'@[@'@z#[@E$E$'@F$'@'@'@e+1#'@[@$%[@z#F$z#$%$%F$[@E$[@1#1#[@F$e+[@e+",
+"-%-%%%>%-%<@,%;%,%%%;%-%<@%%>%e+-%,%e+-%>%;%<@<@e+ @ @-%-%<@e+%%;% @e+,%-%<@-%>%%%-%<@-%<@;%-%,%%%<@-%%%%%-%-%e+ @-%g%&%Y@#@h%2#Y@C+i%j%h%#@##m+ @ @-%;%-% @>%,%%%%% @<@%%-%%%,%,%>%<@,%<@e+<@,%e+-% @,%>% @e+-%,%e+e+;%;%;%%%-%>% @-%##m+h%@$k%l%M+m%!$n%d+o%r#5#p%y+G+D#D#q%r%s%t%6#7#T#u%v%w%x%y%W+Z+z%A%B%C%D%g%<@E%F%G%H%<@;%;%-%e+-%>%;%,%;%<@;%,% @%%%%%% @ @<@,%;%,%>%<@%% @,%e+-%;%%% @ @>%e+e+;%,%e+B+I+Y#I%K+K+K+6#7#7#:#_#_#_#L@L@g@J%H+d%d@K%s#L%C#M%^@{@]@W+W+b+W+b+b+W+W+W+^@^@W+#%N%;% @<@ @;%,%%%-% @ @>%e+ @e+%% @>%,%%%e+,%-%e+,% @%%;%,% @;%e+,%e+-% @-%-%,%<@,% @,%%%>%e+-%,%<@>%,%<@%%;%%%e+>%-%>%-%-%-%,%e+ @;%%%%%%%;%<@>%>% @e+e+%%;%,%",
+"m+g%m+ @=%m+g%m+ @m+a$*%g%m+a$=%=%a$*%m+=% @m+g%g%g%a$m+g%a$*%=%m+m+m+m+m+m+*%=%*%=%m+m+g%m+##=%a$g%*%&%&%m+ @*% @&%#@u#O%l%P%Q%)%W@m+R%P%O%k%S%u###a$&%m+ @*%g%a$*%##a$=% @&% @=%m+g%a$m+*%*%&%m+a$ @&%g%*%g%g%=%m+=%g%a$m+&%m+&%a$a$ @a$j%W@k%i%:@)%3#r@T%X#U%V%5#Z@z+^@s+W%X%Y%Z%6#7#T#`% &.&+&@&H+v+Y+#&$&%&&&!@j%*%*&=&-&##&%*%g%=%=%a$a$*%&%g%*%&%a$ @&%*% @*%*% @&%=%m+g%##&%*%*%=%m+####=%m+*%m+*%=%=%6#7#D#K+K+K+;&6#7#T#:#:#_#_#L@g@g@J%H+H+>&,&1+'&)&.#+#t+k+K$b+W+W+W+W+W+^@^@/@v+v+^@J@!&*%*%##*%a$g%&%&%=%m+m+*%g%m+a$*%m+*%m+*%a$g%m+*%m+m+m+&%m+##&%=%##=%*%=%##m+*%a$m+a$g%m+g%g%m+=%=%a$a$g%g%*%a$a$=%g%m+=%&%##g%## @m+&%&%&%####=%g%m+&%g% @",
+"u#W@W@u#W@j%m+m+Y@h%j%h%j%Y@h%W@h%j%Y@Y@@$@$h%Y@#@Y@W@h%Y@@$#@Y@h%#@Y@j%@$h%Y@j%u#Y@#@@$Y@Y@Y@m+W@j%m+#@#@#@Y@j%Y@O%i%:@!@M+Q%~&T##%p%j%{&]&^&/&i%k%Y@#@u#u#j%h%u#u#Y@Y@@$@$h%j%W@h%Y@h%u#Y@h%@$Y@j%j%#@#@j%u#W@u##@u#h%Y@@$@$h%W@j%Y@h%Y@@$Y@O%i%Q%X@P%(&_&:&X#<&A+[&J$Z@}&|&1&2&3&6#T#T#4&5&6&7&K@8&I+Z+9&0&a&b&R%'%Y@c&H#d&#@j%@$@$h%W@@$u#h%Y@h%j%#@Y@#@Y@#@@$u#Y@@$j%Y@#@Y@u#@$j%j%Y@h%u#j%Y@j%j%Y@m+u#e&I+D#K+f&K+K+K+6#7#g&:#:#_#_#L@g@g@J%H+H+h&i&&+j&.#k&+#h@+#)&G+b+^@^@^@^@/@/@/@v+k+k+v+h@l&#@Y@@$j%Y@#@#@W@Y@@$@$#@#@j%W@#@W@Y@Y@h%u#u#j%@$j%Y@Y@W@W@#@h%#@h%Y@@$h%@$h%h%h%#@j%Y@#@h%h%j%#@h%#@#@Y@j%u#W@h%h%j%#@h%Y@#@Y@u#h%#@#@j%W@h%j%u#j%u#Y@Y@",
+"m&!@Y@!@C+k%C+!@!@S%S%C+m&O%i%O%C+!@O%C+O%S%!@!@S%!@O%!@!@k%O%!@k%k%!@S%!@!@!@!@C+!@!@k%k%S%!@Y@Y@!@!@m&!@C+C+C+Y@2#:@M+{&3#n@B+n&H+L@o@n@o&p&o&)%)%:@l%S%C+S%C+!@O%S%i%C+!@k%!@Y@!@!@k%!@C+!@O%k%k%O%C+!@O%!@C+Y@!@O%!@m&!@O%O%!@O%i%C+C+i%i%O%m&!@l%P%]&m%q&B#r&_@A+s&(@t&u&v&w&x&6#T#T#y&z&A&B&C&Y#x+X#D&E&F&G&n@M+H&I&J&K&C+!@Y@!@C+i%!@!@C+O%C+k%!@!@S%O%C+!@!@!@m&O%O%!@C+O%m&O%S%!@k%i%!@!@!@k%!@m&L&M&D#K+f&K+Y#Y#N&6#T#:#:#:#O&L@P&g@g@f@H+H+C&N%m@D#.#.#.#+#.#Q&h@d$b+^@/@/@/@v+k+k+d$d$k+8#J@{&!@!@O%i%!@Y@!@!@m&O%O%!@!@!@C+!@O%k%C+C+C+k%C+!@O%O%k%O%!@C+k%!@i%O%S%k%i%m&k%!@!@O%k%!@!@C+m&k%m&m&k%k%S%m&O%S%m&!@O%Y@k%C+i%!@O%k%!@!@k%O%O%C+C+k%C+",
+"l%l%Q%:@:@:@X@Q%X@:@:@Q%X@/&:@:@'%:@:@/&/&:@:@:@2#Q%'%!@!@:@/&:@:@:@:@:@l%:@X@l%Q%:@:@X@Q%:@/&l%:@/&:@:@:@:@X@'%:@R&M+b$!%r@B+S&T&Z+d@C&#%!$3#`+U&o&V&P%l%:@Q%:@X@'%/&:@l%/&!@:@'%'%:@:@X@X@/&l%!@Q%/&:@Q%/&/&:@Q%:@Q%:@:@Q%l%/&:@2#:@Q%2#Q%!@/&/&'%Q%R&R%n@3#W&B+X#X&V%Y&Z&`& *.*+*6#T#T#@*#*$*%*&*D+{+**=*-*;*>*!$b$,*'*)*!*:@/&l%l%:@/&/&:@X@Q%:@:@/&:@'%2#/&l%2#'%Q%!@X@:@l%/&:@X@:@:@Q%:@:@:@:@l%/&U%@&K+I%K+f&Y#Y#Y#K+6#7#T#:#:#O&L@~*g@g@f@H+H+{*{@6+]*.#.#^*.#+#.#+#C#^@/@/@/*v+v+k+d$d$#%8#d$(*_*X@2#:@:@:@l%X@l%X@/&:@'%'%2#Q%l%:@:@:@l%l%:@/&l%/&Q%:@/&:@:@/&:@:@X@!@:@:@/&2#:@:@:@Q%2#l%/&l%2#/&:@Q%2#X@l%Q%2#l%Q%:@:@:@2#'%Q%/&/&:@'%:@/&'%:@Q%l%l%",
+"M+:*:@M+M+R&R&M+M+M+)%R&M+M+:*R&)%)%M+R&)%M+M+M+P%M+M+M+R&M+:*M+^&R&)%)%^&M+)%M+M+M+M+R%)%M+M+:*R&P%)%)%R&)%M+R&R&R%b$<*[*}*0#X#|*[*1*_#C&2*n%q&3*}*r@4*o&]&)%M+R&)%M+P%:*R&P%R%P%R&R&M+P%P%P%:@M+R%M+R&M+M+M+M+M+:@M+P%M+)%)%M+M+P%M+)%:*M+)%M+R&M+P%)%P%]&!%p&5*0#d+j+r+Z@6*7*8*9*0*T#L@H+a*b*c*d*e*f*g*h*i*j*k*U&_&l*m*n*o*P%)%^&)%)%)%P%M+M+^&^&R%M+)%R%:*M+P%)%R&R&M+)%M+)%M+M+M+M+M+M+)%M+M+^&P%p*H+T#Y#K+Y#Y#Y#D#Y#K+6#q*T#:#:#_#L@g@g@g@H+H+H+r*o@3+h@+#.#+#+#+#+#.#+#d$^@v+v+k+s*d$t*#%8#G+G+#%u*v*P%M+M+R&P%R%P%M+M+P%)%M+^&M+M+R%R%R&:*R&:*M+M+R&M+P%R&R&M+M+)%M+M+^&P%)%M+P%M+)%R&M+:*M+R&)%)%M+M+P%:*R&)%P%:@R&M+P%P%R&R&M+R&)%M+R&M+R&M+:*M+P%R%R%",
+"n@n@n@n@n@n@n@n@n@{&n@n@n@{&o&n@n@n@n@o&{&n@n@]&n@n@{&n@o&n@n@n@n@n@n@n@n@n@o&n@]&o&n@n@]&{&n@o&{&m%o&n@]&n@o&n@n@o&3#4*r@B+w*|*d+<&4#&@L@@&t+j+!$4#0#}*`+r@4*3#]&n@n@n@n@n@]&n@n@n@o&V&n@)$n@]&V&o&{&n@]&m%n@n@{&n@o&n@)$n@n@n@n@n@o&o&{&V&n@n@n@{&M+(&n@!%(&r@T&0#X#x*q@z+y+y*z*A*B*c% #r#C*D*E*F*G*H*I*J*K*L*z+r@M*N*O*P*Q*]&<*n@o&{&n@n@]&n@n@n@n@n@o&o&{&n@n@o&V&n@n@{&o&{&b$]&n@{&o&n@]&V&)$n@]&.#H+D#K+Y#R*Y#D#D#j&K+6#S*T#:#:#_#L@g@g@J%H+H+H+R#w+6++#h@+#+#+#+#+#+#h@t+/@k+k+d$d$#%#%8#8#G+G+s#G+T*U*n@]&{&]&n@n@)$n@n@]&{&{&b$n@o&n@n@]&o&n@o&]&)$n@n@{&n@o&]&n@n@]&n@n@n@n@o&n@n@]&n@n@n@n@o&n@n@n@V&n@o&o&n@n@n@n@n@m%n@]&n@n@{&n@n@n@n@{&n@o&n@n@o&",
+"3#4*3#3#3#3#3#3#3#3#3#4*3#!%(&3#3#3#3#3#3#3#(&!%3#(&3#3#!%3#3#3#3#V*4*3#3#3#3#3#!%4*U&3#3#3#3#3#3#3#<*3#3#!%3#3#3#3#r@r@W&B+0#r&_@c@c$d+(@@&R#h@Z&`+X#W*4#X*`+`+r@r@(&3#3#!%3#A#3#4*3#3#3#3#3#3#!%3#!%3#3#!%3#3#!%3#3#3#3#3#3#3#3#3#(&4*A#3#4*(&3#!%3#3#3#r@r@!$B+n%d+j+r#z+y+Y*Z*`* =.=/ +=6+@=#=$=%=&=*===-=W+j+0#;=>=,='=3#3#3#3#3#!%3#3#3#3#3#4*3#3#3#3#3#3#m%3#4*3#3#3#!%3#3#(&(&4*3#3#!%3#3#3#)=R#s+Y#D#D#D#D#D#!=~={=6#]=T#T#:#_#_#g@g@H+H+H+I+^=4$@@/=(=+#(=+#h@h@h@h@+#k+k+k+d$#%G+_=8#G+G+s#u+s#u+:=_@3#3#3#3#3#3#3#3#!%3#!%4*3#3#3#3#3#3#3#3#3#4*3#3#(&3#3#!%(&3#3#3#3#3#3#3#4*4*3#3#4*3#!%3#3#3#3#3#!%3#3#3#3#(&3#3#3#U&(&3#3#!%3#3#3#3#3#3#3#3#q&V*",
+"[*r@r@5*r@r@r@r@_&r@r@r@r@r@r@r@q&r@r@r@r@r@5*r@5*r@r@r@r@[*r@r@r@r@r@[*r@r@r@r@r@[*r@<=r@r@5*r@r@V*r@T&r@r@r@p&T&r@r@`+`+B+4#X#_@c@c$A+_@Y+[=C&:#o@c@}=_@d+X#4#0#T%`+`+`+`+r@r@r@r@W&r@!$r@r@r@[*r@r@r@r@W&r@[*r@r@r@r@W&r@r@r@r@[*r@r@r@r@r@r@r@`+|=}*X*B+3*4#X#l&j+A+5#z+Z@W+1=2=3=4=5=6=7=8=8=9=0=a=b=w+c=W+r&d=e=f=g=h=[*r@r@_&r@r@r@r@r@r@r@r@T&r@r@r@r@p&r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@6*h&]*Y#Y#D#D#u*i=s+D#Y#K+6#7#T#T#T#_#_#L@g@H+H+H+I+d@j==+t+h@+#h@+#k=h@h@h@s+s#l=#%G+z$v+d$s#G+s#s#u+u+s#m=n=:&r@r@r@o=r@r@r@r@r@r@_&T&r@r@p&r@r@[*r@r@r@o=p&r@W&p=r@5*r@r@5*r@r@p&r@r@r@r@r@r@[*r@r@r@r@r@r@r@r@r@r@r@r@[*r@r@5*r@5*r@r@r@p&r@r@r@_&[*r@r@5*",
+":&`+|=:&|=`+`+`+:&`+`+`+`+`+`+B#`+`+:&`+:&`+|=|=`+`+X*:&|=`+`+`+|=`+`+`+`+`+`+`+`+|=B#:&`+`+:&`+`+`+`+`+|=`+`+`+:&`+`+B#T%B+4#X#d+c@c$A+q=c@]@h&h&I+r=I@d+d+s=_@d+X#4#4#0#B+B+B+|=`+`+`+`+B#`+`+`+`+`+|=B#`+`+`+:&`+`+B#!$X*`+`+`+`+:&:&`+`+t=B+/#0#4#4#X#X#d+_@j+c$q@5#@#Z@#%M+u=v=w=x=y=z=A=B=C=D=E=F=G=H=o@I=J=K=L=M=N=`+`+`+`+:&`+`+|=:&`+`+`+`+`+|=`+`+`+|=`+:&`+`+`+`+`+`+`+`+`+|=`+`+`+|=A+R#Y#D#Y#u*O=s+P=s+s+D#!=K+w$7#7#T#T#_#Q=L@g@H+H+H+I+J+N%C.R=S=+#T=h@T=s+h@h@s+J@U=V=-$I@c$(@W=u+s#u+u+t+t+s#D#k+`+:&|=`+`+B#`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+:&|=`+`+`+`+`+`+B#`+|=B#`+:&`+|=`+`+`+`+`+`+`+`+S&`+`+`+|=`+|=`+`+`+:&`+:&`+`+`+`+`+`+`+`+`+",
+"B+B+3*B+B+B+B+B+B+B+B+/#T%B+B+t=t=B+B+B+B+B+B+B+B+B+B+B+T%B+B+B+B+B+B+/#B+B+T%B+B+B+B+B+B+B+B+T%B+t=B+B+B+3*B+t=3*B+/#B+0#0#4#4#d+_@j+A+r+X=A+/@Y=[=R#T#Z=Z&c@_@j+j+c@_@d+`=N@4#4#0# -0#0#B+B+B+t=B+B+T%B+T%B+B+B+B+B+t=T%w*B+B+t=/#B+0#0#.-4#4#X#d+_@c@c@j+A+a+r#5#z+z++-s#^+@-#-$-%-&-*-=---;->-,-'-)-!-~-{-]-^-/-(-_-t=T%B+T%t=B+:-/#t=t=T%t=B+B+t=B+t=B+/#T%B+B+B+B+B+B+T%B+B+B+B+T%/#B+B+~%$@T*s+D#D#s+s+<-P=s+s+D#Y#K+K+7#7#T#T#_#L@L@g@H+H+H+I+J+{@<.8#D#+#+#h@h@s+s+D#K+[-}-|-1-2-3-4-L+ #u+u+u+t+t+t+5-:#Y+B+B+B+B+B+B+/#B+:-B+B+B+B+/#B+B+T%B+B+B+B+B+B+B+B+T%B+B+T%B+B+B+3*B+B+T%B+B+B+t=B+B+B+B+B+B+t=B+T%B+:-t=t=B+B+3*B+B+B+B+B+/#w*B+B+B+B+B+B+B+",
+"0#0#0#6-0#.-0#0#0#0#0#7-.-0#4#.-0#0#0#0#0#0#.-0#0#0#0#6-.-0#0#0#0#6-.-0#.- -0#0#6-0#0#0#7-0# -0#6-0#6-0# -0#0#6-0#0#0#6-0#0#4#X#X#_@8-9-r#X=@#a+0-C&h&h&d@K+8#t#A+c@c$c$c$j+c@_@_@a-X#b-r&4#4#4#0# -6-0#0#.-0#0#0#0#0#.- -0#0#0#.-4#4#4#X#d+_@c@j+c$A+a+r#I$A+_$r+5#@#~@k+*+].c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-b*r-s-t-u-N@0#0#0#0#0#.-0#0#.-0#0#0#0#0#0# -0#0#0#0#0#0#0#.-0#0#.-.-.- -0#0#0#0#c@J@g@v-j&D#s+s+<-h@s+s+S=s+D#K+M@6#7#T#w-:#L@L@L@H+H+H+I+x-]@V d$D#h@k=h@h@s+!=.#/*y-z-A-B-C-D-E-X=F-C#u+t+t+t+ #t+C#g@G-0#0#n%0#0#.-0# -0#0#0#0#0#0#0#6-0#.-6-.-0#0#.- -6-.-0#0#0#.-0#0#6-0#0# -6-0# -.-0#0#0#6-0#6-.- -.-7-0#.-0#6-0#0#0# -0#0#0#n%0# -6-7-0#6-0#",
+"H-4#H-4#N@4#4#4#4#4#|*N@4#H-~%4#H-4#4#4#4#4#~%4#4#H-H-N@4#4#~%4#N@4#4#4#4#H-~%r&4#4#4#N@H-4#4#4#H-4#~%~%H-4#N@4#4#4#4#4#4#~%b-I-d+~$s=c$I$J-@#(@5#/@@&C&C&@&I+7#C#b+I@I$K-c$I$A+H$c$8-c@_@_@~&d+d+G$X#`=L-N@N@4#4#W*r&N@4#~%X#b-G$d+M-<&c@j+c$A+a+r+N-I$O-P-/@b+Y+X+]@b+<.Q--.&%R-S-T-U-V-W-X-Y-Z-`- ;.;+;@;#;$;%;&;X#~%N@4#~%~%4#4#H-4#r&4#~%4#4#4#4#4#4#4#4#4#4#~%4#4#4#4#H-4#4#4#4#4#4#~%/@L@.#Y#D#D#s+s+h@h@h@h@s+D#Y#Y#6#6#7#*;w-_#_#L@~*g@H+H+I+J+]@f ^@=;h@h@s+-;D#_*;;>;,;';);!;~;{;];^;G-#% #t+t+t+C#.#u+/@^@4#4#N@4#N@4#W*4#N@4#H-4#4#4#4#H-N@4#~%4#4#N@H-4#4#4#~%4#4#4#4#4#|*4#~%4#~%4#4#4#4#~%4#4#~%4#4#~%4#H-W*N@~%4#4#4#4#N@N@4#~%4#~%N@4#4#4#4#4#",
+"X#X#X#G$X#`=X#b-L-L-X#X#L-I-X#L-X#X#X#`=X#I-/;X#X#X#X#G$L-X#b-X#L-`=X#X#X#X#X#b-X#G$L-/;X#I-X#X#X#X#X#b-L-X#`=L-X#X#`=b-`=X#L-b-(;_@c@j+A+r#@#Z@Z&_;:;d@@&R#R#R#J+_#D#t+<;[;};A+A+a+a+a+H$A+1*]%|;c@s=_@_@_@~&a-l&d+d+d+d+d+_@1;2;j+j+A+a+r#N-3;5#4;z+W+d$j+D 5;N.^+3#E+Q-6;++7;8;9;0;a;b;c;d;e;f;g;h;i;j;k;l;m;j+_@d+/;L-L-X#`=L-X#G$G$`=b-X#b-X#b-X#b-X#X#`=`=X#X#I-X#X#`=`=b-X#`=X#L-b-X#n;7# # #^*D#s+s+h@h@h@h@s+D#Y#o;K+6#6#7#g&_#_#L@~*g@g@H+I+J+]@; ]@N&[-h@<-s+Y#o@p;q;r;s;t;u;v;w;x;y;z;I@A; # #.#t+]@I@c+B;X#L-X#X#X#X#b-X#X#L-L-L-L-/;`=X#X#`=b-X#X#X#`=X#`=X#X#G$X#b-X#X#`=`=X#X#`=/;X#X#X#X#X#X#X#X#X#X#L-X#X#`=X#L-L-/;X#`=X#`=b-`=X#b-I-X#X#X#X#",
+"d+d+d+(;d+~&d+a-d+d+d+a-d+d+d+(;(;d+a-~&~&l&~&d+C;d+d+~&a-d+(;a-~&(;a-~&d+C;d+a-a-d+d+~&C;d+_@d+~&(;a-d+d+(;a-a-(;l&d+~&d+d+a-d+_@c@x*D;c$E;F;_;G;H;Z&I;g@R#R#K@d@K@J+L@6#h@ #k+J;K;3;_$a+r#N-r+q=a+A+A+c$K-j+j+j+j+c@D;j+|;K-L;H$q@O-5#@#@#r+@#M;d$t#& N;O;P;Q;W*r+_@%+R;x S;A=T;U;V;W;X;c;Y;Z;`; >.>+>@>a+r+A+8-_@_@d+~&(;~&(;(;a-d+~&~&~&~&d+a-(;a-(;d+d+a-d+a-a-l&(;d+(;d+~&~&d+(;d+M-~&o@#>[=L@.#t+$>+#-;h@h@h@h@D#D#f&K+6#6#7#T#:#_#_#L@g@g@g@%>J+b+4 X+6#+#h@h@s+=;&>*>C-=>->;>>>,>'>)>!>~>I@J;{>s#{@~@t#k+]>u+_@M-d+d+d+(;d+(;d+~&(;~&~&a-d+l&d+d+(;~&d+(;l&~&M-d+M-d+a-d+d+C;C;~&a-d+d+d+(;(;d+d+d+a-a-a-C;d+d+C;d+a-a-d+(;M-~&C;~&C;~&l&d+a-(;a-d+l&(;",
+"_@_@_@_@^>c@_@1;~$_@1;~${%X&1;_@_@~$~$_@X&<&~$1;X&1;_@~${%^>1;^>_@c@~$1;_@_@^>~$_@^>~$_@_@^>^>_@_@1;_@~$^>^>^>_@~$~$<&^>1;_@~$_@~$X&c@j+1*I$/>@#(>Z&_>:><>7#@&K@K@d@J+J+I+H+:#K+h@ #s#k+X+[>@#O-4;U*[&J-N-r+}>r#_$a+a+I$I$|>/>r+1>2>G-G-5#t&/@3>g+9.4>5>6>7>8>9>0>T#v+5#r+i&a>U;b>B=c;X;c;c;C=c>d>e>& X+5#1>r#9-|;o%_@_@_@{%X&^>_@~$^>X&~$_@^>^><&~$_@1;^>1;<&^>_@_@1;1;_@_@1;1;_@_@~$^><&<&r#+#f>g>h>I+s+u+ #+#v-h@v-D#D#Y#Y#K+6#i>T#:#:#j>L@g@g@g@H+k>b+l>L+v$m>h@h@h@~=n>o>p>q>r>s>t>u>v>w>x>Y#:;Z@~@~@Y+#%6#K@e%y>c@{%_@~$_@_@_@_@^>_@~$_@_@_@{%~$_@_@{%~$^>^>~${%{%_@_@^>~$~$_@_@^>~$1;^><&^>1;^>^>1;X&<&~$_@1;{%~$<&~$<&~$1;_@_@_@1;1;<&c@_@X&_@1;_@~$_@1;",
+"o%x*j+2;j+c@2;x*s=U%2;o%j+U%x*z>x*U%j+c@x*j+j+o%z>x*c@s=s=U%s=c@x*U%U%2;o%U%U%o%o%z>j+x*c@j+x*U%U%o%x*j+j+z>j+s=j+j+2;2;2;j+o%U%o%x*|;A$A>V%|>@#B>Z&i@x+C>Y+h@R#d@K@J+J+I+I+I+H+L@T#D#+# #t+s#_*]@Z+D>E>3;N-F;X=G-F>9&G>F>H>E>(@Z@F>K;w+8#Z@i+I>J>K>L>M>N>O>P>Q>R>:=d$w+s#Q&S>T>c;D=Y;U>C=0=V>W>X>8 c=Y>Z>F;r#`>D;j+z>2;o%2;c@o%j+s=j+U%2;o%c@U%c@x*j+z>s=j+o%x*j+j+x*x*o%j+U%o%c@j+U%o%2;U%r+o@ ,.,+,.,h>d@D# #@,T=D#D#D#Y#K+6#6#T#T#:#:#_#L@L@P&g@H+#,$,l>L+7#n;s+s+s+%,&,o>*,=,-,;,>,,,',),!,b+I@I@X+s#6#d@R#J+)&+-A+c@z>j+j+z>j+x*o%s=x*U%U%j+U%o%U%2;o%U%c@c@s=z>c@U%U%s=o%c@x*o%s=o%j+U%x*z>j+x*z>z>U%j+s=j+z>U%z>U%o%2;2;o%U%c@U%j+U%s=x*x*U%s=o%o%o%j+x*",
+"]%]%A$&@|;A$j+c$|;&@D;c$c$&@c$c$8-c$c$&@]%]%8-]%A$c$|;]%c$&@A$&@c$&@c$D;]%c$|;c$c$&@A$c$]%c$c$D;A$8-c$A$]%c$A$|;c$c$D;]%]%c$c$c$A$&@c$A$~,{,q@/>X=Z@Z&I@P-],L+u+d@d@d@J+I+I+I+H+H+H+L@_#7#D#+# #s#8##%d$v+b+Z+^,Z&z+9&H>Y>(@E#Z&/,G+w+Z.(,_,:,a <,[,e-T;},|,1,2,3,W=o@+#Y=4,3>5,6,7,X;c;8,9,0,& $%b+a,Z@G>};b,V%~,&@]%D;A$D;j+c$c$c$c$c$D;c$j+&@A$]%D;c$&@|;]%]%c$c$c$c$A$c$|;]%&@c$8-A$|;]%b,P-^*@&c,.,+,.,c,@&T#.#J@s+6#6#6#6#7#T#T#:#:#_#L@L@L@g@H+J+W+l>x+7#(=s+s+s+K+d,e,f,g,h,i,j,k,l,m,n,y+o, #7#x-@&p,H+6#q,E>r,&@8-c$c$c$]%]%]%c$D;]%A$c$c$8-c$&@D;&@&@A$c$&@A$]%&@A$8-j+|;A$c$]%c$A$A$c$c$A$j+]%&@&@8-]%&@8-c$A$A$A$D;D;j+|;j+A$&@A$8-|;&@D;c$&@|;&@&@",
+"r,A+A+~,A+A+A+c$A+A>c$L;A+A>~,A>K-r,K-~,r,~,~,A+A+A+L;~,A+A>A+K-A+A+A+1*K-r,A>r,~,r,1*A+A+K-A+A+K-A+r,A>~,1*c$A>r,A>A+r,A>K-~,A+A+A+A+K-s,H$b,r+s&F>(>c+t,u,Y+Y+/*L@d@J+J+I+I+I+H+H+g@L@L@:#7#6#Y#s+J@u+#%k+v+#%d$k+v,b+]@W+_*d$4#w,x,y,z,A,B,C,D,E,F,G,E,H,I,J,K,{@v+L,@&K@L%M,N,O,P,Q,R,S,8 ^,T,B>Z&Z@p%/>E;{,A>A>A+K-r,A+~,~,r,A+~,A+A+A>A+~,r,A>~,~,A>A>A+A+L;A+A+r,A+A+A>A+~,1*~,A+A+~,a+y+W+ #7#C&h>U,g>g>U,[=L@s++#Y#7#T#T#:#:#_#_#_#_#_#P&g@H+J+,&V,L+T#T=s+D#D#{=W,t,X,Y,Z,`, '.'+'@'^;A;O&d@d@#,I+_#+##%Y+p%K-L;~,A>~,r,~,A+~,A>r,~,~,r,r,r,~,A+r,K-A+L;A+A+A>A+L;1*~,L;1*r,~,A>~,K-1*r,A+L;1*r,A+A>A>A+A+A+~,r,r,r,r,A+A+A+r,L;~,1*A>A+A+K-K-~,A+A+L;",
+"V%H$a+s,a+a+V%a+a+a+9-`>`>H$a+V%a+9-H$H$V%`>a+`>V%a+a+s,`>{,`>V%a+H$a+s,a+{,a+A+V%a+`>`>a+H$a+V%{,`>a+a+a+V%a+s,a+a+s,A+a+V%a+s,s,H$a+`>{,9-I$4;s&Y&G>G;y+~@#'$'z;%'K+K@J+J+I+I+H+H+g@g@L@L@_#:#7#K+Y#D#s++# #u+8#W+w+Y+L+Z& @M &'*'='-';'e->'E,F,,'G,S-P>'')'!'~'z;d$&>g@J+%,{']'^'/'('4 '@k+I@t&_'(>Z>5#r+_$`>s,a+a+a+a+a+a+`>s,`>s,a+a+V%a+a+a+{,V%`>a+9-a+H$`>9-9-s,H$V%`>`>s,s,{,a+{,`>V%5#:'b+<'C#T#@&h>#>['}'.,|'J+w$s+K+:#L@L@1'_#_#_#_#L@g@H+d@,&r.Z+T#h@D#D#D#6#s#`@D#2'3'4'5'6'7'+#_#K@d@H+J+L@+#u+v+8'(@_$a+s,9-s,s,H$s,a+a+s,a+{,A+s,`>`>s,s,`>V%a+{,A+a+V%`>A+{,a+V%s,`>V%s,s,{,s,`>s,a+`>V%{,A+a+`>H$`>a+s,9-s,a+a+H$9-`>`>s,a+H$H$s,a+`>a+`>s,s,",
+"r#I$E;r#a+I$r#I$E;_$r#b,r#I$I$q@r#r#q@<#q@E;b,r#b,E;E;r#q@q@r#b,E;b,r#r#I$<#q@r#I$b,r#r#b,r#q@<#b,q@_$<#_$_$b,r#r#b,b,I$_$b,q@I$E;I$r#q@E;I$r#|>};J-@#Z@t&[>[;L+9'i&0'a'J+I+I+I+H+H+H+g@g@g@L@_#_#:#6#Y#s+h@h@h@.# #8#/@t#X#g+k l>b'c'd'e'f'P>g'|,E,h'i']'j'k'l'c=v+%'{@J@J+~*{@m'n'o'U c=b+p'c+y+E#Z@3;};/>|>q@r#E;q@r#b,<#r#r#b,I$r#q@<#r#r#r#I$_$b,a+q@r#q@r#b,r#b,_$r#a+r#q@_$I$E;E;b,E;q@<#F;K;<>W+G+A;q*@&Y=c,.,g>['q'r'_#f&K+:#g@f@g@L@L@s'g@H+d@W+t'L+:#<-D#R*Y#T#W=w+u'N%o@/@s#R*v'd@p,w'J+_#+#x'^;i&y'z+r+r#q@<#q@<#E;r#_$r#<#a+q@b,r#r#b,q@b,r#<#b,b,E;b,_$a+r#q@q@<#q@b,<#<#E;_$<#b,E;r#E;b,q@r#q@r#q@<#I$r#<#b,r#q@r#I$<#b,b,r#E;I$b,r#b,b,r#_$I$<#",
+"/>O-r+r+4;4;r+}>|>q=r+r+4;q=r+}>r+r+r+r+r+q=}>r+}>r#q=r+|>q=4;4;O-/>q=}>}>|>/>r+r+r+r+r#r+|>|>r+r+q=q=}>/>}>/>/>r#4;q=q=q=/>q=/>/>/>4;q=|>r+/>O-[&[&1>@#a,z'[>~@u,A'0'w+k+_#J+H+I+I+H+H+g@g@L@L@_#_#T#T#6#D#h@J@ #G+]@r#6+m+A+E;B'C'D'E'F'U;G'H'F'I'J'K'L'L'M'N'H=O'w+o,N%:#H+t+H>^+M-#%P'D>H;c+Z&Q'G>F;[&/>[&}>/>|>|>r+O-r+r+/>r+/>}>r+|>|>O-r+r#r#r+|>q=r+/>/>/>r#O-|>r+/>}>r#r+}>}>}>O-r+O-}>O-|>@#y+`@W+<'C#%,K@[=h>U,['['#>h&H+T#6#R'L@H+g@g@H+H+K@S'T'U':#s+Y#6#6#+#V'w+b+k+/=6#J+K@g@H+d%:#J@u+l=i&y>z+U*O-|>r#}>}>|>O-O-r+q=r+O-r+|>4;}>q=|>r+|>r+O-q=/>q=O-|>r+/>q=/>|>/>r+r#r+/>4;q=|>/>}>O-q=|>}>r#}>/>/>r+r+q=}>}>|>/>}>q=}>O-r+|>4;}>r+}>|>/>q=|>q=",
+"5#U*N-J-U*};[&U*5#r+J-5#s&5#};5#s&s&J-5#J-s&N-};U*5#s&U*[&};[&U*5#J-};U*N-[&s&};s&r+N-};r+U*r+[&U*5#};N-[&J-r+s&[&U*N-};[&r+s&[&};s&U*[&N-[&r+};s&p%Y&F>B>(@Z&:>~@W'X'T,{@b+v-J+H+H+H+H+g@g@L@L@L@_#_#_#T#6#K++#s#o@j+/ / r@y+v,Y'Z'`' )a;b>I'b;.)+)U>@)L'#)$)L+/*%)y$w+Y+&>:#:#^@d$j=y>;;_>[>+-4-Q'9&1>5#r+5#N-U*J-s&s&5#};};J-U*J-5#5#r+N-N-U*};J-r+};r+5#[&J-N-5#s&5#J-};s&[&U*U*J-J-r+r+[&[&[&N-r+5#F>D>Y+W+_=r=j&I+[=Y=&).,g>U,h>R#*)6#6#:#p,J+J+=)-)u I@g@K+i=;)/@>)k+u+(=1'J+I+L@H+I+N&J@W=/@X+t,(>5#U*r+J-};s&J-s&[&[&s&[&U*[&s&J-5#5#J-s&[&U*};};5#U*J-N-s&[&J-};s&[&};5#U*r+};5#s&N-};J-[&[&5#U*5#N-r+r+};r+r+N-r+J-N-};s&J-J-5#U*r+N-5#s&5#};s&s&5#U*",
+"3;F;@#Y&@#3;Y&Y&p%X=@#@#p%F;Y&Y&X=F;@#3;Y&@#F;F;@#Y&F;F;F;@#Y&F;@#p%p%5#F;Y&p%F;X=F;F;@#Y&Y&F;@#Y&@#X=X=3;Y&3;F;p%@#p%@#1>Y&@#@#F;F;X=5#F;5#@#Y&Y&p%9&Z>_;,)(>K;c+~@#'A'w+')N%))_#!)H+I+H+H+g@L@L@L@_#_#_#_#T#6#+#/@'@7 X#L+{@~)Z;{)])T>J,J'N,N,5,^)X;/)()_):)z;')Y+8'<)z;[)c=})')y>|)P'_>c+1)(@Z@a,z+9&@#F;Y&p%X=F;@#3;Y&@#1>p%p%X=@#@#Y&3;Y&@#X=X=p%Y&3;F;3;@#p%F;3;3;p%Y&3;F;@#F;Y&F;X=@#F;p%1>p%3;Y&Y&F;a,i@2)b+#% #3)g@C&4)q'U,g>U,8&[=J+T#K+:#5)C&d$6)(@Y#v+7)V'8)/=K+H+K@H+g@I+9)Y#/=0)O'a)_>(@@#5#p%Y&3;@#1>F;F;3;F;Y&3;3;F;p%X=p%@#F;p%p%X=1>1>@#@#p%@#5#3;1>3;3;@#Y&p%5#X=F;F;Y&3;@#Y&X=1>F;Y&p%1>p%5#X=@#1>X=X=Y&p%1>@#3;@#@#3;3;@#Y&F;p%5#p%3;p%@#@#",
+"2>9&G-9&@#2>2>F>2>z+2>2>G-z+G>G>G>G>F>F>@#9&Z>G-9&F>@#9&G>G>9&G>9&Z>@#F>9&@#F>9&@#F>G>Z>2>2>G>Z>Z>z+G-2>F>G>2>2>G-F>G>z+@#z+G-z+G>G>G-@#F>2>@#z+F>F>G>@#,)a,(>+-p'I@[;u,`@w+{@b);$M%_#J+H+H+H+g@g@L@L@_#_#_#_#:#:#Y#~@Z+8#8#c)d)C,c;.)0=0=X;7,0=0=N,0=e)f)g)I@d$t#2)u,h)L+L+h)y>x+C>[;I@c+_'i)Y>Z@a,2>G-G>G-F>Z>G-G>G>2>z+z+@#G-9&F>G>G-G>9&Z>z+G>G-2>2>F>9&G>2>Z>9&G-G>G>2>9&Z>G-F>2>z+2>z+9&@#G-F>Z>G-Z>Z>9&2>Z@j)u,q,d$U#.#*;K@[=|'#>k).,#>h>R#:#K+J+l=K Q']@b+u+~=L@e@d@f@~*K@l)s+C#<'m)%)~@i)Z@Z>@#z+z+@#9&9&G-G>2>G-9&@#F>F>2>G>Z>G-Z>G-Z>G-2>2>Z>9&9&G-z+G>z+G>z+Z>z+9&2>2>Z>G>G>Z>2>z+9&Z>G>z+9&Z>2>G>@#G-z+@#G-G>z+G-2>F>2>@#G-F>2>G-z+G-2>F>G-2>2>Z>z+",
+"H>a,H>Z@_;Z@B>Q'B>,)Z@_;Q'H>_;_;z+Q'Z@Z@Z@B>B>H>_;Z@B>Z@B>B>Z@Z@Z@Q'Z@Z@,)Z@z+a,Z@_;Q'Z@Z@Z@Z@B>Z@H>Z@,)Z@,),),)Z@H>B>H>_;,)H>H>Z@Z@B>B>Z@H>_;,)Z@a,Z@,)a,E>(@Z&n)i@:>~@t#v*o)T,]@7)p)+#g@J+g@H+g@g@L@L@_#_#_#_#_#_#g@:#Y#s#q)r)s)t)N,U>0=u)N,N,7,U>O,v)9,w)]@x)P-C>|)x+x+|):'L&L&t,:>c+y+t&Y>(>Y>Z@a,B>Q'H>Q'H>Z@H>B>B>Z@B>H>Z@Z@B>,)a,Z@Z@H>Z@Z@Z@z+H>Z@H>Z@B>H>Z@B>z+,)a,B>Z@Z@B>H>z+B>Z@_;B>H>,)Z@a,H>a,a,H>,)Z@(@y)z)o@k+u+.#s+I+C&h>h>U,g>g>A)h&I+<-,&B)J@:#C)D)H+g@#,g@7#3) ##%(#E)I@+-,)B>Z@H>H>,)Z@H>B>Z@Z@Z@Z@Z@B>Z@Z@B>a,B>Z@Z@Z@H>,)Q'H>H>H>H>,)B>,)_;H>Z@Z@,),)Q'Z@a,Z@Z@Z@Q'Z@,)Z@Z@a,B>B>Z@Z@Z@Q'Z@Z@,)B>H>B>Q'Z@z+Z@Z@_;Z@Z@Z@Z@Z@H>H>B>,)_;Z@Z@",
+"(>Y>Z@4-(>Y>4-E#(@J$(@(@E>E#(@(@Y>Y>(@E#E>(>4-E#Y>(@Y>(@(@E#J$E#J$Y>E#Y>(>Y>(@Y>(>Y>(@(@E>(@Z@(>(>(@E#(>(@4-(>Y>E#4-(@4-4-(@(@E#(@(>(@E#(@(>J$Y>(>(@(@Y>Z@E#Y>Z&Z&y+i@F)x+G)l+c=w+{@b+&>&,+#L@d@H+g@g@g@L@L@_#_#_#_#:#7#6#G+X+H)t)6,+)0=0=I)c;+)J)K)L)M)N)[>v+|)#'~@~@I@6*_>y>~@:>H;c+y+_'+-t&(>4-E#(@J$4-4-E#(@E>Z@E>Y>(@J$(>4-E#(@J$Y>J$J$Y>(>J$Z@E#(>Y>E#(@E#(>(@4-Z@E#E#(>J$E#E#(@(@J$(@Y>Y>(@(@Y>(@(@(@J$(@(@E#(@(>G;y)[;X+p)<'$>n;c%@&[=h>8&O)+,[=g@I+I+d@H+_#L@d@w'K+.#u+-)N%L+:>G;(>4-4-E#E#(@E#J$E#J$E#E>E#(>E#(@E#(>(>(@E>4-Y>Y>(@(@(@(>E>E#4-Y>4-E#J$(@(@(>E>J$(@Y>(@E>(@Y>(@(>(@E#(@(>Y>4-(@E#E>E>(@(>Y>E#(>E#(@(@(@(>(>E>(@(@E#E>4-(>4-Y>(>Y>E#(@E>",
+"i)n)Z&(@z'z'G;t&t&i)Z&Z&Z&+-n)Z&+-i)t&(@t&i)Z&Z&(@Z&Z&i)+-t&z'z'(@Z&Z&+-i)z'i)t&t&z't&z'i)i)z'+-(@Z&t&Z&G;z'Z&t&t&(@n)+-(@z'z'i)(@i)+-+-t&(@+-n)n)n)Z&+-z'Z&t&z'p'p'y+P)H;L&G)L+Y+X+T,]@W+b+Q)m=_#I+I+H+g@g@L@_#_#_#:#:#T#8#R)S)6,N,u)0=N,/)T)U)V)W)X)Y)s@G+P-L+x+^,I@Z)I@6*Z)6*I@c+c+`)`)y+(@t&Z&n)n)z'Z&Z&z'Z&Z&Z&z't&(@i)t&n)z't&Z&Z&Z&i)z'z'i)n)z'i)+-Z&i)Z&n)z'+-i)z't&G;+-z'+-Z&i)G;t&+-t&z'G;i)i)(@Z&G;t&n)z't&z'i)z'(@y+y'Y+(##% !.!D#I+h&[=Y=c,h>J+R'R'I+J+]>h@n&G+^@i&t#c++!z'Z&Z&z'Z&z't&z'(@Z&i)Z&i)z'Z&G;i)t&i)i)(@t&G;Z&+-t&+-i)n)(@+-(@i)n)z'i)(@i)t&G;t&z'z'Z&z'n)n)i)+-n)Z&Z&z'z'G;t&n)G;Z&+-n)Z&i)Z&t&t&i)i)z't&n)i)(@Z&t&t&Z&G;n)t&z't&Z&z't&",
+"1)+!p'Z&`)1)Z&_'Z&1)y++!Z&+!+!1)+!_'+!`)Z&1)K;p'Z&1)K;_'K;K;+!`)Z&Z&`)1)K;+!1)p'+!1)y+y+`)p'+!p'Z&Z&p'y+Z&y+p'K;K;y+K;p'Z&Z&Z&+!y+`)K;_'_'Z&p'+!p'p'+!Z&Z&Z&p'Z&Z&1)D>c+@!#!;;U'M;`@8'}&I;b+^@V'f%x'6#J+J+H+g@L@L@L@_#_#_#8#Y+e)N>$!%!&!K,*!=!-!;!>!{+i&p@Z+[)W'x+^,c+i@[>P)c+j)j)[>j)`)Z&1)p'Z&Z&`)`)+!p'p'+!Z&1)+!1)Z&+!K;`)_'y+Z&Z&Z&`)Z&K;Z&p'K;y+`)K;1)y+Z&1)y+p'_'1)K;p'`)1)p'`)Z&K;y+y+Z&p'Z&Z&Z&y+_'Z&+!Z&Z&Z&`)K;+!1)y+Z&y+#!l+')/*s#J@s+T#d@h&R#I+S#$@D#,!t+'!(#c=:'H;p'y++!+!Z&Z&`)+!Z&K;p'1)`)y+1)p'K;`)`)p'+!`)Z&Z&+!_'K;_'p'y+p'`)Z&Z&Z&Z&_'Z&1)p'K;Z&_'`)K;K;p'K;_'y+Z&y+_'`)1)y+`)_'y+`)+!1)K;_'_'K;p'Z&K;1)p'_'K;`)1)p'p'_'K;p'p'p'_'+!Z&y++!y+",
+"y)y+y+y)y)i@y+j)y+y+[>y)j)y+P)y+y+D>y+y+P)D>j)P)y+i@y)j)y+y+y+y+y)y+y+y)D>j)y)y+y)P)D>D>y)y+P)y+c+[>y)y+y+i@y+y+y)D>D>P)y)j)y)y+j)y+y+y)y+y+j)j)y+D>j)D>y)y+y)y)j)y)@!:>c+H;I@~@x+#'2)Y+x)j=I;b+W+W+9##%+#L@H+J+H+g@L@L@I+J@c+)!!!~!{!X)]!S.^!/!%'t+#%(!#'Z+W'x+~@c+c+H;Z)@!F)I@@!D>y+y+P)y+y+j)D>j)y)y+y)j)y+y+D>y+y)j)j)j)D>y+i@i@y+y+[>P)y+D>y+P)y)i@y+D>j)y+i@y+y+[>y)P)y+i@j)y+y+i@c+y+D>y+P)P)j)D>y)y+j)[>i@y+D>y+D>y+y+y+[>P)D>j)y't#c=b+d$t++#'&D#D#h@C#G+/@w+L+[;I@j)D>y+j)y+c+y+y+y+j)y+y+P)y+y)y+[>y+j)j)y+y+y+y)y+j)P)D>y+i@y+y+P)y)j)j)D>j)y+i@D>y+c+[>D>y)[>y+D>y+y+D>j)y+y+j)y+j)y+y+y+y+D>y+i@y+y+y+D>y+j)y)y)[>[>j)D>y)i@[>y+y+j)y+y+j)y+y+P)y+",
+"c+c+c+c+c+c+c+c+6*c+c+c+@!F)c+@!H;@!c+@!6*@!c+c+c+@!:>c+c+F)c+F)c+c+@!c+F)Z)@!c+F)H;c+c+c+c+c+c+c+c+c+H;H;F)@!c+I@c+@!c+c+F)c+c+F)H;c+Z)c+F)c+@!c+F)c+c+H;@!H;c+:>F)c+F)F)I@I@|)~@x+t#_!`@c=X+w+{@]@W+^@W+3>s#<-_#J+d@J+I+H+W+r+W#:!5 $%a) # #k+o@c=c=o)Y+^%h)x+I@I@I@:>@!@!c+:>c+H;c+c+c+c+H;F)c+H;H;H;@!c+c+F)c+@!c+c+c+c+6*F)I@c+c+c+@!H;c+c+c+H;F)c+c+H;c+@!F)F)c+c+c+c+F)@!:>c+c+F)c+:>@!c+F)c+c+@!c+@!c+H;@!6*:>c+H;H;c+H;c+H;c+:>c+c+I@x+Z+o@<!8#u+s#_*&>c=t#^,Z)c+c+:>c+c+6*c+@!:>c+c+c+c+c+c+F)H;H;H;c+F)F)c+c+c+c+:>c+c+c+c+c+c+:>H;c+c+c+@!c+@!c+c+H;c+c+c+c+F)@!H;F)F)c+c+H;c+Z)@!F)c+c+c+c+c+c+F)c+c+c+I@c+c+@!c+H;c+c+c+c+@!c+c+c+c+c+F)H;F)H;Z)c+",
+"I@I@I@I@I@I@y'y'I@I@y'I@I@y'I@y'#!I@I@I@I@#!I@I@I@I@I@I@I@I@I@I@I@I@I@I@y'I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@#!I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@_>I@I@I@[;~@~@x+x+h)L+Z+Y+c=X+w+{@]@W+^@^@^@^@#%t+h@T#I+J+7#J@ # ##%:;w+w+(!w+w+c=Y+L+L+x+~@~@~@I@I@I@I@#!I@I@I@I@I@I@I@#!y'I@I@I@I@I@I@I@I@I@I@I@I@#!I@I@I@I@I@I@I@I@I@#!I@I@I@I@I@I@I@I@y>#!I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@y>I@I@I@I@I@y'I@#!I@I@I@I@I@I@I@I@I@I@I@I@I@I@~@t#Y+c=c=L+x+~@#!I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@#!I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@y'I@y>I@I@y'I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@y>I@I@y>I@y'I@I@I@I@I@I@I@#!",
+"~@~@;;~@~@~@~@[;~@~@~@[!~@~@;;~@~@;;|)~@~@~@~@~@~@[;|)~@~@~@~@~@~@~@~@~@[;~@~@~@;;~@_>~@;;~@~@~@^,~@~@~@_>~@~@~@~@~@~@~@~@[;|)~@~@~@~@~@~@~@~@~@~@|)|)~@~@~@~@~@~@~@~@~@L&[;~@~@x+x+x+x+t#t#L+E)v*c=(!w+o@]@b+W+^@^@^@:;:;^@<!^@]@o,o@o@{@o@o@0'X+o)`@<>l+t#t#x+x+~@~@~@;;~@~@~@;;~@~@~@;;|)~@~@~@~@~@~@~@;;L&|)~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@|)~@[;[;~@~@;;~@~@~@~@~@~@~@~@~@~@~@t,~@~@~@~@~@|)~@t,~@~@|)~@~@[;~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@[;~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@[;|);;~@~@~@~@|)~@~@~@~@[;|);;~@[;|);;[;~@~@~@|)~@|);;~@[;|)~@~@[;~@~@~@~@|)~@~@~@~@~@~@~@|)~@~@|)~@~@~@~@~@~@~@|)L&~@~@|)~@[;~@_>~@~@~@~@~@~@~@~@~@|)~@~@|)~@[;~@[;[;~@[;~@~@",
+":'P'x+x+x+L&x+}!x+x+P'x+x+P'C>:'x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+P'x+L&x+|!L&x+1!x+x+x+x+x+x+L&P'x+x+x+x+L&x+x+x+x+x+x+x+x+L&x+x+x+x+x+x+x+x+x+x+x+L&x+x+x+z)x+x+x+x+:'L&x+x+x+x+x+}!x+t#U't#t#L+L+],Z+c=c=X+w+o@2!]@]@b+(#b+]@]@{@{@'){@0'y$X+X+c=<>v*[)L+L+t#t#t#x+x+x+x+x+x+x+x+:'P'x+:'x+C>x+x+x+x+x+x+x+x+x+x+P'x+x+:'L&x+x+x+x+x+x+P-x+L&x+x+:'x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+3!;;x+x+x+x+x+x+x+x+:'}!x+x+x+x+C>x+x+x+}!x+x+:'x+x+x+x+x+x+x+:'x+x+P-P'P'L&L&x+x+x+x+x+x+x+P'P':'x+x+x+x+P'x+x+x+x+x+x+:'x+x+P'4!x+:':'x+P-L&x+x+L&x+x+x+x+:'x+x+x+3!x+x+}!x+x+L&x+L&x+x+L&L&L&x+x+:'x+x+x+L&x+:'x+x+x+x+x+x+x+x+C>x+C>x+:'x+}!x+P'x+:'x+x+x+C>x+x+x+x+x+x+x+P-",
+"t#t#U't#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#G)t#t#z)z)t#t#t#t#t#t#U'G)t#t#t#t#t#t#t#t#t#U't#t#t#z)t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#z)t#t#G)t#t#t#z)t#t#t#t#U't#t#t#t#t#t#L+L+L+Z+Z+Y+Y+c=8'X+w+o@o@{@N%{@{@{@o@o@o@w+w+X+c=c=Y+Y+Z+],L+L+L+L+t#t#t#t#t#t#t#t#t#t#t#t#t#U't#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#U't#z)t#t#U't#t#t#t#t#t#t#t#z)t#t#t#t#t#U't#t#t#t#t#z)t#t#t#t#t#z)t#t#t#z)t#t#t#z)t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#U't#t#z)t#t#t#t#G)t#t#t#t#z)t#t#t#t#t#G)t#t#t#t#t#t#t#t#z)t#t#t#t#t#t#t#z)t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#C>t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#G)t#t#t#t#t#t#t#t#U'z)t#t#t#t#",
+"h)L+L+#'W'L+#'L+L+M;L+L+L+L+u,H=#'#'L+L+L+L+u,#'#'L+L+u,L+L+L+L+u,L+L+H=u,L+L+L+L+L+H=H=L+L+h)H=L+L+L+#'u,#'u,L+L+h)M;L+L+L+L+L+L+H=L+H=L+L+h)L+L+#'u,#'u,#'L+u,#'#'L+#'#'L+L+#'L+L+L+L+L+L+u,Z+2)[)],`@Y+`@$'A'X+9'w+w+w+y$i&w+w+X+a)A'c=Y+`@<>],],Z+Z+[)H=L+#'L+L+L+L+L+L+L+L+L+M;L+L+u,H=L+L+L+#'L+H=H=L+L+#'L+L+L+L+L+L+L+L+L+L+u,L+L+L+L+L+W'L+u,L+#'L+L+#'H=L+L+H=L+L+L+L+L+L+u,L+L+L+#'#'H=L+L+H=#'L+H=L+u,L+L+u,L+u,L+L+u,h)L+L+L+h)L+L+L+#'L+#'L+L+#'W'L+L+L+L+H=L+L+L+L+h)L+L+#'L+u,L+#'L+H=L+#'L+#'L+#'L+L+L+u,L+u,L+h)L+L+L+L+L+#'L+L+H=W'H=L+u,L+u,L+H=u,L+L+L+W'h)L+L+L+L+L+H=L+W'L+L+L+L+L+u,L+L+L+u,L+L+L+L+L+u,H=L+L+#'L+u,L+u,h)u,L+L+H=H=L+L+",
+"l+_!_!Z+[)],2)l+L+Z+_!Z+_!Z+_!L+Z+2)],],L+Z+L+[)],],2)_!],L+_!^%2)],^%Z+],2)[)[)Z+2)],_!_!_!Z+Z+_!_!L+],^%l+^%_!_!Z+],Z+L+_!l+^%^%_![)Z+Z+2)2)],2)l+_!l+],2)_!L+],l+L+^%^%L+2)^%_!_!Z+],^%^%2)^%],[)<)E)<><)c=$'z;%)9'5!5!5!R)R)R)c=X'X'Y+/,Y+`@Z+v*],Z+],Z+Z+2)^%Z+2)L+^%Z+2)],_!l+[)l+],[)],],Z+],Z+^%],Z+2)[)l+Z+Z+l+_!l+L+_!L+],[)_!Z+Z+l+Z+Z+l+2)[)2)^%_!L+_!l+2)Z+l+2)L+[)],Z+2)_!l+^%l+[)[)[)^%[)^%L+[)l+Z+],],^%2)Z+],l+[)[)Z+Z+L+L+^%2)2)Z+2)],],l+],L+^%L+2)],2)^%Z+l+[)2)Z+Z+[)2)L+],L+Z+^%L+Z+l+l+L+[)[)],Z+L+],^%^%],L+],[)L+],],L+^%_![)Z+2)],],^%^%Z+_!],L+[)],],],l+2)],^%],2)l+],[)^%],],_!^%],],^%Z+Z+[)2)Z+2)l+l+_!^%2)Z+],Z+Z+Z+[)Z+],_!],Z+",
+"<)/,<)Z+Z+E)Y+Z+Z+Z+Z+E)E)Z+<)Z+/,Z+v*Z+Z+Z+<)/,Z+Z+E)E)E)E)<)<)Z+Z+Z+/,Z+Z+Z+Z+<)<><)<)<>E)/,Z+Z+Z+E)Z+Z+<)E)<)E)Z+<>Z+Z+Z+Z+`@Z+E)<)<)Z+/,Z+<>/,<)Z+<)Z+/,Z+Z+/,Z+<)Z+E)Z+Z+Z+Z+E)E)/,Z+Z+Z+Z+E)`@Z+<)Z+X'Y+A'$'Y+%)Y+%)Y+8'X'Y+Y+A'%)%)8'/,<><)Z+Z+/,Z+Y+<>Z+Z+E)Z+Z+<)<)Z+Z+E)Z+E)Z+Z+v*Z+v*Z+/,Z+<)Z+Z+<)<)E)E)/,E)E)Z+<)/,Z+/,Z+Z+/,/,/,Z+Z+<)/,E)<)E)Z+/,Z+Z+Z+Z+Z+<)v*v*<)E)/,<>Z+<)E)Z+Z+Z+Z+Z+Z+Z+<)<)Z+/,/,Z+<)Z+Z+Z+`@/,/,/,<)Z+/,<>v*/,Z+Z+Z+`@E)E)Z+Z+Z+/,Z+Z+<>Z+Z+Z+`@Z+Z+/,Z+Z+<)<)<)Z+E)Z+Z+Z+/,E)Z+E)<)Z+Z+Z+Z+Z+Z+Z+Z+`@E)Z+Z+E)v*E)Z+<)/,Z+Z+Z+E)<)`@Y+Z+/,Z+E)/,Z+<>v*/,<>/,Z+<)E)/,Z+Z+<>Z+Z+Z+Z+<)Z+Z+<)Z+<)E)Z+v*Z+Z+Z+<)Z+Z+Z+Z+Z+Z+Z+",
+"Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+$'Y+Y+Y+$'Y+Y+X'Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+%)Y+Y+Y+Y+$'Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+%)Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+X'Y+Y+Y+$'Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+$'Y+Y+%)Y+Y+Y+Y+Y+Y+$'Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+$'Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+X'Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+%)X'Y+%)Y+Y+%)Y+Y+Y+Y+Y+Y+Y+$'Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+",
+"c=c=c=c=c=c=%)c=c=c=c=c=c=c=c=c=z;c=c=c=8'z;c=c=c=c=A'X'c=c=c=c=c=c=8'c=c=8'c=c=c=c=Y+c=c=A'z;c=c=c=c=A'c=c=8'8'c=c=c=c=c=c=c=c=c=c=8'c=c=c=$'c=c=c=c=A'c=c=c=8'c=c=c=8'c=z;z;c=c=z;c=c=c=A'c=A'c=c=c=c=c=$'8'c=c=A'8'c=c=c=c=8'%)c=c=c=z;c=A'c=c=z;z;c=c=c=z;c=c=c=c=c=c=A'8'c=8'c=c=c=c=c=8'c=c=c=c=c=c=A'A'c=A'c=z;A'c=c=c=c=c=c=c=c=c=c=A'c=c=c=A'8'8'c=c=c=c=A'c=c=c=c=z;8'c=z;z;z;c=A'c=c=c=c=c=c=c=c=c=c=8'c=A'c=c=z;c=A'c=c=z;8'c=c=c=c=c=c=6!c=c=c=c=c=X'c=A'c=c=c=c=c=c=c=c=A'c=c=c=c=c=z;c=c=z;c=c=A'c=c=c=z;c=z;$'c=c=c=c=c=c=z;8'8'c=c=8'c=c=c=c=A'8'c=c=c=c=8'c=c=c=c=z;c=c=A'A'c=c=A'$'c=c=8'c=c=z;z;%)c=c=c=c=c=c=c=c=c=8'c=c=c=8'c=c=c=c=c=z;c=",
+"x)5!9'x)5!9'9'5!c=X+5!9'9'R)5!a)9'a)o)x)9'9'X+5!X+X+x)X+5!R)5!X+5!5!a)a)9'x)o)9'5!9'5!5!c=a)x)X+x)o)a)a)9'X+a)X+5!9'5!o)9'X+9'R)X+X+9'x)X+X+a)x)X+X+a)X+x)9'a)x)x)5!a)a)X+X+5!5!X+9'R)c=X+X+X+5!o)o)5!9'R)a)c=o)X+X+X+5!5!X+o)X+9'9'X+x)a)a)5!9'9'X+9'5!a)o)X+9'5!X+c=x)X+5!X+a)X+5!5!a)X+9'X+R)a)a)X+5!a)9'X+X+a)a)9'a)o)9'9'5!a)5!5!5!a)a)a)c=9'o)X+X+a)9'x)9'5!X+o)5!o)9'5!X+9'X+5!5!x)X+9'R)X+5!a)X+a)5!X+R)X+c=X+9'9'X+5!5!X+5!X+9'9'X+o)5!9'9'5!9'9'5!5!R)X+X+a)X+x)9'R)X+o)o)X+X+5!o)a)x)X+a)a)x)9'X+X+X+x)9'a)X+X+R)a)5!a)X+R)o)R)5!X+a)9'5!X+9'9'o)c=X+R)o)x)5!5!X+a)X+x)a)R)X+X+a)X+9'o)a)a)R)X+x)X+9'9'R)X+5!X+x)a)X+X+o)X+x)a)X+o)9'9'9'R)c=c=X+5!X+",
+"x)5!9'x)5!9'9'5!c=X+5!9'9'R)5!a)9'a)o)x)9'9'X+5!X+X+x)X+5!R)5!X+5!5!a)a)9'x)o)9'5!9'5!5!c=a)x)X+x)o)a)a)9'X+a)X+5!9'5!o)9'X+9'R)X+X+9'x)X+X+a)x)X+X+a)X+x)9'a)x)x)5!a)a)X+X+5!5!X+9'R)c=X+X+X+5!o)o)5!9'R)a)c=o)X+X+X+5!5!X+o)X+9'9'X+x)a)a)5!9'9'X+9'5!a)o)X+9'5!X+c=x)X+5!X+a)X+5!5!a)X+9'X+R)a)a)X+5!a)9'X+X+a)a)9'a)o)9'9'5!a)5!5!5!a)a)a)c=9'o)X+X+a)9'x)9'5!X+o)5!o)9'5!X+9'X+5!5!x)X+9'R)X+5!a)X+a)5!X+R)X+c=X+9'9'X+5!5!X+5!X+9'9'X+o)5!9'9'5!9'9'5!5!R)X+X+a)X+x)9'R)X+o)o)X+X+5!o)a)x)X+a)a)x)9'X+X+X+x)9'a)X+X+R)a)5!a)X+R)o)R)5!X+a)9'5!X+9'9'o)c=X+R)o)x)5!5!X+a)X+x)a)R)X+X+a)X+9'o)a)a)R)X+x)X+9'9'R)X+5!X+x)a)X+X+o)X+x)a)X+o)9'9'9'R)c=c=X+5!X+"};
diff --git a/src/xpm_data/svp_autopick_next_channel.h b/src/xpm_data/svp_autopick_next_channel.h
new file mode 100644
index 0000000..b1830cb
--- /dev/null
+++ b/src/xpm_data/svp_autopick_next_channel.h
@@ -0,0 +1,498 @@
+/* XPM */
+static const char * svp_autopick_next_channel_xpm[] = {
+"64 64 431 2",
+" c None",
+". c #83E906",
+"+ c #84E906",
+"@ c #85E906",
+"# c #86E906",
+"$ c #82E906",
+"% c #111111",
+"& c #1B1B1B",
+"* c #82E806",
+"= c #1A1A1A",
+"- c #272727",
+"; c #333333",
+"> c #383838",
+", c #373737",
+"' c #2F2F2F",
+") c #252525",
+"! c #7FE206",
+"~ c #262626",
+"{ c #343434",
+"] c #3B3B3B",
+"^ c #3C3C3C",
+"/ c #303030",
+"( c #292929",
+"_ c #222222",
+": c #1C1C1C",
+"< c #6BBE07",
+"[ c #70C905",
+"} c #81E606",
+"| c #242424",
+"1 c #2A2A2A",
+"2 c #374922",
+"3 c #62A411",
+"4 c #2E3D1B",
+"5 c #181818",
+"6 c #7FE306",
+"7 c #313131",
+"8 c #50791E",
+"9 c #5A9215",
+"0 c #212121",
+"a c #354721",
+"b c #62A60F",
+"c c #3A5E0F",
+"d c #61A50E",
+"e c #4E761E",
+"f c #2C2C2C",
+"g c #232323",
+"h c #4C7816",
+"i c #558914",
+"j c #81E506",
+"k c #84E706",
+"l c #82E706",
+"m c #79D606",
+"n c #282828",
+"o c #5E9D12",
+"p c #416019",
+"q c #466C17",
+"r c #60A20E",
+"s c #80E406",
+"t c #7FDE06",
+"u c #1F1F1F",
+"v c #6BB40E",
+"w c #2F3C1E",
+"x c #202020",
+"y c #5F9F10",
+"z c #3D5A1A",
+"A c #83E406",
+"B c #73C509",
+"C c #272925",
+"D c #6FBC0C",
+"E c #22271D",
+"F c #161616",
+"G c #79D406",
+"H c #263911",
+"I c #3A5817",
+"J c #121212",
+"K c #3D3D3D",
+"L c #587930",
+"M c #7BDA06",
+"N c #090909",
+"O c #83E806",
+"P c #75CF05",
+"Q c #0D0D0D",
+"R c #406713",
+"S c #568E10",
+"T c #4B6827",
+"U c #5A5E55",
+"V c #688545",
+"W c #6DA627",
+"X c #558A14",
+"Y c #69BD05",
+"Z c #6BBD05",
+"` c #020202",
+" . c #3D3D3E",
+".. c #6E9440",
+"+. c #7ABA29",
+"@. c #7BC814",
+"#. c #67A712",
+"$. c #507622",
+"%. c #393939",
+"&. c #131313",
+"*. c #74CF05",
+"=. c #315605",
+"-. c #6F6F72",
+";. c #737372",
+">. c #5B5B4E",
+",. c #4E4D31",
+"'. c #504F2C",
+"). c #38371F",
+"!. c #2E2E2E",
+"~. c #050505",
+"{. c #80E306",
+"]. c #538813",
+"^. c #8EC54B",
+"/. c #969694",
+"(. c #64644E",
+"_. c #605F34",
+":. c #5C5B34",
+"<. c #545333",
+"[. c #49482C",
+"}. c #2F2E1D",
+"|. c #3B3B3C",
+"1. c #070707",
+"2. c #151515",
+"3. c #7ADB06",
+"4. c #6FC805",
+"5. c #99999A",
+"6. c #96C559",
+"7. c #76B11C",
+"8. c #718929",
+"9. c #6E6D39",
+"0. c #605F31",
+"a. c #494829",
+"b. c #3C3B22",
+"c. c #303023",
+"d. c #2F2F30",
+"e. c #191919",
+"f. c #171717",
+"g. c #50702A",
+"h. c #79B929",
+"i. c #536A38",
+"j. c #404040",
+"k. c #AEAEAE",
+"l. c #9F9FA0",
+"m. c #5B5A38",
+"n. c #78A620",
+"o. c #7BBD16",
+"p. c #72AD16",
+"q. c #63891A",
+"r. c #596922",
+"s. c #36361A",
+"t. c #43512F",
+"u. c #4E840F",
+"v. c #7DDF06",
+"w. c #80E206",
+"x. c #1D1D1D",
+"y. c #6C6C6E",
+"z. c #A0A0A3",
+"A. c #A7A7A6",
+"B. c #79A346",
+"C. c #699F26",
+"D. c #656765",
+"E. c #949495",
+"F. c #54544A",
+"G. c #686732",
+"H. c #646333",
+"I. c #5F7423",
+"J. c #6A9D16",
+"K. c #74B910",
+"L. c #75C00C",
+"M. c #79C812",
+"N. c #74C311",
+"O. c #7BDB06",
+"P. c #101010",
+"Q. c #515152",
+"R. c #98989B",
+"S. c #AFAFB0",
+"T. c #93938A",
+"U. c #6F6E54",
+"V. c #5F5E33",
+"W. c #454424",
+"X. c #528413",
+"Y. c #5B8A23",
+"Z. c #2C2E2E",
+"`. c #403F32",
+" + c #5D5C2D",
+".+ c #525127",
+"++ c #535227",
+"@+ c #4D4C22",
+"#+ c #414024",
+"$+ c #5A5A52",
+"%+ c #4D4D4E",
+"&+ c #0C0C0C",
+"*+ c #808081",
+"=+ c #B8B8BB",
+"-+ c #ABABA9",
+";+ c #7D7C69",
+">+ c #626139",
+",+ c #666530",
+"'+ c #727138",
+")+ c #6A693D",
+"!+ c #545331",
+"~+ c #3B402E",
+"{+ c #558F10",
+"]+ c #4D840A",
+"^+ c #3D5022",
+"/+ c #51502A",
+"(+ c #515025",
+"_+ c #43421F",
+":+ c #4E4D3D",
+"<+ c #646362",
+"[+ c #343436",
+"}+ c #1E1E1E",
+"|+ c #2D2D2D",
+"1+ c #363636",
+"2+ c #414141",
+"3+ c #777777",
+"4+ c #BBBBBD",
+"5+ c #A8A8A6",
+"6+ c #6B6B53",
+"7+ c #605F2F",
+"8+ c #6E6D34",
+"9+ c #78773E",
+"0+ c #77763F",
+"a+ c #69683A",
+"b+ c #504F31",
+"c+ c #3C3B26",
+"d+ c #42700B",
+"e+ c #5D9813",
+"f+ c #64941A",
+"g+ c #4C5B21",
+"h+ c #606059",
+"i+ c #5C5C5E",
+"j+ c #505050",
+"k+ c #636363",
+"l+ c #56552A",
+"m+ c #686731",
+"n+ c #706F39",
+"o+ c #6F6E3A",
+"p+ c #696836",
+"q+ c #5F5E30",
+"r+ c #3A391F",
+"s+ c #3A3A31",
+"t+ c #161617",
+"u+ c #314816",
+"v+ c #61951F",
+"w+ c #75B722",
+"x+ c #68AB15",
+"y+ c #62AF05",
+"z+ c #0A0A0A",
+"A+ c #484848",
+"B+ c #7C7C7C",
+"C+ c #575758",
+"D+ c #504F29",
+"E+ c #62612F",
+"F+ c #626131",
+"G+ c #5F5E2F",
+"H+ c #58572B",
+"I+ c #545329",
+"J+ c #424124",
+"K+ c #3A3926",
+"L+ c #171718",
+"M+ c #85E806",
+"N+ c #0F0F0F",
+"O+ c #3A3A3A",
+"P+ c #3E3E35",
+"Q+ c #57562A",
+"R+ c #555429",
+"S+ c #545328",
+"T+ c #555428",
+"U+ c #525126",
+"V+ c #3A391D",
+"W+ c #3C3C36",
+"X+ c #0E0E0E",
+"Y+ c #2A2A2C",
+"Z+ c #444334",
+"`+ c #545327",
+" @ c #565629",
+".@ c #535226",
+"+@ c #4D4C20",
+"@@ c #4B4A22",
+"#@ c #535232",
+"$@ c #535247",
+"%@ c #262627",
+"&@ c #0B0B0B",
+"*@ c #141414",
+"=@ c #2B2B2D",
+"-@ c #474633",
+";@ c #504F21",
+">@ c #4A4920",
+",@ c #4A4924",
+"'@ c #59583C",
+")@ c #6F6E5C",
+"!@ c #7D7C74",
+"~@ c #777775",
+"{@ c #080808",
+"]@ c #252526",
+"^@ c #464640",
+"/@ c #575641",
+"(@ c #6D6C5E",
+"_@ c #777771",
+":@ c #737373",
+"<@ c #515153",
+"[@ c #232324",
+"}@ c #333335",
+"|@ c #2D2D2F",
+"1@ c #0F0E0F",
+"2@ c #151415",
+"3@ c #101110",
+"4@ c #121213",
+"5@ c #181819",
+"6@ c #2A2A2B",
+"7@ c #1F2020",
+"8@ c #1A1A1B",
+"9@ c #3E3E3F",
+"0@ c #202120",
+"a@ c #222122",
+"b@ c #323232",
+"c@ c #1C1B1B",
+"d@ c #212221",
+"e@ c #3E3E3E",
+"f@ c #252424",
+"g@ c #2B2B2B",
+"h@ c #353635",
+"i@ c #1F1F1E",
+"j@ c #353434",
+"k@ c #353535",
+"l@ c #333433",
+"m@ c #333434",
+"n@ c #212122",
+"o@ c #474747",
+"p@ c #2E2D2D",
+"q@ c #323332",
+"r@ c #303031",
+"s@ c #1A1B19",
+"t@ c #1C1D1C",
+"u@ c #1B1A1B",
+"v@ c #424242",
+"w@ c #242423",
+"x@ c #1F1E1E",
+"y@ c #4B4A4A",
+"z@ c #454545",
+"A@ c #252625",
+"B@ c #302F31",
+"C@ c #363536",
+"D@ c #3B3A3B",
+"E@ c #131212",
+"F@ c #4C4B4B",
+"G@ c #272627",
+"H@ c #262625",
+"I@ c #454845",
+"J@ c #454846",
+"K@ c #444544",
+"L@ c #2F2E2F",
+"M@ c #1D1E1D",
+"N@ c #242525",
+"O@ c #4E4E4E",
+"P@ c #4B4B4B",
+"Q@ c #262526",
+"R@ c #252524",
+"S@ c #2A292A",
+"T@ c #383938",
+"U@ c #3D4539",
+"V@ c #40572F",
+"W@ c #344F1F",
+"X@ c #252E21",
+"Y@ c #3D3E3D",
+"Z@ c #2E2F2D",
+"`@ c #242227",
+" # c #282728",
+".# c #4F4F4F",
+"+# c #303431",
+"@# c #2E4B1C",
+"## c #6DB20D",
+"$# c #7FC90A",
+"%# c #2A411E",
+"&# c #2A2E29",
+"*# c #3E3D3E",
+"=# c #232223",
+"-# c #515151",
+";# c #525252",
+"># c #313132",
+",# c #303730",
+"'# c #4A8413",
+")# c #81DF0C",
+"!# c #88DF08",
+"~# c #3E6417",
+"{# c #1C1E20",
+"]# c #3A3B3A",
+"^# c #444444",
+"/# c #232322",
+"(# c #0F0F11",
+"_# c #151616",
+":# c #545454",
+"<# c #363A35",
+"[# c #2F4E18",
+"}# c #519213",
+"|# c #528917",
+"1# c #374B27",
+"2# c #383937",
+"3# c #313130",
+"4# c #0F0F0E",
+"5# c #1F201F",
+"6# c #555555",
+"7# c #2E2D2E",
+"8# c #333533",
+"9# c #232722",
+"0# c #2F3A2E",
+"a# c #374437",
+"b# c #363D35",
+"c# c #2D2C2C",
+"d# c #1F1F20",
+"e# c #0C0B0C",
+"f# c #555556",
+"g# c #201F20",
+"h# c #232222",
+"i# c #393839",
+"j# c #363535",
+"k# c #333432",
+"l# c #282827",
+"m# c #1D1D1E",
+"n# c #1D1E1E",
+"o# c #1A1A19",
+"p# c #535354",
+"q# c #5A5A5B",
+"r# c #323333",
+"s# c #2E2E2D",
+"t# c #141415",
+"u# c #111212",
+"v# c #1C1C1B",
+"w# c #4C4C4D",
+"x# c #5B5B5C",
+" ",
+" ",
+" . + @ # @ + . ",
+" $ + . . + $ ",
+" . . ",
+" . . ",
+" ",
+" % & * . @ # @ . . ",
+" = - ; > , ' ) & ! . $ $ . . ",
+" ~ { ] ^ > / ( _ : < [ } . $ ",
+" | / { / 1 2 3 4 5 6 . + ",
+" ) 7 8 9 _ 0 - a b c . . ",
+" d e f g g h i ~ ) & j k l $ . ",
+" m : n | o p _ 0 g q r s . + ",
+" t u v w _ 0 x y z ( : j @ @ ",
+" A B C _ 0 x D E : | - k # # ",
+" F k G H g _ u y I 5 J K L M @ @ ",
+" N J O P Q x u R S T U V W X . + ",
+" J * Y Z ` : ...+.@.#.$.%. $ . ",
+" &.&. } *.=., -.;.>.,.'.)., !. . . ",
+" ~.&.F {. ].^./.(._.:.<.[.}.|.5 * + ",
+" 1.&.5 2. 3.4. g 5.6.7.8.9.0.a.b.c.d. } $ ",
+" 1.J F e.f.% g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w. . ",
+" J F f.= x.: F - y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O. . ",
+" P.f.f.5 = x.0 _ x = Q.R.S.T.U.V.W.X.Y.Z.`. +.+++@+#+$+%+ ",
+" &+f.5 e.e.= & u | - ( n | x. { *+=+-+;+>+,+'+)+!+~+{+]+^+/+(+_+:+<+[+ . ",
+" N F e.e.e.= & : }+0 | ( |+' { 1+2+3+4+5+6+7+8+9+0+a+b+c+/ d+e+f+g+h+i+ . ",
+" J e.= = & & : x.u g ~ ( 7 j+k+i+F.l+m+n+o+p+q+a.r+s+t+ u+v+w+x+y+ . + $ ",
+" z+F = = & : : : }+0 - A+B+C+%.D+E+F+G+H+I+.+J+K+/ L+ O.w.k M+M+O . ",
+" N+5 & & : : : x.x.!.O+d.P+l+Q+R+I+S+T+U+V+W+ ",
+" X+f.& : : x.x.& & Y+Z+`+S+ @.@+@@@#@$@%@ ",
+" &@*@= : : x.: =@-@;@>@,@'@)@!@~@ . ",
+" {@P.F = = ]@^@/@(@_@:@<@[@ ",
+" &@X+x.}@|@ ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" X+F *@ ",
+" 1@2@5 5 = 5 &. ",
+" 3@F 5 5 5 5 e.= & = f. ",
+" N+&.f.e.5 f.5 5 5 e.= = & : : f.f. ",
+" 4@5@L+f.f.f.f.5 5 5 e.= = = = & x ( 6@ ",
+" N+_ 7@8@L+f.f.f.5 5 5 e.e.= = u - 7 %.9@- ",
+" 0@a@0 x x.= e.5 5 5 f.f.& 0 ( b@, O+%.%.O+c@ ",
+" : | d@x u x.x.: & e.5 : | n ; %.%.> > > , %.{ ",
+" *@| _ _ x u x.x.: & = F 2+e@f@g@/ { , , , 1+h@, 1 ",
+" X+g _ g g x i@}+: & & e.f.A+2+g - ~ ( j@1+k@{ l@; m@n@ ",
+" {@x | g g g x u }+: & & e.f.o@2+g - - - p@k@{ ; q@7 7 r@s@ ",
+" : f@g g | _ x u }+t@& u@e.f.A+v@g - - - n ; { / ' ' ' ' f ",
+" f.) w@) ) | _ x x x@t@& = e.f.y@z@g - ~ ~ A@|+B@C@D@/ !.!.!.A@ ",
+" E@~ | ) ) ) | _ 0 x u : : = e.f.F@A+_ G@H@| g / I@J@K@D@f f f L@M@ ",
+" % ~ ) N@) ) ) | _ 0 x u x.: & e.F O@P@0 Q@R@S@T@U@V@W@X@Y@k@1 g@1 Z@`@ ",
+" *@) #n ~ ~ ~ ) _ 0 0 }+x.: & = F .#O@0 Q@g ; +#@###$#%#&#*#!.f 1+K f ",
+" Q F =#( ( ~ | g _ 0 }+x.: : = f.-#;#0 ~ [@>#,#'#)#!#~#{#]#^#%.b@/#(# ",
+" 1.N Q *@x ~ ) g 0 x }+}+x.: = _#-#:#0 ) g 7 <#[#}#|#1#2# .3#0 F 4# ",
+" {@z+&@J & 0 _ 5#x.: x.x.& F -#6#0 ) _ 7#8#9#0#a#b#c#d#F N+ ",
+" 1.&@e#N+F x.}+}+& : = 2.;#f#g#h#0 p@i#j#k#l#m#2@Q ",
+" {@&@&@X+&.e.n#m#o#&.p#q#u ( ' r#s#| u@t#e# ",
+" z+&@Q u#_#v#f.w#x#' ' l#u f.J ",
+" {@&+Q X+&.~ ' | c@*@4# ",
+" z+X+&.5 &. ",
+" "};
diff --git a/src/xpm_data/svp_battery_0.h b/src/xpm_data/svp_battery_0.h
new file mode 100644
index 0000000..a7b67f9
--- /dev/null
+++ b/src/xpm_data/svp_battery_0.h
@@ -0,0 +1,23 @@
+/* XPM */
+static const char * svp_battery_0_xpm[] = {
+"16 16 4 1",
+" c None",
+". c #73BA00",
+"+ c #424542",
+"@ c #636163",
+" .... ",
+" .......... ",
+" .++++++++. ",
+" .+@@@@@@+. ",
+" .+@@@@@@+. ",
+" .++++++++. ",
+" .+@@@@@@+. ",
+" .+@@@@@@+. ",
+" .++++++++. ",
+" .+@@@@@@+. ",
+" .+@@@@@@+. ",
+" .++++++++. ",
+" .+@@@@@@+. ",
+" .+@@@@@@+. ",
+" .++++++++. ",
+" .......... "};
diff --git a/src/xpm_data/svp_battery_100.h b/src/xpm_data/svp_battery_100.h
new file mode 100644
index 0000000..ba04ac0
--- /dev/null
+++ b/src/xpm_data/svp_battery_100.h
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * svp_battery_100_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #73BA00",
+"+ c #424542",
+" .... ",
+" .......... ",
+" .++++++++. ",
+" .+......+. ",
+" .+......+. ",
+" .++++++++. ",
+" .+......+. ",
+" .+......+. ",
+" .++++++++. ",
+" .+......+. ",
+" .+......+. ",
+" .++++++++. ",
+" .+......+. ",
+" .+......+. ",
+" .++++++++. ",
+" .......... "};
diff --git a/src/xpm_data/svp_battery_25.h b/src/xpm_data/svp_battery_25.h
new file mode 100644
index 0000000..290485e
--- /dev/null
+++ b/src/xpm_data/svp_battery_25.h
@@ -0,0 +1,23 @@
+/* XPM */
+static const char * svp_battery_25_xpm[] = {
+"16 16 4 1",
+" c None",
+". c #73BA00",
+"+ c #424542",
+"@ c #636163",
+" .... ",
+" .......... ",
+" .++++++++. ",
+" .+@@@@@@+. ",
+" .+@@@@@@+. ",
+" .++++++++. ",
+" .+@@@@@@+. ",
+" .+@@@@@@+. ",
+" .++++++++. ",
+" .+@@@@@@+. ",
+" .+@@@@@@+. ",
+" .++++++++. ",
+" .+......+. ",
+" .+......+. ",
+" .++++++++. ",
+" .......... "};
diff --git a/src/xpm_data/svp_battery_50.h b/src/xpm_data/svp_battery_50.h
new file mode 100644
index 0000000..a4fda0e
--- /dev/null
+++ b/src/xpm_data/svp_battery_50.h
@@ -0,0 +1,23 @@
+/* XPM */
+static const char * svp_battery_50_xpm[] = {
+"16 16 4 1",
+" c None",
+". c #73BA00",
+"+ c #424542",
+"@ c #636163",
+" .... ",
+" .......... ",
+" .++++++++. ",
+" .+@@@@@@+. ",
+" .+@@@@@@+. ",
+" .++++++++. ",
+" .+@@@@@@+. ",
+" .+@@@@@@+. ",
+" .++++++++. ",
+" .+......+. ",
+" .+......+. ",
+" .++++++++. ",
+" .+......+. ",
+" .+......+. ",
+" .++++++++. ",
+" .......... "};
diff --git a/src/xpm_data/svp_battery_75.h b/src/xpm_data/svp_battery_75.h
new file mode 100644
index 0000000..72bf62b
--- /dev/null
+++ b/src/xpm_data/svp_battery_75.h
@@ -0,0 +1,23 @@
+/* XPM */
+static const char * svp_battery_75_xpm[] = {
+"16 16 4 1",
+" c None",
+". c #73BA00",
+"+ c #424542",
+"@ c #636163",
+" .... ",
+" .......... ",
+" .++++++++. ",
+" .+@@@@@@+. ",
+" .+@@@@@@+. ",
+" .++++++++. ",
+" .+......+. ",
+" .+......+. ",
+" .++++++++. ",
+" .+......+. ",
+" .+......+. ",
+" .++++++++. ",
+" .+......+. ",
+" .+......+. ",
+" .++++++++. ",
+" .......... "};
diff --git a/src/xpm_data/svp_status_excellent.h b/src/xpm_data/svp_status_excellent.h
new file mode 100644
index 0000000..638f74f
--- /dev/null
+++ b/src/xpm_data/svp_status_excellent.h
@@ -0,0 +1,37 @@
+/* XPM */
+static const char * svp_status_excellent_xpm[] = {
+"24 16 18 1",
+" c None",
+". c #73BA00",
+"+ c #73B600",
+"@ c #73B200",
+"# c #73AE00",
+"$ c #6BAE00",
+"% c #6BAA00",
+"& c #6BA600",
+"* c #6BA200",
+"= c #6BB200",
+"- c #63A200",
+"; c #639E00",
+"> c #639A00",
+", c #639600",
+"' c #5A9600",
+") c #5A9200",
+"! c #5A8E00",
+"~ c #5A8A00",
+" ..++",
+" .++@",
+" ++@#",
+" ...+ @@$$",
+" ..++ @$%%",
+" ++@@ %%&*",
+" ...+ +@=$ %&-;",
+" ..++ @$$% --;>",
+" .++@ $%%& ;;>,",
+" .... +@@$ %&&- >>')",
+" ...+ @@$% &-;; ,))!",
+" .++@ $%%& -;>, ))!!",
+".... ++@= %&&- ;>,' !!!~",
+"...+ @@$$ &--; ,')) !~~~",
+".+++ @$%% -;;> ')!! ~~~~",
+"++@@ %%&* ;>,' )!!~ ~~~~"};
diff --git a/src/xpm_data/svp_status_good.h b/src/xpm_data/svp_status_good.h
new file mode 100644
index 0000000..af912df
--- /dev/null
+++ b/src/xpm_data/svp_status_good.h
@@ -0,0 +1,34 @@
+/* XPM */
+static const char * svp_status_good_xpm[] = {
+"24 16 15 1",
+" c None",
+". c #CECFCE",
+"+ c #73BA00",
+"@ c #73B600",
+"# c #73B200",
+"$ c #6BAE00",
+"% c #6BAA00",
+"& c #6BA600",
+"* c #6BB200",
+"= c #63A200",
+"- c #639E00",
+"; c #639A00",
+"> c #6BA200",
+", c #639600",
+"' c #5A9600",
+" ....",
+" ....",
+" ....",
+" .... ....",
+" .... ....",
+" .... ....",
+" +++@ .... ....",
+" ++@@ .... ....",
+" +@@# .... ....",
+" ++++ @##$ .... ....",
+" +++@ ##$% .... ....",
+" +@@# $%%& .... ....",
+"++++ @@#* %&&= .... ....",
+"+++@ ##$$ &==- .... ....",
+"+@@@ #$%% =--; .... ....",
+"@@## %%&> -;,' .... ...."};
diff --git a/src/xpm_data/svp_status_low.h b/src/xpm_data/svp_status_low.h
new file mode 100644
index 0000000..4264de8
--- /dev/null
+++ b/src/xpm_data/svp_status_low.h
@@ -0,0 +1,29 @@
+/* XPM */
+static const char * svp_status_low_xpm[] = {
+"24 16 10 1",
+" c None",
+". c #CECFCE",
+"+ c #73BA00",
+"@ c #73B600",
+"# c #73B200",
+"$ c #6BB200",
+"% c #6BAE00",
+"& c #6BAA00",
+"* c #6BA600",
+"= c #6BA200",
+" ....",
+" ....",
+" ....",
+" .... ....",
+" .... ....",
+" .... ....",
+" .... .... ....",
+" .... .... ....",
+" .... .... ....",
+" ++++ .... .... ....",
+" +++@ .... .... ....",
+" +@@# .... .... ....",
+"++++ @@#$ .... .... ....",
+"+++@ ##%% .... .... ....",
+"+@@@ #%&& .... .... ....",
+"@@## &&*= .... .... ...."};
diff --git a/src/xpm_data/svp_status_nosignal.h b/src/xpm_data/svp_status_nosignal.h
new file mode 100644
index 0000000..4eeed4c
--- /dev/null
+++ b/src/xpm_data/svp_status_nosignal.h
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * svp_status_nosignal_xpm[] = {
+"24 16 2 1",
+" c None",
+". c #CECFCE",
+" ....",
+" ....",
+" ....",
+" .... ....",
+" .... ....",
+" .... ....",
+" .... .... ....",
+" .... .... ....",
+" .... .... ....",
+" .... .... .... ....",
+" .... .... .... ....",
+" .... .... .... ....",
+".... .... .... .... ....",
+".... .... .... .... ....",
+".... .... .... .... ....",
+".... .... .... .... ...."};
diff --git a/src/xpm_data/svp_status_verygood.h b/src/xpm_data/svp_status_verygood.h
new file mode 100644
index 0000000..50b96a1
--- /dev/null
+++ b/src/xpm_data/svp_status_verygood.h
@@ -0,0 +1,37 @@
+/* XPM */
+static const char * svp_status_verygood_xpm[] = {
+"24 16 18 1",
+" c None",
+". c #CECFCE",
+"+ c #73BA00",
+"@ c #73B600",
+"# c #73B200",
+"$ c #6BB200",
+"% c #6BAE00",
+"& c #6BAA00",
+"* c #6BA600",
+"= c #63A200",
+"- c #639E00",
+"; c #639A00",
+"> c #639600",
+", c #5A9600",
+"' c #5A9200",
+") c #5A8E00",
+"! c #6BA200",
+"~ c #5A8A00",
+" ....",
+" ....",
+" ....",
+" +++@ ....",
+" ++@@ ....",
+" @@## ....",
+" +++@ @#$% ....",
+" ++@@ #%%& ....",
+" +@@# %&&* ....",
+" ++++ @##% &**= ....",
+" +++@ ##%& *=-- ....",
+" +@@# %&&* =-;> ....",
+"++++ @@#$ &**= -;>, ....",
+"+++@ ##%% *==- >,'' ....",
+"+@@@ #%&& =--; ,')) ....",
+"@@## &&*! -;>, '))~ ...."};
diff --git a/src/xpm_data/svp_status_verylow.h b/src/xpm_data/svp_status_verylow.h
new file mode 100644
index 0000000..2cd82d3
--- /dev/null
+++ b/src/xpm_data/svp_status_verylow.h
@@ -0,0 +1,24 @@
+/* XPM */
+static const char * svp_status_verylow_xpm[] = {
+"24 16 5 1",
+" c None",
+". c #CECFCE",
+"+ c #73BA00",
+"@ c #73B600",
+"# c #73B200",
+" ....",
+" ....",
+" ....",
+" .... ....",
+" .... ....",
+" .... ....",
+" .... .... ....",
+" .... .... ....",
+" .... .... ....",
+" .... .... .... ....",
+" .... .... .... ....",
+" .... .... .... ....",
+"++++ .... .... .... ....",
+"+++@ .... .... .... ....",
+"+@@@ .... .... .... ....",
+"@@## .... .... .... ...."};
diff --git a/version.mk b/version.mk
index f6cd099..4f6e16e 100644
--- a/version.mk
+++ b/version.mk
@@ -1 +1 @@
-NVIDIA_VERSION = 260.19.21
+NVIDIA_VERSION = 260.19.29