aboutsummaryrefslogtreecommitdiffstats
path: root/demos/3rdparty
diff options
context:
space:
mode:
authorAbhishek Kumar <abhishek@kumar>2013-05-23 23:38:57 +0700
committerAbhishek Kumar <abhishek@kumar>2013-05-23 23:38:57 +0700
commite52cb141b71e35d3bf65222afb98e12b1935789b (patch)
tree39b6fa0bd051f274cdacc1925f262bc1a81b4c5e /demos/3rdparty
parent4e7c1b00caecba9e2dca16aab3ec5c16973dd93c (diff)
downloaduGFX-e52cb141b71e35d3bf65222afb98e12b1935789b.tar.gz
uGFX-e52cb141b71e35d3bf65222afb98e12b1935789b.tar.bz2
uGFX-e52cb141b71e35d3bf65222afb98e12b1935789b.zip
New Notepad-2 Demo for ChibiOS/GFX
See demos/3rdparty/notepad-2/readme.txt for more details.
Diffstat (limited to 'demos/3rdparty')
-rw-r--r--demos/3rdparty/notepad-2/gfxconf.h58
-rw-r--r--demos/3rdparty/notepad-2/main.c108
-rw-r--r--demos/3rdparty/notepad-2/notepadApp.c471
-rw-r--r--demos/3rdparty/notepad-2/notepadApp.h48
-rw-r--r--demos/3rdparty/notepad-2/notepadCore.c235
-rw-r--r--demos/3rdparty/notepad-2/notepadCore.h66
-rw-r--r--demos/3rdparty/notepad-2/notepadUIDefines.h114
-rw-r--r--demos/3rdparty/notepad-2/readme.txt17
-rw-r--r--demos/3rdparty/notepad-2/toolbarIcons.gifbin0 -> 3184 bytes
-rw-r--r--demos/3rdparty/notepad-2/toolbarIcons.h237
10 files changed, 1354 insertions, 0 deletions
diff --git a/demos/3rdparty/notepad-2/gfxconf.h b/demos/3rdparty/notepad-2/gfxconf.h
new file mode 100644
index 00000000..0768ca22
--- /dev/null
+++ b/demos/3rdparty/notepad-2/gfxconf.h
@@ -0,0 +1,58 @@
+/*
+ * This file has a different license to the rest of the GFX system.
+ * You can copy, modify and distribute this file as you see fit.
+ * You do not need to publish your source modifications to this file.
+ * The only thing you are not permitted to do is to relicense it
+ * under a different license.
+ */
+
+#ifndef _GFXCONF_H
+#define _GFXCONF_H
+
+/* GFX sub-systems to turn on */
+#define GFX_USE_GDISP TRUE
+#define GFX_USE_GWIN TRUE
+#define GFX_USE_GEVENT TRUE
+#define GFX_USE_GTIMER TRUE
+#define GFX_USE_GINPUT TRUE
+
+/* Features for the GDISP sub-system. */
+#define GDISP_NEED_VALIDATION TRUE
+#define GDISP_NEED_CLIP TRUE
+#define GDISP_NEED_TEXT TRUE
+#define GDISP_NEED_CIRCLE TRUE
+#define GDISP_NEED_ELLIPSE FALSE
+#define GDISP_NEED_ARC FALSE
+#define GDISP_NEED_CONVEX_POLYGON FALSE
+#define GDISP_NEED_SCROLL FALSE
+#define GDISP_NEED_PIXELREAD FALSE
+#define GDISP_NEED_CONTROL TRUE
+#define GDISP_NEED_IMAGE TRUE
+#define GDISP_NEED_MULTITHREAD TRUE
+#define GDISP_NEED_ASYNC FALSE
+#define GDISP_NEED_MSGAPI FALSE
+
+/* Builtin Fonts */
+#define GDISP_INCLUDE_FONT_SMALL FALSE
+#define GDISP_INCLUDE_FONT_LARGER FALSE
+#define GDISP_INCLUDE_FONT_UI1 FALSE
+#define GDISP_INCLUDE_FONT_UI2 TRUE
+#define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE
+
+/* GDISP image decoders */
+#define GDISP_NEED_IMAGE_NATIVE FALSE
+#define GDISP_NEED_IMAGE_GIF TRUE
+#define GDISP_NEED_IMAGE_BMP FALSE
+#define GDISP_NEED_IMAGE_JPG FALSE
+#define GDISP_NEED_IMAGE_PNG FALSE
+
+/* Features for the GWIN sub-system. */
+#define GWIN_NEED_BUTTON TRUE
+#define GWIN_NEED_CONSOLE TRUE
+#define GWIN_NEED_SLIDER TRUE
+
+/* Features for the GINPUT sub-system. */
+#define GINPUT_NEED_MOUSE TRUE
+#define GINPUT_NEED_DIAL FALSE
+
+#endif /* _GFXCONF_H */
diff --git a/demos/3rdparty/notepad-2/main.c b/demos/3rdparty/notepad-2/main.c
new file mode 100644
index 00000000..350cee80
--- /dev/null
+++ b/demos/3rdparty/notepad-2/main.c
@@ -0,0 +1,108 @@
+/*
+ * File: main.c
+ *
+ * This file is a part of the Notepad demo application for ChibiOS/GFX
+ * Copyright © 2013, Kumar Abhishek [abhishek.kakkar@edaboard.com].
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * The name of 'Kumar Abhishek' may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * DISCLAIMER OF WARRANTY:
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "ch.h"
+#include "hal.h"
+#include "gfx.h"
+
+#include "notepadApp.h"
+
+const NColorScheme schemeDefault = {
+ .titleBarColor = HTML2COLOR(0x3064D8),
+ .titleTextColor = White,
+
+ .winBgColor = HTML2COLOR(0xFFECB0),
+ .drawingWinBorder = HTML2COLOR(0xCEBA77),
+
+ .toolbarSeparator = HTML2COLOR(0xC09028),
+ .toolbarBgUnsel = HTML2COLOR(0xF0D484),
+ .toolbarBgActive = HTML2COLOR(0xC8B060),
+ .toolbarBgSel = HTML2COLOR(0xDCC06C),
+
+ .statusBarText = HTML2COLOR(0x000000)
+};
+
+const NColorScheme schemeDefault2 = {
+ .titleBarColor = HTML2COLOR(0x3064D8),
+ .titleTextColor = White,
+
+ .winBgColor = HTML2COLOR(0xC8D8F8),
+ .drawingWinBorder = HTML2COLOR(0x8098E0),
+
+ .toolbarSeparator = HTML2COLOR(0x5078F0),
+ .toolbarBgUnsel = HTML2COLOR(0xA0B8F0),
+ .toolbarBgActive = HTML2COLOR(0x6084F0),
+ .toolbarBgSel = HTML2COLOR(0x88A8F8),
+
+ .statusBarText = HTML2COLOR(0x000000)
+};
+
+const char *tsCalibRead(uint16_t instance) {
+ // This will perform a on-spot calibration
+ // Unless you read and add the co-efficients here
+ return NULL;
+}
+
+int main(void) {
+
+ font_t font = gdispOpenFont("UI2");
+
+ /* initialize the hardware and the OS */
+ halInit();
+ chSysInit();
+
+ /* initialize the LCD */
+ gdispInit();
+ gdispClear(Black);
+
+ /* Calibrate the touchscreen */
+ ginputSetMouseCalibrationRoutines(0, NULL, tsCalibRead, FALSE);
+ ginputGetMouse(0);
+
+ // Set the color scheme
+ nSetColorScheme(schemeDefault);
+
+ while (TRUE) {
+
+ chThdWait(nLaunchNotepadApp());
+
+ gdispClear(Black);
+ gdispSetClip(0, 0, gdispGetWidth(), gdispGetHeight());
+ gdispDrawString(3, 3, "Notepad Terminated.", font, White);
+ gdispDrawString(3, 20, "Relaunching Notepad App...", font, White);
+
+ chThdSleepMilliseconds(1000);
+
+ }
+
+ return 0;
+}
diff --git a/demos/3rdparty/notepad-2/notepadApp.c b/demos/3rdparty/notepad-2/notepadApp.c
new file mode 100644
index 00000000..a89b7bf0
--- /dev/null
+++ b/demos/3rdparty/notepad-2/notepadApp.c
@@ -0,0 +1,471 @@
+/*
+ * File: notepadApp.c
+ *
+ * This file is a part of the Notepad demo application for ChibiOS/GFX
+ * Copyright © 2013, Kumar Abhishek [abhishek.kakkar@edaboard.com].
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * The name of 'Kumar Abhishek' may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * DISCLAIMER OF WARRANTY:
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "ch.h"
+#include "hal.h"
+#include "gfx.h"
+
+#include "chprintf.h"
+
+#include "notepadApp.h"
+#include "toolbarIcons.h"
+
+// Get the handle for a window object
+#define H(obj) ((GHandle)&obj)
+
+// Static objects
+static GListener gl; // Event listener object
+static GHandle nDrawingArea; // GWindow Drawing Area
+static BaseSequentialStream *gstatusConsole; // GConsole Handle to the Status Bar
+
+static GEventMouse curPtr; // Holder for current pointer location
+
+static font_t font;
+static coord_t swidth, sheight;
+
+// The toolbar buttons - Self-Explanatory
+static GButtonObject btnNew, btnOpen, btnSave;
+static GButtonObject btnColorBar;
+static GButtonObject btnColorBarSel;
+
+static GButtonObject btnPencil, btnFill, btnEraser;
+
+static GButtonObject btnClose;
+/* static GButtonObject btnYes, btnNo; // Reserved for future use */
+
+// Image object
+static gdispImage toolbarImageFilmstrip;
+
+static color_t myColors[] = { Black, Red, Green, Blue, Cyan, Magenta, Yellow, White };
+
+static color_t selColor = Black;
+static int selColorIndex = 0, selPenWidth = 1, tbMode = 1;
+
+static NColorScheme nCurColorScheme;
+
+static msg_t notepadThread(void *param);
+
+// Custom drawing functions for the buttons
+static void nbtnColorBarDraw(GHandle gh, bool_t enabled, bool_t isdown, const char *txt, const GButtonDrawStyle *pstyle, void *param) {
+ #define ccs nCurColorScheme
+
+ int i, j, k;
+
+ (void)txt;
+ (void)pstyle;
+ (void)param;
+ (void)enabled;
+
+ ginputGetMouseStatus(0, &curPtr);
+
+ // Draw the toolbars according to the mode
+ if (tbMode == 0) {
+ k = (curPtr.x - gh->x) / (NPAD_COLORBAR_WIDTH / 8);
+
+ for (i = 0; i < 8; i++) {
+ j = gh->x + (NPAD_TOOLBAR_BTN_WIDTH / 2) + NPAD_TOOLBAR_BTN_WIDTH * i;
+
+ if (isdown == TRUE) {
+ // Update selection - this is like lazy release.
+ if (k >= 0 && k <= 7) {
+ selPenWidth = k + 1;
+ ncoreSetPenWidth((uint8_t) selPenWidth);
+ }
+
+ gdispFillArea(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y,
+ NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT,
+ selPenWidth - i == 1 ? ccs.toolbarBgActive : ccs.toolbarBgUnsel);
+ }
+ else {
+ gdispFillArea(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y,
+ NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT,
+ selPenWidth - i == 1 ? ccs.toolbarBgSel : ccs.toolbarBgUnsel);
+
+ gdispDrawBox(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y,
+ NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT,
+ selPenWidth - i == 1 ? ccs.toolbarSeparator: ccs.toolbarBgUnsel);
+ }
+
+ gdispFillCircle(j, gh->y + 10, i + 1, myColors[selColorIndex]);
+ }
+
+ } else {
+ k = (curPtr.x - gh->x) / (NPAD_COLORBAR_WIDTH / 8);
+
+ for (i = 0; i < 8; i++) {
+ j = gh->x + (NPAD_TOOLBAR_BTN_WIDTH / 2) + NPAD_TOOLBAR_BTN_WIDTH * i;
+
+ if (isdown == TRUE) {
+ // Update selection - this is like lazy release.
+ if (k >= 0 && k <= 7) {
+ selColorIndex = k;
+ selColor = myColors[k];
+ ncoreSetPenColor(selColor);
+ }
+
+ gdispFillArea(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y,
+ NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT,
+ k == i ? ccs.toolbarBgActive : ccs.toolbarBgUnsel);
+ }
+ else {
+ gdispFillArea(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y,
+ NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT,
+ selColorIndex == i ? ccs.toolbarBgSel : ccs.toolbarBgUnsel);
+
+ gdispDrawBox(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y,
+ NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT,
+ selColorIndex == i ? ccs.toolbarSeparator: ccs.toolbarBgUnsel);
+ }
+
+ gdispFillCircle(j, gh->y + (NPAD_TOOLBAR_BTN_HEIGHT / 2), 3, myColors[i] );
+ }
+ }
+
+
+ #undef ccs
+}
+
+static void nbtnColorBarSelDraw(GHandle gh, bool_t enabled, bool_t isdown, const char *txt, const GButtonDrawStyle *pstyle, void *param) {
+#define ccs nCurColorScheme
+
+ int i, j = 0, k;
+ color_t ca, cb;
+ GEventMouse ptr;
+
+ (void)txt;
+ (void)pstyle;
+ (void)param;
+ (void)enabled;
+
+ // Get a copy of the pointer location
+ ginputGetMouseStatus(0, &ptr);
+
+ // Get which button the pointer is on right now
+ k = (ptr.x - gh->x) / NPAD_TOOLBAR_BTN_WIDTH;
+
+ gdispDrawBox(gh->x, gh->y, gh->width, gh->height, ccs.toolbarBgUnsel);
+ gdispDrawBox(gh->x + 1, gh->y + 1, gh->width - 2, gh->height - 2, ccs.toolbarBgUnsel);
+
+ for (i = 0; i < 2; i++) {
+ if (isdown == TRUE) {
+ // Update selection - this is like lazy release.
+ if (k == 0 || k == 1) {
+ tbMode = k;
+ j = 1;
+ }
+
+ ca = (tbMode == i ? ccs.toolbarBgActive : ccs.toolbarBgUnsel);
+ }
+ else {
+ ca = (tbMode == i ? ccs.toolbarBgSel : ccs.toolbarBgUnsel);
+ }
+
+ cb = (tbMode == i ? ccs.toolbarSeparator : ccs.toolbarBgUnsel);
+
+ gdispFillArea(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i,
+ gh->y,
+ NPAD_TOOLBAR_BTN_WIDTH,
+ NPAD_TOOLBAR_BTN_HEIGHT,
+ ca);
+
+ gdispImageSetBgColor(&toolbarImageFilmstrip, ca);
+ gdispDrawBox(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y,
+ NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, cb);
+
+ /* Draw both the icons */
+ gwinImageDraw(gh, &toolbarImageFilmstrip,
+ 2 + NPAD_TOOLBAR_BTN_WIDTH * i,
+ 2,
+ NPAD_ICON_WIDTH,
+ NPAD_ICON_HEIGHT,
+ NPAD_ICON_START(3 + i),
+ 0);
+ }
+
+ if (j)
+ gwinButtonDraw(H(btnColorBar));
+
+ #undef ccs
+}
+
+static void nToolbarImageButtonDraw(GHandle gh, bool_t isenabled, bool_t isdown, const char *txt, const GButtonDrawStyle *pstyle, void *param) {
+ (void)txt; (void)pstyle; (void)isenabled;
+
+ color_t cl = isdown ? nCurColorScheme.toolbarBgActive : nCurColorScheme.toolbarBgUnsel;
+
+ gdispImageSetBgColor(&toolbarImageFilmstrip, cl);
+ gdispFillArea(gh->x, gh->y, gh->width, gh->height, cl);
+ gwinImageDraw(gh, &toolbarImageFilmstrip, 2, 2, NPAD_ICON_WIDTH, NPAD_ICON_HEIGHT, NPAD_ICON_START((int) param), 0);
+
+ if (isdown || ((int)param - 5) == ncoreGetMode())
+ gdispDrawBox(gh->x, gh->y, gh->width, gh->height, nCurColorScheme.toolbarSeparator);
+}
+
+static void nCloseButtonDraw(GHandle gh, bool_t isenabled, bool_t isdown, const char *txt, const GButtonDrawStyle *pstyle, void *param) {
+ gwinImageDraw(gh, &toolbarImageFilmstrip, 0, 0, NPAD_ICON_WIDTH, NPAD_ICON_HEIGHT, NPAD_ICON_START(8), 0);
+}
+
+static void initButtons(void) {
+
+ /* Init all the button objects */
+ gwinCreateButton(&btnNew, NPAD_TOOLBAR_1_X(0), NPAD_TOOLBAR_1_Y, NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM);
+ gwinCreateButton(&btnOpen, NPAD_TOOLBAR_1_X(1), NPAD_TOOLBAR_1_Y, NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM);
+ gwinCreateButton(&btnSave, NPAD_TOOLBAR_1_X(2), NPAD_TOOLBAR_1_Y, NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM);
+
+ gwinCreateButton(&btnColorBarSel, NPAD_COLORBAR_SEL_X, NPAD_COLORBAR_SEL_Y, NPAD_COLORBAR_SEL_WIDTH, NPAD_COLORBAR_SEL_HEIGHT, font, GBTN_CUSTOM);
+ gwinCreateButton(&btnColorBar, NPAD_COLORBAR_X, NPAD_TOOLBAR_1_Y, NPAD_COLORBAR_WIDTH, NPAD_COLORBAR_HEIGHT, font, GBTN_CUSTOM);
+
+ gwinCreateButton(&btnPencil, NPAD_TOOLBAR_2_X, NPAD_TOOLBAR_2_Y(0), NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM);
+ gwinCreateButton(&btnEraser, NPAD_TOOLBAR_2_X, NPAD_TOOLBAR_2_Y(1), NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM);
+ gwinCreateButton(&btnFill, NPAD_TOOLBAR_2_X, NPAD_TOOLBAR_2_Y(2), NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM);
+
+ gwinCreateButton(&btnClose, swidth - 18, 0, 16, 16, font, GBTN_CUSTOM);
+
+ /* Attach custom renders */
+ gwinSetButtonCustom(H(btnNew), nToolbarImageButtonDraw, (void *)0);
+ gwinSetButtonCustom(H(btnOpen), nToolbarImageButtonDraw, (void *)1);
+ gwinSetButtonCustom(H(btnSave), nToolbarImageButtonDraw, (void *)2);
+
+ gwinSetButtonCustom(H(btnColorBar), nbtnColorBarDraw, (void *)0);
+ gwinSetButtonCustom(H(btnColorBarSel), nbtnColorBarSelDraw, (void *)0);
+
+ gwinSetButtonCustom(H(btnPencil), nToolbarImageButtonDraw, (void *)5);
+ gwinSetButtonCustom(H(btnEraser), nToolbarImageButtonDraw, (void *)6);
+ gwinSetButtonCustom(H(btnFill), nToolbarImageButtonDraw, (void *)7);
+ gwinSetButtonCustom(H(btnClose), nCloseButtonDraw, (void *)0);
+
+ /* Attach listeners */
+ geventAttachSource(&gl, gwinGetButtonSource(H(btnNew)), 0);
+ geventAttachSource(&gl, gwinGetButtonSource(H(btnOpen)), 0);
+ geventAttachSource(&gl, gwinGetButtonSource(H(btnSave)), 0);
+
+ geventAttachSource(&gl, gwinGetButtonSource(H(btnColorBar)), 0);
+ geventAttachSource(&gl, gwinGetButtonSource(H(btnColorBarSel)), 0);
+
+ geventAttachSource(&gl, gwinGetButtonSource(H(btnPencil)), 0);
+ geventAttachSource(&gl, gwinGetButtonSource(H(btnEraser)), 0);
+ geventAttachSource(&gl, gwinGetButtonSource(H(btnFill)), 0);
+ geventAttachSource(&gl, gwinGetButtonSource(H(btnClose)), 0);
+
+ /* Give listeners access to touch events */
+ gwinAttachButtonMouse(H(btnNew), 0);
+ gwinAttachButtonMouse(H(btnOpen), 0);
+ gwinAttachButtonMouse(H(btnSave), 0);
+
+ gwinAttachButtonMouse(H(btnColorBar), 0);
+ gwinAttachButtonMouse(H(btnColorBarSel), 0);
+
+ gwinAttachButtonMouse(H(btnPencil), 0);
+ gwinAttachButtonMouse(H(btnEraser), 0);
+ gwinAttachButtonMouse(H(btnFill), 0);
+ gwinAttachButtonMouse(H(btnClose), 0);
+
+}
+
+static void drawButtons(void) {
+ gwinButtonDraw(H(btnNew));
+ gwinButtonDraw(H(btnOpen));
+ gwinButtonDraw(H(btnSave));
+
+ gwinButtonDraw(H(btnColorBar));
+ gwinButtonDraw(H(btnColorBarSel));
+
+ gwinButtonDraw(H(btnClose));
+}
+
+static void drawVButtons(void) {
+ gwinButtonDraw(H(btnPencil));
+ gwinButtonDraw(H(btnEraser));
+ gwinButtonDraw(H(btnFill));
+}
+
+static WORKING_AREA(waNotepadThread, NPAD_THD_WA_SIZE);
+static msg_t notepadThread(void *param) {
+
+ GEventMouse *pem;
+ GEventGWinButton *peb;
+ GHandle ghc;
+
+ (void)param;
+
+ /* Get the display dimensions */
+ swidth = gdispGetWidth();
+ sheight = gdispGetHeight();
+
+ font = gdispOpenFont("UI2");
+
+ /* Initialize the mouse */
+ geventListenerInit(&gl);
+ ginputGetMouse(0);
+
+ initButtons();
+
+ /* Configure the GIF decoder with the toolbar Icon images */
+ gdispImageSetMemoryReader(&toolbarImageFilmstrip, toolbarIcons);
+ gdispImageOpen(&toolbarImageFilmstrip);
+
+ /* Set clip to the entire screen */
+ gdispSetClip(0, 0, swidth, sheight);
+
+ /* Clear the screen with the window background
+ * Also, draw the title bars */
+ gdispClear(nCurColorScheme.winBgColor);
+ gdispDrawBox(0, 0, swidth, sheight, nCurColorScheme.titleBarColor);
+ gdispFillArea(0, 0, swidth, NPAD_TITLEBAR_HEIGHT, nCurColorScheme.titleBarColor);
+ gdispDrawStringBox(NPAD_TITLETEXT_START_X,
+ NPAD_TITLETEXT_START_Y,
+ swidth,
+ NPAD_TITLEBAR_HEIGHT,
+ NPAD_TITLETEXT_STR,
+ font,
+ nCurColorScheme.titleTextColor,
+ justifyLeft);
+
+ /* Create the drawing window, draw its border */
+ gdispDrawBox(NPAD_DRAWING_AREA_START_X - 1,
+ NPAD_DRAWING_AREA_START_Y - 1,
+ NPAD_DRAWING_AREA_WIDTH + 2,
+ NPAD_DRAWING_AREA_HEIGHT + 2,
+ nCurColorScheme.drawingWinBorder);
+
+ nDrawingArea = gwinCreateWindow(NULL,
+ NPAD_DRAWING_AREA_START_X,
+ NPAD_DRAWING_AREA_START_Y,
+ NPAD_DRAWING_AREA_WIDTH,
+ NPAD_DRAWING_AREA_HEIGHT);
+
+ /* Create the bottom status bar console */
+ ghc = gwinCreateConsole(NULL,
+ NPAD_STATUSBAR_START_X,
+ NPAD_STATUSBAR_START_Y,
+ NPAD_STATUSBAR_WIDTH,
+ NPAD_STATUSBAR_HEIGHT,
+ font);
+
+ gdispImageDraw(&toolbarImageFilmstrip,
+ NPAD_STATUSBAR_ICON_START_X,
+ NPAD_STATUSBAR_ICON_START_Y,
+ NPAD_ICON_WIDTH,
+ NPAD_ICON_HEIGHT,
+ NPAD_ICON_START(12),
+ 0);
+
+ gwinSetBgColor(ghc, nCurColorScheme.winBgColor);
+ gwinSetColor(ghc, Black);
+
+ gstatusConsole = gwinGetConsoleStream(ghc);
+
+ /* draw the buttons */
+ gwinSetColor(nDrawingArea, Black);
+ gwinSetBgColor(nDrawingArea, White);
+
+ gwinClear(nDrawingArea);
+ gwinClear(ghc);
+
+ drawButtons();
+ drawVButtons();
+
+ chprintf(gstatusConsole, "Welcome to ChibiOS/GFX Notepad demo.");
+
+ ncoreSpawnDrawThread(nDrawingArea, gstatusConsole);
+
+ while(TRUE) {
+ pem = (GEventMouse *) geventEventWait(&gl, TIME_INFINITE);
+
+ /* button pressed... */
+ if (pem->type == GEVENT_GWIN_BUTTON) {
+ peb = (GEventGWinButton *)pem;
+
+ if (peb->button == H(btnNew)) {
+ // Reset all the settings
+ selColorIndex = 0;
+ selPenWidth = 0;
+ ncoreSetMode(NCORE_MODE_DRAW);
+
+ gwinSetColor(nDrawingArea, Black);
+ gwinSetBgColor(nDrawingArea, White);
+
+ // Refresh the buttons
+ drawButtons();
+ drawVButtons();
+
+ gwinClear(nDrawingArea);
+ chprintf(gstatusConsole, "\nScreen Cleared.");
+ }
+ else if (peb->button == H(btnOpen)) {
+ chprintf(gstatusConsole, "\nFile Open not implemented.");
+ }
+ else if (peb->button == H(btnSave)) {
+ chprintf(gstatusConsole, "\nFile Save not implemented.");
+ }
+ else if (peb->button == H(btnPencil)) {
+ ncoreSetMode(NCORE_MODE_DRAW);
+ drawVButtons();
+ chprintf(gstatusConsole, "\nPencil Tool Selected.");
+ }
+ else if (peb->button == H(btnEraser)) {
+ ncoreSetMode(NCORE_MODE_ERASE);
+ drawVButtons();
+ chprintf(gstatusConsole, "\nEraser Tool Selected.");
+ }
+ else if (peb->button == H(btnFill)) {
+ ncoreSetMode(NCORE_MODE_FILL);
+ drawVButtons();
+ chprintf(gstatusConsole, "\nFill Tool Selected.");
+ }
+ else if (peb->button == H(btnClose)) {
+ break;
+ }
+ }
+ }
+
+ gwinDestroyWindow(ghc);
+ // No need to destroy the buttons as they are statically allocated
+ gdispCloseFont(font);
+ ncoreTerminateDrawThread();
+ gdispImageClose(&toolbarImageFilmstrip);
+
+ return 0;
+}
+
+// Public methods
+void nSetColorScheme(NColorScheme sch) { nCurColorScheme = sch; }
+NColorScheme nGetColorScheme(void) { return nCurColorScheme; }
+
+Thread *nLaunchNotepadApp(void) {
+
+ return chThdCreateStatic(waNotepadThread,
+ sizeof(waNotepadThread),
+ NPAD_THD_PRIO,
+ notepadThread, NULL);
+
+}
diff --git a/demos/3rdparty/notepad-2/notepadApp.h b/demos/3rdparty/notepad-2/notepadApp.h
new file mode 100644
index 00000000..bae5f59c
--- /dev/null
+++ b/demos/3rdparty/notepad-2/notepadApp.h
@@ -0,0 +1,48 @@
+/*
+ * File: notepadApp.h
+ *
+ * This file is a part of the Notepad demo application for ChibiOS/GFX
+ * Copyright © 2013, Kumar Abhishek [abhishek.kakkar@edaboard.com].
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * The name of 'Kumar Abhishek' may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * DISCLAIMER OF WARRANTY:
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef NOTEPADAPP_H_
+#define NOTEPADAPP_H_
+
+#include "notepadCore.h"
+#include "notepadUIDefines.h"
+
+#define NPAD_THD_PRIO (NORMALPRIO + 2)
+#define NPAD_THD_WA_SIZE 512
+
+void nSetColorScheme(NColorScheme sch);
+NColorScheme nGetColorScheme(void);
+
+
+Thread *nLaunchNotepadApp(void);
+
+#endif /* NOTEPADAPP_H_ */
diff --git a/demos/3rdparty/notepad-2/notepadCore.c b/demos/3rdparty/notepad-2/notepadCore.c
new file mode 100644
index 00000000..abb189bc
--- /dev/null
+++ b/demos/3rdparty/notepad-2/notepadCore.c
@@ -0,0 +1,235 @@
+/*
+ * File: notepadCore.c
+ *
+ * This file is a part of the Notepad demo application for ChibiOS/GFX
+ * Copyright © 2013, Kumar Abhishek [abhishek.kakkar@edaboard.com].
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * The name of 'Kumar Abhishek' may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * DISCLAIMER OF WARRANTY:
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdlib.h>
+
+#include "ch.h"
+#include "hal.h"
+#include "gfx.h"
+
+#include "notepadCore.h"
+#include "notepadUIDefines.h"
+
+#define PEN_IN_DRAWING_AREA(ev) ((ev.x >= ncoreDrawingArea->x) && (ev.x <= (ncoreDrawingArea->x + ncoreDrawingArea->width)) && \
+ (ev.y >= ncoreDrawingArea->y) && (ev.y <= (ncoreDrawingArea->y + ncoreDrawingArea->height)))
+
+/* This is the drawing core */
+static WORKING_AREA(waDrawThread, NCORE_THD_STACK_SIZE);
+
+static uint8_t nPenWidth = 1;
+static uint8_t nMode = NCORE_MODE_DRAW;
+
+static Thread *nThd;
+
+static GHandle ncoreDrawingArea = NULL;
+static BaseSequentialStream *nStatusConsole = NULL;
+
+static void draw_point(coord_t x, coord_t y) {
+ color_t c = ncoreDrawingArea->color;
+
+ if (nMode == NCORE_MODE_DRAW)
+ c = ncoreDrawingArea->color;
+ else if (nMode == NCORE_MODE_ERASE)
+ c = ncoreDrawingArea->bgcolor;
+
+ if (nPenWidth == 1)
+ gdispDrawPixel(x, y, c);
+ else
+ gdispFillCircle(x, y, nPenWidth, c);
+}
+
+/* Bresenham's Line Drawing Algorithm
+ Modified version to draw line of variable thickness */
+static void draw_line(coord_t x0, coord_t y0, coord_t x1, coord_t y1) {
+ int16_t dy, dx;
+ int16_t addx, addy;
+ int16_t P, diff, i;
+
+ if (x1 >= x0) {
+ dx = x1 - x0;
+ addx = 1;
+ } else {
+ dx = x0 - x1;
+ addx = -1;
+ }
+ if (y1 >= y0) {
+ dy = y1 - y0;
+ addy = 1;
+ } else {
+ dy = y0 - y1;
+ addy = -1;
+ }
+
+ if (dx >= dy) {
+ dy *= 2;
+ P = dy - dx;
+ diff = P - dx;
+
+ for(i=0; i<=dx; ++i) {
+ draw_point(x0, y0);
+ if (P < 0) {
+ P += dy;
+ x0 += addx;
+ } else {
+ P += diff;
+ x0 += addx;
+ y0 += addy;
+ }
+ }
+ } else {
+ dx *= 2;
+ P = dx - dy;
+ diff = P - dy;
+
+ for(i=0; i<=dy; ++i) {
+ draw_point(x0, y0);
+ if (P < 0) {
+ P += dx;
+ y0 += addy;
+ } else {
+ P += diff;
+ x0 += addx;
+ y0 += addy;
+ }
+ }
+ }
+}
+
+/* Core thread */
+static msg_t ncoreDrawThread(void *msg) {
+
+ GEventMouse ev, evPrev;
+ coord_t dx, dy;
+
+ int state = 0, dist;
+
+ (void)msg;
+
+ ginputGetMouseStatus(0, &evPrev);
+
+ while (1) {
+
+ // Exit signal received? If yes, terminate.
+ if (chThdShouldTerminate())
+ return 0;
+
+ ginputGetMouseStatus(0, &ev);
+ switch(state) {
+ case 0: if (ev.meta == GMETA_MOUSE_DOWN) {
+ state = 1;
+ if (nMode == NCORE_MODE_FILL && PEN_IN_DRAWING_AREA(ev)) {
+ // Set bgcolor to current color, clear the display.
+ ncoreDrawingArea->bgcolor = ncoreDrawingArea->color;
+ gwinClear(ncoreDrawingArea);
+ }
+ }
+ else
+ chThdYield();
+ break;
+
+
+ case 1: if (ev.meta == GMETA_MOUSE_UP) {
+ state = 0;
+ //chprintf(nStatusConsole, "\nPen Up: (%d, %d)", ev.x, ev.y);
+ break;
+ }
+
+ dx = abs(ev.x - evPrev.x);
+ dy = abs(ev.y - evPrev.y);
+
+ dist = dx * dx + dy * dy;
+
+ if (dist > 0)
+ {
+ gdispSetClip(ncoreDrawingArea->x,
+ ncoreDrawingArea->y,
+ ncoreDrawingArea->width,
+ ncoreDrawingArea->height);
+
+ if (PEN_IN_DRAWING_AREA(ev)){
+ // Do Interpolation
+ if (dist <= 2) {
+ draw_point(ev.x, ev.y);
+ }
+ else if (dist <= 5) {
+ // Line drawing does not give good results for this case.
+ // So draw two pixels directly
+ draw_point(ev.x, ev.y);
+ draw_point((ev.x + evPrev.x) / 2, (ev.y + evPrev.y) / 2);
+ }
+ else if (dx * dx <= MAX_DX && dy * dy <= MAX_DY) {
+ draw_line(ev.x, ev.y, evPrev.x, evPrev.y);
+ }
+ }
+
+ //chprintf(nStatusConsole, "\nPen Down: (%d, %d)", ev.x, ev.y);
+ }
+ break;
+ }
+ evPrev = ev;
+ }
+
+ return 0;
+}
+
+/* Spawn the core thread */
+void ncoreSpawnDrawThread(GHandle drawingArea, BaseSequentialStream *statusConsole) {
+
+ ncoreDrawingArea = drawingArea;
+ nStatusConsole = statusConsole;
+
+ nThd = chThdCreateStatic(waDrawThread,
+ sizeof(waDrawThread),
+ NCORE_THD_PRIO,
+ ncoreDrawThread,
+ NULL);
+
+}
+
+/* Terminate the core thread, wait for control release */
+void ncoreTerminateDrawThread(void) {
+ chThdTerminate(nThd);
+ chThdWait(nThd);
+}
+
+/* Get and set the pen width
+ * Brush is cicular, width is pixel radius */
+void ncoreSetPenWidth(uint8_t penWidth) { nPenWidth = penWidth; }
+uint8_t ncoreGetPenWidth(void) { return nPenWidth; }
+
+/* Get and set the drawing color */
+void ncoreSetPenColor(color_t penColor) { gwinSetColor(ncoreDrawingArea, penColor); }
+color_t ncoreGetPenColor(void) { return ncoreDrawingArea->color; }
+
+/* Set mode */
+void ncoreSetMode(uint8_t mode) { nMode = mode; }
+uint8_t ncoreGetMode(void) { return nMode; }
diff --git a/demos/3rdparty/notepad-2/notepadCore.h b/demos/3rdparty/notepad-2/notepadCore.h
new file mode 100644
index 00000000..b4f1b185
--- /dev/null
+++ b/demos/3rdparty/notepad-2/notepadCore.h
@@ -0,0 +1,66 @@
+/*
+ * File: notepadCore.h
+ *
+ * This file is a part of the Notepad demo application for ChibiOS/GFX
+ * Copyright © 2013, Kumar Abhishek [abhishek.kakkar@edaboard.com].
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * The name of 'Kumar Abhishek' may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * DISCLAIMER OF WARRANTY:
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef NOTEPADCORE_H_
+#define NOTEPADCORE_H_
+
+/* Configuration */
+#define NCORE_THD_STACK_SIZE 256
+#define NCORE_THD_PRIO (NORMALPRIO + 1)
+
+#define NCORE_MODE_DRAW 0
+#define NCORE_MODE_ERASE 1
+#define NCORE_MODE_FILL 2
+
+#define MAX_DX 500
+#define MAX_DY 500
+
+/* Spawn the notepad core thread */
+void ncoreSpawnDrawThread(GHandle drawingArea, BaseSequentialStream *statusConsole);
+
+/* Terminate the core thread, wait for control release */
+void ncoreTerminateDrawThread(void);
+
+/* Get and set the pen width
+ * Brush is cicular, width is pixel radius */
+void ncoreSetPenWidth(uint8_t penWidth);
+uint8_t ncoreGetPenWidth(void);
+
+/* Get and set the drawing color */
+void ncoreSetPenColor(color_t penColor);
+color_t ncoreGetPenColor(void);
+
+/* Get and set the pen mode */
+void ncoreSetMode(uint8_t mode);
+uint8_t ncoreGetMode(void);
+
+#endif /* NOTEPADCORE_H_ */
diff --git a/demos/3rdparty/notepad-2/notepadUIDefines.h b/demos/3rdparty/notepad-2/notepadUIDefines.h
new file mode 100644
index 00000000..5ed08d00
--- /dev/null
+++ b/demos/3rdparty/notepad-2/notepadUIDefines.h
@@ -0,0 +1,114 @@
+/*
+ * File: notepadUIDefines.h
+ *
+ * This file is a part of the Notepad demo application for ChibiOS/GFX
+ * Copyright © 2013, Kumar Abhishek [abhishek.kakkar@edaboard.com].
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * The name of 'Kumar Abhishek' may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * DISCLAIMER OF WARRANTY:
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef NOTEPADUIDEFINES_H_
+#define NOTEPADUIDEFINES_H_
+
+#define NPAD_TITLETEXT_STR "ChibiOS/GFX Notepad Demo"
+
+/* UI Element dimenstions */
+#define NPAD_TITLEBAR_HEIGHT 18
+#define NPAD_TITLETEXT_START_X 5
+#define NPAD_TITLETEXT_START_Y 0
+
+#define NPAD_TOOLBAR_BTN_WIDTH 20
+#define NPAD_TOOLBAR_BTN_HEIGHT 20
+
+#define NPAD_TOOLBAR_INTERBTN_PADDING_X 2
+#define NPAD_TOOLBAR_1_START_X 5
+#define NPAD_TOOLBAR_1_Y (NPAD_TITLEBAR_HEIGHT + 3)
+#define NPAD_TOOLBAR_1_X(n) (NPAD_TOOLBAR_1_START_X + \
+ (NPAD_TOOLBAR_BTN_WIDTH + \
+ NPAD_TOOLBAR_INTERBTN_PADDING_X) * n)
+
+#define NPAD_TOOLBAR_INTERBTN_PADDING_Y 2
+#define NPAD_TOOLBAR_2_START_Y (NPAD_DRAWING_AREA_START_Y + 6)
+#define NPAD_TOOLBAR_2_X 4
+#define NPAD_TOOLBAR_2_Y(n) (NPAD_TOOLBAR_2_START_Y + \
+ (NPAD_TOOLBAR_BTN_HEIGHT + \
+ NPAD_TOOLBAR_INTERBTN_PADDING_Y) * n)
+
+#define NPAD_DRAWING_AREA_START_X 28
+#define NPAD_DRAWING_AREA_START_Y 46
+#define NPAD_DRAWING_AREA_END_X 10
+#define NPAD_DRAWING_AREA_END_Y 24
+#define NPAD_DRAWING_AREA_WIDTH (swidth - \
+ NPAD_DRAWING_AREA_START_X - \
+ NPAD_DRAWING_AREA_END_X)
+#define NPAD_DRAWING_AREA_HEIGHT (sheight - \
+ NPAD_DRAWING_AREA_START_Y - \
+ NPAD_DRAWING_AREA_END_Y)
+
+#define NPAD_COLORBAR_WIDTH 160
+#define NPAD_COLORBAR_HEIGHT 20
+#define NPAD_COLORBAR_X (swidth - NPAD_DRAWING_AREA_END_X - NPAD_COLORBAR_WIDTH)
+#define NPAD_COLORBAR_Y NPAD_TOOLBAR_1_Y
+
+#define NPAD_COLORBAR_SEL_WIDTH (2 * NPAD_TOOLBAR_BTN_WIDTH)
+#define NPAD_COLORBAR_SEL_HEIGHT (NPAD_TOOLBAR_BTN_HEIGHT)
+#define NPAD_COLORBAR_SEL_X (NPAD_COLORBAR_X - NPAD_COLORBAR_SEL_WIDTH - 24)
+#define NPAD_COLORBAR_SEL_Y NPAD_TOOLBAR_1_Y
+
+#define NPAD_ICON_WIDTH 16
+#define NPAD_ICON_HEIGHT 16
+#define NPAD_ICON_START(x) ((x) * NPAD_ICON_WIDTH)
+
+
+#define NPAD_STATUSBAR_ICON_START_X 5
+#define NPAD_STATUSBAR_ICON_START_Y (sheight - 5 - NPAD_ICON_HEIGHT - 1)
+
+
+#define NPAD_STATUSBAR_PADDING 5
+#define NPAD_STATUSBAR_START_X (NPAD_STATUSBAR_ICON_START_X + NPAD_ICON_WIDTH + NPAD_STATUSBAR_PADDING)
+#define NPAD_STATUSBAR_START_Y (NPAD_STATUSBAR_ICON_START_Y + 3)
+#define NPAD_STATUSBAR_WIDTH (swidth - NPAD_STATUSBAR_START_X - 2)
+#define NPAD_STATUSBAR_HEIGHT 15
+
+/* Color scheme definition */
+typedef struct colScheme {
+ color_t titleBarColor;
+ color_t titleTextColor;
+
+ color_t winBgColor;
+ color_t drawingWinBorder;
+
+ color_t toolbarSeparator;
+ color_t toolbarBgUnsel;
+ color_t toolbarBgActive;
+ color_t toolbarBgSel;
+
+ color_t statusBarText;
+} NColorScheme;
+
+
+
+#endif /* NOTEPADUIDEFINES_H_ */
diff --git a/demos/3rdparty/notepad-2/readme.txt b/demos/3rdparty/notepad-2/readme.txt
new file mode 100644
index 00000000..660d1404
--- /dev/null
+++ b/demos/3rdparty/notepad-2/readme.txt
@@ -0,0 +1,17 @@
+# Notepad-2 Demo for ChibiOS/GFX
+
+This demo showcases an improved Notepad demo for the ChibiOS/GFX project.
+
+## Features:
+
+* 2 Different UI Skins available
+* Draw in 8 different colors in 8 different thickness
+* Pen, Erase and Fill Modes (Fill: Fills the entire canvas, this is not flood fill)
+
+This demo is planned to support Loading and Saving to SD Card the sketches made in the near future.
+
+## License:
+Copyright © 2013 Kumar Abhishek [abhishek.kakkar@edaboard.com]. All Rights Reserved
+This code is made available under the terms of the 3-clause BSD License.
+
+Some of the icons in the set have been taken from the fugue-icons-set by Yusuke Kamiyamane: http://p.yusukekamiyamane.com/ . These icons are covered by a Creative Commons Attribution 3.0 License. \ No newline at end of file
diff --git a/demos/3rdparty/notepad-2/toolbarIcons.gif b/demos/3rdparty/notepad-2/toolbarIcons.gif
new file mode 100644
index 00000000..fb9e7cc9
--- /dev/null
+++ b/demos/3rdparty/notepad-2/toolbarIcons.gif
Binary files differ
diff --git a/demos/3rdparty/notepad-2/toolbarIcons.h b/demos/3rdparty/notepad-2/toolbarIcons.h
new file mode 100644
index 00000000..ad2720a2
--- /dev/null
+++ b/demos/3rdparty/notepad-2/toolbarIcons.h
@@ -0,0 +1,237 @@
+/*
+ * File: toolbarIcons.h
+ *
+ * This file is a part of the Notepad demo application for ChibiOS/GFX
+ *
+ * This file has a different license from the others.
+ *
+ * Icons [0-10 and 15] in this set are taken from the fugue-icons-set
+ * by Yusuke Kamiyamane [http://p.yusukekamiyamane.com/] .These icons
+ * are covered by a Creative Commons Attribution 3.0 License:
+ * http://creativecommons.org/licenses/by/3.0/
+ * and have been used according to the terms of the license.
+ *
+ * The file is in a filmstrip format of 16x16 icons converted to GIF Format
+ * See toolbarIcons.gif for the GIF source
+ *
+ * Total 16 icons (256 x 16)
+ * 0 -> New
+ * 1 -> Open
+ * 2 -> Save
+ * 3 -> Brush
+ * 4 -> Color Palette
+ * 5 -> Pencil
+ * 6 -> Eraser
+ * 7 -> Fill Color
+ * 8 -> Cross
+ * 9 -> Plus
+ * 10 -> Minus
+ * 11 -> Cross (Round)
+ * 12 -> Info
+ * 13 -> Tick
+ * 14 -> Warning
+ * 15 -> 32-bit processor
+ *
+ */
+
+static const unsigned char toolbarIcons[] = {
+ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x00, 0x01, 0x10, 0x00, 0xF7, 0x00, 0x00, 0x05, 0x05, 0x05,
+ 0x18, 0x18, 0x18, 0x00, 0x33, 0x00, 0x0B, 0x2A, 0x2A, 0x17, 0x38, 0x38, 0x31, 0x09, 0x09, 0x2A,
+ 0x38, 0x1D, 0x29, 0x29, 0x29, 0x29, 0x35, 0x35, 0x32, 0x2E, 0x26, 0x3A, 0x3A, 0x3A, 0x02, 0x4D,
+ 0x02, 0x00, 0x5B, 0x02, 0x1E, 0x5D, 0x1E, 0x02, 0x70, 0x03, 0x2A, 0x6A, 0x2A, 0x2C, 0x50, 0x50,
+ 0x3E, 0x65, 0x65, 0x5C, 0x01, 0x01, 0x68, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x7D, 0x3C, 0x06, 0x71,
+ 0x27, 0x27, 0x45, 0x00, 0x67, 0x51, 0x02, 0x79, 0x45, 0x36, 0x4E, 0x55, 0x47, 0x0A, 0x4F, 0x57,
+ 0x32, 0x6C, 0x52, 0x01, 0x7A, 0x64, 0x00, 0x46, 0x46, 0x46, 0x52, 0x4F, 0x47, 0x54, 0x54, 0x54,
+ 0x43, 0x51, 0x7C, 0x5E, 0x70, 0x5E, 0x45, 0x6D, 0x6D, 0x4B, 0x74, 0x74, 0x53, 0x7D, 0x7D, 0x6A,
+ 0x48, 0x48, 0x67, 0x67, 0x67, 0x78, 0x78, 0x78, 0x09, 0x2B, 0x91, 0x1B, 0x3D, 0xA3, 0x3B, 0x2B,
+ 0x97, 0x1E, 0x71, 0x8E, 0x19, 0x6C, 0xB7, 0x2A, 0x53, 0xB4, 0x38, 0x6B, 0x9E, 0x37, 0x71, 0xB5,
+ 0x3C, 0x5E, 0xC4, 0x29, 0x78, 0xC5, 0x5B, 0x02, 0x86, 0x49, 0x55, 0xBC, 0x42, 0x75, 0xA8, 0x7C,
+ 0x49, 0x95, 0x50, 0x72, 0xD6, 0x5A, 0x7C, 0xE2, 0x00, 0x91, 0x0F, 0x13, 0x9C, 0x24, 0x00, 0xA7,
+ 0x13, 0x12, 0xA6, 0x23, 0x11, 0xB9, 0x22, 0x2E, 0x83, 0x2E, 0x31, 0x86, 0x31, 0x34, 0x98, 0x34,
+ 0x28, 0xB3, 0x39, 0x34, 0xBC, 0x45, 0x0F, 0xCC, 0x1F, 0x0F, 0xC8, 0x20, 0x12, 0xC9, 0x23, 0x11,
+ 0xD5, 0x22, 0x22, 0xC3, 0x34, 0x3B, 0xC4, 0x4C, 0x48, 0x9D, 0x48, 0x54, 0xA9, 0x54, 0x67, 0xAD,
+ 0x67, 0x60, 0xB5, 0x60, 0x7A, 0xB4, 0x7A, 0x44, 0xCC, 0x55, 0x4D, 0xD5, 0x5E, 0x51, 0xDB, 0x62,
+ 0x5B, 0xE3, 0x6C, 0x6E, 0xC3, 0x6E, 0x1B, 0xA1, 0xE2, 0x3B, 0x8A, 0xD6, 0x3E, 0x9C, 0xE7, 0x38,
+ 0xC5, 0xFF, 0x55, 0x88, 0xBA, 0x70, 0x9E, 0xB9, 0x78, 0xA7, 0xB9, 0x4C, 0x91, 0xCD, 0x52, 0x8F,
+ 0xF6, 0x5F, 0xBC, 0xE8, 0x68, 0x9B, 0xCE, 0x63, 0x85, 0xEB, 0x72, 0xA4, 0xD1, 0x66, 0xA6, 0xFF,
+ 0x5D, 0xD1, 0xFF, 0x75, 0xC8, 0xEE, 0x88, 0x00, 0x00, 0x95, 0x01, 0x01, 0x9B, 0x11, 0x11, 0x9B,
+ 0x02, 0x20, 0xA7, 0x00, 0x00, 0xA7, 0x14, 0x14, 0xB3, 0x01, 0x01, 0xB8, 0x11, 0x11, 0xA7, 0x02,
+ 0x23, 0xB4, 0x02, 0x25, 0xAD, 0x26, 0x26, 0xB5, 0x28, 0x28, 0xBC, 0x34, 0x34, 0x89, 0x45, 0x01,
+ 0x8A, 0x5B, 0x00, 0x93, 0x49, 0x01, 0x9A, 0x50, 0x05, 0x98, 0x55, 0x11, 0x8E, 0x6B, 0x01, 0x89,
+ 0x75, 0x04, 0x98, 0x66, 0x00, 0x96, 0x77, 0x03, 0xB0, 0x5C, 0x06, 0xA7, 0x6F, 0x00, 0xAB, 0x65,
+ 0x13, 0xA6, 0x78, 0x02, 0xA9, 0x7A, 0x1C, 0xBC, 0x61, 0x04, 0xB7, 0x7A, 0x00, 0xB2, 0x78, 0x38,
+ 0x8A, 0x6A, 0x4B, 0xC9, 0x0C, 0x0C, 0xC9, 0x12, 0x12, 0xD8, 0x01, 0x01, 0xD4, 0x11, 0x11, 0xC6,
+ 0x27, 0x27, 0xC7, 0x39, 0x39, 0xE4, 0x13, 0x00, 0xD2, 0x5E, 0x28, 0xC0, 0x62, 0x04, 0xC9, 0x78,
+ 0x26, 0xEA, 0x40, 0x30, 0xCA, 0x42, 0x42, 0xD5, 0x4D, 0x4D, 0xD8, 0x50, 0x50, 0xD1, 0x7B, 0x5A,
+ 0xE4, 0x59, 0x56, 0xEB, 0x69, 0x5C, 0xF1, 0x6C, 0x6A, 0x80, 0x48, 0x9B, 0x89, 0x56, 0xA2, 0x90,
+ 0x5D, 0xA9, 0x96, 0x63, 0xAF, 0xA7, 0x74, 0xC0, 0xD2, 0x7D, 0x8E, 0x99, 0x85, 0x0B, 0xA6, 0x8A,
+ 0x03, 0xAB, 0x94, 0x01, 0xA4, 0x93, 0x1C, 0xB0, 0x82, 0x0B, 0xB8, 0x85, 0x17, 0xB3, 0x9A, 0x03,
+ 0xAF, 0x8E, 0x2E, 0xB7, 0xA6, 0x30, 0x91, 0x83, 0x48, 0x8B, 0x84, 0x66, 0x9A, 0x88, 0x71, 0x9B,
+ 0x9A, 0x75, 0x88, 0xA2, 0x56, 0x97, 0xB3, 0x67, 0xB1, 0x94, 0x44, 0xBA, 0x9F, 0x63, 0xBD, 0xA3,
+ 0x66, 0xA7, 0xC6, 0x79, 0xCA, 0x87, 0x00, 0xD0, 0x88, 0x3C, 0xCE, 0xB0, 0x14, 0xCF, 0xB7, 0x2E,
+ 0xCA, 0x96, 0x56, 0xC7, 0xAF, 0x4C, 0xD6, 0xAE, 0x6D, 0xE7, 0x93, 0x71, 0xEA, 0xBF, 0x5F, 0xE2,
+ 0xB1, 0x79, 0xFE, 0xCC, 0x04, 0xE6, 0xCA, 0x34, 0xDE, 0xCD, 0x56, 0xE3, 0xD2, 0x5E, 0xEB, 0xC4,
+ 0x67, 0xE9, 0xCA, 0x7F, 0xE6, 0xD5, 0x64, 0xFA, 0xF3, 0x58, 0xEB, 0xE0, 0x64, 0xF6, 0xE5, 0x79,
+ 0x83, 0x83, 0x84, 0x8A, 0x86, 0x95, 0x95, 0x95, 0x96, 0x9C, 0x9C, 0xAD, 0x80, 0xBF, 0x80, 0x96,
+ 0xAB, 0xAB, 0xB8, 0xB4, 0x8F, 0xA5, 0xA6, 0xA8, 0xA9, 0xA9, 0xB8, 0xA5, 0xB6, 0xB6, 0xBD, 0xAF,
+ 0xA0, 0xB8, 0xB8, 0xB9, 0x85, 0x80, 0xCB, 0x84, 0xAC, 0xCB, 0x81, 0xB6, 0xE3, 0xBA, 0x87, 0xD3,
+ 0xB6, 0xB9, 0xC5, 0xB0, 0xD1, 0x84, 0xB0, 0xCA, 0xB0, 0x94, 0xC7, 0xF8, 0x92, 0xE3, 0xFF, 0xAD,
+ 0xC3, 0xCD, 0xAA, 0xD3, 0xFD, 0xBF, 0xE1, 0xF1, 0xDA, 0x85, 0x96, 0xC7, 0xB6, 0x80, 0xF1, 0x89,
+ 0x91, 0xE9, 0x9B, 0xAC, 0xE6, 0xB8, 0x84, 0xEB, 0xA4, 0xB5, 0xF2, 0xBE, 0xB9, 0xC3, 0x90, 0xDC,
+ 0xCD, 0x9A, 0xE6, 0xD9, 0xA6, 0xF2, 0xFB, 0xB3, 0xC4, 0xD8, 0xC7, 0x8B, 0xDB, 0xD4, 0xB0, 0xEA,
+ 0xC4, 0x89, 0xEE, 0xC4, 0x91, 0xE9, 0xD3, 0x87, 0xEC, 0xD5, 0x91, 0xF0, 0xC8, 0x95, 0xF1, 0xD5,
+ 0x89, 0xF4, 0xDA, 0x95, 0xFD, 0xEC, 0x84, 0xF8, 0xE2, 0x9B, 0xFF, 0xFF, 0x84, 0xE5, 0xE2, 0xBC,
+ 0xFC, 0xE9, 0xA4, 0xFF, 0xF1, 0xAC, 0xC9, 0xC9, 0xC9, 0xD9, 0xD9, 0xD9, 0xD8, 0xD8, 0xEA, 0xDB,
+ 0xEA, 0xEA, 0xDB, 0xEB, 0xFF, 0xF3, 0xE8, 0xCA, 0xE7, 0xE7, 0xE7, 0xE1, 0xE1, 0xF2, 0xE6, 0xF2,
+ 0xE6, 0xE8, 0xF3, 0xF4, 0xFD, 0xF0, 0xEF, 0xF8, 0xF9, 0xF9, 0x00, 0x00, 0x00, 0x21, 0xF9, 0x04,
+ 0x01, 0x0A, 0x00, 0xFF, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x08,
+ 0xFE, 0x00, 0xFF, 0xFD, 0x2B, 0x41, 0xA2, 0x84, 0xC1, 0x83, 0x06, 0x05, 0x2A, 0xFC, 0xD7, 0xAA,
+ 0xA1, 0xC3, 0x87, 0x0D, 0x17, 0x4A, 0x94, 0x58, 0xA5, 0xCA, 0xC4, 0x8B, 0x0A, 0x0F, 0x8D, 0xC1,
+ 0xC8, 0xB1, 0xE3, 0x3F, 0x44, 0x88, 0x08, 0x75, 0x5C, 0xC3, 0x86, 0x24, 0x46, 0x0F, 0x20, 0x14,
+ 0x1C, 0xF0, 0xC8, 0xB2, 0xA5, 0xCB, 0x97, 0x30, 0x63, 0xB6, 0xA4, 0x77, 0xD1, 0x81, 0xCD, 0x9B,
+ 0x38, 0x73, 0x2A, 0x2C, 0xE1, 0x8F, 0x9F, 0xCF, 0x9F, 0xD6, 0x12, 0x2E, 0x6C, 0xB5, 0x6E, 0x57,
+ 0xAD, 0x75, 0xEE, 0xE2, 0x29, 0x55, 0xDA, 0x4A, 0xE1, 0x8C, 0x19, 0x08, 0xA3, 0x52, 0xA1, 0x42,
+ 0xA3, 0xA5, 0x23, 0x32, 0x63, 0x0E, 0x49, 0xF4, 0xA3, 0xA8, 0xAB, 0x57, 0x45, 0x7E, 0x5A, 0x82,
+ 0x50, 0xB3, 0x2D, 0x4D, 0x1A, 0x8C, 0x6C, 0xD8, 0x8C, 0x1B, 0xB7, 0x66, 0xCD, 0x45, 0x10, 0x02,
+ 0x03, 0x70, 0x3C, 0x43, 0xB7, 0xAE, 0x5D, 0xBA, 0x0B, 0x77, 0xE8, 0xDD, 0xCB, 0x57, 0xEF, 0xC2,
+ 0xBB, 0x80, 0xCF, 0x4C, 0xFC, 0x16, 0x09, 0x24, 0xC8, 0x48, 0xDF, 0x30, 0x62, 0xE3, 0x32, 0xA5,
+ 0xF1, 0x14, 0x2E, 0xD8, 0x2E, 0xD2, 0x9B, 0xB6, 0x04, 0x88, 0x65, 0x20, 0x4B, 0xA6, 0xD1, 0xC4,
+ 0x48, 0xEF, 0xD6, 0xAD, 0xCD, 0x0B, 0x1D, 0xC4, 0x53, 0x22, 0xA5, 0xB4, 0x69, 0xD3, 0x4A, 0xE2,
+ 0x39, 0xD8, 0xE9, 0xD3, 0x1E, 0x3F, 0x7B, 0xF6, 0xE8, 0x29, 0xF3, 0x47, 0x70, 0xA8, 0xBC, 0x78,
+ 0xEE, 0x76, 0xA5, 0x3A, 0xC6, 0x9B, 0xF7, 0x28, 0x52, 0xA4, 0xFE, 0xCD, 0x10, 0xE7, 0xAF, 0x78,
+ 0xF1, 0x67, 0x5A, 0x92, 0x6B, 0xA9, 0x26, 0x43, 0x86, 0x47, 0x32, 0x58, 0x37, 0x2A, 0xF4, 0xE3,
+ 0x27, 0x51, 0xA4, 0x48, 0xB4, 0xBA, 0xD9, 0x92, 0x05, 0xEB, 0x53, 0xD8, 0x8E, 0x20, 0x40, 0xFE,
+ 0xF8, 0x9B, 0x14, 0x49, 0xF0, 0x44, 0x92, 0xE3, 0xBC, 0x79, 0x63, 0xCB, 0x66, 0xA2, 0x07, 0x0F,
+ 0x07, 0x02, 0x00, 0xB8, 0x78, 0xC6, 0xD0, 0xA4, 0xFB, 0xF8, 0xF3, 0x1B, 0x32, 0xBF, 0xE3, 0x48,
+ 0x94, 0xFF, 0x00, 0x02, 0x08, 0x45, 0x10, 0x3B, 0x08, 0x54, 0x5F, 0x7E, 0x08, 0x4E, 0xB2, 0xDF,
+ 0x42, 0x92, 0x18, 0xE6, 0x20, 0x22, 0x93, 0x4C, 0x24, 0x86, 0x63, 0x14, 0x4E, 0x21, 0x86, 0x44,
+ 0xF4, 0x34, 0x71, 0xD9, 0x86, 0x40, 0x34, 0x01, 0x9A, 0x44, 0xE8, 0x78, 0x86, 0xCE, 0x44, 0x0E,
+ 0x28, 0xA1, 0x84, 0x34, 0x27, 0xA6, 0x88, 0x22, 0x8A, 0x4A, 0xAC, 0x26, 0x10, 0x09, 0x3D, 0xBD,
+ 0x06, 0x9B, 0x3D, 0xC6, 0xD4, 0x08, 0xC1, 0x50, 0x4B, 0xC5, 0x33, 0x8B, 0x71, 0x3C, 0x06, 0x37,
+ 0x43, 0x38, 0x3C, 0xFA, 0xB3, 0x9C, 0x18, 0x61, 0x14, 0x29, 0x86, 0x73, 0x1C, 0x41, 0x37, 0xC6,
+ 0x18, 0x8E, 0x08, 0x94, 0x87, 0x1F, 0x8B, 0xD8, 0xE2, 0xC8, 0x7D, 0x86, 0xCC, 0x02, 0x0B, 0x30,
+ 0xC0, 0x84, 0x42, 0x1D, 0x47, 0x9C, 0x68, 0xE2, 0xCF, 0x3C, 0xF4, 0x8C, 0x61, 0xDE, 0x42, 0xE8,
+ 0xA9, 0xA7, 0x1E, 0x5B, 0x6E, 0x2D, 0x04, 0x5F, 0x3E, 0x28, 0x00, 0x30, 0x9F, 0x44, 0x67, 0x90,
+ 0x77, 0xDD, 0x9C, 0x74, 0x96, 0x27, 0xD0, 0x0E, 0x50, 0x3C, 0xA1, 0xE7, 0x13, 0x48, 0x20, 0xB1,
+ 0xE7, 0x13, 0x50, 0x14, 0xF8, 0x4F, 0x9C, 0x75, 0x16, 0x3A, 0xE6, 0x24, 0x88, 0x30, 0xC2, 0x88,
+ 0x83, 0x8A, 0x42, 0xB8, 0xD0, 0x84, 0x8E, 0x15, 0x47, 0xE1, 0x85, 0x0A, 0x69, 0xC8, 0xE1, 0x86,
+ 0x1E, 0x4E, 0xD4, 0x99, 0x67, 0x9F, 0x49, 0xE4, 0x00, 0x13, 0x49, 0x90, 0xF3, 0x40, 0x3C, 0xA3,
+ 0x96, 0x4A, 0x4E, 0x12, 0x4C, 0xB8, 0xF8, 0x0F, 0x8C, 0x3D, 0xF9, 0xE3, 0x1A, 0x6C, 0xFE, 0xF4,
+ 0xF0, 0x33, 0x02, 0x8E, 0x4B, 0x91, 0xB2, 0xC5, 0x16, 0x60, 0x80, 0x71, 0xCD, 0x35, 0xFE, 0xF8,
+ 0x08, 0x64, 0xAB, 0xFC, 0x7C, 0xA1, 0x9C, 0x16, 0x56, 0xB8, 0xD0, 0x42, 0x92, 0x4A, 0x4A, 0xF7,
+ 0x8F, 0x1F, 0xB1, 0x98, 0x63, 0xCB, 0x21, 0x87, 0xB8, 0x01, 0x89, 0x2D, 0xA2, 0x88, 0xD2, 0xC9,
+ 0x2C, 0xAE, 0xE4, 0x81, 0x11, 0x28, 0x9B, 0xB4, 0x23, 0x0A, 0x3D, 0x01, 0x14, 0x30, 0x51, 0x30,
+ 0xC1, 0x8C, 0xC3, 0x0D, 0x37, 0xDE, 0xA0, 0x9B, 0x0D, 0x37, 0x69, 0x0A, 0xB4, 0x26, 0x3D, 0x28,
+ 0xE4, 0xE3, 0x26, 0x9C, 0x93, 0x38, 0xE2, 0x88, 0x3F, 0xF6, 0xDA, 0x8B, 0xAF, 0x23, 0x76, 0xFE,
+ 0x83, 0xA7, 0x13, 0x00, 0x23, 0x51, 0x1C, 0x12, 0x00, 0x3B, 0x11, 0xA8, 0x81, 0xF5, 0xE6, 0xAB,
+ 0xB0, 0xBD, 0xFD, 0x7E, 0x93, 0x68, 0x3F, 0xFD, 0x2C, 0xFA, 0x70, 0xC4, 0x88, 0x24, 0xF6, 0x0F,
+ 0x36, 0x15, 0x4A, 0x4A, 0x61, 0x64, 0xFF, 0x4C, 0x73, 0x29, 0x10, 0xC5, 0xF8, 0xB3, 0x8F, 0x65,
+ 0xD3, 0x4C, 0x14, 0x22, 0xA7, 0x23, 0x86, 0x26, 0x0D, 0x39, 0x1F, 0xBC, 0xE7, 0xF2, 0x7B, 0x1F,
+ 0x90, 0x23, 0x8D, 0xAA, 0x23, 0x00, 0x2B, 0x23, 0x6C, 0xFC, 0x90, 0xB0, 0xD0, 0x1F, 0xB8, 0x25,
+ 0x35, 0x8A, 0x33, 0x40, 0x7F, 0x61, 0xCD, 0x3D, 0xBD, 0x0A, 0x07, 0xA4, 0x6B, 0x3F, 0xBD, 0xC6,
+ 0x0F, 0x0C, 0x30, 0xAC, 0x80, 0x2C, 0x1A, 0x63, 0x50, 0xA0, 0x50, 0x1E, 0xB3, 0x68, 0x67, 0x0B,
+ 0x24, 0x68, 0x4C, 0xBB, 0x9D, 0x26, 0xB2, 0xD8, 0x62, 0x8B, 0xB6, 0x13, 0x71, 0xC2, 0x49, 0x3B,
+ 0xC0, 0xE4, 0x62, 0xC7, 0x9B, 0x0B, 0x91, 0x5B, 0xDC, 0xB9, 0xEA, 0xAE, 0xDB, 0xEE, 0xBB, 0xF3,
+ 0xA0, 0xC0, 0x0C, 0x3D, 0xF3, 0x2A, 0x44, 0x46, 0x24, 0x8D, 0x18, 0xD7, 0x48, 0xFE, 0xDE, 0xC5,
+ 0x35, 0x72, 0x95, 0x40, 0x39, 0x40, 0xD1, 0x27, 0x12, 0x42, 0x14, 0x27, 0xC4, 0xE0, 0x4E, 0xE4,
+ 0x20, 0xD0, 0xDD, 0x7B, 0x37, 0xEE, 0xB8, 0xDF, 0x64, 0x08, 0x54, 0x18, 0x23, 0xFD, 0xF8, 0x13,
+ 0x31, 0xE5, 0x96, 0x2F, 0x1A, 0x89, 0x40, 0x8C, 0x55, 0xE8, 0x39, 0x17, 0x02, 0x55, 0x76, 0xE9,
+ 0x3E, 0xFE, 0x14, 0x63, 0xD9, 0x12, 0x18, 0x7A, 0xE6, 0xA6, 0x67, 0x1F, 0x96, 0xF8, 0x80, 0x07,
+ 0xF4, 0x7C, 0x09, 0xC2, 0x3C, 0xFE, 0xD0, 0xE3, 0xC1, 0x03, 0x2D, 0x2A, 0x54, 0x33, 0xB0, 0xAE,
+ 0x2A, 0x1D, 0xC1, 0xCE, 0xEE, 0xB0, 0xC3, 0x8E, 0x3B, 0xB1, 0xF0, 0x18, 0x0D, 0x3F, 0x45, 0xFF,
+ 0x78, 0xF3, 0x8C, 0xB0, 0x5D, 0xD1, 0xCC, 0x0C, 0x18, 0x41, 0xF7, 0x46, 0x19, 0x52, 0x4F, 0xAD,
+ 0x4E, 0x37, 0xDD, 0x98, 0x83, 0xFD, 0xF6, 0xD8, 0x2F, 0xF3, 0xC5, 0x17, 0x81, 0x4C, 0x04, 0xCA,
+ 0xD8, 0xC0, 0xF4, 0xC2, 0x09, 0x28, 0x13, 0xA1, 0x80, 0x42, 0x71, 0xF9, 0xF8, 0x83, 0x6E, 0x26,
+ 0xD9, 0x6C, 0xB3, 0x86, 0x19, 0xEE, 0x1E, 0x90, 0x0F, 0x3D, 0xF3, 0x20, 0x83, 0xC2, 0x30, 0xC8,
+ 0x80, 0x7B, 0x83, 0x17, 0x8B, 0x7B, 0xC4, 0x1B, 0xDA, 0xC0, 0x3E, 0x7A, 0x18, 0xB0, 0x0C, 0x68,
+ 0x70, 0x43, 0xE4, 0xFE, 0x91, 0x83, 0x27, 0x08, 0x21, 0x08, 0x10, 0xCC, 0x47, 0x3E, 0x74, 0x40,
+ 0x41, 0x1D, 0x04, 0x41, 0x71, 0xFF, 0x20, 0x83, 0x00, 0xDF, 0xC0, 0x41, 0x37, 0xA0, 0x01, 0x0D,
+ 0x65, 0x40, 0xA0, 0x02, 0x05, 0x62, 0x18, 0xCC, 0x41, 0x2C, 0x73, 0x86, 0x11, 0x88, 0xE7, 0x34,
+ 0x46, 0x21, 0x81, 0x7C, 0x2C, 0x64, 0x23, 0xBB, 0x0C, 0x88, 0x54, 0x07, 0x00, 0x11, 0x85, 0x86,
+ 0x15, 0xE9, 0x50, 0x00, 0x08, 0x3C, 0xE0, 0x0F, 0x97, 0xF9, 0x43, 0x01, 0xFE, 0xE9, 0x60, 0x85,
+ 0xAA, 0x22, 0x10, 0x24, 0xE4, 0xE1, 0xCC, 0x04, 0x84, 0x10, 0x84, 0x40, 0xFE, 0x10, 0xBC, 0xE1,
+ 0x6D, 0xE2, 0x15, 0x50, 0xF4, 0x87, 0x31, 0x7C, 0xE2, 0x23, 0x70, 0xD4, 0x23, 0x69, 0x48, 0xE3,
+ 0x47, 0x3D, 0xC0, 0x01, 0xBD, 0x89, 0x40, 0xE7, 0x10, 0x68, 0xA8, 0x9E, 0x42, 0xE6, 0x30, 0x0B,
+ 0x73, 0xC4, 0x22, 0x0F, 0xCD, 0xCA, 0xDE, 0xF6, 0xBA, 0x40, 0x0D, 0x6A, 0x5C, 0x41, 0x22, 0x62,
+ 0x23, 0x9B, 0x2E, 0x36, 0xC1, 0x89, 0xF4, 0xC5, 0x4B, 0x82, 0xFE, 0x90, 0x60, 0x26, 0x32, 0xB1,
+ 0x0D, 0x33, 0xD0, 0xEF, 0x1F, 0x70, 0x63, 0xC6, 0x30, 0xE6, 0x11, 0x0C, 0x62, 0x24, 0xA3, 0x1E,
+ 0x21, 0xC0, 0xC1, 0x0D, 0x32, 0xE8, 0x88, 0x37, 0xB8, 0xA1, 0x0C, 0x60, 0x3A, 0xE0, 0x07, 0xD1,
+ 0xB0, 0xC0, 0x1C, 0x38, 0x21, 0x08, 0x79, 0x34, 0x20, 0x3D, 0x24, 0x98, 0x0F, 0x1E, 0xF0, 0x00,
+ 0x83, 0x64, 0x68, 0x64, 0xED, 0x22, 0xC9, 0xC9, 0x0F, 0x2E, 0x90, 0x51, 0x95, 0x43, 0x61, 0x0A,
+ 0xFF, 0xB1, 0x42, 0x7F, 0x78, 0xCE, 0x85, 0xA3, 0x2B, 0xDD, 0x86, 0x16, 0xB2, 0xA9, 0x5B, 0xAC,
+ 0x8E, 0x75, 0x0A, 0x71, 0x40, 0x12, 0x1E, 0xA0, 0x00, 0x64, 0xF8, 0x63, 0x18, 0x1E, 0x08, 0x46,
+ 0x3E, 0x90, 0xA1, 0x80, 0x07, 0x24, 0x61, 0x88, 0x3C, 0x42, 0x9E, 0x11, 0xED, 0x61, 0x82, 0xB2,
+ 0x2C, 0x51, 0x78, 0xC2, 0xF3, 0x04, 0x2C, 0x60, 0xF1, 0x0A, 0x7F, 0x64, 0xE1, 0x1A, 0xFC, 0x08,
+ 0x0E, 0x06, 0xC0, 0x01, 0x8D, 0x6E, 0x7A, 0xF3, 0x9B, 0xD0, 0xE8, 0xE2, 0x42, 0xA0, 0xE3, 0x88,
+ 0x36, 0x88, 0x71, 0x21, 0x70, 0x48, 0xE7, 0x3F, 0xE0, 0xA0, 0x8E, 0x58, 0xD0, 0x21, 0x15, 0xD8,
+ 0xBB, 0xC2, 0x15, 0x6A, 0x10, 0x3E, 0x85, 0x70, 0xAB, 0x1D, 0xBD, 0xFE, 0xE8, 0x85, 0x26, 0x36,
+ 0x31, 0x91, 0x13, 0xC4, 0x2B, 0x8F, 0x00, 0x05, 0x53, 0x36, 0xFC, 0x58, 0xBF, 0xFB, 0xCD, 0x23,
+ 0x19, 0x82, 0x04, 0x81, 0x30, 0x92, 0x91, 0x8C, 0x7C, 0x28, 0xE0, 0x06, 0x8B, 0x24, 0x43, 0x23,
+ 0x3C, 0x88, 0x06, 0x4D, 0xE6, 0x63, 0x92, 0x6A, 0xA8, 0xE4, 0x25, 0x35, 0xB9, 0x49, 0x4E, 0x7A,
+ 0x12, 0x94, 0x13, 0xC5, 0x9F, 0x01, 0x39, 0x79, 0xD1, 0x8C, 0x92, 0xB0, 0x84, 0xA9, 0xA4, 0xD8,
+ 0x2A, 0x5B, 0xF9, 0xCA, 0x7F, 0x5C, 0x86, 0x74, 0xC5, 0x80, 0x21, 0x87, 0x16, 0x72, 0x32, 0x5B,
+ 0xD6, 0xD0, 0x86, 0x02, 0x61, 0x00, 0x2A, 0xCC, 0xA1, 0x00, 0x0F, 0x28, 0xC0, 0xA1, 0xF9, 0x38,
+ 0x81, 0x4F, 0xCD, 0x81, 0x0A, 0x06, 0x28, 0x04, 0x02, 0x41, 0x2A, 0x0E, 0x3F, 0xE0, 0xE1, 0x4B,
+ 0x09, 0x2C, 0xF0, 0x0F, 0xEC, 0x58, 0xC7, 0x3A, 0xD8, 0xF1, 0x09, 0x5F, 0xE0, 0x02, 0x17, 0xFE,
+ 0xC0, 0x02, 0x35, 0xB2, 0x29, 0x1C, 0x68, 0x54, 0xE2, 0xAB, 0x60, 0x0D, 0x6B, 0x38, 0x30, 0x20,
+ 0x11, 0x0B, 0x84, 0xD2, 0x0D, 0xE7, 0xBC, 0x08, 0x1C, 0x00, 0xC1, 0x0E, 0x3A, 0xFC, 0x83, 0x0E,
+ 0xE7, 0xE8, 0xC6, 0x31, 0x5E, 0x50, 0x0A, 0xB0, 0xFD, 0x23, 0x8E, 0xF9, 0xB4, 0x83, 0x26, 0xFA,
+ 0x79, 0x02, 0x92, 0x4A, 0x70, 0x1E, 0x60, 0x52, 0xC0, 0x1F, 0xFF, 0x61, 0x3F, 0xFC, 0x31, 0x83,
+ 0x19, 0xC9, 0x40, 0x86, 0x21, 0xA3, 0xA1, 0x8F, 0x9E, 0xC6, 0x20, 0x06, 0xFF, 0xC8, 0x8A, 0x1A,
+ 0xD4, 0x60, 0x51, 0x09, 0x4E, 0x56, 0x0D, 0xD2, 0xC9, 0x01, 0x12, 0x7A, 0xE0, 0x49, 0x1E, 0x48,
+ 0xB0, 0xB3, 0x3D, 0xE8, 0x01, 0x06, 0x25, 0x3B, 0xC9, 0xD2, 0xA2, 0x61, 0xB2, 0xD2, 0x41, 0xA9,
+ 0xE5, 0x2A, 0xA7, 0x52, 0x44, 0xA8, 0x30, 0x63, 0xAE, 0xAC, 0xFE, 0x10, 0x2C, 0x41, 0x26, 0x32,
+ 0x98, 0xCE, 0x54, 0x20, 0xB5, 0xB4, 0x29, 0xA7, 0x3A, 0xF5, 0x0F, 0x06, 0x00, 0xE1, 0x01, 0x07,
+ 0x60, 0x46, 0x3E, 0x98, 0xF1, 0x53, 0x09, 0x1E, 0xE0, 0x01, 0x40, 0x30, 0xAA, 0x40, 0x90, 0x5A,
+ 0x44, 0x78, 0xC8, 0x02, 0x18, 0x08, 0x90, 0x8B, 0x40, 0xF8, 0xB0, 0x0E, 0x74, 0xA0, 0x63, 0x1D,
+ 0xA1, 0x78, 0xC7, 0x2F, 0x70, 0xC1, 0x8F, 0x29, 0x72, 0x75, 0x9B, 0x95, 0x00, 0xEC, 0x3C, 0xA2,
+ 0x01, 0x58, 0x4B, 0x60, 0xC2, 0x12, 0xE1, 0x5C, 0xC8, 0x0E, 0x0F, 0xF1, 0x86, 0xB4, 0x4E, 0x44,
+ 0x0E, 0x80, 0x50, 0x47, 0x5C, 0xAB, 0x16, 0xD7, 0x73, 0x98, 0x63, 0x0F, 0xF6, 0x1C, 0x9B, 0x2E,
+ 0x7A, 0x61, 0x07, 0x3C, 0x5C, 0xA4, 0xAF, 0x9C, 0xDC, 0x24, 0x60, 0xE9, 0x71, 0x80, 0x95, 0x28,
+ 0x24, 0x00, 0xF8, 0x43, 0x28, 0x32, 0x92, 0x61, 0xC8, 0x64, 0x34, 0xD6, 0x03, 0xFF, 0x70, 0x81,
+ 0x0B, 0x22, 0x6B, 0x08, 0xCA, 0x1A, 0xF0, 0x83, 0x9C, 0x44, 0x2D, 0xE0, 0x8E, 0x10, 0xDA, 0xD0,
+ 0x4A, 0xB0, 0xC3, 0xA1, 0x1D, 0x6D, 0x85, 0x2F, 0x4B, 0xE2, 0xCB, 0x4A, 0x67, 0x72, 0xAC, 0x55,
+ 0x54, 0x8A, 0x11, 0xB1, 0xB9, 0x7F, 0x74, 0x2E, 0x52, 0xB1, 0x75, 0x0C, 0xE8, 0xFE, 0x21, 0x3A,
+ 0x20, 0x90, 0x4E, 0x64, 0x1C, 0x42, 0x9D, 0x40, 0x6A, 0xBA, 0x5B, 0x94, 0xE5, 0x14, 0x15, 0xAB,
+ 0x48, 0x40, 0x00, 0x86, 0x4C, 0xE4, 0x00, 0x24, 0x60, 0x15, 0x45, 0x3D, 0x6A, 0x52, 0x9D, 0x0B,
+ 0x8C, 0x54, 0x6C, 0x60, 0x21, 0x7A, 0x58, 0x87, 0x39, 0xCC, 0xB1, 0x0E, 0x3E, 0xDC, 0xE2, 0x15,
+ 0xA0, 0xE0, 0x87, 0x08, 0x58, 0x00, 0x9C, 0x7F, 0x60, 0x00, 0x1A, 0x96, 0x88, 0x86, 0x0D, 0x6C,
+ 0x70, 0xD8, 0x68, 0x54, 0x02, 0x13, 0x97, 0x00, 0x07, 0xFE, 0x59, 0x05, 0xB2, 0x43, 0x7F, 0x20,
+ 0xC3, 0xBD, 0xEF, 0xB5, 0xAF, 0x39, 0xCE, 0x21, 0x5F, 0x75, 0xB4, 0xD3, 0xAE, 0x7C, 0xE8, 0x96,
+ 0x2E, 0x74, 0xD1, 0x01, 0x3B, 0x60, 0x04, 0x04, 0x01, 0xCE, 0x87, 0x78, 0x87, 0x2C, 0x11, 0x37,
+ 0xCD, 0x03, 0xB1, 0x8A, 0x4D, 0x46, 0x34, 0xEA, 0xD1, 0x53, 0x81, 0xA8, 0x40, 0x05, 0x91, 0x1D,
+ 0xC4, 0x20, 0x28, 0xAB, 0x06, 0x49, 0xAB, 0x21, 0x1F, 0x95, 0x1E, 0x44, 0x66, 0x8B, 0xC0, 0xE9,
+ 0x22, 0xF4, 0xE0, 0xC3, 0x9D, 0x2E, 0xC2, 0x68, 0x25, 0x4D, 0xEA, 0x52, 0x93, 0x5A, 0x3A, 0x0E,
+ 0xA3, 0x9C, 0x4A, 0x55, 0xBD, 0x28, 0x8B, 0x61, 0x8C, 0x42, 0x2C, 0x6C, 0x0C, 0xC7, 0x3C, 0x66,
+ 0x99, 0x90, 0xC9, 0x72, 0x43, 0x25, 0xFB, 0x47, 0x6E, 0x75, 0xBB, 0x5B, 0x9A, 0xF8, 0xD6, 0x07,
+ 0xAA, 0x68, 0xC0, 0x2C, 0x84, 0x4D, 0x6C, 0x55, 0xF8, 0x20, 0xB9, 0x4A, 0xE6, 0x11, 0x93, 0x53,
+ 0x51, 0x8E, 0x1B, 0x29, 0xE4, 0x0E, 0xE8, 0xE0, 0x05, 0x2F, 0xD0, 0x71, 0x87, 0x57, 0x6C, 0x02,
+ 0x0F, 0xFC, 0x30, 0x45, 0x53, 0x04, 0xF2, 0xE5, 0x4A, 0x30, 0xC3, 0x12, 0x97, 0x60, 0x68, 0x32,
+ 0x2E, 0x81, 0x09, 0x4C, 0x40, 0x63, 0xCD, 0x7B, 0xD8, 0x83, 0x9B, 0xA5, 0xEB, 0x11, 0x39, 0x34,
+ 0x4B, 0xBE, 0xDD, 0x98, 0x05, 0x20, 0xE6, 0xB0, 0x10, 0x3C, 0xD4, 0x01, 0x1F, 0xB2, 0xE0, 0x73,
+ 0x07, 0x38, 0xE2, 0xD3, 0xDA, 0x0D, 0x17, 0xB0, 0xF2, 0xB9, 0x88, 0x9B, 0xA2, 0x91, 0xE8, 0x45,
+ 0x1F, 0x40, 0x01, 0x0A, 0x49, 0x41, 0x0A, 0xFE, 0x41, 0x81, 0x41, 0x14, 0xA2, 0x10, 0x6A, 0x78,
+ 0xF8, 0xC3, 0x23, 0x5E, 0x08, 0x41, 0x54, 0xCF, 0x01, 0x45, 0x30, 0x82, 0xC6, 0x8D, 0x10, 0xDA,
+ 0x8D, 0x1B, 0x81, 0x08, 0x2E, 0x6A, 0xB8, 0xC4, 0xFE, 0x47, 0x2E, 0x71, 0x8B, 0x2B, 0xA4, 0x41,
+ 0x8D, 0x2A, 0xE1, 0xA2, 0x22, 0xA4, 0x10, 0x48, 0x35, 0x26, 0xD6, 0x94, 0x12, 0x88, 0xA5, 0x3E,
+ 0xD6, 0xA1, 0xCD, 0xF0, 0x98, 0xD7, 0x3E, 0x5E, 0xC0, 0x0F, 0x7E, 0x70, 0x0A, 0x9E, 0xFB, 0xBC,
+ 0xE7, 0x3D, 0xFF, 0xC1, 0x02, 0x92, 0x5D, 0x1C, 0x7C, 0x37, 0xB9, 0x1C, 0xFE, 0x70, 0xB6, 0x40,
+ 0xE2, 0x10, 0x8A, 0x32, 0x9A, 0x23, 0x14, 0x49, 0x7B, 0xB2, 0x42, 0x2E, 0x70, 0x01, 0x4A, 0x8C,
+ 0x3B, 0xDC, 0x0C, 0x25, 0xB7, 0xB9, 0x2F, 0x20, 0x90, 0x3D, 0xC4, 0x02, 0x10, 0xEC, 0x66, 0x49,
+ 0x3A, 0xC7, 0x0E, 0x87, 0x89, 0xD4, 0x61, 0x15, 0xF8, 0x28, 0x07, 0x07, 0xF6, 0xDD, 0x91, 0xF8,
+ 0x08, 0x1A, 0xB0, 0x75, 0x13, 0x38, 0x00, 0x18, 0xBA, 0x68, 0x42, 0x27, 0x5C, 0x20, 0x13, 0x20,
+ 0x83, 0xC3, 0x49, 0xFE, 0x70, 0x41, 0x90, 0x61, 0x02, 0x02, 0x71, 0x40, 0x0E, 0x32, 0xEE, 0xF1,
+ 0x8D, 0x0F, 0x21, 0x07, 0x2E, 0xCA, 0xFB, 0xDE, 0xF9, 0xEE, 0x77, 0xC0, 0x2B, 0x04, 0x51, 0x0F,
+ 0x02, 0x09, 0xCB, 0x1F, 0xE5, 0xB9, 0xC6, 0xC4, 0xBC, 0x52, 0x34, 0xCF, 0x94, 0x40, 0x7A, 0xCC,
+ 0x79, 0x4E, 0xFD, 0x43, 0x00, 0xB3, 0xF8, 0x01, 0xCD, 0x81, 0xF0, 0x83, 0x59, 0x08, 0x40, 0x21,
+ 0x04, 0xE0, 0x91, 0x36, 0xF0, 0x91, 0x0A, 0x78, 0x14, 0x87, 0x00, 0x12, 0xB9, 0xC3, 0x1D, 0xFA,
+ 0x20, 0x0B, 0x0E, 0x78, 0xE2, 0xF6, 0xB7, 0x97, 0x08, 0xD5, 0xDD, 0xC4, 0x7B, 0x00, 0x50, 0xFD,
+ 0xF7, 0xFF, 0xC0, 0x81, 0x30, 0x52, 0x51, 0x01, 0x99, 0x74, 0x84, 0x03, 0xAC, 0xE7, 0x00, 0x07,
+ 0x5A, 0x22, 0x9F, 0xDE, 0x7B, 0x64, 0xE0, 0xF5, 0x88, 0xFB, 0x44, 0x24, 0x40, 0xFD, 0xEA, 0x5B,
+ 0x9F, 0xFA, 0x0B, 0x61, 0x80, 0xF6, 0xB7, 0x56, 0xCF, 0x7D, 0xED, 0x2F, 0xE4, 0xFA, 0xE0, 0x97,
+ 0xC0, 0x60, 0x0A, 0x63, 0x18, 0xC4, 0x28, 0xE6, 0xC5, 0x8F, 0xE1, 0x18, 0x86, 0x28, 0xB3, 0xA1,
+ 0xCC, 0x7C, 0xE8, 0xE6, 0x9D, 0x1F, 0x91, 0x00, 0xE6, 0x4F, 0xFF, 0xFA, 0xDB, 0x5F, 0x21, 0x03,
+ 0xC8, 0x7F, 0xFE, 0x01, 0xA0, 0x01, 0x03, 0xE8, 0x7F, 0x00, 0x17, 0x11, 0x07, 0x71, 0xB0, 0x6D,
+ 0xC6, 0xA7, 0x10, 0x5B, 0xE0, 0x02, 0x19, 0x50, 0x80, 0x1C, 0x01, 0x00, 0xCA, 0xB7, 0x7C, 0x0A,
+ 0xD8, 0x11, 0xCE, 0xF7, 0x80, 0x12, 0x38, 0x81, 0x14, 0x58, 0x81, 0x2F, 0x11, 0x10, 0x00, 0x3B,
+};