/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the QtGui module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this
** file. Please review the following information to ensure the GNU Lesser
** General Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include "qwindowsmobilestyle.h"
#include "qwindowsmobilestyle_p.h"

#if !defined(QT_NO_STYLE_WINDOWSMOBILE) || defined(QT_PLUGIN)

#include "qpainterpath.h"
#include "qapplication.h"
#include "qdesktopwidget.h"
#include "qwidget.h"
#include "qdockwidget.h"
#include "qframe.h"
#include "qmenu.h"
#include "qpaintengine.h"
#include "qpainter.h"
#include "qgroupbox.h"
#include "qstyleoption.h"
#include "qlistview.h"
#include "qdrawutil.h"
#include "qtoolbar.h"
#include "qabstractscrollarea.h"
#include "qabstractbutton.h"
#include "qcombobox.h"
#include "qabstractscrollarea.h"
#include "qframe.h"
#include "qscrollbar.h"
#include "qabstractitemview.h"
#include "qmenubar.h"
#include "qtoolbutton.h"
#include "qtextedit.h"
#include "qdialog.h"
#include "qdebug.h"
#include "qtabwidget.h"

#ifdef Q_WS_WINCE
#include "qt_windows.h"
#include "qguifunctions_wince.h"
extern bool qt_wince_is_high_dpi();          //defined in qguifunctions_wince.cpp
extern bool qt_wince_is_smartphone();        //defined in qguifunctions_wince.cpp
extern bool qt_wince_is_windows_mobile_65(); //defined in qguifunctions_wince.cpp
#endif // Q_WS_WINCE

#include "qstylehelper_p.h"

QT_BEGIN_NAMESPACE

static const int windowsItemFrame        =  1; // menu item frame width

static const int windowsMobileitemViewCheckBoxSize   = 13;
static const int windowsMobileFrameGroupBoxOffset    = 9;
static const int windowsMobileIndicatorSize          = 14;
static const int windowsMobileExclusiveIndicatorSize = 14;
static const int windowsMobileSliderThickness        = 6;
static const int windowsMobileIconSize               = 16;
static const int PE_IndicatorArrowUpBig         = 0xf000101;
static const int PE_IndicatorArrowDownBig       = 0xf000102;  
static const int PE_IndicatorArrowLeftBig       = 0xf000103;
static const int PE_IndicatorArrowRightBig      = 0xf000104;

/* XPM */
static const char *const radiobutton_xpm[] = {
    "30 30 2 1",
    " 	c None",
    ".	c #000000",
    "           ........           ",
    "        ..............        ",
    "       ....        ....       ",
    "     ....            ....     ",
    "    ...                ...    ",
    "   ...                  ...   ",
    "   ..                    ..   ",
    "  ..                      ..  ",
    " ...                      ... ",
    " ..                        .. ",
    " ..                        .. ",
    "..                          ..",
    "..                          ..",
    "..                          ..",
    "..                          ..",
    "..                          ..",
    "..                          ..",
    "..                          ..",
    "..                          ..",
    " ..                        .. ",
    " ..                        .. ",
    " ...                      ... ",
    "  ..                      ..  ",
    "   ..                    ..   ",
    "   ...                  ...   ",
    "    ...                ...    ",
    "     ....            ....     ",
    "       ....        ....       ",
    "        ..............        ",
    "           ........           "};

/* XPM */
static const char * const radiobutton_low_xpm[] = {
    "15 15 2 1",
    " 	c None",
    ".	c #000000",
    "     .....     ",
    "   ..     ..   ",
    "  .         .  ",
    " .           . ",
    " .           . ",
    ".             .",
    ".             .",
    ".             .",
    ".             .",
    ".             .",
    " .           . ",
    " .           . ",
    "  .         .  ",
    "   ..     ..   ",
    "     .....     "};

/* XPM */
    static const char * const arrowleft_big_xpm[] = {
        "9 17 2 1",
        "  c None",
        ". c #000000",
        "        .",
        "       ..",
        "      ...",
        "     ....",
        "    .....",
        "   ......",
        "  .......",
        " ........",
        ".........",
        " ........",
        "  .......",
        "   ......",
        "    .....",
        "     ....",
        "      ...",
        "       ..",
        "        ."};

/* XPM */
     static const char * const arrowleft_xpm[] = {
        "8 15 2 1",
        "  c None",
        ". c #000000",
        "       .",
        "      ..",
        "     ...",
        "    ....",
        "   .....",
        "  ......",
        " .......",
        "........",
        " .......",
        "  ......",
        "   .....",
        "    ....",
        "     ...",
        "      ..",
        "       ."};



/* XPM */
static const char *const horlines_xpm[] = {
    "2 2 2 1",
    "  c None",
    ". c #000000",
    "  ",
    ".."};

/* XPM */
static const char *const vertlines_xpm[] = {
    "2 2 2 1",
    "  c None",
    ". c #000000",
    ". ",
    ". "};

/* XPM */
static const char *const radiochecked_xpm[] = {
    "18 18 2 1",
    " 	c None",
    ".	c #000000",
    "      ......      ",
    "    ..........    ",
    "  ..............  ",
    "  ..............  ",
    " ................ ",
    " ................ ",
    "..................",
    "..................",
    "..................",
    "..................",
    "..................",
    "..................",
    " ................ ",
    " ................ ",
    "  ..............  ",
    "  ..............  ",
    "    ..........    ",
    "      ......      "};

/* XPM */
static const char * const radiochecked_low_xpm[] = {
    "9 9 2 1",
    "         c None",
    ".        c #000000", 
    "   ...   ",
    " ....... ",
    " ....... ",
    ".........",
    ".........",
    ".........",
    " ....... ",
    " ....... ",
    "   ...   "};

static const char *const arrowdown_xpm[] = {
    "15 8 2 1",
    " 	c None",
    ".	c #000000",
    "...............",
    " ............. ",
    "  ...........  ",
    "   .........   ",
    "    .......    ",
    "     .....     ",
    "      ...      ",
    "       .       "};


static const char *const arrowdown_big_xpm[] = {
    "17 9 2 1",
    " 	c None",
    ".	c #000000",
    ".................",
    " ............... ",
    "  .............  ",
    "   ...........   ",
    "    .........    ",
    "     .......     ",
    "      .....      ",
    "       ...       ",
    "        .        "};


/* XPM */
static const char *const checkedlight_xpm[] = {
    "24 24 2 1",
    " 	c None",
    ".	c #000000",
    "                        ",
    "                        ",
    "                        ",
    "                        ",
    "                        ",
    "                  .     ",
    "                 ..     ",
    "                ...     ",
    "               ....     ",
    "              .....     ",
    "             ......     ",
    "    .       ......      ",
    "    ..     ......       ",
    "    ...   ......        ",
    "    .... ......         ",
    "    ..........          ",
    "    .........           ",
    "     .......            ",
    "      .....             ",
    "       ...              ",
    "        .               ",
    "                        ",
    "                        ",
    "                        "};


/* XPM */
static const char *const checkedbold_xpm[] = {
    "26 26 2 1",
    " 	c None",
    ".	c #000000",
    "                          ",
    "                          ",
    "                          ",
    "                          ",
    "                          ",
    "                          ",
    "                    ..    ",
    "                   ...    ",
    "                  ....    ",
    "                 .....    ",
    "    ..          ......    ",
    "    ...        .......    ",
    "    ....      .......     ",
    "    .....    .......      ",
    "    ......  .......       ",
    "    ..............        ",
    "     ............         ",
    "      ..........          ",
    "       ........           ",
    "        ......            ",
    "         ....             ",
    "          ..              ",
    "                          ",
    "                          ",
    "                          ",
    "                          "};

/* XPM */
static const char * const checkedbold_low_xpm[] = {
    "9 8 2 1",
    " 	c None",
    ".	c #000000",
    "        .",
    "       ..",
    ".     ...",
    "..   ... ",
    "... ...  ",
    " .....   ",
    "  ...    ",
    "   .     "};

/* XPM */
static const char * const checkedlight_low_xpm[] = {
    "8 8 2 1",
    " 	c None",
    ".	c #000000",
    "       .",
    "      ..",
    "     ...",
    ".   ... ",
    ".. ...  ",
    ".....   ",
    " ...    ",
    "  .     "};

/* XPM */
static const char * const highlightedradiobutton_xpm[] = {
    "30 30 3 1",
    " 	c None",
    ".	c #000000",
    "+	c #0078CC",
    "           ........           ",
    "        ..............        ",
    "       ....++++++++....       ",
    "     ....++++++++++++....     ",
    "    ...++++        ++++...    ",
    "   ...+++            +++...   ",
    "   ..++                ++..   ",
    "  ..++                  ++..  ",
    " ...++                  ++... ",
    " ..++                    ++.. ",
    " ..++                    ++.. ",
    "..++                      ++..",
    "..++                      ++..",
    "..++                      ++..",
    "..++                      ++..",
    "..++                      ++..",
    "..++                      ++..",
    "..++                      ++..",
    "..++                      ++..",
    " ..++                    ++.. ",
    " ..++                    ++.. ",
    " ...++                  ++... ",
    "  ..++                  ++..  ",
    "   ..++                ++..   ",
    "   ...+++            +++...   ",
    "    ...++++        ++++...    ",
    "     ....++++++++++++....     ",
    "       ....++++++++....       ",
    "        ..............        ",
    "           ........           "};

/* XPM */
static const char * const highlightedradiobutton_low_xpm[] = {
    "15 15 3 1",
    " 	c None",
    ".	c #000000",
    "+	c #3192D6",
    "     .....     ",
    "   ..+++++..   ",
    "  .++     ++.  ",
    " .+         +. ",
    " .+         +. ",
    ".+           +.",
    ".+           +.",
    ".+           +.",
    ".+           +.",
    ".+           +.",
    " .+         +. ",
    " .+         +. ",
    "  .++     ++.  ",
    "   ..+++++..   ",
    "     .....     "};

/* XPM */
static const char * const cross_big_xpm[] = {
"28 28 4 1",
" 	c #09454A",
".	c #218C98",
"+	c #47D8E5",
"@	c #FDFFFC",
"                            ",
"                            ",
"  ++++++++++++++++++++++++  ",
"  ++++++++++++++++++++++++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++..@@@..........@@@..++  ",
"  ++..@@@@........@@@@..++  ",
"  ++..@@@@@......@@@@@..++  ",
"  ++...@@@@@....@@@@@...++  ",
"  ++....@@@@@..@@@@@....++  ",
"  ++.....@@@@@@@@@@.....++  ",
"  ++......@@@@@@@@......++  ",
"  ++.......@@@@@@.......++  ",
"  ++.......@@@@@@.......++  ",
"  ++......@@@@@@@@......++  ",
"  ++.....@@@@@@@@@@.....++  ",
"  ++....@@@@@..@@@@@....++  ",
"  ++...@@@@@....@@@@@...++  ",
"  ++..@@@@@......@@@@@..++  ",
"  ++..@@@@........@@@@..++  ",
"  ++..@@@..........@@@..++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++++++++++++++++++++++++  ",
"  ++++++++++++++++++++++++  ",
"                            ",
"                            "};

/* XPM */
static const char * const cross_small_xpm[] = {
"14 14 4 1",
" 	c #09454A",
".	c #218C98",
"+	c #47D8E5",
"@	c #FCFFFC",
"              ",
" ++++++++++++ ",
" +..........+ ",
" +.@@....@@.+ ",
" +.@@@..@@@.+ ",
" +..@@@@@@..+ ",
" +...@@@@...+ ",
" +...@@@@...+ ",
" +..@@@@@@..+ ",
" +.@@@..@@@.+ ",
" +.@@....@@.+ ",
" +..........+ ",
" ++++++++++++ ",
"              "};

/* XPM */
static const char * const max_big_xpm[] = {
"28 28 4 1",
" 	c #09454A",
".	c #218C98",
"+	c #47D8E5",
"@	c #FDFFFC",
"                            ",
"                            ",
"  ++++++++++++++++++++++++  ",
"  ++++++++++++++++++++++++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++..@@@@@@@@@@@@@@@@..++  ",
"  ++..@@@@@@@@@@@@@@@@..++  ",
"  ++..@@@@@@@@@@@@@@@@..++  ",
"  ++..@@@@@@@@@@@@@@@@..++  ",
"  ++..@@............@@..++  ",
"  ++..@@............@@..++  ",
"  ++..@@............@@..++  ",
"  ++..@@............@@..++  ",
"  ++..@@............@@..++  ",
"  ++..@@............@@..++  ",
"  ++..@@@@@@@@@@@@@@@@..++  ",
"  ++..@@@@@@@@@@@@@@@@..++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++++++++++++++++++++++++  ",
"  ++++++++++++++++++++++++  ",
"                            ",
"                            "};

/* XPM */
static const char * const max_small_xpm[] = {
"14 14 4 1",
" 	c #09454A",
".	c #218C98",
"+	c #47D8E5",
"@	c #FCFFFC",
"              ",
" ++++++++++++ ",
" +..........+ ",
" +..........+ ",
" +.@@@@@@@@.+ ",
" +.@@@@@@@@.+ ",
" +.@......@.+ ",
" +.@......@.+ ",
" +.@......@.+ ",
" +.@@@@@@@@.+ ",
" +..........+ ",
" +..........+ ",
" ++++++++++++ ",
"              "};

/* XPM */
static const char * const normal_big_xpm[] = {
"28 28 4 1",
" 	c #09454A",
".	c #218C98",
"+	c #47D8E5",
"@	c #FDFFFC",
"                            ",
"                            ",
"  ++++++++++++++++++++++++  ",
"  ++++++++++++++++++++++++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++..@@@@@@@@@@@@@@@@..++  ",
"  ++..@@@@@@@@@@@@@@@@..++  ",
"  ++..@@............@@..++  ",
"  ++..@@............@@..++  ",
"  ++..@@............@@..++  ",
"  ++..@@............@@..++  ",
"  ++..@@............@@..++  ",
"  ++..@@............@@..++  ",
"  ++..@@............@@..++  ",
"  ++..@@............@@..++  ",
"  ++..@@............@@..++  ",
"  ++..@@............@@..++  ",
"  ++..@@............@@..++  ",
"  ++..@@............@@..++  ",
"  ++..@@@@@@@@@@@@@@@@..++  ",
"  ++..@@@@@@@@@@@@@@@@..++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++++++++++++++++++++++++  ",
"  ++++++++++++++++++++++++  ",
"                            ",
"                            "};

/* XPM */
static const char * const normal_small_xpm[] = {
"14 14 4 1",
" 	c #09454A",
".	c #218C98",
"+	c #47D8E5",
"@	c #FCFFFC",
"              ",
" ++++++++++++ ",
" +..........+ ",
" +.@@@@@@@@.+ ",
" +.@......@.+ ",
" +.@......@.+ ",
" +.@......@.+ ",
" +.@......@.+ ",
" +.@......@.+ ",
" +.@......@.+ ",
" +.@@@@@@@@.+ ",
" +..........+ ",
" ++++++++++++ ",
"              "};


/* XPM */
static const char * const min_big_xpm[] = {
"28 28 4 1",
" 	c #09454A",
".	c #218C98",
"+	c #47D8E5",
"@	c #FDFFFC",
"                            ",
"                            ",
"  ++++++++++++++++++++++++  ",
"  ++++++++++++++++++++++++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++..@@@@@@@@@@@@@@@@..++  ",
"  ++..@@@@@@@@@@@@@@@@..++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++....................++  ",
"  ++++++++++++++++++++++++  ",
"  ++++++++++++++++++++++++  ",
"                            ",
"                            "};

/* XPM */
static const char * const min_small_xpm[] = {
"14 14 4 1",
" 	c #09454A",
".	c #218C98",
"+	c #47D8E5",
"@	c #FCFFFC",
"              ",
" ++++++++++++ ",
" +..........+ ",
" +..........+ ",
" +..........+ ",
" +..........+ ",
" +..........+ ",
" +..........+ ",
" +..........+ ",
" +.@@@@@@@@.+ ",
" +..........+ ",
" +..........+ ",
" ++++++++++++ ",
"              "};

#ifdef Q_WS_WINCE_WM

static char * sbhandleup_xpm[] = {
"26 41 45 1",
" 	c None",
".	c #000000",
"+	c #E7E7E7",
"@	c #D6D7D6",
"#	c #949294",
"$	c #737573",
"%	c #636563",
"&	c #636163",
"*	c #5A5D5A",
"=	c #5A595A",
"-	c #525552",
";	c #525152",
">	c #4A4D4A",
",	c #7B797B",
"'	c #CECFCE",
")	c #CED3CE",
"!	c #6B6D6B",
"~	c #6B696B",
"{	c #737173",
"]	c #7B7D7B",
"^	c #848684",
"/	c #848284",
"(	c #8C8A8C",
"_	c #8C8E8C",
":	c #B5B2B5",
"<	c #FFFFFF",
"[	c #949694",
"}	c #B5B6B5",
"|	c #9C9A9C",
"1	c #ADAEAD",
"2	c #9C9E9C",
"3	c #BDBABD",
"4	c #BDBEBD",
"5	c #F7F3F7",
"6	c #C6C3C6",
"7	c #C6C7C6",
"8	c #A5A2A5",
"9	c #CECBCE",
"0	c #FFFBFF",
"a	c #ADAAAD",
"b	c #A5A6A5",
"c	c #D6D3D6",
"d	c #B5BAB5",
"e	c #DEDFDE",
"f	c #DEDBDE",
"..........................",
"+@#$%%&&&**===---;;;;>=,'+",
"+@#$%%&&&**===---;;;;>=$'+",
")$!!~~%%&&&**===---;;;;>;'",
"#{$]],,$${{{!!~~%%%&&&*-;]",
"#{$]],,$${{{!!~~%%%&&&*-;]",
",$^//]],,$${{{!!~~%%%&&*;*",
",,(^^//]],$${!!!!!~~%%%&-*",
",,(^^//]],$${!!!!!~~%%%&-*",
"]]_((^^//]$!%%~!{{!!~~%%-*",
"//#__((^^]{:<<:~!{{{!!~~=*",
"//#__((^^]{:<<:~!{{{!!~~=&",
"//###__(/$:<<<<:~{${{!!~*&",
"^^[[##_^]:<<<<<<}!{$${{!*%",
"^^[[##_^]:<<<<<<}!{$${{!*%",
"((|[[#_/:<<<<<<<<}!$$${{&~",
"((||[#^1<<<<1:<<<<}!$$$$&~",
"((||[#^1<<<<1:<<<<}!$$$$&~",
"__2|#(1<<<<}],}<<<<}{$,$%~",
"##2|_1<<<<}^((]3<<<<}{$,~!",
"##2|_1<<<<}^((]3<<<<}{$,~!",
"##2#1<<<<3^###(/4<<<<}{,~{",
"##2#1<<<<3^###(/4<<<<}{,~!",
"[[2_5<<<4(#|[[#_/6<<<<,,!{",
"[|2_5<<4_[||||[[_/7<<<,]{$",
"[|2_5<<4_[||||[[_/7<<<,]{$",
"||8_5<6#|2222|||[_/9<<,]{$",
"228#06[28888222||[_/'<,/$,",
"228#06[28888222||[_/'<,/$,",
"22a|6[8bbbb88822||[(/c](,]",
"881b8baaabbbb88222|[(^(_,]",
"881b8baaabbbb88222|[(^(_,]",
"88111111aaabbb88822|[###]/",
"bb:::11111aaabbb8822||[[/^",
"bb:::11111aaabbb8822||[[//",
"bb:::::1111aaabbb8822||[/(",
"3a1::::::1111aaabb8822|_^8",
"da1::::::1111aaabb8822|_^8",
"e1aaabbbb888822||[[##__((@",
"+e4:aaabbbb88822||[[[#[b@+",
"+e4:aaabbbb88822||[[[#[bf+"};

static char * sbhandledown_xpm[] = {
"26 40 46 1",
" 	c None",
".	c #E7E7E7",
"+	c #DEDFDE",
"@	c #BDBEBD",
"#	c #B5B2B5",
"$	c #ADAAAD",
"%	c #A5A6A5",
"&	c #A5A2A5",
"*	c #9C9E9C",
"=	c #9C9A9C",
"-	c #949694",
";	c #949294",
">	c #D6D7D6",
",	c #DEDBDE",
"'	c #D6DBD6",
")	c #ADAEAD",
"!	c #8C8E8C",
"~	c #8C8A8C",
"{	c #BDBABD",
"]	c #848684",
"^	c #B5BAB5",
"/	c #848284",
"(	c #848A84",
"_	c #7B7D7B",
":	c #7B797B",
"<	c #C6C3C6",
"[	c #D6D3D6",
"}	c #FFFBFF",
"|	c #CECFCE",
"1	c #FFFFFF",
"2	c #737573",
"3	c #F7F3F7",
"4	c #CECBCE",
"5	c #737173",
"6	c #C6C7C6",
"7	c #6B6D6B",
"8	c #B5B6B5",
"9	c #6B696B",
"0	c #636563",
"a	c #636163",
"b	c #5A5D5A",
"c	c #5A595A",
"d	c #525552",
"e	c #525152",
"f	c #4A4D4A",
"g	c #C6CBC6",
".+@#$$$%%%%&&&**==---;-%>.",
".+@#$$$%%%%&&&**==---;-%,.",
"')$$$%%%%&&&&**==--;;!!~~>",
"{$)######))))$$$%%&&**=!]&",
"^$)######))))$$$%%&&**=!]&",
"%%#####))))$$$%%%&&**==-/(",
"%%###)))))$$$%%%&&**==--/]",
"%%###)))))$$$%%%&&**==--//",
"&&))))))$$$%%%&&&**=-;;;_/",
"&&)%&%$$$%%%%&&***=-~]~!:_",
"&&)%&%$$$%%%%&&***=-~]~!:_",
"**$=<-&%%%%&&&**==-~/[_~:_",
"**&;}<-*&&&&***==-!/|1:/2:",
"**&;}<-*&&&&***==-!/|1:/2:",
"==&!31<;=****===-!/411:_5:",
"-=*!311@!-====--!/6111:_52",
"-=*!311@!-====--!/6111:_52",
"--*!3111@~;=--;!/<1111::75",
";;*;)1111{];;;~/@111185:95",
";;*;)1111{];;;~/@111185:97",
";;*=!)11118]~~_{1111852:97",
";;*=!)11118]~~_{1111852:97",
"!!*=;~)11118_:81111852:207",
"~~==-;])1111)#1111872222a9",
"~~==-;])1111)#1111872222a9",
"~~=--;!/#111111118722255a0",
"]]--;;!]_#11111187522557b0",
"]]--;;!]_#11111187522557b0",
"//;;;!!~/2#1111#95255779ba",
"//;!!~~]]_5#11#975557799cb",
"//;!!~~]]_5#11#975557799ca",
"__!~~]]//_27009755779900db",
"::~]]//__:2257777799000adb",
"::~]]//__:2257777799000adb",
":2]//__::225557799000aabeb",
";52__::225557799000aaabde_",
";52__::225557799000aaabde_",
"[2779900aaabbcccdddeeeefeg",
".>;200aaabbcccdddeeeefc:|.",
".>;200aaabbcccdddeeeefc2|."};

static char * sbgripdown_xpm[] = {
"26 34 39 1",
" 	c None",
".	c #949294",
"+	c #9C9E9C",
"@	c #9C9A9C",
"#	c #949694",
"$	c #8C8E8C",
"%	c #8C8A8C",
"&	c #848684",
"*	c #848284",
"=	c #7B7D7B",
"-	c #7B797B",
";	c #6B696B",
">	c #636563",
",	c #737573",
"'	c #636163",
")	c #737173",
"!	c #5A5D5A",
"~	c #6B6D6B",
"{	c #5A595A",
"]	c #B5B6B5",
"^	c #BDBEBD",
"/	c #ADAEAD",
"(	c #BDBABD",
"_	c #525552",
":	c #313031",
"<	c #525152",
"[	c #ADAAAD",
"}	c #BDBAB5",
"|	c #4A4D4A",
"1	c #4A494A",
"2	c #C6C3C6",
"3	c #C6CBC6",
"4	c #E7E7E7",
"5	c #DEDFDE",
"6	c #E7E3E7",
"7	c #DEE3DE",
"8	c #CECBCE",
"9	c #8C928C",
"0	c #CECFCE",
"..+++@@@###...$$%&&**==-;>",
"$.++@@@@##...$$%%&**==-->>",
"$$+@@@@###..$$%%&&*==--,>>",
"$$@@@@###..$$%%&&**==-,,>'",
"%%@@@###..$$$%&&**==--,,''",
"%%@@###..$$$%&&**==--,,)''",
"%%@###...$$%%&&*==--,,))'!",
"&&###...$$%%&&**==--,)))!!",
"&&##...$$%%&&**==--,,))~!!",
"&&#...$$%%&&**==--,,))~~!{",
"**...$$%%&&**==--,,))~~;!{",
"**..$$%%&&**===--,)))~~;{{",
"**.$$%%&]^&===//,,))~~;;{{",
"==$$%%&&]^*==-((,))~~;;>{_",
"==$%%&&***::--,,::~~;;;>__",
"==%%&&&**=::-,,)::~~;;>>__",
"--%&&&**==--,,)))~~;;>>>__",
"--&&&**==--,,)))~~;;>>>'_<",
",-&&**==]^-,))[[~;;>>>''<<",
",,&**==-]^-)))}};;>>>'''<<",
",,**==--,,::)~~;::>>'''!<<",
"))*==--,,)::~~;;::>'''!!<|",
"))==--,,)))~~;;;>>'''!!!||",
"))=--,,)))~~;;;>>'''!!!{||",
"~~--,,)))~~;;;>>'''!!!{{||",
"~~-,,)))~~;;>>>'''!!!{{{|1",
";;,,)))~~;;>>>'''!!!{{{_1<",
"~;,)))~~;;>>>'''!!!{{{__1'",
"%>~))~~;;>>>'''!!!{{{__|1$",
"2>>~~~;;>>>''!!!{{{{__<113",
"4%'';;;>>>''!!!{{{{__<11%4",
"45-!!'>>>''!!!{{{{_<|11)64",
"447+!{{___<<<||||1111|+444",
"444489~__<<<||||111>$04444"};

static char * sbgripup_xpm[] = {
"26 34 38 1",
" 	c None",
".	c #E7E7E7",
"+	c #D6DBD6",
"@	c #C6C7C6",
"#	c #B5B6B5",
"$	c #ADAEAD",
"%	c #ADAAAD",
"&	c #A5A6A5",
"*	c #A5A2A5",
"=	c #BDBEBD",
"-	c #DEDFDE",
";	c #C6CBC6",
">	c #9C9E9C",
",	c #E7E3E7",
"'	c #BDBABD",
")	c #B5B2B5",
"!	c #9C9A9C",
"~	c #DEE3DE",
"{	c #949694",
"]	c #D6D7D6",
"^	c #949294",
"/	c #DEDBDE",
"(	c #8C8E8C",
"_	c #8C8A8C",
":	c #848684",
"<	c #D6D3CE",
"[	c #CECBCE",
"}	c #D6D3D6",
"|	c #848284",
"1	c #313031",
"2	c #7B7D7B",
"3	c #CECFCE",
"4	c #CECBC6",
"5	c #7B797B",
"6	c #737573",
"7	c #737173",
"8	c #6B6D6B",
"9	c #6B696B",
"....+@#$$%%%%&&&***$=-....",
"...;$$$$$%%%&&&&**>>>>@...",
".,'$$)#'#####)))$$$%*!!$~.",
".=$)#'''####))))$$$%%*!{'.",
"]$$''''#####)))$$$%%%&*{^/",
"=$#'''#####)))$$$$%%&&&!^#",
"$$'''#####))))$$$%%%&&*>(!",
"$$''#####))))$$$%%%&&&*>(^",
"$$######))))$$$$%%&&&**>(_",
"%$#####))))$$$$%%%&&***>__",
"%$####))))$$$$%%%&&&**>>__",
"%%###)))))$$$%%%&&&**>>>_:",
"%%##))))<])$$%[[&&***>>!::",
"%%#)))))<]$$%%}<&&**>>!!:|",
"&%)))))$$$11%%&&11*>>>!!:|",
"&&))))$$$$11%&&&11*>>!!{||",
"&&)))$$$$$%%%&&&**>>!!!{|2",
"&&))$$$$$%%%&&&**>>>!!{{|2",
"*&)$$$$$3]%&&&4@*>>!!{{{22",
"**$$$$$%3]%&&&<<>>!!!{{^25",
"**$$$$%%%%11&**>11!!{{^^25",
"**$$$%%%%&11***>11!!{{^^55",
"**$$%%%%&&&***>>!!!{{^^(55",
">>$%%%%&&&***>>>!!{{^^((56",
">>%%%%&&&&***>>!!!{{^^((66",
">>%%%&&&&***>>!!!{{^^((_67",
"!>%%&&&&***>>>!!{{{^^(__67",
"!!%&&&&***>>>!!!{{^^((_:77",
"!!&&&&***>>>!!!{{^^((__:77",
"!!&&&****>>!!!{{^^^(__::78",
"{!&&****>>>!!{{{^^((_::|88",
"{{&****>>>!!!{{^^((__:||88",
"{{****>>>!!!{{^^^(__::|289",
"{{***>>>!!!{{{^^((_::||289"};

static char * sbgripmiddle_xpm[] = {
"26 2 12 1",
" 	c None",
".	c #949294",
"+	c #A5A2A5",
"@	c #9C9E9C",
"#	c #9C9A9C",
"$	c #949694",
"%	c #8C8E8C",
"&	c #8C8A8C",
"*	c #848684",
"=	c #848284",
"-	c #7B7D7B",
";	c #6B696B",
"..++@@@###$$$..%%&&*==--;;",
"..++@@@###$$$..%%&&*==--;;"};


static char * listviewhighmiddle_xpm[] = {
"8 46 197 2",
"  	c None",
". 	c #66759E",
"+ 	c #6C789D",
"@ 	c #6A789E",
"# 	c #6B789E",
"$ 	c #6A779D",
"% 	c #6C789C",
"& 	c #6F7D9B",
"* 	c #6F7D9A",
"= 	c #9DB6EE",
"- 	c #9DB6ED",
"; 	c #9CB6ED",
"> 	c #A1B6EF",
", 	c #A2B6F0",
"' 	c #93AAE9",
") 	c #95ABEA",
"! 	c #94ABEA",
"~ 	c #94A9E8",
"{ 	c #8BA8EA",
"] 	c #8BA7EA",
"^ 	c #8AA7EA",
"/ 	c #8EAAE8",
"( 	c #8FAAE8",
"_ 	c #88A2E7",
": 	c #8CA3E8",
"< 	c #8BA3E7",
"[ 	c #8BA3E8",
"} 	c #8BA2E7",
"| 	c #8CA2E7",
"1 	c #8DA2E7",
"2 	c #87A1E8",
"3 	c #87A1E9",
"4 	c #86A0E8",
"5 	c #86A1E7",
"6 	c #87A2E7",
"7 	c #859EE9",
"8 	c #849DE9",
"9 	c #869EE9",
"0 	c #869FE9",
"a 	c #7C9BEA",
"b 	c #7C9CEA",
"c 	c #7B9CEA",
"d 	c #7C9BE9",
"e 	c #7E9CE9",
"f 	c #7B9AEA",
"g 	c #7C99E9",
"h 	c #7C9AEA",
"i 	c #7B9AE8",
"j 	c #7A9AEA",
"k 	c #7996E1",
"l 	c #7C96E4",
"m 	c #7B96E3",
"n 	c #7B95E3",
"o 	c #7E95E5",
"p 	c #7E95E6",
"q 	c #7292E1",
"r 	c #7490DF",
"s 	c #7591E0",
"t 	c #7590DF",
"u 	c #7392E1",
"v 	c #6D8CDE",
"w 	c #6F8EDD",
"x 	c #6E8DDD",
"y 	c #6E8DDE",
"z 	c #6F8EDE",
"A 	c #6E8EDE",
"B 	c #718EDD",
"C 	c #728EDD",
"D 	c #6B89E0",
"E 	c #6C89DF",
"F 	c #6D89E0",
"G 	c #6D89DF",
"H 	c #6C88DF",
"I 	c #6D88DF",
"J 	c #6D86DD",
"K 	c #6086E0",
"L 	c #6686E0",
"M 	c #6586E0",
"N 	c #6486E0",
"O 	c #6485E0",
"P 	c #6786DF",
"Q 	c #5F85E0",
"R 	c #6583DE",
"S 	c #6683DE",
"T 	c #6682DD",
"U 	c #6086DF",
"V 	c #5F86E0",
"W 	c #567ED7",
"X 	c #567ED8",
"Y 	c #557DD7",
"Z 	c #5A7FD8",
"` 	c #6281DA",
" .	c #5379D9",
"..	c #5278D9",
"+.	c #547BD8",
"@.	c #4C73D7",
"#.	c #4B72D2",
"$.	c #4C73D4",
"%.	c #4C73D3",
"&.	c #4B72D4",
"*.	c #4F75D3",
"=.	c #5074D2",
"-.	c #4971D0",
";.	c #4871D0",
">.	c #335ECF",
",.	c #325ECB",
"'.	c #335ECD",
").	c #335ECE",
"!.	c #325DCD",
"~.	c #2E59C9",
"{.	c #3059C9",
"].	c #2F59C9",
"^.	c #2F59C8",
"/.	c #2B59CA",
"(.	c #3355C6",
"_.	c #3354C5",
":.	c #3156C7",
"<.	c #3056C7",
"[.	c #3355C7",
"}.	c #3355C5",
"|.	c #254EBF",
"1.	c #1F51C1",
"2.	c #234FC0",
"3.	c #234FBF",
"4.	c #2350C0",
"5.	c #1E50BE",
"6.	c #1D50C0",
"7.	c #264DBE",
"8.	c #264CBD",
"9.	c #254DBE",
"0.	c #244EBF",
"a.	c #254DBF",
"b.	c #234CBF",
"c.	c #244CC0",
"d.	c #244BC0",
"e.	c #234BC0",
"f.	c #234BBF",
"g.	c #234CBE",
"h.	c #2049B7",
"i.	c #2A49B5",
"j.	c #2749B5",
"k.	c #2749B6",
"l.	c #2D49B4",
"m.	c #2649B6",
"n.	c #2946B5",
"o.	c #2A48B6",
"p.	c #2947B5",
"q.	c #2946B6",
"r.	c #2848B6",
"s.	c #2549B5",
"t.	c #2648B6",
"u.	c #2744B5",
"v.	c #2744B4",
"w.	c #2744AF",
"x.	c #2543B4",
"y.	c #2543B2",
"z.	c #2442B2",
"A.	c #2442B3",
"B.	c #2442B5",
"C.	c #2543B3",
"D.	c #1F40B1",
"E.	c #1E40B1",
"F.	c #243EAE",
"G.	c #273BAC",
"H.	c #263DAC",
"I.	c #253CAB",
"J.	c #273CAB",
"K.	c #273CAC",
"L.	c #263BAA",
"M.	c #253CAE",
"N.	c #263BA6",
"O.	c #253BA5",
"P.	c #253AA5",
"Q.	c #253BA6",
"R.	c #253CA7",
"S.	c #263AA6",
"T.	c #243CA6",
"U.	c #253CA5",
"V.	c #273BA8",
"W.	c #2F4DA4",
"X.	c #2F4DA3",
"Y.	c #1B2F85",
"Z.	c #B5B5B6",
"`.	c #B5B5B5",
" +	c #B5B6B6",
".+	c #B5B4B6",
"++	c #C2C3C5",
"@+	c #C0C3C3",
"#+	c #C1C3C4",
"$+	c #E3E3E3",
"%+	c #E3E3E4",
"&+	c #E4E3E4",
"*+	c #E2E3E4",
"=+	c #ECEEEB",
"-+	c #EBEDEA",
";+	c #EEF0ED",
">+	c #EFF0EE",
". + @ @ # # $ % ",
"& & * & & & & & ",
"= = - = = ; > , ",
"' ) ! ! ! ) ' ~ ",
"{ ] { { { ^ / ( ",
"_ : < [ : } | 1 ",
"2 2 2 3 2 4 5 6 ",
"7 7 7 7 7 8 9 0 ",
"a b a a a c d e ",
"f g h h h h i j ",
"k l m m m n o p ",
"q q q q q q q q ",
"r r s s s t q u ",
"v w x y z A B C ",
"D E F F G F H I ",
"J K L M N O P Q ",
"R R S S S T U V ",
"W W X X X Y Z ` ",
" . . . . ...+.W ",
" . . . . ..... .",
"@.#.$.$.%.&.*.=.",
"-.-.;.-.-.-.-.-.",
">.,.'.).).!.!.>.",
"~.{.].^.].^././.",
"(.(.(.(.(._.:.<.",
"(.(.[.[.[.[.(.}.",
"|.1.2.3.3.4.5.6.",
"7.7.7.7.7.8.9.0.",
"a.b.c.d.c.e.f.g.",
"h.i.j.k.j.k.l.m.",
"n.o.p.q.r.p.s.t.",
"u.u.v.u.u.u.u.u.",
"w.x.y.z.A.y.B.C.",
"D.D.E.D.D.D.D.D.",
"D.D.E.D.D.D.D.D.",
"F.G.H.I.J.K.L.M.",
"N.N.O.N.N.P.Q.R.",
"N.N.S.N.N.N.N.N.",
"T.N.T.T.T.U.N.V.",
"W.W.X.W.W.W.W.W.",
"W.W.W.W.W.W.W.W.",
"Y.Y.Y.Y.Y.Y.Y.Y.",
"Z.`. + +.+Z.`.`.",
"++@+#+#+#+#+@+@+",
"$+%+&+&+*+%+%+%+",
"=+-+;+-+-+>+-+-+"};



