summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2013-04-04 21:19:58 +0200
committerBent Bisballe Nyeng <deva@aasimon.org>2013-04-04 21:19:58 +0200
commit77b3943b751bed43d230de6db322a750bfd1fc8e (patch)
treecd7d98bc8c06c660558a52f2b6b6ed73982efdf2
parent0e436ebcd7faacb557ab94952765cb6bcfd7d259 (diff)
New message system. New common midi input class. Some compiler warning fixes. New ListBoxBasic class used by both LustBox and ComboBox. New embossed font.
-rw-r--r--lv2/input_lv2.cc13
-rw-r--r--lv2/input_lv2.h9
-rw-r--r--lv2/lv2.cc2
-rw-r--r--lv2/lv2_gui.cc2
-rw-r--r--plugingui/Makefile.am.plugingui1
-rw-r--r--plugingui/Makefile.mingw321
-rw-r--r--plugingui/button.cc4
-rw-r--r--plugingui/combobox.cc2
-rw-r--r--plugingui/combobox.h4
-rw-r--r--plugingui/font.cc4
-rw-r--r--plugingui/font.h2
-rw-r--r--plugingui/label.cc4
-rw-r--r--plugingui/listbox.cc234
-rw-r--r--plugingui/listbox.h36
-rw-r--r--plugingui/listboxbasic.cc311
-rw-r--r--plugingui/listboxbasic.h92
-rw-r--r--plugingui/painter.cc38
-rw-r--r--plugingui/painter.h3
-rw-r--r--plugingui/plugingui.cc30
-rw-r--r--plugingui/resource_data.cc908
-rw-r--r--plugingui/resources/pushbutton_b.pngbin203 -> 203 bytes
-rw-r--r--plugingui/resources/pushbutton_bl.pngbin371 -> 397 bytes
-rw-r--r--plugingui/resources/pushbutton_br.pngbin371 -> 388 bytes
-rw-r--r--plugingui/resources/pushbutton_c.pngbin187 -> 188 bytes
-rw-r--r--plugingui/resources/pushbutton_l.pngbin325 -> 303 bytes
-rw-r--r--plugingui/resources/pushbutton_r.pngbin312 -> 288 bytes
-rw-r--r--plugingui/resources/pushbutton_t.pngbin193 -> 191 bytes
-rw-r--r--plugingui/resources/pushbutton_tl.pngbin267 -> 305 bytes
-rw-r--r--plugingui/resources/pushbutton_tr.pngbin286 -> 333 bytes
-rw-r--r--src/Makefile.am1
-rw-r--r--src/Makefile.am.drumgizmo1
-rw-r--r--src/audioinputengine.h2
-rw-r--r--src/audioinputenginemidi.cc14
-rw-r--r--src/audioinputenginemidi.h12
-rw-r--r--src/drumgizmo.cc116
-rw-r--r--src/drumgizmo.h30
-rw-r--r--src/drumkitloader.cc5
-rw-r--r--src/message.h22
-rw-r--r--src/midimapper.cc6
-rw-r--r--src/midimapper.h2
-rw-r--r--vst/Makefile.mingw321
-rw-r--r--vst/drumgizmo_vst.cc8
-rw-r--r--vst/input_vst.cc17
-rw-r--r--vst/input_vst.h8
44 files changed, 1448 insertions, 497 deletions
diff --git a/lv2/input_lv2.cc b/lv2/input_lv2.cc
index 11e79a6..0d97760 100644
--- a/lv2/input_lv2.cc
+++ b/lv2/input_lv2.cc
@@ -61,6 +61,7 @@ void InputLV2::stop()
void InputLV2::pre()
{
}
+
event_t *InputLV2::run(size_t pos, size_t len, size_t *nevents)
{
event_t *list;
@@ -114,18 +115,6 @@ void InputLV2::post()
{
}
-void InputLV2::loadMidiMap(std::string f)
-{
- if(f == "") return;
- MidiMapParser p(f);
- if(p.parse()) {/*return false;*/}
- mmap.midimap = p.midimap;
-
- for(size_t i = 0; i < instruments->size(); i++) {
- mmap.instrmap[(*instruments)[i]->name()] = i;
- }
-}
-
#ifdef TEST_INPUT_LV2
//Additional dependency files
//deps:
diff --git a/lv2/input_lv2.h b/lv2/input_lv2.h
index 00e0b51..aa39a23 100644
--- a/lv2/input_lv2.h
+++ b/lv2/input_lv2.h
@@ -27,12 +27,11 @@
#ifndef __DRUMGIZMO_INPUT_LV2_H__
#define __DRUMGIZMO_INPUT_LV2_H__
-#include <audioinputengine.h>
-#include <midimapper.h>
+#include <audioinputenginemidi.h>
#include <lv2/lv2plug.in/ns/ext/event/event-helpers.h>
-class InputLV2 : public AudioInputEngine {
+class InputLV2 : public AudioInputEngineMidi {
public:
InputLV2();
~InputLV2();
@@ -48,12 +47,8 @@ public:
event_t *run(size_t pos, size_t len, size_t *nevents);
void post();
- void loadMidiMap(std::string file);
-
LV2_Event_Buffer *eventPort;
- MidiMapper mmap;
-
private:
Instruments *instruments;
};
diff --git a/lv2/lv2.cc b/lv2/lv2.cc
index 4916cf2..dd2a059 100644
--- a/lv2/lv2.cc
+++ b/lv2/lv2.cc
@@ -161,7 +161,7 @@ dg_restore(LV2_Handle instance,
std::string config;
config.append(data, size - 1);
dglv2->dg->setConfigString(config);
- dglv2->in->loadMidiMap(dglv2->dg->midimapfile);
+ //dglv2->in->loadMidiMap(dglv2->dg->midimapfile);
}
/*
diff --git a/lv2/lv2_gui.cc b/lv2/lv2_gui.cc
index 5524a76..afd47a2 100644
--- a/lv2/lv2_gui.cc
+++ b/lv2/lv2_gui.cc
@@ -151,6 +151,7 @@ static void closeHandler(void *ptr)
static void midimapHandler(void *ptr, const char* file)
{
+ /*
printf("> midimapHandler %s\n", file);
struct DG_GUI *gui = (struct DG_GUI *)ptr;
gui->instance->midimapfile = file;
@@ -159,6 +160,7 @@ static void midimapHandler(void *ptr, const char* file)
dglv2->in->loadMidiMap(file);
printf("< midimapHandler\n");
+ */
}
static LV2UI_Handle ui_instantiate(const struct _LV2UI_Descriptor * descriptor,
diff --git a/plugingui/Makefile.am.plugingui b/plugingui/Makefile.am.plugingui
index c0f5a6c..321cc30 100644
--- a/plugingui/Makefile.am.plugingui
+++ b/plugingui/Makefile.am.plugingui
@@ -19,6 +19,7 @@ PLUGIN_GUI_SOURCES = \
$(top_srcdir)/plugingui/checkbox.cc \
$(top_srcdir)/plugingui/slider.cc \
$(top_srcdir)/plugingui/listbox.cc \
+ $(top_srcdir)/plugingui/listboxbasic.cc \
$(top_srcdir)/plugingui/knob.cc \
$(top_srcdir)/plugingui/filebrowser.cc \
$(top_srcdir)/plugingui/image.cc \
diff --git a/plugingui/Makefile.mingw32 b/plugingui/Makefile.mingw32
index 7d6add6..7fb5492 100644
--- a/plugingui/Makefile.mingw32
+++ b/plugingui/Makefile.mingw32
@@ -28,6 +28,7 @@ CXX_SOURCES = \
$(top_srcdir)/plugingui/checkbox.cc \
$(top_srcdir)/plugingui/slider.cc \
$(top_srcdir)/plugingui/listbox.cc \
+ $(top_srcdir)/plugingui/listboxbasic.cc \
$(top_srcdir)/plugingui/filebrowser.cc \
$(top_srcdir)/plugingui/knob.cc \
$(top_srcdir)/plugingui/combobox.cc \
diff --git a/plugingui/button.cc b/plugingui/button.cc
index 2370f29..d03bc01 100644
--- a/plugingui/button.cc
+++ b/plugingui/button.cc
@@ -99,10 +99,10 @@ void GUI::Button::repaintEvent(GUI::RepaintEvent *e)
break;
}
- Font font;
+ Font font(":fontemboss.png");
p.setColour(Colour(0.1));
p.drawText(width()/2-(text.length()*3)+(state==up?0:1),
- height()/2+5+(state==up?0:1), font, text);
+ height()/2+5+(state==up?0:1), font, text, true);
}
void GUI::Button::setText(std::string text)
diff --git a/plugingui/combobox.cc b/plugingui/combobox.cc
index 376b3f1..a8f53b7 100644
--- a/plugingui/combobox.cc
+++ b/plugingui/combobox.cc
@@ -57,7 +57,7 @@ GUI::ComboBox::ComboBox(GUI::Widget *parent)
box.bottomRight = new Image(":widget_br.png");
box.center = new Image(":widget_c.png");
- listbox = new GUI::ListBox(parent);
+ listbox = new GUI::ListBoxBasic(parent);
listbox->registerSelectHandler(listboxSelectHandler, this);
listbox->registerClickHandler(listboxSelectHandler, this);
listbox->hide();
diff --git a/plugingui/combobox.h b/plugingui/combobox.h
index ce68b2c..f02d07a 100644
--- a/plugingui/combobox.h
+++ b/plugingui/combobox.h
@@ -32,7 +32,7 @@
#include "widget.h"
#include "font.h"
-#include "listbox.h"
+#include "listboxbasic.h"
#include "painter.h"
namespace GUI {
@@ -62,7 +62,7 @@ private:
Painter::Box box;
GUI::Font font;
- GUI::ListBox *listbox;
+ GUI::ListBoxBasic *listbox;
void (*handler)(void *);
void *ptr;
diff --git a/plugingui/font.cc b/plugingui/font.cc
index 670eba0..f9c8135 100644
--- a/plugingui/font.cc
+++ b/plugingui/font.cc
@@ -30,8 +30,8 @@
#include <X11/Xlib.h>
#endif/*X11*/
-GUI::Font::Font()
- : img_font(":font.png")
+GUI::Font::Font(std::string fontfile)
+ : img_font(fontfile)
{
int px = 0;
int c;
diff --git a/plugingui/font.h b/plugingui/font.h
index 32a06f2..c0a65f4 100644
--- a/plugingui/font.h
+++ b/plugingui/font.h
@@ -38,7 +38,7 @@ namespace GUI {
class Font {
public:
- Font();
+ Font(std::string fontfile = ":font.png");
void setFace(std::string face);
std::string face();
diff --git a/plugingui/label.cc b/plugingui/label.cc
index 165f1ed..bcc7005 100644
--- a/plugingui/label.cc
+++ b/plugingui/label.cc
@@ -46,8 +46,8 @@ void GUI::Label::repaintEvent(GUI::RepaintEvent *e)
p.setColour(Colour(1));
- Font font;
- p.drawText(10, (height() + font.textHeight()) / 2, font, _text);
+ Font font(":fontemboss.png");
+ p.drawText(10, (height() + font.textHeight()) / 2, font, _text, true);
}
diff --git a/plugingui/listbox.cc b/plugingui/listbox.cc
index 3dfba5c..6c6c6e7 100644
--- a/plugingui/listbox.cc
+++ b/plugingui/listbox.cc
@@ -44,104 +44,53 @@ GUI::ListBox::ListBox(GUI::Widget *parent)
box.bottomRight = new Image(":widget_br.png");
box.center = new Image(":widget_c.png");
- padding = 4;
- btn_size = 14;
-
- scroll_offset = 0;
- selected = -1;
- marked = -1;
-
- clk_handler = NULL;
- clk_ptr = NULL;
-
- sel_handler = NULL;
- sel_ptr = NULL;
-
- valch_handler = NULL;
- valch_ptr = NULL;
+ basic = new GUI::ListBoxBasic(this);
+ basic->move(box.left->width(), box.top->height());
}
GUI::ListBox::~ListBox()
{
}
-void GUI::ListBox::setSelection(int index)
-{
- selected = index;
- if(valch_handler) valch_handler(valch_ptr);
-}
-
void GUI::ListBox::addItem(std::string name, std::string value)
{
- struct item i;
- i.name = name;
- i.value = value;
-
- items.push_back(i);
-
- // sort
- for(int x = 0; x < (int)items.size() - 1; x++) {
- for(int y = 0; y < (int)items.size() - 1; y++) {
- if(items[x].name < items[y].name) {
-
- if(x == selected) setSelection(y);
- else if(selected == y) setSelection(x);
-
- struct item tmp = items[x];
- items[x] = items[y];
- items[y] = tmp;
- }
- }
- }
-
- if(selected == -1) setSelection((int)items.size() - 1);
+ basic->addItem(name, value);
}
void GUI::ListBox::clear()
{
- items.clear();
- setSelection(-1);
- scroll_offset = 0;
- repaintEvent(NULL);
+ basic->clear();
}
bool GUI::ListBox::selectItem(int index)
{
- if(index < 0 || index > (int)items.size() - 1) return false;
- setSelection(index);
- repaintEvent(NULL);
- return true;
+ return basic->selectItem(index);
}
std::string GUI::ListBox::selectedName()
{
- if(selected < 0 || selected > (int)items.size() - 1) return "";
- return items[selected].name;
+ return basic->selectedName();
}
std::string GUI::ListBox::selectedValue()
{
- if(selected < 0 || selected > (int)items.size() - 1) return "";
- return items[selected].value;
+ return basic->selectedValue();
}
void GUI::ListBox::registerClickHandler(void (*handler)(void *), void *ptr)
{
- this->clk_handler = handler;
- this->clk_ptr = ptr;
+ basic->registerClickHandler(handler, ptr);
}
void GUI::ListBox::registerSelectHandler(void (*handler)(void *), void *ptr)
-{
- this->sel_handler = handler;
- this->sel_ptr = ptr;
+{
+ basic->registerSelectHandler(handler, ptr);
}
void GUI::ListBox::registerValueChangeHandler(void (*handler)(void *),
void *ptr)
{
- this->valch_handler = handler;
- this->valch_ptr = ptr;
+ basic->registerValueChangeHandler(handler, ptr);
}
void GUI::ListBox::repaintEvent(GUI::RepaintEvent *e)
@@ -154,164 +103,11 @@ void GUI::ListBox::repaintEvent(GUI::RepaintEvent *e)
int h = height();
if(w == 0 || h == 0) return;
p.drawBox(0, 0, &box, w, h);
-
- int yoffset = padding / 2;
- int skip = scroll_offset;
- for(int idx = skip; idx < (int)items.size(); idx++) {
- struct item *i = &items[idx];
- if(idx == selected) {
- p.setColour(Colour(0.6, 0.9));
- p.drawFilledRectangle(1,
- yoffset - (padding / 2),
- width() - 1,
- yoffset + (font.textHeight() + 1));
- }
-
- if(idx == marked) {
- p.setColour(Colour(1, 0.9));
- p.drawRectangle(1,
- yoffset - (padding / 2),
- width() - 1,
- yoffset + (font.textHeight() + 1));
- }
-
- p.setColour(Colour(1, 1));
- p.drawText(2, yoffset + font.textHeight(), font, i->name);
- yoffset += font.textHeight() + padding;
- }
-
- p.drawRectangle(width() - btn_size, 0, width() - 1, btn_size);
- p.drawRectangle(width() - btn_size, height() - btn_size,
- width() - 1, height() - 1);
}
-void GUI::ListBox::scrollEvent(ScrollEvent *e)
+void GUI::ListBox::resize(int width, int height)
{
- scroll_offset += e->delta;
- if(scroll_offset < 0) scroll_offset = 0;
- if(scroll_offset > ((int)items.size() - 1))
- scroll_offset = ((int)items.size() - 1);
- repaintEvent(NULL);
-}
-
-void GUI::ListBox::keyEvent(GUI::KeyEvent *e)
-{
- if(e->direction != -1) return;
-
- switch(e->keycode) {
- case GUI::KeyEvent::KEY_UP:
- {
- marked--;
- if(marked < 0) marked = 0;
-
- if(marked < scroll_offset) {
- scroll_offset = marked;
- if(scroll_offset < 0) scroll_offset = 0;
- }
- }
- break;
- case GUI::KeyEvent::KEY_DOWN:
- {
- // Number of items that can be displayed at a time.
- int numitems = height() / (font.textHeight() + padding);
-
- marked++;
- if(marked > ((int)items.size() - 1)) marked = (int)items.size() - 1;
-
- if(marked > (scroll_offset + numitems - 1)) {
- scroll_offset = marked - numitems + 1;
- if(scroll_offset > ((int)items.size() - 1))
- scroll_offset = ((int)items.size() - 1);
- }
- }
- break;
- case GUI::KeyEvent::KEY_HOME:
- marked = 0;
- if(marked < scroll_offset) {
- scroll_offset = marked;
- if(scroll_offset < 0) scroll_offset = 0;
- }
- break;
- case GUI::KeyEvent::KEY_END:
- {
- // Number of items that can be displayed at a time.
- int numitems = height() / (font.textHeight() + padding);
-
- marked = (int)items.size() - 1;
- if(marked > (scroll_offset + numitems - 1)) {
- scroll_offset = marked - numitems + 1;
- if(scroll_offset > ((int)items.size() - 1))
- scroll_offset = ((int)items.size() - 1);
- }
- }
- break;
- case GUI::KeyEvent::KEY_CHARACTER:
- if(e->text == " ") {
- setSelection(marked);
- // if(sel_handler) sel_handler(sel_ptr);
- }
- break;
- case GUI::KeyEvent::KEY_ENTER:
- setSelection(marked);
- if(sel_handler) sel_handler(sel_ptr);
- break;
- default:
- break;
- }
-
- repaintEvent(NULL);
-}
-
-void GUI::ListBox::buttonEvent(ButtonEvent *e)
-{
- if(e->x > ((int)width() - btn_size) && e->y < ((int)width() - 1)) {
- if(e->y > 0 && e->y < btn_size) {
- if(e->direction == -1) return;
- scroll_offset--;
- if(scroll_offset < 0) scroll_offset = 0;
- repaintEvent(NULL);
- return;
- }
-
- if(e->y > ((int)height() - btn_size) && e->y < ((int)height() - 1)) {
- if(e->direction == -1) return;
- scroll_offset++;
- if(scroll_offset > ((int)items.size() - 1))
- scroll_offset = ((int)items.size() - 1);
- repaintEvent(NULL);
- return;
- }
- }
-
- if(e->direction == -1) {
- int skip = scroll_offset;
- size_t yoffset = padding / 2;
- for(int idx = skip; idx < (int)items.size(); idx++) {
- yoffset += font.textHeight() + padding;
- if(e->y < (int)yoffset - (padding / 2)) {
- setSelection(idx);
- marked = selected;
- if(clk_handler) clk_handler(clk_ptr);
- break;
- }
- }
-
- repaintEvent(NULL);
- }
-
- if(e->direction != -1) {
- int skip = scroll_offset;
- size_t yoffset = padding / 2;
- for(int idx = skip; idx < (int)items.size(); idx++) {
- yoffset += font.textHeight() + padding;
- if(e->y < (int)yoffset - (padding / 2)) {
- marked = idx;
- break;
- }
- }
-
- repaintEvent(NULL);
- }
-
- if(e->doubleclick && sel_handler) sel_handler(sel_ptr);
+ GUI::Widget::resize(width, height);
+ basic->resize(width - (box.left->width() + box.right->width()),
+ height - (box.top->height() + box.bottom->height()));
}
diff --git a/plugingui/listbox.h b/plugingui/listbox.h
index e85d3d2..9a702df 100644
--- a/plugingui/listbox.h
+++ b/plugingui/listbox.h
@@ -31,8 +31,8 @@
#include <vector>
#include "widget.h"
-#include "font.h"
#include "painter.h"
+#include "listboxbasic.h"
namespace GUI {
@@ -41,8 +41,6 @@ public:
ListBox(Widget *parent);
~ListBox();
- bool isFocusable() { return true; }
-
void addItem(std::string name, std::string value);
void clear();
@@ -54,37 +52,13 @@ public:
void registerClickHandler(void (*handler)(void *), void *ptr);
void registerValueChangeHandler(void (*handler)(void *), void *ptr);
- virtual void repaintEvent(RepaintEvent *e);
- virtual void buttonEvent(ButtonEvent *e);
- virtual void scrollEvent(ScrollEvent *e);
- virtual void keyEvent(KeyEvent *e);
+ virtual void repaintEvent(GUI::RepaintEvent *e);
+ virtual void resize(int w, int h);
private:
- Painter::Box box;
-
- void setSelection(int index);
-
- struct item {
- std::string name;
- std::string value;
- };
+ ListBoxBasic *basic;
- std::vector<struct item> items;
- int selected;
- int marked;
- GUI::Font font;
- int padding;
- int btn_size;
- int scroll_offset;
-
- void (*sel_handler)(void *);
- void *sel_ptr;
-
- void (*clk_handler)(void *);
- void *clk_ptr;
-
- void (*valch_handler)(void *);
- void *valch_ptr;
+ Painter::Box box;
};
};
diff --git a/plugingui/listboxbasic.cc b/plugingui/listboxbasic.cc
new file mode 100644
index 0000000..25b3daf
--- /dev/null
+++ b/plugingui/listboxbasic.cc
@@ -0,0 +1,311 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * listboxbasic.cc
+ *
+ * Thu Apr 4 20:28:10 CEST 2013
+ * Copyright 2013 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of DrumGizmo.
+ *
+ * DrumGizmo is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * DrumGizmo is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with DrumGizmo; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#include "listboxbasic.h"
+
+#include "painter.h"
+#include "font.h"
+
+#include <stdio.h>
+
+GUI::ListBoxBasic::ListBoxBasic(GUI::Widget *parent)
+ : GUI::Widget(parent)
+{
+ padding = 4;
+ btn_size = 14;
+
+ scroll_offset = 0;
+ selected = -1;
+ marked = -1;
+
+ clk_handler = NULL;
+ clk_ptr = NULL;
+
+ sel_handler = NULL;
+ sel_ptr = NULL;
+
+ valch_handler = NULL;
+ valch_ptr = NULL;
+
+ bg_img = new GUI::Image(":widget_c.png");
+}
+
+GUI::ListBoxBasic::~ListBoxBasic()
+{
+ delete bg_img;
+}
+
+void GUI::ListBoxBasic::setSelection(int index)
+{
+ selected = index;
+ if(valch_handler) valch_handler(valch_ptr);
+}
+
+void GUI::ListBoxBasic::addItem(std::string name, std::string value)
+{
+ struct item i;
+ i.name = name;
+ i.value = value;
+
+ items.push_back(i);
+
+ // sort
+ for(int x = 0; x < (int)items.size() - 1; x++) {
+ for(int y = 0; y < (int)items.size() - 1; y++) {
+ if(items[x].name < items[y].name) {
+
+ if(x == selected) setSelection(y);
+ else if(selected == y) setSelection(x);
+
+ struct item tmp = items[x];
+ items[x] = items[y];
+ items[y] = tmp;
+ }
+ }
+ }
+
+ if(selected == -1) setSelection((int)items.size() - 1);
+}
+
+void GUI::ListBoxBasic::clear()
+{
+ items.clear();
+ setSelection(-1);
+ scroll_offset = 0;
+ repaintEvent(NULL);
+}
+
+bool GUI::ListBoxBasic::selectItem(int index)
+{
+ if(index < 0 || index > (int)items.size() - 1) return false;
+ setSelection(index);
+ repaintEvent(NULL);
+ return true;
+}
+
+std::string GUI::ListBoxBasic::selectedName()
+{
+ if(selected < 0 || selected > (int)items.size() - 1) return "";
+ return items[selected].name;
+}
+
+std::string GUI::ListBoxBasic::selectedValue()
+{
+ if(selected < 0 || selected > (int)items.size() - 1) return "";
+ return items[selected].value;
+}
+
+void GUI::ListBoxBasic::registerClickHandler(void (*handler)(void *), void *ptr)
+{
+ this->clk_handler = handler;
+ this->clk_ptr = ptr;
+}
+
+void GUI::ListBoxBasic::registerSelectHandler(void (*handler)(void *), void *ptr)
+{
+ this->sel_handler = handler;
+ this->sel_ptr = ptr;
+}
+
+void GUI::ListBoxBasic::registerValueChangeHandler(void (*handler)(void *),
+ void *ptr)
+{
+ this->valch_handler = handler;
+ this->valch_ptr = ptr;
+}
+
+void GUI::ListBoxBasic::repaintEvent(GUI::RepaintEvent *e)
+{
+ GUI::Painter p(this);
+
+ p.clear();
+
+ int w = width();
+ int h = height();
+ if(w == 0 || h == 0) return;
+
+ p.drawImageStretched(0, 0, bg_img, w, h);
+
+ int yoffset = padding / 2;
+ int skip = scroll_offset;
+ for(int idx = skip; idx < (int)items.size(); idx++) {
+ struct item *i = &items[idx];
+ if(idx == selected) {
+ p.setColour(Colour(0.6, 0.9));
+ p.drawFilledRectangle(1,
+ yoffset - (padding / 2),
+ width() - 1,
+ yoffset + (font.textHeight() + 1));
+ }
+
+ if(idx == marked) {
+ p.setColour(Colour(1, 0.9));
+ p.drawRectangle(1,
+ yoffset - (padding / 2),
+ width() - 1,
+ yoffset + (font.textHeight() + 1));
+ }
+
+ p.setColour(Colour(1, 1));
+ p.drawText(2, yoffset + font.textHeight(), font, i->name);
+ yoffset += font.textHeight() + padding;
+ }
+
+ p.drawRectangle(width() - btn_size, 0, width() - 1, btn_size);
+ p.drawRectangle(width() - btn_size, height() - btn_size,
+ width() - 1, height() - 1);
+}
+
+void GUI::ListBoxBasic::scrollEvent(ScrollEvent *e)
+{
+ scroll_offset += e->delta;
+ if(scroll_offset < 0) scroll_offset = 0;
+ if(scroll_offset > ((int)items.size() - 1))
+ scroll_offset = ((int)items.size() - 1);
+ repaintEvent(NULL);
+}
+
+void GUI::ListBoxBasic::keyEvent(GUI::KeyEvent *e)
+{
+ if(e->direction != -1) return;
+
+ switch(e->keycode) {
+ case GUI::KeyEvent::KEY_UP:
+ {
+ marked--;
+ if(marked < 0) marked = 0;
+
+ if(marked < scroll_offset) {
+ scroll_offset = marked;
+ if(scroll_offset < 0) scroll_offset = 0;
+ }
+ }
+ break;
+ case GUI::KeyEvent::KEY_DOWN:
+ {
+ // Number of items that can be displayed at a time.
+ int numitems = height() / (font.textHeight() + padding);
+
+ marked++;
+ if(marked > ((int)items.size() - 1)) marked = (int)items.size() - 1;
+
+ if(marked > (scroll_offset + numitems - 1)) {
+ scroll_offset = marked - numitems + 1;
+ if(scroll_offset > ((int)items.size() - 1))
+ scroll_offset = ((int)items.size() - 1);
+ }
+ }
+ break;
+ case GUI::KeyEvent::KEY_HOME:
+ marked = 0;
+ if(marked < scroll_offset) {
+ scroll_offset = marked;
+ if(scroll_offset < 0) scroll_offset = 0;
+ }
+ break;
+ case GUI::KeyEvent::KEY_END:
+ {
+ // Number of items that can be displayed at a time.
+ int numitems = height() / (font.textHeight() + padding);
+
+ marked = (int)items.size() - 1;
+ if(marked > (scroll_offset + numitems - 1)) {
+ scroll_offset = marked - numitems + 1;
+ if(scroll_offset > ((int)items.size() - 1))
+ scroll_offset = ((int)items.size() - 1);
+ }
+ }
+ break;
+ case GUI::KeyEvent::KEY_CHARACTER:
+ if(e->text == " ") {
+ setSelection(marked);
+ // if(sel_handler) sel_handler(sel_ptr);
+ }
+ break;
+ case GUI::KeyEvent::KEY_ENTER:
+ setSelection(marked);
+ if(sel_handler) sel_handler(sel_ptr);
+ break;
+ default:
+ break;
+ }
+
+ repaintEvent(NULL);
+}
+
+void GUI::ListBoxBasic::buttonEvent(ButtonEvent *e)
+{
+ if(e->x > ((int)width() - btn_size) && e->y < ((int)width() - 1)) {
+ if(e->y > 0 && e->y < btn_size) {
+ if(e->direction == -1) return;
+ scroll_offset--;
+ if(scroll_offset < 0) scroll_offset = 0;
+ repaintEvent(NULL);
+ return;
+ }
+
+ if(e->y > ((int)height() - btn_size) && e->y < ((int)height() - 1)) {
+ if(e->direction == -1) return;
+ scroll_offset++;
+ if(scroll_offset > ((int)items.size() - 1))
+ scroll_offset = ((int)items.size() - 1);
+ repaintEvent(NULL);
+ return;
+ }
+ }
+
+ if(e->direction == -1) {
+ int skip = scroll_offset;
+ size_t yoffset = padding / 2;
+ for(int idx = skip; idx < (int)items.size(); idx++) {
+ yoffset += font.textHeight() + padding;
+ if(e->y < (int)yoffset - (padding / 2)) {
+ setSelection(idx);
+ marked = selected;
+ if(clk_handler) clk_handler(clk_ptr);
+ break;
+ }
+ }
+
+ repaintEvent(NULL);
+ }
+
+ if(e->direction != -1) {
+ int skip = scroll_offset;
+ size_t yoffset = padding / 2;
+ for(int idx = skip; idx < (int)items.size(); idx++) {
+ yoffset += font.textHeight() + padding;
+ if(e->y < (int)yoffset - (padding / 2)) {
+ marked = idx;
+ break;
+ }
+ }
+
+ repaintEvent(NULL);
+ }
+
+ if(e->doubleclick && sel_handler) sel_handler(sel_ptr);
+}
diff --git a/plugingui/listboxbasic.h b/plugingui/listboxbasic.h
new file mode 100644
index 0000000..1b7644e
--- /dev/null
+++ b/plugingui/listboxbasic.h
@@ -0,0 +1,92 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * listboxbasic.h
+ *
+ * Thu Apr 4 20:28:10 CEST 2013
+ * Copyright 2013 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of DrumGizmo.
+ *
+ * DrumGizmo is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * DrumGizmo is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with DrumGizmo; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#ifndef __DRUMGIZMO_LISTBOXBASIC_H__
+#define __DRUMGIZMO_LISTBOXBASIC_H__
+
+#include <string.h>
+#include <vector>
+
+#include "widget.h"
+#include "font.h"
+#include "painter.h"
+
+namespace GUI {
+
+class ListBoxBasic : public Widget {
+public:
+ ListBoxBasic(Widget *parent);
+ ~ListBoxBasic();
+
+ bool isFocusable() { return true; }
+
+ void addItem(std::string name, std::string value);
+
+ void clear();
+ bool selectItem(int index);
+ std::string selectedName();
+ std::string selectedValue();
+
+ void registerSelectHandler(void (*handler)(void *), void *ptr);
+ void registerClickHandler(void (*handler)(void *), void *ptr);
+ void registerValueChangeHandler(void (*handler)(void *), void *ptr);
+
+ virtual void repaintEvent(RepaintEvent *e);
+ virtual void buttonEvent(ButtonEvent *e);
+ virtual void scrollEvent(ScrollEvent *e);
+ virtual void keyEvent(KeyEvent *e);
+
+private:
+ Image *bg_img;
+
+ void setSelection(int index);
+
+ struct item {
+ std::string name;
+ std::string value;
+ };
+
+ std::vector<struct item> items;
+ int selected;
+ int marked;
+ GUI::Font font;
+ int padding;
+ int btn_size;
+ int scroll_offset;
+
+ void (*sel_handler)(void *);
+ void *sel_ptr;
+
+ void (*clk_handler)(void *);
+ void *clk_ptr;
+
+ void (*valch_handler)(void *);
+ void *valch_ptr;
+};
+
+};
+
+#endif/*__DRUMGIZMO_LISTBOXBASIC_H__*/
diff --git a/plugingui/painter.cc b/plugingui/painter.cc
index 5a88b7c..9e5b052 100644
--- a/plugingui/painter.cc
+++ b/plugingui/painter.cc
@@ -103,7 +103,7 @@ void GUI::Painter::drawLine(int x0, int y0, int x1, int y1)
// Handle first endpoint:
double xend = round(x0);
double yend = y0 + gradient * (xend - x0);
- double xgap = rfpart(x0 + 0.5);
+ //double xgap = rfpart(x0 + 0.5);
double xpxl1 = xend; //this will be used in the main loop
double ypxl1 = ipart(yend);
@@ -122,7 +122,7 @@ void GUI::Painter::drawLine(int x0, int y0, int x1, int y1)
// Handle second endpoint:
xend = round(x1);
yend = y1 + gradient * (xend - x1);
- xgap = fpart(x1 + 0.5);
+ //xgap = fpart(x1 + 0.5);
double xpxl2 = xend; //this will be used in the main loop
double ypxl2 = ipart(yend);
@@ -173,19 +173,29 @@ void GUI::Painter::clear()
}
}
-void GUI::Painter::drawText(int x0, int y0, GUI::Font &font, std::string text)
+void GUI::Painter::drawText(int x0, int y0, GUI::Font &font, std::string text,
+ bool nocolour)
{
PixelBufferAlpha *textbuf = font.render(widget->window()->gctx, text);
-
- for(size_t x = 0; x < textbuf->width; x++) {
- for(size_t y = 0; y < textbuf->height; y++) {
- unsigned char r,g,b,a;
- textbuf->pixel(x, y, &r, &g, &b, &a);
- pixbuf->addPixel(x + x0, y + y0 - textbuf->height,
- colour.red * 255,
- colour.green * 255,
- colour.blue * 255,
- colour.alpha * a);
+ if(nocolour) {
+ for(size_t x = 0; x < textbuf->width; x++) {
+ for(size_t y = 0; y < textbuf->height; y++) {
+ unsigned char r,g,b,a;
+ textbuf->pixel(x, y, &r, &g, &b, &a);
+ pixbuf->addPixel(x + x0, y + y0 - textbuf->height, r,g,b,a);
+ }
+ }
+ } else {
+ for(size_t x = 0; x < textbuf->width; x++) {
+ for(size_t y = 0; y < textbuf->height; y++) {
+ unsigned char r,g,b,a;
+ textbuf->pixel(x, y, &r, &g, &b, &a);
+ pixbuf->addPixel(x + x0, y + y0 - textbuf->height,
+ colour.red * 255,
+ colour.green * 255,
+ colour.blue * 255,
+ colour.alpha * a);
+ }
}
}
@@ -436,7 +446,7 @@ void GUI::Painter::drawBox(int x, int y, Box *box, int width, int height)
void GUI::Painter::drawBar(int x, int y, Bar *bar, int width, int height)
{
- if(width < (bar->left->width() + bar->right->width() + 1)) {
+ if(width < ((int)bar->left->width() + (int)bar->right->width() + 1)) {
width = bar->left->width() + bar->right->width() + 1;
}
drawImageStretched(x, y,
diff --git a/plugingui/painter.h b/plugingui/painter.h
index 6d5c297..0a93f50 100644
--- a/plugingui/painter.h
+++ b/plugingui/painter.h
@@ -47,7 +47,8 @@ public:
void setColour(Colour colour);
void drawLine(int x1, int y1, int x2, int y2);
- void drawText(int x, int y, Font &font, std::string text);
+ void drawText(int x, int y, Font &font, std::string text,
+ bool nocolour = false);
void drawRectangle(int x1, int y1, int x2, int y2);
void drawFilledRectangle(int x1, int y1, int x2, int y2);
void drawPoint(int x, int y);
diff --git a/plugingui/plugingui.cc b/plugingui/plugingui.cc
index 10632ee..08412ef 100644
--- a/plugingui/plugingui.cc
+++ b/plugingui/plugingui.cc
@@ -43,8 +43,9 @@ public:
bool init(bool) { return true; }
std::string drumkitfile() { return ""; }
std::string midimapfile;
- Message *receiveMessage() { return NULL; }
- Message *peekMessage() { return NULL; }
+ Message *receiveGUIMessage() { return NULL; }
+ Message *peekGUIMessage() { return NULL; }
+ void sendEngineMessage(Message *msg) { delete msg; }
};
namespace Conf {
@@ -95,8 +96,12 @@ static void selectKitFile(void *ptr, std::string filename)
std::string drumkit = gui->lineedit->text();
- gui->progress->setProgress(1);
+ gui->progress->setProgress(0);
+ LoadDrumKitMessage *msg = new LoadDrumKitMessage();
+ msg->drumkitfile = drumkit;
+ gui->drumgizmo->sendEngineMessage(msg);
+ /*
if(!gui->drumgizmo ||
!gui->drumgizmo->loadkit(drumkit) ||
!gui->drumgizmo->init(true)) {
@@ -104,6 +109,7 @@ static void selectKitFile(void *ptr, std::string filename)
} else {
gui->progress->setState(GUI::ProgressBar::blue);
}
+ */
}
static void kitBrowseClick(void *ptr)
@@ -123,9 +129,16 @@ static void selectMapFile(void *ptr, std::string filename)
fb->hide();
std::string midimap = gui->lineedit2->text();
+
+ LoadMidimapMessage *msg = new LoadMidimapMessage();
+ msg->midimapfile = midimap;
+ gui->drumgizmo->sendEngineMessage(msg);
+
+ /*
if(gui->changeMidimapHandler)
gui->changeMidimapHandler(gui->changeMidimapPtr, midimap.c_str());
gui->progress2->setState(GUI::ProgressBar::green);
+ */
}
static void midimapBrowseClick(void *ptr)
@@ -193,17 +206,17 @@ void PluginGUI::thread_main()
usleep(50);
#endif/*WIN32*/
Message *msg;
- while((msg = drumgizmo->receiveMessage()) != NULL) {
+ while((msg = drumgizmo->receiveGUIMessage()) != NULL) {
switch(msg->type()) {
case Message::LoadStatus:
{
Message *pmsg;
- while( (pmsg = drumgizmo->peekMessage()) != NULL) {
+ while( (pmsg = drumgizmo->peekGUIMessage()) != NULL) {
if(pmsg->type() != Message::LoadStatus) break;
delete msg;
- msg = drumgizmo->receiveMessage();
+ msg = drumgizmo->receiveGUIMessage();
}
- LoadStatus *ls = (LoadStatus*)msg;
+ LoadStatusMessage *ls = (LoadStatusMessage*)msg;
DEBUG(gui, "%d of %d (%s)\n",
ls->numer_of_files_loaded,
ls->number_of_files,
@@ -343,7 +356,6 @@ void PluginGUI::init()
lbl_version->move(270, 279);
lbl_version->resize(70, 20);
- /*
{
GUI::ComboBox *cmb = new GUI::ComboBox(window);
cmb->addItem("Foo", "Bar");
@@ -351,7 +363,7 @@ void PluginGUI::init()
cmb->move(10,100);
cmb->resize(70, 30);
}
- */
+
// Create filebrowser
filebrowser = new GUI::FileBrowser(window);
filebrowser->move(0, 0);
diff --git a/plugingui/resource_data.cc b/plugingui/resource_data.cc
index 70bfde2..44da337 100644
--- a/plugingui/resource_data.cc
+++ b/plugingui/resource_data.cc
@@ -386,6 +386,637 @@ const rc_data_t rc_data[] =
"\74\10\262\205\52\173\113\103\375\127\200\1\0\171\345\227"
"\360\256\353\154\61\0\0\0\0\111\105\116\104\256\102\140"
"\202" },
+ { ":fontemboss.png", 10069,
+ "\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122"
+ "\0\0\3\40\0\0\0\17\10\6\0\0\0\34\142\253"
+ "\26\0\0\0\4\147\101\115\101\0\0\257\310\67\5\212"
+ "\351\0\0\0\31\164\105\130\164\123\157\146\164\167\141\162"
+ "\145\0\101\144\157\142\145\40\111\155\141\147\145\122\145\141"
+ "\144\171\161\311\145\74\0\0\46\347\111\104\101\124\170\332"
+ "\354\135\11\174\115\107\27\177\241\366\204\306\232\215\252\324"
+ "\256\110\55\265\26\265\253\45\372\121\112\325\322\306\122\113"
+ "\133\37\102\211\274\104\204\10\265\66\326\332\227\330\142\55"
+ "\211\135\252\202\326\362\331\65\15\211\330\367\40\104\225\367"
+ "\375\317\163\156\72\231\334\373\336\175\131\124\333\274\374\116"
+ "\356\334\131\316\314\234\231\71\163\316\314\231\271\6\223\311"
+ "\144\300\237\311\200\337\277\374\151\224\335\222\237\356\237\336"
+ "\370\226\342\245\47\117\301\335\20\320\111\360\353\14\150\220"
+ "\121\371\153\344\251\73\134\117\76\351\51\343\277\51\134\17"
+ "\255\63\243\237\146\126\177\316\310\362\245\67\74\263\373\151"
+ "\146\214\267\314\152\237\314\250\313\277\41\37\315\166\244\371"
+ "\127\5\376\352\376\255\227\137\147\140\33\320\274\324\21\140"
+ "\247\370\151\321\103\145\236\116\31\46\310\64\66\226\307\150"
+ "\43\75\313\1\6\333\230\316\230\226\361\155\261\276\251\345"
+ "\27\303\253\300\67\323\32\236\226\266\173\131\343\74\75\174"
+ "\64\43\302\154\305\241\312\137\224\261\365\12\74\355\314\203"
+ "\333\316\140\262\63\330\331\231\75\376\275\117\152\257\24\156"
+ "\163\233\376\351\127\12\356\366\334\256\353\0\27\330\355\16"
+ "\370\0\360\35\340\231\322\21\10\257\236\216\54\304\63\212"
+ "\14\46\215\171\372\21\16\166\347\203\173\3\340\21\240\35"
+ "\373\155\206\73\27\240\55\40\111\107\376\166\172\313\257\26"
+ "\337\102\270\63\240\3\140\72\373\147\203\273\11\240\32\323"
+ "\374\60\140\247\171\374\374\131\257\24\223\204\200\263\64\234"
+ "\165\1\305\1\217\1\321\200\35\124\157\16\57\3\167\75"
+ "\200\53\207\307\160\370\103\225\62\367\4\274\41\62\163\51"
+ "\357\124\23\25\247\167\2\64\345\62\74\1\354\2\34\265"
+ "\220\236\342\214\343\360\202\160\267\4\224\340\260\213\200\255"
+ "\200\273\34\236\207\303\313\60\155\16\1\366\130\242\157\32"
+ "\373\137\106\305\253\14\347\173\0\107\300\115\256\313\105\11"
+ "\107\176\100\155\100\131\166\377\16\210\7\34\4\234\267\220"
+ "\357\100\176\116\127\311\127\244\63\341\273\14\330\102\145\20"
+ "\360\120\137\151\14\50\2\110\0\104\2\216\111\351\237\3"
+ "\22\271\35\176\4\134\263\322\27\14\302\230\363\263\20\246"
+ "\364\223\306\334\326\331\1\127\1\121\200\323\342\370\325\350"
+ "\157\106\225\61\156\247\25\56\244\245\272\176\104\355\200\360"
+ "\30\255\74\204\264\233\170\374\211\77\242\133\127\51\17\242"
+ "\357\134\13\345\264\343\76\113\343\272\20\340\66\217\273\137"
+ "\65\350\371\210\373\100\270\320\367\325\160\20\137\70\147\1"
+ "\307\45\100\4\307\125\342\70\360\370\44\276\231\233\313\376"
+ "\23\225\305\112\273\32\54\320\365\317\160\223\311\310\163\150"
+ "\165\274\23\317\136\255\201\213\4\354\363\300\367\13\343\233"
+ "\313\145\61\160\177\30\2\230\250\360\164\346\131\155\21\77"
+ "\4\361\151\361\350\6\140\267\200\357\175\152\137\204\207\42"
+ "\274\7\334\7\24\332\360\217\306\327\273\10\137\144\251\216"
+ "\102\371\375\244\367\101\170\135\303\375\124\155\254\311\375\360"
+ "\15\145\301\13\277\225\200\270\144\301\310\144\110\36\307\166"
+ "\22\53\141\34\243\341\154\4\230\100\175\40\171\156\146\231"
+ "\112\43\215\62\117\247\22\272\24\231\306\106\176\46\316\367"
+ "\166\72\370\341\74\100\53\236\317\364\246\123\55\263\306\34"
+ "\156\47\215\51\365\372\246\226\137\254\362\152\75\174\375\257"
+ "\12\267\224\116\246\113\106\225\45\243\346\303\14\12\253\316"
+ "\163\250\75\300\137\245\137\30\171\216\212\144\171\40\115\345"
+ "\27\237\346\361\151\147\320\375\114\153\372\324\351\262\166\100"
+ "\224\147\52\267\344\67\225\31\61\301\24\16\47\301\171\6"
+ "\63\332\234\26\64\321\376\200\274\200\67\171\22\22\343\275"
+ "\5\370\212\363\42\1\353\355\164\344\51\226\267\105\366\354"
+ "\331\23\167\357\336\335\127\361\333\261\143\307\27\344\307\102"
+ "\220\22\317\223\205\100\23\77\75\137\302\16\210\27\13\12"
+ "\212\177\15\26\32\356\221\360\301\102\153\65\251\136\142\273"
+ "\210\70\203\131\210\173\314\164\332\6\350\55\204\117\2\374"
+ "\114\12\27\207\157\125\4\131\251\114\125\171\362\66\251\320"
+ "\124\265\14\34\136\210\313\260\237\224\32\316\343\73\53\351"
+ "\23\205\360\341\134\376\173\14\121\354\247\204\167\145\205\343"
+ "\16\340\26\140\25\300\343\25\336\1\231\301\102\46\265\307"
+ "\31\356\303\42\16\22\320\2\0\153\131\331\110\342\172\355"
+ "\142\305\242\271\106\276\305\131\0\273\301\156\203\205\166\172"
+ "\300\102\264\257\20\116\302\377\367\134\246\47\234\367\64\225"
+ "\364\117\271\15\167\161\331\135\254\264\245\311\132\137\341\260"
+ "\242\200\311\200\175\200\373\114\237\137\0\337\252\360\35\65"
+ "\301\110\155\214\153\206\363\217\24\235\100\156\217\306\226\362"
+ "\20\302\226\60\217\21\177\337\252\344\361\33\240\222\205\162"
+ "\22\275\347\363\202\300\23\56\3\275\27\323\240\327\155\36"
+ "\103\303\254\340\130\300\376\132\70\150\374\174\43\325\153\0"
+ "\53\77\327\270\277\35\142\101\337\132\273\232\154\154\33\342"
+ "\265\307\0\257\253\304\173\235\303\372\12\370\276\22\126\370"
+ "\337\344\76\121\122\130\361\247\171\41\206\343\323\142\322\166"
+ "\205\176\374\244\72\155\340\360\175\74\366\304\37\275\377\150"
+ "\143\35\305\167\342\321\237\133\30\153\142\77\254\310\371\335"
+ "\141\36\116\356\12\172\127\247\361\153\320\254\131\263\245\342"
+ "\170\320\261\3\142\312\340\35\20\223\55\253\351\230\113\23"
+ "\146\317\236\75\335\254\260\351\117\147\322\23\56\340\262\332"
+ "\7\55\360\205\177\362\16\210\51\43\313\362\212\355\200\320"
+ "\334\170\205\347\42\265\366\175\306\213\173\353\376\356\73\40"
+ "\131\12\210\116\5\4\314\346\226\237\237\337\367\76\76\76"
+ "\13\340\276\311\341\165\136\173\355\265\153\243\107\217\236\3"
+ "\72\146\327\350\10\5\271\63\25\6\170\263\200\54\306\233"
+ "\305\214\336\304\253\363\223\323\221\147\162\171\163\344\310\261"
+ "\322\303\303\343\30\342\70\10\14\75\177\345\312\225\217\43"
+ "\375\122\41\15\271\373\160\332\76\374\256\326\231\215\31\245"
+ "\200\344\315\233\67\242\146\315\232\121\311\332\270\235\335\222"
+ "\374\371\363\307\106\106\106\6\21\70\70\70\304\302\157\241"
+ "\120\156\43\63\371\124\114\7\161\367\215\34\71\162\322\325"
+ "\253\127\375\117\234\70\341\133\261\142\305\155\331\262\145\113"
+ "\136\41\265\267\267\217\32\74\170\360\364\330\330\330\200\113"
+ "\227\56\175\123\267\156\335\120\204\237\227\312\104\273\14\313"
+ "\235\234\234\316\253\51\40\112\376\102\71\304\360\201\300\167"
+ "\303\313\313\153\346\371\363\347\307\374\364\323\117\143\200\147"
+ "\253\134\166\5\32\65\152\364\163\343\306\215\177\122\302\221"
+ "\366\122\375\372\365\67\136\270\160\301\110\200\362\155\42\77"
+ "\41\374\260\273\273\373\376\343\307\217\217\1\370\273\271\271"
+ "\105\262\120\226\26\5\304\205\225\317\1\151\140\270\3\70"
+ "\255\213\245\170\216\216\216\221\213\27\57\36\167\367\356\135"
+ "\343\47\237\174\262\14\345\277\47\340\40\41\154\16\332\366"
+ "\66\372\341\332\320\320\320\240\233\67\157\372\235\72\165\312"
+ "\17\364\233\226\63\147\316\30\26\262\52\251\224\157\50\372"
+ "\310\155\300\35\136\51\66\150\265\323\345\313\227\375\232\67"
+ "\157\36\206\274\257\12\341\103\360\236\60\174\370\360\231\327"
+ "\256\135\33\263\155\333\66\177\27\27\227\15\162\372\304\304"
+ "\104\277\355\333\267\217\153\332\264\351\162\224\223\24\312\21"
+ "\226\372\202\44\174\230\54\204\15\46\132\164\354\330\161\301"
+ "\221\43\107\314\364\231\72\165\152\140\301\202\5\267\147\222"
+ "\2\102\253\337\123\300\67\342\346\316\235\73\1\145\51\245"
+ "\107\210\311\223\47\117\34\53\343\312\257\114\356\334\271\317"
+ "\311\171\274\361\306\33\147\131\31\310\256\121\216\41\44\240"
+ "\201\167\315\304\270\13\0\277\12\41\372\303\377\277\152\364"
+ "\72\163\346\214\137\355\332\265\67\43\316\105\113\70\350\235"
+ "\372\202\32\216\163\347\316\31\33\64\150\260\1\161\56\211"
+ "\365\2\316\230\167\336\171\147\43\306\217\137\102\102\202\61"
+ "\50\50\150\174\201\2\5\366\250\215\121\271\15\365\264\215"
+ "\62\207\106\107\107\327\316\225\53\27\51\227\335\125\342\165"
+ "\247\60\212\103\161\333\264\151\263\17\164\75\244\50\173\340"
+ "\311\146\36\214\247\227\262\320\104\341\37\174\360\301\146\212"
+ "\277\167\357\336\76\340\351\367\231\17\23\315\215\364\276\157"
+ "\337\276\76\24\76\175\372\164\177\214\237\70\336\345\241\337"
+ "\133\364\16\177\243\32\37\332\270\161\143\110\365\352\325\117"
+ "\172\172\172\106\12\62\200\22\317\374\136\243\106\215\250\174"
+ "\371\362\205\253\50\13\106\251\255\151\67\163\46\350\176\155"
+ "\322\244\111\163\1\363\310\15\277\20\100\55\235\312\4\205"
+ "\325\3\64\227\26\167\76\342\171\163\4\357\256\344\225\332"
+ "\244\56\367\7\157\336\215\310\56\324\47\33\357\252\174\315"
+ "\213\72\165\204\264\331\331\212\300\233\371\111\135\251\116\166"
+ "\274\12\375\25\307\151\247\54\370\11\46\117\317\235\235\235"
+ "\277\225\314\237\136\3\264\226\360\312\375\250\72\343\35\305"
+ "\12\136\121\45\34\374\141\217\110\23\351\335\44\361\362\301"
+ "\12\175\245\262\33\271\354\303\271\14\304\13\352\163\231\276"
+ "\346\235\52\61\256\146\171\270\76\55\30\317\20\166\277\46"
+ "\245\117\325\6\126\350\154\224\322\327\346\272\210\13\106\245"
+ "\130\36\31\305\145\173\107\112\143\22\167\101\54\230\250\31"
+ "\245\5\215\57\245\135\44\73\366\163\22\160\24\26\166\352"
+ "\251\114\16\374\116\376\203\70\136\67\136\74\126\176\45\1"
+ "\237\161\330\60\245\237\12\273\233\103\5\374\62\244\340\347"
+ "\340\127\217\102\102\102\146\74\175\372\324\127\215\357\303\337"
+ "\70\163\346\314\357\50\136\172\24\50\361\151\263\342\220\306"
+ "\364\251\362\317\122\100\122\67\160\362\304\43\114\100\150\354"
+ "\147\3\6\14\150\71\160\340\300\17\340\376\203\204\126\10"
+ "\50\33\112\224\50\361\53\342\225\125\151\340\112\334\271\246"
+ "\102\110\276\3\241\173\54\46\367\43\245\112\225\72\50\166"
+ "\72\232\120\107\215\32\105\53\263\246\55\133\266\370\27\53"
+ "\126\154\123\72\362\114\256\3\362\212\357\335\273\367\130\271"
+ "\323\365\352\325\153\74\13\31\146\277\5\13\26\14\300\244"
+ "\167\200\47\277\3\213\26\55\352\257\321\231\115\31\244\200"
+ "\344\303\304\172\175\320\240\101\311\253\374\230\230\257\222\140"
+ "\210\72\71\22\170\173\173\317\202\337\25\55\101\113\232\14"
+ "\273\1\112\3\162\2\362\5\7\7\177\5\232\76\25\302"
+ "\273\3\312\3\162\103\360\160\200\240\373\137\320\362\251\204"
+ "\273\63\46\363\133\141\141\141\43\65\166\100\210\241\120\330"
+ "\27\144\322\240\10\15\24\16\232\35\157\330\260\341\136\10"
+ "\324\23\321\306\243\240\40\164\205\200\333\131\203\46\145\121"
+ "\257\130\114\376\135\204\366\177\212\66\31\341\353\353\373\72"
+ "\101\317\236\75\107\211\345\207\73\151\303\206\15\375\120\176"
+ "\173\202\365\353\327\367\7\216\313\62\323\325\260\3\316\306"
+ "\214\261\45\117\74\144\336\260\234\127\224\155\145\130\321\234"
+ "\66\210\161\265\140\334\331\244\366\350\12\160\6\75\212\226"
+ "\55\133\166\66\4\230\373\2\216\136\44\204\202\171\206\154"
+ "\335\272\365\143\364\343\21\20\222\106\25\57\136\274\131\351"
+ "\322\245\103\40\144\376\27\202\341\171\66\155\20\313\367\32"
+ "\372\314\321\326\255\133\377\0\201\154\13\334\107\224\111\120"
+ "\155\162\6\35\363\177\376\371\347\203\171\314\50\12\371\311"
+ "\156\335\272\155\104\331\312\161\137\51\10\360\114\65\166\100"
+ "\162\16\253\17\341\154\47\322\235\263\165\365\122\55\14\170"
+ "\116\165\350\320\41\34\170\153\320\242\0\340\65\100\161\100"
+ "\247\114\120\100\150\262\236\215\276\171\161\355\332\265\201\310"
+ "\303\125\357\52\152\235\72\165\166\263\362\257\114\322\323\252"
+ "\124\251\362\243\234\7\370\304\160\324\351\6\13\72\251\312"
+ "\201\260\23\135\273\166\335\104\174\12\220\13\120\246\113\227"
+ "\56\233\341\177\134\243\315\12\367\350\321\143\264\330\367\265"
+ "\160\240\317\234\124\303\21\30\30\130\10\70\106\50\355\56"
+ "\216\261\117\77\375\324\17\143\253\70\323\235\166\31\272\332"
+ "\310\347\254\52\40\204\33\175\164\73\312\275\237\115\275\224"
+ "\137\156\362\243\60\163\376\210\273\144\311\222\217\321\76\264"
+ "\23\112\347\10\14\350\367\153\211\337\343\271\206\323\224\107"
+ "\232\104\304\373\17\343\166\350\337\277\377\152\244\211\245\135"
+ "\24\324\51\26\363\302\112\63\137\170\21\356\206\271\345\244"
+ "\262\263\103\73\277\170\77\101\155\257\122\107\332\31\233\205"
+ "\161\267\33\302\114\143\225\61\140\176\7\217\376\206\170\65"
+ "\361\154\255\25\150\176\377\332\336\336\376\330\376\375\373\375"
+ "\221\326\235\200\334\30\373\107\315\273\74\222\2\242\347\214"
+ "\13\373\371\362\216\365\155\66\231\44\272\176\42\225\167\45"
+ "\357\212\336\341\305\213\46\202\114\323\210\167\216\342\171\167"
+ "\171\256\220\266\11\357\40\121\72\252\143\250\124\247\272\154"
+ "\176\26\307\73\72\73\131\11\321\332\65\123\374\233\133\301"
+ "\153\142\376\166\221\167\274\116\1\174\154\334\1\51\303\273"
+ "\263\244\344\175\251\261\200\272\204\313\175\213\335\13\231\216"
+ "\327\170\307\136\157\171\232\261\165\302\165\206\10\366\263\330"
+ "\6\66\320\231\140\61\57\302\76\227\26\146\117\163\231\56"
+ "\52\146\267\126\150\157\262\302\73\253\360\316\201\273\20\356"
+ "\316\176\125\4\34\377\341\260\126\134\246\26\202\11\345\145"
+ "\216\267\207\167\371\262\363\34\110\226\26\7\71\54\201\225"
+ "\120\321\24\62\101\307\56\271\62\147\323\170\171\303\104\226"
+ "\112\352\362\251\335\343\307\217\337\140\277\154\66\50\40\331"
+ "\262\24\220\127\364\11\306\376\324\22\63\54\124\250\320\55"
+ "\114\20\363\10\12\27\56\114\35\266\23\46\201\7\120\36"
+ "\202\131\173\377\232\5\62\361\300\267\325\155\157\312\327\335"
+ "\335\235\4\103\123\223\46\115\352\375\361\307\37\377\111\153"
+ "\236\242\302\4\274\111\323\246\115\253\43\167\316\251\123\247"
+ "\326\243\60\305\257\110\221\42\3\220\277\131\1\301\63\12"
+ "\357\231\255\200\274\217\374\237\304\304\304\224\26\5\204\71"
+ "\163\346\324\126\342\102\100\255\3\277\337\365\50\40\122\226"
+ "\316\300\75\277\144\311\222\261\52\341\104\233\261\240\145\70"
+ "\4\143\121\0\167\103\136\221\235\73\167\46\341\264\260\206"
+ "\2\162\223\315\246\316\260\20\336\112\240\363\143\47\47\247"
+ "\35\154\266\163\207\31\223\226\160\63\343\355\267\337\76\110"
+ "\73\121\112\70\4\365\323\310\237\166\305\306\1\306\303\275"
+ "\235\374\224\160\10\133\111\257\277\376\172\37\26\2\362\71"
+ "\72\72\366\223\150\243\45\234\266\345\125\247\111\74\221\136"
+ "\202\100\363\233\207\207\307\212\371\363\347\7\113\112\213\45"
+ "\60\307\243\64\224\226\160\360\144\261\232\161\173\163\136\162"
+ "\175\107\323\152\366\127\137\175\265\124\20\50\17\266\154\331"
+ "\162\67\61\127\66\303\72\317\346\110\63\231\351\346\204\222"
+ "\370\55\150\172\123\302\347\101\164\136\261\142\105\373\320\320"
+ "\320\17\311\255\230\241\111\165\127\312\34\210\274\267\101\300"
+ "\212\27\350\370\160\306\214\31\155\155\121\36\246\114\231\322"
+ "\205\24\100\215\74\324\126\260\114\132\141\64\346\220\177\107"
+ "\251\77\352\111\157\114\203\2\262\1\365\275\270\153\327\56"
+ "\77\320\264\250\136\45\211\36\313\226\55\373\24\151\257\261"
+ "\111\115\131\302\363\375\367\337\367\225\363\40\274\264\102\16"
+ "\145\145\275\40\154\233\104\172\207\204\204\264\23\363\300\270"
+ "\366\44\177\215\372\372\203\326\233\321\146\27\323\201\43\10"
+ "\70\166\272\272\272\136\26\353\105\374\0\375\141\63\233\243"
+ "\15\147\1\303\41\243\24\20\21\17\150\336\26\375\374\201"
+ "\150\112\110\156\362\243\60\201\127\277\16\276\161\5\364\243"
+ "\62\31\40\300\307\324\255\133\367\60\236\277\231\227\145\355"
+ "\354\306\41\374\22\342\25\20\166\10\336\101\335\314\343\317"
+ "\315\315\55\32\357\51\114\61\27\56\134\70\54\127\256\134"
+ "\144\246\326\20\317\350\5\13\26\14\325\330\221\17\312\237"
+ "\77\377\341\153\327\256\175\254\52\344\260\114\0\36\135\206"
+ "\170\265\341\305\131\23\115\5\4\277\332\200\317\250\254\202"
+ "\126\126\200\375\152\151\35\272\267\66\167\40\357\223\120\114"
+ "\375\156\335\272\65\52\56\56\316\17\374\147\33\332\367\220"
+ "\270\143\123\260\140\301\243\77\377\374\163\0\140\154\321\242"
+ "\105\117\240\235\267\46\37\160\265\263\333\214\360\23\333\267"
+ "\157\17\100\135\374\312\224\51\23\52\54\356\205\123\174\112"
+ "\167\340\300\201\61\340\261\377\23\225\111\244\15\303\374\173"
+ "\154\367\356\335\143\220\326\210\271\61\22\151\366\310\273\100"
+ "\362\116\31\322\155\163\166\166\76\166\370\360\341\261\277\374"
+ "\362\213\77\160\34\221\307\16\346\362\310\75\173\366\370\137"
+ "\277\176\335\277\171\363\346\33\121\247\170\33\24\220\232\144"
+ "\112\212\262\334\1\155\346\13\364\115\21\257\164\351\322\33"
+ "\343\343\343\175\373\364\351\263\32\145\372\375\255\267\336\132"
+ "\217\367\321\275\173\367\136\111\26\24\172\313\203\264\21\220"
+ "\11\216\23\215\10\120\237\223\360\13\27\323\253\265\201\65"
+ "\72\213\351\201\377\47\204\23\35\175\205\164\17\74\75\75"
+ "\327\235\76\175\172\334\276\175\373\374\320\337\327\131\243\275"
+ "\226\2\42\10\301\116\50\377\165\224\337\77\171\373\3\156"
+ "\362\243\60\212\123\273\166\355\143\30\203\146\353\13\50\337"
+ "\113\101\213\77\360\134\304\143\164\111\265\152\325\314\112\306"
+ "\334\271\163\107\202\216\127\170\1\246\36\306\67\55\54\176"
+ "\103\141\365\352\325\73\210\260\160\145\47\10\70\174\301\203"
+ "\142\304\235\110\324\367\133\214\367\243\165\352\324\71\46\224"
+ "\77\33\233\340\233\254\231\330\361\270\65\161\174\121\261\240"
+ "\367\176\154\206\332\235\27\302\163\361\356\115\367\54\5\344"
+ "\25\175\142\20\334\264\304\14\307\217\37\77\15\235\352\52"
+ "\201\267\267\367\34\164\252\250\367\336\173\57\12\3\152\36"
+ "\13\237\127\104\363\51\374\52\121\107\53\121\242\304\145\177"
+ "\177\377\225\353\327\257\237\211\16\374\120\36\64\215\32\65"
+ "\212\142\223\41\23\13\142\37\246\65\117\261\274\30\130\317"
+ "\273\167\357\356\52\63\371\36\75\172\270\121\230\342\107\203"
+ "\154\333\266\155\346\355\177\172\342\175\231\206\160\152\262\264"
+ "\155\250\22\137\125\1\301\304\70\7\23\101\264\142\76\306"
+ "\376\317\301\30\235\225\270\175\373\366\165\25\313\250\123\1"
+ "\41\105\154\42\30\301\225\260\260\260\341\32\151\151\122\273"
+ "\17\41\170\205\20\76\26\14\350\334\243\107\217\352\311\171"
+ "\10\14\143\130\102\102\202\57\4\61\62\335\40\6\274\117"
+ "\244\63\332\170\47\231\177\235\74\171\162\14\231\113\221\331"
+ "\224\112\376\245\311\44\2\70\372\213\370\333\264\151\263\0"
+ "\376\167\224\362\221\273\155\333\266\13\224\160\60\274\243\150"
+ "\167\312\157\14\321\25\345\337\51\321\106\113\70\245\225\250"
+ "\207\210\177\31\12\127\70\4\267\151\250\307\0\100\23\225"
+ "\25\161\253\212\262\171\45\365\105\332\1\20\12\247\243\15"
+ "\303\231\1\77\344\274\344\155\344\33\350\263\337\43\176\145"
+ "\101\1\111\104\71\76\141\246\174\365\343\217\77\136\203\111"
+ "\317\27\14\173\272\222\327\220\41\103\352\242\176\317\44\133"
+ "\353\31\240\161\34\51\156\4\20\122\343\340\67\335\302\31"
+ "\20\232\300\222\60\231\256\27\167\23\275\274\274\112\331\242"
+ "\200\364\352\325\253\242\12\255\323\164\6\204\360\364\354\331"
+ "\263\214\334\37\165\244\67\245\101\1\171\136\277\176\375\275"
+ "\203\6\15\52\155\313\56\15\117\326\216\245\112\225\72\213"
+ "\362\316\306\373\167\240\365\257\242\142\56\342\200\320\322\15"
+ "\375\365\266\302\263\304\70\104\157\320\317\135\242\247\273\270"
+ "\53\45\326\17\371\335\161\161\161\211\372\341\207\37\206\353"
+ "\300\361\114\213\146\350\223\17\3\3\3\277\25\353\165\350"
+ "\320\241\57\53\124\250\360\3\322\135\341\325\311\135\154\326"
+ "\141\253\2\222\135\12\312\256\42\30\344\205\20\163\210\224"
+ "\51\26\14\262\221\233\374\50\114\214\333\241\103\207\25\340"
+ "\267\264\250\341\14\72\46\102\200\351\301\312\225\23\374\317"
+ "\166\352\324\51\225\71\54\370\77\355\220\233\370\51\233\60"
+ "\25\55\127\256\234\371\222\212\362\345\313\37\122\224\117\311"
+ "\324\164\4\170\360\111\10\307\203\150\67\106\125\310\371\123"
+ "\150\310\16\101\66\232\170\266\232\2\42\237\265\60\151\54"
+ "\300\246\305\76\237\374\40\260\16\257\134\271\362\20\320\204"
+ "\166\142\2\252\127\257\276\212\166\215\104\5\144\321\242\105"
+ "\43\25\276\0\5\154\24\231\245\51\341\160\47\100\11\363"
+ "\341\35\315\74\200\26\2\57\272\57\246\245\170\142\235\20"
+ "\176\367\335\167\337\335\346\350\350\70\56\157\336\274\1\65"
+ "\153\326\334\0\277\207\326\316\41\20\336\305\213\27\173\363"
+ "\56\247\3\312\364\215\74\166\40\120\367\45\5\224\26\134"
+ "\242\243\243\233\253\214\11\113\12\310\152\364\247\273\310\203"
+ "\370\171\71\255\171\0\2\156\147\332\65\274\160\341\102\55"
+ "\172\307\30\350\244\274\113\374\325\142\171\324\350\304\246\200"
+ "\26\333\300\32\235\305\364\233\67\157\36\250\230\212\13\246"
+ "\325\11\305\212\25\133\207\272\216\303\374\74\154\351\322\245"
+ "\175\165\234\1\261\266\3\142\300\230\132\205\376\174\226\115"
+ "\244\362\222\233\374\224\70\120\330\214\310\233\306\144\316\74"
+ "\171\362\304\266\150\321\142\37\236\164\371\117\16\310\157\347"
+ "\40\233\370\52\312\14\306\332\161\320\152\35\55\302\100\231"
+ "\240\205\265\102\24\266\142\305\212\136\250\367\75\136\44\263"
+ "\103\377\371\31\174\353\73\241\354\16\274\10\360\277\33\67"
+ "\156\164\24\312\347\17\134\53\221\317\3\75\147\174\50\36"
+ "\305\247\164\102\130\60\357\142\121\137\75\310\146\220\24\156"
+ "\104\334\375\351\125\40\262\24\220\114\172\266\156\335\172\213"
+ "\45\146\150\266\241\66\231\6\23\100\233\15\246\25\55\32"
+ "\324\312\71\15\137\137\337\171\312\71\15\121\30\7\363\174"
+ "\200\111\234\224\207\145\120\162\256\260\177\45\1\157\253\311"
+ "\223\47\323\112\62\15\72\132\55\71\232\216\74\15\342\312"
+ "\71\72\150\135\231\311\303\257\36\6\135\222\220\207\47\257"
+ "\310\233\230\111\170\332\50\20\151\11\201\152\341\331\61\230"
+ "\243\73\166\354\70\107\132\351\172\212\162\325\26\6\126\35"
+ "\324\325\226\35\20\242\47\331\207\137\205\200\77\211\30\101"
+ "\252\374\137\234\15\30\207\166\336\1\246\21\47\354\276\134"
+ "\251\125\253\326\116\25\105\113\116\117\246\33\56\241\241\241"
+ "\144\42\365\104\54\73\4\207\76\144\376\105\0\105\363\13"
+ "\151\325\74\171\101\35\155\170\32\161\212\110\366\351\347\233"
+ "\65\153\266\63\56\56\156\74\1\271\305\63\52\107\216\34"
+ "\351\6\141\77\22\314\343\56\340\172\325\252\125\303\101\303"
+ "\307\152\273\136\242\33\2\310\166\60\276\207\205\13\27\276"
+ "\204\174\303\61\221\116\223\317\161\50\66\307\226\100\250\107"
+ "\362\371\21\302\5\234\21\300\175\205\362\240\274\124\352\373"
+ "\34\345\251\40\51\305\144\122\130\226\25\224\77\276\370\342"
+ "\213\336\301\301\301\371\76\377\374\363\176\114\367\302\350\233"
+ "\376\30\7\17\4\174\366\144\266\6\101\350\147\245\215\340"
+ "\376\205\374\14\57\156\11\111\165\26\340\316\235\73\1\135"
+ "\273\166\335\112\46\110\112\170\276\174\371\36\202\156\255\155"
+ "\121\100\120\267\256\342\130\111\317\31\20\302\3\41\252\203"
+ "\330\37\125\154\351\265\360\333\244\200\100\361\240\125\314\133"
+ "\74\31\71\333\242\200\220\333\307\307\147\54\306\337\125\122"
+ "\346\107\216\34\71\101\323\14\314\144\262\367\364\364\334\202"
+ "\274\166\363\371\36\223\104\357\24\273\27\250\277\47\371\153"
+ "\324\227\204\266\56\44\54\132\303\1\170\54\343\170\366\354"
+ "\231\161\357\336\275\123\301\153\143\221\146\71\257\372\51\343"
+ "\202\314\27\133\23\37\75\171\362\144\0\224\172\72\153\22"
+ "\153\213\2\302\212\250\233\24\124\34\170\122\55\224\54\131"
+ "\262\344\163\22\140\131\0\361\40\67\371\311\174\13\312\126"
+ "\123\346\45\243\171\25\266\0\236\144\312\342\103\74\44\42"
+ "\42\342\175\11\367\73\340\353\321\120\20\343\360\374\115\262"
+ "\213\67\377\326\254\131\143\36\113\374\64\110\266\370\175\61"
+ "\46\116\40\154\64\361\52\113\143\100\70\203\60\7\343\40"
+ "\132\262\353\177\51\12\10\233\223\35\144\123\42\105\121\115"
+ "\261\40\340\345\345\125\105\111\3\341\261\52\361\25\245\134"
+ "\344\106\270\207\32\156\16\113\116\313\361\114\142\132\274\53"
+ "\360\114\45\157\325\371\210\322\365\356\335\273\222\200\267\212"
+ "\312\30\267\27\150\226\303\312\370\116\21\206\276\177\5\374"
+ "\357\134\343\306\215\75\55\10\250\224\107\36\145\336\122\173"
+ "\327\133\36\65\72\311\12\223\132\33\130\243\263\230\376\336"
+ "\275\173\216\62\35\227\55\133\66\11\12\310\36\72\57\10"
+ "\257\130\25\263\134\55\5\44\207\340\155\57\323\63\62\62"
+ "\262\61\217\71\62\113\156\111\156\362\123\342\100\61\177\33"
+ "\64\46\345\241\51\355\132\37\76\174\270\75\133\214\64\1"
+ "\17\117\70\166\354\130\105\5\227\207\207\307\146\360\232\53"
+ "\264\10\203\171\173\272\300\157\34\313\226\55\173\12\165\47"
+ "\223\277\22\210\163\353\370\361\343\325\204\63\65\137\43\315"
+ "\271\37\177\374\161\260\262\10\40\56\36\141\216\77\242\107"
+ "\1\341\170\317\305\60\127\127\327\325\141\141\141\176\361\361"
+ "\361\176\375\372\365\13\201\222\103\326\55\211\144\202\14\345"
+ "\51\44\353\20\272\341\157\161\10\335\22\203\54\207\16\31"
+ "\335\263\147\317\365\64\250\225\163\32\375\373\367\157\245\265"
+ "\272\247\2\342\31\201\17\266\157\337\136\236\136\347\316\235"
+ "\153\224\160\330\232\247\101\350\210\361\230\70\306\313\165\40"
+ "\77\67\67\267\70\65\1\135\355\260\241\216\303\231\106\215"
+ "\370\152\347\22\312\320\200\137\265\152\125\212\55\175\60\232"
+ "\253\30\334\264\373\103\214\310\21\14\140\226\263\263\363\25"
+ "\235\12\10\51\56\213\200\367\6\46\371\111\312\352\276\20"
+ "\116\327\30\223\320\237\275\175\373\366\105\61\241\246\260\63"
+ "\327\241\140\165\340\103\171\64\1\27\201\360\75\34\345\173"
+ "\244\204\273\270\270\134\21\115\244\340\376\102\22\132\351\127"
+ "\212\166\77\202\202\202\174\325\46\254\136\275\172\215\124\316"
+ "\200\364\350\321\143\224\170\106\5\371\165\76\173\366\354\47"
+ "\20\252\107\256\133\267\156\42\362\333\103\27\11\130\73\3"
+ "\202\137\273\47\117\236\170\117\230\60\141\142\271\162\345\326"
+ "\362\301\166\345\34\307\4\133\167\100\204\363\43\277\1\127"
+ "\74\160\256\201\362\60\211\362\240\274\344\266\352\320\241\303"
+ "\156\271\256\140\304\217\300\10\315\175\337\311\311\351\52\332"
+ "\201\126\157\174\341\67\203\363\32\101\214\22\64\130\43\216"
+ "\17\136\261\223\127\314\237\361\341\106\265\363\4\171\61\321"
+ "\365\27\307\6\224\244\223\150\227\365\154\163\237\223\115\121"
+ "\332\251\244\317\306\141\365\21\177\47\352\171\66\43\316\200"
+ "\40\377\323\300\247\334\356\146\317\23\145\51\35\66\314\66"
+ "\237\1\301\257\32\224\220\25\144\246\301\266\342\305\155\121"
+ "\100\150\341\3\202\360\125\202\244\244\244\322\26\154\321\15"
+ "\61\61\61\115\320\256\144\333\235\302\114\213\351\275\211\355"
+ "\325\111\31\50\203\61\260\31\376\47\364\322\223\342\252\341"
+ "\100\233\234\121\51\63\135\331\132\160\347\316\235\164\160\375"
+ "\276\162\66\205\343\164\341\35\322\327\2\3\3\213\174\366"
+ "\331\147\276\22\17\260\252\200\140\42\117\40\123\12\346\5"
+ "\44\64\24\305\273\261\100\201\2\367\124\170\151\301\62\145"
+ "\312\234\101\37\235\117\100\156\105\261\222\167\113\336\174\363"
+ "\315\130\360\366\270\32\65\152\320\345\22\206\352\325\253\107"
+ "\322\273\273\273\173\114\262\320\370\42\76\255\232\256\2\257"
+ "\214\111\114\114\374\254\150\321\242\27\330\14\322\101\312\333"
+ "\121\331\311\222\362\373\17\372\303\241\200\200\200\111\342\42"
+ "\210\270\343\241\246\200\20\257\146\201\255\364\313\126\100\250"
+ "\377\266\156\335\172\325\251\123\247\374\177\375\365\327\240\301"
+ "\203\7\157\220\362\245\25\166\332\141\240\5\264\374\344\166"
+ "\160\160\110\336\1\101\233\335\103\331\175\170\136\311\243\330"
+ "\362\363\12\373\175\51\355\50\21\67\370\370\135\314\267\341"
+ "\340\275\101\340\161\164\121\106\260\321\150\134\151\115\10\146"
+ "\274\336\334\136\16\160\217\260\361\234\202\105\5\44\52\52"
+ "\312\27\163\70\315\215\144\222\124\337\322\116\270\205\76\255"
+ "\273\74\134\237\221\2\235\174\310\117\114\257\326\6\326\350"
+ "\54\361\253\124\327\367\127\254\130\321\353\320\241\103\275\37"
+ "\77\176\74\2\343\225\170\231\332\356\123\21\351\254\327\63"
+ "\66\175\314\311\155\336\117\145\207\62\167\245\112\225\316\240"
+ "\34\233\10\310\115\176\302\274\231\3\362\321\5\344\27\201"
+ "\347\105\12\303\63\236\336\213\27\57\176\101\71\303\105\374"
+ "\4\274\50\26\145\133\376\351\247\237\256\203\233\166\36\213"
+ "\51\371\114\234\70\361\33\360\56\112\67\26\171\34\45\274"
+ "\34\326\21\345\374\337\264\151\323\46\50\246\330\112\336\30"
+ "\327\376\76\76\76\253\231\177\131\125\100\50\36\305\247\164"
+ "\102\371\333\320\370\346\63\163\225\370\14\54\355\100\321\56"
+ "\327\333\131\12\310\337\133\1\41\41\164\56\46\235\153\267"
+ "\157\337\66\257\330\253\234\323\110\26\306\233\67\157\36\105"
+ "\66\176\264\42\213\170\167\302\303\303\147\260\200\56\336\362"
+ "\103\114\155\44\233\337\314\43\246\231\326\74\305\362\202\161"
+ "\257\204\140\160\234\7\276\22\236\237\374\74\75\75\227\133"
+ "\233\30\154\265\215\266\100\67\361\46\261\157\212\24\51\162"
+ "\135\134\175\43\377\256\135\273\56\241\301\154\170\161\300\71"
+ "\210\334\335\273\167\137\250\142\332\245\166\363\105\4\235\213"
+ "\151\320\240\301\76\10\265\223\204\360\234\34\276\21\240\334"
+ "\341\357\207\270\77\100\200\71\247\246\64\211\212\226\200\177"
+ "\13\233\77\221\360\61\26\351\217\122\136\112\70\46\251\371"
+ "\20\30\166\361\66\347\30\270\367\103\230\370\105\242\111\60"
+ "\4\6\62\41\52\41\323\7\114\355\22\160\156\124\312\15"
+ "\367\246\22\45\112\210\66\301\77\50\270\311\44\6\264\271"
+ "\261\164\351\322\201\72\114\260\250\42\331\370\300\155\113\300"
+ "\327\174\216\143\71\30\157\264\126\375\265\126\360\51\15\245"
+ "\135\260\140\1\61\316\257\31\47\341\326\72\4\227\152\162"
+ "\256\132\265\352\121\224\237\316\313\270\100\331\246\113\31\150"
+ "\247\347\101\225\52\125\146\223\162\202\260\50\157\157\157\32"
+ "\43\65\205\235\274\365\310\367\224\134\256\152\325\252\235\104"
+ "\330\72\255\363\23\244\334\240\77\44\333\72\317\232\65\153"
+ "\10\332\346\56\233\71\216\141\232\256\327\72\103\102\312\26"
+ "\342\77\10\11\11\361\266\361\14\210\352\130\232\75\173\366"
+ "\120\340\243\261\75\237\361\33\131\251\113\257\2\222\123\143"
+ "\167\242\352\260\141\303\226\362\315\123\264\15\137\312\332\71"
+ "\225\24\2\250\311\324\237\301\316\222\320\102\23\353\227\137"
+ "\176\271\30\165\373\105\214\3\272\121\175\23\230\336\164\336"
+ "\147\46\275\223\277\136\5\104\302\101\27\152\54\243\367\311"
+ "\223\47\217\320\302\101\273\10\145\313\226\75\203\170\242\231"
+ "\45\51\303\343\205\276\261\261\144\311\222\161\266\360\271\266"
+ "\155\333\156\241\213\4\204\266\13\244\367\166\355\332\155\122"
+ "\303\23\24\24\344\203\376\111\253\243\127\310\255\305\133\241"
+ "\154\223\251\233\251\127\257\136\44\230\31\300\117\314\46\52"
+ "\20\154\146\110\361\373\120\377\131\263\146\15\11\23\331\240"
+ "\30\214\146\101\245\217\265\72\160\370\261\122\245\112\35\1"
+ "\157\231\52\267\277\45\5\204\170\65\361\154\344\65\374\145"
+ "\53\40\340\11\17\134\135\135\327\342\71\26\212\34\361\336"
+ "\75\262\2\2\372\36\341\376\105\273\166\307\133\266\154\31"
+ "\256\204\143\236\243\113\17\116\162\337\241\272\46\237\1\101"
+ "\274\10\276\20\201\302\2\200\347\250\210\273\113\227\56\153"
+ "\101\357\303\214\333\227\171\306\26\153\12\110\213\26\55\350"
+ "\22\202\143\214\167\14\227\57\303\24\20\22\132\41\230\373"
+ "\200\46\264\273\113\12\131\203\314\124\100\270\76\307\271\376"
+ "\143\210\236\220\153\42\304\364\152\155\140\215\316\226\362\27"
+ "\346\335\0\360\57\243\263\263\363\322\174\371\362\211\273\342"
+ "\6\336\5\115\161\3\31\235\371\103\374\215\302\134\274\117"
+ "\115\76\31\61\142\204\77\355\112\22\220\133\356\207\50\363"
+ "\112\340\171\322\244\111\223\60\172\157\334\270\361\72\172\157"
+ "\325\252\125\250\20\157\74\144\265\233\367\356\335\253\16\271"
+ "\254\16\334\64\147\217\20\306\215\33\346\174\132\134\210\35"
+ "\76\174\370\150\141\47\365\230\273\273\373\61\364\353\311\62"
+ "\377\45\223\107\310\212\272\316\200\30\370\73\165\24\137\62"
+ "\147\267\372\313\62\301\172\5\237\226\356\362\26\47\173\150"
+ "\265\161\201\201\201\323\24\301\113\74\247\21\34\34\234\342"
+ "\233\7\350\200\133\6\15\32\104\312\205\43\176\127\122\255"
+ "\74\275\60\201\231\204\116\171\201\7\162\354\204\11\23\102"
+ "\322\223\247\342\336\265\153\127\163\276\145\245\237\20\336\217"
+ "\374\166\357\336\335\344\257\120\100\300\104\242\32\66\154\230"
+ "\352\132\307\337\177\377\275\106\243\106\215\42\100\207\173\4"
+ "\30\360\341\360\253\246\307\266\336\302\312\275\371\166\30\114"
+ "\344\301\54\70\74\241\135\200\12\25\52\154\71\176\374\170"
+ "\157\13\365\117\101\107\57\57\257\111\234\76\11\23\340\5"
+ "\224\163\303\345\313\227\333\11\375\306\243\176\375\372\253\120"
+ "\356\133\144\46\125\276\174\371\275\300\337\105\332\165\72\10"
+ "\141\160\272\32\175\350\340\32\4\145\132\75\61\177\7\4"
+ "\356\203\242\35\374\107\37\175\64\3\170\151\305\53\21\112"
+ "\350\376\345\313\227\117\144\233\174\253\12\210\312\151\74\72"
+ "\307\321\230\316\161\330\312\260\370\374\10\245\165\321\331\147"
+ "\122\61\321\105\213\26\321\215\153\44\64\115\173\357\275\367"
+ "\76\74\173\366\354\320\47\117\236\214\72\172\364\150\53\10"
+ "\350\263\372\367\357\77\113\261\153\126\322\330\333\333\107\217"
+ "\34\71\162\224\234\27\374\150\245\55\132\243\37\74\242\303"
+ "\216\120\324\306\10\345\167\302\30\232\307\66\367\117\320\226"
+ "\347\73\167\356\74\125\45\375\37\350\47\327\334\334\334\166"
+ "\205\205\205\115\241\33\275\154\74\3\242\105\77\247\205\13"
+ "\27\116\107\271\16\241\75\151\134\46\242\137\34\200\220\275"
+ "\50\35\12\10\115\74\15\245\13\64\104\201\260\322\350\321"
+ "\243\27\363\125\310\115\164\216\45\203\336\62\50\77\214\325"
+ "\52\20\122\243\245\63\103\116\376\376\376\13\350\60\64\105"
+ "\241\147\100\100\300\2\362\327\253\200\110\70\150\67\213\306"
+ "\303\26\153\267\172\141\302\17\100\277\111\336\45\31\72\164"
+ "\150\60\150\115\143\54\11\264\277\11\101\45\222\166\112\154"
+ "\341\163\267\156\335\152\14\141\54\214\372\15\274\36\323\23"
+ "\202\112\330\335\273\167\33\252\341\241\33\316\40\144\304\20"
+ "\220\133\153\234\34\70\160\240\26\372\144\322\216\35\73\314"
+ "\147\245\300\267\253\220\211\45\231\154\110\46\265\33\72\164"
+ "\350\260\65\171\354\143\56\151\337\276\375\66\362\327\251\200"
+ "\150\202\45\5\204\176\340\331\21\304\273\137\266\2\102\343"
+ "\25\155\117\364\376\235\166\135\241\354\315\227\313\333\272\165"
+ "\353\120\264\351\15\342\275\325\253\127\337\1\336\334\114\11"
+ "\277\171\363\146\243\367\337\177\237\256\65\277\114\341\230\127"
+ "\146\53\270\51\136\265\152\325\166\262\151\353\215\66\155\332"
+ "\204\212\270\37\75\172\124\7\364\136\202\261\105\207\372\223"
+ "\60\7\234\36\60\140\100\220\65\5\44\76\76\276\205\207"
+ "\207\107\62\136\314\15\233\45\63\75\133\24\220\154\32\213"
+ "\13\16\207\17\37\376\6\155\102\213\166\76\231\251\200\120"
+ "\175\350\54\14\231\377\22\324\252\125\153\73\371\211\351\325"
+ "\332\300\32\235\255\51\40\120\310\47\143\214\321\270\177\214"
+ "\361\161\152\352\324\251\63\105\332\167\353\326\155\23\311\12"
+ "\42\256\145\313\226\371\100\316\242\271\372\61\135\200\202\366"
+ "\373\136\155\116\114\112\112\162\307\134\172\233\200\334\162\77"
+ "\234\74\171\62\131\75\230\300\173\76\345\35\165\172\232\246"
+ "\114\231\222\174\101\20\361\156\314\351\363\170\221\57\333\304"
+ "\211\23\277\105\71\167\211\371\174\370\341\207\53\341\167\37"
+ "\112\212\273\116\131\306\300\62\36\271\113\260\222\241\326\57"
+ "\310\377\15\356\257\266\334\202\365\312\51\40\131\137\102\27"
+ "\236\311\104\321\370\242\67\153\232\164\210\370\7\164\376\30"
+ "\305\134\301\300\37\357\243\155\121\122\46\204\370\324\141\151"
+ "\65\204\4\310\317\20\66\43\125\107\60\231\357\334\157\210"
+ "\60\22\166\276\124\160\247\65\117\1\157\136\14\200\15\20"
+ "\146\223\40\40\264\65\333\241\347\314\265\11\314\42\367\332"
+ "\265\153\333\41\315\143\133\276\332\111\12\32\322\30\125\342"
+ "\230\265\161\55\272\341\237\37\245\63\13\223\371\354\57\173"
+ "\173\173\33\41\24\315\223\342\210\137\102\247\37\255\246\22"
+ "\323\62\51\70\344\362\51\70\325\302\370\27\210\242\75\101"
+ "\170\45\66\307\50\314\7\263\242\31\267\152\375\305\172\62"
+ "\176\45\75\235\53\41\341\231\126\324\350\114\306\37\102\33"
+ "\321\165\217\65\230\61\320\204\265\25\341\111\102\70\175\141"
+ "\235\156\14\72\253\102\237\302\154\217\252\330\227\307\163\372"
+ "\73\34\116\166\336\144\262\106\333\304\264\352\265\3\141\127"
+ "\325\350\153\353\327\160\63\63\236\334\137\270\254\105\374\374"
+ "\374\46\201\261\267\171\376\374\371\126\266\355\175\312\46\55"
+ "\356\154\372\324\134\112\363\5\323\43\126\152\47\62\251\151"
+ "\1\377\131\52\375\100\371\230\340\26\204\137\23\332\41\325"
+ "\227\320\151\105\112\112\57\176\11\235\302\257\213\264\126\253"
+ "\267\330\27\345\61\42\361\17\67\316\337\225\373\12\335\326"
+ "\264\127\31\277\232\351\231\226\52\355\115\67\107\125\160\161"
+ "\161\251\5\241\240\270\32\16\272\202\332\360\342\226\262\325"
+ "\310\61\306\332\130\122\313\137\253\14\102\30\325\205\316\70"
+ "\270\12\145\263\343\253\302\233\160\273\336\341\276\173\116\356"
+ "\273\226\372\222\200\243\120\345\312\225\273\136\274\170\361\172"
+ "\102\102\2\231\336\75\320\302\101\327\300\122\32\72\110\317"
+ "\161\10\107\135\246\73\231\23\321\356\7\55\170\44\350\345"
+ "\163\370\107\175\224\56\252\250\302\273\312\367\231\267\357\243"
+ "\263\1\32\274\344\63\246\357\367\26\306\11\355\140\321\215"
+ "\206\337\322\155\105\374\376\65\277\77\25\362\47\323\305\253"
+ "\360\213\24\360\223\362\123\14\355\32\152\251\16\126\370\244"
+ "\301\274\12\373\102\6\40\267\237\360\45\364\27\36\176\176"
+ "\136\23\46\114\360\115\114\114\164\23\276\312\354\153\172\301"
+ "\162\304\272\244\372\142\271\36\376\141\141\356\50\303\374\300"
+ "\221\171\367\176\346\225\106\376\272\62\225\203\316\237\325\141"
+ "\141\235\170\163\204\131\131\175\21\116\155\326\220\333\54\7"
+ "\217\347\50\306\235\203\115\262\52\362\230\47\334\115\5\334"
+ "\204\257\46\363\165\72\337\104\147\21\350\212\352\263\102\337"
+ "\124\243\63\355\10\216\34\61\142\304\163\10\267\166\235\72"
+ "\165\52\161\372\364\351\116\17\37\76\164\260\320\137\265\306"
+ "\167\11\270\343\314\102\256\224\226\317\155\164\67\327\331\316"
+ "\260\107\114\247\62\76\215\152\357\72\313\223\203\351\122\221"
+ "\203\111\300\337\56\314\177\346\357\267\310\155\240\204\253\321"
+ "\231\57\161\261\323\314\377\205\377\333\334\166\104\173\262\362"
+ "\330\46\311\126\144\15\322\200\346\105\241\254\305\230\327\71"
+ "\161\177\371\211\115\170\215\322\230\123\276\375\101\277\251\44"
+ "\147\110\74\207\346\172\262\62\230\111\374\237\27\115\310\304"
+ "\164\232\60\57\323\234\116\213\111\247\205\371\250\36\310\261"
+ "\204\363\311\135\250\120\241\260\52\125\252\344\333\271\163\147"
+ "\103\75\262\214\122\76\132\200\300\217\144\244\133\346\361\230"
+ "\172\156\47\232\25\205\162\336\3\175\54\157\132\347\351\254"
+ "\57\241\277\142\117\235\147\100\164\153\230\66\306\63\145\124"
+ "\236\202\66\335\120\374\316\0\271\351\213\263\172\362\320\373"
+ "\345\120\235\73\107\112\334\201\312\212\162\172\126\307\62\42"
+ "\355\77\55\334\132\133\144\140\77\115\127\133\321\16\107\104"
+ "\104\304\204\222\45\113\156\341\133\211\176\247\225\61\127\127"
+ "\327\75\143\307\216\65\146\106\371\136\306\127\162\63\142\54"
+ "\351\136\271\372\223\147\323\345\15\347\346\315\233\347\367\62"
+ "\312\230\31\165\261\45\174\343\306\215\3\371\166\31\347\227"
+ "\321\156\31\35\107\165\334\252\175\251\130\307\167\62\62\251"
+ "\216\352\27\210\200\147\23\357\226\343\331\270\3\142\64\350"
+ "\370\10\333\313\250\363\113\370\202\167\50\233\155\221\231\336"
+ "\111\372\116\124\132\370\71\370\142\210\164\41\207\356\271\377"
+ "\45\362\315\14\377\342\174\132\332\356\25\373\22\72\365\353"
+ "\161\364\175\63\360\254\217\155\255\227\227\227\127\30\177\310"
+ "\123\353\166\264\347\164\311\10\235\11\116\117\371\263\114\260"
+ "\262\24\20\213\207\300\323\253\200\350\331\346\316\250\1\153"
+ "\313\227\320\263\24\220\314\121\100\376\12\305\42\55\155\145"
+ "\276\256\360\305\355\153\164\13\10\135\223\71\24\360\21\177"
+ "\37\44\113\1\321\251\200\340\67\232\17\27\72\277\214\62"
+ "\376\325\12\10\177\250\164\230\162\145\147\226\2\222\261\165"
+ "\124\271\100\104\167\74\255\257\234\253\50\67\26\157\113\374"
+ "\47\50\40\115\233\66\235\5\345\341\22\55\254\170\170\170"
+ "\354\76\177\376\174\333\64\52\40\17\173\365\352\265\72\113"
+ "\1\371\333\51\40\4\317\172\364\350\261\112\76\150\256\223"
+ "\47\320\307\152\377\113\374\135\115\1\241\357\245\360\234\371"
+ "\356\337\135\1\371\327\233\140\245\330\42\242\237\350\126\176"
+ "\152\176\226\176\172\343\13\333\327\152\235\104\317\166\232\132"
+ "\174\113\146\144\172\363\320\223\277\55\171\152\341\113\313\366"
+ "\174\106\244\375\247\205\353\241\165\132\373\130\106\304\263\265"
+ "\77\147\144\371\322\33\236\331\375\64\63\306\133\146\265\117"
+ "\146\324\345\337\220\217\146\73\152\310\14\242\51\323\137\321"
+ "\277\365\362\153\275\270\55\230\200\31\265\346\334\314\252\163"
+ "\146\321\123\60\341\241\157\157\220\111\22\231\117\223\331\155"
+ "\70\231\323\331\312\317\361\217\316\217\222\271\323\317\172\353"
+ "\223\326\176\230\326\160\75\146\224\52\13\11\106\331\354\50"
+ "\275\155\367\262\306\271\236\362\161\137\67\37\244\247\266\113"
+ "\157\237\124\61\315\313\20\36\376\52\230\140\375\137\200\1"
+ "\0\143\140\4\2\356\332\116\327\0\0\0\0\111\105\116"
+ "\104\256\102\140\202" },
{ ":knob.png", 3597,
"\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122"
"\0\0\0\71\0\0\0\71\10\6\0\0\0\214\30\203"
@@ -815,174 +1446,177 @@ const rc_data_t rc_data[] =
{ ":pushbutton_b.png", 203,
"\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122"
"\0\0\0\1\0\0\0\14\10\6\0\0\0\243\213\327"
- "\127\0\0\0\6\142\113\107\104\0\377\0\377\0\377\240"
- "\275\247\223\0\0\0\11\160\110\131\163\0\0\15\327\0"
+ "\127\0\0\0\6\142\113\107\104\0\377\0\0\0\377\36"
+ "\45\223\176\0\0\0\11\160\110\131\163\0\0\15\327\0"
"\0\15\327\1\102\50\233\170\0\0\0\7\164\111\115\105"
- "\7\335\3\33\12\22\21\275\37\332\350\0\0\0\31\164"
+ "\7\335\4\4\22\37\56\26\270\340\211\0\0\0\31\164"
"\105\130\164\103\157\155\155\145\156\164\0\103\162\145\141\164"
"\145\144\40\167\151\164\150\40\107\111\115\120\127\201\16\27"
"\0\0\0\63\111\104\101\124\10\327\45\306\61\21\200\0"
- "\14\4\260\334\167\304\277\4\34\324\104\125\260\43\200\211"
+ "\14\4\260\334\167\306\277\4\14\324\104\125\140\200\235\205"
"\273\62\220\51\272\173\263\273\2\377\146\6\234\301\23\334"
- "\301\125\70\12\12\357\7\174\326\17\363\36\64\324\31\0"
+ "\301\125\70\12\12\357\7\175\156\17\372\347\52\207\250\0"
"\0\0\0\111\105\116\104\256\102\140\202" },
- { ":pushbutton_bl.png", 371,
+ { ":pushbutton_bl.png", 397,
"\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122"
- "\0\0\0\11\0\0\0\14\10\6\0\0\0\260\134\227"
- "\243\0\0\0\6\142\113\107\104\0\377\0\377\0\377\240"
- "\275\247\223\0\0\0\11\160\110\131\163\0\0\15\327\0"
+ "\0\0\0\13\0\0\0\14\10\6\0\0\0\264\251\107"
+ "\236\0\0\0\6\142\113\107\104\0\377\0\0\0\377\36"
+ "\45\223\176\0\0\0\11\160\110\131\163\0\0\15\327\0"
"\0\15\327\1\102\50\233\170\0\0\0\7\164\111\115\105"
- "\7\335\3\34\22\21\3\352\151\62\22\0\0\0\35\151"
- "\124\130\164\103\157\155\155\145\156\164\0\0\0\0\0\103"
- "\162\145\141\164\145\144\40\167\151\164\150\40\107\111\115\120"
- "\144\56\145\7\0\0\0\327\111\104\101\124\30\323\135\320"
- "\315\112\303\120\20\100\341\57\367\336\246\12\375\161\221\105"
- "\165\43\372\12\335\371\152\175\50\237\247\24\264\40\6\212"
- "\324\46\56\264\142\44\156\156\212\164\140\26\63\234\71\63"
- "\114\201\210\113\124\270\133\255\126\217\313\345\162\136\226\245"
- "\41\202\263\150\232\146\333\266\255\276\357\117\31\63\70\312"
- "\266\53\204\305\142\361\120\125\125\21\143\44\257\12\110\31"
- "\232\325\165\135\114\247\323\131\10\341\66\245\124\244\224\116"
- "\120\304\30\23\314\327\353\165\273\333\355\232\256\353\46\373"
- "\375\276\54\62\124\142\206\33\334\347\274\306\34\145\314\367"
- "\26\331\66\312\3\343\174\102\100\37\63\60\200\203\71\240"
- "\107\207\237\260\331\154\372\177\215\117\274\343\25\133\74\343"
- "\51\145\313\0\35\163\375\213\57\34\160\21\340\314\166\104"
- "\213\67\324\170\71\175\374\14\374\316\253\77\160\370\3\27"
- "\353\115\7\65\0\373\153\0\0\0\0\111\105\116\104\256"
- "\102\140\202" },
- { ":pushbutton_br.png", 371,
+ "\7\335\4\4\22\37\23\116\320\254\230\0\0\0\31\164"
+ "\105\130\164\103\157\155\155\145\156\164\0\103\162\145\141\164"
+ "\145\144\40\167\151\164\150\40\107\111\115\120\127\201\16\27"
+ "\0\0\0\365\111\104\101\124\50\317\145\221\73\116\304\60"
+ "\24\105\217\77\361\200\230\144\246\110\21\150\20\110\136\101"
+ "\72\266\226\105\261\236\310\15\115\42\271\10\44\24\20\104"
+ "\6\323\74\43\30\54\335\302\357\176\336\265\254\0\3\134"
+ "\2\65\160\327\165\335\143\333\266\7\347\34\347\107\237\17"
+ "\346\171\176\132\226\205\224\322\77\30\61\24\222\176\4\164"
+ "\323\64\17\165\135\53\143\314\237\240\54\266\42\256\306\161"
+ "\124\145\131\126\132\353\133\153\255\262\326\222\115\131\154\200"
+ "\35\260\7\16\175\337\57\61\306\171\333\266\375\64\115\56"
+ "\306\130\14\303\200\22\261\3\52\340\6\270\27\134\3\7"
+ "\341\14\240\162\51\45\203\102\310\235\124\323\100\2\276\200"
+ "\223\21\141\66\344\115\131\264\1\237\300\12\254\66\204\220"
+ "\274\367\231\170\3\236\305\274\2\13\160\45\233\214\25\42"
+ "\213\127\271\237\200\167\340\5\270\220\172\106\205\20\0\360"
+ "\336\347\32\126\340\4\105\176\340\317\17\206\20\322\257\15"
+ "\37\122\351\125\322\47\140\372\6\376\164\126\55\226\0\10"
+ "\320\0\0\0\0\111\105\116\104\256\102\140\202" },
+ { ":pushbutton_br.png", 388,
"\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122"
- "\0\0\0\11\0\0\0\14\10\6\0\0\0\260\134\227"
- "\243\0\0\0\6\142\113\107\104\0\377\0\377\0\377\240"
- "\275\247\223\0\0\0\11\160\110\131\163\0\0\15\327\0"
+ "\0\0\0\13\0\0\0\14\10\6\0\0\0\264\251\107"
+ "\236\0\0\0\6\142\113\107\104\0\377\0\0\0\377\36"
+ "\45\223\176\0\0\0\11\160\110\131\163\0\0\15\327\0"
"\0\15\327\1\102\50\233\170\0\0\0\7\164\111\115\105"
- "\7\335\3\34\22\21\25\36\275\207\103\0\0\0\35\151"
- "\124\130\164\103\157\155\155\145\156\164\0\0\0\0\0\103"
- "\162\145\141\164\145\144\40\167\151\164\150\40\107\111\115\120"
- "\144\56\145\7\0\0\0\327\111\104\101\124\30\323\135\320"
- "\115\116\2\101\20\6\320\207\316\312\333\171\50\56\342\31"
- "\130\271\163\303\142\20\22\127\44\166\202\46\223\370\223\70"
- "\100\53\2\63\3\264\233\206\114\254\244\322\265\170\225\257"
- "\273\7\243\321\50\311\325\266\255\351\164\32\207\303\341\55"
- "\136\360\25\102\330\24\51\135\214\30\243\365\172\375\352\137"
- "\135\235\207\256\353\124\125\225\312\262\274\107\312\15\212\246"
- "\151\304\30\125\125\225\146\263\331\303\144\62\171\306\261\17"
- "\213\361\170\274\253\353\372\253\54\313\307\371\174\376\204\6"
- "\135\17\32\340\16\55\42\336\261\310\375\206\357\20\302\276"
- "\300\6\73\54\121\143\205\337\274\170\204\2\237\31\56\361"
- "\221\341\117\106\247\63\132\344\315\125\6\113\154\161\270\134"
- "\34\1\373\14\67\371\334\367\321\165\36\142\216\330\346\230"
- "\3\122\10\341\362\272\233\234\175\352\377\317\31\300\37\46"
- "\315\205\366\5\205\205\232\0\0\0\0\111\105\116\104\256"
- "\102\140\202" },
- { ":pushbutton_c.png", 187,
+ "\7\335\4\4\22\36\53\177\311\45\107\0\0\0\31\164"
+ "\105\130\164\103\157\155\155\145\156\164\0\103\162\145\141\164"
+ "\145\144\40\167\151\164\150\40\107\111\115\120\127\201\16\27"
+ "\0\0\0\354\111\104\101\124\50\317\145\220\101\116\205\60"
+ "\24\105\17\206\241\173\160\115\56\212\255\270\2\106\316\34"
+ "\122\204\304\21\321\46\137\223\46\352\0\376\247\212\226\337"
+ "\176\250\223\7\41\330\344\246\351\315\271\367\245\57\311\363"
+ "\74\262\73\336\173\252\252\262\131\226\335\2\257\100\253\265"
+ "\36\322\30\377\261\130\153\351\373\376\155\357\137\355\215\20"
+ "\2\306\230\250\224\272\7\242\10\200\265\331\173\217\265\26"
+ "\143\114\254\353\372\241\54\313\27\140\332\6\322\242\50\0"
+ "\160\316\271\256\353\132\245\324\143\323\64\117\300\31\10\233"
+ "\0\11\160\47\217\11\360\200\5\76\200\203\350\35\370\322"
+ "\132\217\51\340\200\131\132\34\160\4\72\340\4\374\110\301"
+ "\4\220\2\55\160\21\163\20\370\123\2\337\342\317\13\174"
+ "\220\344\131\232\116\2\36\201\137\51\212\13\374\54\160\0"
+ "\106\11\14\162\217\133\70\1\156\66\37\14\62\326\13\164"
+ "\1\242\326\172\205\257\67\273\234\105\353\176\27\20\340\17"
+ "\135\206\230\366\33\115\352\110\0\0\0\0\111\105\116\104"
+ "\256\102\140\202" },
+ { ":pushbutton_c.png", 188,
"\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122"
- "\0\0\0\1\0\0\0\113\10\6\0\0\0\261\326\355"
- "\203\0\0\0\6\142\113\107\104\0\377\0\377\0\377\240"
- "\275\247\223\0\0\0\11\160\110\131\163\0\0\15\327\0"
+ "\0\0\0\1\0\0\0\110\10\6\0\0\0\67\102\237"
+ "\55\0\0\0\6\142\113\107\104\0\377\0\0\0\377\36"
+ "\45\223\176\0\0\0\11\160\110\131\163\0\0\15\327\0"
"\0\15\327\1\102\50\233\170\0\0\0\7\164\111\115\105"
- "\7\335\3\33\12\24\71\336\360\325\224\0\0\0\31\164"
+ "\7\335\4\4\22\41\26\177\177\103\152\0\0\0\31\164"
"\105\130\164\103\157\155\155\145\156\164\0\103\162\145\141\164"
"\145\144\40\167\151\164\150\40\107\111\115\120\127\201\16\27"
- "\0\0\0\43\111\104\101\124\30\323\143\170\371\362\345\177"
- "\246\377\377\377\63\60\61\60\60\60\100\130\330\270\104\50"
- "\41\135\307\210\65\24\0\171\301\237\263\327\100\36\246\0"
- "\0\0\0\111\105\116\104\256\102\140\202" },
- { ":pushbutton_l.png", 325,
+ "\0\0\0\44\111\104\101\124\30\323\143\170\376\374\371\177"
+ "\246\377\377\377\63\60\61\60\60\60\100\130\10\2\115\14"
+ "\77\227\72\112\206\247\241\0\266\325\231\255\347\272\327\152"
+ "\0\0\0\0\111\105\116\104\256\102\140\202" },
+ { ":pushbutton_l.png", 303,
"\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122"
- "\0\0\0\11\0\0\0\113\10\6\0\0\0\242\1\255"
- "\167\0\0\0\6\142\113\107\104\0\377\0\377\0\377\240"
- "\275\247\223\0\0\0\11\160\110\131\163\0\0\15\327\0"
+ "\0\0\0\13\0\0\0\110\10\6\0\0\0\40\140\17"
+ "\344\0\0\0\6\142\113\107\104\0\377\0\0\0\377\36"
+ "\45\223\176\0\0\0\11\160\110\131\163\0\0\15\327\0"
"\0\15\327\1\102\50\233\170\0\0\0\7\164\111\115\105"
- "\7\335\3\34\22\22\5\50\47\304\344\0\0\0\35\151"
- "\124\130\164\103\157\155\155\145\156\164\0\0\0\0\0\103"
- "\162\145\141\164\145\144\40\167\151\164\150\40\107\111\115\120"
- "\144\56\145\7\0\0\0\251\111\104\101\124\110\307\355\225"
- "\313\16\302\40\20\105\17\123\252\46\106\377\377\17\375\0"
- "\22\226\203\33\60\210\324\66\244\76\320\316\206\315\345\334"
- "\311\5\6\3\30\100\200\75\160\366\336\137\234\163\344\145"
- "\343\52\300\16\70\205\20\10\41\334\211\44\222\206\50\72"
- "\252\52\145\331\314\156\4\16\65\122\262\113\264\121\125\253"
- "\166\111\144\200\241\24\344\244\233\260\106\262\345\256\105\242"
- "\251\10\36\110\317\172\232\44\55\352\111\152\244\131\273\346"
- "\10\332\355\214\61\363\21\54\42\211\310\112\75\225\244\27"
- "\36\160\363\175\372\364\55\370\202\10\336\374\244\272\170\346"
- "\133\4\375\16\326\55\202\77\370\357\272\234\164\77\25\301"
- "\25\42\163\164\67\333\211\312\21\0\0\0\0\111\105\116"
- "\104\256\102\140\202" },
- { ":pushbutton_r.png", 312,
+ "\7\335\4\4\22\40\40\251\336\347\262\0\0\0\31\164"
+ "\105\130\164\103\157\155\155\145\156\164\0\103\162\145\141\164"
+ "\145\144\40\167\151\164\150\40\107\111\115\120\127\201\16\27"
+ "\0\0\0\227\111\104\101\124\110\307\355\226\113\12\303\60"
+ "\14\104\237\224\204\256\173\200\334\377\50\275\217\301\133\253"
+ "\233\120\322\340\64\66\371\340\24\171\143\60\243\141\170\210"
+ "\301\2\164\300\3\170\2\143\10\341\25\143\44\167\372\351"
+ "\226\151\150\110\51\141\146\131\261\316\304\2\164\153\302\271"
+ "\363\147\340\227\163\277\174\250\22\233\331\146\346\57\347\222"
+ "\314\233\316\125\231\65\347\134\34\343\60\164\373\143\210\110"
+ "\71\272\52\147\125\75\51\363\232\363\205\213\164\330\76\267"
+ "\272\165\67\100\327\110\25\374\105\175\71\272\233\241\153\244"
+ "\12\34\235\377\67\274\371\35\35\360\6\177\141\144\377\377"
+ "\366\363\344\0\0\0\0\111\105\116\104\256\102\140\202" },
+ { ":pushbutton_r.png", 288,
"\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122"
- "\0\0\0\11\0\0\0\113\10\6\0\0\0\242\1\255"
- "\167\0\0\0\6\142\113\107\104\0\377\0\377\0\377\240"
- "\275\247\223\0\0\0\11\160\110\131\163\0\0\15\327\0"
+ "\0\0\0\13\0\0\0\110\10\6\0\0\0\40\140\17"
+ "\344\0\0\0\6\142\113\107\104\0\377\0\0\0\377\36"
+ "\45\223\176\0\0\0\11\160\110\131\163\0\0\15\327\0"
"\0\15\327\1\102\50\233\170\0\0\0\7\164\111\115\105"
- "\7\335\3\34\22\22\24\102\227\344\26\0\0\0\35\151"
- "\124\130\164\103\157\155\155\145\156\164\0\0\0\0\0\103"
- "\162\145\141\164\145\144\40\167\151\164\150\40\107\111\115\120"
- "\144\56\145\7\0\0\0\234\111\104\101\124\110\307\355\225"
- "\315\12\204\40\30\105\217\375\14\141\370\0\275\377\143\371"
- "\4\156\147\125\14\151\33\213\161\310\50\250\30\245\273\23"
- "\56\307\217\253\127\205\61\306\361\45\245\24\122\312\16\170"
- "\3\203\326\172\254\234\13\74\370\265\2\172\340\3\214\5"
- "\77\262\326\2\264\300\13\50\1\142\244\6\250\201\142\325"
- "\344\111\265\247\10\146\347\12\151\66\210\55\322\142\330\62"
- "\5\212\15\36\50\26\301\161\322\256\231\142\21\34\47\135"
- "\270\335\171\246\233\43\70\357\200\223\275\5\177\20\301\315"
- "\225\112\242\346\117\4\171\125\352\211\40\243\377\56\331\227"
- "\56\253\10\46\371\206\205\334\51\373\235\147\0\0\0\0"
- "\111\105\116\104\256\102\140\202" },
- { ":pushbutton_t.png", 193,
+ "\7\335\4\4\22\40\70\272\262\177\344\0\0\0\31\164"
+ "\105\130\164\103\157\155\155\145\156\164\0\103\162\145\141\164"
+ "\145\144\40\167\151\164\150\40\107\111\115\120\127\201\16\27"
+ "\0\0\0\210\111\104\101\124\110\307\355\226\313\12\200\40"
+ "\24\104\217\75\126\202\377\323\377\177\206\313\26\56\333\265"
+ "\324\66\25\5\212\75\210\314\234\245\14\303\160\270\14\12"
+ "\143\214\303\43\51\45\112\251\16\350\201\101\153\75\66\316"
+ "\171\275\130\153\1\132\240\6\4\100\105\100\163\310\142\24"
+ "\0\261\344\325\170\304\274\123\320\354\173\17\166\276\235\174"
+ "\252\163\14\335\365\344\27\152\74\147\116\4\335\163\207\224"
+ "\375\325\45\214\56\221\51\310\152\276\12\272\217\240\113\144"
+ "\12\12\272\362\337\370\355\24\24\164\133\115\61\322\163\304"
+ "\255\217\130\313\0\0\0\0\111\105\116\104\256\102\140\202" },
+ { ":pushbutton_t.png", 191,
"\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122"
"\0\0\0\1\0\0\0\12\10\6\0\0\0\165\322\64"
- "\112\0\0\0\6\142\113\107\104\0\377\0\377\0\377\240"
- "\275\247\223\0\0\0\11\160\110\131\163\0\0\15\327\0"
+ "\112\0\0\0\6\142\113\107\104\0\377\0\0\0\377\36"
+ "\45\223\176\0\0\0\11\160\110\131\163\0\0\15\327\0"
"\0\15\327\1\102\50\233\170\0\0\0\7\164\111\115\105"
- "\7\335\3\33\12\23\62\6\143\232\333\0\0\0\31\164"
+ "\7\335\4\4\22\40\7\14\324\122\331\0\0\0\31\164"
"\105\130\164\103\157\155\155\145\156\164\0\103\162\145\141\164"
"\145\144\40\167\151\164\150\40\107\111\115\120\127\201\16\27"
- "\0\0\0\51\111\104\101\124\10\327\115\311\241\1\0\60"
- "\14\303\60\57\377\177\330\37\172\102\74\62\60\42\42\146"
- "\206\0\37\0\207\266\146\167\211\372\126\345\2\70\104\17"
- "\136\250\47\301\15\0\0\0\0\111\105\116\104\256\102\140"
- "\202" },
- { ":pushbutton_tl.png", 267,
+ "\0\0\0\47\111\104\101\124\10\327\105\306\101\15\0\60"
+ "\10\4\260\16\377\16\361\200\4\156\237\45\373\64\325\335"
+ "\340\330\335\324\314\250\44\12\157\37\270\65\372\25\130\10"
+ "\200\277\321\0\0\0\0\111\105\116\104\256\102\140\202" },
+ { ":pushbutton_tl.png", 305,
"\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122"
- "\0\0\0\12\0\0\0\12\10\6\0\0\0\215\62\317"
- "\275\0\0\0\6\142\113\107\104\0\377\0\377\0\377\240"
- "\275\247\223\0\0\0\11\160\110\131\163\0\0\15\327\0"
+ "\0\0\0\13\0\0\0\12\10\6\0\0\0\142\360\244"
+ "\203\0\0\0\6\142\113\107\104\0\377\0\0\0\377\36"
+ "\45\223\176\0\0\0\11\160\110\131\163\0\0\15\327\0"
"\0\15\327\1\102\50\233\170\0\0\0\7\164\111\115\105"
- "\7\335\3\33\12\24\13\26\47\204\24\0\0\0\31\164"
+ "\7\335\4\4\22\35\41\264\61\237\232\0\0\0\31\164"
"\105\130\164\103\157\155\155\145\156\164\0\103\162\145\141\164"
"\145\144\40\167\151\164\150\40\107\111\115\120\127\201\16\27"
- "\0\0\0\163\111\104\101\124\30\323\305\316\61\12\205\60"
- "\20\4\320\331\45\305\57\162\215\34\301\346\303\277\325\27"
- "\354\75\146\56\220\72\105\10\31\310\332\250\50\210\330\71"
- "\335\62\217\145\44\306\210\47\121\74\314\113\60\204\40\356"
- "\256\44\371\125\325\261\367\76\270\53\0\100\132\153\23\200"
- "\271\224\242\44\341\256\120\112\351\147\146\163\316\131\315\354"
- "\274\161\103\0\234\367\376\137\153\335\21\200\323\107\131\357"
- "\217\210\14\44\161\204\13\73\106\56\163\141\43\263\272\0"
- "\0\0\0\111\105\116\104\256\102\140\202" },
- { ":pushbutton_tr.png", 286,
+ "\0\0\0\231\111\104\101\124\30\323\215\320\101\12\302\100"
+ "\14\100\321\237\130\124\260\172\0\367\163\4\67\202\267\122"
+ "\160\337\143\366\0\166\335\302\120\32\230\270\351\100\113\113"
+ "\65\253\131\74\376\220\110\135\327\374\73\305\57\20\102\220"
+ "\115\34\102\20\63\273\253\352\53\245\164\3\256\13\74\126"
+ "\144\30\206\67\120\305\30\325\314\110\51\315\313\31\66\115"
+ "\363\160\367\252\155\133\165\367\331\217\72\205\100\121\226\345"
+ "\263\357\373\5\234\226\145\174\37\105\344\146\146\254\341\134"
+ "\124\340\0\134\142\214\237\256\353\66\117\247\300\36\70\273"
+ "\373\152\65\43\1\166\43\76\345\315\327\346\13\364\354\101"
+ "\142\251\63\303\12\0\0\0\0\111\105\116\104\256\102\140"
+ "\202" },
+ { ":pushbutton_tr.png", 333,
"\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122"
- "\0\0\0\12\0\0\0\12\10\6\0\0\0\215\62\317"
- "\275\0\0\0\6\142\113\107\104\0\377\0\377\0\377\240"
- "\275\247\223\0\0\0\11\160\110\131\163\0\0\15\327\0"
+ "\0\0\0\13\0\0\0\12\10\6\0\0\0\142\360\244"
+ "\203\0\0\0\6\142\113\107\104\0\377\0\0\0\377\36"
+ "\45\223\176\0\0\0\11\160\110\131\163\0\0\15\327\0"
"\0\15\327\1\102\50\233\170\0\0\0\7\164\111\115\105"
- "\7\335\3\33\12\23\37\103\274\306\256\0\0\0\31\164"
+ "\7\335\4\4\22\36\0\323\165\334\7\0\0\0\31\164"
"\105\130\164\103\157\155\155\145\156\164\0\103\162\145\141\164"
"\145\144\40\167\151\164\150\40\107\111\115\120\127\201\16\27"
- "\0\0\0\206\111\104\101\124\30\323\265\317\61\12\103\41"
- "\20\4\320\131\211\142\341\65\74\102\312\334\52\155\252\64"
- "\201\177\257\64\71\202\165\300\112\260\23\304\235\124\246\220"
- "\24\66\31\230\356\55\354\110\112\11\73\61\330\314\37\140"
- "\214\121\166\240\250\352\233\344\113\125\17\153\355\63\245\304"
- "\237\260\224\102\153\55\274\367\112\362\346\234\173\0\340\172"
- "\140\306\30\150\255\241\326\152\110\336\163\316\27\0\262\276"
- "\364\35\103\22\255\65\23\102\270\2\70\255\330\220\304\154"
- "\357\35\42\162\6\340\47\236\360\3\234\263\102\360\377\322"
- "\316\30\0\0\0\0\111\105\116\104\256\102\140\202" },
+ "\0\0\0\265\111\104\101\124\30\323\215\220\73\156\303\60"
+ "\20\104\337\322\246\100\304\112\235\23\350\10\51\175\253\264"
+ "\251\322\30\360\275\334\344\10\354\3\25\152\324\21\140\270"
+ "\223\46\62\4\377\340\5\246\233\67\73\30\313\71\363\354"
+ "\331\277\0\310\71\353\241\331\335\27\303\217\244\157\167\77"
+ "\306\30\117\267\100\233\246\111\0\41\4\142\214\244\224\134"
+ "\322\147\327\165\7\100\153\50\110\102\22\255\65\112\51\314"
+ "\363\34\44\175\215\343\270\7\154\30\206\163\315\160\371\112"
+ "\22\245\224\320\367\375\7\260\135\3\347\344\265\152\255\230"
+ "\331\73\220\26\0\140\53\135\17\320\132\303\314\336\200\27"
+ "\340\27\150\167\315\113\35\340\25\50\100\5\132\270\267\251"
+ "\273\3\354\200\16\330\0\374\1\33\160\147\36\316\322\163"
+ "\44\0\0\0\0\111\105\116\104\256\102\140\202" },
{ ":pushbuttondown_b.png", 196,
"\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122"
"\0\0\0\1\0\0\0\14\10\6\0\0\0\243\213\327"
diff --git a/plugingui/resources/pushbutton_b.png b/plugingui/resources/pushbutton_b.png
index c06eb04..b3f24a6 100644
--- a/plugingui/resources/pushbutton_b.png
+++ b/plugingui/resources/pushbutton_b.png
Binary files differ
diff --git a/plugingui/resources/pushbutton_bl.png b/plugingui/resources/pushbutton_bl.png
index 3d92a1c..340e8b8 100644
--- a/plugingui/resources/pushbutton_bl.png
+++ b/plugingui/resources/pushbutton_bl.png
Binary files differ
diff --git a/plugingui/resources/pushbutton_br.png b/plugingui/resources/pushbutton_br.png
index 50519f1..f5814f2 100644
--- a/plugingui/resources/pushbutton_br.png
+++ b/plugingui/resources/pushbutton_br.png
Binary files differ
diff --git a/plugingui/resources/pushbutton_c.png b/plugingui/resources/pushbutton_c.png
index 557a233..1eaf142 100644
--- a/plugingui/resources/pushbutton_c.png
+++ b/plugingui/resources/pushbutton_c.png
Binary files differ
diff --git a/plugingui/resources/pushbutton_l.png b/plugingui/resources/pushbutton_l.png
index 87c6212..896764f 100644
--- a/plugingui/resources/pushbutton_l.png
+++ b/plugingui/resources/pushbutton_l.png
Binary files differ
diff --git a/plugingui/resources/pushbutton_r.png b/plugingui/resources/pushbutton_r.png
index fc0b986..6b0c4b9 100644
--- a/plugingui/resources/pushbutton_r.png
+++ b/plugingui/resources/pushbutton_r.png
Binary files differ
diff --git a/plugingui/resources/pushbutton_t.png b/plugingui/resources/pushbutton_t.png
index c70093e..358f4fa 100644
--- a/plugingui/resources/pushbutton_t.png
+++ b/plugingui/resources/pushbutton_t.png
Binary files differ
diff --git a/plugingui/resources/pushbutton_tl.png b/plugingui/resources/pushbutton_tl.png
index 51967c2..7a60b77 100644
--- a/plugingui/resources/pushbutton_tl.png
+++ b/plugingui/resources/pushbutton_tl.png
Binary files differ
diff --git a/plugingui/resources/pushbutton_tr.png b/plugingui/resources/pushbutton_tr.png
index 752c62e..aa13465 100644
--- a/plugingui/resources/pushbutton_tr.png
+++ b/plugingui/resources/pushbutton_tr.png
Binary files differ
diff --git a/src/Makefile.am b/src/Makefile.am
index 258c68d..386d373 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -28,6 +28,7 @@ EXTRA_DIST = \
audiofile.cc \
audioinputengine.cc \
audiooutputengine.cc \
+ audioinputenginemidi.cc \
beatmapper.cc \
channel.cc \
channelmixer.cc \
diff --git a/src/Makefile.am.drumgizmo b/src/Makefile.am.drumgizmo
index 54de5e3..428d2a7 100644
--- a/src/Makefile.am.drumgizmo
+++ b/src/Makefile.am.drumgizmo
@@ -1,4 +1,5 @@
DRUMGIZMO_SOURCES = \
+ $(top_srcdir)/src/audioinputenginemidi.cc \
$(top_srcdir)/src/audiofile.cc \
$(top_srcdir)/src/channel.cc \
$(top_srcdir)/src/channelmixer.cc \
diff --git a/src/audioinputengine.h b/src/audioinputengine.h
index c2d2e24..f2b49c0 100644
--- a/src/audioinputengine.h
+++ b/src/audioinputengine.h
@@ -37,6 +37,8 @@ class AudioInputEngine {
public:
virtual ~AudioInputEngine() {}
+ virtual bool isMidiEngine() { return false; }
+
virtual bool init(Instruments &instruments) = 0;
virtual void setParm(std::string parm, std::string value) = 0;
diff --git a/src/audioinputenginemidi.cc b/src/audioinputenginemidi.cc
index 5986471..6aa9d45 100644
--- a/src/audioinputenginemidi.cc
+++ b/src/audioinputenginemidi.cc
@@ -26,15 +26,23 @@
*/
#include "audioinputenginemidi.h"
-void InputLV2::loadMidiMap(std::string f)
+#include "midimapparser.h"
+
+#include <hugin.hpp>
+
+void AudioInputEngineMidi::loadMidiMap(std::string f, Instruments &instruments)
{
+ DEBUG(mmap, "loadMidiMap(%s, i.size() == %d)\n", f.c_str(),
+ instruments.size());
if(f == "") return;
MidiMapParser p(f);
if(p.parse()) {/*return false;*/}
+
+ mmap.clear();
mmap.midimap = p.midimap;
- for(size_t i = 0; i < instruments->size(); i++) {
- mmap.instrmap[(*instruments)[i]->name()] = i;
+ for(size_t i = 0; i < instruments.size(); i++) {
+ mmap.instrmap[instruments[i]->name()] = i;
}
}
diff --git a/src/audioinputenginemidi.h b/src/audioinputenginemidi.h
index e52a54f..4cae78b 100644
--- a/src/audioinputenginemidi.h
+++ b/src/audioinputenginemidi.h
@@ -29,10 +29,17 @@
#include "audioinputengine.h"
-class AudioInputEngineMidi {
+#include <string>
+
+#include "midimapper.h"
+#include "instrument.h"
+
+class AudioInputEngineMidi : public AudioInputEngine {
public:
virtual ~AudioInputEngineMidi() {}
+ bool isMidiEngine() { return true; }
+
virtual bool init(Instruments &instruments) = 0;
virtual void setParm(std::string parm, std::string value) = 0;
@@ -44,10 +51,9 @@ public:
virtual event_t *run(size_t pos, size_t len, size_t *nevents) = 0;
virtual void post() = 0;
- void loadMidiMap(std::string file);
+ void loadMidiMap(std::string file, Instruments &i);
protected:
-
MidiMapper mmap;
};
diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc
index 71346d4..219ec7b 100644
--- a/src/drumgizmo.cc
+++ b/src/drumgizmo.cc
@@ -37,6 +37,7 @@
#include <hugin.hpp>
#include "drumkitparser.h"
+#include "audioinputenginemidi.h"
DrumGizmo::DrumGizmo(AudioOutputEngine *o, AudioInputEngine *i)
: loader(this), oe(o), ie(i)
@@ -59,22 +60,22 @@ DrumGizmo::~DrumGizmo()
/*
* Add a message to the GUI message queue.
*/
-void DrumGizmo::sendMessage(Message *msg)
+void DrumGizmo::sendGUIMessage(Message *msg)
{
- MutexAutolock l(message_mutex);
- message_queue.push_back(msg);
+ MutexAutolock l(gui_message_mutex);
+ gui_message_queue.push_back(msg);
}
/*
* Receive message from the engine. The caller takes over the memory.
*/
-Message *DrumGizmo::receiveMessage()
+Message *DrumGizmo::receiveGUIMessage()
{
- MutexAutolock l(message_mutex);
+ MutexAutolock l(gui_message_mutex);
Message *msg = NULL;
- if(message_queue.size()) {
- msg = message_queue.front();
- message_queue.pop_front();
+ if(gui_message_queue.size()) {
+ msg = gui_message_queue.front();
+ gui_message_queue.pop_front();
}
return msg;
}
@@ -82,12 +83,48 @@ Message *DrumGizmo::receiveMessage()
/*
* Receive message from the engine without removing it from the queue.
*/
-Message *DrumGizmo::peekMessage()
+Message *DrumGizmo::peekGUIMessage()
{
- MutexAutolock l(message_mutex);
+ MutexAutolock l(gui_message_mutex);
Message *msg = NULL;
- if(message_queue.size()) {
- msg = message_queue.front();
+ if(gui_message_queue.size()) {
+ msg = gui_message_queue.front();
+ }
+ return msg;
+}
+
+/*
+ * Add a message to the GUI message queue.
+ */
+void DrumGizmo::sendEngineMessage(Message *msg)
+{
+ MutexAutolock l(engine_message_mutex);
+ engine_message_queue.push_back(msg);
+}
+
+/*
+ * Receive message from the engine. The caller takes over the memory.
+ */
+Message *DrumGizmo::receiveEngineMessage()
+{
+ MutexAutolock l(engine_message_mutex);
+ Message *msg = NULL;
+ if(engine_message_queue.size()) {
+ msg = engine_message_queue.front();
+ engine_message_queue.pop_front();
+ }
+ return msg;
+}
+
+/*
+ * Receive message from the engine without removing it from the queue.
+ */
+Message *DrumGizmo::peekEngineMessage()
+{
+ MutexAutolock l(engine_message_mutex);
+ Message *msg = NULL;
+ if(engine_message_queue.size()) {
+ msg = engine_message_queue.front();
}
return msg;
}
@@ -99,6 +136,9 @@ std::string DrumGizmo::drumkitfile()
bool DrumGizmo::loadkit(std::string file)
{
+ if(file == this->kitfile) return 1;
+ if(file == "") return 1;
+
this->kitfile = file;
DEBUG(drumgizmo, "loadkit(%s)\n", kitfile.c_str());
@@ -111,6 +151,8 @@ bool DrumGizmo::loadkit(std::string file)
loader.loadKit(&kit);
+ DEBUG(loadkit, "loadkit: Success\n");
+
return true;
}
@@ -133,6 +175,38 @@ bool DrumGizmo::init(bool preload)
return true;
}
+void DrumGizmo::handleEngineEvents()
+{
+ // DEBUG(msg, "handle?");
+
+ Message *msg = receiveEngineMessage();
+ if(msg) {
+ DEBUG(msg, "got message.");
+ switch(msg->type()) {
+ case Message::LoadDrumKit:
+ {
+ DEBUG(msg, "got LoadDrumKitMessage message.");
+ LoadDrumKitMessage *m = (LoadDrumKitMessage*)msg;
+ loadkit(m->drumkitfile);
+ //init(true);
+ }
+ break;
+ case Message::LoadMidimap:
+ DEBUG(msg, "got LoadMidimapMessage message.");
+ if(!ie->isMidiEngine()) break;
+ {
+ AudioInputEngineMidi *aim = (AudioInputEngineMidi*)ie;
+ LoadMidimapMessage *m = (LoadMidimapMessage*)msg;
+ aim->loadMidiMap(m->midimapfile, kit.instruments);
+ }
+ break;
+ default:
+ break;
+ }
+ // delete msg;
+ }
+}
+
bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples)
{
#if 0
@@ -156,6 +230,9 @@ bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples)
}
#endif
+ // Handle engine messages, at most one in each iteration:
+ handleEngineEvents();
+
ie->pre();
oe->pre(nsamples);
@@ -418,8 +495,6 @@ bool DrumGizmo::setConfigString(std::string cfg)
return false;
}
- midimapfile = p.value("midimapfile");
-
if(p.value("enable_velocity_modifier") != "") {
Conf::enable_velocity_modifier =
p.value("enable_velocity_modifier") == "true";
@@ -447,8 +522,21 @@ bool DrumGizmo::setConfigString(std::string cfg)
std::string newkit = p.value("drumkitfile");
if(newkit != "" && drumkitfile() != newkit) {
+ /*
if(!loadkit(p.values["drumkitfile"])) return false;
init(true);
+ */
+ LoadDrumKitMessage *msg = new LoadDrumKitMessage();
+ msg->drumkitfile = newkit;
+ sendEngineMessage(msg);
+ }
+
+ std::string newmidimap = p.value("midimapfile");
+ if(midimapfile != newmidimap && newmidimap != "") {
+ midimapfile = newmidimap;
+ LoadMidimapMessage *msg = new LoadMidimapMessage();
+ msg->midimapfile = midimapfile;
+ sendEngineMessage(msg);
}
return true;
diff --git a/src/drumgizmo.h b/src/drumgizmo.h
index b7df7b9..c03fd95 100644
--- a/src/drumgizmo.h
+++ b/src/drumgizmo.h
@@ -73,21 +73,41 @@ public:
/*
* Receive message from the engine. The caller takes over the memory.
*/
- Message *receiveMessage();
+ Message *receiveGUIMessage();
/*
* Receive message from the engine without removing it from the queue.
*/
- Message *peekMessage();
+ Message *peekGUIMessage();
/*
* Add a message to the GUI message queue.
*/
- void sendMessage(Message *msg);
+ void sendEngineMessage(Message *msg);
+
+ /*
+ * Receive message from the engine. The caller takes over the memory.
+ */
+ Message *receiveEngineMessage();
+
+ /*
+ * Receive message from the engine without removing it from the queue.
+ */
+ Message *peekEngineMessage();
+
+ /*
+ * Add a message to the GUI message queue.
+ */
+ void sendGUIMessage(Message *msg);
private:
- Mutex message_mutex;
- std::list<Message *> message_queue;
+ void handleEngineEvents();
+
+ Mutex gui_message_mutex;
+ std::list<Message *> gui_message_queue;
+
+ Mutex engine_message_mutex;
+ std::list<Message *> engine_message_queue;
DrumKitLoader loader;
diff --git a/src/drumkitloader.cc b/src/drumkitloader.cc
index c8d1cac..ed1a187 100644
--- a/src/drumkitloader.cc
+++ b/src/drumkitloader.cc
@@ -74,6 +74,7 @@ void DrumKitLoader::thread_main()
DEBUG(loader, "before sem\n");
semaphore.wait();
DEBUG(loader, "after sem\n");
+ fflush(stdout);
if(quitit) return;
@@ -107,11 +108,11 @@ void DrumKitLoader::thread_main()
af->load();
loaded++;
- LoadStatus *ls = new LoadStatus();
+ LoadStatusMessage *ls = new LoadStatusMessage();
ls->number_of_files = count;
ls->numer_of_files_loaded = loaded;
ls->current_file = af->filename;
- drumgizmo->sendMessage(ls);
+ drumgizmo->sendGUIMessage(ls);
a++;
}
diff --git a/src/message.h b/src/message.h
index 050162a..c37db12 100644
--- a/src/message.h
+++ b/src/message.h
@@ -30,13 +30,19 @@
class Message {
public:
typedef enum {
- LoadStatus,
+ // Engine -> GUI Messages:
+ LoadStatus, // Signal GUI the current load status.
+
+ // GUI -> Engine, Engine -> Engine Messages:
+ LoadDrumKit, // Signal engine to load drumkit.
+ LoadMidimap, // Signal engine to load midimap.
} type_t;
+
virtual ~Message() {}
virtual type_t type() = 0;
};
-class LoadStatus : public Message {
+class LoadStatusMessage : public Message {
public:
type_t type() { return Message::LoadStatus; }
unsigned int number_of_files;
@@ -44,4 +50,16 @@ public:
std::string current_file;
};
+class LoadDrumKitMessage : public Message {
+public:
+ type_t type() { return Message::LoadDrumKit; }
+ std::string drumkitfile;
+};
+
+class LoadMidimapMessage : public Message {
+public:
+ type_t type() { return Message::LoadMidimap; }
+ std::string midimapfile;
+};
+
#endif/*__DRUMGIZMO_MESSAGE_H__*/
diff --git a/src/midimapper.cc b/src/midimapper.cc
index ca0cc21..d4ff94e 100644
--- a/src/midimapper.cc
+++ b/src/midimapper.cc
@@ -33,3 +33,9 @@ int MidiMapper::lookup(int note)
if(instrmap.find(instr) == instrmap.end()) return -1;
return instrmap[instr];
}
+
+void MidiMapper::clear()
+{
+ midimap.clear();
+ instrmap.clear();
+}
diff --git a/src/midimapper.h b/src/midimapper.h
index 74c268c..7439c4b 100644
--- a/src/midimapper.h
+++ b/src/midimapper.h
@@ -35,6 +35,8 @@ typedef std::map<std::string, int> instrmap_t;
class MidiMapper {
public:
+ void clear();
+
int lookup(int note);
instrmap_t instrmap;
diff --git a/vst/Makefile.mingw32 b/vst/Makefile.mingw32
index d90f5c3..44b2ae2 100644
--- a/vst/Makefile.mingw32
+++ b/vst/Makefile.mingw32
@@ -10,6 +10,7 @@ top_srcdir=..
DG_BASE = ..
DG_SRC = \
${DG_BASE}/src/audiofile.cc \
+ ${DG_BASE}/src/audioinputenginemidi.cc \
${DG_BASE}/src/configuration.cc \
${DG_BASE}/src/channel.cc \
${DG_BASE}/src/channelmixer.cc \
diff --git a/vst/drumgizmo_vst.cc b/vst/drumgizmo_vst.cc
index 8a24a0f..06e90bd 100644
--- a/vst/drumgizmo_vst.cc
+++ b/vst/drumgizmo_vst.cc
@@ -35,7 +35,7 @@
#define NUM_PROGRAMS 0
#define NUM_PARAMS 0
-
+/*
static void midimapHandler(void *ptr, const char* file)
{
DEBUG(vst, "midimapHandler\n");
@@ -45,7 +45,7 @@ static void midimapHandler(void *ptr, const char* file)
drumgizmo->midimapfile = file;
input->loadMidiMap(file);
}
-
+*/
DGEditor::DGEditor(AudioEffect* effect)
{
DEBUG(dgeditor, "Create DGEditor\n");
@@ -60,7 +60,7 @@ bool DGEditor::open(void* ptr)
if(plugingui) delete plugingui;
plugingui = new PluginGUI(drumgizmo);
- plugingui->setChangeMidimapCallback(midimapHandler, dgeff);
+ // plugingui->setChangeMidimapCallback(midimapHandler, dgeff);
// plugingui->show();
return true;
@@ -196,7 +196,7 @@ VstInt32 DrumGizmoVst::setChunk(void *data, VstInt32 byteSize, bool isPreset)
DEBUG(vst, "Using Drumkit: %s\n", drumgizmo->kitfile.c_str());
DEBUG(vst, "Using Midimap: %s\n", drumgizmo->midimapfile.c_str());
- input->loadMidiMap(drumgizmo->midimapfile);
+ // input->loadMidiMap(drumgizmo->midimapfile);
/*
drumgizmo->loadkit("z:/c/drumgizmo/kits/test/test.xml");
diff --git a/vst/input_vst.cc b/vst/input_vst.cc
index 5cc73f9..53de387 100644
--- a/vst/input_vst.cc
+++ b/vst/input_vst.cc
@@ -106,20 +106,3 @@ void InputVST::processEvents(VstEvents* ev)
event++;
}
}
-
-void InputVST::loadMidiMap(std::string f)
-{
- DEBUG(inputvst, "load midi map %s\n", f.c_str());
-
- MidiMapParser p(f);
- if(p.parse()) {
- ERR(inputvst, "Error loading midimap: %s\n", f.c_str());
- return;
- }
- mmap.midimap = p.midimap;
-
- for(size_t i = 0; i < instruments->size(); i++) {
- DEBUG(inputvst, "Mapping %s to %d\n", (*instruments)[i]->name().c_str(), i);
- mmap.instrmap[(*instruments)[i]->name()] = i;
- }
-}
diff --git a/vst/input_vst.h b/vst/input_vst.h
index 668f39c..612add6 100644
--- a/vst/input_vst.h
+++ b/vst/input_vst.h
@@ -27,12 +27,11 @@
#ifndef __DRUMGIZMO_INPUT_VST_H__
#define __DRUMGIZMO_INPUT_VST_H__
-#include <audioinputengine.h>
-#include <midimapper.h>
+#include <audioinputenginemidi.h>
#include <public.sdk/source/vst2.x/audioeffectx.h>
-class InputVST : public AudioInputEngine {
+class InputVST : public AudioInputEngineMidi {
public:
InputVST();
virtual ~InputVST();
@@ -50,9 +49,6 @@ public:
void processEvents(VstEvents* ev);
- void loadMidiMap(std::string file);
- MidiMapper mmap;
-
private:
event_t *list;
size_t listsize;