static char * listviewhighcornerleft_xpm[] = {
"100 46 1475 2",
"  	c None",
". 	c #FBFBFC",
"+ 	c #E8EAE7",
"@ 	c #758DC3",
"# 	c #42599E",
"$ 	c #28418A",
"% 	c #19418F",
"& 	c #3F5695",
"* 	c #415896",
"= 	c #435A98",
"- 	c #445C99",
"; 	c #465E9B",
"> 	c #48609B",
", 	c #49629C",
"' 	c #4A639D",
") 	c #49639D",
"! 	c #4A629D",
"~ 	c #4B639D",
"{ 	c #4B649D",
"] 	c #4C659D",
"^ 	c #4D669D",
"/ 	c #4E689D",
"( 	c #506A9D",
"_ 	c #516A9D",
": 	c #536B9C",
"< 	c #546C9C",
"[ 	c #566D9B",
"} 	c #576D9B",
"| 	c #586E9C",
"1 	c #5B6F9D",
"2 	c #61739D",
"3 	c #63749E",
"4 	c #64749E",
"5 	c #68769E",
"6 	c #6A779E",
"7 	c #6B789E",
"8 	c #66759E",
"9 	c #6C789D",
"0 	c #EEF0ED",
"a 	c #D0D3DC",
"b 	c #3E51A3",
"c 	c #28428B",
"d 	c #29428C",
"e 	c #425996",
"f 	c #455C99",
"g 	c #485F9C",
"h 	c #49619E",
"i 	c #4A63A0",
"j 	c #4B64A1",
"k 	c #4B65A1",
"l 	c #4C66A2",
"m 	c #4D67A2",
"n 	c #4F69A1",
"o 	c #516AA1",
"p 	c #536CA0",
"q 	c #556DA1",
"r 	c #576EA0",
"s 	c #586F9F",
"t 	c #586E9F",
"u 	c #596F9E",
"v 	c #5A6F9E",
"w 	c #5C709E",
"x 	c #5E719E",
"y 	c #5F729F",
"z 	c #62739F",
"A 	c #63739E",
"B 	c #64749D",
"C 	c #65749E",
"D 	c #69769D",
"E 	c #6C799E",
"F 	c #6D799F",
"G 	c #707D9F",
"H 	c #717F9E",
"I 	c #6E7AA1",
"J 	c #6C789E",
"K 	c #6F7C9C",
"L 	c #6F7D9B",
"M 	c #2A4AA0",
"N 	c #4971D0",
"O 	c #4C72D8",
"P 	c #5472C0",
"Q 	c #5573BF",
"R 	c #5774BF",
"S 	c #5875BF",
"T 	c #5976C1",
"U 	c #5A76C1",
"V 	c #5C78C2",
"W 	c #5E7AC2",
"X 	c #607CC3",
"Y 	c #627EC3",
"Z 	c #637FC4",
"` 	c #6581C5",
" .	c #6682C6",
"..	c #6783C7",
"+.	c #6984C8",
"@.	c #6B85C9",
"#.	c #6D87CA",
"$.	c #6F89CB",
"%.	c #718CCD",
"&.	c #748ECF",
"*.	c #7690D0",
"=.	c #7992D2",
"-.	c #7A93D3",
";.	c #7C95D5",
">.	c #7F98D7",
",.	c #8099D8",
"'.	c #859CDB",
").	c #8AA0DD",
"!.	c #8DA3DF",
"~.	c #8FA5E0",
"{.	c #90A5E0",
"].	c #91A6E1",
"^.	c #91A5E1",
"/.	c #90A4E0",
"(.	c #8EA3DE",
"_.	c #92A6E2",
":.	c #8FA4DF",
"<.	c #90A5DE",
"[.	c #90A5DC",
"}.	c #90A6DB",
"|.	c #91A6E0",
"1.	c #93A7E2",
"2.	c #95AAE6",
"3.	c #99AEEA",
"4.	c #9AB2EA",
"5.	c #99B1E9",
"6.	c #99B1E7",
"7.	c #98AFE6",
"8.	c #93A8E2",
"9.	c #97ACE7",
"0.	c #9AB3EB",
"a.	c #9DB5ED",
"b.	c #9DB6EE",
"c.	c #375095",
"d.	c #4056AD",
"e.	c #506DCD",
"f.	c #4360CC",
"g.	c #345ED6",
"h.	c #335ECF",
"i.	c #355ED6",
"j.	c #355FD6",
"k.	c #365FD6",
"l.	c #355FD0",
"m.	c #3760D5",
"n.	c #3A63D4",
"o.	c #3C63D1",
"p.	c #3B63CD",
"q.	c #3B63C9",
"r.	c #3B62C9",
"s.	c #3D63C8",
"t.	c #4065C5",
"u.	c #4567C5",
"v.	c #496BC5",
"w.	c #4F70C7",
"x.	c #5273C8",
"y.	c #5475CA",
"z.	c #5777CB",
"A.	c #5879CD",
"B.	c #5A7BCE",
"C.	c #5D7DCF",
"D.	c #5F7ECF",
"E.	c #617FD0",
"F.	c #6381D1",
"G.	c #6583D2",
"H.	c #6785D2",
"I.	c #6886D3",
"J.	c #6A88D4",
"K.	c #6C89D5",
"L.	c #6E8BD6",
"M.	c #708CD7",
"N.	c #718DD8",
"O.	c #738EDA",
"P.	c #748FDB",
"Q.	c #7691DC",
"R.	c #7893DD",
"S.	c #7994DD",
"T.	c #7A96DE",
"U.	c #7B97DF",
"V.	c #7C98E0",
"W.	c #7E9AE2",
"X.	c #7F9BE3",
"Y.	c #829DE4",
"Z.	c #849FE5",
"`.	c #87A0E6",
" +	c #88A1E7",
".+	c #89A2E6",
"++	c #8CA3E7",
"@+	c #8EA5E9",
"#+	c #8EA6E9",
"$+	c #8FA7E9",
"%+	c #8FA8E8",
"&+	c #8FA9E8",
"*+	c #91A9E8",
"=+	c #90A7E8",
"-+	c #8FA8EA",
";+	c #90AAEA",
">+	c #93ABEA",
",+	c #95ABEA",
"'+	c #93ABE9",
")+	c #94ABEA",
"!+	c #90A9EA",
"~+	c #93AAE9",
"{+	c #273E7E",
"]+	c #345ED5",
"^+	c #3D60CE",
"/+	c #3D60CF",
"(+	c #345ECF",
"_+	c #335ED0",
":+	c #355FD3",
"<+	c #3A60CE",
"[+	c #3A5FCB",
"}+	c #385FC9",
"|+	c #3B60C8",
"1+	c #3C63CB",
"2+	c #3E64CB",
"3+	c #4166CA",
"4+	c #4568C9",
"5+	c #4A6CC7",
"6+	c #4F71C8",
"7+	c #5172CA",
"8+	c #5475CE",
"9+	c #5678D3",
"0+	c #597CD6",
"a+	c #5C7ED7",
"b+	c #5E7FD8",
"c+	c #6181D9",
"d+	c #6383DA",
"e+	c #6585DA",
"f+	c #6786DB",
"g+	c #6988DC",
"h+	c #6B8ADD",
"i+	c #6D8BDE",
"j+	c #6F8DDE",
"k+	c #718EDF",
"l+	c #728FE0",
"m+	c #7390E1",
"n+	c #7390E2",
"o+	c #7491E3",
"p+	c #7592E4",
"q+	c #7693E4",
"r+	c #7794E5",
"s+	c #7894E5",
"t+	c #7995E6",
"u+	c #7B96E6",
"v+	c #7C97E7",
"w+	c #7D9AE8",
"x+	c #7F9CE9",
"y+	c #829DE9",
"z+	c #849EE9",
"A+	c #859EE9",
"B+	c #87A0E7",
"C+	c #8AA2E7",
"D+	c #8BA3E8",
"E+	c #89A2E7",
"F+	c #8CA6EA",
"G+	c #8BA6EA",
"H+	c #8BA7EA",
"I+	c #8CA3E8",
"J+	c #8BA8EA",
"K+	c #8CA7EA",
"L+	c #8CA8EA",
"M+	c #4659C7",
"N+	c #355ECF",
"O+	c #3660CF",
"P+	c #3860CE",
"Q+	c #3961CD",
"R+	c #3B61CB",
"S+	c #3B61CA",
"T+	c #3D62CA",
"U+	c #3D63CA",
"V+	c #4165CB",
"W+	c #456ACB",
"X+	c #4B6FCD",
"Y+	c #5174CE",
"Z+	c #5275D1",
"`+	c #5477D4",
" @	c #5678D9",
".@	c #587ADB",
"+@	c #597BDB",
"@@	c #5B7DDC",
"#@	c #5E7FDC",
"$@	c #6081DD",
"%@	c #6283DE",
"&@	c #6484DF",
"*@	c #6787E0",
"=@	c #6989E1",
"-@	c #6B8BE1",
";@	c #6D8DE2",
">@	c #6F8EE3",
",@	c #718FE4",
"'@	c #7290E4",
")@	c #7491E5",
"!@	c #7692E6",
"~@	c #7793E5",
"{@	c #7894E6",
"]@	c #7895E7",
"^@	c #7996E8",
"/@	c #7A97E8",
"(@	c #7B98E9",
"_@	c #7D99E8",
":@	c #7F9AE8",
"<@	c #7F9BE9",
"[@	c #7F9CEA",
"}@	c #859EE8",
"|@	c #859FE8",
"1@	c #85A0E9",
"2@	c #869FE9",
"3@	c #86A1E7",
"4@	c #86A0E9",
"5@	c #87A1E7",
"6@	c #88A2E7",
"7@	c #87A1E9",
"8@	c #5A6FCA",
"9@	c #365FCF",
"0@	c #345ED0",
"a@	c #385FCC",
"b@	c #385FCE",
"c@	c #3A61CC",
"d@	c #3B62CD",
"e@	c #3E64CD",
"f@	c #4167CF",
"g@	c #4469CF",
"h@	c #486CD1",
"i@	c #4D71D2",
"j@	c #5175D4",
"k@	c #5376D6",
"l@	c #5578DA",
"m@	c #5679DC",
"n@	c #587BDD",
"o@	c #5A7DDE",
"p@	c #5D80DE",
"q@	c #5F82DF",
"r@	c #6284DF",
"s@	c #6585E0",
"t@	c #6787E1",
"u@	c #6988E2",
"v@	c #6B8AE2",
"w@	c #6D8CE3",
"x@	c #6E8DE3",
"y@	c #708EE4",
"z@	c #718FE3",
"A@	c #7391E4",
"B@	c #7592E5",
"C@	c #7895E5",
"D@	c #7996E6",
"E@	c #7A97E6",
"F@	c #7B98E7",
"G@	c #7A98E8",
"H@	c #7B99E9",
"I@	c #7E9AE9",
"J@	c #7D9AE9",
"K@	c #7E9AEA",
"L@	c #809CE9",
"M@	c #819DE8",
"N@	c #7F9BEA",
"O@	c #819DE9",
"P@	c #819CE9",
"Q@	c #839EE9",
"R@	c #839EE8",
"S@	c #839DEA",
"T@	c #859FE9",
"U@	c #87A0E8",
"V@	c #86A0E8",
"W@	c #87A1E8",
"X@	c #3760CF",
"Y@	c #3A61CE",
"Z@	c #3A62CD",
"`@	c #3F66CE",
" #	c #4368D0",
".#	c #466CD2",
"+#	c #496DD5",
"@#	c #4E72D6",
"##	c #5175D8",
"$#	c #5276DA",
"%#	c #5578DC",
"&#	c #577ADC",
"*#	c #597CDD",
"=#	c #5B7DDD",
"-#	c #5D7FDE",
";#	c #5E81DE",
">#	c #6183DF",
",#	c #6386DF",
"'#	c #6687E0",
")#	c #6888E0",
"!#	c #6A89E1",
"~#	c #6C8AE1",
"{#	c #6E8CE2",
"]#	c #6F8DE2",
"^#	c #7390E4",
"/#	c #7390E3",
"(#	c #7491E4",
"_#	c #7693E5",
":#	c #7895E6",
"<#	c #7896E6",
"[#	c #7997E7",
"}#	c #7B97E7",
"|#	c #7B98E8",
"1#	c #7C98E8",
"2#	c #7E9BE9",
"3#	c #809CEA",
"4#	c #819CEA",
"5#	c #839DE9",
"6#	c #365FD0",
"7#	c #3660D0",
"8#	c #3961CF",
"9#	c #3B63CF",
"0#	c #3D64D0",
"a#	c #4067D0",
"b#	c #4469D2",
"c#	c #466BD3",
"d#	c #496ED5",
"e#	c #4C71D6",
"f#	c #4E72D8",
"g#	c #5074D9",
"h#	c #5376DB",
"i#	c #5578DB",
"j#	c #587ADC",
"k#	c #5B7CDC",
"l#	c #5D7EDD",
"m#	c #5F80DD",
"n#	c #6081DE",
"o#	c #6383DE",
"p#	c #6686DF",
"q#	c #6887E0",
"r#	c #6988E0",
"s#	c #6B89E1",
"t#	c #6C8AE0",
"u#	c #6E8CE1",
"v#	c #708EE2",
"w#	c #718FE2",
"x#	c #7290E3",
"y#	c #7391E2",
"z#	c #7492E1",
"A#	c #7592E2",
"B#	c #7691E3",
"C#	c #7591E3",
"D#	c #7692E3",
"E#	c #7693E3",
"F#	c #7793E4",
"G#	c #7893E4",
"H#	c #7994E5",
"I#	c #7D97E8",
"J#	c #7E98E8",
"K#	c #7D98E8",
"L#	c #7D99E9",
"M#	c #7D9BEA",
"N#	c #7D9CEA",
"O#	c #7E99E8",
"P#	c #7D9AEA",
"Q#	c #7C9BEA",
"R#	c #7C9CEA",
"S#	c #355FCF",
"T#	c #3860D0",
"U#	c #3A62D0",
"V#	c #3C64D1",
"W#	c #4167D1",
"X#	c #4369D3",
"Y#	c #466BD4",
"Z#	c #486DD5",
"`#	c #4A6ED7",
" $	c #4C70D8",
".$	c #5478D9",
"+$	c #577BDA",
"@$	c #597DDB",
"#$	c #5B7EDB",
"$$	c #5D7FDC",
"%$	c #6182DE",
"&$	c #6284DE",
"*$	c #6485DF",
"=$	c #6586DF",
"-$	c #6787DF",
";$	c #6888DF",
">$	c #6A8ADF",
",$	c #6C8BE0",
"'$	c #6D8CE0",
")$	c #6E8DE1",
"!$	c #6F8DE1",
"~$	c #708EE1",
"{$	c #718FE0",
"]$	c #728FE1",
"^$	c #7390E0",
"/$	c #738FE0",
"($	c #7490E1",
"_$	c #7590E1",
":$	c #7591E1",
"<$	c #7592E1",
"[$	c #7692E2",
"}$	c #7794E2",
"|$	c #7894E3",
"1$	c #7996E3",
"2$	c #7A96E5",
"3$	c #7B98E6",
"4$	c #7B9AE8",
"5$	c #7C99E8",
"6$	c #7C96E5",
"7$	c #7D97E7",
"8$	c #7C99E9",
"9$	c #7B9AE9",
"0$	c #7B9AEA",
"a$	c #5B6DCF",
"b$	c #305EC8",
"c$	c #335ECE",
"d$	c #305ECA",
"e$	c #345FCF",
"f$	c #3761D0",
"g$	c #3A62D1",
"h$	c #3C64D2",
"i$	c #4066D3",
"j$	c #466BD5",
"k$	c #486ED6",
"l$	c #4A6ED6",
"m$	c #4D71D8",
"n$	c #4F72D9",
"o$	c #5073D9",
"p$	c #4F72D8",
"q$	c #5074D8",
"r$	c #5276D9",
"s$	c #587ADA",
"t$	c #5B7CDB",
"u$	c #5D7EDC",
"v$	c #5F7FDD",
"w$	c #6081DC",
"x$	c #6182DD",
"y$	c #6283DD",
"z$	c #6484DE",
"A$	c #6585DD",
"B$	c #6787DE",
"C$	c #6988DF",
"D$	c #6A89DE",
"E$	c #6C8ADF",
"F$	c #6D8BDF",
"G$	c #6E8CE0",
"H$	c #6F8DE0",
"I$	c #718EE0",
"J$	c #728FDF",
"K$	c #728FDE",
"L$	c #7290E0",
"M$	c #7190E0",
"N$	c #7291E0",
"O$	c #7191E0",
"P$	c #7392E1",
"Q$	c #7493E1",
"R$	c #7594E1",
"S$	c #7594E2",
"T$	c #7694E2",
"U$	c #7695E2",
"V$	c #7A96E4",
"W$	c #7895E2",
"X$	c #7A96E2",
"Y$	c #7A96E3",
"Z$	c #7B96E3",
"`$	c #7996E1",
" %	c #7C96E4",
".%	c #305EC9",
"+%	c #315ECC",
"@%	c #325ECE",
"#%	c #3760D0",
"$%	c #3962D1",
"%%	c #3E66D3",
"&%	c #4268D4",
"*%	c #446BD5",
"=%	c #476CD6",
"-%	c #496ED7",
";%	c #4B6FD7",
">%	c #4C70D7",
",%	c #4E71D7",
"'%	c #5074D7",
")%	c #5276D8",
"!%	c #5376D8",
"~%	c #5779DA",
"{%	c #597ADA",
"]%	c #5A7BDB",
"^%	c #5B7CDA",
"/%	c #5D7EDB",
"(%	c #5E7FDB",
"_%	c #6182DB",
":%	c #6384DC",
"<%	c #6586DD",
"[%	c #6686DC",
"}%	c #6887DD",
"|%	c #6988DD",
"1%	c #6A8ADE",
"2%	c #6B8BDE",
"3%	c #6C8CDE",
"4%	c #6E8DDF",
"5%	c #6E8CDF",
"6%	c #6D8DDF",
"7%	c #6C8BDF",
"8%	c #6F8DDF",
"9%	c #718FDF",
"0%	c #7290DF",
"a%	c #7391E0",
"b%	c #7491E0",
"c%	c #7292E1",
"d%	c #3959C5",
"e%	c #345BC5",
"f%	c #315EC8",
"g%	c #355BC5",
"h%	c #325EC8",
"i%	c #315ECB",
"j%	c #345DCC",
"k%	c #335ECD",
"l%	c #345ECD",
"m%	c #355FCE",
"n%	c #3862D0",
"o%	c #3E66D2",
"p%	c #456BD5",
"q%	c #476CD5",
"r%	c #4B6ED7",
"s%	c #4B6FD6",
"t%	c #4B6FD5",
"u%	c #4D71D6",
"v%	c #5073D7",
"w%	c #5174D7",
"x%	c #5275D8",
"y%	c #5577D8",
"z%	c #5678D8",
"A%	c #5779D9",
"B%	c #587AD8",
"C%	c #597CD9",
"D%	c #5B7DD9",
"E%	c #5D7FDA",
"F%	c #5F80DB",
"G%	c #6182DC",
"H%	c #6484DC",
"I%	c #6585DC",
"J%	c #6787DD",
"K%	c #6988DE",
"L%	c #6B8ADE",
"M%	c #6B8ADF",
"N%	c #6989DE",
"O%	c #6B89DE",
"P%	c #6E8BDF",
"Q%	c #708CDE",
"R%	c #708DDF",
"S%	c #708FDF",
"T%	c #728EDF",
"U%	c #6F8EDD",
"V%	c #728EDD",
"W%	c #7390DF",
"X%	c #7490DF",
"Y%	c #335DC8",
"Z%	c #3759C5",
"`%	c #3859C5",
" &	c #335EC8",
".&	c #325DCA",
"+&	c #345CCB",
"@&	c #335DCC",
"#&	c #345DCD",
"$&	c #355FCD",
"%&	c #3861D0",
"&&	c #3B64D1",
"*&	c #3E65D2",
"=&	c #4168D3",
"-&	c #456AD5",
";&	c #4B6ED5",
">&	c #4C6FD4",
",&	c #4D70D5",
"'&	c #4F72D6",
")&	c #5173D6",
"!&	c #5375D7",
"~&	c #5476D8",
"{&	c #5577D7",
"]&	c #5477D8",
"^&	c #5677D8",
"/&	c #5879D9",
"(&	c #597AD9",
"_&	c #5C7DDA",
":&	c #6080DC",
"<&	c #6080DB",
"[&	c #6181DC",
"}&	c #6282DC",
"|&	c #6383DD",
"1&	c #6484DD",
"2&	c #6686DE",
"3&	c #6685DE",
"4&	c #6786DE",
"5&	c #6687DE",
"6&	c #6887DE",
"7&	c #6987DE",
"8&	c #6788DF",
"9&	c #6785DF",
"0&	c #6B89DF",
"a&	c #6C89DF",
"b&	c #6F8DDD",
"c&	c #6D8CDE",
"d&	c #445BBB",
"e&	c #3759BE",
"f&	c #375AC6",
"g&	c #355CC8",
"h&	c #345CCA",
"i&	c #355ECC",
"j&	c #365FCD",
"k&	c #3761CE",
"l&	c #3A63D0",
"m&	c #3D65D1",
"n&	c #466AD4",
"o&	c #476BD4",
"p&	c #486CD3",
"q&	c #4A6ED4",
"r&	c #4B6ED4",
"s&	c #4E71D6",
"t&	c #4F71D5",
"u&	c #5072D6",
"v&	c #5274D7",
"w&	c #5273D7",
"x&	c #5274D6",
"y&	c #5476D7",
"z&	c #5779D8",
"A&	c #587AD9",
"B&	c #5A7CDA",
"C&	c #5C7DDB",
"D&	c #5D7EDA",
"E&	c #6081DA",
"F&	c #6181DB",
"G&	c #6283DC",
"H&	c #6483DD",
"I&	c #6483DE",
"J&	c #6585DE",
"K&	c #6786DF",
"L&	c #6886DE",
"M&	c #6887DF",
"N&	c #6987DF",
"O&	c #6A88DF",
"P&	c #6786E0",
"Q&	c #6A86DE",
"R&	c #6B89E0",
"S&	c #365BC8",
"T&	c #365CC8",
"U&	c #375DCA",
"V&	c #375FCB",
"W&	c #3860CD",
"X&	c #3C63D0",
"Y&	c #4167D2",
"Z&	c #4268D2",
"`&	c #4368D2",
" *	c #4367D2",
".*	c #4568D2",
"+*	c #466AD2",
"@*	c #496CD3",
"#*	c #4A6DD3",
"$*	c #4A6DD4",
"%*	c #4D70D4",
"&*	c #4F72D5",
"**	c #4C70D4",
"=*	c #4E72D5",
"-*	c #5173D5",
";*	c #5375D6",
">*	c #597BDA",
",*	c #5B7DDA",
"'*	c #5C7EDB",
")*	c #5D7FDB",
"!*	c #5E80DB",
"~*	c #5E81DA",
"{*	c #5F81DB",
"]*	c #5F82DB",
"^*	c #6384DD",
"/*	c #6384DE",
"(*	c #6585DF",
"_*	c #6486E0",
":*	c #6583DD",
"<*	c #6386E0",
"[*	c #6686E0",
"}*	c #6B86DD",
"|*	c #6D86DD",
"1*	c #6086E0",
"2*	c #5573CD",
"3*	c #3959C3",
"4*	c #3959C4",
"5*	c #3759C0",
"6*	c #375BC7",
"7*	c #365CC7",
"8*	c #395FCC",
"9*	c #3B62CE",
"0*	c #3E64D0",
"a*	c #4066D1",
"b*	c #4166D1",
"c*	c #4064CF",
"d*	c #4065CF",
"e*	c #4266D0",
"f*	c #4468D1",
"g*	c #4569D1",
"h*	c #476BD2",
"i*	c #466AD1",
"j*	c #476AD2",
"k*	c #456AD1",
"l*	c #496DD2",
"m*	c #4A6FD3",
"n*	c #496ED2",
"o*	c #4B70D4",
"p*	c #4D71D4",
"q*	c #4E72D4",
"r*	c #5073D4",
"s*	c #5174D5",
"t*	c #5175D5",
"u*	c #5276D6",
"v*	c #5377D6",
"w*	c #5478D7",
"x*	c #5579D7",
"y*	c #567AD8",
"z*	c #577BD9",
"A*	c #597CD8",
"B*	c #5A7DD9",
"C*	c #5A7ED9",
"D*	c #5B7FDA",
"E*	c #5C80DA",
"F*	c #5D80DA",
"G*	c #5E81DB",
"H*	c #5D80DB",
"I*	c #6082DC",
"J*	c #6183DD",
"K*	c #6183DE",
"L*	c #6082DB",
"M*	c #6282DE",
"N*	c #6682DE",
"O*	c #6583DE",
"P*	c #3759BF",
"Q*	c #375AC2",
"R*	c #375AC1",
"S*	c #375AC4",
"T*	c #395DCA",
"U*	c #3A5ECA",
"V*	c #3C60CC",
"W*	c #3D61CD",
"X*	c #3D61CC",
"Y*	c #3C61CD",
"Z*	c #3E62CD",
"`*	c #3F64CE",
" =	c #4266CF",
".=	c #4468D0",
"+=	c #4267CF",
"@=	c #4166CE",
"#=	c #4065CE",
"$=	c #4166CD",
"%=	c #4267CE",
"&=	c #456AD0",
"*=	c #4368CE",
"==	c #4468CF",
"-=	c #4569D0",
";=	c #486BD1",
">=	c #4B6FD3",
",=	c #4C70D3",
"'=	c #4F73D4",
")=	c #5275D5",
"!=	c #5477D6",
"~=	c #577BD7",
"{=	c #587CD8",
"]=	c #577CD8",
"^=	c #597DD9",
"/=	c #5A7DDA",
"(=	c #597DDA",
"_=	c #587CDA",
":=	c #5A7EDA",
"<=	c #567BD8",
"[=	c #557AD9",
"}=	c #567BD9",
"|=	c #577CD9",
"1=	c #587DD9",
"2=	c #587ED9",
"3=	c #577ED8",
"4=	c #587DD8",
"5=	c #587ED8",
"6=	c #567ED7",
"7=	c #526ABD",
"8=	c #3759C1",
"9=	c #385BC7",
"0=	c #395CC8",
"a=	c #3B5DC9",
"b=	c #3B5ECA",
"c=	c #3A5FCA",
"d=	c #3B60CC",
"e=	c #3C61CC",
"f=	c #3D62CD",
"g=	c #3E63CD",
"h=	c #3C61CB",
"i=	c #3C61CA",
"j=	c #3D62CB",
"k=	c #3F64CC",
"l=	c #4065CD",
"m=	c #4669D0",
"n=	c #476AD0",
"o=	c #496BD1",
"p=	c #4A6DD2",
"q=	c #4B6ED2",
"r=	c #4D71D3",
"s=	c #4E73D4",
"t=	c #4F74D4",
"u=	c #5075D5",
"v=	c #5276D5",
"w=	c #5377D7",
"x=	c #5278D7",
"y=	c #5277D6",
"z=	c #5378D7",
"A=	c #5379D8",
"B=	c #5379D9",
"C=	c #5278D8",
"D=	c #5178D7",
"E=	c #3355C0",
"F=	c #3556C1",
"G=	c #395AC6",
"H=	c #385AC7",
"I=	c #395BC7",
"J=	c #395EC9",
"K=	c #395FCA",
"L=	c #3B60CA",
"M=	c #3B60CB",
"N=	c #375DC7",
"O=	c #385EC8",
"P=	c #395FC9",
"Q=	c #3A60CA",
"R=	c #3D63CC",
"S=	c #4367CF",
"T=	c #476BD1",
"U=	c #4A6ED2",
"V=	c #4B6FD2",
"W=	c #4C6FD2",
"X=	c #4D70D1",
"Y=	c #4E71D2",
"Z=	c #4E72D2",
"`=	c #4E74D4",
" -	c #4E75D5",
".-	c #4E75D4",
"+-	c #4F75D3",
"@-	c #5075D2",
"#-	c #5075D3",
"$-	c #5177D7",
"%-	c #5178D8",
"&-	c #4F75D5",
"*-	c #5076D5",
"=-	c #4F76D6",
"--	c #5279D9",
";-	c #3C52B1",
">-	c #3656C3",
",-	c #3757C5",
"'-	c #3758C6",
")-	c #3759C6",
"!-	c #375BC6",
"~-	c #385CC7",
"{-	c #385DC8",
"]-	c #365CC6",
"^-	c #355BC6",
"/-	c #355CC6",
"(-	c #365DC7",
"_-	c #375EC8",
":-	c #375CC6",
"<-	c #385EC6",
"[-	c #3A5FC7",
"}-	c #3C60C8",
"|-	c #3D61C9",
"1-	c #3E62CA",
"2-	c #4063CC",
"3-	c #4165CE",
"4-	c #4268D0",
"5-	c #4269D1",
"6-	c #436AD2",
"7-	c #446AD2",
"8-	c #456BD2",
"9-	c #496CD1",
"0-	c #4C6CD0",
"a-	c #4D6CCF",
"b-	c #4E6DD0",
"c-	c #4F6ECF",
"d-	c #4E6FCF",
"e-	c #4C70CF",
"f-	c #4A71D0",
"g-	c #4F6FCF",
"h-	c #4B71D0",
"i-	c #4A72D1",
"j-	c #4B73D4",
"k-	c #4F70D0",
"l-	c #4C73D3",
"m-	c #4C73D6",
"n-	c #4B72D2",
"o-	c #4B71D1",
"p-	c #4C73D7",
"q-	c #3354C0",
"r-	c #3152BE",
"s-	c #3052BE",
"t-	c #3051BF",
"u-	c #2E4FBF",
"v-	c #2E4FBE",
"w-	c #2E50BF",
"x-	c #2F50BF",
"y-	c #3156C4",
"z-	c #2F56C5",
"A-	c #2E57C5",
"B-	c #2F57C5",
"C-	c #3057C6",
"D-	c #3258C6",
"E-	c #3459C7",
"F-	c #365AC7",
"G-	c #385BC8",
"H-	c #3B5DCA",
"I-	c #3B5DCB",
"J-	c #3C5ECC",
"K-	c #3C60CD",
"L-	c #3C62CE",
"M-	c #3D65D0",
"N-	c #3D66D1",
"O-	c #4166D2",
"P-	c #4667D2",
"Q-	c #4A67D1",
"R-	c #4C68D0",
"S-	c #4C69CF",
"T-	c #4D6BCE",
"U-	c #4E6DCD",
"V-	c #4E6ECE",
"W-	c #4E6DCE",
"X-	c #4970D0",
"Y-	c #4770D0",
"Z-	c #4B6BCE",
"`-	c #4A6CCE",
" ;	c #496DCF",
".;	c #476FD0",
"+;	c #4870D0",
"@;	c #486DCF",
"#;	c #242F79",
"$;	c #2F41AC",
"%;	c #2040B8",
"&;	c #2041B8",
"*;	c #2243B3",
"=;	c #2243B8",
"-;	c #2343B8",
";;	c #2444B8",
">;	c #2445B8",
",;	c #2445B6",
"';	c #2445B7",
");	c #2444B9",
"!;	c #2949BE",
"~;	c #2649BF",
"{;	c #234BBF",
"];	c #224CBF",
"^;	c #224AC0",
"/;	c #244CC0",
"(;	c #254DC0",
"_;	c #254DC1",
":;	c #264DC2",
"<;	c #274EC3",
"[;	c #274CC3",
"};	c #274DC4",
"|;	c #254DC5",
"1;	c #214EC5",
"2;	c #204FC6",
"3;	c #1F50C8",
"4;	c #2151C9",
"5;	c #2B53C8",
"6;	c #3154C7",
"7;	c #3255C6",
"8;	c #2F57C7",
"9;	c #2C58C9",
"0;	c #2D59CA",
"a;	c #2D58C9",
"b;	c #2E5BCC",
"c;	c #325ECC",
"d;	c #325ECB",
"e;	c #1F40B1",
"f;	c #1F40B2",
"g;	c #1F40B3",
"h;	c #2A44BD",
"i;	c #2845BE",
"j;	c #2745BE",
"k;	c #2646BF",
"l;	c #2546BE",
"m;	c #2347BF",
"n;	c #2147BF",
"o;	c #2048C0",
"p;	c #1D48C0",
"q;	c #1C48C0",
"r;	c #1B47C0",
"s;	c #1C48BF",
"t;	c #1E49BE",
"u;	c #214ABD",
"v;	c #244CBD",
"w;	c #264DBE",
"x;	c #254EC0",
"y;	c #214FC2",
"z;	c #1B51C5",
"A;	c #1C51C7",
"B;	c #2250C8",
"C;	c #2A52C8",
"D;	c #3254C6",
"E;	c #3355C5",
"F;	c #3154C8",
"G;	c #3355C6",
"H;	c #2F57C8",
"I;	c #2E58C9",
"J;	c #2E59C9",
"K;	c #3059C9",
"L;	c #2040B6",
"M;	c #2743BB",
"N;	c #2844BC",
"O;	c #2743BD",
"P;	c #2844BE",
"Q;	c #2844BD",
"R;	c #2346BE",
"S;	c #2047BF",
"T;	c #1E48C0",
"U;	c #1D47C0",
"V;	c #1D49BF",
"W;	c #1F49BF",
"X;	c #204ABE",
"Y;	c #254DBF",
"Z;	c #234EC0",
"`;	c #2050C1",
" >	c #1C51C3",
".>	c #1F51C6",
"+>	c #2651C8",
"@>	c #2D53C7",
"#>	c #3155C6",
"$>	c #3155C7",
"%>	c #3355C7",
"&>	c #3254C7",
"*>	c #1E40B1",
"=>	c #2141B8",
"->	c #2442B9",
";>	c #2744BB",
">>	c #2945BB",
",>	c #2A45BB",
"'>	c #2944BA",
")>	c #2745BB",
"!>	c #2545BC",
"~>	c #2246BD",
"{>	c #2047BE",
"]>	c #1F47BD",
"^>	c #1D48BE",
"/>	c #1E49C0",
"(>	c #1F4AC0",
"_>	c #214BBF",
":>	c #244CBE",
"<>	c #254DBE",
"[>	c #244DBE",
"}>	c #224FBF",
"|>	c #2051C1",
"1>	c #2151C3",
"2>	c #2252C5",
"3>	c #2151C1",
"4>	c #2851C6",
"5>	c #2A50C6",
"6>	c #2E54C6",
"7>	c #1F51C2",
"8>	c #1D52C5",
"9>	c #2651C9",
"0>	c #2950C7",
"a>	c #2D40A5",
"b>	c #2040B0",
"c>	c #1F40B0",
"d>	c #223CAE",
"e>	c #233CAE",
"f>	c #253BAC",
"g>	c #253BAD",
"h>	c #233CB0",
"i>	c #213EB2",
"j>	c #1F3FB4",
"k>	c #1E40B6",
"l>	c #1F3FB7",
"m>	c #1E3EB8",
"n>	c #1F3FB8",
"o>	c #2040B7",
"p>	c #2141B6",
"q>	c #2140B7",
"r>	c #2241B6",
"s>	c #2342B5",
"t>	c #2442B6",
"u>	c #2543B5",
"v>	c #2643B4",
"w>	c #2544B6",
"x>	c #2346B8",
"y>	c #2247B9",
"z>	c #2048BC",
"A>	c #1F48BF",
"B>	c #2049C0",
"C>	c #214AC0",
"D>	c #224BBF",
"E>	c #234CBE",
"F>	c #244DBF",
"G>	c #234CBF",
"H>	c #264DC0",
"I>	c #274EBF",
"J>	c #264DBF",
"K>	c #254EBF",
"L>	c #2050C0",
"M>	c #1F51C1",
"N>	c #1E42A4",
"O>	c #263BA6",
"P>	c #253BA7",
"Q>	c #253CA7",
"R>	c #1E41A5",
"S>	c #1F40AF",
"T>	c #273AAC",
"U>	c #1E40B0",
"V>	c #1F40B5",
"W>	c #1F40B6",
"X>	c #1F40B8",
"Y>	c #1E40B8",
"Z>	c #1F3EB8",
"`>	c #203FB7",
" ,	c #2240B6",
".,	c #2341B7",
"+,	c #2345B9",
"@,	c #2147BB",
"#,	c #2148BA",
"$,	c #2049BB",
"%,	c #2049BD",
"&,	c #2049BF",
"*,	c #224BBE",
"=,	c #244DBD",
"-,	c #244CBF",
";,	c #182969",
">,	c #273BAD",
",,	c #2739AB",
"',	c #263AAC",
"),	c #243CAE",
"!,	c #233DAE",
"~,	c #213EAF",
"{,	c #1F3FB0",
"],	c #2040B4",
"^,	c #1F3FB6",
"/,	c #1E3EB7",
"(,	c #2240B7",
"_,	c #2341B6",
":,	c #2543B4",
"<,	c #2644B3",
"[,	c #2544B5",
"},	c #2545B5",
"|,	c #2547B6",
"1,	c #2548B7",
"2,	c #2349BA",
"3,	c #1F49BE",
"4,	c #2149BD",
"5,	c #2049BE",
"6,	c #214BBE",
"7,	c #2249BE",
"8,	c #234CBD",
"9,	c #2149BE",
"0,	c #1E49BF",
"a,	c #253BA9",
"b,	c #253BAB",
"c,	c #263AAB",
"d,	c #213DAF",
"e,	c #203EAF",
"f,	c #1D40AF",
"g,	c #1D40B0",
"h,	c #1E40B4",
"i,	c #2241B7",
"j,	c #2643B6",
"k,	c #2744B5",
"l,	c #2643B5",
"m,	c #2346B6",
"n,	c #2147B7",
"o,	c #2644B6",
"p,	c #2247B7",
"q,	c #2248B8",
"r,	c #2647B7",
"s,	c #2549B7",
"t,	c #2645B7",
"u,	c #2148B8",
"v,	c #2847B6",
"w,	c #2549B6",
"x,	c #2849B6",
"y,	c #2049B7",
"z,	c #2A49B5",
"A,	c #243BA4",
"B,	c #253BA5",
"C,	c #253BA6",
"D,	c #263AA7",
"E,	c #263AA8",
"F,	c #2739AA",
"G,	c #243CAD",
"H,	c #223DAE",
"I,	c #1F3EAF",
"J,	c #1E3FB0",
"K,	c #1D40B1",
"L,	c #1E3FB1",
"M,	c #1F3FB3",
"N,	c #1F3FB5",
"O,	c #2140B6",
"P,	c #2140B8",
"Q,	c #2744B4",
"R,	c #2746B6",
"S,	c #2947B6",
"T,	c #2946B5",
"U,	c #2A48B6",
"V,	c #3551A8",
"W,	c #1F399C",
"X,	c #143D9F",
"Y,	c #263BA5",
"Z,	c #273BA8",
"`,	c #273BAA",
" '	c #263AAD",
".'	c #233CAD",
"+'	c #213DAE",
"@'	c #203FB2",
"#'	c #2342B6",
"$'	c #2443B6",
"%'	c #2543B6",
"&'	c #2644B5",
"*'	c #133D9E",
"='	c #263BA7",
"-'	c #263BA9",
";'	c #273BA9",
">'	c #263AAA",
",'	c #2539AB",
"''	c #2639AB",
")'	c #253AAC",
"!'	c #243BAD",
"~'	c #223DAF",
"{'	c #203FB0",
"]'	c #2040B1",
"^'	c #2140B3",
"/'	c #2543B1",
"('	c #2744AF",
"_'	c #1A3CA0",
":'	c #1D3BA2",
"<'	c #233BA4",
"['	c #263AA5",
"}'	c #253AA5",
"|'	c #263AA6",
"1'	c #263BA4",
"2'	c #243BA5",
"3'	c #263BA8",
"4'	c #223EAF",
"5'	c #3B4CA5",
"6'	c #1D379A",
"7'	c #1E389C",
"8'	c #1E399F",
"9'	c #1F3BA2",
"0'	c #1F3BA3",
"a'	c #213BA4",
"b'	c #233AA3",
"c'	c #243AA3",
"d'	c #2539A4",
"e'	c #253AA6",
"f'	c #243BA7",
"g'	c #253CAA",
"h'	c #253CAC",
"i'	c #253CAD",
"j'	c #253CAE",
"k'	c #243DAE",
"l'	c #213FAF",
"m'	c #223FAF",
"n'	c #2040AF",
"o'	c #253D93",
"p'	c #1D3894",
"q'	c #1F379A",
"r'	c #1E389B",
"s'	c #1D399C",
"t'	c #1C3A9D",
"u'	c #1B3A9D",
"v'	c #183B9E",
"w'	c #163C9E",
"x'	c #153C9E",
"y'	c #163B9D",
"z'	c #173B9D",
"A'	c #193A9D",
"B'	c #1C3A9E",
"C'	c #1F3AA1",
"D'	c #223AA4",
"E'	c #253BA8",
"F'	c #273BA7",
"G'	c #263CAB",
"H'	c #263CAC",
"I'	c #243EAE",
"J'	c #273BAC",
"K'	c #2A3795",
"L'	c #1F389B",
"M'	c #1D389B",
"N'	c #1C399C",
"O'	c #1B399C",
"P'	c #1A3A9D",
"Q'	c #1D399B",
"R'	c #1B399B",
"S'	c #1A3A9C",
"T'	c #1B3A9F",
"U'	c #1D3AA0",
"V'	c #203BA2",
"W'	c #203BA3",
"X'	c #2639A6",
"Y'	c #1B3692",
"Z'	c #1C3794",
"`'	c #1D3796",
" )	c #1E3898",
".)	c #1E389A",
"+)	c #1F399B",
"@)	c #1A399C",
"#)	c #193A9E",
"$)	c #1A3BA0",
"%)	c #1C3BA2",
"&)	c #1D3CA3",
"*)	c #203CA4",
"=)	c #223BA5",
"-)	c #3C4699",
";)	c #2B4595",
">)	c #1C3793",
",)	c #1D3895",
"')	c #1E3897",
"))	c #1F3998",
"!)	c #1F3999",
"~)	c #1F399A",
"{)	c #1E399C",
"])	c #1C3B9E",
"^)	c #1D3BA0",
"/)	c #1E3CA2",
"()	c #223CA5",
"_)	c #243CA6",
":)	c #596FA9",
"<)	c #3B4894",
"[)	c #314993",
"})	c #29499F",
"|)	c #28489E",
"1)	c #2B4BA1",
"2)	c #2C4BA1",
"3)	c #2D4CA2",
"4)	c #2E4CA3",
"5)	c #2F4CA4",
"6)	c #2E4CA4",
"7)	c #2F4DA3",
"8)	c #2F4DA4",
"9)	c #D3D5D2",
"0)	c #3B4794",
"a)	c #314791",
"b)	c #304892",
"c)	c #304893",
"d)	c #2F4995",
"e)	c #2F4997",
"f)	c #2D4A9A",
"g)	c #2A4A9D",
"h)	c #294A9F",
"i)	c #284AA0",
"j)	c #294AA0",
"k)	c #2B4AA1",
"l)	c #2D4CA3",
"m)	c #C9CAC9",
"n)	c #455D9B",
"o)	c #242F78",
"p)	c #1B2F85",
"q)	c #C6C3C8",
"r)	c #B5B2B6",
"s)	c #B5B7B4",
"t)	c #B5B7B3",
"u)	c #B5B2B5",
"v)	c #B5B3B4",
"w)	c #B5B5B4",
"x)	c #B5B6B3",
"y)	c #B5B4B4",
"z)	c #B5B3B5",
"A)	c #B5B4B5",
"B)	c #B5B5B5",
"C)	c #B5B5B3",
"D)	c #B5B5B6",
"E)	c #BAC3BE",
"F)	c #B9C3BD",
"G)	c #C1C3C4",
"H)	c #BFC3C2",
"I)	c #B9C3BE",
"J)	c #BBC3BF",
"K)	c #BDC3C1",
"L)	c #C0C3C3",
"M)	c #BEC3C1",
"N)	c #C2C3C5",
"O)	c #E6E3E8",
"P)	c #E0E2DF",
"Q)	c #E1E1E1",
"R)	c #E2E1E3",
"S)	c #E4E1E6",
"T)	c #E4E2E7",
"U)	c #E4E2E6",
"V)	c #E3E3E4",
"W)	c #E2E3E3",
"X)	c #E1E3E2",
"Y)	c #E3E3E3",
"Z)	c #E3E3E2",
"`)	c #EBEDEA",
" !	c #EAECE9",
".!	c #E9EBE8",
"+!	c #ECEEEB",
". . + @ # $ $ $ $ $ $ $ % $ $ $ $ $ % $ $ $ $ $ $ % $ $ $ $ $ % $ $ $ $ $ $ $ $ $ % $ $ & * = - ; > , , ' ) ! ! ~ { ] ^ / ( _ : < [ } | | 1 2 3 3 4 4 4 4 4 4 4 5 6 4 4 4 5 6 7 8 9 4 5 6 7 8 9 6 7 8 9 ",
"0 a b % $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ c d d d d $ $ $ $ $ c d e f g h i i i i j k l m n o p q r s t u v w x y z 4 A B C D 9 9 E 9 E F G H I F J K L L L L J K L L L L L L L L ",
"@ % M N O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O P Q R S T U V W X Y Z `  ...+.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.b.b.b.b.b.",
"c.$ d.O e.f.g.g.g.h.g.g.g.g.g.h.h.g.g.g.g.g.h.h.g.g.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +.+++@+#+$+@+$+%+&+*+=+$+-+;+>+,+'+)+!+;+>+,+~+,+>+,+~+,+",
"$ {+N N f.f.f.f.h.h.h.g.f.f.h.h.h.h.g.f.f.h.h.h.h.]+^+/+(+h._+:+<+[+}+|+1+2+3+4+5+6+7+8+9+0+a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+A+B+.+C+D+E+D+F+G+H+C+I+F+G+J+K+L+H+F+G+J+K+L+H+J+H+J+H+",
"{+{+N N M+M+h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.N+N+h.h.(+O+P+P+Q+R+S+T+U+V+W+X+Y+Z+`+ @.@+@@@#@$@%@&@*@=@-@;@>@,@'@)@!@~@{@]@^@/@(@_@:@<@[@[@y+}@|@1@A+1@2@3@ +2@4@2@5@C+D+6@D+7@5@C+D+6@I+C+D+6@I+",
"{+{+8@N M+M+h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.9@9@0@N+a@b@c@d@e@f@g@h@i@j@k@l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@A@B@q+r+C@D@E@F@G@H@_@I@J@K@<@L@M@N@O@P@Q@R@S@T@A+A+U@V@W@W@A+2@U@V@W@W@U@V@W@W@",
"{+{+8@N f.M+h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.(+(+(+9@9@X@Y@Z@e@`@ #.#+#@###$#%#&#*#=#-#;#>#,#'#)#!#~#{#]#z@^#/#(#p+_#r+:#s+t+<#[#}#|#|#1#_@|#_@_@2#L@3#4#y+y+5#z+z+z+5#z+z+z+z+A+A+A+A+A+",
"{+{+8@8@f.f.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.(+6#7#8#9#0#a#b#c#d#e#f#g#h#i#j#k#l#m#n#o#&@p#q#r#s#t#u#v#w#x#x#y#y#z#A#B#C#D#E#E#F#G#H#F#H#H#u+v+I#J#K#L#J@J@M#N#O#P#M#M#M#N#M#Q#Q#R#",
"$ {+8@e.f.f.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.S#l.7#T#U#V#W#X#Y#Z#`# $f#g###.$+$@$#$$$$@%$&$*$=$-$;$>$,$'$)$!$~$~${$]$^$/$($($_$_$:$<$_$<$[$}$|$|$1$2$2$3$}#4$5$6$7$8$8$9$8$8$8$0$8$",
"$ {+a$e.f.f.h.h.h.h.h.h.h.h.h.b$h.c$c$c$c$c$d$c$c$c$c$c$c$c$c$c$c$e$e$7#f$g$h$i$X#j$k$l$m$n$o$p$q$r$l@s$t$u$v$w$x$y$z$A$B$C$D$E$F$G$G$H$I$J$J$K$K$J$L$L$L$L$L$M$N$O$P$Q$R$S$T$U$1$V$T$W$X$Y$1$V$Y$Z$`$ %",
"$ $ a$a$f.f.b$b$b$b$b$b$b$b$b$b$b$b$b$b$b$b$b$b$.%b$b$b$.%d$+%+%@%h.e$l.#%$%h$%%&%*%=%-%;%>%,%'%)%!% @ @~%{%]%^%/%(%w$_%:%<%[%}%|%D$1%2%3%4%5%4%4%6%5%5%4%4%4%5%7%5%8%9%L$0%a%a%a%P$b%P$P$z#z#z#P$c%c%c%",
"$ $ 8@e.f.f.d%b$b$b$b$b$d%b$b$b$b$b$b$e%f%b$b$b$b$b$g%h%b$.%i%i%j%k%l%m%X@n%h$o%&%p%q%`#r%s%t%u%v%w%x%y% @z%A%B%C%D%E%F%G%:%H%I%[%J%}%K%|%D$K%D$D$L%M%M%M%M%M%D$N%O%i+P%j+Q%R%S%T%0%U%V%W%W%W%W%X%X%X%X%",
"$ $ 8@8@f.f.d%d%b$b$b$b$d%d%b$b$b$h%Y%Z%Z%h%f%f%h%Y%`%`% &h%h%.&+&@&#&$&X@%&&&*&=&-&j$Z#+#;&>&,&'&)&)&!&~&{&]&^&/&(&^%_&(%:&<&[&}&|&1&A$A$2&3&4&4&5&B$6&7&B$7&8&9&6&7&0&a&a&i+i+i+b&a&a&j+U%c&U%j+U%c&U%",
"$ $ 8@8@d&e&d%d%d%d%d%d%d%d%d%d%d%`%d%d%d%d%`%`%`%d%d%d%d%`%`%f&g&h&j%i&j&k&l&m&=&X#Y#n&o&p&q&r&>&s&t&t&u&v&w&x&y&{&z&A&B&C&D&(%(%F%F%E&F&}&}&|&G&|&H&1&I%I&A$1&}&z$z$J&K&L&M&N&O&0&P&Q&0&a&R&a&a&a&R&a&",
"{+$ 8@8@e&e&d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%`%f&S&T&U&V&W&Y@X&Y&Z&`& *.*+*@*#*@*r&$*#*r&%*&***=*-*;*y&z%A%z&A&A&>*B&,*,*'*)*!*!*~*{*F&}&{*}&{*]*G%G%y$^*/*J&(*2&_*:*<*=$[*}*<*=$<*|*1*",
"{+{+8@2*e&e&d%d%d%d%d%d%d%d%d%e&3*4*4*4*4*4*5*4*4*4*4*4*4*4*4*4*`%f&6*6*7*8*9*0*a*b*c*d*e*f*g*h*i*j*+*k*h*l*m*n*m*o*p*q*r*s*t*u*v*w*x*y*y*z*A*B*C*D*E*F*G*E*G*F*H*G*F*~*]*{*I*x$J*K*L*G%K*M*o#o#I&N*O*O*",
"{+{+8@2*e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&P*e&e&e&e&e&e&P*P*e&e&e&P*P*5*Q*R*S*T*U*V*W*X*Y*Z*`*d* =.=+=@=#=$=%=g@&=*===-=i*;=l*>=,=q*'=s*)=k@!=x*~={=]=^=/=(=_=:=(=<=<=]=[=}=|=]=]=1=2=3=|=4=5=2=2=2=3=6=6=6=",
"{+{+7=e.e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&e&P*P*8=9=0=a=b=U*c=d=e=f=e@#=g=h=i=i=j=k=k=l=%===m=n=o=p=q=,=r=s=t=u=v=v*w=x=x=y=z=z=A=z=A=B=C=B=D=C=B=x=B=B=B=B=B=B=B=B=B=B=B=B=B=B=",
"{+{+7=7=e&e&e&e&E=E=e&e&e&e&E=E=E=e&e&e&e&E=E=E=e&e&e&e&E=E=e&e&e&e&E=E=E=F=d%G=G=H=I=J=K=L=M=R+}+N=O=P=Q=j=i=h=R=e@@=S=-=T=h@l*U=V=W=X=Y=Z=`= - - -.-+-@- -#-$-%-$-&-*-$-=-%-----C=$-%---------B=B=B=B=",
"{+{+7=7=;-;-E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=>-,-'-)-!-6*~-{-{-]-^-/-/-(-_-:-N=<-[-}-|-1-2-3- =4-5-6-7-8-9-0-0-a-b-c-d-e-f-g-h-h-i-j-k-h-h-i-j-l-m-n-o-i-j-l-m-n-j-l-p-n-",
"{+{+7=7=;-;-E=E=E=E=E=E=E=E=q-r-s-t-t-u-u-v-v-v-u-w-x-u-u-u-u-u-u-u-u-v-v-u-u-u-u-u-v-v-u-u-u-u-v-v-u-y-z-A-B-C-D-E-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-U-V-W-V-e-X-Y-Z-`- ;.;Y-N N +;@;.;Y-N N N N N N N ",
"#;#;d&d&$;$;%;%;%;%;%;%;%;%;&;*;=;-;-;-;;;>;,;>;>;>;;;>;>;>;>;>;>;>;>;>;';);>;>;>;>;>;';>;>;>;>;>;';);!;~;{;];^;/;(;_;_;:;<;[;};};|;1;2;3;4;5;6;7;8;9;9;0;a;0;0;b;h.a;0;0;b;h.c;h.d;0;b;h.c;h.d;h.c;h.d;",
"#;#;;-;-$;$;e;e;e;e;e;e;e;e;e;e;e;f;f;f;f;e;e;e;f;f;f;f;f;f;f;f;f;f;f;f;g;%;f;f;f;f;f;g;f;f;f;f;f;g;%;h;i;j;k;l;m;n;o;p;q;r;r;s;t;u;v;w;x;y;z;A;B;C;6;D;E;F;G;G;H;I;F;G;G;H;I;J;J;K;G;H;I;J;J;K;I;J;J;K;",
"#;#;;-;-$;$;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;L;e;e;e;e;e;e;e;e;e;e;e;e;L;M;N;O;P;Q;i;i;k;R;S;T;U;q;q;V;W;X;{;Y;Z;`; >.>+>@>#>+>$>6;#>#>+>%>&>G;G;G;G;G;&>G;G;G;G;G;G;G;G;G;",
"#;#;d.;-$;$;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;*>e;e;e;e;e;e;e;e;e;e;e;e;*>=>->;>>>,>'>'>)>!>~>{>]>^>^>V;V;/>(>_>:><>[>}>|>1>2>3>2>4>5>6>7>8>9>0>G;G;G;G;9>0>G;G;G;G;G;G;G;G;",
"#;#;d.d.a>a>e;e;e;e;e;e;e;e;e;e;b>b>c>c>c>c>c>b>e;e;e;e;e;e;e;e;e;e;e;e;e;e;d>e>f>g>h>i>j>k>l>l>m>m>n>n>o>o>p>q>r>r>s>t>u>v>v>u>w>';x>y>z>t;A>B>C>D>E>E>F>G>F>H>H>I>F>Y;J>w;K>L>K>M>J>w;K>L>K>M>K>L>K>M>",
"#;#;d.d.a>a>N>e;N>O>O>O>N>e;N>O>O>P>Q>R>S>R>Q>O>O>O>N>e;N>O>O>O>N>e;N>N>O>T>e;e;e;U>U>U>U>f;V>W>o>o>o>o>X>X>Y>Y>n>n>Z>Z>`> ,.,t>t>u>u>w>+,@,#,$,%,A>&,*,=,B>[>-,w;<>C>[>-,w;w;w;w;w;-,w;w;w;w;w;w;w;w;w;",
"#;;,;-;-a>a>N>N>N>O>O>O>N>N>N>O>O>O>O>N>N>N>O>O>O>O>N>N>N>O>O>O>N>N>N>N>O>>,,,,,,,',g>),!,~,{,{,*>U>e;f;],o>%;o>^,^,/,/,l>q>(,_,t>u>:,<,v>[,},|,1,2,%,%,3,4,5,6,7,8,9,5,6,0,G>G>Y;G>6,0,G>G>Y;G>G>G>Y;G>",
";,;,;-;-O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>P>a,b,',',c,c,f>),e>d,e,{,{,U>U>f,f,U>U>g,g,*>g;h,^,^,`>`>q>i,t>j,k,k,l,w>m,n,o,p,q,r,s,t,p,u,v,w,x,y,z,u,v,w,x,y,z,w,x,y,z,",
";,;,b b O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>A,A,A,B,C,D,E,F,c,',g>G,!,H,~,e,{,I,J,J,K,K,U>f,f,J,L,M,N,L;O,i,P,.,l,Q,k,k,k,k,k,k,R,v,k,k,k,R,v,S,T,U,k,R,v,S,T,U,v,S,T,U,",
";,;,b V,W,W,X,X,O>X,X,X,X,X,O>X,X,X,X,X,X,O>X,X,X,X,X,X,O>X,X,X,X,X,O>X,X,O>O>O>O>B,B,B,B,Y,O>O>Z,`,T>T> '',g>.'+'e,{,{,e,+'+'e,e,{,J,K,e;@'N,O,#'$'%'%'j,%'j,&'k,k,%'j,&'k,k,k,k,k,&'k,k,k,k,k,k,k,k,k,",
";,;,b V,W,W,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,*'O>O>O>O>O>O>O>O>B,B,A,A,B,C,='-'`,;'>'>',''')'!'!'e>e>~'~'~,~,{'{,*>*>e;]']']']']']'^'/']']']'^'/':,(':,]'^'/':,(':,/':,(':,",
";,;,V,V,W,W,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_':'<'['}'|'|'O>O>O>O>O>O>O>Y,Y,1'1'B,B,2'2'C,3'-'>'c,)')'!'),4'{'e;]'e;*>*>e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;e;",
";,;,5'5'W,W,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,W,6'6'6'7'8'9'0'a'b'c'd'd'}'}'O>O>O>O>O>O>O>O>Y,1'1'['['e'e'f'g'h'i'j'k'G,),!,l'j'm'n'b>b>),m'b>e;e;e;e;e;b>e;e;e;e;e;e;e;e;e;",
";,;,b b o'o'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'W,q'q'q'r's't'u'v'w'x'y'z'A'B'C'D'2'2'B,B,O>O>O>O>O>O>O>O>O>O>O>Y,Y,C,C,='='='E'F'3'3'3'G'Z,='F'F'G'H'I'J'F'F'G'H'I'J'G'H'I'J'",
";,;,b b K'K'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'W,W,W,W,W,L'L'q'r'M'N'O'P'u'N's'Q'R'S'A'T'U'C'V'9'0'W'D'}'X'|'O>O>B,B,O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>",
";,;,b b K'K'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'p'Y'Y'Y'Z'`' ).)+)+)+)W,W,W,W,L'L'q'q'r'r's'M'N'P'@)A'#)$)%)&)*)=)B,|'|'O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>O>",
"{+;,$ -);)K'p'p'o'p'p'p'p'p'o'p'p'p'p'p'p'o'p'p'p'p'p'p'o'p'p'p'p'p'o'o'p'p'p'p'p'p'p'p'p'p'>)>)Y'Y'>)Z',)')))!)~)+)W,W,W,W,W,W,W,W,W,W,W,L'L'{)s't'])^)/)])/)/)O>()])/)/)O>()O>_)O>/)O>()O>_)O>()O>_)O>",
":);,;,;)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)[)M M M M M M M M M M M M M M M M M M })})|)|)})M M 1)2)3)4)5)6)6)6)7)7)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)",
"9)#;;,;,$ -)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)0)a)a)a)b)c)d)e)f)g)h)i)i)j)j)M M M M M M M M M M M })})})})M k)k)M M k)l)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)",
"+ 9)m)n)$ #;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;#;o)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)p)",
"+ + 9)a m)q)r)s)r)s)r)s)r)s)r)r)s)r)s)r)s)r)r)s)r)s)r)s)r)s)r)s)r)s)r)s)r)t)u)v)w)x)x)w)y)z)A)A)B)B)B)B)w)w)C)C)w)w)B)B)B)B)B)w)w)w)w)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)D)B)B)B)B)B)D)B)B)B)D)B)",
". + + 9)9)9)q)E)q)E)q)E)q)E)q)q)E)q)E)q)E)q)q)E)q)E)q)E)q)E)q)E)q)E)q)E)q)F)G)H)E)I)J)K)H)L)L)L)L)L)L)L)H)H)M)M)H)H)L)L)G)L)L)H)H)H)H)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)N)L)L)L)L)L)N)L)L)L)N)L)",
". . 0 . + O)P)O)P)O)P)O)P)O)P)P)O)P)O)P)O)P)P)O)P)O)P)O)P)O)P)O)P)O)P)O)P)O)Q)R)S)T)U)V)W)X)W)W)V)V)V)V)V)V)V)V)Y)Y)Z)Z)Y)Z)Z)Y)Y)V)V)V)V)V)V)V)V)V)V)V)V)V)V)V)V)V)V)V)V)V)V)V)Y)V)V)V)V)V)Y)V)V)V)Y)V)",
". . . 0 0 0 . 0 0 0 + 0 + 0 + 0 + 0 + 0 + 0 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 0 `) !+ + + .! !`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)`)+!`)`)`)`)`)+!`)`)`)+!`)"};


static char * listviewhighcornerright_xpm[] = {
"100 46 780 2",
"  	c None",
". 	c #6A779D",
"+ 	c #6C789C",
"@ 	c #6C789D",
"# 	c #6B789D",
"$ 	c #6A779E",
"% 	c #66759E",
"& 	c #64749E",
"* 	c #63749E",
"= 	c #61739D",
"- 	c #576D9B",
"; 	c #556C9C",
"> 	c #4D679D",
", 	c #4A649D",
"' 	c #49629D",
") 	c #465E9C",
"! 	c #40579C",
"~ 	c #3B5394",
"{ 	c #2C4E97",
"] 	c #314993",
"^ 	c #2B4595",
"/ 	c #1B4296",
"( 	c #253D93",
"_ 	c #19418F",
": 	c #0F3C96",
"< 	c #42599E",
"[ 	c #758DC3",
"} 	c #E8EAE7",
"| 	c #EEF0ED",
"1 	c #FBFBFC",
"2 	c #6F7D9B",
"3 	c #6F7D9A",
"4 	c #6E7B9C",
"5 	c #67759E",
"6 	c #63739E",
"7 	c #62739D",
"8 	c #596F9C",
"9 	c #4A639D",
"0 	c #47609C",
"a 	c #445B9F",
"b 	c #3E5697",
"c 	c #2E509A",
"d 	c #2D509A",
"e 	c #2D4F99",
"f 	c #2D4F98",
"g 	c #28418A",
"h 	c #3E51A3",
"i 	c #D0D3DC",
"j 	c #A1B6EF",
"k 	c #A2B6F0",
"l 	c #A1B6F0",
"m 	c #A3B6F0",
"n 	c #A0B6EF",
"o 	c #9DB6EE",
"p 	c #9CB5EF",
"q 	c #9CB2F0",
"r 	c #9FB5EE",
"s 	c #9CB4EB",
"t 	c #9AB3EC",
"u 	c #9AB0EC",
"v 	c #9DB3EB",
"w 	c #9BB4EC",
"x 	c #9BB4EE",
"y 	c #9BB1EF",
"z 	c #9BB0F0",
"A 	c #90ACF0",
"B 	c #93ABEE",
"C 	c #91A8EB",
"D 	c #8BA3E8",
"E 	c #88A1E7",
"F 	c #809DE9",
"G 	c #7A99E8",
"H 	c #7491E5",
"I 	c #698AE4",
"J 	c #6184E3",
"K 	c #507EDC",
"L 	c #4E7CDB",
"M 	c #4F7DDC",
"N 	c #5479DA",
"O 	c #567BDC",
"P 	c #577CDD",
"Q 	c #5074DA",
"R 	c #5174DB",
"S 	c #5175DC",
"T 	c #5276DD",
"U 	c #4D71DE",
"V 	c #4C72D8",
"W 	c #3A6CE0",
"X 	c #2B49A6",
"Y 	c #E0E2DF",
"Z 	c #93AAE9",
"` 	c #94A9E8",
" .	c #94AAE9",
"..	c #93A9E9",
"+.	c #92AAE9",
"@.	c #8DA9E8",
"#.	c #8CA7E9",
"$.	c #92ABE9",
"%.	c #8EAAE9",
"&.	c #8EA9E9",
"*.	c #8FAAE9",
"=.	c #8CA8E9",
"-.	c #8CA2E7",
";.	c #86A1E6",
">.	c #839EE9",
",.	c #7F9CE9",
"'.	c #7A97E8",
").	c #7693E7",
"!.	c #6E8EE8",
"~.	c #678AE9",
"{.	c #5D84E3",
"].	c #577CDF",
"^.	c #4E77DF",
"/.	c #4A70DB",
"(.	c #4870DB",
"_.	c #4870DC",
":.	c #4770E3",
"<.	c #496FDC",
"[.	c #486EDB",
"}.	c #466FE4",
"|.	c #466EE3",
"1.	c #4167D9",
"2.	c #4066D8",
"3.	c #3F66D8",
"4.	c #3D64D7",
"5.	c #3960DA",
"6.	c #476DD9",
"7.	c #446EE5",
"8.	c #305EC8",
"9.	c #8EAAE8",
"0.	c #8FAAE8",
"a.	c #91AAE9",
"b.	c #8FA9E8",
"c.	c #8BA8E8",
"d.	c #8AA7E9",
"e.	c #8BA5EA",
"f.	c #8AA7E8",
"g.	c #87A2E6",
"h.	c #859FE8",
"i.	c #7F9DE8",
"j.	c #7C9AE8",
"k.	c #7B95E7",
"l.	c #7090E8",
"m.	c #6B8BE9",
"n.	c #6386E6",
"o.	c #5881E1",
"p.	c #5479DE",
"q.	c #4D74DE",
"r.	c #476EDB",
"s.	c #446EE1",
"t.	c #446EE0",
"u.	c #446EDF",
"v.	c #446DE0",
"w.	c #426ADF",
"x.	c #3C64DA",
"y.	c #4360CC",
"z.	c #D3D5D2",
"A.	c #E6E3E8",
"B.	c #8DA2E7",
"C.	c #8CA6EA",
"D.	c #8DA3E9",
"E.	c #88A2E7",
"F.	c #87A1E7",
"G.	c #8AA1E7",
"H.	c #849EE9",
"I.	c #7D9AE9",
"J.	c #7B98E8",
"K.	c #7796E5",
"L.	c #7191E7",
"M.	c #688CE9",
"N.	c #6687E5",
"O.	c #5C83E1",
"P.	c #557BDE",
"Q.	c #4F76DE",
"R.	c #4C72DE",
"S.	c #456EDF",
"T.	c #426AD9",
"U.	c #4269D9",
"V.	c #4269D8",
"W.	c #3D64D9",
"X.	c #3A61DA",
"Y.	c #345ED6",
"Z.	c #335ECF",
"`.	c #C6C3C8",
" +	c #86A1E7",
".+	c #87A2E7",
"++	c #87A0E7",
"@+	c #859EE8",
"#+	c #849DE9",
"$+	c #7E9BE9",
"%+	c #7A99E9",
"&+	c #7A95E5",
"*+	c #7593E7",
"=+	c #6F8EE9",
"-+	c #668AE5",
";+	c #6386E0",
">+	c #5B82DF",
",+	c #5379DE",
"'+	c #5075DE",
")+	c #4B6FDC",
"!+	c #446AD7",
"~+	c #4269D6",
"{+	c #4269D5",
"]+	c #3E65D7",
"^+	c #C9CAC9",
"/+	c #869EE9",
"(+	c #859FE9",
"_+	c #849FE9",
":+	c #829DE8",
"<+	c #819DE8",
"[+	c #7B9AE9",
"}+	c #7A96E6",
"|+	c #7290E8",
"1+	c #698CE6",
"2+	c #6689E0",
"3+	c #5D84E0",
"4+	c #587FDF",
"5+	c #5377DD",
"6+	c #4B74DE",
"7+	c #496BD8",
"8+	c #7C9BE9",
"9+	c #7E9CE9",
"0+	c #7D9AEA",
"a+	c #7D9BEA",
"b+	c #7D98E8",
"c+	c #7C98E8",
"d+	c #7796E4",
"e+	c #7592E6",
"f+	c #7390E1",
"g+	c #698DE0",
"h+	c #6588DE",
"i+	c #5E84E0",
"j+	c #5880DF",
"k+	c #5479DC",
"l+	c #4F75DE",
"m+	c #4A6FDB",
"n+	c #436AD7",
"o+	c #3F65D7",
"p+	c #BAC3BE",
"q+	c #7B9AE8",
"r+	c #7B9AEA",
"s+	c #7A9AEA",
"t+	c #7B99E9",
"u+	c #7D97E7",
"v+	c #7D95E6",
"w+	c #7D95E5",
"x+	c #7C95E6",
"y+	c #7493E3",
"z+	c #7290DF",
"A+	c #6C8DDE",
"B+	c #6B89E1",
"C+	c #6486DF",
"D+	c #5D81DF",
"E+	c #567DDE",
"F+	c #4F73DE",
"G+	c #496EDA",
"H+	c #355ED6",
"I+	c #345ED5",
"J+	c #7E95E5",
"K+	c #7C97E8",
"L+	c #7C97E7",
"M+	c #7B94E6",
"N+	c #7A95E4",
"O+	c #7695E5",
"P+	c #7694E4",
"Q+	c #7994E6",
"R+	c #7995E4",
"S+	c #7594E4",
"T+	c #7391E2",
"U+	c #6E8EDE",
"V+	c #6B8ADE",
"W+	c #6688DF",
"X+	c #5F84E0",
"Y+	c #5980E0",
"Z+	c #4D72DD",
"`+	c #456BD7",
" @	c #4168D6",
".@	c #3C64D7",
"+@	c #335ED0",
"@@	c #4659C7",
"#@	c #7292E1",
"$@	c #7392E1",
"%@	c #7492E1",
"&@	c #718FDF",
"*@	c #6F8EDE",
"=@	c #6D8BDE",
"-@	c #6B88DF",
";@	c #597FDF",
">@	c #557ADD",
",@	c #5176DC",
"'@	c #4D74DD",
")@	c #496DDA",
"!@	c #3860D8",
"~@	c #7391E0",
"{@	c #7290DE",
"]@	c #6D8EDD",
"^@	c #6D8DDD",
"/@	c #7190E0",
"(@	c #6C8DDD",
"_@	c #6B89DF",
":@	c #6487E0",
"<@	c #6085DF",
"[@	c #5F81DE",
"}@	c #567EDE",
"|@	c #4F74D9",
"1@	c #466BD7",
"2@	c #4067D5",
"3@	c #3C63D7",
"4@	c #335ED3",
"5@	c #335ED1",
"6@	c #718EDD",
"7@	c #728EDD",
"8@	c #748EDD",
"9@	c #708EDD",
"0@	c #6F8DDD",
"a@	c #6E8DDD",
"b@	c #6C8ADE",
"c@	c #6C89DF",
"d@	c #6988DF",
"e@	c #6387DF",
"f@	c #6282DE",
"g@	c #5681E0",
"h@	c #577BDD",
"i@	c #5277DB",
"j@	c #4D73D8",
"k@	c #4A70D8",
"l@	c #436AD5",
"m@	c #3F66D6",
"n@	c #3C63D8",
"o@	c #3960D8",
"p@	c #3860D7",
"q@	c #335ED2",
"r@	c #345ED4",
"s@	c #6C88DF",
"t@	c #6D88DF",
"u@	c #6B89DE",
"v@	c #6888DF",
"w@	c #6587E0",
"x@	c #6989DF",
"y@	c #6687E0",
"z@	c #6287E0",
"A@	c #6281DD",
"B@	c #5881E0",
"C@	c #557ADB",
"D@	c #5176D9",
"E@	c #4E75D7",
"F@	c #4A6FD8",
"G@	c #476BD6",
"H@	c #4067D6",
"I@	c #3C62D7",
"J@	c #3C60D4",
"K@	c #365ED1",
"L@	c #345ED3",
"M@	c #6786DF",
"N@	c #5F85E0",
"O@	c #5F86E0",
"P@	c #6186DF",
"Q@	c #6286E0",
"R@	c #6284DF",
"S@	c #6384DF",
"T@	c #5B7FDE",
"U@	c #577DDC",
"V@	c #557BDA",
"W@	c #5278D8",
"X@	c #4E76D6",
"Y@	c #4C72D7",
"Z@	c #486DD8",
"`@	c #4469D6",
" #	c #3F62D2",
".#	c #3C60CF",
"+#	c #345ECF",
"@#	c #6086DF",
"##	c #6085E0",
"$#	c #6285DF",
"%#	c #6383DD",
"&#	c #6481DC",
"*#	c #6380DD",
"=#	c #6183DE",
"-#	c #6083DD",
";#	c #6081DC",
">#	c #6080DD",
",#	c #6083DE",
"'#	c #6181DC",
")#	c #6280DD",
"!#	c #577EDB",
"~#	c #557CD7",
"{#	c #4F76D6",
"]#	c #4E74D7",
"^#	c #466CD7",
"/#	c #3B64D6",
"(#	c #4261CD",
"_#	c #375FCE",
":#	c #5A7FD8",
"<#	c #6281DA",
"[#	c #5F81D8",
"}#	c #5C80D8",
"|#	c #557DD7",
"1#	c #577ED8",
"2#	c #567ED7",
"3#	c #587DD8",
"4#	c #577DD8",
"5#	c #587ED8",
"6#	c #567DD8",
"7#	c #5379D9",
"8#	c #5177D7",
"9#	c #4D74D5",
"0#	c #486ED9",
"a#	c #4068D4",
"b#	c #3D65D2",
"c#	c #4361CC",
"d#	c #345ECE",
"e#	c #325DCF",
"f#	c #2C5AD1",
"g#	c #3959C5",
"h#	c #547BD8",
"i#	c #567DD7",
"j#	c #557BD8",
"k#	c #5279D9",
"l#	c #5278D9",
"m#	c #4D74D6",
"n#	c #4B71D8",
"o#	c #496CD8",
"p#	c #4669D7",
"q#	c #3D66D3",
"r#	c #3F62CF",
"s#	c #4260CC",
"t#	c #5379D8",
"u#	c #4E75D4",
"v#	c #4C73D7",
"w#	c #476CD7",
"x#	c #4869D0",
"y#	c #4067D2",
"z#	c #3D64D1",
"A#	c #4261CC",
"B#	c #395FCE",
"C#	c #4F75D3",
"D#	c #5074D2",
"E#	c #5174D1",
"F#	c #5175D1",
"G#	c #4F74D3",
"H#	c #4C73D5",
"I#	c #4C73D4",
"J#	c #4A72D1",
"K#	c #4B70CF",
"L#	c #506CCC",
"M#	c #4D6BCE",
"N#	c #4167D0",
"O#	c #3D65D1",
"P#	c #3F63CF",
"Q#	c #3B5FCD",
"R#	c #3159CD",
"S#	c #4971D0",
"T#	c #4870CF",
"U#	c #4C6FCF",
"V#	c #4E6CCE",
"W#	c #4E6BCE",
"X#	c #4769CF",
"Y#	c #3D66D0",
"Z#	c #3C65D1",
"`#	c #4062CE",
" $	c #3D5FCD",
".$	c #365FCF",
"+$	c #325DCD",
"@$	c #2D5AD0",
"#$	c #3859C5",
"$$	c #355FCF",
"%$	c #355ECF",
"&$	c #335ECE",
"*$	c #305CCD",
"=$	c #2B5ACE",
"-$	c #3056C9",
";$	c #2553C6",
">$	c #2153C8",
",$	c #1F4FC7",
"'$	c #274CC5",
")$	c #214AC7",
"!$	c #1C48C8",
"~$	c #1244C9",
"{$	c #1043C9",
"]$	c #1144C9",
"^$	c #2A45BE",
"/$	c #2744B5",
"($	c #1D49C0",
"_$	c #2B58DE",
":$	c #002D94",
"<$	c #2B59CA",
"[$	c #2A59CA",
"}$	c #2E57C8",
"|$	c #3255C6",
"1$	c #3355C5",
"2$	c #1C52C8",
"3$	c #1D50C7",
"4$	c #234FC6",
"5$	c #264CC5",
"6$	c #1D48C7",
"7$	c #1245C8",
"8$	c #1F44C2",
"9$	c #2945BE",
"0$	c #2A45BD",
"a$	c #2040BF",
"b$	c #3156C7",
"c$	c #3056C7",
"d$	c #3354C5",
"e$	c #3355C6",
"f$	c #3255C5",
"g$	c #3254C5",
"h$	c #1952C7",
"i$	c #1951C8",
"j$	c #2050C7",
"k$	c #274CC4",
"l$	c #244CC6",
"m$	c #1F49C7",
"n$	c #1E47C5",
"o$	c #2045C3",
"p$	c #1C44BF",
"q$	c #2045BE",
"r$	c #2040B8",
"s$	c #3254C6",
"t$	c #3055C6",
"u$	c #2A54C6",
"v$	c #2353C7",
"w$	c #3054C5",
"x$	c #2F55C5",
"y$	c #2A54C5",
"z$	c #2553C5",
"A$	c #2F54C5",
"B$	c #3155C6",
"C$	c #2A54C7",
"D$	c #1A52C8",
"E$	c #204FC2",
"F$	c #264DC6",
"G$	c #234BC5",
"H$	c #1D48C1",
"I$	c #1E48BF",
"J$	c #2646BE",
"K$	c #2B45BD",
"L$	c #1E43BE",
"M$	c #2643BF",
"N$	c #2243BF",
"O$	c #3049BC",
"P$	c #1E50BE",
"Q$	c #1D50C0",
"R$	c #1D50BF",
"S$	c #1852C1",
"T$	c #1E51C0",
"U$	c #214FBF",
"V$	c #2050C0",
"W$	c #244EBF",
"X$	c #2151C0",
"Y$	c #234FBF",
"Z$	c #2350C0",
"`$	c #2351C0",
" %	c #244FBF",
".%	c #2250C0",
"+%	c #2051C0",
"@%	c #1E50C0",
"#%	c #244DBE",
"$%	c #274DBF",
"%%	c #244CBF",
"&%	c #1C48C0",
"*%	c #2247BF",
"=%	c #2C44BD",
"-%	c #1C44BE",
";%	c #1444BF",
">%	c #1841BF",
",%	c #1F40BF",
"'%	c #254DBE",
")%	c #224FBE",
"!%	c #224FBF",
"~%	c #234EBF",
"{%	c #254CBD",
"]%	c #244DBD",
"^%	c #244CBD",
"/%	c #264DBE",
"(%	c #264DBD",
"_%	c #214BC0",
":%	c #1D48C0",
"<%	c #2347BF",
"[%	c #2B44BD",
"}%	c #2444BE",
"|%	c #0F42BF",
"1%	c #0641BF",
"2%	c #0F41BF",
"3%	c #1741BE",
"4%	c #1F40BD",
"5%	c #234BBF",
"6%	c #234CBE",
"7%	c #214BBE",
"8%	c #244CBE",
"9%	c #214ABE",
"0%	c #214ABF",
"a%	c #1F48C0",
"b%	c #2746BE",
"c%	c #1F43BE",
"d%	c #0941BE",
"e%	c #0342BA",
"f%	c #0242BC",
"g%	c #1241B8",
"h%	c #1F40B7",
"i%	c #2F41AC",
"j%	c #2644AE",
"k%	c #2D49B4",
"l%	c #2649B6",
"m%	c #2949B7",
"n%	c #2849B5",
"o%	c #2149B8",
"p%	c #1E49B9",
"q%	c #1F48B8",
"r%	c #1F49B9",
"s%	c #2545B6",
"t%	c #2744B7",
"u%	c #2844B7",
"v%	c #2043B8",
"w%	c #1241B7",
"x%	c #1340B8",
"y%	c #0D41B8",
"z%	c #1941B8",
"A%	c #1F40B8",
"B%	c #203FB8",
"C%	c #2549B5",
"D%	c #2648B6",
"E%	c #2547B7",
"F%	c #2248B7",
"G%	c #2048B7",
"H%	c #2346B6",
"I%	c #2146B6",
"J%	c #2247B7",
"K%	c #2148B7",
"L%	c #2743B4",
"M%	c #2643B5",
"N%	c #2542B6",
"O%	c #1D42B7",
"P%	c #0E42B8",
"Q%	c #0C41B8",
"R%	c #1341B8",
"S%	c #1740B8",
"T%	c #1C41B8",
"U%	c #1F40B1",
"V%	c #2644B5",
"W%	c #2544B5",
"X%	c #2544B4",
"Y%	c #2444B5",
"Z%	c #2444B4",
"`%	c #2744B4",
" &	c #2241B7",
".&	c #1D41B8",
"+&	c #0B42B8",
"@&	c #0942B8",
"#&	c #0C42B8",
"$&	c #0F41B8",
"%&	c #1641B8",
"&&	c #2442B5",
"*&	c #2543B3",
"=&	c #2342B2",
"-&	c #2341B4",
";&	c #2141B3",
">&	c #2141B5",
",&	c #2140B5",
"'&	c #2040B5",
")&	c #1C40B7",
"!&	c #1B41B3",
"~&	c #0142B6",
"{&	c #0E41B7",
"]&	c #1141B7",
"^&	c #1440B2",
"/&	c #113FB0",
"(&	c #1440B0",
"_&	c #213EAF",
":&	c #233DAE",
"<&	c #223EAF",
"[&	c #1E40B1",
"}&	c #173EAD",
"|&	c #1440AF",
"1&	c #0D40AF",
"2&	c #0941B0",
"3&	c #0D3FAE",
"4&	c #1B3CAC",
"5&	c #233CAD",
"6&	c #203FB0",
"7&	c #273BAD",
"8&	c #1D40B0",
"9&	c #2040B1",
"0&	c #1E40B0",
"a&	c #1C40B0",
"b&	c #1B3DAC",
"c&	c #143DAC",
"d&	c #193DAD",
"e&	c #1B3DAD",
"f&	c #173DAD",
"g&	c #153DAC",
"h&	c #1C3CAC",
"i&	c #243CAD",
"j&	c #213FB0",
"k&	c #263BAA",
"l&	c #253CAE",
"m&	c #273AAC",
"n&	c #273AAD",
"o&	c #253BAD",
"p&	c #1D3CAC",
"q&	c #243BAD",
"r&	c #1E3CAC",
"s&	c #263BAD",
"t&	c #1A3DAC",
"u&	c #143DAB",
"v&	c #163DAC",
"w&	c #1A3CAC",
"x&	c #1F3CAD",
"y&	c #263BAB",
"z&	c #263BA6",
"A&	c #1E42A4",
"B&	c #2D40A5",
"C&	c #253BA6",
"D&	c #253CA7",
"E&	c #263AA5",
"F&	c #253BA7",
"G&	c #1E3BA6",
"H&	c #193DA6",
"I&	c #173DA5",
"J&	c #143DA6",
"K&	c #1A3DA7",
"L&	c #133DA6",
"M&	c #123DA5",
"N&	c #1A3CA7",
"O&	c #243BA6",
"P&	c #263AA7",
"Q&	c #273BA7",
"R&	c #263AA6",
"S&	c #223BA6",
"T&	c #1D3BA6",
"U&	c #173CA6",
"V&	c #133DA5",
"W&	c #1B3DA6",
"X&	c #193DA5",
"Y&	c #123DA4",
"Z&	c #163CA5",
"`&	c #213CA6",
" *	c #273BA8",
".*	c #263BA7",
"+*	c #253BA5",
"@*	c #263BA5",
"#*	c #1C3BA6",
"$*	c #1B3BA9",
"%*	c #133BA8",
"&*	c #0A3BA7",
"**	c #083AA6",
"=*	c #123CA5",
"-*	c #0839A8",
";*	c #0239A6",
">*	c #123AA8",
",*	c #1F49C8",
"'*	c #2F4DA4",
")*	c #2E4DA3",
"!*	c #384CA4",
"~*	c #3C4DA7",
"{*	c #394EA7",
"]*	c #3B4CA5",
"^*	c #3C52B1",
"/*	c #3551A8",
"(*	c #3759BE",
"_*	c #4161C7",
":*	c #0033A8",
"<*	c #596FA9",
"[*	c #2F4DA3",
"}*	c #2D4BA5",
"|*	c #2E4CA4",
"1*	c #2C4AA5",
"2*	c #2D4BA4",
"3*	c #354DA4",
"4*	c #3A4BA4",
"5*	c #394DA6",
"6*	c #4056AD",
"7*	c #445BBB",
"8*	c #B5B7B4",
"9*	c #1B2F85",
"0*	c #242F79",
"a*	c #B5B5B5",
"b*	c #B5B2B6",
"c*	c #C0C3C3",
"d*	c #E3E3E4",
"e*	c #EBEDEA",
". + @ + # $ % & # $ % & # $ % & # $ % & & * = - ; > , ' ) ! ~ { { { { { { { ] ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / / / ( / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / _ _ / / : / < [ } | | | 1 1 ",
"2 2 2 2 3 2 4 @ 3 2 4 @ 3 2 4 @ 3 2 4 @ # 5 6 7 8 ; > 9 0 a b c d e f { { { ] ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ( ( ( ( ( ( ( ( / / / / / / / / / / / / / / / / / _ _ _ _ _ _ _ _ _ _ _ g g _ / / : : : h i } 1 | 1 ",
"j k l m n o p q n o p q r s t u v w x y z A B C D E F G H I J K L M N O P O O Q R S T T T T T T T T T T T T T T T T T T U U U U U U U U U U U U U U U U U U U U U U U U U U U U V V V U U W X : [ Y | | ",
"Z `  . ...+.@.#...+.@.#.Z $.%.&.Z $.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.6.7.8.: h Y } 1 ",
"9.0.a.b.c.c.d.e.f.c.d.e.f.c.d.e.f.c.d.e.g.h.i.j.k.l.m.n.o.p.q.r.s.s.t.u.u.v.w.x.4.4.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.y.5.7.6.: / z.A.} ",
"-.B.C.D.-.E.g.F.G.E.g.F.G.E.g.F.G.E.g.F.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.V.U.U.W.X.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Z.y.Y.7.7.: : `.z.} ",
" +.+g.;.++F.@+#+++F.@+#+++F.@+#+++F.@+#+$+%+&+*+=+-+;+>+,+'+)+!+~+{+]+{+{+4.4.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.Y.Y.5.5.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Z.Z.Z.y.y.5.7.7.: : ^+z.Y ",
"/+(+_+#+H.H.>.:+H.H.>.:+H.H.>.:+H.H.>.<+[+}+*+|+1+2+3+4+5+6+7+{+{+4.4.4.4.4.4.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.Y.Y.Y.Y.Y.Y.Y.5.Y.Y.Y.Y.Y.Y.Y.Y.5.Y.Y.5.5.5.5.Y.Y.Y.Y.Y.Y.Z.Z.Z.Z.y.y.y.y.y.y.7.7.: : ^+i } ",
"8+9+0+0+a+0+0+b+a+0+0+b+a+0+0+b+a+0+0+c+d+e+f+g+h+i+j+k+l+m+n+o+4.4.4.4.5.5.5.5.5.5.Y.Y.5.5.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Y.Y.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.7.7.: : p+z.Y ",
"q+r+r+s+t+u+v+w+t+u+v+w+t+u+v+w+t+u+x+&+y+z+A+B+C+D+E+5+F+G+~+4.4.4.4.5.5.5.5.5.H+Y.Y.Y.Y.Y.Y.Y.Y.I+Y.Z.Y.Y.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.7.7.: : `.z.A.",
"J+v+K+L+M+N+O+P+Q+R+O+P+Q+R+O+P+Q+R+O+S+T+U+V+W+X+Y+P.T Z+`+ @4.4..@5.5.5.5.5.5.Y.Y.Y.I+I+I+I+I++@+@Z.Z.Y.Y.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.@@Z.7.7.: : p+z.Y ",
"#@$@$@%@%@$@#@&@#@#@#@&@#@#@#@&@#@#@#@*@=@-@;+i+;@>@,@'@)@ @4.X.5.5.H+Y.Y.Y.!@Y.Y.I++@+@Z.Z.+@Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.y.Z.6.6.: : `.z.A.",
"#@$@~@~@~@{@]@^@/@{@]@^@/@{@]@^@/@{@]@(@_@:@<@[@}@k+|@V 1@2@3@5.5.5.Y.Y.I+4@I+5@+@Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.y.Z.6.6.: : p+z.Y ",
"6@7@8@9@0@a@b@c@a@a@b@c@a@a@b@c@a@a@b@d@e@<@f@g@h@i@j@k@l@m@n@o@o@p@Y.I+q@q@r@+@Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.y.Z.6.6.: : `.z.A.",
"s@t@u@_@_@v@w@w@x@v@w@w@x@v@y@y@x@v@:@z@A@B@P C@D@E@F@G@H@I@J@K@5@+@+@+@r@I+L@Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.@@Z.W W : : p+z.Y ",
"M@N@O@P@C+Q@Q@R@C+;+Q@R@C+;+;+S@C+Q@Q@R@T@U@V@W@X@Y@Z@`@4. #.#+#Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.8.Z.Z.Z.Z.8.8.Z.Z.y.@@@@W W : : `.z.A.",
"@#O@O@##$#%#&#*#=#-#;#>#,#-#;#>#,#-#'#)#!#~#W@{#]#k@^#H@/#(#_#Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.8.8.Z.Z.Z.Z.Z.Z.Z.8.8.8.8.8.8.8.8.8.8.8.Z.Z.y.y.@@W W : : p+z.Y ",
":#<#[#}#|#1#2#3#4#5#1#4#4#1#1#4#4#1#1#6#7#8#9#V 0#`+a#b#c#d#e#Z.Z.Z.f#Z.Z.Z.f#f#f#f#f#f#f#f#f#f#g#g#g#g#g#8.8.8.8.8.8.8.8.8.g#g#g#g#8.g#8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.y.y.@@W W : : `.z.A.",
"h#2#i#6#|#j#7#k#|#j#7#7#|#j#7#7#|#j#7#l#8#m#n#n#o#p#q#r#s#d#e#Z.Z.Z.f#f#f#f#Z.f#f#g#g#g#g#g#g#g#g#g#g#g#g#8.8.8.g#g#8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.y.y.y.y.8.8.8.y.y.@@W W : : p+z.Y ",
"l#7#7#l#7#7#7#W@7#7#7#W@7#7#k#W@t#7#7#W@u#v#n#w#x#y#z#A#B#Z.e#f#f#Z.f#f#f#Z.Z.g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#8.8.8.g#g#g#g#8.8.g#g#g#g#g#g#8.8.g#8.8.y.8.8.y.y.8.y.y.y.y.@@W W : : `.z.A.",
"C#D#E#F#G#H#I#J#G#H#I#J#G#H#I#J#G#H#I#J#K#L#M#N#O#P#s#Q#+#f#R#f#f#f#f#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#@@@@y.y.@@@@y.y.W W : : p+z.Y ",
"S#S#S#S#S#T#S#U#S#T#S#U#S#T#S#U#S#T#S#U#V#W#X#Y#Z#`# $.$+$@$#$g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#g#@@@@@@@@@@@@@@@@@@y.y.W W : : `.z.A.",
"+$Z..$$$%$+$&$*$%$+$&$*$%$+$&$*$%$+$&$*$=$-$;$>$,$'$)$!$~${$]$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$/$/$/$/$($($_$_$:$:$p+z.Y ",
"<$<$<$<$<$[$}$|$<$[$}$|$<$[$}$|$<$[$}$|$1$2$3$4$5$)$6$7$8$9$0$a$a$a$a$a$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$/$/$/$^$^$^$/$/$/$/$/$/$/$/$/$/$/$/$/$/$($($_$_$:$:$`.z.A.",
"b$c$c$c$d$e$e$f$g$|$|$1$d$e$e$1$d$e$e$1$h$i$j$k$l$m$n$o$p$9$q$a$a$a$a$a$a$a$a$^$a$a$^$^$^$^$^$^$a$r$r$r$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$^$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$($($_$_$:$:$p+z.Y ",
"e$1$s$s$1$t$u$v$w$x$y$z$A$x$u$v$g$B$C$>$D$E$F$G$H$I$J$K$L$M$N$a$a$a$a$a$a$a$a$^$r$r$a$^$^$^$a$r$r$r$r$r$/$^$r$^$^$^$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$O$($_$_$:$:$`.z.A.",
"P$Q$R$S$T$U$V$W$X$Y$Z$W$`$ %.%W$+%U$@%#%$%%%&%($*%=%-%;%>%>%,%r$r$r$r$r$a$a$a$/$/$/$r$r$r$r$r$r$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$O$($_$_$:$:$p+z.Y ",
"'%W$)%!%~%{%'%]%~%^%'%]%~%^%'%]%~%^%/%(%_%&%:%<%[%}%|%1%2%3%4%r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$/$r$/$/$r$r$r$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$/$r$/$/$/$/$/$O$($_$_$:$:$`.z.A.",
"5%6%'%'%6%7%8%9%6%7%8%9%6%7%8%9%6%7%8%0%&%a%<%b%[%c%d%e%f%g%h%r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$/$r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$/$/$/$/$/$/$/$/$/$/$/$/$/$/$r$r$/$/$r$r$/$r$i%j%O$($_$_$:$:$p+z.Y ",
"k%l%m%n%o%o%p%q%o%o%r%q%o%o%r%q%o%o%p%q%s%t%/$u%v%w%x%y%z%A%B%r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$/$/$/$/$/$/$/$r$r$i%i%i%r$r$i%i%i%i%i%i%i%i%i%i%i%i%r$/$/$j%j%j%j%j%j%j%j%j%O$($_$_$:$:$`.z.A.",
"C%D%E%F%G%H%I%J%K%H%I%J%K%H%I%J%K%H%I%J%L%M%N%O%P%Q%R%S%T%A%B%r$r$r$r$r$r$r$r$r$r$r$r$r$r$r$U%U%r$r$i%i%/$/$r$r$/$/$/$/$r$r$i%i%i%i%i%i%i%i%i%i%i%i%i%i%j%i%j%j%j%j%j%j%j%j%j%j%j%j%j%O$($_$_$:$:$p+z.Y ",
"/$/$/$/$V%V%W%X%W%Y%Y%Z%W%W%Y%Z%W%W%W%`%`% &B%.&+&@&#&$&%&A%B%r$r$r$U%U%U%U%r$U%U%U%U%U%U%U%U%U%U%i%i%i%i%i%i%i%i%/$/$/$i%i%i%i%i%i%i%i%i%j%j%j%j%i%i%i%i%i%j%j%j%i%i%j%j%j%j%j%j%j%j%O$($_$_$:$:$`.z.A.",
"&&*&=&-&=&;&>&,&=&;&>&,&=&;&>&,&=&;&>&'&)&!&~&{&]&^&/&(&_&:&<&U%U%U%U%U%U%U%U%U%U%U%U%U%i%i%U%U%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%O$($_$_$:$:$p+z.Y ",
"U%U%U%U%U%U%U%U%U%U%U%U%U%U%U%U%U%U%U%U%[&}&|&1&2&3&4&5&_&6&U%7&U%U%U%U%U%U%U%U%i%i%U%U%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%O$O$_$_$:$:$`.z.A.",
"U%U%U%U%U%U%[&8&U%9&[&0&U%9&[&0&U%9&[&a&:&b&c&d&e&f&g&h&i&<&j&U%U%U%U%U%U%U%U%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%O$O$_$_$:$:$p+z.Y ",
"k&l&m&7&7&n&o&p&7&n&q&r&s&s&q&r&s&n&o&p&t&u&u&g&v&w&x&q&n&m&y&7&7&U%U%7&z&7&z&U%A&B&i%i%B&B&i%i%B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&i%B&O$O$_$_$:$:$`.z.A.",
"C&D&E&z&z&E&F&G&z&E&F&G&z&E&F&G&z&E&F&G&H&I&J&K&L&M&N&O&P&Q&z&z&z&z&z&z&z&z&z&z&z&z&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&O$O$_$_$:$:$p+z.Y ",
"z&z&z&z&R&S&T&U&R&S&T&U&R&S&T&U&R&S&T&U&V&V&W&X&Y&Z&`&C&R&z&z&z&z&z&z&z&z&z&z&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&O$O$_$_$:$:$^+z.A.",
"z& *.*+*@*#*$*%*@*#*$*%*@*#*$*%*@*#*$*%*&***=*-*;*>*k&P&+*z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&z&B&B&B&B&z&z&z&B&B&B&z&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&/$O$O$@@_$,*:$/ ^+z.Y ",
"'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*)*'*!*~*{*]*^*^*^*/*/*/*/*/*/*/*^*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*^*/*/*/*/*/*h h ^*h h ^*^*h h ^*^*^*^*h ^*^*^*^*h ^*^*^*(*_*_*_*_*_$:*:$<*`.z.} ",
"'*'*'*'*'*[*}*|*'*[*}*|*'*[*}*|*'*[*}*|*1*1*2*}*}*2*[*)*3*4*5*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*h h h h h h h h h h h h h h h h 6*7*_*_*_*_*^*:*:$: 8*z.Y } ",
"9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*0*( <*8*^+z.Y } 1 ",
"a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*8*b*8*b*8*b*8*b*b*8*b*8*b*8*b*8*b*8*b*8*b*8*b*8*b*8*b*8*b*8*b*8*b*8*b*8*b*8*b*8*b*8*b*8*b*8*b*8*b*8*b*8*b*8*b*8*b*8*8*8*8*b*8*`.z.A.Y | | ",
"c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*p+`.p+`.p+`.p+`.`.p+`.p+`.p+`.p+`.p+`.p+`.p+`.p+`.p+`.p+`.p+`.p+`.p+`.p+`.p+`.p+`.p+`.p+`.p+`.p+`.p+`.p+`.p+`.p+`.p+^+`.^+^+z.z.Y Y | | 1 ",
"d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*A.Y A.Y A.Y A.Y Y A.Y A.Y A.Y A.Y A.Y A.Y A.Y A.Y A.Y A.Y A.Y A.Y A.Y A.Y A.Y A.Y A.Y A.Y A.Y A.Y A.Y A.Y A.Y A.Y A.Y A.Y } } | | | | 1 1 ",
"e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*} | } | } | } | | } | } | } | } | } | } | } | } | } | } | } | } | } | } | } | } | } | } | } | } | } | } | } | } | } | | | | 1 | | | 1 1 1 "};


static char * tabmiddle_xpm[] = {
"33 42 32 1",
" 	c None",
".	c #CECFEF",
"+	c #CECBE7",
"@	c #C6C7E7",
"#	c #C6CBE7",
"$	c #BDBEDE",
"%	c #BDC3DE",
"&	c #CECBEF",
"*	c #B5B6D6",
"=	c #ADAECE",
"-	c #ADB2CE",
";	c #BDBAD6",
">	c #B5BAD6",
",	c #C6C3DE",
"'	c #ADAAC6",
")	c #B5B2CE",
"!	c #B5B6CE",
"~	c #A5A2BD",
"{	c #A5A6BD",
"]	c #9C9EB5",
"^	c #9CA2BD",
"/	c #ADAEC6",
"(	c #C6C3E7",
"_	c #9C9AB5",
":	c #A5A6C6",
"<	c #949AAD",
"[	c #A5AAC6",
"}	c #9496AD",
"|	c #BDBADE",
"1	c #BDBED6",
"2	c #9CA2B5",
"3	c #A5AABD",
"..........................+@.#.#.",
"........................$@%&#.#..",
"......................**$$@@&#.#.",
".....................=-;>,%+@.#..",
"....................'')!$$@@&#.#.",
"...................~{=)$$@@&#.#..",
"..................]^'/;;(%&#.#...",
"................._]:/*>,%&@.#.#..",
".................<{[)!$%+@.#.#...",
"................}~{=!$%@@.#......",
"................]^/-|$@@.#.......",
"................]'/*;@@&#........",
"...............<~[)>,%&#.#.......",
"...............]~=)$%+#.#........",
"...............]'/;1@@.#.........",
"...............~{)*,%&#..........",
"...............2/-$$@#...........",
"...............~[*>(@&#..........",
"...............^=)$%+#...........",
"...............{'*>(@.#..........",
"...............^=)$%+#...........",
"...............{'*>(@.#..........",
"...............^=)$%+#...........",
"...............{'*>(@.#..........",
"...............^=)$%+#...........",
"...............{'*>(@.#..........",
"...............^=)$%+#...........",
"...............{'*>@@.#..........",
"...............^=!$%&#...........",
"...............{/*;@@.#..........",
"...............{)!$%&#...........",
"..............]'/;1@@.#..........",
"..............23)>,%&#...........",
"..............~=-$$@@.#..........",
".............]{/*;@@.#...........",
"............<^[)>,%&#............",
"............]{/!$%@@.#...........",
"..........]^[-!$%@@.#............",
".........]^3/!>$@@.#.............",
".......<]^3/!>$@@&#..............",
".....<]2{[/!>$%@&#.#.............",
"}<<_]2{3/-!>$%@&#.#.............."};


static char * tabselectedbeginn_xpm[] = {
"33 39 28 1",
" 	c None",
".	c #CECFEF",
"+	c #EFF3EF",
"@	c #FFFBFF",
"#	c #F7FBF7",
"$	c #FFFFFF",
"%	c #EFEFEF",
"&	c #F7F7F7",
"*	c #DEDFDE",
"=	c #E7E7E7",
"-	c #D6D3D6",
";	c #DEE3DE",
">	c #EFEBEF",
",	c #F7F3F7",
"'	c #CECBCE",
")	c #CECFCE",
"!	c #D6D7D6",
"~	c #DEDBDE",
"{	c #E7EBE7",
"]	c #C6C7C6",
"^	c #E7E3E7",
"/	c #BDC3BD",
"(	c #CED3CE",
"_	c #BDBABD",
":	c #C6C3C6",
"<	c #C6CBC6",
"[	c #D6DBD6",
"}	c #BDBEBD",
"..........................+@#$#$$",
"........................%%&&@#$#$",
"......................*==%%&&@#$$",
"....................--*;>%,&@#$#$",
"...................')!~={,+@#$#$$",
"...................]-!^=%%&&@#$#$",
"................../'(~;>%&&@#$#$$",
"................._])!*={,&@#$#$$$",
"................_])~*>%&&$#$$$$$$",
"................:<![={&&@#$$$$$$$",
"................:)!^=,+@#$$$$$$$$",
"...............}'(*^%+@#$#$$$$$$$",
"...............:<!*>%&&$#$$$$$$$$",
".............../)!^{,&@#$$$$$$$$$",
"...............](*^%+@#$$$$$$$$$$",
"...............]!~=%&&$$$$$$$$$$$",
"...............'(*=,+@#$$$$$$$$$$",
"...............<!*>%&&$$$$$$$$$$$",
"...............'-^=,+@#$$$$$$$$$$",
"...............<!*>%&#$$$$$$$$$$$",
"...............'-^=,+@#$$$$$$$$$$",
"...............<!*>%&#$$$$$$$$$$$",
"...............'-^=,+@#$$$$$$$$$$",
"...............<!*>%&#$$$$$$$$$$$",
"...............'-^=,+@#$$$$$$$$$$",
"...............<!*>%&#$$$$$$$$$$$",
"...............'!^=,&@#$$$$$$$$$$",
"...............<~*>%&#$$$$$$$$$$$",
"...............)!^{,&@#$$$$$$$$$$",
"..............])~;%+@#$$$$$$$$$$$",
"..............]-[={&&$#$$$$$$$$$$",
".............])!^=,&@#$$$$$$$$$$$",
"............:'-*^%+@#$$$$$$$$$$$$",
"............])~*>%&&$#$$$$$$$$$$$",
"...........:'!*={,&@#$$$$$$$$$$$$",
"..........:'-~^=,+@#$$$$$$$$$$$$$",
".......}]'-~^=%,&@#$$$$$$$$$$$$$$",
".....}:])-~^=%,+@#$#$$$$$$$$$$$$$",
"}}}:]')-!*^=%,&@#$#$$$$$$$$$$$$$$"};


static char * tabselectedend_xpm[] = {
"33 42 33 1",
" 	c None",
".	c #FFFFFF",
"+	c #CECBE7",
"@	c #C6C7E7",
"#	c #CECFEF",
"$	c #C6CBE7",
"%	c #BDBEDE",
"&	c #BDC3DE",
"*	c #CECBEF",
"=	c #B5B6D6",
"-	c #ADAECE",
";	c #ADB2CE",
">	c #BDBAD6",
",	c #B5BAD6",
"'	c #C6C3DE",
")	c #ADAAC6",
"!	c #B5B2CE",
"~	c #B5B6CE",
"{	c #A5A2BD",
"]	c #A5A6BD",
"^	c #9C9EB5",
"/	c #9CA2BD",
"(	c #ADAEC6",
"_	c #C6C3E7",
":	c #9C9AB5",
"<	c #A5A6C6",
"[	c #949AAD",
"}	c #A5AAC6",
"|	c #9496AD",
"1	c #BDBADE",
"2	c #BDBED6",
"3	c #9CA2B5",
"4	c #A5AABD",
"..........................+@#$#$#",
"........................%@&*$#$##",
"......................==%%@@*$#$#",
".....................-;>,'&+@#$##",
"....................))!~%%@@*$#$#",
"...................{]-!%%@@*$#$##",
"..................^/)(>>_&*$#$###",
".................:^<(=,'&*@#$#$##",
".................[]}!~%&+@#$#$###",
"................|{]-~%&@@#$######",
"................^/(;1%@@#$#######",
"................^)(=>@@*$########",
"...............[{}!,'&*$#$#######",
"...............^{-!%&+$#$########",
"...............^)(>2@@#$#########",
"...............{]!='&*$##########",
"...............3(;%%@$###########",
"...............{}=,_@*$##########",
".............../-!%&+$###########",
"...............])=,_@#$##########",
".............../-!%&+$###########",
"...............])=,_@#$##########",
".............../-!%&+$###########",
"...............])=,_@#$##########",
".............../-!%&+$###########",
"...............])=,_@#$##########",
".............../-!%&+$###########",
"...............])=,@@#$##########",
".............../-~%&*$###########",
"...............](=>@@#$##########",
"...............]!~%&*$###########",
"..............^)(>2@@#$##########",
"..............34!,'&*$###########",
"..............{-;%%@@#$##########",
".............^](=>@@#$###########",
"............[/}!,'&*$############",
"............^](~%&@@#$###########",
"..........^/};~%&@@#$############",
".........^/4(~,%@@#$#############",
".......[^/4(~,%@@*$##############",
".....[^3]}(~,%&@*$#$#############",
"|[[:^3]4(;~,%&@*$#$##############"};


static char * tabend_xpm[] = {
"33 42 3 1",
" 	c None",
".	c #CECFEF",
"+	c #FFFFFF",
"..........................+++++++",
"........................+++++++++",
"......................+++++++++++",
".....................++++++++++++",
"....................+++++++++++++",
"...................++++++++++++++",
"..................+++++++++++++++",
".................++++++++++++++++",
".................++++++++++++++++",
"................+++++++++++++++++",
"................+++++++++++++++++",
"................+++++++++++++++++",
"...............++++++++++++++++++",
"...............++++++++++++++++++",
"...............++++++++++++++++++",
"...............++++++++++++++++++",
"...............++++++++++++++++++",
"...............++++++++++++++++++",
"...............++++++++++++++++++",
"...............++++++++++++++++++",
"...............++++++++++++++++++",
"...............++++++++++++++++++",
"...............++++++++++++++++++",
"...............++++++++++++++++++",
"...............++++++++++++++++++",
"...............++++++++++++++++++",
"...............++++++++++++++++++",
"...............++++++++++++++++++",
"...............++++++++++++++++++",
"...............++++++++++++++++++",
"...............++++++++++++++++++",
"..............+++++++++++++++++++",
"..............+++++++++++++++++++",
"..............+++++++++++++++++++",
".............++++++++++++++++++++",
"............+++++++++++++++++++++",
"............+++++++++++++++++++++",
"..........+++++++++++++++++++++++",
".........++++++++++++++++++++++++",
".......++++++++++++++++++++++++++",
".....++++++++++++++++++++++++++++",
"+++++++++++++++++++++++++++++++++"};




QColor fromHsl(QColor c)
{
    const qreal h = c.hueF();
    const qreal s = c.saturationF();
    const qreal l = c.valueF();

    qreal ca[3] = {0, 0, 0};

    if (s == 0 || h == 1) {
        // achromatic case 
        ca[0] = ca[1] = ca[2] = l;
    } else { 
        // chromatic case 
        qreal temp2; 
        if (l < qreal(0.5)) 
            temp2 = l * (qreal(1.0) + s); 
        else 
            temp2 = l + s - (l * s); 

        const qreal temp1 = (qreal(2.0) * l) - temp2; 
        qreal temp3[3] = { h + (qreal(1.0) / qreal(3.0)), 
            h, 
            h - (qreal(1.0) / qreal(3.0)) }; 

        for (int i = 0; i != 3; ++i) { 
            if (temp3[i] < qreal(0.0)) 
                temp3[i] += qreal(1.0); 
            else if (temp3[i] > qreal(1.0)) 
                temp3[i] -= qreal(1.0);

            const qreal sixtemp3 = temp3[i] * qreal(6.0);

            if (sixtemp3 < qreal(1.0)) 
                ca[i] = ((temp1 + (temp2 - temp1) * sixtemp3)); 
            else if ((temp3[i] * qreal(2.0)) < qreal(1.0)) 
                ca[i] = (temp2); 
            else if ((temp3[i] * qreal(3.0)) < qreal(2.0)) 
                ca[i] = temp1 + (temp2 -temp1) * (qreal(2.0) /qreal(3.0) - temp3[i]) * qreal(6.0);
            else ca[i] = temp1;
        }
    }
    
    return QColor::fromRgbF(ca[0], ca[1], ca[2]);
}

#define Q_MAX_3(a, b, c) ( ( a > b && a > c) ? a : (b > c ? b : c) )
#define Q_MIN_3(a, b, c) ( ( a < b && a < c) ? a : (b < c ? b : c) )

QColor toHsl(QColor c)
{
    QColor color; 
    qreal h;
    qreal s;
    qreal l;

    const qreal r = c.redF();
    const qreal g = c.greenF();
    const qreal b = c.blueF();
    const qreal max = Q_MAX_3(r, g, b); 
    const qreal min = Q_MIN_3(r, g, b); 
    const qreal delta = max - min;  
    const qreal delta2 = max + min; 
    const qreal lightness = qreal(0.5) * delta2; 
    l = (lightness);
    if (qFuzzyIsNull(delta)) { 
        // achromatic case, hue is undefined 
        h = 0;
        s = 0; 
    } else {
        // chromatic case 
        qreal hue = 0; 
        if (lightness < qreal(0.5)) 
            s = ((delta / delta2)); 
        else 
            s = ((delta / (qreal(2.0) - delta2))); 
        if (qFuzzyCompare(r, max)) { 
            hue = ((g - b) /delta); 
        } else if (qFuzzyCompare(g, max)) { 
            hue = (2.0 + (b - r) / delta); 
        } else if (qFuzzyCompare(b, max)) { 
            hue = (4.0 + (r - g) / delta); 
        } else { 
            Q_ASSERT_X(false, "QColor::toHsv", "internal error"); 
        }
        hue *= 60.0; 
        if (hue < 0.0) 
            hue += 360.0; 
        h = (hue * 100); 
    }

    h = h / 36000;

    return QColor::fromHsvF(h, s, l);
}

void tintColor(QColor &color, QColor tintColor, qreal _saturation)
{
    tintColor = toHsl(tintColor);
    color = toHsl(color);
    qreal hue = tintColor.hueF();

    qreal saturation = color.saturationF();
    if (_saturation)
        saturation = _saturation;
    qreal lightness = color.valueF();
    color.setHsvF(hue, saturation, lightness);

    color = fromHsl(color);
    color.toRgb();
}

void tintImagePal(QImage *image, QColor color, qreal saturation)
{
    QVector<QRgb> colorTable = image->colorTable();
    for (int i=2;i< colorTable.size();i++) {
        QColor c(toHsl(colorTable.at(i)));
        tintColor(c, color, saturation);
        colorTable[i] = c.rgb();
    }
    image->setColorTable(colorTable);
}


void tintImage(QImage *image, QColor color, qreal saturation)
{
    *image = image->convertToFormat(QImage::Format_RGB32);

    for (int x = 0; x < image->width(); x++)
        for (int y = 0; y < image->height(); y++) {
            QColor c(image->pixel(x,y));
            tintColor(c, color, saturation);
            image->setPixel(x, y, c.rgb());
        }
}

#endif //Q_WS_WINCE_WM


enum QSliderDirection { SliderUp, SliderDown, SliderLeft, SliderRight };

#ifdef Q_WS_WINCE_WM

void QWindowsMobileStylePrivate::tintImagesButton(QColor color)
{
    if (currentTintButton == color)
        return;
    currentTintButton = color;

    imageTabEnd = QImage(tabend_xpm);
    imageTabSelectedEnd = QImage(tabselectedend_xpm);
    imageTabSelectedBegin = QImage(tabselectedbeginn_xpm);
    imageTabMiddle = QImage(tabmiddle_xpm);
    tintImage(&imageTabEnd, color, 0.0);
    tintImage(&imageTabSelectedEnd, color, 0.0);
    tintImage(&imageTabSelectedBegin, color, 0.0);
    tintImage(&imageTabMiddle, color, 0.0);

    if (!doubleControls) {
        int height = imageTabMiddle.height() / 2 + 1;
        imageTabEnd = imageTabEnd.scaledToHeight(height);
        imageTabMiddle = imageTabMiddle.scaledToHeight(height);
        imageTabSelectedEnd = imageTabSelectedEnd.scaledToHeight(height);
        imageTabSelectedBegin = imageTabSelectedBegin.scaledToHeight(height);
    }
}

void QWindowsMobileStylePrivate::tintImagesHigh(QColor color)
{
    if (currentTintHigh == color)
        return;
    currentTintHigh = color;
    tintListViewHighlight(color);
    imageScrollbarHandleUpHigh = imageScrollbarHandleUp;
    imageScrollbarHandleDownHigh = imageScrollbarHandleDown;
    tintImagePal(&imageScrollbarHandleDownHigh, color, qreal(0.8));
    tintImagePal(&imageScrollbarHandleUpHigh, color, qreal(0.8));
}

void QWindowsMobileStylePrivate::tintListViewHighlight(QColor color)
{
    imageListViewHighlightCornerRight = QImage(listviewhighcornerright_xpm);
    tintImage(&imageListViewHighlightCornerRight, color, qreal(0.0));

    imageListViewHighlightCornerLeft = QImage(listviewhighcornerleft_xpm);
    tintImage(&imageListViewHighlightCornerLeft, color, qreal(0.0));

    imageListViewHighlightMiddle = QImage(listviewhighmiddle_xpm);
    tintImage(&imageListViewHighlightMiddle, color, qreal(0.0));
     
     int height = imageListViewHighlightMiddle.height();
     if (!doubleControls) {
         height = height / 2;
         imageListViewHighlightCornerRight = imageListViewHighlightCornerRight.scaledToHeight(height);
         imageListViewHighlightCornerLeft = imageListViewHighlightCornerLeft.scaledToHeight(height);
         imageListViewHighlightMiddle = imageListViewHighlightMiddle.scaledToHeight(height);
     }
}

#endif //Q_WS_WINCE_WM

void QWindowsMobileStylePrivate::setupWindowsMobileStyle65()
{
#ifdef Q_WS_WINCE_WM
    wm65 = qt_wince_is_windows_mobile_65();
    if (wm65) {
        imageScrollbarHandleUp =  QImage(sbhandleup_xpm);
        imageScrollbarHandleDown = QImage(sbhandledown_xpm);
        imageScrollbarGripUp = QImage(sbgripup_xpm);
        imageScrollbarGripDown = QImage(sbgripdown_xpm);
        imageScrollbarGripMiddle = QImage(sbgripmiddle_xpm);

        if (!doubleControls) {
            imageScrollbarHandleUp = imageScrollbarHandleUp.scaledToHeight(imageScrollbarHandleUp.height() / 2);
            imageScrollbarHandleDown = imageScrollbarHandleDown.scaledToHeight(imageScrollbarHandleDown.height() / 2);
            imageScrollbarGripMiddle = imageScrollbarGripMiddle.scaledToHeight(imageScrollbarGripMiddle.height() / 2);
            imageScrollbarGripUp = imageScrollbarGripUp.scaledToHeight(imageScrollbarGripUp.height() / 2);
            imageScrollbarGripDown = imageScrollbarGripDown.scaledToHeight(imageScrollbarGripDown.height() / 2);
        } else {
        }
        tintImagesHigh(Qt::blue);
    }
#endif //Q_WS_WINCE_WM
}

void QWindowsMobileStylePrivate::drawTabBarTab(QPainter *painter, const QStyleOptionTab *tab)
{
#ifndef QT_NO_TABBAR
#ifdef Q_WS_WINCE_WM
    if (wm65) {
        tintImagesButton(tab->palette.button().color());
        QRect r;
        r.setTopLeft(tab->rect.topRight() - QPoint(imageTabMiddle.width(), 0));
        r.setBottomRight(tab->rect.bottomRight());
        if (tab->state & QStyle::State_Selected) {
            painter->fillRect(tab->rect, tab->palette.window());
        } else {
            painter->fillRect(tab->rect, QColor(imageTabMiddle.pixel(0,0)));
        }
        if  (tab->selectedPosition ==  QStyleOptionTab::NextIsSelected) {
            painter->drawImage(r, imageTabSelectedBegin);
        } else if (tab->position == QStyleOptionTab::End ||
            tab->position == QStyleOptionTab::OnlyOneTab) {
                if (!(tab->state & QStyle::State_Selected)) {
                    painter->drawImage(r, imageTabEnd);
                }
        } else if (tab->state & QStyle::State_Selected) {
            painter->drawImage(r, imageTabSelectedEnd);
        } else {
            painter->drawImage(r, imageTabMiddle);
        }
        if (tab->position == QStyleOptionTab::Beginning && ! (tab->state & QStyle::State_Selected)) {
            painter->drawImage(tab->rect.topLeft() - QPoint(imageTabMiddle.width() * 0.60, 0), imageTabSelectedEnd);
        }
        //imageTabBarBig
        return;
    }
#endif //Q_WS_WINCE_WM
    painter->save();
    painter->setPen(tab->palette.shadow().color());
    if (doubleControls) {
        QPen pen = painter->pen();
        pen.setWidth(2);
        pen.setCapStyle(Qt::FlatCap);
        painter->setPen(pen);
    }
    if(tab->shape == QTabBar::RoundedNorth) {
        if (tab->state & QStyle::State_Selected) {
            painter->fillRect(tab->rect, tab->palette.light());
            painter->drawLine(tab->rect.topRight(), tab->rect.bottomRight());
        }
        else {
            painter->fillRect(tab->rect, tab->palette.button());
            painter->drawLine(tab->rect.bottomLeft() , tab->rect.bottomRight());
            painter->drawLine(tab->rect.topRight(), tab->rect.bottomRight());
        }
    }
    else if(tab->shape == QTabBar::RoundedSouth) {
        if (tab->state & QStyle::State_Selected) {
            painter->fillRect(tab->rect.adjusted(0,-2,0,0), tab->palette.light());
            painter->drawLine(tab->rect.topRight(), tab->rect.bottomRight());
        }
        else {
            painter->fillRect(tab->rect, tab->palette.button());
            if (doubleControls)
                painter->drawLine(tab->rect.topLeft() + QPoint(0,1), tab->rect.topRight() + QPoint(0,1));
            else
                painter->drawLine(tab->rect.topLeft(), tab->rect.topRight());
            painter->drawLine(tab->rect.topRight(), tab->rect.bottomRight());
        }
    }
    else if(tab->shape == QTabBar::RoundedEast) {
        if (tab->state & QStyle::State_Selected) {
            painter->fillRect(tab->rect, tab->palette.light());
            painter->drawLine(tab->rect.topLeft(), tab->rect.topRight());
        }
        else {
            painter->fillRect(tab->rect, tab->palette.button());
            painter->drawLine(tab->rect.topLeft(), tab->rect.bottomLeft());
            painter->drawLine(tab->rect.topLeft(), tab->rect.topRight());
        }
    }
    else if(tab->shape == QTabBar::RoundedWest) {
        if (tab->state & QStyle::State_Selected) {
            painter->fillRect(tab->rect, tab->palette.light());
            painter->drawLine(tab->rect.bottomLeft(), tab->rect.bottomRight());
        }
        else {
            painter->fillRect(tab->rect, tab->palette.button());
            painter->drawLine(tab->rect.topRight(), tab->rect.bottomRight());
            painter->drawLine(tab->rect.bottomLeft(), tab->rect.bottomRight());
        }
    }
    painter->restore();
#endif //QT_NO_TABBAR
}

void QWindowsMobileStylePrivate::drawPanelItemViewSelected(QPainter *painter, const QStyleOptionViewItemV4 *option, QRect rect)
{
#ifdef Q_WS_WINCE_WM
    if (wm65) {
        QRect r;
        if (rect.isValid())
            r = rect;
        else 
            r = option->rect;
        tintImagesHigh(option->palette.highlight().color());

        painter->setPen(QColor(Qt::lightGray));

        if (option->viewItemPosition ==  QStyleOptionViewItemV4::Middle) {
            painter->drawImage(r, imageListViewHighlightMiddle);
        } else if (option->viewItemPosition ==  QStyleOptionViewItemV4::Beginning) {
            painter->drawImage(r.adjusted(10, 0, 0, 0), imageListViewHighlightMiddle);
        } else if (option->viewItemPosition ==  QStyleOptionViewItemV4::End) {
            painter->drawImage(r.adjusted(0, 0, -10, 0), imageListViewHighlightMiddle);
        } else {
            painter->drawImage(r.adjusted(10, 0, -10, 0), imageListViewHighlightMiddle);
        }

        QImage cornerLeft = imageListViewHighlightCornerLeft;
        QImage cornerRight = imageListViewHighlightCornerRight;

        int width = r.width() > cornerRight.width() ? r.width() : cornerRight.width();

        if ((width * 2) > r.width()) {
            width = (r.width() - 5) / 2;
        }

        cornerLeft = cornerLeft.scaled(width, r.height());
        cornerRight = cornerRight.scaled(width, r.height());

        if ((option->viewItemPosition ==  QStyleOptionViewItemV4::Beginning) || (option->viewItemPosition ==  QStyleOptionViewItemV4::OnlyOne) || !option->viewItemPosition) {
            painter->drawImage(r.topLeft(), cornerLeft);
        }
        if ((option->viewItemPosition ==  QStyleOptionViewItemV4::End) || (option->viewItemPosition ==  QStyleOptionViewItemV4::OnlyOne) || !option->viewItemPosition) {
            painter->drawImage(r.topRight() - QPoint(cornerRight.width(),0), cornerRight);
        }
        return;
    }
#endif //Q_WS_WINCE_WM
    QPalette::ColorGroup cg = option->state & QStyle::State_Enabled
                                      ? QPalette::Normal : QPalette::Disabled;

    if (rect.isValid())
        painter->fillRect(rect, option->palette.brush(cg, QPalette::Highlight));
    else
        painter->fillRect(option->rect, option->palette.brush(cg, QPalette::Highlight));
}

void QWindowsMobileStylePrivate::drawScrollbarGrip(QPainter *p, QStyleOptionSlider *newScrollbar, const QStyleOptionComplex *option, bool drawCompleteFrame)
{
#ifdef Q_WS_WINCE_WM
    if (wm65) {
        if (newScrollbar->orientation == Qt::Horizontal) {
            QTransform transform;
            transform.rotate(-90);
            QRect r = newScrollbar->rect;
            p->drawImage(r.adjusted(10, 0, -10, 0), imageScrollbarGripMiddle.transformed(transform));
            p->drawImage(r.topLeft(), imageScrollbarGripUp.transformed(transform));
            p->drawImage(r.topRight() - QPoint(imageScrollbarGripDown.height() - 1, 0), imageScrollbarGripDown.transformed(transform));
        } else {
            QRect r = newScrollbar->rect;
            p->drawImage(r.adjusted(0, 10, 0, -10), imageScrollbarGripMiddle);
            p->drawImage(r.topLeft(), imageScrollbarGripUp);
            p->drawImage(r.bottomLeft() - QPoint(0, imageScrollbarGripDown.height() - 1), imageScrollbarGripDown);
        }
        return ;
    }
#endif
        if (newScrollbar->orientation == Qt::Horizontal) {
            p->fillRect(newScrollbar->rect,option->palette.button());
            QRect r = newScrollbar->rect;
            p->drawLine(r.topLeft(), r.bottomLeft());
            p->drawLine(r.topRight(), r.bottomRight());
            if (smartphone) {
                p->drawLine(r.topLeft(), r.topRight());
                p->drawLine(r.bottomLeft(), r.bottomRight());
            }
        }
        else {
            p->fillRect(newScrollbar->rect,option->palette.button());
            QRect r = newScrollbar->rect;
            p->drawLine(r.topLeft(), r.topRight());
            p->drawLine(r.bottomLeft(), r.bottomRight());
            if (smartphone) {
                p->drawLine(r.topLeft(), r.bottomLeft());
                p->drawLine(r.topRight(), r.bottomRight());
            }
        }
        if (newScrollbar->state & QStyle::State_HasFocus) {
            QStyleOptionFocusRect fropt;
            fropt.QStyleOption::operator=(*newScrollbar);
            fropt.rect.setRect(newScrollbar->rect.x() + 2, newScrollbar->rect.y() + 2,
                newScrollbar->rect.width() - 5,
                newScrollbar->rect.height() - 5);
        }
    int gripMargin = doubleControls ? 4 : 2;
    int doubleLines = doubleControls ? 2 : 1;
    //If there is a frame around the scrollbar (abstractScrollArea),
    //then the margin is different, because of the missing frame
    int gripMarginFrame = doubleControls ? 3 : 1;
    if (drawCompleteFrame)
        gripMarginFrame = 0;
    //draw grips
    if (!smartphone)
        if (newScrollbar->orientation == Qt::Horizontal) {
            for (int i = -3; i < 3; i += 2) {
                p->drawLine(
                    QPoint(newScrollbar->rect.center().x() + i * doubleLines + 1,
                    newScrollbar->rect.top() + gripMargin +gripMarginFrame),
                    QPoint(newScrollbar->rect.center().x() + i * doubleLines + 1,
                    newScrollbar->rect.bottom() - gripMargin));
            }
        } else {
            for (int i = -2; i < 4 ; i += 2) {
                p->drawLine(
                    QPoint(newScrollbar->rect.left() + gripMargin + gripMarginFrame ,
                    newScrollbar->rect.center().y() + 1 + i * doubleLines - 1),
                    QPoint(newScrollbar->rect.right() - gripMargin,
                    newScrollbar->rect.center().y() + 1 + i * doubleLines - 1));
            }
        }
        if (!smartphone) {
            QRect r;
            if (doubleControls)
                r = option->rect.adjusted(1, 1, -1, 0);
            else
                r = option->rect.adjusted(0, 0, -1, 0);
            if (drawCompleteFrame && doubleControls)
                r.adjust(0, 0, 0, -1);
            //Check if the scrollbar is part of an abstractItemView and draw the frame according
            if (drawCompleteFrame)
                p->drawRect(r);
            else
                if (newScrollbar->orientation == Qt::Horizontal)
                    p->drawLine(r.topLeft(), r.topRight());
                else
                    p->drawLine(r.topLeft(), r.bottomLeft());
        }
}

void QWindowsMobileStylePrivate::drawScrollbarHandleUp(QPainter *p, QStyleOptionSlider *opt, bool completeFrame, bool )
{
#ifdef Q_WS_WINCE_WM
    if (wm65) {
        tintImagesHigh(opt->palette.highlight().color());
        QRect r = opt->rect;
         if (opt->orientation == Qt::Horizontal) {
            QTransform transform;
            transform.rotate(-90);
            if (opt->state & QStyle::State_Sunken)
                p->drawImage(r.topLeft(), imageScrollbarHandleUpHigh.transformed(transform));
            else
                p->drawImage(r.topLeft(), imageScrollbarHandleUp.transformed(transform));
         } else {
             if (opt->state & QStyle::State_Sunken)
                 p->drawImage(r.topLeft(), imageScrollbarHandleUpHigh);
             else
                 p->drawImage(r.topLeft(), imageScrollbarHandleUp);
         }
        return ;
    }
#endif //Q_WS_WINCE_WM

    QBrush fill = opt->palette.button();
    if (opt->state & QStyle::State_Sunken)
        fill = opt->palette.shadow();

    QStyleOption arrowOpt = *opt;
    if (doubleControls)
        arrowOpt.rect = opt->rect.adjusted(4, 6, -5, -3);
    else
        arrowOpt.rect = opt->rect.adjusted(5, 6, -4, -3);

    bool horizontal = (opt->orientation == Qt::Horizontal);

    if (horizontal) {
        p->fillRect(opt->rect,fill);
        QRect r = opt->rect.adjusted(0,0,1,0);
        p->drawLine(r.topRight(), r.bottomRight());
        if (doubleControls)
            arrowOpt.rect.adjust(0, -2 ,0, -2);
        q_func()->proxy()->drawPrimitive(QStyle::PE_IndicatorArrowLeft, &arrowOpt, p, 0);
    } else {
        p->fillRect(opt->rect,fill);
        QRect r = opt->rect.adjusted(0, 0, 0, 1);
        p->drawLine(r.bottomLeft(), r.bottomRight());
        if (completeFrame)
            arrowOpt.rect.adjust(-2, 0, -2, 0);
        if (doubleControls)
            arrowOpt.rect.adjust(0, -4 , 0, -4);
        if (completeFrame && doubleControls)
            arrowOpt.rect.adjust(2, 0, 2, 0);
        q_func()->proxy()->drawPrimitive(QStyle::PE_IndicatorArrowUp, &arrowOpt, p, 0);
    }
}

void QWindowsMobileStylePrivate::drawScrollbarHandleDown(QPainter *p, QStyleOptionSlider *opt, bool completeFrame, bool secondScrollBar)
{
#ifndef QT_NO_SCROLLBAR
#ifdef Q_WS_WINCE_WM
    if (wm65) {
        tintImagesHigh(opt->palette.highlight().color());
        QRect r = opt->rect;
        if (opt->orientation == Qt::Horizontal) {
            QTransform transform;
            transform.rotate(-90);
            if (opt->state & QStyle::State_Sunken)
                p->drawImage(r.topLeft(), imageScrollbarHandleDownHigh.transformed(transform));
            else
                p->drawImage(r.topLeft(), imageScrollbarHandleDown.transformed(transform));
        } else {
            if (opt->state & QStyle::State_Sunken)
                p->drawImage(r.topLeft(), imageScrollbarHandleDownHigh);
            else
                p->drawImage(r.topLeft(), imageScrollbarHandleDown);
        }
        return ;
    }
#endif //Q_WS_WINCE_WM

    QBrush fill = opt->palette.button();
    if (opt->state & QStyle::State_Sunken)
        fill = opt->palette.shadow();

    QStyleOption arrowOpt = *opt;
    if (doubleControls)
        arrowOpt.rect = opt->rect.adjusted(4, 0, -5, 3);
    else
        arrowOpt.rect = opt->rect.adjusted(5, 6, -4, -3);

    bool horizontal = (opt->orientation == Qt::Horizontal);

    if (horizontal) {
        p->fillRect(opt->rect,fill);
        QRect r = opt->rect.adjusted(0, 0, 0, 0);
        p->drawLine(r.topLeft(), r.bottomLeft());
        if (secondScrollBar)
            p->drawLine(r.topRight(), r.bottomRight());
        if (doubleControls)
            arrowOpt.rect.adjust(0, 4, 0, 4 );
        q_func()->proxy()->drawPrimitive(QStyle::PE_IndicatorArrowRight, &arrowOpt, p, 0);
    } else {
        p->fillRect(opt->rect,fill);
        QRect r = opt->rect.adjusted(0, -1, 0, -1);
        p->drawLine(r.topLeft(), r.topRight());
        if (secondScrollBar)
            p->drawLine(r.bottomLeft() + QPoint(0,1), r.bottomRight() + QPoint(0, 1));
        if (completeFrame)
            arrowOpt.rect.adjust(-2, 0, -2, 0);
        if (doubleControls)
            arrowOpt.rect.adjust(1, 0, 1, 0 );
        if (completeFrame && doubleControls)
            arrowOpt.rect.adjust(1, 0, 1, 0);
        q_func()->proxy()->drawPrimitive(QStyle::PE_IndicatorArrowDown, &arrowOpt, p, 0);
    }
#endif //QT_NO_SCROLLBAR
}

void QWindowsMobileStylePrivate::drawScrollbarGroove(QPainter *p,const QStyleOptionSlider *opt)
{
#ifndef QT_NO_SCROLLBAR
#ifdef Q_OS_WINCE_WM
    if (wm65) {
        p->fillRect(opt->rect, QColor(231, 231, 231));
        return ;
    }
#endif
            QBrush fill;
            if (smartphone) {
                fill = opt->palette.light();
                p->fillRect(opt->rect, fill);
                fill = opt->palette.button();
                QImage image;
#ifndef QT_NO_IMAGEFORMAT_XPM
                if (opt->orientation == Qt::Horizontal)
                  image = QImage(vertlines_xpm);
                else
                  image = QImage(horlines_xpm);
#endif
                image.setColor(1, opt->palette.button().color().rgb());
                fill.setTextureImage(image);
            }
            else {
              fill = opt->palette.light();
            }
            p->fillRect(opt->rect, fill);
#endif //QT_NO_SCROLLBAR
}

QWindowsMobileStyle::QWindowsMobileStyle(QWindowsMobileStylePrivate &dd) : QWindowsStyle(dd) {
    qApp->setEffectEnabled(Qt::UI_FadeMenu, false);
    qApp->setEffectEnabled(Qt::UI_AnimateMenu, false);
}

QWindowsMobileStyle::QWindowsMobileStyle() : QWindowsStyle(*new QWindowsMobileStylePrivate) {
    qApp->setEffectEnabled(Qt::UI_FadeMenu, false);
    qApp->setEffectEnabled(Qt::UI_AnimateMenu, false);
}

QWindowsMobileStylePrivate::QWindowsMobileStylePrivate() :QWindowsStylePrivate() {

#ifdef Q_WS_WINCE
   doubleControls = qt_wince_is_high_dpi();
   smartphone = qt_wince_is_smartphone();
#else
   doubleControls = false;
   smartphone = false;
#endif //Q_WS_WINCE

#ifndef QT_NO_IMAGEFORMAT_XPM

   imageArrowDown = QImage(arrowdown_xpm);
   imageArrowUp = QImage(arrowdown_xpm).mirrored();
   imageArrowLeft = QImage(arrowleft_xpm);
   imageArrowRight = QImage(arrowleft_xpm).mirrored(true, false);
   if (doubleControls) {
       imageRadioButton = QImage(radiobutton_xpm);
       imageRadioButtonChecked = QImage(radiochecked_xpm);
       imageChecked = QImage(checkedlight_xpm);
       imageCheckedBold = QImage(checkedbold_xpm);
       imageRadioButtonHighlighted = QImage(highlightedradiobutton_xpm);
       imageClose = QImage(cross_big_xpm);
       imageMaximize = QImage(max_big_xpm);
       imageMinimize = QImage(min_big_xpm);
       imageNormalize = QImage(normal_big_xpm);
   } else {
       imageRadioButton = QImage(radiobutton_low_xpm);
       imageRadioButtonChecked = QImage(radiochecked_low_xpm);
       imageChecked = QImage(checkedlight_low_xpm);
       imageCheckedBold = QImage(checkedbold_low_xpm);
       imageRadioButtonHighlighted = QImage(highlightedradiobutton_low_xpm);
       imageClose = QImage(cross_small_xpm);
       imageMaximize = QImage(max_small_xpm);
       imageMinimize = QImage(min_small_xpm);
       imageNormalize = QImage(normal_small_xpm);
   }

   setupWindowsMobileStyle65();


   imageArrowDownBig = QImage(arrowdown_big_xpm);
   imageArrowUpBig = QImage(arrowdown_big_xpm).mirrored();
   imageArrowLeftBig = QImage(arrowleft_big_xpm);
   imageArrowRightBig = QImage(arrowleft_big_xpm).mirrored(true, false);

#endif
}

void QWindowsMobileStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option,
                                    QPainter *painter, const QWidget *widget) const {

   QWindowsMobileStylePrivate *d = const_cast<QWindowsMobileStylePrivate*>(d_func());

    bool doRestore = false;
    QRect rect = option->rect;
    painter->setClipping(false);

    switch (element) {
    case PE_PanelButtonTool: {
        int penSize = 1;
        if (d->doubleControls)
            penSize = 2;
        if (widget)
            if (QWidget *parent = widget->parentWidget())
#ifndef QT_NO_TABWIDGET
                if (qobject_cast<QTabWidget *>(parent->parentWidget())) {
#else
                if (false) {
#endif //QT_NO_TABBAR
                    rect.adjust(0,2*penSize,0,-1*penSize);
                        qDrawPlainRect(painter, rect, option->palette.shadow().color(), penSize, &option->palette.light());
                    if (option->state & (State_Sunken))
                        qDrawPlainRect(painter, rect, option->palette.shadow().color(), penSize, &option->palette.shadow());
                }
                else {
                    if (!(option->state & State_AutoRaise) || (option->state & (State_Sunken | State_On)))
                        qDrawPlainRect(painter,option->rect.adjusted(0, penSize, 0, -1 * penSize) ,
                                       option->palette.button().color(), 0, &option->palette.button());
                    if (option->state & (State_Sunken)) {
                        qDrawPlainRect(painter, rect, option->palette.shadow().color(), penSize, &option->palette.light());
                    }
                    if (option->state & (State_On)){
                        QBrush fill = QBrush(option->palette.light().color());
                        painter->fillRect(rect.adjusted(windowsItemFrame , windowsItemFrame ,
                                          -windowsItemFrame , -windowsItemFrame ), fill);
                        qDrawPlainRect(painter, rect, option->palette.shadow().color(), penSize, &option->palette.light());
                    }
                }
                break; }
    case PE_IndicatorButtonDropDown:
        if (d->doubleControls)
          qDrawPlainRect(painter, option->rect, option->palette.shadow().color(), 2, &option->palette.button());
        else
          qDrawPlainRect(painter, option->rect, option->palette.shadow().color(), 1, &option->palette.button());
        break;
#ifndef QT_NO_TABBAR
    case PE_IndicatorTabTear:
        if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option)) {
            bool rtl = tab->direction == Qt::RightToLeft;
            QRect rect = tab->rect;
            QPainterPath path;
            rect.setTop(rect.top() + ((tab->state & State_Selected) ? 1 : 3));
            rect.setBottom(rect.bottom() - ((tab->state & State_Selected) ? 0 : 2));
            path.moveTo(QPoint(rtl ? rect.right() : rect.left(), rect.top()));
            int count = 3;
            for(int jags = 1; jags <= count; ++jags, rtl = !rtl)
                path.lineTo(QPoint(rtl ? rect.left() : rect.right(), rect.top() + jags * rect.height()/count));
            painter->setPen(QPen(tab->palette.light(), qreal(.8)));
            painter->setBrush(tab->palette.background());
            painter->setRenderHint(QPainter::Antialiasing);
            painter->drawPath(path);
        }
        break;
#endif //QT_NO_TABBAR

#ifndef QT_NO_TOOLBAR
    case PE_IndicatorToolBarSeparator: {
            painter->save();
            QPoint p1, p2;
            if (option->state & State_Horizontal) {
                p1 = QPoint(option->rect.width()/2, 0);
                p2 = QPoint(p1.x(), option->rect.height());
            } else {
                p1 = QPoint(0, option->rect.height()/2);
                p2 = QPoint(option->rect.width(), p1.y());
            }


            painter->setPen(option->palette.mid().color());
            if (d->doubleControls) {
                QPen pen = painter->pen();
                pen.setWidth(2);
                pen.setCapStyle(Qt::FlatCap);
                painter->setPen(pen);
            }
            painter->drawLine(p1, p2);
            painter->restore();
            break; }
#endif // QT_NO_TOOLBAR
    case PE_IndicatorToolBarHandle:
        painter->save();
        painter->translate(option->rect.x(), option->rect.y());
        if (option->state & State_Horizontal) {
            int x = option->rect.width() / 2 - 4;
            if (QApplication::layoutDirection() == Qt::RightToLeft)
                x -= 2;
            if (option->rect.height() > 4) {
                qDrawWinButton(painter,x-1,0,7,option->rect.height(), option->palette, false,  0);

                qDrawShadePanel(painter, x, 1, 3, option->rect.height() - 1,
                    option->palette, false,  0);
                qDrawShadePanel(painter, x + 3, 1, 3, option->rect.height() - 1,
                    option->palette, false,  0);
                painter->setPen(option->palette.button().color());
            }
        } else {
            if (option->rect.width() > 4) {
                int y = option->rect.height() / 2 - 4;
                qDrawShadePanel(painter, 2, y, option->rect.width() - 2, 3,
                    option->palette, false,  0);
                qDrawShadePanel(painter, 2, y + 3, option->rect.width() - 2, 3,
                    option->palette, false,  0);
            }
        }
        painter->restore();
        break;

#ifndef QT_NO_PROGRESSBAR
    case PE_IndicatorProgressChunk: {
            bool vertical = false;
            if (const QStyleOptionProgressBarV2 *pb2 = qstyleoption_cast<const QStyleOptionProgressBarV2 *>(option))
                vertical = (pb2->orientation == Qt::Vertical);
            if (!vertical) {
                painter->fillRect(option->rect.x(), option->rect.y()+2, option->rect.width(), option->rect.height()-4,
                            option->palette.brush(QPalette::Highlight));
            } else {
                painter->fillRect(option->rect.x()+2, option->rect.y(), option->rect.width()-4, option->rect.height(),
                            option->palette.brush(QPalette::Highlight));
            }
        }
        break;
#endif // QT_NO_PROGRESSBAR

    case PE_FrameButtonTool: {
#ifndef QT_NO_DOCKWIDGET
            if (widget && widget->inherits("QDockWidgetTitleButton")) {
                if (const QDockWidget *dw = qobject_cast<const QDockWidget *>(widget->parent()))
                    if (dw->isFloating()){
                        qDrawPlainRect(painter,option->rect.adjusted(1, 1, 0, 0),
                                       option->palette.shadow().color(),1,&option->palette.button());
                        return;
                    }
            }
#endif // QT_NO_DOCKWIDGET
        QBrush fill;
        bool stippled;
        bool panel = (element == PE_PanelButtonTool);
        if ((!(option->state & State_Sunken ))
            && (!(option->state & State_Enabled)
            || ((option->state & State_Enabled ) && !(option->state & State_MouseOver)))
            && (option->state & State_On)) {
                fill = QBrush(option->palette.light().color(), Qt::Dense4Pattern);
                stippled = true;
        } else {
            fill = option->palette.brush(QPalette::Button);
            stippled = false;
        }
        if (option->state & (State_Raised | State_Sunken | State_On)) {
            if (option->state & State_AutoRaise) {
                if(option->state & (State_Enabled | State_Sunken | State_On)){
                    if (panel)
                        qDrawPlainRect(painter, option->rect,option->palette.shadow().color(),d->doubleControls, &fill);
                    else
                        qDrawPlainRect(painter, option->rect,option->palette.shadow().color(),d->doubleControls, &fill);
                }
                if (stippled) {
                    painter->setPen(option->palette.button().color());
                    painter->drawRect(option->rect.adjusted(1, 1, -2, -2));
                }
            } else {
                qDrawPlainRect(painter, option->rect,option->palette.shadow().color(),d->doubleControls, &fill);
            }
        } else {
            painter->fillRect(option->rect, fill);
        }
        break; }

    case PE_FrameFocusRect:
        if (const QStyleOptionFocusRect *fropt = qstyleoption_cast<const QStyleOptionFocusRect *>(option)) {
            //### check for d->alt_down
            int penSize;
            d->doubleControls ? penSize = 2 : penSize = 1;
            bool alternateFocusStyle = false;
            if (!widget)
                alternateFocusStyle = true;
#ifndef QT_NO_COMBOBOX
            if (qobject_cast<const QComboBox*>(widget))
                alternateFocusStyle = true;
#endif
            if (!(fropt->state & State_KeyboardFocusChange) && !styleHint(SH_UnderlineShortcut, option))
                return;
            QRect r = option->rect;
            painter->save();
            painter->setBackgroundMode(Qt::TransparentMode);
            if (alternateFocusStyle) {
                QColor bg_col = fropt->backgroundColor;
                if (!bg_col.isValid())
                    bg_col = painter->background().color();
                // Create an "XOR" color.
                QColor patternCol((bg_col.red() ^ 0xff) & 0xff,
                    (bg_col.green() ^ 0xff) & 0xff,
                    (bg_col.blue() ^ 0xff) & 0xff);
                painter->setBrush(QBrush(patternCol, Qt::Dense4Pattern));
                painter->setBrushOrigin(r.topLeft());
            }
            else {
                painter->setPen(option->palette.highlight().color());
                painter->setBrush(option->palette.highlight());
            }
            painter->setPen(Qt::NoPen);
            painter->setBrushOrigin(r.topLeft());
            painter->drawRect(r.left(), r.top(), r.width(), penSize);    // Top
            painter->drawRect(r.left(), r.bottom(), r.width() + penSize - 1, penSize); // Bottom
            painter->drawRect(r.left(), r.top(), penSize, r.height());   // Left
            painter->drawRect(r.right(), r.top(), penSize, r.height());  // Right
            painter->restore();
        }
        break;

    case PE_PanelButtonBevel: {
        QBrush fill;
        bool panel = element != PE_FrameButtonBevel;
        painter->setBrushOrigin(option->rect.topLeft());
        if (!(option->state & State_Sunken) && (option->state & State_On))
            fill = QBrush(option->palette.light().color(), Qt::Dense4Pattern);
        else
            fill = option->palette.brush(QPalette::Button);

        if (option->state & (State_Raised | State_On | State_Sunken)) {
            if (d->doubleControls)
              qDrawPlainRect(painter, option->rect,option->palette.shadow().color(),2,&fill);
            else
              qDrawPlainRect(painter, option->rect,option->palette.shadow().color(),1,&fill);
        } else {
            if (panel)
                painter->fillRect(option->rect, fill);
            else
                painter->drawRect(option->rect);
        }
        break; }

    case PE_FrameGroupBox:
        if (const QStyleOptionFrame *frame = qstyleoption_cast<const QStyleOptionFrame *>(option)) {

            const QStyleOptionFrameV2 *frame2 = qstyleoption_cast<const QStyleOptionFrameV2 *>(option);
            if (frame2 && !(frame2->features & QStyleOptionFrameV2::Flat)) {
              QPen oldPen = painter->pen();
              QRect r = frame->rect;
              painter->setPen(frame->palette.shadow().color());
              painter->fillRect(r.x(), r.y(), r.x() + r.width()-1,
                                r.y() + r.height() - windowsMobileFrameGroupBoxOffset,
              frame->palette.light());
              painter ->drawLine(r.topLeft() + QPoint(-2, 1), r.topRight()+ QPoint(0, 1));
              if (d->doubleControls)
                painter ->drawLine(r.topLeft() + QPoint(-2, 2), r.topRight()+ QPoint(0, 2));
              painter->setPen(oldPen);
            }
        }
        break;

   case PE_IndicatorCheckBox: {
        QBrush fill;
        QRect r = d->doubleControls ? option->rect.adjusted(0,1,0,-1) : option->rect;
        if (option->state & State_NoChange)
            fill = QBrush(option->palette.shadow().color(), Qt::Dense4Pattern);
        else if (option->state & State_Sunken)
            fill = option->palette.button();
        else if (option->state & State_Enabled)
            fill = option->palette.base();
        else
            fill = option->palette.background();
        painter->save();
        doRestore = true;
        if (d->doubleControls && (option->state & State_NoChange))
            painter->fillRect(r, fill);
        else
            painter->fillRect(option->rect, fill);
        painter->setPen(option->palette.shadow().color());
        painter->drawLine(r.topLeft(), r.topRight());
        painter->drawLine(r.topRight(), r.bottomRight());
        painter->drawLine(r.bottomLeft(), r.bottomRight());
        painter->drawLine(r.bottomLeft(), r.topLeft());
        if (d->doubleControls) {
            QRect r0 = r.adjusted(1, 1, -1, -1);
            painter->drawLine(r0.topLeft(), r0.topRight());
            painter->drawLine(r0.topRight(), r0.bottomRight());
            painter->drawLine(r0.bottomLeft(), r0.bottomRight());
            painter->drawLine(r0.bottomLeft(), r0.topLeft());
        }
        if (option->state & State_HasFocus) {
            painter->setPen(option->palette.highlight().color());
            QRect r2 = d->doubleControls ? r.adjusted(2, 2, -2, -2) : r.adjusted(1, 1, -1, -1);
            painter->drawLine(r2.topLeft(), r2.topRight());
            painter->drawLine(r2.topRight(), r2.bottomRight());
            painter->drawLine(r2.bottomLeft(), r2.bottomRight());
            painter->drawLine(r2.bottomLeft(), r2.topLeft());
            if (d->doubleControls) {
                QRect r3 = r2.adjusted(1, 1, -1, -1);
                painter->drawLine(r3.topLeft(), r3.topRight());
                painter->drawLine(r3.topRight(), r3.bottomRight());
                painter->drawLine(r3.bottomLeft(), r3.bottomRight());
                painter->drawLine(r3.bottomLeft(), r3.topLeft());
            }
            painter->setPen(option->palette.shadow().color());
        }
        //fall through...
    }
    case PE_IndicatorViewItemCheck:
    case PE_Q3CheckListIndicator: {
        if (!doRestore) {
            painter->save();
            doRestore = true;
        }
        if (element == PE_Q3CheckListIndicator || element == PE_IndicatorViewItemCheck) {
            painter->setPen(option->palette.shadow().color());
            if (option->state & State_NoChange)
                painter->setBrush(option->palette.brush(QPalette::Button));
            if (d->doubleControls) {
                QRect r = QRect(option->rect.x(), option->rect.y(), windowsMobileitemViewCheckBoxSize * 2, windowsMobileitemViewCheckBoxSize * 2);
                qDrawPlainRect(painter, r, option->palette.shadow().color(), 2);
            } else {
                QRect r = QRect(option->rect.x(), option->rect.y(), windowsMobileitemViewCheckBoxSize, windowsMobileitemViewCheckBoxSize);
                qDrawPlainRect(painter, r, option->palette.shadow().color(), 1);
            }            
            if (option->state & State_Enabled)
                d->imageChecked.setColor(1, option->palette.shadow().color().rgba());
            else
              d->imageChecked.setColor(1, option->palette.dark().color().rgba());
            if (!(option->state & State_Off)) {
                if (d->doubleControls)
                    painter->drawImage(option->rect.x(), option->rect.y(), d->imageChecked);
                else
                    painter->drawImage(option->rect.x() + 3, option->rect.y() + 3, d->imageChecked);
            }
        }
        else {
            if (option->state & State_NoChange)
                d->imageCheckedBold.setColor(1, option->palette.dark().color().rgba());
            else if (option->state & State_Enabled)
                d->imageCheckedBold.setColor(1, option->palette.shadow().color().rgba());
            else
                d->imageCheckedBold.setColor(1, option->palette.dark().color().rgba());
            if (!(option->state & State_Off)) {
                if (d->doubleControls)
                    painter->drawImage(option->rect.x() + 2, option->rect.y(), d->imageCheckedBold);
                else
                    painter->drawImage(option->rect.x() + 3, option->rect.y() + 3, d->imageCheckedBold);
            }
        }
        if (doRestore)
            painter->restore();
        break; }
    case PE_IndicatorRadioButton: {
        painter->save();

        if (option->state & State_HasFocus) {
            d->imageRadioButtonHighlighted.setColor(1, option->palette.shadow().color().rgba());
            d->imageRadioButtonHighlighted.setColor(2, option->palette.highlight().color().rgba());
            painter->drawImage(option->rect.x(), option->rect.y(), d->imageRadioButtonHighlighted);
        }
        else {
            d->imageRadioButton.setColor(1, option->palette.shadow().color().rgba());
            painter->drawImage(option->rect.x(), option->rect.y(), d->imageRadioButton);
        }
        if (option->state & (State_Sunken | State_On)) {
            if  (option->state & State_Enabled)
                d->imageRadioButtonChecked.setColor(1, option->palette.shadow().color().rgba());
            else
                d->imageRadioButtonChecked.setColor(1, option->palette.dark().color().rgba());

            static const int offset = d->doubleControls ? 6 : 3;
            painter->drawImage(option->rect.x() + offset, option->rect.y() + offset, d->imageRadioButtonChecked);
        }
        painter->restore();
        break; }
   case PE_PanelButtonCommand:
       if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton *>(option)) {
           QBrush fill;
           State flags = option->state;
           QPalette pal = option->palette;
           QRect r = option->rect;
           if ((flags & State_Sunken || flags & State_On) )
               fill = pal.brush(QPalette::Shadow);
           else
               fill = pal.brush(QPalette::Button);
            int singleLine = 1;
            int doubleLine = 2;
            if (d->doubleControls) {
                singleLine = 2;
                doubleLine = 4;
            }
           if (button->features & QStyleOptionButton::DefaultButton && flags & State_Sunken) {
               if (d->doubleControls) {
                 qDrawPlainRect(painter, r, pal.shadow().color(), 1, &fill);
                 qDrawPlainRect(painter, r.adjusted(1, 1, -1, 1), pal.shadow().color(), 1, &fill);
               }
               else {
                    qDrawPlainRect(painter, r, pal.shadow().color(), 1, &fill);
               }
           } else if (flags & (State_Raised | State_Sunken | State_On | State_Sunken)) {
               qDrawPlainRect(painter, r, pal.shadow().color(), singleLine, &fill);
           } else {
               painter->fillRect(r, fill);
           }
       }
       break;
   case PE_FrameDefaultButton: {
       painter->save();
       painter->setPen(option->palette.shadow().color());
       QRect rect = option->rect;
       if (d->doubleControls) {
           rect.adjust(1, 1, -2, -2);
           painter->drawRect(rect);
           painter->drawRect(rect.adjusted(1, 1, -1, -1));
       }

       else {
            rect.adjust(2, 2, -3, -3);
            painter->drawRect(rect);
       }
       painter->restore();
       break; }
   case PE_IndicatorSpinPlus:
   case PE_IndicatorSpinMinus: {
       QRect r = option->rect;
       int fw = proxy()->pixelMetric(PM_DefaultFrameWidth, option, widget)+2;
       QRect br = r.adjusted(fw, fw, -fw, -fw);
       int offset = (option->state & State_Sunken) ? 1 : 0;
       int step = (br.width() + 4) / 5;
       painter->fillRect(br.x() + offset, br.y() + offset +br.height() / 2 - step / 2,
                         br.width(), step, option->palette.buttonText());
       if (element == PE_IndicatorSpinPlus)
           painter->fillRect(br.x() + br.width() / 2 - step / 2 + offset, br.y() + offset+4,
                             step, br.height() - 7, option->palette.buttonText());
       break; }
    case PE_IndicatorSpinUp:
    case PE_IndicatorSpinDown: {
        painter->save();
            QPoint points[7];
            switch (element) {
                case PE_IndicatorSpinUp:
                    points[0] = QPoint(-2, -4);
                    points[1] = QPoint(-2, 2);
                    points[2] = QPoint(-1, -3);
                    points[3] = QPoint(-1, 1);
                    points[4] = QPoint(0, -2);
                    points[5] = QPoint(0, 0);
                    points[6] = QPoint(1, -1);
                break;
                case PE_IndicatorSpinDown:
                    points[0] = QPoint(0, -4);
                    points[1] = QPoint(0, 2);
                    points[2] = QPoint(-1, -3);
                    points[3] = QPoint(-1, 1);
                    points[4] = QPoint(-2, -2);
                    points[5] = QPoint(-2, 0);
                    points[6] = QPoint(-3, -1);
                break;
                default:
                break;
            }
            if (option->state & State_Sunken)
                painter->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal),
                proxy()->pixelMetric(PM_ButtonShiftVertical));
            if (option->state & State_Enabled) {
                painter->translate(option->rect.x() + option->rect.width() / 2,
                                   option->rect.y() + option->rect.height() / 2);
                painter->setPen(option->palette.buttonText().color());
                painter->drawLine(points[0], points[1]);
                painter->drawLine(points[2], points[3]);
                painter->drawLine(points[4], points[5]);
                painter->drawPoint(points[6]);
            } else {
                painter->translate(option->rect.x() + option->rect.width() / 2 + 1,
                                   option->rect.y() + option->rect.height() / 2 + 1);
                painter->setPen(option->palette.light().color());
                painter->drawLine(points[0], points[1]);
                painter->drawLine(points[2], points[3]);
                painter->drawLine(points[4], points[5]);
                painter->drawPoint(points[6]);
                painter->translate(-1, -1);
                painter->setPen(option->palette.mid().color());
                painter->drawLine(points[0], points[1]);
                painter->drawLine(points[2], points[3]);
                painter->drawLine(points[4], points[5]);
                painter->drawPoint(points[6]);
            }
        painter->restore();
        break; }

    case PE_IndicatorArrowUpBig:
    case PE_IndicatorArrowDownBig:
    case PE_IndicatorArrowLeftBig:
    case PE_IndicatorArrowRightBig:

    case PE_IndicatorArrowUp:
    case PE_IndicatorArrowDown:
    case PE_IndicatorArrowRight:
    case PE_IndicatorArrowLeft: {
            painter->save();

            if (d->doubleControls) {
                QColor color;
                if (option->state & State_Sunken)
                    color = option->palette.light().color();
                else
                    color = option->palette.buttonText().color();
                QImage image;
                int xoffset, yoffset;
                bool isTabBarArrow = widget && widget->parent()
                                   && widget->inherits("QToolButton")
                                   && widget->parent()->inherits("QTabBar");

                switch (element) {
                    case PE_IndicatorArrowUp:
                          image = d->imageArrowUp;
                          xoffset = 1;
                          yoffset = 12;
                          break;
                    case PE_IndicatorArrowDown:
                          image = d->imageArrowDown;
                          xoffset = 1;
                          yoffset =12;
                          break;
                    case PE_IndicatorArrowLeft:
                          image = d->imageArrowLeft;
                          xoffset = 8;
                          yoffset = isTabBarArrow ? 12 : 2;
                          break;
                    case PE_IndicatorArrowRight:
                          image = d->imageArrowRight;
                          xoffset = 8;
                          yoffset = isTabBarArrow ? 12 : 2;
                          break;
                     case PE_IndicatorArrowUpBig:
                          image = d->imageArrowUpBig;
                          xoffset = 3;
                          yoffset = 12;
                          break;
                    case PE_IndicatorArrowDownBig:
                          image = d->imageArrowDownBig;
                          xoffset = 2;
                          yoffset =12;
                          break;
                    case PE_IndicatorArrowLeftBig:
                          image = d->imageArrowLeftBig;
                          xoffset = 8;
                          yoffset = 2;
                          break;
                    case PE_IndicatorArrowRightBig:
                          image = d->imageArrowRightBig;
                          xoffset = 8;
                          yoffset = 2;
                          break;
                    default:
                          break;
                }
                image.setColor(1, color.rgba());
                painter->drawImage(option->rect.x() + xoffset, option->rect.y() + yoffset, image);
            }
            else {                
                 QPoint points[7];
                 switch (element) {
                     case PE_IndicatorArrowUp:
                     case PE_IndicatorArrowUpBig:
                          points[0] = QPoint(-3, 1);
                          points[1] = QPoint(3, 1);
                          points[2] = QPoint(-2, 0);
                          points[3] = QPoint(2, 0);
                          points[4] = QPoint(-1, -1);
                          points[5] = QPoint(1, -1);
                          points[6] = QPoint(0, -2);
                          break;
                     case PE_IndicatorArrowDown:
                     case PE_IndicatorArrowDownBig:
                         points[0] = QPoint(-3, -1);
                         points[1] = QPoint(3, -1);
                         points[2] = QPoint(-2, 0);
                         points[3] = QPoint(2, 0);
                         points[4] = QPoint(-1, 1);
                         points[5] = QPoint(1, 1);
                         points[6] = QPoint(0, 2);
                         break;
                     case PE_IndicatorArrowRight:
                     case PE_IndicatorArrowRightBig:
                         points[0] = QPoint(-2, -3);
                         points[1] = QPoint(-2, 3);
                         points[2] = QPoint(-1, -2);
                         points[3] = QPoint(-1, 2);
                         points[4] = QPoint(0, -1);
                         points[5] = QPoint(0, 1);
                         points[6] = QPoint(1, 0);
                         break;
                     case PE_IndicatorArrowLeft:
                     case PE_IndicatorArrowLeftBig:
                         points[0] = QPoint(0, -3);
                         points[1] = QPoint(0, 3);
                         points[2] = QPoint(-1, -2);
                         points[3] = QPoint(-1, 2);
                         points[4] = QPoint(-2, -1);
                         points[5] = QPoint(-2, 1);
                         points[6] = QPoint(-3, 0);
                         break;
                     default:
                     break;
                    }
                    if (option->state & State_Sunken)
                        painter->setPen(option->palette.light().color());
                    else
                        painter->setPen(option->palette.buttonText().color());
                    if (option->state & State_Enabled) {
                        painter->translate(option->rect.x() + option->rect.width() / 2,
                            option->rect.y() + option->rect.height() / 2 - 1);
                        painter->drawLine(points[0], points[1]);
                        painter->drawLine(points[2], points[3]);
                        painter->drawLine(points[4], points[5]);
                        painter->drawPoint(points[6]);
                    } else {
                        painter->translate(option->rect.x() + option->rect.width() / 2,
                            option->rect.y() + option->rect.height() / 2 - 1);
                        painter->setPen(option->palette.mid().color());
                        painter->drawLine(points[0], points[1]);
                        painter->drawLine(points[2], points[3]);
                        painter->drawLine(points[4], points[5]);
                        painter->drawPoint(points[6]);
                    }                
            }
        painter->restore();
        break; }
#ifndef QT_NO_TABWIDGET
    case PE_FrameTabWidget:
        if (const QStyleOptionTabWidgetFrame *tab = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(option)) {
          QRect rect = option->rect;
        QPalette pal = option->palette;
        painter->save();
        QBrush fill = pal.light();
          painter->fillRect(rect, fill);
          painter->setPen(pal.shadow().color());
          if (d->doubleControls) {
              QPen pen = painter->pen();
              pen.setWidth(2);
              pen.setCapStyle(Qt::FlatCap);
              painter->setPen(pen);
          }
          switch (tab->shape) {
            case QTabBar::RoundedNorth:
#ifdef Q_WS_WINCE_WM
                if (!d->wm65)
#endif
                {
                if (d->doubleControls)
                    painter->drawLine(rect.topLeft() + QPoint(0, 1), rect.topRight() + QPoint(0, 1));
                else
                    painter->drawLine(rect.topLeft(), rect.topRight());
                }
                break;
            case QTabBar::RoundedSouth:
#ifdef Q_WS_WINCE_WM
                if (!d->wm65)
#endif
                {
                if (d->doubleControls)
                  painter->drawLine(rect.bottomLeft(), rect.bottomRight());
                else
                  painter->drawLine(rect.bottomLeft(), rect.bottomRight());
                }
                break;
            case QTabBar::RoundedEast:
#ifdef Q_WS_WINCE_WM
                if (!d->wm65)
#endif
                painter->drawLine(rect.topRight(), rect.bottomRight());
                break;
            case QTabBar::RoundedWest:
#ifdef Q_WS_WINCE_WM
                if (!d->wm65)
#endif
                painter->drawLine(rect.topLeft(), rect.bottomLeft());
                break;
            case QTabBar::TriangularWest:
            case QTabBar::TriangularEast:
            case QTabBar::TriangularSouth:
            case QTabBar::TriangularNorth:
                if (d->doubleControls)
                  qDrawPlainRect(painter, rect.adjusted(0,-2,0,0), option->palette.shadow().color(),2,&pal.light());
                else
                  qDrawPlainRect(painter, rect, option->palette.shadow().color(),1,&pal.light());
                break;
            default:
                break;
            }
            painter->restore();
        }
        break;
#endif //QT_NO_TABBAR
#ifndef QT_NO_ITEMVIEWS
    case PE_PanelItemViewRow:
        if (const QStyleOptionViewItemV4 *vopt = qstyleoption_cast<const QStyleOptionViewItemV4 *>(option)) {
            QPalette::ColorGroup cg = vopt->state & QStyle::State_Enabled
                                      ? QPalette::Normal : QPalette::Disabled;
            if (cg == QPalette::Normal && !(vopt->state & QStyle::State_Active))
                cg = QPalette::Inactive;

            if ((vopt->state & QStyle::State_Selected) &&  proxy()->styleHint(QStyle::SH_ItemView_ShowDecorationSelected, option, widget))
                 d->drawPanelItemViewSelected(painter, vopt);
            else if (vopt->features & QStyleOptionViewItemV2::Alternate)
                painter->fillRect(vopt->rect, vopt->palette.brush(cg, QPalette::AlternateBase));
            else if (!(vopt->state & QStyle::State_Enabled))
                painter->fillRect(vopt->rect, vopt->palette.brush(cg, QPalette::Base));
        }
        break;
    case PE_PanelItemViewItem:
        if (const QStyleOptionViewItemV4 *vopt = qstyleoption_cast<const QStyleOptionViewItemV4 *>(option)) {
            QPalette::ColorGroup cg = vopt->state & QStyle::State_Enabled
                                      ? QPalette::Normal : QPalette::Disabled;
            if (cg == QPalette::Normal && !(vopt->state & QStyle::State_Active))
                cg = QPalette::Inactive;

            if (vopt->showDecorationSelected && (vopt->state & QStyle::State_Selected)) {
                d->drawPanelItemViewSelected(painter, vopt);
            } else {
                if (vopt->backgroundBrush.style() != Qt::NoBrush) {
                    QPointF oldBO = painter->brushOrigin();
                    painter->setBrushOrigin(vopt->rect.topLeft());
                    painter->fillRect(vopt->rect, vopt->backgroundBrush);
                    painter->setBrushOrigin(oldBO);
                }

                if (vopt->state & QStyle::State_Selected) {
                    QRect textRect = proxy()->subElementRect(QStyle::SE_ItemViewItemText,  option, widget);
                    d->drawPanelItemViewSelected(painter, vopt, textRect);
                }
            }
        }
        break;
#endif //QT_NO_ITEMVIEWS

    case PE_FrameWindow: {
        QPalette popupPal = option->palette;
        popupPal.setColor(QPalette::Light, option->palette.background().color());
        popupPal.setColor(QPalette::Midlight, option->palette.light().color());
        if (d->doubleControls)
            qDrawPlainRect(painter, option->rect, popupPal.shadow().color(),2,0);
        else
            qDrawPlainRect(painter, option->rect, popupPal.shadow().color(),1,0);
        break; }
    case PE_FrameTabBarBase: {
        break; }
    case PE_Widget:
        break;
    case PE_IndicatorMenuCheckMark: {
        int markW = option->rect.width() > 7 ? 7 : option->rect.width();
        int markH = markW;
        if (d->doubleControls)
            markW*=2;
            markH*=2;
        int posX = option->rect.x() + (option->rect.width() - markW)/2 + 1;
        int posY = option->rect.y() + (option->rect.height() - markH)/2;

        QVector<QLineF> a;
        a.reserve(markH);

        int i, xx, yy;
        xx = posX;
        yy = 3 + posY;
        for (i = 0; i < markW/2; ++i) {
            a << QLineF(xx, yy, xx, yy + 2);
            ++xx;
            ++yy;
        }
        yy -= 2;
        for (; i < markH; ++i) {
            a << QLineF(xx, yy, xx, yy + 2);
            ++xx;
            --yy;
        }
        if (!(option->state & State_Enabled) && !(option->state & State_On)) {
            int pnt;
            painter->setPen(option->palette.highlightedText().color());
            QPoint offset(1, 1);
            for (pnt = 0; pnt < a.size(); ++pnt)
                a[pnt].translate(offset.x(), offset.y());
            painter->drawLines(a);
            for (pnt = 0; pnt < a.size(); ++pnt)
                a[pnt].translate(offset.x(), offset.y());
        }
        painter->setPen(option->palette.text().color());
        painter->drawLines(a);
        break; }
    case PE_IndicatorBranch: {
        // Copied from the Windows style.
        static const int decoration_size = d->doubleControls ? 18 : 9;
        static const int ofsA  = d->doubleControls ?  4 : 2;
        static const int ofsB  = d->doubleControls ?  8 : 4;
        static const int ofsC  = d->doubleControls ? 12 : 6;
        static const int ofsD  = d->doubleControls ? 1 : 0;
        int mid_h = option->rect.x() + option->rect.width() / 2;
        int mid_v = option->rect.y() + option->rect.height() / 2;
        int bef_h = mid_h;
        int bef_v = mid_v;
        int aft_h = mid_h;
        int aft_v = mid_v;
        if (option->state & State_Children) {
            int delta = decoration_size / 2;
            bef_h -= delta;
            bef_v -= delta;
            aft_h += delta;
            aft_v += delta;
            QPen oldPen = painter->pen();
            QPen crossPen = oldPen;
            crossPen.setWidth(2);
            painter->setPen(crossPen);
            painter->drawLine(bef_h + ofsA + ofsD, bef_v + ofsB + ofsD, bef_h + ofsC + ofsD, bef_v + ofsB + ofsD);
            if (!(option->state & State_Open))
                painter->drawLine(bef_h + ofsB + ofsD, bef_v + ofsA + ofsD, bef_h + ofsB + ofsD, bef_v + ofsC + ofsD);
            painter->setPen(option->palette.dark().color());
            painter->drawRect(bef_h, bef_v, decoration_size - 1, decoration_size - 1);
            if (d->doubleControls)
                painter->drawRect(bef_h + 1, bef_v + 1, decoration_size - 3, decoration_size - 3);
            painter->setPen(oldPen);
        }
        QBrush brush(option->palette.dark().color(), Qt::Dense4Pattern);
        if (option->state & State_Item) {
            if (option->direction == Qt::RightToLeft)
                painter->fillRect(option->rect.left(), mid_v, bef_h - option->rect.left(), 1, brush);
            else
                painter->fillRect(aft_h, mid_v, option->rect.right() - aft_h + 1, 1, brush);
        }
        if (option->state & State_Sibling)
            painter->fillRect(mid_h, aft_v, 1, option->rect.bottom() - aft_v + 1, brush);
        if (option->state & (State_Open | State_Children | State_Item | State_Sibling))
            painter->fillRect(mid_h, option->rect.y(), 1, bef_v - option->rect.y(), brush);
        break; }
    case PE_Frame:
        qDrawPlainRect(painter, option->rect, option->palette.shadow().color(),
                       d->doubleControls ? 2 : 1, &option->palette.background());
        break;
    case PE_FrameLineEdit:
    case PE_FrameMenu:
        if (d->doubleControls)
            qDrawPlainRect(painter, option->rect, option->palette.shadow().color(),2);
        else
            qDrawPlainRect(painter, option->rect, option->palette.shadow().color(),1);
        break;
    case PE_FrameStatusBar:
        if (d->doubleControls)
            qDrawPlainRect(painter, option->rect, option->palette.shadow().color(),2,0);
        else
            qDrawPlainRect(painter, option->rect, option->palette.shadow().color(),1,0);
        break;

    default:
        QWindowsStyle::drawPrimitive(element, option, painter, widget);
        break;
    }
}

void QWindowsMobileStyle::drawControl(ControlElement element, const QStyleOption *option,
                                      QPainter *painter, const QWidget *widget) const {


   QWindowsMobileStylePrivate *d = const_cast<QWindowsMobileStylePrivate*>(d_func());

   
   painter->setClipping(false);
   switch (element) {
   case CE_MenuBarEmptyArea:
        painter->setClipping(true);
        QWindowsStyle::drawControl(element, option, painter, widget);
        break;
   case CE_PushButtonBevel:
        if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton *>(option)) {
            QRect br = button->rect;
            int dbi = proxy()->pixelMetric(PM_ButtonDefaultIndicator, button, widget);

            if (button->features & QStyleOptionButton::AutoDefaultButton)
                br.setCoords(br.left() + dbi, br.top() + dbi, br.right() - dbi, br.bottom() - dbi);
            QStyleOptionButton tmpBtn = *button;
            tmpBtn.rect = br;
            proxy()->drawPrimitive(PE_PanelButtonCommand, &tmpBtn, painter, widget);
            if (button->features & QStyleOptionButton::HasMenu) {
                int mbi = proxy()->pixelMetric(PM_MenuButtonIndicator, button, widget);
                QRect ir = button->rect;
                QStyleOptionButton newButton = *button;
                if (d->doubleControls)
                    newButton.rect = QRect(ir.right() - mbi, ir.height() - 30, mbi, ir.height() - 4);
                else
                    newButton.rect = QRect(ir.right() - mbi, ir.height() - 20, mbi, ir.height() - 4);
                proxy()->drawPrimitive(PE_IndicatorArrowDown, &newButton, painter, widget);
            }
            if (button->features & QStyleOptionButton::DefaultButton)
                proxy()->drawPrimitive(PE_FrameDefaultButton, option, painter, widget);
        }
        break;
   case CE_RadioButton:
   case CE_CheckBox:
       if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton *>(option)) {
           bool isRadio = (element == CE_RadioButton);
           QStyleOptionButton subopt = *button;
           subopt.rect = proxy()->subElementRect(isRadio ? SE_RadioButtonIndicator
               : SE_CheckBoxIndicator, button, widget);
           proxy()->drawPrimitive(isRadio ? PE_IndicatorRadioButton : PE_IndicatorCheckBox,
               &subopt, painter, widget);
           subopt.rect = proxy()->subElementRect(isRadio ? SE_RadioButtonContents
               : SE_CheckBoxContents, button, widget);
           proxy()->drawControl(isRadio ? CE_RadioButtonLabel : CE_CheckBoxLabel, &subopt, painter, widget);
           if (button->state & State_HasFocus) {
               QStyleOptionFocusRect fropt;
               fropt.QStyleOption::operator=(*button);
               fropt.rect = proxy()->subElementRect(isRadio ? SE_RadioButtonFocusRect
                   : SE_CheckBoxFocusRect, button, widget);
               proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, painter, widget);
           }
       }
       break;
   case CE_RadioButtonLabel:
   case CE_CheckBoxLabel:
       if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton *>(option)) {
           uint alignment = visualAlignment(button->direction, Qt::AlignLeft | Qt::AlignVCenter);
           if (!styleHint(SH_UnderlineShortcut, button, widget))
               alignment |= Qt::TextHideMnemonic;
           QPixmap pix;
           QRect textRect = button->rect;
           if (!button->icon.isNull()) {
               pix = button->icon.pixmap(button->iconSize, button->state & State_Enabled ? QIcon::Normal : QIcon::Disabled);
               proxy()->drawItemPixmap(painter, button->rect, alignment, pix);
               if (button->direction == Qt::RightToLeft)
                   textRect.setRight(textRect.right() - button->iconSize.width() - 4);
               else
                   textRect.setLeft(textRect.left() + button->iconSize.width() + 4);
           }
           if (!button->text.isEmpty()){
               if (button->state & State_Enabled)
                   proxy()->drawItemText(painter, textRect, alignment | Qt::TextShowMnemonic,
                   button->palette, false, button->text, QPalette::WindowText);
               else
                   proxy()->drawItemText(painter, textRect, alignment | Qt::TextShowMnemonic,
                   button->palette, false, button->text, QPalette::Mid);
           }
       }
       break;
#ifndef QT_NO_PROGRESSBAR
    case CE_ProgressBarGroove:
        if (d->doubleControls)
            qDrawPlainRect(painter, option->rect, option->palette.shadow().color(), 2, &option->palette.brush(QPalette::Window));
        else
            qDrawPlainRect(painter, option->rect, option->palette.shadow().color(), 1, &option->palette.brush(QPalette::Window));
        break;
#endif //QT_NO_PROGRESSBAR
#ifndef QT_NO_TABBAR
    case CE_TabBarTab:
        if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option)) {
            proxy()->drawControl(CE_TabBarTabShape, tab, painter, widget);
            proxy()->drawControl(CE_TabBarTabLabel, tab, painter, widget);
        }
        break;
    case CE_TabBarTabShape:
        if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option)) {
            
            if (tab->shape == QTabBar::RoundedNorth || tab->shape == QTabBar::RoundedEast ||
                tab->shape == QTabBar::RoundedSouth || tab->shape == QTabBar::RoundedWest) {
                    d->drawTabBarTab(painter, tab);
            } else {
                QCommonStyle::drawControl(element, option, painter, widget);
            }
            break; }

#endif // QT_NO_TABBAR

#ifndef QT_NO_TOOLBAR
    case CE_ToolBar:
        if (const QStyleOptionToolBar *toolBar = qstyleoption_cast<const QStyleOptionToolBar *>(option)) {
        QRect rect = option->rect;
        painter->save();
        painter->setPen(option->palette.dark().color());
        painter->fillRect(rect,option->palette.button());
        if (d->doubleControls) {
            QPen pen = painter->pen();
            pen.setWidth(4);
            painter->setPen(pen);
        }
        if (toolBar->toolBarArea == Qt::TopToolBarArea)
            painter->drawLine(rect.bottomLeft(), rect.bottomRight());
        else
            painter->drawLine(rect.topLeft(), rect.topRight());
        painter->restore();
        break; }
#endif //QT_NO_TOOLBAR
    case CE_Header:
        if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) {
            QRegion clipRegion = painter->clipRegion();
            painter->setClipRect(option->rect);
            proxy()->drawControl(CE_HeaderSection, header, painter, widget);
            QStyleOptionHeader subopt = *header;
            subopt.rect = proxy()->subElementRect(SE_HeaderLabel, header, widget);
            if (header->state & State_Sunken) 
                subopt.palette.setColor(QPalette::ButtonText, header->palette.brightText().color());
            subopt.state |= QStyle::State_On;
            if (subopt.rect.isValid())
                proxy()->drawControl(CE_HeaderLabel, &subopt, painter, widget);
            if (header->sortIndicator != QStyleOptionHeader::None) {
                subopt.rect = proxy()->subElementRect(SE_HeaderArrow, option, widget);
                proxy()->drawPrimitive(PE_IndicatorHeaderArrow, &subopt, painter, widget);
            }
            painter->setClipRegion(clipRegion);
        }
        break;

    case CE_HeaderSection:
        if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) {
            QBrush fill;
            QColor color;
            QRect rect = option->rect;
            painter->setPen(option->palette.shadow().color());

            int penSize = 1;

            if (d->doubleControls) {
                penSize = 2;
                QPen pen = painter->pen();
                pen.setWidth(2);
                pen.setCapStyle(Qt::FlatCap);
                painter->setPen(pen);
            }

            //fix Frame

            if (header->position == QStyleOptionHeader::End
                || (header->position == QStyleOptionHeader::OnlyOneSection
                && !header->text.isEmpty()))
                if (Qt::Horizontal == header->orientation )
                  rect.adjust(0, 0, penSize, 0);
                else
                  rect.adjust(0, 0, 0, penSize);

            if (option->state & State_Sunken) {
                fill = option->palette.brush(QPalette::Shadow);
                color = option->palette.light().color();
                painter->drawLine(rect.bottomLeft(), rect.bottomRight());
                painter->drawLine(rect.topRight(), rect.bottomRight());
                rect.adjust(0, 0, -penSize, -penSize);
            }
            else {
                fill = option->palette.brush(QPalette::Button);
                color = option->palette.shadow().color();
                if (Qt::Horizontal == header->orientation )
                    rect.adjust(-penSize, 0, 0, 0);
                else
                  rect.adjust(0, -penSize, 0, 0);
            }
            if (Qt::Horizontal == header->orientation )
                    rect.adjust(0,-penSize,0,0);
                else
                  rect.adjust(-penSize, 0, 0, 0);

            if (option->state & State_Sunken) {
                qDrawPlainRect(painter, rect, color, penSize, &fill);
            } else {
                //Corner
                rect.adjust(-penSize, 0, 0, 0);
                qDrawPlainRect(painter, rect, color, penSize, &fill);
            }

            //Hack to get rid of some double lines... StyleOptions need a clean flag for that
             rect = option->rect;
#ifndef QT_NO_SCROLLAREA
             if (const QAbstractScrollArea *abstractScrollArea = qobject_cast<const QAbstractScrollArea *> (widget) ) {
                 QRect rectScrollArea = abstractScrollArea->geometry();
                 if (Qt::Horizontal == header->orientation )
                     if ((rectScrollArea.right() - rect.right() ) > 1)
                         painter->drawLine(rect.topRight(), rect.bottomRight());
                     else ;
                 else
                     if ((rectScrollArea.bottom() - rect.bottom() ) > 1)
                         painter->drawLine(rect.bottomLeft(), rect.bottomRight());
             }
#endif // QT_NO_SCROLLAREA
            break;
        }
#ifndef QT_NO_COMBOBOX
    case CE_ComboBoxLabel:
        // This is copied from qcommonstyle.cpp with the difference, that
        // the editRect isn't adjusted when calling drawItemText.
        if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
            QRect editRect = proxy()->subControlRect(CC_ComboBox, cb, SC_ComboBoxEditField, widget);
            painter->save();
            painter->setClipRect(editRect);
            if (!cb->currentIcon.isNull()) {
                QIcon::Mode mode = cb->state & State_Enabled ? QIcon::Normal
                                                             : QIcon::Disabled;
                QPixmap pixmap = cb->currentIcon.pixmap(cb->iconSize, mode);
                QRect iconRect(editRect);
                iconRect.setWidth(cb->iconSize.width() + 4);
                iconRect = alignedRect(cb->direction,
                                       Qt::AlignLeft | Qt::AlignVCenter,
                                       iconRect.size(), editRect);
                if (cb->editable)
                    painter->fillRect(iconRect, option->palette.brush(QPalette::Base));
                proxy()->drawItemPixmap(painter, iconRect, Qt::AlignCenter, pixmap);

                if (cb->direction == Qt::RightToLeft)
                    editRect.translate(-4 - cb->iconSize.width(), 0);
                else
                    editRect.translate(cb->iconSize.width() + 4, 0);
            }
            if (!cb->currentText.isEmpty() && !cb->editable) {
                proxy()->drawItemText(painter, editRect,
                             visualAlignment(cb->direction, Qt::AlignLeft | Qt::AlignVCenter),
                             cb->palette, cb->state & State_Enabled, cb->currentText);
            }
            painter->restore();
        }
        break;
#endif // QT_NO_COMBOBOX
#ifndef QT_NO_DOCKWIDGET
    case CE_DockWidgetTitle:
        if (const QStyleOptionDockWidget *dwOpt = qstyleoption_cast<const QStyleOptionDockWidget *>(option)) {
            const QStyleOptionDockWidgetV2 *v2
                = qstyleoption_cast<const QStyleOptionDockWidgetV2*>(option);
            bool verticalTitleBar = v2 == 0 ? false : v2->verticalTitleBar;

            QRect rect = dwOpt->rect;
            QRect r = rect;

            if (verticalTitleBar) {
                QSize s = r.size();
                s.transpose();
                r.setSize(s);

                painter->save();
                painter->translate(r.left(), r.top() + r.width());
                painter->rotate(-90);
                painter->translate(-r.left(), -r.top());
            }

            bool floating = false;
            bool active = dwOpt->state & State_Active;
            int menuOffset = 0; //used to center text when floated
            QColor inactiveCaptionTextColor = option->palette.highlightedText().color();
            if (dwOpt->movable) {
                QColor left, right;

                //Titlebar gradient
                if (widget && widget->isWindow()) {
                    floating = true;
                    if (active) {
                        right = option->palette.highlight().color();
                        left = right.lighter(125);
                    } else {
                        left  = option->palette.highlight().color().lighter(125);
                        right = QColor(0xff, 0xff, 0xff);
                    }
                    menuOffset = 2;
                    QBrush fillBrush(left);
                    if (left != right) {
                        QPoint p1(r.x(), r.top() + r.height()/2);
                        QPoint p2(rect.right(), r.top() + r.height()/2);
                        QLinearGradient lg(p1, p2);
                        lg.setColorAt(0, left);
                        lg.setColorAt(1, right);
                        fillBrush = lg;
                    }
                    painter->fillRect(r.adjusted(0, 0, 0, -3), fillBrush);
                } else {
                    painter->fillRect(r.adjusted(0, 0, 0, -3), option->palette.button().color());
                }
                painter->setPen(dwOpt->palette.color(QPalette::Light));
                if (!widget || !widget->isWindow()) {
                    painter->drawLine(r.topLeft(), r.topRight());
                    painter->setPen(dwOpt->palette.color(QPalette::Dark));
                    painter->drawLine(r.bottomLeft(), r.bottomRight());            }
            }
            if (!dwOpt->title.isEmpty()) {
                QFont oldFont = painter->font();
                QFont newFont = oldFont;
                if (newFont.pointSize() > 2)
                    newFont.setPointSize(newFont.pointSize() - 2);
                if (floating)
                    newFont.setBold(true);
                painter->setFont(newFont);
                QPalette palette = dwOpt->palette;
                palette.setColor(QPalette::Window, inactiveCaptionTextColor);
                QRect titleRect = proxy()->subElementRect(SE_DockWidgetTitleBarText, option, widget);
                if (verticalTitleBar) {
                    titleRect = QRect(r.left() + rect.bottom()
                                        - titleRect.bottom(),
                                    r.top() + titleRect.left() - rect.left(),
                                    titleRect.height(), titleRect.width());
                }
                proxy()->drawItemText(painter, titleRect,
                            Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic, palette,
                            dwOpt->state & State_Enabled, dwOpt->title,
                            floating ? (active ? QPalette::BrightText : QPalette::Window) : QPalette::WindowText);
                painter->setFont(oldFont);
            }
            if (verticalTitleBar)
                painter->restore();
        }
        return;
#endif // QT_NO_DOCKWIDGET

    case CE_PushButtonLabel:
        if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton *>(option)) {
            painter->save();
            QRect ir = button->rect;
            QPalette::ColorRole colorRole;
            uint tf = Qt::AlignVCenter | Qt::TextShowMnemonic;
            if (!styleHint(SH_UnderlineShortcut, button, widget))
                tf |= Qt::TextHideMnemonic;

            if (button->state & (State_On | State_Sunken))
                colorRole = QPalette::Light;
            else
                colorRole = QPalette::ButtonText;

            if (!button->icon.isNull()) {
                QIcon::Mode mode = button->state & State_Enabled ? QIcon::Normal
                    : QIcon::Disabled;
                if (mode == QIcon::Normal && button->state & State_HasFocus)
                    mode = QIcon::Active;
                QIcon::State state = QIcon::Off;
                if (button->state & State_On)
                    state = QIcon::On;
                QPixmap pixmap = button->icon.pixmap(button->iconSize, mode, state);
                int pixw = pixmap.width();
                int pixh = pixmap.height();
                //Center the icon if there is no text

                QPoint point;
                if (button->text.isEmpty()) {
                    point = QPoint(ir.x() + ir.width() / 2 - pixw / 2,
                        ir.y() + ir.height() / 2 - pixh / 2);
                } else {
                    point = QPoint(ir.x() + 2, ir.y() + ir.height() / 2 - pixh / 2);
                }
                if (button->direction == Qt::RightToLeft)
                    point.rx() += pixw;

                if ((button->state & (State_On | State_Sunken)) && button->direction == Qt::RightToLeft)
                    point.rx() -= proxy()->pixelMetric(PM_ButtonShiftHorizontal, option, widget) * 2;

                painter->drawPixmap(visualPos(button->direction, button->rect, point), pixmap);

                if (button->direction == Qt::RightToLeft)
                    ir.translate(-4, 0);
                else
                    ir.translate(pixw + 4, 0);
                ir.setWidth(ir.width() - (pixw + 4));
                // left-align text if there is
                if (!button->text.isEmpty())
                    tf |= Qt::AlignLeft;
            } else {
                tf |= Qt::AlignHCenter;
            }
            if (button->state & State_Enabled)
                proxy()->drawItemText(painter, ir, tf, button->palette, true, button->text, colorRole);
            else
            proxy()->drawItemText(painter, ir, tf, button->palette, true, button->text, QPalette::Mid);
            painter->restore();
        }
        break;
        default:
            QWindowsStyle::drawControl(element, option, painter, widget);
            break;
    }
}

void QWindowsMobileStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex *option,
                                             QPainter *painter, const QWidget *widget) const {

    painter->setClipping(false);
    QWindowsMobileStylePrivate *d = const_cast<QWindowsMobileStylePrivate*>(d_func());

    switch (control) {
#ifndef QT_NO_SLIDER
    case CC_Slider:
        if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
            int thickness  = proxy()->pixelMetric(PM_SliderControlThickness, slider, widget);
            int len        = proxy()->pixelMetric(PM_SliderLength, slider, widget);
            int ticks = slider->tickPosition;
            QRect groove = proxy()->subControlRect(CC_Slider, slider, SC_SliderGroove, widget);
            QRect handle = proxy()->subControlRect(CC_Slider, slider, SC_SliderHandle, widget);

            if ((slider->subControls & SC_SliderGroove) && groove.isValid()) {
                int mid = thickness / 2;
                if (ticks & QSlider::TicksAbove)
                    mid += len / 8;
                if (ticks & QSlider::TicksBelow)
                    mid -= len / 8;

                painter->setPen(slider->palette.shadow().color());
                if (slider->orientation == Qt::Horizontal) {
                    qDrawPlainRect(painter, groove.x(), groove.y() + mid - 2,
                        groove.width(), 4, option->palette.shadow().color(),1,0);
                } else {
                    qDrawPlainRect(painter, groove.x()+mid-2, groove.y(),
                        4, groove.height(), option->palette.shadow().color(),1,0);
                }
            }
            if (slider->subControls & SC_SliderTickmarks) {
                QStyleOptionSlider tmpSlider = *slider;
                tmpSlider.subControls = SC_SliderTickmarks;
                QCommonStyle::drawComplexControl(control, &tmpSlider, painter, widget);
            }

            if (slider->subControls & SC_SliderHandle) {
                const QColor c0 = slider->palette.shadow().color();
                const QColor c1 = slider->palette.dark().color();
                const QColor c3 = slider->palette.midlight().color();
                const QColor c4 = slider->palette.dark().color();
                QBrush handleBrush;

                if (slider->state & State_Enabled) {
                    handleBrush = slider->palette.color(QPalette::Light);
                } else {
                    handleBrush = QBrush(slider->palette.color(QPalette::Shadow),
                        Qt::Dense4Pattern);
                }
                int x = handle.x(), y = handle.y(),
                    wi = handle.width(), he = handle.height();
                int x1 = x;
                int x2 = x+wi-1;
                int y1 = y;
                int y2 = y+he-1;

                Qt::Orientation orient = slider->orientation;
                bool tickAbove = slider->tickPosition == QSlider::TicksAbove;
                bool tickBelow = slider->tickPosition == QSlider::TicksBelow;

                if (slider->state & State_HasFocus) {
                    QStyleOptionFocusRect fropt;
                    fropt.QStyleOption::operator=(*slider);
                    fropt.rect = proxy()->subElementRect(SE_SliderFocusRect, slider, widget);
                    proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, painter, widget);
                }
                if ((tickAbove && tickBelow) || (!tickAbove && !tickBelow)) {
                    Qt::BGMode oldMode = painter->backgroundMode();
                    painter->setBackgroundMode(Qt::OpaqueMode);
                    qDrawPlainRect(painter, QRect(x, y, wi, he)
                        ,slider->palette.shadow().color(),1,&handleBrush);
                    painter->setBackgroundMode(oldMode);
                    QBrush fill = QBrush(option->palette.light().color(), Qt::Dense4Pattern);
                    if (slider->state & State_Sunken)
                        painter->fillRect(QRectF(x1 + 2, y1 + 2, x2 - x1 - 3, y2 - y1 - 3),fill);
                    return;
                }
                QSliderDirection dir;
                if (orient == Qt::Horizontal)
                    if (tickAbove)
                        dir = SliderUp;
                    else
                        dir = SliderDown;
                else
                    if (tickAbove)
                        dir = SliderLeft;
                    else
                        dir = SliderRight;
                QPolygon polygon;
                int d = 0;
                switch (dir) {
                  case SliderUp:
                      x2++;
                      y1 = y1 + wi / 2;
                      d =  (wi + 1) / 2 - 1;
                      polygon.setPoints(5, x1, y1, x1, y2, x2, y2, x2, y1, x1 + d,y1 - d);
                      break;
                  case SliderDown:
                      x2++;
                      y2 = y2 - wi/2;
                      d =  (wi + 1) / 2 - 1;
                      polygon.setPoints(5, x1, y1, x1, y2, x1 + d,y2 + d, x2, y2, x2, y1);
                  break;
                      case SliderLeft:
                      d =  (he + 1) / 2 - 1;
                      x1 = x1 + he/2;
                      polygon.setPoints(5, x1, y1, x1 - d, y1 + d, x1,y2, x2, y2, x2, y1);
                      y1--;
                      break;
                  case SliderRight:
                      d =  (he + 1) / 2 - 1;
                      x2 = x2 - he/2;
                      polygon.setPoints(5, x1, y1, x1, y2, x2,y2, x2 + d, y1 + d, x2, y1);
                      y1--;
                      break;
                }
                QBrush oldBrush = painter->brush();
                painter->setPen(Qt::NoPen);
                painter->setBrush(handleBrush);
                Qt::BGMode oldMode = painter->backgroundMode();
                painter->setBackgroundMode(Qt::OpaqueMode);
                painter->drawRect(x1, y1, x2-x1+1, y2-y1+1);
                painter->drawPolygon(polygon);
                QBrush fill = QBrush(option->palette.button().color(), Qt::Dense4Pattern);
                painter->setBrush(oldBrush);
                painter->setBackgroundMode(oldMode);
                if (slider->state & State_Sunken)
                    painter->fillRect(QRectF(x1, y1, x2 - x1 + 1, y2 - y1 + 1),fill);

                if (dir != SliderUp) {
                    painter->setPen(c0);
                    painter->drawLine(x1, y1, x2, y1);
                }
                if (dir != SliderLeft) {
                    painter->setPen(c0);
                    painter->drawLine(x1, y1, x1, y2);
                }
                if (dir != SliderRight) {
                    painter->setPen(c0);
                    painter->drawLine(x2, y1, x2, y2);
                }
                if (dir != SliderDown) {
                    painter->setPen(c0);
                    painter->drawLine(x1, y2, x2, y2);
                }
                switch (dir) {
                  case SliderUp:
                      if (slider->state & State_Sunken)
                          painter->fillRect(QRectF(x1 + 3, y1 - d + 2, x2 - x1 - 4, y1),fill);
                      painter->setPen(c0);
                      painter->drawLine(x1, y1, x1 + d, y1 - d);
                      d = wi - d - 1;
                      painter->drawLine(x2, y1, x2 -d , y1 -d );
                      d--;
                      break;
                  case SliderDown:
                      if (slider->state & State_Sunken)
                      painter->fillRect(QRectF(x1+3, y2 - d, x2 - x1  -4,y2 - 8),fill);
                      painter->setPen(c0);
                      painter->drawLine(x1, y2, x1 + d, y2 + d);
                      d = wi - d - 1;
                      painter->drawLine(x2, y2, x2 - d, y2 + d);
                      d--;
                      break;
                  case SliderLeft:
                      if (slider->state & State_Sunken)
                          painter->fillRect(QRectF(x1 - d + 2, y1 + 2, x1, y2 - y1 - 3),fill);
                      painter->setPen(c0);
                      painter->drawLine(x1, y1, x1 - d, y1 + d);
                      d = he - d - 1;
                      painter->drawLine(x1, y2, x1 - d, y2 - d);
                      d--;
                      break;
                  case SliderRight:
                      if (slider->state & State_Sunken)
                          painter->fillRect(QRectF(x2 - d - 4, y1 + 2, x2 - 4, y2 - y1 - 3),fill);
                      painter->setPen(c0);
                      painter->drawLine(x2, y1, x2 + d, y1 + d);
                      painter->setPen(c0);
                      d = he - d - 1;
                      painter->drawLine(x2, y2, x2 + d, y2 - d);
                      d--;
                      break;
                }
            }
        }
        break;
#endif //QT_NO_SLIDER
#ifndef QT_NO_SCROLLBAR
    case CC_ScrollBar:
        painter->save();
        painter->setPen(option->palette.shadow().color());
        if (d->doubleControls) {
            QPen pen = painter->pen();
            pen.setWidth(2);
            pen.setCapStyle(Qt::SquareCap);
            painter->setPen(pen);
        }
        if (const QStyleOptionSlider *scrollbar = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
            d->drawScrollbarGroove(painter, scrollbar);
            // Make a copy here and reset it for each primitive.
            QStyleOptionSlider newScrollbar = *scrollbar;
            State saveFlags = scrollbar->state;
            //Check if the scrollbar is part of an abstractItemView and draw the frame according
            bool drawCompleteFrame = true;
            bool secondScrollBar = false;
            if (widget)
                if (QWidget *parent = widget->parentWidget()) {
                    if (QAbstractScrollArea *abstractScrollArea = qobject_cast<QAbstractScrollArea *>(parent->parentWidget())) {
                        drawCompleteFrame = (abstractScrollArea->frameStyle() == QFrame::NoFrame) ||  (abstractScrollArea->frameStyle() == QFrame::StyledPanel);
                        secondScrollBar = (abstractScrollArea->horizontalScrollBar()->isVisible()
                            && abstractScrollArea->verticalScrollBar()->isVisible()) ;
                    }
#ifndef QT_NO_LISTVIEW
                    if (QListView *listView = qobject_cast<QListView *>(parent->parentWidget()))
                            drawCompleteFrame = false;
#endif
                }
                if (scrollbar->minimum == scrollbar->maximum)
                    saveFlags |= State_Enabled;
                if (scrollbar->subControls & SC_ScrollBarSubLine) {
                    newScrollbar.state = saveFlags;
                    newScrollbar.rect = proxy()->subControlRect(control, &newScrollbar, SC_ScrollBarSubLine, widget);
                    if (newScrollbar.rect.isValid()) {
                        if (!(scrollbar->activeSubControls & SC_ScrollBarSubLine))
                            newScrollbar.state &= ~(State_Sunken | State_MouseOver);
                        d->drawScrollbarHandleUp(painter, &newScrollbar, drawCompleteFrame, secondScrollBar);
                    }
                }
                if (scrollbar->subControls & SC_ScrollBarAddLine) {
                    newScrollbar.rect = scrollbar->rect;
                    newScrollbar.state = saveFlags;
                    newScrollbar.rect = proxy()->subControlRect(control, &newScrollbar, SC_ScrollBarAddLine, widget);
                    if (newScrollbar.rect.isValid()) {
                        if (!(scrollbar->activeSubControls & SC_ScrollBarAddLine))
                            newScrollbar.state &= ~(State_Sunken | State_MouseOver);
                        d->drawScrollbarHandleDown(painter, &newScrollbar, drawCompleteFrame, secondScrollBar);
                    }
                }
                if (scrollbar->subControls & SC_ScrollBarSlider) {

                      newScrollbar.rect = scrollbar->rect;
                      newScrollbar.state = saveFlags;
                      newScrollbar.rect = proxy()->subControlRect(control, &newScrollbar, SC_ScrollBarSlider, widget);

                      if (newScrollbar.rect.isValid()) {
                          if (!(scrollbar->activeSubControls & SC_ScrollBarSlider))
                              newScrollbar.state &= ~(State_Sunken | State_MouseOver);
                          d->drawScrollbarGrip(painter, &newScrollbar, option, drawCompleteFrame);
                      }
                }
        }
        painter->restore();
        break;
#endif // QT_NO_SCROLLBAR
    case CC_ToolButton:
        if (const QStyleOptionToolButton *toolbutton
                = qstyleoption_cast<const QStyleOptionToolButton *>(option)) {
            QRect button, menuarea;
            bool isTabWidget = false;
#ifndef QT_NO_TABWIDGET
            if (widget)
                if (QWidget *parent = widget->parentWidget())
                    isTabWidget = (qobject_cast<QTabWidget *>(parent->parentWidget()));
#endif //QT_NO_TABWIDGET

            button = proxy()->subControlRect(control, toolbutton, SC_ToolButton, widget);
            menuarea = proxy()->subControlRect(control, toolbutton, SC_ToolButtonMenu, widget);
            State buttonFlags = toolbutton->state;
            if (buttonFlags & State_AutoRaise) {
                if (!(buttonFlags & State_MouseOver)) {
                    buttonFlags &= ~State_Raised;
                }
            }
            State menuFlags = buttonFlags;
            if (toolbutton->activeSubControls & SC_ToolButton)
                buttonFlags |= State_Sunken;
            if (toolbutton->activeSubControls & SC_ToolButtonMenu)
                menuFlags |= State_On;
            QStyleOption tool(0);
            tool.palette = toolbutton->palette;
            if (toolbutton->subControls & SC_ToolButton) {
                    tool.rect = button;
                    tool.state = buttonFlags;
                    proxy()->drawPrimitive(PE_PanelButtonTool, &tool, painter, widget);
            }
            if (toolbutton->subControls & SC_ToolButtonMenu) {
                tool.rect = menuarea;
                tool.state = buttonFlags & State_Enabled;
                QStyleOption toolMenu(0);
                toolMenu = *toolbutton;
                toolMenu.state = menuFlags;
                if (buttonFlags & State_Sunken)
                  proxy()->drawPrimitive(PE_PanelButtonTool, &toolMenu, painter, widget);
                QStyleOption arrowOpt(0);
                arrowOpt.rect = tool.rect;
                arrowOpt.palette = tool.palette;
                State flags = State_None;
                if (menuFlags & State_Enabled)
                    flags |= State_Enabled;
                if ((menuFlags & State_On) && !(buttonFlags & State_Sunken)) {
                    flags |= State_Sunken;
                    painter->fillRect(menuarea, option->palette.shadow());
                }
                arrowOpt.state = flags;
                proxy()->drawPrimitive(PE_IndicatorArrowDown, &arrowOpt, painter, widget);
            }
            if (toolbutton->state & State_HasFocus) {
                QStyleOptionFocusRect focusRect;
                focusRect.QStyleOption::operator=(*toolbutton);
                focusRect.rect.adjust(3, 3, -3, -3);
                if (toolbutton->features & QStyleOptionToolButton::Menu)
                    focusRect.rect.adjust(0, 0, -proxy()->pixelMetric(QStyle::PM_MenuButtonIndicator,
                                                         toolbutton, widget), 0);
                proxy()->drawPrimitive(PE_FrameFocusRect, &focusRect, painter, widget);
            }
            QStyleOptionToolButton label = *toolbutton;
            if (isTabWidget)
                label.state = toolbutton->state;
            else
              label.state = toolbutton->state & State_Enabled;
            int fw = proxy()->pixelMetric(PM_DefaultFrameWidth, option, widget);
            label.rect = button.adjusted(fw, fw, -fw, -fw);
            proxy()->drawControl(CE_ToolButtonLabel, &label, painter, widget);
        }
        break;

#ifndef QT_NO_GROUPBOX
    case CC_GroupBox:
        if (const QStyleOptionGroupBox *groupBox = qstyleoption_cast<const QStyleOptionGroupBox *>(option)) {
            // Draw frame
            painter->save();
            QFont font = painter->font();
            font.setBold(true);
            painter->setFont(font);
            QStyleOptionGroupBox groupBoxFont = *groupBox;
            groupBoxFont.fontMetrics = QFontMetrics(font);
            QRect textRect = proxy()->subControlRect(CC_GroupBox, &groupBoxFont, SC_GroupBoxLabel, widget);
            QRect checkBoxRect = proxy()->subControlRect(CC_GroupBox, option, SC_GroupBoxCheckBox, widget).adjusted(0,0,0,0);
            if (groupBox->subControls & QStyle::SC_GroupBoxFrame) {
                QStyleOptionFrameV2 frame;
                frame.QStyleOption::operator=(*groupBox);
                frame.features = groupBox->features;
                frame.lineWidth = groupBox->lineWidth;
                frame.midLineWidth = groupBox->midLineWidth;
                frame.rect = proxy()->subControlRect(CC_GroupBox, option, SC_GroupBoxFrame, widget);
                painter->save();
                QRegion region(groupBox->rect);
                if (!groupBox->text.isEmpty()) {
                    bool ltr = groupBox->direction == Qt::LeftToRight;
                    QRect finalRect = checkBoxRect.united(textRect);
                    if (groupBox->subControls & QStyle::SC_GroupBoxCheckBox)
                        finalRect.adjust(ltr ? -4 : 0, 0, ltr ? 0 : 4, 0);
                    region -= finalRect;
                }
                proxy()->drawPrimitive(PE_FrameGroupBox, &frame, painter, widget);
                painter->restore();
            }
             // Draw checkbox
            if (groupBox->subControls & SC_GroupBoxCheckBox) {
                QStyleOptionButton box;
                box.QStyleOption::operator=(*groupBox);
                box.rect = checkBoxRect;
                proxy()->drawPrimitive(PE_IndicatorCheckBox, &box, painter, widget);
            }
            // Draw title
            if ((groupBox->subControls & QStyle::SC_GroupBoxLabel) && !groupBox->text.isEmpty()) {
                QColor textColor = groupBox->textColor;
                if (textColor.isValid())
                    painter->setPen(textColor);
                else
                    painter->setPen(groupBox->palette.link().color());
                painter->setPen(groupBox->palette.link().color());

                int alignment = int(groupBox->textAlignment);
                if (!styleHint(QStyle::SH_UnderlineShortcut, option, widget))
                    alignment |= Qt::TextHideMnemonic;

                if (groupBox->state & State_Enabled)
                    proxy()->drawItemText(painter, textRect,  Qt::TextShowMnemonic | Qt::AlignHCenter | alignment,
                    groupBox->palette, true, groupBox->text,
                    textColor.isValid() ? QPalette::NoRole : QPalette::Link);
                else
                    proxy()->drawItemText(painter, textRect,  Qt::TextShowMnemonic | Qt::AlignHCenter | alignment,
                    groupBox->palette, true, groupBox->text, QPalette::Mid);
                if (groupBox->state & State_HasFocus) {
                    QStyleOptionFocusRect fropt;
                    fropt.QStyleOption::operator=(*groupBox);
                    fropt.rect = textRect;
                    proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, painter, widget);
                }
            }
            painter->restore();
        }
        break;
#endif //QT_NO_GROUPBOX

#ifndef QT_NO_COMBOBOX
    case CC_ComboBox:
        if (const QStyleOptionComboBox *cmb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
            QBrush editBrush = cmb->palette.brush(QPalette::Base);
            if ((cmb->subControls & SC_ComboBoxFrame) && cmb->frame)
                qDrawPlainRect(painter, option->rect, option->palette.shadow().color(), proxy()->pixelMetric(PM_ComboBoxFrameWidth, option, widget), &editBrush);
            else
                painter->fillRect(option->rect, editBrush);
            State flags = State_None;
            QRect ar = proxy()->subControlRect(CC_ComboBox, cmb, SC_ComboBoxArrow, widget);
            if ((option->state & State_On)) {
                painter->fillRect(ar.adjusted(0, 0, 1, 1),cmb->palette.brush(QPalette::Shadow));
            }
            if (d->doubleControls)
                ar.adjust(5, 0, 5, 0);
            else
                ar.adjust(2, 0, -2, 0);
            if (option->state & State_Enabled)
                flags |= State_Enabled;
            if (option->state & State_On)
                flags |= State_Sunken;
            QStyleOption arrowOpt(0);
            arrowOpt.rect = ar;
            arrowOpt.palette = cmb->palette;
            arrowOpt.state = flags;
            proxy()->drawPrimitive(PrimitiveElement(PE_IndicatorArrowDownBig), &arrowOpt, painter, widget);
            if (cmb->subControls & SC_ComboBoxEditField) {
                QRect re = proxy()->subControlRect(CC_ComboBox, cmb, SC_ComboBoxEditField, widget);
                if (cmb->state & State_HasFocus && !cmb->editable)
                    painter->fillRect(re.x(), re.y(), re.width(), re.height(),
                 cmb->palette.brush(QPalette::Highlight));
                 if (cmb->state & State_HasFocus) {
                    painter->setPen(cmb->palette.highlightedText().color());
                    painter->setBackground(cmb->palette.highlight());
                 } else {
                    painter->setPen(cmb->palette.text().color());
                    painter->setBackground(cmb->palette.background());
                 }
                 if (cmb->state & State_HasFocus && !cmb->editable) {
                    QStyleOptionFocusRect focus;
                    focus.QStyleOption::operator=(*cmb);
                    focus.rect = proxy()->subElementRect(SE_ComboBoxFocusRect, cmb, widget);
                    focus.state |= State_FocusAtBorder;
                    focus.backgroundColor = cmb->palette.highlight().color();
                    if ((option->state & State_On))
                      proxy()->drawPrimitive(PE_FrameFocusRect, &focus, painter, widget);
               }
            }
        }
        break;
#endif // QT_NO_COMBOBOX


#ifndef QT_NO_SPINBOX
    case CC_SpinBox:
        if (const QStyleOptionSpinBox *spinBox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) {
            QStyleOptionSpinBox copy = *spinBox;
            //PrimitiveElement primitiveElement;
            int primitiveElement;

            if (spinBox->frame && (spinBox->subControls & SC_SpinBoxFrame)) {
                QRect r = proxy()->subControlRect(CC_SpinBox, spinBox, SC_SpinBoxFrame, widget);
                qDrawPlainRect(painter, r, option->palette.shadow().color(), proxy()->pixelMetric(PM_SpinBoxFrameWidth, option, widget),0);
            }
            QPalette shadePal(option->palette);
            shadePal.setColor(QPalette::Button, option->palette.light().color());
            shadePal.setColor(QPalette::Light, option->palette.base().color());
            if (spinBox->subControls & SC_SpinBoxUp) {
                copy.subControls = SC_SpinBoxUp;
                QPalette pal2 = spinBox->palette;
                if (!(spinBox->stepEnabled & QAbstractSpinBox::StepUpEnabled)) {
                    pal2.setCurrentColorGroup(QPalette::Disabled);
                    copy.state &= ~State_Enabled;
                }
                copy.palette = pal2;
                if (spinBox->activeSubControls == SC_SpinBoxUp && (spinBox->state & State_Sunken)) {
                    copy.state |= State_On;
                    copy.state |= State_Sunken;
                } else {
                    copy.state |= State_Raised;
                    copy.state &= ~State_Sunken;
                }
                primitiveElement = (spinBox->buttonSymbols == QAbstractSpinBox::PlusMinus ? PE_IndicatorArrowUpBig
                    : PE_IndicatorArrowUpBig);
                copy.rect = proxy()->subControlRect(CC_SpinBox, spinBox, SC_SpinBoxUp, widget);
                if (copy.state & (State_Sunken | State_On))
                    qDrawPlainRect(painter, copy.rect, option->palette.shadow().color(), proxy()->pixelMetric(PM_SpinBoxFrameWidth, option, widget), &copy.palette.brush(QPalette::Shadow));
                else
                  qDrawPlainRect(painter, copy.rect, option->palette.shadow().color(), proxy()->pixelMetric(PM_SpinBoxFrameWidth, option, widget), &copy.palette.brush(QPalette::Base));
                copy.rect.adjust(proxy()->pixelMetric(PM_SpinBoxFrameWidth, option, widget), 0, -pixelMetric(PM_SpinBoxFrameWidth, option, widget), 0);
                proxy()->drawPrimitive(PrimitiveElement(primitiveElement), &copy, painter, widget);
            }
            if (spinBox->subControls & SC_SpinBoxDown) {
                copy.subControls = SC_SpinBoxDown;
                copy.state = spinBox->state;
                QPalette pal2 = spinBox->palette;
                if (!(spinBox->stepEnabled & QAbstractSpinBox::StepDownEnabled)) {
                    pal2.setCurrentColorGroup(QPalette::Disabled);
                    copy.state &= ~State_Enabled;
                }
                copy.palette = pal2;
                if (spinBox->activeSubControls == SC_SpinBoxDown && (spinBox->state & State_Sunken)) {
                    copy.state |= State_On;
                    copy.state |= State_Sunken;
                } else {
                    copy.state |= State_Raised;
                    copy.state &= ~State_Sunken;
                }
                primitiveElement = (spinBox->buttonSymbols == QAbstractSpinBox::PlusMinus ? PE_IndicatorArrowDownBig
                                                                       : PE_IndicatorArrowDownBig);
                copy.rect = proxy()->subControlRect(CC_SpinBox, spinBox, SC_SpinBoxDown, widget);
                qDrawPlainRect(painter, copy.rect, option->palette.shadow().color(), proxy()->pixelMetric(PM_SpinBoxFrameWidth, option, widget), &copy.palette.brush(QPalette::Base));
                if (copy.state & (State_Sunken | State_On))
                    qDrawPlainRect(painter, copy.rect, option->palette.shadow().color(), proxy()->pixelMetric(PM_SpinBoxFrameWidth, option, widget), &copy.palette.brush(QPalette::Shadow));
                else
                    qDrawPlainRect(painter, copy.rect, option->palette.shadow().color(), proxy()->pixelMetric(PM_SpinBoxFrameWidth, option, widget), &copy.palette.brush(QPalette::Base));
                copy.rect.adjust(3, 0, -4, 0);
                if (primitiveElement == PE_IndicatorArrowUp || primitiveElement == PE_IndicatorArrowDown) {
                    int frameWidth = proxy()->pixelMetric(PM_SpinBoxFrameWidth, option, widget);
                    copy.rect = copy.rect.adjusted(frameWidth, frameWidth, -frameWidth, -frameWidth);
                    proxy()->drawPrimitive(PrimitiveElement(primitiveElement), &copy, painter, widget);
                }
                else {
                    proxy()->drawPrimitive(PrimitiveElement(primitiveElement), &copy, painter, widget);
                }
                if (spinBox->frame && (spinBox->subControls & SC_SpinBoxFrame)) {
                    QRect r = proxy()->subControlRect(CC_SpinBox, spinBox, SC_SpinBoxEditField, widget);
                }
            }
        }
        break;
#endif // QT_NO_SPINBOX

    default:
        QWindowsStyle::drawComplexControl(control, option, painter, widget);
        break;
    }
}

QSize QWindowsMobileStyle::sizeFromContents(ContentsType type, const QStyleOption *option,
                                            const QSize &size, const QWidget *widget) const {

    QSize newSize = QWindowsStyle::sizeFromContents(type, option, size, widget);
    switch (type) {
    case CT_PushButton:
       if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton *>(option)) {
            newSize = QCommonStyle::sizeFromContents(type, option, size, widget);
            int w = newSize.width(),
                h = newSize.height();
            int defwidth = 0;
            if (button->features & QStyleOptionButton::AutoDefaultButton)
                defwidth = 2 * proxy()->pixelMetric(PM_ButtonDefaultIndicator, button, widget);

            int minwidth = int(QStyleHelper::dpiScaled(55.0f));
            int minheight = int(QStyleHelper::dpiScaled(19.0f));

            if (w < minwidth + defwidth && button->icon.isNull())
                w = minwidth + defwidth;
            if (h < minheight + defwidth)
                h = minheight + defwidth;
            newSize = QSize(w + 4, h + 4);
        }
        break;

#ifndef QT_NO_GROUPBOX
    case CT_GroupBox:
        if (const QGroupBox *grb = static_cast<const QGroupBox *>(widget)) {
            newSize = size + QSize(!grb->isFlat() ? 16 : 0, !grb->isFlat() ? 16 : 0);
        }
        break;
#endif // QT_NO_GROUPBOX

    case CT_RadioButton:
    case CT_CheckBox:
        newSize = size;
        if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton *>(option)) {
            bool isRadio = (type == CT_RadioButton);
            QRect irect = visualRect(button->direction, button->rect,
                                     proxy()->subElementRect(isRadio ? SE_RadioButtonIndicator
                                                            : SE_CheckBoxIndicator, button, widget));
            int h = proxy()->pixelMetric(isRadio ? PM_ExclusiveIndicatorHeight
                                        : PM_IndicatorHeight, button, widget);
            int margins = (!button->icon.isNull() && button->text.isEmpty()) ? 0 : 10;
             if (d_func()->doubleControls)
                 margins *= 2;
            newSize += QSize(irect.right() + margins, 1);
            newSize.setHeight(qMax(newSize.height(), h));
        }
        break;
#ifndef QT_NO_COMBOBOX
    case CT_ComboBox:
        if (const QStyleOptionComboBox *comboBox = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
            int fw = comboBox->frame ? proxy()->pixelMetric(PM_ComboBoxFrameWidth, option, widget) * 2 : 0;
            newSize = QSize(newSize.width() + fw + 9, newSize.height() + fw); //Nine is a magic Number - See CommonStyle for real magic (23)
        }
        break;
#endif
#ifndef QT_NO_SPINBOX
    case CT_SpinBox:
        if (const QStyleOptionSpinBox *spinBox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) {
            int fw = spinBox->frame ? proxy()->pixelMetric(PM_SpinBoxFrameWidth, option, widget) * 2 : 0;
            newSize = QSize(newSize.width() + fw-5, newSize.height() + fw-6);
        }
        break;
#endif
#ifndef QT_NO_LINEEDIT
    case CT_LineEdit:
        newSize += QSize(0,1);
        break;
#endif
    case CT_ToolButton:
        newSize = QSize(newSize.width() + 1, newSize.height());
        break;
    case CT_TabBarTab:
        if (d_func()->doubleControls)
            newSize = QSize(newSize.width(), 42);
        else
            newSize = QSize(newSize.width(), 21);
        break;
    case CT_HeaderSection:
        newSize += QSize(4, 2);
        break;
#ifndef QT_NO_ITEMVIEWS
#ifdef Q_WS_WINCE_WM
    case CT_ItemViewItem:
        if (d_func()->wm65)
            if (d_func()->doubleControls)
                newSize.setHeight(46);
            else
                newSize.setHeight(23);
        break;
#endif //Q_WS_WINCE_WM
#endif //QT_NO_ITEMVIEWS
    default:
        break;
    }
    return newSize;
}

QRect QWindowsMobileStyle::subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget) const {

    QWindowsMobileStylePrivate *d = const_cast<QWindowsMobileStylePrivate*>(d_func());
    QRect rect = QWindowsStyle::subElementRect(element, option, widget);
    switch (element) {
#ifndef QT_NO_TABWIDGET
    case SE_TabWidgetTabBar:
        if (d->doubleControls)
            rect.adjust(-2, 0, 2, 0);
        else
            rect.adjust(-2, 0, 2, 0);
        break;
#endif //QT_NO_TABWIDGET
    case SE_CheckBoxFocusRect:
        rect.adjust(1,0,-2,-1);
        break;
    case SE_RadioButtonFocusRect:
        rect.adjust(1,1,-2,-2);
        break;
    default:
        break;
#ifndef QT_NO_SLIDER
    case SE_SliderFocusRect:
        if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
            rect = slider->rect;
        }
        break;
    case SE_PushButtonFocusRect:
        if (d->doubleControls)
            rect.adjust(-1, -1, 0, 0);
        break;
#endif // QT_NO_SLIDER
#ifndef QT_NO_ITEMVIEWS
        case SE_ItemViewItemFocusRect:
#ifdef Q_WS_WINCE_WM
            if (d->wm65)
                rect = QRect();
#endif
        break;
#endif //QT_NO_ITEMVIEWS
    }
    return rect;
}

QRect QWindowsMobileStyle::subControlRect(ComplexControl control, const QStyleOptionComplex *option,
                                          SubControl subControl, const QWidget *widget) const {

    QWindowsMobileStylePrivate *d = const_cast<QWindowsMobileStylePrivate*>(d_func());

    QRect rect = QCommonStyle::subControlRect(control, option, subControl, widget);
    switch (control) {

#ifndef QT_NO_SCROLLBAR
    case CC_ScrollBar:
        if (const QStyleOptionSlider *scrollbar = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
            int sliderButtonExtent = proxy()->pixelMetric(PM_ScrollBarExtent, scrollbar, widget);
            float stretchFactor = 1.4f;
            int sliderButtonExtentDir = int (sliderButtonExtent * stretchFactor);

#ifdef Q_WS_WINCE_WM
            if (d->wm65)
            {
                sliderButtonExtent = d->imageScrollbarHandleUp.width();
                sliderButtonExtentDir = d->imageScrollbarHandleUp.height();
            }
#endif //Q_WS_WINCE_WM

            int sliderlen;
            int maxlen = ((scrollbar->orientation == Qt::Horizontal) ?
                scrollbar->rect.width() : scrollbar->rect.height()) - (sliderButtonExtentDir * 2);
            // calculate slider length
            if (scrollbar->maximum != scrollbar->minimum) {
                uint range = scrollbar->maximum - scrollbar->minimum;
                sliderlen = (qint64(scrollbar->pageStep) * maxlen) / (range + scrollbar->pageStep);

                int slidermin = proxy()->pixelMetric(PM_ScrollBarSliderMin, scrollbar, widget);
                if (sliderlen < slidermin || range > INT_MAX / 2)
                    sliderlen = slidermin;
                if (sliderlen > maxlen)
                    sliderlen = maxlen;
            } else {
                sliderlen = maxlen;
            }
            int sliderstart = sliderButtonExtentDir + sliderPositionFromValue(scrollbar->minimum,
                scrollbar->maximum,
                scrollbar->sliderPosition,
                maxlen - sliderlen,
                scrollbar->upsideDown);
            if (d->smartphone) {
                sliderstart -= sliderButtonExtentDir;
                sliderlen += 2*sliderButtonExtent;
            }
            switch (subControl) {
            case SC_ScrollBarSubLine:            // top/left button
                if (scrollbar->orientation == Qt::Horizontal) {
                    int buttonWidth = qMin(scrollbar->rect.width() / 2, sliderButtonExtentDir );
                    rect.setRect(0, 0, buttonWidth, sliderButtonExtent);
                } else {
                    int buttonHeight = qMin(scrollbar->rect.height() / 2, sliderButtonExtentDir);
                    rect.setRect(0, 0, sliderButtonExtent, buttonHeight);
                }
                if (d->smartphone)
                    rect.setRect(0, 0, 0, 0);
                break;
            case SC_ScrollBarAddLine:            // bottom/right button
                if (scrollbar->orientation == Qt::Horizontal) {
                    int buttonWidth = qMin(scrollbar->rect.width()/2, sliderButtonExtentDir);
                    rect.setRect(scrollbar->rect.width() - buttonWidth, 0, buttonWidth, sliderButtonExtent);
                } else {
                    int buttonHeight = qMin(scrollbar->rect.height()/2, sliderButtonExtentDir );
                    rect.setRect(0, scrollbar->rect.height() - buttonHeight, sliderButtonExtent, buttonHeight);
                }
                if (d->smartphone)
                    rect.setRect(0, 0, 0, 0);
                break;
            case SC_ScrollBarSubPage:            // between top/left button and slider
                if (scrollbar->orientation == Qt::Horizontal)
                    if (d->smartphone)
                       rect.setRect(0, 0, sliderstart, sliderButtonExtent);
                    else
                      rect.setRect(sliderButtonExtent, 0, sliderstart - sliderButtonExtent, sliderButtonExtent);
                else
                    if (d->smartphone)
                      rect.setRect(0, 0, sliderButtonExtent, sliderstart);
                    else
                      rect.setRect(0, sliderButtonExtent, sliderButtonExtent, sliderstart - sliderButtonExtent);
                break;
            case SC_ScrollBarAddPage:            // between bottom/right button and slider
                if (scrollbar->orientation == Qt::Horizontal)
                    if (d->smartphone)
                      rect.setRect(sliderstart + sliderlen, 0,
                                  maxlen - sliderstart - sliderlen + 2*sliderButtonExtent, sliderButtonExtent);
                    else
                      rect.setRect(sliderstart + sliderlen, 0,
                                   maxlen - sliderstart - sliderlen + sliderButtonExtent, sliderButtonExtent);
                else
                    if (d->smartphone)
                      rect.setRect(0, sliderstart + sliderlen, sliderButtonExtent,
                                  maxlen - sliderstart - sliderlen + 2*sliderButtonExtent);
                    else
                       rect.setRect(0, sliderstart + sliderlen, sliderButtonExtent,
                                  maxlen - sliderstart - sliderlen + sliderButtonExtent);
                break;
            case SC_ScrollBarGroove:
                if (scrollbar->orientation == Qt::Horizontal)
                    rect.setRect(sliderButtonExtent, 0, scrollbar->rect.width() - sliderButtonExtent * 2,
                                scrollbar->rect.height());
                else
                    rect.setRect(0, sliderButtonExtent, scrollbar->rect.width(),
                                scrollbar->rect.height() - sliderButtonExtent * 2);
                break;
            case SC_ScrollBarSlider:
                if (scrollbar->orientation == Qt::Horizontal)
                    rect.setRect(sliderstart, 0, sliderlen, sliderButtonExtent);
                else
                    rect.setRect(0, sliderstart, sliderButtonExtent, sliderlen);
                break;
            default:
                break;
            }
            rect = visualRect(scrollbar->direction, scrollbar->rect, rect);
        }
        break;
#endif // QT_NO_SCROLLBAR



#ifndef QT_NO_TOOLBUTTON
    case CC_ToolButton:
        if (const QStyleOptionToolButton *toolButton = qstyleoption_cast<const QStyleOptionToolButton *>(option)) {
            int mbi = proxy()->pixelMetric(PM_MenuButtonIndicator, toolButton, widget);
            rect = toolButton->rect;
            switch (subControl) {
            case SC_ToolButton:
                if ((toolButton->features
                     & (QStyleOptionToolButton::Menu | QStyleOptionToolButton::PopupDelay))
                    == QStyleOptionToolButton::Menu)
                    rect.adjust(0, 0, -mbi, 0);
                break;
            case SC_ToolButtonMenu:
                if ((toolButton->features
                     & (QStyleOptionToolButton::Menu | QStyleOptionToolButton::PopupDelay))
                    == QStyleOptionToolButton::Menu)
                    rect.adjust(rect.width() - mbi, 1, 0, 1);
                break;
            default:
                break;
            }
            rect = visualRect(toolButton->direction, toolButton->rect, rect);
        }
        break;
#endif // QT_NO_TOOLBUTTON

#ifndef QT_NO_SLIDER
        case CC_Slider:
        if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
            int tickOffset = proxy()->pixelMetric(PM_SliderTickmarkOffset, slider, widget);
            int thickness = proxy()->pixelMetric(PM_SliderControlThickness, slider, widget);
            switch (subControl) {
            case SC_SliderHandle: {
                int sliderPos = 0;
                int len = proxy()->pixelMetric(PM_SliderLength, slider, widget);
                bool horizontal = slider->orientation == Qt::Horizontal;
                sliderPos = sliderPositionFromValue(slider->minimum, slider->maximum,
                                                    slider->sliderPosition,
                                                    (horizontal ? slider->rect.width()
                                                                : slider->rect.height()) - len,
                                                    slider->upsideDown);
                if (horizontal)
                    rect.setRect(slider->rect.x() + sliderPos, slider->rect.y() + tickOffset, len, thickness);
                else
                    rect.setRect(slider->rect.x() + tickOffset, slider->rect.y() + sliderPos, thickness, len);
                break; }
            default:
                break;
            }
            rect = visualRect(slider->direction, slider->rect, rect);
        }
        break;
#endif //QT_NO_SLIDER
#ifndef QT_NO_COMBOBOX
    case CC_ComboBox:
        if (const QStyleOptionComboBox *comboBox = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
        int x = comboBox->rect.x(),
            y = comboBox->rect.y(),
            wi = comboBox->rect.width(),
            he = comboBox->rect.height();
        int xpos = x;
        int margin = comboBox->frame ? (d->doubleControls ? 2 : 1) : 0;
        int bmarg = comboBox->frame ? (d->doubleControls ? 2 : 1) :  0;
        if (subControl == SC_ComboBoxArrow)
          xpos += wi - int((he - 2*bmarg)*0.9) - bmarg;
        else
          xpos += wi - (he - 2*bmarg) - bmarg;
        switch (subControl) {
        case SC_ComboBoxArrow:
            rect.setRect(xpos, y + bmarg, he - 2*bmarg, he - 2*bmarg);
            break;
        case SC_ComboBoxEditField:
            rect.setRect(x + margin, y + margin, wi - 2 * margin - int((he - 2*bmarg) * 0.84f), he - 2 * margin);
            if (d->doubleControls) {
                if (comboBox->editable)
                    rect.adjust(2, 0, 0, 0);
                else
                    rect.adjust(4, 2, 0, -2);
            } else if (!comboBox->editable) {
                rect.adjust(2, 1, 0, -1);
            }
            break;
        case SC_ComboBoxFrame:
            rect = comboBox->rect;
            break;
        default:
        break;
        }
    }
#endif //QT_NO_COMBOBOX
#ifndef QT_NO_SPINBOX
    case CC_SpinBox:
        if (const QStyleOptionSpinBox *spinBox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) {
            QSize bs;
            int fw = spinBox->frame ? proxy()->pixelMetric(PM_SpinBoxFrameWidth, spinBox, widget) : 0;
            bs.setHeight(qMax(d->doubleControls ? 28 : 14, (spinBox->rect.height())));
            // 1.6 -approximate golden mean
            bs.setWidth(qMax(d->doubleControls ? 28 : 14, qMin((bs.height()*7/8), (spinBox->rect.width() / 8))));
            bs = bs.expandedTo(QApplication::globalStrut());
            int x, lx, rx;
            x = spinBox->rect.width() - bs.width()*2;
            lx = fw;
            rx = x - fw;
            switch (subControl) {
            case SC_SpinBoxUp:
                rect = QRect(x + proxy()->pixelMetric(PM_SpinBoxFrameWidth, option, widget), 0 , bs.width(), bs.height());
                break;
            case SC_SpinBoxDown:
                rect = QRect(x + bs.width(), 0, bs.width(), bs.height());
                break;
            case SC_SpinBoxEditField:
                if (spinBox->buttonSymbols == QAbstractSpinBox::NoButtons) {
                    rect = QRect(lx, fw, spinBox->rect.width() - 2*fw - 2, spinBox->rect.height() - 2*fw);
                } else {
                    rect = QRect(lx, fw, rx-2, spinBox->rect.height() - 2*fw);
                }
                break;
            case SC_SpinBoxFrame:
                rect = spinBox->rect;
            default:
                break;
          }
          rect = visualRect(spinBox->direction, spinBox->rect, rect);
        }
        break;
#endif // Qt_NO_SPINBOX
#ifndef QT_NO_GROUPBOX
    case CC_GroupBox: {
        if (const QStyleOptionGroupBox *groupBox = qstyleoption_cast<const QStyleOptionGroupBox *>(option)) {
            switch (subControl) {
            case SC_GroupBoxFrame:
                // FALL THROUGH
            case SC_GroupBoxContents: {
                int topMargin = 0;
                int topHeight = 0;
                int bottomMargin = 0;
                int labelMargin = 2;

                QRect frameRect = groupBox->rect;
                int verticalAlignment = styleHint(SH_GroupBox_TextLabelVerticalAlignment, groupBox, widget);
                if (groupBox->text.size()) {
                    topHeight = groupBox->fontMetrics.height();
                    if (verticalAlignment & Qt::AlignVCenter)
                        topMargin = topHeight+5;
                    else if (verticalAlignment & Qt::AlignTop)
                        topMargin = -topHeight+5;
                }
                if (subControl == SC_GroupBoxFrame) {
                    frameRect.setTop(topMargin);
                    frameRect.setBottom(frameRect.height() + bottomMargin);
                    rect = frameRect;
                    break;
                }
                int frameWidth = 0;
                if (groupBox->text.size()) {
                    frameWidth = proxy()->pixelMetric(PM_DefaultFrameWidth, groupBox, widget);
                    rect = frameRect.adjusted(frameWidth, frameWidth + topHeight + labelMargin, -frameWidth, -frameWidth);
                }
                else {
                   rect = groupBox->rect;
                }
                break;
            }
            case SC_GroupBoxCheckBox:
                // FALL THROUGH
            case SC_GroupBoxLabel: {
                QFontMetrics fontMetrics = groupBox->fontMetrics;
                int h = fontMetrics.height();
                int textWidth = fontMetrics.size(Qt::TextShowMnemonic, groupBox->text + QLatin1Char(' ')).width();
                int margX = (groupBox->features & QStyleOptionFrameV2::Flat) ? 0 : 2;
                int margY = (groupBox->features & QStyleOptionFrameV2::Flat) ? 0 : 2;
                rect = groupBox->rect.adjusted(margX, margY, -margX, 0);
                if (groupBox->text.size())
                    rect.setHeight(h);
                else
                  rect.setHeight(0);
                int indicatorWidth = proxy()->pixelMetric(PM_IndicatorWidth, option, widget);
                int indicatorSpace = proxy()->pixelMetric(PM_CheckBoxLabelSpacing, option, widget) - 1;
                bool hasCheckBox = groupBox->subControls & QStyle::SC_GroupBoxCheckBox;
                int checkBoxSize = hasCheckBox ? (indicatorWidth + indicatorSpace) : 0;

                // Adjusted rect for label + indicatorWidth + indicatorSpace
                QRect totalRect = alignedRect(groupBox->direction, groupBox->textAlignment,
                                              QSize(textWidth + checkBoxSize, h), rect);

                // Adjust totalRect if checkbox is set
                if (hasCheckBox) {
                    bool ltr = groupBox->direction == Qt::LeftToRight;
                    int left = 2;
                    // Adjust for check box
                    if (subControl == SC_GroupBoxCheckBox) {
                        int indicatorHeight = proxy()->pixelMetric(PM_IndicatorHeight, option, widget);
                        left = ltr ? totalRect.left() : (totalRect.right() - indicatorWidth);
                        int top = totalRect.top() + (fontMetrics.height() - indicatorHeight) / 2;
                        totalRect.setRect(left, top, indicatorWidth, indicatorHeight);
                    // Adjust for label
                    } else {
                        left = ltr ? (totalRect.left() + checkBoxSize - 2) : totalRect.left();
                        totalRect.setRect(left, totalRect.top(),
                                          totalRect.width() - checkBoxSize, totalRect.height());
                    }
                }
                  if ((subControl== SC_GroupBoxLabel))
                      totalRect.adjust(-2,0,6,0);
                  rect = totalRect;
                break;
            }
            default:
                break;
            }
        }
        break;
    }
#endif // QT_NO_GROUPBOX
    default:
        break;
    }
    return rect;
}

QPalette QWindowsMobileStyle::standardPalette() const {
    QPalette palette (Qt::black,QColor(198, 195, 198), QColor(222, 223, 222 ),
                      QColor(132, 130, 132), QColor(198, 195, 198), Qt::black, Qt::white, Qt::white, QColor(198, 195, 198));
    palette.setColor(QPalette::Window, QColor(206, 223, 239));
    palette.setColor(QPalette::Link, QColor(8,77,123)); //Alternate TextColor for labels...
    palette.setColor(QPalette::Base, Qt::white);
    palette.setColor(QPalette::Button, QColor(206, 223, 239));
    palette.setColor(QPalette::Highlight, QColor(49, 146, 214));
    palette.setColor(QPalette::Light, Qt::white);
    palette.setColor(QPalette::Text, Qt::black);
    palette.setColor(QPalette::ButtonText, Qt::black);
    palette.setColor(QPalette::Midlight, QColor(222, 223, 222 ));
    palette.setColor(QPalette::Dark, QColor(132, 130, 132));
    palette.setColor(QPalette::Mid, QColor(189, 190, 189));
    palette.setColor(QPalette::Shadow, QColor(0, 0, 0));
    palette.setColor(QPalette::BrightText, QColor(33, 162, 33)); //color for ItemView checked indicator (arrow)
    return palette;
}


/*! \reimp */
void QWindowsMobileStyle::polish(QApplication *application) {
    QWindowsStyle::polish(application);
}

/*! \reimp */
void QWindowsMobileStyle::polish(QWidget *widget) {

#ifndef QT_NO_TOOLBAR
    if (QToolBar *toolBar = qobject_cast<QToolBar*>(widget)) {
        QPalette pal = toolBar->palette();
        pal.setColor(QPalette::Background, pal.button().color());
        toolBar->setPalette(pal);
    }
    else
#endif //QT_NO_TOOLBAR

    QWindowsStyle::polish(widget);
}

void QWindowsMobileStyle::unpolish(QWidget *widget)
{
    QWindowsStyle::unpolish(widget);
}

void QWindowsMobileStyle::unpolish(QApplication *app)
{
    QWindowsStyle::unpolish(app);
}

/*! \reimp */
void QWindowsMobileStyle::polish(QPalette &palette) {
    QWindowsStyle::polish(palette);
}

int QWindowsMobileStyle::pixelMetric(PixelMetric pm, const QStyleOption *opt, const QWidget *widget) const {

    QWindowsMobileStylePrivate *d = const_cast<QWindowsMobileStylePrivate*>(d_func());
    int ret;

    switch (pm) {
    case PM_DefaultTopLevelMargin:
        ret =0;
        break;
    case PM_DefaultLayoutSpacing:
        d->doubleControls ? ret = 8 : ret = 4;
        break;
    case PM_HeaderMargin:
        d->doubleControls ? ret = 2 : ret = 1;
        break;
    case PM_DefaultChildMargin:
        d->doubleControls ? ret = 10 : ret = 5;
        break;
    case PM_ToolBarSeparatorExtent:
        d->doubleControls ? ret = 6 : ret = 3;
        break;
    case PM_DefaultFrameWidth:
        d->doubleControls ? ret = 2 : ret = 1;
        break;
    case PM_MenuVMargin:
        ret = 1;
        break;
    case PM_MenuHMargin:
        ret = 1;
        break;
    case PM_MenuButtonIndicator:
        ret = d->doubleControls ? 24 : 14;
        break;
    case PM_ComboBoxFrameWidth:
        d->doubleControls ? ret = 2 : ret = 1;
        break;
    case PM_SpinBoxFrameWidth:
        d->doubleControls ? ret = 2 : ret = 1;
        break;
    case PM_ButtonDefaultIndicator:
    case PM_ButtonShiftHorizontal:
    case PM_ButtonShiftVertical:
        d->doubleControls ? ret = 2 : ret = 1;
        break;
#ifndef QT_NO_TABBAR
   case PM_TabBarTabShiftHorizontal:
        ret = 0;
        break;
    case PM_TabBarTabShiftVertical:
        ret = 0;
        break;
#endif
    case PM_MaximumDragDistance:
        ret = 60;
        break;
   case PM_TabBarTabVSpace:
        ret = d->doubleControls ? 12 : 6;
        break;
   case PM_TabBarBaseHeight:
       ret = 0;
       break;
      case PM_IndicatorWidth:
          ret = d->doubleControls ? windowsMobileIndicatorSize * 2 : windowsMobileIndicatorSize;
        break;
    case PM_IndicatorHeight:
        ret = d->doubleControls ? windowsMobileIndicatorSize * 2 : windowsMobileIndicatorSize;
        break;
    case PM_ExclusiveIndicatorWidth:
        ret = d->doubleControls ? windowsMobileExclusiveIndicatorSize * 2 + 4: windowsMobileExclusiveIndicatorSize + 2;
        break;
    case PM_ExclusiveIndicatorHeight:
        ret = d->doubleControls ? windowsMobileExclusiveIndicatorSize * 2 + 4: windowsMobileExclusiveIndicatorSize + 2;
        break;
#ifndef QT_NO_SLIDER
    case PM_SliderLength:
        ret = d->doubleControls ? 16 : 8;
        break;
    case PM_FocusFrameHMargin:
        ret = d->doubleControls ? 1 : 2;
        break;
    case PM_SliderThickness:
        ret = d->doubleControls ? windowsMobileSliderThickness * 2: windowsMobileSliderThickness;
        break;
    case PM_TabBarScrollButtonWidth:
        ret = d->doubleControls ? 14 * 2 : 18;
        break;
    case PM_CheckBoxLabelSpacing:
    case PM_RadioButtonLabelSpacing:
        ret = d->doubleControls ? 6 * 2 : 6;
        break;
        // Returns the number of pixels to use for the business part of the
        // slider (i.e., the non-tickmark portion). The remaining space is shared
        // equally between the tickmark regions.
    case PM_SliderControlThickness:
        if (const QStyleOptionSlider *sl = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
            int space = (sl->orientation == Qt::Horizontal) ? sl->rect.height() : sl->rect.width();
            int ticks = sl->tickPosition;
            int n = 0;
            if (ticks & QSlider::TicksAbove)
                ++n;
            if (ticks & QSlider::TicksBelow)
                ++n;
            if (!n) {
                ret = space;
                break;
            }
            int thick = 8;
            if (ticks != QSlider::TicksBothSides && ticks != QSlider::NoTicks)
                thick += proxy()->pixelMetric(PM_SliderLength, sl, widget) / 4;

            space -= thick;
            if (space > 0)
                thick += (space * 2) / (n + 2);
            ret = thick;
        } else {
            ret = 0;
        }
        break;
#endif // QT_NO_SLIDER
#ifndef QT_NO_MENU
    case PM_SmallIconSize:
        d->doubleControls ? ret = windowsMobileIconSize * 2 : ret = windowsMobileIconSize;
        break;
    case PM_ButtonMargin:
        d->doubleControls ? ret = 8 : ret = 4;
        break;
    case PM_LargeIconSize:
        d->doubleControls ? ret = 64 : ret = 32;
        break;
    case PM_IconViewIconSize:
        ret = proxy()->pixelMetric(PM_LargeIconSize, opt, widget);
        break;
    case PM_ToolBarIconSize:
        d->doubleControls ? ret = 2 * windowsMobileIconSize : ret = windowsMobileIconSize;
        break;
    case PM_DockWidgetTitleMargin:
        ret = 2;
        break;
#if defined(Q_WS_WIN)
#else
    case PM_DockWidgetFrameWidth:
        ret = 4;
        break;
#endif // Q_WS_WIN
    break;
#endif // QT_NO_MENU

   case PM_TitleBarHeight:
        d->doubleControls ? ret = 42 : ret = 21;
        break;
   case PM_ScrollBarSliderMin:
#ifdef Q_WS_WINCE_WM
       if (d->wm65)
#else
       if (false)
#endif
       {
           d->doubleControls ? ret = 68 : ret = 34;
       } else {
           d->doubleControls ? ret = 36 : ret = 18;
       }
        break;
   case PM_ScrollBarExtent: {
       
       if (d->smartphone)
           ret = 9;
       else
         d->doubleControls ? ret = 25 : ret = 13;

#ifdef Q_WS_WINCE_WM
       if (d->wm65)
#else
       if (false)
#endif
       {
           d->doubleControls ? ret = 26 : ret = 13;
           break;
       }

#ifndef QT_NO_SCROLLAREA
       //Check if the scrollbar is part of an abstractItemView and set size according
       if (widget)
       if (QWidget *parent = widget->parentWidget())
           if (qobject_cast<QAbstractScrollArea *>(parent->parentWidget()))
               if (d->smartphone)
                 ret = 8;
               else
                 d->doubleControls ? ret = 24 : ret = 12;
#endif
       }
       break;
    case PM_SplitterWidth:
        ret = qMax(4, QApplication::globalStrut().width());
        break;

#if defined(Q_WS_WIN)
    case PM_MDIFrameWidth:
        ret = 1;
        break;
#endif
    case PM_ToolBarExtensionExtent:
        d->doubleControls ? ret = 32 : ret = 16;
        break;
    case PM_ToolBarItemMargin:
        d->doubleControls ? ret = 2 : ret = 1;
        break;
    case PM_ToolBarItemSpacing:
        d->doubleControls ? ret = 2 : ret = 1;
        break;
    case PM_ToolBarHandleExtent:
        d->doubleControls ? ret = 16 : ret = 8;
        break;
    case PM_ButtonIconSize:
        d->doubleControls ? ret = 32 : ret = 16;
        break;
    case PM_TextCursorWidth:
        ret = 2;
        break;
    case PM_TabBar_ScrollButtonOverlap:
        ret = 0;
        break;
    default:
        ret = QWindowsStyle::pixelMetric(pm, opt, widget);
        break;
    }
    return ret;
}

int QWindowsMobileStyle::styleHint(StyleHint hint, const QStyleOption *opt, const QWidget *widget,
                                   QStyleHintReturn *returnData) const {

    int ret;
    switch (hint) {
    case SH_Menu_MouseTracking:
    case SH_ComboBox_ListMouseTracking:
    case SH_EtchDisabledText:
        ret = 0;
        break;
    case SH_DitherDisabledText:
        ret = 0;
        break;
    case SH_ItemView_ShowDecorationSelected:
        ret = 0;
        break;
#ifndef QT_NO_TABWIDGET
    case SH_TabWidget_DefaultTabPosition:
        ret = QTabWidget::South;
        break;
#endif
    case SH_ToolBar_Movable:
        ret = false;
        break;
    case SH_ScrollBar_ContextMenu:
        ret = false;
        break;
    case SH_MenuBar_AltKeyNavigation:
        ret = false;
        break;
    case SH_RequestSoftwareInputPanel:
        ret = RSIP_OnMouseClick;
        break;
    default:
          ret = QWindowsStyle::styleHint(hint, opt, widget, returnData);
       break;
    }
    return ret;
}

QPixmap QWindowsMobileStyle::standardPixmap(StandardPixmap sp, const QStyleOption *option,
                                     const QWidget *widget) const {

    QWindowsMobileStylePrivate *d = const_cast<QWindowsMobileStylePrivate*>(d_func());
    switch (sp) {
#ifndef QT_NO_IMAGEFORMAT_XPM
    case SP_ToolBarHorizontalExtensionButton: {
        QPixmap pixmap = QCommonStyle::standardPixmap(sp, option, widget);
        if (d->doubleControls)
            return pixmap.scaledToHeight(pixmap.height() * 2);
        else
          return pixmap;
     }
     case SP_TitleBarMaxButton:
     case SP_TitleBarCloseButton:
     case SP_TitleBarNormalButton:
     case SP_TitleBarMinButton: {
         QImage image;
         switch (sp) {
            case SP_TitleBarMaxButton:
                image = d->imageMaximize;
            break;
            case SP_TitleBarCloseButton:
                image = d->imageClose;
            break;
            case SP_TitleBarNormalButton:
                image = d->imageNormalize;
            break;
            case SP_TitleBarMinButton:
                image = d->imageMinimize;
            break;
            default:
            break;
         }
         if (option) {
             image.setColor(0, option->palette.shadow().color().rgba());
             image.setColor(1, option->palette.highlight().color().rgba());
             image.setColor(2, option->palette.highlight().color().lighter(150).rgba());
             image.setColor(3, option->palette.highlightedText().color().rgba());
         }

         return QPixmap::fromImage(image);
     }

#endif
    default:
        return QWindowsStyle::standardPixmap(sp, option, widget);
    }
}

QPixmap QWindowsMobileStyle::generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap,
                                                 const QStyleOption *option) const {

    switch (iconMode) {
    case QIcon::Selected: {
#ifdef Q_WS_WINCE_WM
        if (d_func()->wm65)
            return pixmap;
#endif //Q_WS_WINCE_WM
        QImage img = pixmap.toImage().convertToFormat(QImage::Format_ARGB32);
        int imgh = img.height();
        int imgw = img.width();
        for (int y = 0; y < imgh; y += 2) {
            for (int x = 0; x < imgw; x += 2) {
                QColor c = option->palette.highlight().color().rgb();
                c.setAlpha( qAlpha(img.pixel(x, y)));
                QRgb pixel = c.rgba();
                img.setPixel(x, y, pixel);
            }
        }
        return QPixmap::fromImage(img);
    }
    default:
    break;
    }
    return QWindowsStyle::generatedIconPixmap(iconMode, pixmap, option);
}


bool QWindowsMobileStyle::doubleControls() const {

    QWindowsMobileStylePrivate *d = const_cast<QWindowsMobileStylePrivate*>(d_func());

    return d->doubleControls;
}

void QWindowsMobileStyle::setDoubleControls(bool doubleControls) {

   QWindowsMobileStylePrivate *d = const_cast<QWindowsMobileStylePrivate*>(d_func());

   d->doubleControls = doubleControls;
}

QT_END_NAMESPACE

#endif // QT_NO_STYLE_WINDOWSMOBILE

