--- /dev/null
+Bitcoin v0.2.0 BETA\r
+\r
+Copyright (c) 2009 Satoshi Nakamoto\r
+Distributed under the MIT/X11 software license, see the accompanying\r
+file license.txt or http://www.opensource.org/licenses/mit-license.php.\r
+This product includes software developed by the OpenSSL Project for use in\r
+the OpenSSL Toolkit (http://www.openssl.org/). This product includes\r
+cryptographic software written by Eric Young (eay@cryptsoft.com).\r
+\r
+\r
+UNIX BUILD NOTES\r
+\r
+\r
+Dependencies\r
+------------\r
+apt-get install build-essential\r
+apt-get install libgtk2.0-dev\r
+apt-get install libssl-dev\r
+\r
+Libraries you need to obtain separately and build:\r
+ default path download\r
+wxWidgets \wxwidgets http://www.wxwidgets.org/downloads/\r
+Berkeley DB \db http://www.oracle.com/technology/software/products/berkeley-db/index.html\r
+Boost \boost http://www.boost.org/users/download/\r
+\r
+Their licenses:\r
+wxWidgets LGPL 2.1 with very liberal exceptions\r
+Berkeley DB New BSD license with additional requirement that linked software must be free open source\r
+Boost MIT-like license\r
+\r
+Versions used in this release:\r
+GCC 4.3.3\r
+OpenSSL 0.9.8k\r
+wxWidgets 2.8.9\r
+Berkeley DB 4.7.25.NC\r
+Boost 1.40.0\r
+\r
+\r
+Notes\r
+-----\r
+The UI layout is edited with wxFormBuilder. Open the project file\r
+uiproject.fbp. It generates uibase.cpp and uibase.h, which define base\r
+classes that do the rote work of constructing all the UI elements.\r
+\r
+The release is built with GCC and then "strip bitcoin" to strip the debug\r
+symbols, which reduces the executable size by about 90%.\r
+\r
+\r
+wxWidgets\r
+---------\r
+cd /usr/local/wxWidgets-2.8.9\r
+mkdir buildgtk\r
+cd buildgtk\r
+../configure --with-gtk --enable-debug --disable-shared --enable-monolithic\r
+make\r
+su\r
+make install\r
+ldconfig\r
+\r
+\r
+Berkeley DB\r
+-----------\r
+cd /usr/local/db-4.7.25.NC/build_unix\r
+../dist/configure --enable-cxx\r
+make\r
+\r
+\r
+Boost\r
+-----\r
+cd /usr/local/boost_1_40_0\r
+su\r
+./bootstrap.sh\r
+./bjam install\r
+++ /dev/null
-BitCoin v0.1.6 BETA\r
-\r
-Copyright (c) 2009 Satoshi Nakamoto\r
-Distributed under the MIT/X11 software license, see the accompanying\r
-file license.txt or http://www.opensource.org/licenses/mit-license.php.\r
-This product includes software developed by the OpenSSL Project for use in\r
-the OpenSSL Toolkit (http://www.openssl.org/). This product includes\r
-cryptographic software written by Eric Young (eay@cryptsoft.com).\r
-\r
-\r
-Compilers Supported\r
--------------------\r
-MinGW GCC (v3.4.5)\r
-Microsoft Visual C++ 6.0 SP6\r
-\r
-\r
-Dependencies\r
-------------\r
-Libraries you need to obtain separately to build:\r
-\r
- default path download\r
-wxWidgets \wxwidgets http://www.wxwidgets.org/downloads/\r
- or prebuilt: http://wxpack.sourceforge.net\r
-OpenSSL \openssl http://www.openssl.org/source/\r
-Berkeley DB \db http://www.oracle.com/technology/software/products/berkeley-db/index.html\r
-Boost \boost http://www.boost.org/users/download/\r
-\r
-Their licenses:\r
-wxWidgets LGPL 2.1 with very liberal exceptions\r
-OpenSSL Old BSD license with the problematic advertising requirement\r
-Berkeley DB New BSD license with additional requirement that linked software must be free open source\r
-Boost MIT-like license\r
-\r
-\r
-Notes\r
------\r
-The UI layout is edited with wxFormBuilder. Open the project file\r
-uiproject.fbp. It generates uibase.cpp and uibase.h, which define base\r
-classes that do the rote work of constructing all the UI elements.\r
-\r
-The release is built with GCC and then "strip bitcoin.exe" to strip the debug\r
-symbols, which reduces the executable size by about 90%.\r
-\r
-\r
-OpenSSL\r
--------\r
-Bitcoin does not use any encryption. If you want to do a no-everything\r
-build of OpenSSL to exclude encryption routines, a few patches are required.\r
-(OpenSSL v0.9.8h)\r
-\r
-Edit engines\e_gmp.c and put this #ifndef around #include <openssl/rsa.h>\r
- #ifndef OPENSSL_NO_RSA\r
- #include <openssl/rsa.h>\r
- #endif\r
-\r
-Add this to crypto\err\err_all.c before the ERR_load_crypto_strings line:\r
- void ERR_load_RSA_strings(void) { }\r
-\r
-Edit ms\mingw32.bat and replace the Configure line's parameters with this\r
-no-everything list. You have to put this in the batch file because batch\r
-files can't take more than 9 command line parameters.\r
- perl Configure mingw threads no-rc2 no-rc4 no-rc5 no-idea no-des no-bf no-cast no-aes no-camellia no-seed no-rsa no-dh\r
-\r
-Also REM out the following line in ms\mingw32.bat. The build fails after it's\r
-already finished building libeay32, which is all we care about, but the\r
-failure aborts the script before it runs dllwrap to generate libeay32.dll.\r
- REM if errorlevel 1 goto end\r
-\r
-Build\r
- ms\mingw32.bat\r
-\r
-If you want to use it with MSVC, generate the .lib file\r
- lib /machine:i386 /def:ms\libeay32.def /out:out\libeay32.lib\r
-\r
-\r
-Berkeley DB\r
------------\r
-Using MinGW and MSYS:\r
-cd \db\build_unix\r
-sh ../dist/configure --enable-mingw --enable-cxx\r
-make\r
-\r
-\r
-Boost\r
------\r
-If you have trouble compiling Boost with Microsoft Visual C++ 6.0, try going\r
-back to Boost version 1.35. It looks like they may be starting to reduce\r
-support for MSVC 6.0.\r
if (fShutdown)\r
return;\r
string strDataDir = GetDataDir();\r
- string strLogDir = strDataDir + "\\database";\r
+ string strLogDir = strDataDir + "/database";\r
_mkdir(strLogDir.c_str());\r
- string strErrorFile = strDataDir + "\\db.log";\r
+ string strErrorFile = strDataDir + "/db.log";\r
printf("dbenv.open strLogDir=%s strErrorFile=%s\n", strLogDir.c_str(), strErrorFile.c_str());\r
\r
dbenv.set_lg_dir(strLogDir.c_str());\r
\r
bool CAddrDB::LoadAddresses()\r
{\r
- CRITICAL_BLOCK(cs_mapIRCAddresses)\r
CRITICAL_BLOCK(cs_mapAddresses)\r
{\r
// Load user provided addresses\r
{\r
CAddress addr(psz, NODE_NETWORK);\r
if (addr.IsValid())\r
- {\r
AddAddress(*this, addr);\r
- mapIRCAddresses.insert(make_pair(addr.GetKey(), addr));\r
- }\r
}\r
}\r
catch (...) { }\r
if (nRefCount == 0 && !fShutdown)\r
{\r
// Flush wallet.dat so it's self contained\r
- nLastFlushed == nWalletDBUpdated;\r
+ nLastFlushed = nWalletDBUpdated;\r
int64 nStart = GetTimeMillis();\r
dbenv.txn_checkpoint(0, 0, 0);\r
dbenv.lsn_reset(strFile.c_str(), 0);\r
#endif\r
#define _WIN32_IE 0x0400\r
#define WIN32_LEAN_AND_MEAN 1\r
+#define __STDC_LIMIT_MACROS // to enable UINT64_MAX from stdint.h\r
#include <wx/wx.h>\r
#include <wx/clipbrd.h>\r
#include <wx/snglinst.h>\r
#include <wx/taskbar.h>\r
#include <wx/stdpaths.h>\r
+#include <wx/utils.h>\r
#include <openssl/ecdsa.h>\r
#include <openssl/evp.h>\r
#include <openssl/rand.h>\r
#include <openssl/sha.h>\r
-#include <openssl/ripemd.h>
+#include <openssl/ripemd.h>\r
#include <stdio.h>\r
#include <stdlib.h>\r
#include <math.h>\r
#include <boost/tuple/tuple.hpp>\r
#include <boost/tuple/tuple_comparison.hpp>\r
#include <boost/tuple/tuple_io.hpp>\r
-#include <boost/array.hpp>
-
+#include <boost/array.hpp>\r
+\r
#ifdef __WXMSW__\r
#include <windows.h>\r
#include <winsock2.h>\r
-#include <mswsock.h>
+#include <mswsock.h>\r
#include <shlobj.h>\r
-#include <shlwapi.h>
-#include <io.h>
-#include <process.h>
-#else
+#include <shlwapi.h>\r
+#include <io.h>\r
+#include <process.h>\r
+#else\r
#include <sys/time.h>\r
+#include <sys/resource.h>\r
#include <sys/socket.h>\r
-#include <arpa/inet.h>
-#include <unistd.h>
-#endif
+#include <arpa/inet.h>\r
+#include <netdb.h>\r
+#include <unistd.h>\r
+#include <errno.h>\r
+#include <boost/filesystem.hpp>\r
+#include <boost/thread/thread.hpp>\r
+#include <boost/algorithm/string.hpp>\r
+#endif\r
\r
#pragma hdrstop\r
using namespace std;\r
#include "market.h"\r
#include "uibase.h"\r
#include "ui.h"\r
+\r
+#include "xpm/addressbook16.xpm"\r
+#include "xpm/addressbook20.xpm"\r
+#include "xpm/bitcoin.xpm"\r
+#include "xpm/check.xpm"\r
+#include "xpm/send16.xpm"\r
+#include "xpm/send16noshadow.xpm"\r
+#include "xpm/send20.xpm"\r
\r
#include "headers.h"\r
\r
-\r
-map<vector<unsigned char>, CAddress> mapIRCAddresses;\r
-CCriticalSection cs_mapIRCAddresses;\r
-\r
+int nGotIRCAddresses = 0;\r
\r
\r
\r
CAddrDB addrdb;\r
if (AddAddress(addrdb, addr))\r
printf("IRC got new address\n");\r
- else\r
- {\r
- // make it try connecting again\r
- CRITICAL_BLOCK(cs_mapAddresses)\r
- if (mapAddresses.count(addr.GetKey()))\r
- mapAddresses[addr.GetKey()].nLastFailed = 0;\r
- }\r
-\r
- CRITICAL_BLOCK(cs_mapIRCAddresses)\r
- mapIRCAddresses.insert(make_pair(addr.GetKey(), addr));\r
+ nGotIRCAddresses++;\r
}\r
else\r
{\r
\r
extern bool RecvLine(SOCKET hSocket, string& strLine);\r
extern void ThreadIRCSeed(void* parg);\r
-extern bool fRestartIRCSeed;\r
\r
-extern map<vector<unsigned char>, CAddress> mapIRCAddresses;\r
-extern CCriticalSection cs_mapIRCAddresses;\r
+extern int nGotIRCAddresses;\r
if (fInsertedNew)\r
wtx.nTimeReceived = GetAdjustedTime();\r
\r
- //// debug print\r
- printf("AddToWallet %s %s\n", wtxIn.GetHash().ToString().substr(0,6).c_str(), fInsertedNew ? "new" : "update");\r
-\r
+ bool fUpdated = false;\r
if (!fInsertedNew)\r
{\r
// Merge\r
- bool fUpdated = false;\r
if (wtxIn.hashBlock != 0 && wtxIn.hashBlock != wtx.hashBlock)\r
{\r
wtx.hashBlock = wtxIn.hashBlock;\r
wtx.fSpent = wtxIn.fSpent;\r
fUpdated = true;\r
}\r
- if (!fUpdated)\r
- return true;\r
}\r
\r
+ //// debug print\r
+ printf("AddToWallet %s %s%s\n", wtxIn.GetHash().ToString().substr(0,6).c_str(), (fInsertedNew ? "new" : ""), (fUpdated ? "update" : ""));\r
+\r
// Write to disk\r
- if (!wtx.WriteToDisk())\r
- return false;\r
+ if (fInsertedNew || fUpdated)\r
+ if (!wtx.WriteToDisk())\r
+ return false;\r
\r
// Notify UI\r
vWalletUpdated.push_back(hash);\r
}\r
\r
if (prevout.n >= txPrev.vout.size() || prevout.n >= txindex.vSpent.size())\r
- return error("ConnectInputs() : %s prevout.n out of range %d %d %d", GetHash().ToString().substr(0,6).c_str(), prevout.n, txPrev.vout.size(), txindex.vSpent.size());\r
+ return error("ConnectInputs() : %s prevout.n out of range %d %d %d prev tx %s\n%s", GetHash().ToString().substr(0,6).c_str(), prevout.n, txPrev.vout.size(), txindex.vSpent.size(), prevout.hash.ToString().substr(0,6).c_str(), txPrev.ToString().c_str());\r
\r
// If prev is coinbase, check that it's matured\r
if (txPrev.IsCoinBase())\r
if (nTime <= pindexPrev->GetMedianTimePast())\r
return error("AcceptBlock() : block's timestamp is too early");\r
\r
- // Check that all transactions are finalized (starting around 30 Nov 2009)\r
+ // Check that all transactions are finalized (starting around Dec 2009)\r
if (nBestHeight > 31000) // 25620 + 5320\r
foreach(const CTransaction& tx, vtx)\r
if (!tx.IsFinal(nTime))\r
{\r
if (nFile == -1)\r
return NULL;\r
- FILE* file = fopen(strprintf("%s\\blk%04d.dat", GetDataDir().c_str(), nFile).c_str(), pszMode);\r
+ FILE* file = fopen(strprintf("%s/blk%04d.dat", GetDataDir().c_str(), nFile).c_str(), pszMode);\r
if (!file)\r
return NULL;\r
if (nBlockPos != 0 && !strchr(pszMode, 'a') && !strchr(pszMode, 'w'))\r
\r
\r
\r
+\r
if (strCommand == "version")\r
{\r
// Each connection can only send one version message\r
\r
pfrom->fSuccessfullyConnected = true;\r
\r
+ // Update the last seen time\r
+ if (pfrom->fNetworkNode)\r
+ AddressCurrentlyConnected(pfrom->addr);\r
+\r
printf("version message: version %d\n", pfrom->nVersion);\r
}\r
\r
vector<CAddress> vAddr;\r
vRecv >> vAddr;\r
\r
- // Clear addrknown lists periodically to allow refresh broadcasts\r
- static int64 nLastClearedAddrKnown;\r
- if (nLastClearedAddrKnown < GetAdjustedTime() - 24 * 60 * 60)\r
- {\r
- nLastClearedAddrKnown = GetAdjustedTime();\r
- CRITICAL_BLOCK(cs_vNodes)\r
- foreach(CNode* pnode, vNodes)\r
- pnode->setAddrKnown.clear();\r
- }\r
-\r
// Store the new addresses\r
CAddrDB addrdb;\r
- foreach(const CAddress& addr, vAddr)\r
+ foreach(CAddress& addr, vAddr)\r
{\r
if (fShutdown)\r
return true;\r
- AddAddress(addrdb, addr);\r
+ addr.nTime = GetAdjustedTime();\r
+ if (pfrom->fGetAddr)\r
+ addr.nTime -= 5 * 24 * 60 * 60;\r
+ AddAddress(addrdb, addr, false);\r
pfrom->AddAddressKnown(addr);\r
if (!pfrom->fGetAddr && addr.IsRoutable())\r
{\r
vector<CInv> vInv;\r
vRecv >> vInv;\r
\r
+ // Update the last seen time for this node's address\r
+ if (pfrom->fNetworkNode)\r
+ AddressCurrentlyConnected(pfrom->addr);\r
+\r
CTxDB txdb("r");\r
foreach(const CInv& inv, vInv)\r
{\r
if (pto->nVersion == 0)\r
return true;\r
\r
+ // Address refresh broadcast\r
+ static int64 nLastRebroadcast;\r
+ if (nLastRebroadcast < GetTime() - 24 * 60 * 60) // every 24 hours\r
+ {\r
+ nLastRebroadcast = GetTime();\r
+ CRITICAL_BLOCK(cs_vNodes)\r
+ {\r
+ foreach(CNode* pnode, vNodes)\r
+ {\r
+ // Periodically clear setAddrKnown to allow refresh broadcasts\r
+ pnode->setAddrKnown.clear();\r
+\r
+ // Rebroadcast our address\r
+ if (addrLocalHost.IsRoutable() && !fUseProxy)\r
+ pnode->PushAddress(addrLocalHost);\r
+ }\r
+ }\r
+ }\r
+\r
\r
//\r
// Message: addr\r
}\r
if (fGenerateBitcoins)\r
{\r
- int nProcessors = atoi(getenv("NUMBER_OF_PROCESSORS"));\r
+ int nProcessors = wxThread::GetCPUCount();\r
printf("%d processors\n", nProcessors);\r
if (nProcessors < 1)\r
nProcessors = 1;\r
return error("CBlock::WriteToDisk() : ftell failed");\r
fileout << *this;\r
\r
+ // Flush stdio buffers and commit to disk before returning\r
+ fflush(fileout);\r
+#ifdef __WXMSW__\r
+ _commit(_fileno(fileout));\r
+#else\r
+ fsync(fileno(fileout));\r
+#endif\r
+\r
return true;\r
}\r
\r
--- /dev/null
+# Copyright (c) 2009 Satoshi Nakamoto\r
+# Distributed under the MIT/X11 software license, see the accompanying\r
+# file license.txt or http://www.opensource.org/licenses/mit-license.php.\r
+\r
+\r
+ifneq "$(BUILD)" "debug"\r
+ifneq "$(BUILD)" "release"\r
+BUILD=debug\r
+endif\r
+endif\r
+ifeq "$(BUILD)" "debug"\r
+D=d\r
+DEBUGFLAGS=-g -D__WXDEBUG__\r
+endif\r
+\r
+\r
+\r
+INCLUDEPATHS=-I"/usr/include" \\r
+ -I"/usr/local/boost_1_40_0" \\r
+ -I"/usr/local/db-4.7.25.NC/build_unix" \\r
+ -I"/usr/local/include/wx-2.8" \\r
+ -I"/usr/local/lib/wx/include/gtk2-ansi-debug-static-2.8"\r
+\r
+LIBPATHS=-L"/usr/lib" \\r
+ -L"/usr/local/lib" \\r
+ -L"/usr/local/db-4.7.25.NC/build_unix"\r
+\r
+LIBS= \\r
+ -Wl,-Bstatic -l boost_thread -l boost_system -l boost_filesystem -Wl,-Bdynamic \\r
+ -Wl,-Bstatic -l db_cxx -l wx_gtk2$(D)-2.8 -Wl,-Bdynamic \\r
+ -l crypto \\r
+ -l gtk-x11-2.0 -l gthread-2.0 -l SM\r
+WXDEFS=-D__WXGTK__ -DNOPCH\r
+CFLAGS=-O0 -w -Wno-invalid-offsetof -Wformat $(DEBUGFLAGS) $(WXDEFS) $(INCLUDEPATHS)\r
+HEADERS=headers.h util.h main.h serialize.h uint256.h key.h bignum.h script.h db.h base58.h\r
+\r
+\r
+\r
+all: bitcoin\r
+\r
+\r
+headers.h.gch: headers.h $(HEADERS) net.h irc.h market.h uibase.h ui.h\r
+ g++ -c $(CFLAGS) -o $@ $<\r
+\r
+obj/util.o: util.cpp $(HEADERS)\r
+ g++ -c $(CFLAGS) -o $@ $<\r
+\r
+obj/script.o: script.cpp $(HEADERS)\r
+ g++ -c $(CFLAGS) -o $@ $<\r
+\r
+obj/db.o: db.cpp $(HEADERS) market.h\r
+ g++ -c $(CFLAGS) -o $@ $<\r
+\r
+obj/net.o: net.cpp $(HEADERS) net.h\r
+ g++ -c $(CFLAGS) -o $@ $<\r
+\r
+obj/main.o: main.cpp $(HEADERS) net.h market.h sha.h\r
+ g++ -c $(CFLAGS) -o $@ $<\r
+\r
+obj/market.o: market.cpp $(HEADERS) market.h\r
+ g++ -c $(CFLAGS) -o $@ $<\r
+\r
+obj/ui.o: ui.cpp $(HEADERS) net.h uibase.h ui.h market.h\r
+ g++ -c $(CFLAGS) -o $@ $<\r
+\r
+obj/uibase.o: uibase.cpp uibase.h\r
+ g++ -c $(CFLAGS) -o $@ $<\r
+\r
+obj/sha.o: sha.cpp sha.h\r
+ g++ -c $(CFLAGS) -O3 -o $@ $<\r
+\r
+obj/irc.o: irc.cpp $(HEADERS)\r
+ g++ -c $(CFLAGS) -o $@ $<\r
+\r
+\r
+\r
+\r
+OBJS=obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o obj/market.o \\r
+ obj/ui.o obj/uibase.o obj/sha.o obj/irc.o \r
+\r
+bitcoin: headers.h.gch $(OBJS)\r
+ g++ $(CFLAGS) -o $@ $(LIBPATHS) $(OBJS) $(LIBS)\r
+\r
+clean:\r
+ -rm obj/*\r
+ -rm headers.h.gch\r
// file license.txt or http://www.opensource.org/licenses/mit-license.php.\r
\r
#include "headers.h"\r
-#include <winsock2.h>\r
\r
void ThreadMessageHandler2(void* parg);\r
void ThreadSocketHandler2(void* parg);\r
\r
\r
\r
-bool AddAddress(CAddrDB& addrdb, const CAddress& addr)\r
+bool AddAddress(CAddrDB& addrdb, CAddress addr, bool fCurrentlyOnline)\r
{\r
if (!addr.IsRoutable())\r
return false;\r
if (addr.ip == addrLocalHost.ip)\r
return false;\r
+ if (fCurrentlyOnline)\r
+ addr.nTime = GetAdjustedTime();\r
CRITICAL_BLOCK(cs_mapAddresses)\r
{\r
map<vector<unsigned char>, CAddress>::iterator it = mapAddresses.find(addr.GetKey());\r
}\r
else\r
{\r
+ bool fUpdated = false;\r
CAddress& addrFound = (*it).second;\r
if ((addrFound.nServices | addr.nServices) != addrFound.nServices)\r
{\r
// Services have been added\r
addrFound.nServices |= addr.nServices;\r
- addrdb.WriteAddress(addrFound);\r
- return true;\r
+ fUpdated = true;\r
+ }\r
+ int64 nUpdateInterval = (fCurrentlyOnline ? 60 * 60 : 24 * 60 * 60);\r
+ if (addrFound.nTime < addr.nTime - nUpdateInterval)\r
+ {\r
+ // Periodically update most recently seen time\r
+ addrFound.nTime = addr.nTime;\r
+ fUpdated = true;\r
}\r
- else if (addrFound.nTime < GetAdjustedTime() - 24 * 60 * 60)\r
+ if (fUpdated)\r
+ addrdb.WriteAddress(addrFound);\r
+ }\r
+ }\r
+ return false;\r
+}\r
+\r
+void AddressCurrentlyConnected(const CAddress& addr)\r
+{\r
+ CRITICAL_BLOCK(cs_mapAddresses)\r
+ {\r
+ // Only if it's been published already\r
+ map<vector<unsigned char>, CAddress>::iterator it = mapAddresses.find(addr.GetKey());\r
+ if (it != mapAddresses.end())\r
+ {\r
+ CAddress& addrFound = (*it).second;\r
+ int64 nUpdateInterval = 60 * 60;\r
+ if (addrFound.nTime < GetAdjustedTime() - nUpdateInterval)\r
{\r
// Periodically update most recently seen time\r
addrFound.nTime = GetAdjustedTime();\r
+ CAddrDB addrdb;\r
addrdb.WriteAddress(addrFound);\r
- return false;\r
}\r
}\r
}\r
- return false;\r
}\r
\r
\r
printf("connected %s\n", addrConnect.ToStringLog().c_str());\r
\r
// Set to nonblocking\r
- u_long nOne = 1;\r
+#ifdef __WXMSW__\r
+ u_long nOne = 1;\r
if (ioctlsocket(hSocket, FIONBIO, &nOne) == SOCKET_ERROR)\r
printf("ConnectSocket() : ioctlsocket nonblocking setting failed, error %d\n", WSAGetLastError());\r
+#else\r
+ if (fcntl(hSocket, F_SETFL, O_NONBLOCK) == SOCKET_ERROR)\r
+ printf("ConnectSocket() : fcntl nonblocking setting failed, error %d\n", errno);\r
+#endif\r
\r
// Add node\r
CNode* pnode = new CNode(hSocket, addrConnect, false);\r
else\r
{\r
CRITICAL_BLOCK(cs_mapAddresses)\r
- mapAddresses[addrConnect.GetKey()].nLastFailed = GetTime();\r
+ mapAddresses[addrConnect.GetKey()].nLastFailed = GetAdjustedTime();\r
return NULL;\r
}\r
}\r
// If outbound and never got version message, mark address as failed\r
if (!fInbound && !fSuccessfullyConnected)\r
CRITICAL_BLOCK(cs_mapAddresses)\r
- mapAddresses[addr.GetKey()].nLastFailed = GetTime();\r
+ mapAddresses[addr.GetKey()].nLastFailed = GetAdjustedTime();\r
\r
// All of a nodes broadcasts and subscriptions are automatically torn down\r
// when it goes down, so a node has to stay up to keep its broadcast going.\r
timeout.tv_sec = 0;\r
timeout.tv_usec = 50000; // frequency to poll pnode->vSend\r
\r
- struct fd_set fdsetRecv;\r
- struct fd_set fdsetSend;\r
+ fd_set fdsetRecv;\r
+ fd_set fdsetSend;\r
FD_ZERO(&fdsetRecv);\r
FD_ZERO(&fdsetSend);\r
SOCKET hSocketMax = 0;\r
if (FD_ISSET(hListenSocket, &fdsetRecv))\r
{\r
struct sockaddr_in sockaddr;\r
+#ifdef __WXMSW__\r
int len = sizeof(sockaddr);\r
+#else\r
+ socklen_t len = sizeof(sockaddr);\r
+#endif\r
SOCKET hSocket = accept(hListenSocket, (struct sockaddr*)&sockaddr, &len);\r
CAddress addr(sockaddr);\r
if (hSocket == INVALID_SOCKET)\r
}\r
\r
// Initiate network connections\r
- int nTry = 0;\r
- bool fIRCOnly = false;\r
- const int nMaxConnections = 15;\r
loop\r
{\r
// Wait\r
vnThreadsRunning[1]--;\r
Sleep(500);\r
+ const int nMaxConnections = 15;\r
while (vNodes.size() >= nMaxConnections || vNodes.size() >= mapAddresses.size())\r
{\r
CheckForShutdown(1);\r
vnThreadsRunning[1]++;\r
CheckForShutdown(1);\r
\r
-\r
//\r
- // The IP selection process is designed to limit vulnerability to address flooding.\r
- // Any class C (a.b.c.?) has an equal chance of being chosen, then an IP is\r
- // chosen within the class C. An attacker may be able to allocate many IPs, but\r
- // they would normally be concentrated in blocks of class C's. They can hog the\r
- // attention within their class C, but not the whole IP address space overall.\r
- // A lone node in a class C will get as much attention as someone holding all 255\r
- // IPs in another class C.\r
+ // Choose an address to connect to based on most recently seen\r
//\r
+ CAddress addrConnect;\r
+ int64 nBestTime = 0;\r
+ int64 nDelay = ((60 * 60) << vNodes.size());\r
+ if (vNodes.size() >= 3)\r
+ nDelay *= 4;\r
+ if (nGotIRCAddresses > 0)\r
+ nDelay *= 100;\r
+\r
+ // Do this here so we don't have to critsect vNodes inside mapAddresses critsect\r
+ set<unsigned int> setConnected;\r
+ CRITICAL_BLOCK(cs_vNodes)\r
+ foreach(CNode* pnode, vNodes)\r
+ setConnected.insert(pnode->addr.ip);\r
\r
- // Every other try is with IRC addresses only\r
- fIRCOnly = !fIRCOnly;\r
- if (mapIRCAddresses.empty())\r
- fIRCOnly = false;\r
- else if (nTry++ < 30 && vNodes.size() < nMaxConnections/2)\r
- fIRCOnly = true;\r
-\r
- // Make a list of unique class C's\r
- unsigned char pchIPCMask[4] = { 0xff, 0xff, 0xff, 0x00 };\r
- unsigned int nIPCMask = *(unsigned int*)pchIPCMask;\r
- vector<unsigned int> vIPC;\r
- CRITICAL_BLOCK(cs_mapIRCAddresses)\r
CRITICAL_BLOCK(cs_mapAddresses)\r
{\r
- vIPC.reserve(mapAddresses.size());\r
- unsigned int nPrev = 0;\r
foreach(const PAIRTYPE(vector<unsigned char>, CAddress)& item, mapAddresses)\r
{\r
const CAddress& addr = item.second;\r
- if (!addr.IsIPv4())\r
- continue;\r
- if (fIRCOnly && !mapIRCAddresses.count(item.first))\r
+ if (!addr.IsIPv4() || !addr.IsValid() || setConnected.count(addr.ip))\r
continue;\r
\r
- // Taking advantage of mapAddresses being in sorted order,\r
- // with IPs of the same class C grouped together.\r
- unsigned int ipC = addr.ip & nIPCMask;\r
- if (ipC != nPrev)\r
- vIPC.push_back(nPrev = ipC);\r
- }\r
- }\r
- if (vIPC.empty())\r
- continue;\r
-\r
- // Choose a random class C\r
- unsigned int ipC = vIPC[GetRand(vIPC.size())];\r
+ // Limit retry frequency\r
+ if (GetAdjustedTime() < addr.nLastFailed + nDelay)\r
+ continue;\r
\r
- // Organize all addresses in the class C by IP\r
- map<unsigned int, vector<CAddress> > mapIP;\r
- CRITICAL_BLOCK(cs_mapIRCAddresses)\r
- CRITICAL_BLOCK(cs_mapAddresses)\r
- {\r
- int64 nDelay = ((30 * 60) << vNodes.size());\r
- if (!fIRCOnly)\r
- {\r
- nDelay *= 2;\r
- if (vNodes.size() >= 3)\r
- nDelay *= 4;\r
- if (!mapIRCAddresses.empty())\r
- nDelay *= 100;\r
- }\r
+ // Try again only after all addresses had a first attempt\r
+ int64 nTime = addr.nTime;\r
+ if (addr.nLastFailed > addr.nTime)\r
+ nTime -= 365 * 24 * 60 * 60;\r
\r
- for (map<vector<unsigned char>, CAddress>::iterator mi = mapAddresses.lower_bound(CAddress(ipC, 0).GetKey());\r
- mi != mapAddresses.upper_bound(CAddress(ipC | ~nIPCMask, 0xffff).GetKey());\r
- ++mi)\r
- {\r
- const CAddress& addr = (*mi).second;\r
- if (fIRCOnly && !mapIRCAddresses.count((*mi).first))\r
- continue;\r
+ // Randomize the order a little, putting the standard port first\r
+ nTime += GetRand(1 * 60 * 60);\r
+ if (addr.port != DEFAULT_PORT)\r
+ nTime -= 1 * 60 * 60;\r
\r
- int64 nRandomizer = (addr.nLastFailed * addr.ip * 7777U) % 20000;\r
- if (GetTime() - addr.nLastFailed > nDelay * nRandomizer / 10000)\r
- mapIP[addr.ip].push_back(addr);\r
+ if (nTime > nBestTime)\r
+ {\r
+ nBestTime = nTime;\r
+ addrConnect = addr;\r
+ }\r
}\r
}\r
- if (mapIP.empty())\r
- continue;\r
-\r
- // Choose a random IP in the class C\r
- map<unsigned int, vector<CAddress> >::iterator mi = mapIP.begin();\r
- advance(mi, GetRand(mapIP.size()));\r
\r
- // Once we've chosen an IP, we'll try every given port before moving on\r
- foreach(const CAddress& addrConnect, (*mi).second)\r
- if (OpenNetworkConnection(addrConnect))\r
- break;\r
+ if (addrConnect.IsValid())\r
+ OpenNetworkConnection(addrConnect);\r
}\r
}\r
\r
pnodeLocalHost = new CNode(INVALID_SOCKET, CAddress("127.0.0.1", nLocalServices));\r
strError = "";\r
\r
+#ifdef __WXMSW__\r
// Sockets startup\r
WSADATA wsadata;\r
int ret = WSAStartup(MAKEWORD(2,2), &wsadata);\r
printf("%s\n", strError.c_str());\r
return false;\r
}\r
+#endif\r
\r
// Get local host ip\r
char pszHostName[255];\r
}\r
\r
// Set to nonblocking, incoming connections will also inherit this\r
+#ifdef __WXMSW__\r
u_long nOne = 1;\r
if (ioctlsocket(hListenSocket, FIONBIO, &nOne) == SOCKET_ERROR)\r
+#else\r
+ if (fcntl(hListenSocket, F_SETFL, O_NONBLOCK) == SOCKET_ERROR)\r
+#endif\r
{\r
- strError = strprintf("Error: Couldn't set properties on socket for incoming connections (ioctlsocket returned error %d)", WSAGetLastError());\r
+ strError = strprintf("Error: Couldn't set properties on socket for incoming connections (error %d)", WSAGetLastError());\r
printf("%s\n", strError.c_str());\r
return false;\r
}\r
// IP address, and port for the socket that is being bound\r
int nRetryLimit = 15;\r
struct sockaddr_in sockaddr = addrLocalHost.GetSockAddr();\r
- if (bind(hListenSocket, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == SOCKET_ERROR)\r
+ if (::bind(hListenSocket, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == SOCKET_ERROR)\r
{\r
int nErr = WSAGetLastError();\r
if (nErr == WSAEADDRINUSE)\r
Sleep(50);\r
\r
// Sockets shutdown\r
+#ifdef __WXMSW__\r
WSACleanup();\r
+#endif\r
return true;\r
}\r
\r
\r
bool ConnectSocket(const CAddress& addrConnect, SOCKET& hSocketRet);\r
bool GetMyExternalIP(unsigned int& ipRet);\r
-bool AddAddress(CAddrDB& addrdb, const CAddress& addr);\r
+bool AddAddress(CAddrDB& addrdb, CAddress addr, bool fCurrentlyOnline=true);\r
+void AddressCurrentlyConnected(const CAddress& addr);\r
CNode* FindNode(unsigned int ip);\r
CNode* ConnectNode(CAddress addrConnect, int64 nTimeout=0);\r
void AbandonRequests(void (*fn)(void*, CDataStream&), void* param1);\r
CDataStream GetStreamFromEvent(const wxCommandEvent& event)\r
{\r
wxString strData = event.GetString();\r
- return CDataStream(strData.begin(), strData.begin() + event.GetInt(), SER_NETWORK);\r
+ const char* pszBegin = strData.c_str();\r
+ return CDataStream(pszBegin, pszBegin + event.GetInt(), SER_NETWORK);\r
}\r
\r
\r
SetIcon(wxICON(bitcoin));\r
ptaskbaricon = new CMyTaskBarIcon();\r
\r
- // Init toolbar with transparency masked bitmaps\r
- m_toolBar->ClearTools();\r
-\r
- //// shouldn't have to do mask separately anymore, bitmap alpha support added in wx 2.8.9,\r
- wxBitmap bmpSend(wxT("send20"), wxBITMAP_TYPE_RESOURCE);\r
- bmpSend.SetMask(new wxMask(wxBitmap(wxT("send20mask"), wxBITMAP_TYPE_RESOURCE)));\r
- m_toolBar->AddTool(wxID_BUTTONSEND, wxT("&Send Coins"), bmpSend, wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString);\r
-\r
- wxBitmap bmpAddressBook(wxT("addressbook20"), wxBITMAP_TYPE_RESOURCE);\r
- bmpAddressBook.SetMask(new wxMask(wxBitmap(wxT("addressbook20mask"), wxBITMAP_TYPE_RESOURCE)));\r
- m_toolBar->AddTool(wxID_BUTTONRECEIVE, wxT("&Address Book"), bmpAddressBook, wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString);\r
-\r
- m_toolBar->Realize();\r
-\r
// Init column headers\r
int nDateWidth = DateTimeStr(1229413914).size() * 6 + 8;\r
if (!strstr(DateTimeStr(1229413914).c_str(), "2008"))\r
{\r
TRY_CRITICAL_BLOCK(cs_mapWallet)\r
{\r
- bool fInserted = false;\r
+ string strTop;\r
+ if (m_listCtrl->GetItemCount())\r
+ strTop = (string)m_listCtrl->GetItemText(0);\r
foreach(uint256 hash, vWalletUpdated)\r
{\r
map<uint256, CWalletTx>::iterator mi = mapWallet.find(hash);\r
if (mi != mapWallet.end())\r
- fInserted |= InsertTransaction((*mi).second, false);\r
+ InsertTransaction((*mi).second, false);\r
}\r
vWalletUpdated.clear();\r
- if (fInserted)\r
+ if (m_listCtrl->GetItemCount() && strTop != (string)m_listCtrl->GetItemText(0))\r
m_listCtrl->ScrollList(0, INT_MAX);\r
}\r
}\r
string strStatus = strprintf(" %d connections %d blocks %d transactions", vNodes.size(), nBestHeight + 1, nTransactionCount);\r
m_statusBar->SetStatusText(strStatus, 2);\r
\r
+#ifdef __WXMSW__\r
m_listCtrl->OnPaint(event);\r
+#endif\r
}\r
\r
\r
m_checkBoxLimitProcessors->SetValue(fLimitProcessors);\r
m_spinCtrlLimitProcessors->Enable(fLimitProcessors);\r
m_spinCtrlLimitProcessors->SetValue(nLimitProcessors);\r
- int nProcessors = atoi(getenv("NUMBER_OF_PROCESSORS"));\r
+ int nProcessors = wxThread::GetCPUCount();\r
if (nProcessors < 1)\r
nProcessors = 999;\r
m_spinCtrlLimitProcessors->SetRange(1, nProcessors);\r
walletdb.WriteSetting("fMinimizeOnClose", fMinimizeOnClose);\r
}\r
\r
- if (fUseProxy != m_checkBoxUseProxy->GetValue())\r
- {\r
- fUseProxy = m_checkBoxUseProxy->GetValue();\r
- walletdb.WriteSetting("fUseProxy", fUseProxy);\r
- }\r
+ fUseProxy = m_checkBoxUseProxy->GetValue();\r
+ walletdb.WriteSetting("fUseProxy", fUseProxy);\r
\r
- if (addrProxy != GetProxyAddr())\r
- {\r
- addrProxy = GetProxyAddr();\r
- walletdb.WriteSetting("addrProxy", addrProxy);\r
- }\r
+ addrProxy = GetProxyAddr();\r
+ walletdb.WriteSetting("addrProxy", addrProxy);\r
}\r
\r
\r
//// todo: should add a display of your balance for convenience\r
\r
// Set Icon\r
- wxBitmap bmpSend(wxT("send16"), wxBITMAP_TYPE_RESOURCE);\r
- bmpSend.SetMask(new wxMask(wxBitmap(wxT("send16masknoshadow"), wxBITMAP_TYPE_RESOURCE)));\r
wxIcon iconSend;\r
- iconSend.CopyFromBitmap(bmpSend);\r
+ iconSend.CopyFromBitmap(wxBitmap(send16noshadow_xpm));\r
SetIcon(iconSend);\r
\r
wxCommandEvent event;\r
m_listCtrl->SetFocus();\r
\r
// Set Icon\r
- wxBitmap bmpAddressBook(wxT("addressbook16"), wxBITMAP_TYPE_RESOURCE);\r
- bmpAddressBook.SetMask(new wxMask(wxBitmap(wxT("addressbook16mask"), wxBITMAP_TYPE_RESOURCE)));\r
wxIcon iconAddressBook;\r
- iconAddressBook.CopyFromBitmap(bmpAddressBook);\r
+ iconAddressBook.CopyFromBitmap(wxBitmap(addressbook16_xpm));\r
SetIcon(iconAddressBook);\r
\r
// Fill listctrl with address book data\r
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);\r
_CrtSetReportFile(_CRT_WARN, CreateFile("NUL", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0));\r
#endif\r
-#ifdef __WXDEBUG__\r
+#if defined(__WXMSW__) && defined(__WXDEBUG__)\r
// Disable malfunctioning wxWidgets debug assertion\r
g_isPainting = 10000;\r
#endif\r
" -gen=0\t\t Don't generate coins\n"\r
" -min\t\t Start minimized\n"\r
" -datadir=<dir>\t Specify data directory\n"\r
- " -proxy=<ip:port>\t Connect through socks4 proxy,\n"\r
- " \t\t e.g. -proxy=127.0.0.1:9050 to use TOR\n"\r
+ " -proxy=<ip:port>\t Connect through socks4 proxy\n"\r
" -addnode=<ip>\t Add a node to connect to\n"\r
" -connect=<ip>\t Connect only to the specified node\n"\r
" -?\t\t This help message\n";\r
unsigned int nStart = GetTime();\r
loop\r
{\r
+ // TODO: find out how to do this in Linux, or replace with wxWidgets commands\r
+#ifdef __WXMSW__\r
// Show the previous instance and exit\r
HWND hwndPrev = FindWindow("wxWindowClassNR", "Bitcoin");\r
if (hwndPrev)\r
SetForegroundWindow(hwndPrev);\r
return false;\r
}\r
+#endif\r
\r
if (GetTime() > nStart + 60)\r
return false;\r
fPrintToDebugger = true;\r
\r
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");\r
- printf("Bitcoin version %d, Windows version %08x\n", VERSION, GetVersion());\r
+ printf("Bitcoin version %d, OS version %s\n", VERSION, wxGetOsDescription().mb_str());\r
\r
if (mapArgs.count("-dropmessages"))\r
{\r
return false;\r
}\r
\r
+ if (mapArgs.count("-printblock"))\r
+ {\r
+ string strMatch = mapArgs["-printblock"];\r
+ int nFound = 0;\r
+ for (map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.begin(); mi != mapBlockIndex.end(); ++mi)\r
+ {\r
+ uint256 hash = (*mi).first;\r
+ if (strncmp(hash.ToString().c_str(), strMatch.c_str(), strMatch.size()) == 0)\r
+ {\r
+ CBlockIndex* pindex = (*mi).second;\r
+ CBlock block;\r
+ block.ReadFromDisk(pindex, true);\r
+ block.BuildMerkleTree();\r
+ block.print();\r
+ printf("\n");\r
+ nFound++;\r
+ }\r
+ }\r
+ if (nFound == 0)\r
+ printf("No blocks matching %s were found\n", strMatch.c_str());\r
+ OnExit();\r
+ return false;\r
+ }\r
+\r
if (mapArgs.count("-gen"))\r
{\r
if (mapArgs["-gen"].empty())\r
fGenerateBitcoins = true;\r
else\r
- fGenerateBitcoins = atoi(mapArgs["-gen"].c_str());\r
+ fGenerateBitcoins = (atoi(mapArgs["-gen"].c_str()) != 0);\r
}\r
\r
if (mapArgs.count("-proxy"))\r
OnExit();\r
return false;\r
}\r
- CWalletDB walletdb;\r
- walletdb.WriteSetting("fUseProxy", fUseProxy);\r
- walletdb.WriteSetting("addrProxy", addrProxy);\r
}\r
\r
if (mapArgs.count("-addnode"))\r
foreach(string strAddr, mapMultiArgs["-addnode"])\r
{\r
CAddress addr(strAddr, NODE_NETWORK);\r
+ addr.nTime = 0; // so it won't relay unless successfully connected\r
if (addr.IsValid())\r
AddAddress(addrdb, addr);\r
}\r
//\r
// Tests\r
//\r
+#ifdef __WXMSW__\r
if (argc >= 2 && stricmp(argv[1], "-send") == 0)\r
+#else\r
+ if (argc >= 2 && strcmp(argv[1], "-send") == 0)\r
+#endif\r
{\r
int64 nValue = 1;\r
if (argc >= 3)\r
\r
\r
\r
-typedef WINSHELLAPI BOOL WINAPI (*PSHGETSPECIALFOLDERPATHA)(HWND hwndOwner, LPSTR lpszPath, int nFolder, BOOL fCreate);\r
+#ifdef __WXMSW__\r
+typedef WINSHELLAPI BOOL (WINAPI *PSHGETSPECIALFOLDERPATHA)(HWND hwndOwner, LPSTR lpszPath, int nFolder, BOOL fCreate);\r
\r
string MyGetSpecialFolderPath(int nFolder, bool fCreate)\r
{\r
CoUninitialize();\r
}\r
}\r
-\r
+#else\r
+bool GetStartOnSystemStartup() { return false; }\r
+void SetStartOnSystemStartup(bool fAutoStart) { }\r
+#endif\r
\r
\r
\r
\r
#include "uibase.h"\r
\r
+#include "xpm/addressbook20.xpm"\r
+#include "xpm/check.xpm"\r
+#include "xpm/send20.xpm"\r
+\r
///////////////////////////////////////////////////////////////////////////\r
\r
CMainFrameBase::CMainFrameBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )\r
m_toolBar->SetToolSeparation( 1 );\r
m_toolBar->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxEmptyString ) );\r
\r
- m_toolBar->AddTool( wxID_BUTTONSEND, wxT("&Send Coins"), wxBitmap( wxT("send20"), wxBITMAP_TYPE_RESOURCE ), wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString );\r
- m_toolBar->AddTool( wxID_BUTTONRECEIVE, wxT("&Address Book"), wxBitmap( wxT("addressbook20"), wxBITMAP_TYPE_RESOURCE ), wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString );\r
+ m_toolBar->AddTool( wxID_BUTTONSEND, wxT("&Send Coins"), wxBitmap( send20_xpm ), wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString );\r
+ m_toolBar->AddTool( wxID_BUTTONRECEIVE, wxT("&Address Book"), wxBitmap( addressbook20_xpm ), wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString );\r
m_toolBar->Realize();\r
\r
m_statusBar = this->CreateStatusBar( 1, wxST_SIZEGRIP, wxID_ANY );\r
\r
bSizer47->Add( 0, 0, 1, wxEXPAND, 5 );\r
\r
- m_bitmapCheckMark = new wxStaticBitmap( this, wxID_ANY, wxICON( check ), wxDefaultPosition, wxSize( 16,16 ), 0 );\r
+ m_bitmapCheckMark = new wxStaticBitmap( this, wxID_ANY, wxBitmap( check_xpm ), wxDefaultPosition, wxSize( 16,16 ), 0 );\r
bSizer47->Add( m_bitmapCheckMark, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );\r
\r
m_staticText36 = new wxStaticText( this, wxID_ANY, wxT("Pay &To:"), wxDefaultPosition, wxSize( -1,-1 ), wxALIGN_RIGHT );\r
</object>\r
</object>\r
</object>\r
- <object class="wxToolBar" expanded="0">\r
+ <object class="wxToolBar" expanded="1">\r
<property name="bg"></property>\r
<property name="bitmapsize">20,20</property>\r
<property name="context_help"></property>\r
<event name="OnSize"></event>\r
<event name="OnUpdateUI"></event>\r
<object class="tool" expanded="1">\r
- <property name="bitmap">send20; Load From Resource</property>\r
+ <property name="bitmap">xpm/send20.xpm; Load From File</property>\r
<property name="id">wxID_BUTTONSEND</property>\r
<property name="kind">wxITEM_NORMAL</property>\r
<property name="label">&Send Coins</property>\r
<event name="OnUpdateUI"></event>\r
</object>\r
<object class="tool" expanded="1">\r
- <property name="bitmap">addressbook20; Load From Resource</property>\r
+ <property name="bitmap">xpm/addressbook20.xpm; Load From File</property>\r
<property name="id">wxID_BUTTONRECEIVE</property>\r
<property name="kind">wxITEM_NORMAL</property>\r
<property name="label">&Address Book</property>\r
</object>\r
</object>\r
</object>\r
- <object class="Dialog" expanded="1">\r
+ <object class="Dialog" expanded="0">\r
<property name="bg"></property>\r
<property name="center"></property>\r
<property name="context_help"></property>\r
<property name="proportion">0</property>\r
<object class="wxStaticBitmap" expanded="1">\r
<property name="bg"></property>\r
- <property name="bitmap">check; Load From Icon Resource [-1; -1]</property>\r
+ <property name="bitmap">xpm/check.xpm; Load From File</property>\r
<property name="context_help"></property>\r
<property name="enabled">1</property>\r
<property name="fg"></property>\r
ppmutexOpenSSL[i] = new wxMutex();\r
CRYPTO_set_locking_callback(locking_callback);\r
\r
+#ifdef __WXMSW__\r
// Seed random number generator with screen scrape and other hardware sources\r
RAND_screen();\r
+#endif\r
\r
// Seed random number generator with performance counter\r
RandAddSeed();\r
pszValue = strchr(psz, '=');\r
*pszValue++ = '\0';\r
}\r
- strlwr(psz);\r
#ifdef __WXMSW__\r
+ _strlwr(psz);\r
if (psz[0] == '/')\r
psz[0] = '-';\r
#endif\r
\r
void FormatException(char* pszMessage, std::exception* pex, const char* pszThread)\r
{\r
+#ifdef __WXMSW__\r
char pszModule[MAX_PATH];\r
pszModule[0] = '\0';\r
GetModuleFileName(NULL, pszModule, sizeof(pszModule));\r
+#else\r
+ const char* pszModule = wxStandardPaths::Get().GetExecutablePath().mb_str();\r
+#endif\r
if (pex)\r
snprintf(pszMessage, 1000,\r
"EXCEPTION: %s \n%s \n%s in %s \n", typeid(*pex).name(), pex->what(), pszModule, pszThread);\r
}\r
\r
#ifndef __WXMSW__\r
-#define closesocket(s) close(s)\r
-#define INVALID_SOCKET (SOCKET)(~0)\r
+#define _UI64_MAX UINT64_MAX\r
+#define _I64_MAX INT64_MAX\r
+#define WSAGetLastError() errno\r
+#define WSAEWOULDBLOCK EWOULDBLOCK\r
+#define WSAEMSGSIZE EMSGSIZE\r
+#define WSAEINTR EINTR\r
+#define WSAEINPROGRESS EINPROGRESS\r
+#define WSAEADDRINUSE EADDRINUSE\r
+#define closesocket(s) close(s)\r
+#define INVALID_SOCKET (SOCKET)(~0)\r
+#define SOCKET_ERROR -1\r
typedef u_int SOCKET;\r
+#define _vsnprintf(a,b,c,d) vsnprintf(a,b,c,d)\r
+#define strlwr(psz) to_lower(psz)\r
+#define _strlwr(psz) to_lower(psz)\r
+#define _mkdir(psz) filesystem::create_directory(psz)\r
+#define MAX_PATH 1024\r
+#define Sleep(n) wxMilliSleep(n)\r
+#define Beep(n1,n2) (0)\r
+inline int _beginthread(void(*pfn)(void*), unsigned nStack, void* parg) { thread(bind(pfn, parg)); return 0; }\r
+inline void _endthread() { pthread_exit(NULL); }\r
+inline int GetCurrentThread() { return 0; }\r
+// threads are processes on linux, so setpriority affects just the one thread\r
+inline void SetThreadPriority(int nThread, int nPriority) { setpriority(PRIO_PROCESS, getpid(), nPriority); }\r
+#define THREAD_PRIORITY_LOWEST PRIO_MIN\r
+#define THREAD_PRIORITY_BELOW_NORMAL 2\r
+#define THREAD_PRIORITY_NORMAL 0\r
+#define THREAD_PRIORITY_ABOVE_NORMAL 0\r
#endif\r
\r
\r
protected:\r
wxMutex mutex;\r
public:\r
- explicit CCriticalSection() { }\r
+ explicit CCriticalSection() : mutex(wxMUTEX_RECURSIVE) { }\r
~CCriticalSection() { }\r
void Enter() { mutex.Lock(); }\r
void Leave() { mutex.Unlock(); }\r
// print to debug.log\r
char pszFile[MAX_PATH+100];\r
GetDataDir(pszFile);\r
- strlcat(pszFile, "\\debug.log", sizeof(pszFile));\r
+ strlcat(pszFile, "/debug.log", sizeof(pszFile));\r
FILE* fileout = fopen(pszFile, "a");\r
if (fileout)\r
{\r
return wxGetLocalTimeMillis().GetValue();\r
}\r
\r
-#ifndef __WXMSW__\r
-inline void Sleep(unsigned int nMilliseconds)\r
-{\r
- wxMilliSleep(nMilliseconds);\r
-}\r
-#endif\r
-\r
\r
\r
\r
--- /dev/null
+/* XPM */\r
+static char * addressbook16_xpm[] = {\r
+/* columns rows colors chars-per-pixel */\r
+"16 16 256 2",\r
+" c #FFFFFF",\r
+". c #F7FFFF",\r
+"X c #F7F7FF",\r
+"o c #EFF7FF",\r
+"O c #E6EFF7",\r
+"+ c #E6E6F7",\r
+"@ c #CEE6F7",\r
+"# c #DEDEEF",\r
+"$ c #D6DEEF",\r
+"% c #D6DEE6",\r
+"& c #CEDEF7",\r
+"* c #CEDEEF",\r
+"= c #EFF708",\r
+"- c #C5DEF7",\r
+"; c #CED6EF",\r
+": c None",\r
+"> c #C5D6E6",\r
+", c #BDD6F7",\r
+"< c #BDD6EF",\r
+"1 c #D6CECE",\r
+"2 c #BDCEE6",\r
+"3 c #BDC5E6",\r
+"4 c #B5C5DE",\r
+"5 c #BDD631",\r
+"6 c #ADBDDE",\r
+"7 c #B5B5BD",\r
+"8 c #A5B5D6",\r
+"9 c #00FFFF",\r
+"0 c #9CB5CE",\r
+"q c #9CADD6",\r
+"w c #94A5D6",\r
+"e c #8CA5D6",\r
+"r c #8CA5CE",\r
+"t c #8CA5C5",\r
+"y c #849CC5",\r
+"u c #7B9CD6",\r
+"i c #7B9CCE",\r
+"p c #31BDCE",\r
+"a c #6B9CD6",\r
+"s c #00F708",\r
+"d c #8494AD",\r
+"f c #7B94B5",\r
+"g c #6B94D6",\r
+"h c #6B9C84",\r
+"j c #7B8CAD",\r
+"k c #738CAD",\r
+"l c #638CC5",\r
+"z c #10CE42",\r
+"x c #638CBD",\r
+"c c #7B849C",\r
+"v c #73849C",\r
+"b c #6B84A5",\r
+"n c #7B7BA5",\r
+"m c #6B849C",\r
+"M c #7B8C42",\r
+"N c #5A84C5",\r
+"B c #29AD6B",\r
+"V c #F74A4A",\r
+"C c #6384A5",\r
+"Z c #5284C5",\r
+"A c #637BA5",\r
+"S c #637B9C",\r
+"D c #9C637B",\r
+"F c #6B7B5A",\r
+"G c #637394",\r
+"H c #52739C",\r
+"J c #5A7384",\r
+"K c #526B94",\r
+"L c #426B94",\r
+"P c #52638C",\r
+"I c #426B7B",\r
+"U c #5A5A8C",\r
+"Y c #524A7B",\r
+"T c #425273",\r
+"R c #21636B",\r
+"E c #106394",\r
+"W c #106B52",\r
+"Q c #3A4273",\r
+"! c #31426B",\r
+"~ c #523163",\r
+"^ c #29426B",\r
+"/ c #293A63",\r
+"( c #213A63",\r
+") c #193A63",\r
+"_ c #193163",\r
+"` c #19315A",\r
+"' c #212963",\r
+"] c #10315A",\r
+"[ c #082952",\r
+"{ c #FFCC33",\r
+"} c #33FF33",\r
+"| c #66FF33",\r
+" . c #99FF33",\r
+".. c #CCFF33",\r
+"X. c #FFFF33",\r
+"o. c #000066",\r
+"O. c #330066",\r
+"+. c #660066",\r
+"@. c #990066",\r
+"#. c #CC0066",\r
+"$. c #FF0066",\r
+"%. c #003366",\r
+"&. c #333366",\r
+"*. c #663366",\r
+"=. c #993366",\r
+"-. c #CC3366",\r
+";. c #FF3366",\r
+":. c #006666",\r
+">. c #336666",\r
+",. c #666666",\r
+"<. c #996666",\r
+"1. c #CC6666",\r
+"2. c #009966",\r
+"3. c #339966",\r
+"4. c #669966",\r
+"5. c #999966",\r
+"6. c #CC9966",\r
+"7. c #FF9966",\r
+"8. c #00CC66",\r
+"9. c #33CC66",\r
+"0. c #99CC66",\r
+"q. c #CCCC66",\r
+"w. c #FFCC66",\r
+"e. c #00FF66",\r
+"r. c #33FF66",\r
+"t. c #99FF66",\r
+"y. c #CCFF66",\r
+"u. c #FF00CC",\r
+"i. c #CC00FF",\r
+"p. c #009999",\r
+"a. c #993399",\r
+"s. c #990099",\r
+"d. c #CC0099",\r
+"f. c #000099",\r
+"g. c #333399",\r
+"h. c #660099",\r
+"j. c #CC3399",\r
+"k. c #FF0099",\r
+"l. c #006699",\r
+"z. c #336699",\r
+"x. c #663399",\r
+"c. c #996699",\r
+"v. c #CC6699",\r
+"b. c #FF3399",\r
+"n. c #339999",\r
+"m. c #669999",\r
+"M. c #999999",\r
+"N. c #CC9999",\r
+"B. c #FF9999",\r
+"V. c #00CC99",\r
+"C. c #33CC99",\r
+"Z. c #66CC66",\r
+"A. c #99CC99",\r
+"S. c #CCCC99",\r
+"D. c #FFCC99",\r
+"F. c #00FF99",\r
+"G. c #33FF99",\r
+"H. c #66CC99",\r
+"J. c #99FF99",\r
+"K. c #CCFF99",\r
+"L. c #FFFF99",\r
+"P. c #0000CC",\r
+"I. c #330099",\r
+"U. c #6600CC",\r
+"Y. c #9900CC",\r
+"T. c #CC00CC",\r
+"R. c #003399",\r
+"E. c #3333CC",\r
+"W. c #6633CC",\r
+"Q. c #9933CC",\r
+"!. c #CC33CC",\r
+"~. c #FF33CC",\r
+"^. c #0066CC",\r
+"/. c #3366CC",\r
+"(. c #666699",\r
+"). c #9966CC",\r
+"_. c #CC66CC",\r
+"`. c #FF6699",\r
+"'. c #0099CC",\r
+"]. c #3399CC",\r
+"[. c #6699CC",\r
+"{. c #9999CC",\r
+"}. c #CC99CC",\r
+"|. c #FF99CC",\r
+" X c #00CCCC",\r
+".X c #33CCCC",\r
+"XX c #66CCCC",\r
+"oX c #99CCCC",\r
+"OX c #CCCCCC",\r
+"+X c #FFCCCC",\r
+"@X c #00FFCC",\r
+"#X c #33FFCC",\r
+"$X c #66FF99",\r
+"%X c #99FFCC",\r
+"&X c #CCFFCC",\r
+"*X c #FFFFCC",\r
+"=X c #3300CC",\r
+"-X c #6600FF",\r
+";X c #9900FF",\r
+":X c #0033CC",\r
+">X c #3333FF",\r
+",X c #6633FF",\r
+"<X c #9933FF",\r
+"1X c #CC33FF",\r
+"2X c #FF33FF",\r
+"3X c #0066FF",\r
+"4X c #3366FF",\r
+"5X c #6666CC",\r
+"6X c #9966FF",\r
+"7X c #CC66FF",\r
+"8X c #FF66CC",\r
+"9X c #0099FF",\r
+"0X c #3399FF",\r
+"qX c #6699FF",\r
+"wX c #9999FF",\r
+"eX c #CC99FF",\r
+"rX c #FF99FF",\r
+"tX c #00CCFF",\r
+"yX c #33CCFF",\r
+"uX c #66CCFF",\r
+"iX c #99CCFF",\r
+"pX c #CCCCFF",\r
+"aX c #FFCCFF",\r
+"sX c #33FFFF",\r
+"dX c #66FFCC",\r
+"fX c #99FFFF",\r
+"gX c #CCFFFF",\r
+"hX c #FF6666",\r
+"jX c #66FF66",\r
+"kX c #FFFF66",\r
+"lX c #6666FF",\r
+"zX c #FF66FF",\r
+"xX c #66FFFF",\r
+"cX c #A50021",\r
+"vX c #5F5F5F",\r
+"bX c #777777",\r
+"nX c #868686",\r
+"mX c #969696",\r
+"MX c #CBCBCB",\r
+"NX c #B2B2B2",\r
+"BX c #D7D7D7",\r
+"VX c #DDDDDD",\r
+"CX c #E3E3E3",\r
+"ZX c #EAEAEA",\r
+"AX c #F1F1F1",\r
+"SX c #F8F8F8",\r
+"DX c #FFFBF0",\r
+"FX c #A0A0A4",\r
+"GX c #808080",\r
+"HX c #FF0000",\r
+"JX c #00FF00",\r
+"KX c #FFFF00",\r
+"LX c #0000FF",\r
+"PX c #FF00FF",\r
+"IX c #00FFFF",\r
+"UX c #FFFFFF",\r
+/* pixels */\r
+": : : : : : : : : : : : : : : : ",\r
+": : H H H A d : 7 G K H H : : : ",\r
+"n n c X 4 k j X b n n : ",\r
+"n 2 c $ 8 6 4 x < + 4 4 C V ~ : ",\r
+"n * c X o $ y N u 6 $ + b D Y : ",\r
+"n * c X > g , S z R : ",\r
+"n * c * r r y g , 6 r q S s W : ",\r
+"n * c X 4 N u + m B I : ",\r
+"n * c X ; a - S 5 F : ",\r
+"n * c * r r r g - S = M : ",\r
+"n * c X 4 N - m h J : ",\r
+"n * c X ; a - A 9 E : ",\r
+"n * ( ] ` ^ P l y T / / ( p L : ",\r
+"n O > 0 f ) ! t 8 % n : ",\r
+"U U U U U U U ' Q U U U U U U : ",\r
+": : : : : : : : : : : : : : : : "\r
+};\r
--- /dev/null
+/* XPM */\r
+static char * addressbook20_xpm[] = {\r
+/* columns rows colors chars-per-pixel */\r
+"20 20 256 2",\r
+" c #FFFFFF",\r
+". c #F7FFFF",\r
+"X c #F7F7FF",\r
+"o c #EFF7FF",\r
+"O c #EFF7F7",\r
+"+ c #E6EFFF",\r
+"@ c #E6EFF7",\r
+"# c #DEEFFF",\r
+"$ c #DEE6F7",\r
+"% c #DEE6EF",\r
+"& c #D6E6F7",\r
+"* c #FFFF00",\r
+"= c #DEDEE6",\r
+"- c #D6DEE6",\r
+"; c #D6D6DE",\r
+": c #CED6E6",\r
+"> c None",\r
+", c #C5D6E6",\r
+"< c #C5CEE6",\r
+"1 c #B5CEEF",\r
+"2 c #C5C5C5",\r
+"3 c #C5DE31",\r
+"4 c #B5C5DE",\r
+"5 c #BDC5C5",\r
+"6 c #ADC5EF",\r
+"7 c #B5C5CE",\r
+"8 c #BDBDBD",\r
+"9 c #B5BDCE",\r
+"0 c #ADBDDE",\r
+"q c #ADBDD6",\r
+"w c #B5CE52",\r
+"e c #ADB5C5",\r
+"r c #00FFFF",\r
+"t c #A5B5C5",\r
+"y c #9CB5CE",\r
+"u c #94B5DE",\r
+"i c #9CADD6",\r
+"p c #A5ADB5",\r
+"a c #94ADDE",\r
+"s c #94ADD6",\r
+"d c #9CADBD",\r
+"f c #8CADDE",\r
+"g c #BD9CA5",\r
+"h c #9CA5BD",\r
+"j c #9CA5B5",\r
+"k c #29D6E6",\r
+"l c #8CA5CE",\r
+"z c #849CCE",\r
+"x c #6BA5C5",\r
+"c c #739CDE",\r
+"v c #00FF00",\r
+"b c #739CD6",\r
+"n c #7B94CE",\r
+"m c #8494AD",\r
+"M c #7394CE",\r
+"N c #7B94B5",\r
+"B c #4AB584",\r
+"V c #848CB5",\r
+"C c #6B94CE",\r
+"Z c #6394D6",\r
+"A c #6394CE",\r
+"S c #7B8CAD",\r
+"D c #6B8CC5",\r
+"F c #738CAD",\r
+"G c #5294B5",\r
+"H c #6B84C5",\r
+"J c #7384A5",\r
+"K c #73849C",\r
+"L c #738494",\r
+"P c #FF4A4A",\r
+"I c #FF4A42",\r
+"U c #737B8C",\r
+"Y c #637BAD",\r
+"T c #527BBD",\r
+"R c #637394",\r
+"E c #637352",\r
+"W c #5A6B8C",\r
+"Q c #526B9C",\r
+"! c #63638C",\r
+"~ c #5A734A",\r
+"^ c #4A6B9C",\r
+"/ c #526B63",\r
+"( c #0884A5",\r
+") c #526384",\r
+"_ c #52637B",\r
+"` c #4A6B5A",\r
+"' c #52636B",\r
+"] c #525A8C",\r
+"[ c #525A7B",\r
+"{ c #426363",\r
+"} c #4A5A7B",\r
+"| c #425A8C",\r
+" . c #196B94",\r
+".. c #3A5A8C",\r
+"X. c #3A5A84",\r
+"o. c #087B4A",\r
+"O. c #21636B",\r
+"+. c #634263",\r
+"@. c #3A527B",\r
+"#. c #424A84",\r
+"$. c #315284",\r
+"%. c #295284",\r
+"&. c #3A4A6B",\r
+"*. c #42427B",\r
+"=. c #424273",\r
+"-. c #294A84",\r
+";. c #3A3A73",\r
+":. c #194284",\r
+">. c #104A63",\r
+",. c #213A6B",\r
+"<. c #31316B",\r
+"1. c #21315A",\r
+"2. c #212163",\r
+"3. c #08295A",\r
+"4. c #082152",\r
+"5. c #101952",\r
+"6. c #CC9966",\r
+"7. c #FF9966",\r
+"8. c #00CC66",\r
+"9. c #33CC66",\r
+"0. c #99CC66",\r
+"q. c #CCCC66",\r
+"w. c #FFCC66",\r
+"e. c #00FF66",\r
+"r. c #33FF66",\r
+"t. c #99FF66",\r
+"y. c #CCFF66",\r
+"u. c #FF00CC",\r
+"i. c #CC00FF",\r
+"p. c #009999",\r
+"a. c #993399",\r
+"s. c #990099",\r
+"d. c #CC0099",\r
+"f. c #000099",\r
+"g. c #333399",\r
+"h. c #660099",\r
+"j. c #CC3399",\r
+"k. c #FF0099",\r
+"l. c #006699",\r
+"z. c #336699",\r
+"x. c #663399",\r
+"c. c #996699",\r
+"v. c #CC6699",\r
+"b. c #FF3399",\r
+"n. c #339999",\r
+"m. c #669999",\r
+"M. c #999999",\r
+"N. c #CC9999",\r
+"B. c #FF9999",\r
+"V. c #00CC99",\r
+"C. c #33CC99",\r
+"Z. c #66CC66",\r
+"A. c #99CC99",\r
+"S. c #CCCC99",\r
+"D. c #FFCC99",\r
+"F. c #00FF99",\r
+"G. c #33FF99",\r
+"H. c #66CC99",\r
+"J. c #99FF99",\r
+"K. c #CCFF99",\r
+"L. c #FFFF99",\r
+"P. c #0000CC",\r
+"I. c #330099",\r
+"U. c #6600CC",\r
+"Y. c #9900CC",\r
+"T. c #CC00CC",\r
+"R. c #003399",\r
+"E. c #3333CC",\r
+"W. c #6633CC",\r
+"Q. c #9933CC",\r
+"!. c #CC33CC",\r
+"~. c #FF33CC",\r
+"^. c #0066CC",\r
+"/. c #3366CC",\r
+"(. c #666699",\r
+"). c #9966CC",\r
+"_. c #CC66CC",\r
+"`. c #FF6699",\r
+"'. c #0099CC",\r
+"]. c #3399CC",\r
+"[. c #6699CC",\r
+"{. c #9999CC",\r
+"}. c #CC99CC",\r
+"|. c #FF99CC",\r
+" X c #00CCCC",\r
+".X c #33CCCC",\r
+"XX c #66CCCC",\r
+"oX c #99CCCC",\r
+"OX c #CCCCCC",\r
+"+X c #FFCCCC",\r
+"@X c #00FFCC",\r
+"#X c #33FFCC",\r
+"$X c #66FF99",\r
+"%X c #99FFCC",\r
+"&X c #CCFFCC",\r
+"*X c #FFFFCC",\r
+"=X c #3300CC",\r
+"-X c #6600FF",\r
+";X c #9900FF",\r
+":X c #0033CC",\r
+">X c #3333FF",\r
+",X c #6633FF",\r
+"<X c #9933FF",\r
+"1X c #CC33FF",\r
+"2X c #FF33FF",\r
+"3X c #0066FF",\r
+"4X c #3366FF",\r
+"5X c #6666CC",\r
+"6X c #9966FF",\r
+"7X c #CC66FF",\r
+"8X c #FF66CC",\r
+"9X c #0099FF",\r
+"0X c #3399FF",\r
+"qX c #6699FF",\r
+"wX c #9999FF",\r
+"eX c #CC99FF",\r
+"rX c #FF99FF",\r
+"tX c #00CCFF",\r
+"yX c #33CCFF",\r
+"uX c #66CCFF",\r
+"iX c #99CCFF",\r
+"pX c #CCCCFF",\r
+"aX c #FFCCFF",\r
+"sX c #33FFFF",\r
+"dX c #66FFCC",\r
+"fX c #99FFFF",\r
+"gX c #CCFFFF",\r
+"hX c #FF6666",\r
+"jX c #66FF66",\r
+"kX c #FFFF66",\r
+"lX c #6666FF",\r
+"zX c #FF66FF",\r
+"xX c #66FFFF",\r
+"cX c #A50021",\r
+"vX c #5F5F5F",\r
+"bX c #777777",\r
+"nX c #868686",\r
+"mX c #969696",\r
+"MX c #CBCBCB",\r
+"NX c #B2B2B2",\r
+"BX c #D7D7D7",\r
+"VX c #DDDDDD",\r
+"CX c #E3E3E3",\r
+"ZX c #EAEAEA",\r
+"AX c #F1F1F1",\r
+"SX c #F8F8F8",\r
+"DX c #FFFBF0",\r
+"FX c #A0A0A4",\r
+"GX c #808080",\r
+"HX c #FF0000",\r
+"JX c #00FF00",\r
+"KX c #FFFF00",\r
+"LX c #0000FF",\r
+"PX c #FF00FF",\r
+"IX c #00FFFF",\r
+"UX c #FFFFFF",\r
+/* pixels */\r
+"> > > > > > > > > > > > > > > > > > > > ",\r
+"> > > > > > > > > > > > > > > > > > > > ",\r
+"> > U $.| | ^ S 2 > p W | | @.L > > > > ",\r
+"8 5 R - < Y j S O - ) g e > > ",\r
+"! V K - % a Q # - +.P <.> > ",\r
+"! & K - 0 z n D C b f n n z q +.P <.> > ",\r
+"! & K - % M A 1 - %.G #.> > ",\r
+"! & K - % u b # - o.v >.> > ",\r
+"! & K - 0 z n H M b 6 z n z q o.v >.> > ",\r
+"! & K - X - M A a - O.B @.> > ",\r
+"! & K - X % u b # - ` 3 / > > ",\r
+"! & K - 0 l i 4 u b # - ~ * E > > ",\r
+"! & K - X o $ s T b # - { w ' > > ",\r
+"! & K - % f b # - .k -.> > ",\r
+"! & K m d t 7 , u b # ; 9 9 h ( r :.> > ",\r
+"! & h _ _ [ &.4.$.A ,.1.} _ _ F x ] > > ",\r
+"! @ , y N _ 3._ N y , @ ! > > ",\r
+"*.*.*.*.*.*.*.*.;.5.*.*.*.*.*.*.*.2.> > ",\r
+"> > > > > > > > > > > > > > > > > > > > ",\r
+"> > > > > > > > > > > > > > > > > > > > "\r
+};\r
--- /dev/null
+/* XPM */\r
+static char * bitcoin_xpm[] = {\r
+/* columns rows colors chars-per-pixel */\r
+"48 48 250 2",\r
+" c #725203",\r
+". c #795603",\r
+"X c #7D5903",\r
+"o c #76560B",\r
+"O c #77590E",\r
+"+ c #795A0D",\r
+"@ c #7B5D14",\r
+"# c #7C5F18",\r
+"$ c #7D6019",\r
+"% c #825D05",\r
+"& c #856007",\r
+"* c #86620B",\r
+"= c #8B660B",\r
+"- c #8E690E",\r
+"; c #906A0F",\r
+": c #8F6B17",\r
+"> c #83641C",\r
+", c #8D6C1E",\r
+"< c #926C11",\r
+"1 c #967014",\r
+"2 c #997215",\r
+"3 c #9C761B",\r
+"4 c #9E791D",\r
+"5 c #A37C1E",\r
+"6 c #816520",\r
+"7 c #876A25",\r
+"8 c #8E6E22",\r
+"9 c #866A29",\r
+"0 c #896E2C",\r
+"q c #8E7020",\r
+"w c #937324",\r
+"e c #997722",\r
+"r c #9E7B25",\r
+"t c #94762B",\r
+"y c #967828",\r
+"u c #9A7B2D",\r
+"i c #8B7131",\r
+"p c #9E7E31",\r
+"a c #947839",\r
+"s c #A37D22",\r
+"d c #A68125",\r
+"f c #AA8325",\r
+"g c #AE8827",\r
+"h c #A6832D",\r
+"j c #AA852B",\r
+"k c #AD892B",\r
+"l c #B08727",\r
+"z c #B28827",\r
+"x c #B08729",\r
+"c c #B38B2C",\r
+"v c #B88E2F",\r
+"b c #B8902D",\r
+"n c #A38334",\r
+"m c #A98632",\r
+"M c #AB8A34",\r
+"N c #A4873C",\r
+"B c #A78A3D",\r
+"V c #AC8B3C",\r
+"C c #B38D32",\r
+"Z c #BA8F30",\r
+"A c #B28E3C",\r
+"S c #B69332",\r
+"D c #BC9433",\r
+"F c #BF9832",\r
+"G c #B4923C",\r
+"H c #BA963D",\r
+"J c #B7993E",\r
+"K c #BE9A3B",\r
+"L c #C1932F",\r
+"P c #C39732",\r
+"I c #C49935",\r
+"U c #C59C3A",\r
+"Y c #C99E3D",\r
+"T c #C2A13F",\r
+"R c #CDA23F",\r
+"E c #9D8342",\r
+"W c #AB8C43",\r
+"Q c #B28E40",\r
+"! c #AE9144",\r
+"~ c #AE914A",\r
+"^ c #B49445",\r
+"/ c #BC9B44",\r
+"( c #B3964D",\r
+") c #B5994C",\r
+"_ c #BD9B4A",\r
+"` c #A98F50",\r
+"' c #B19553",\r
+"] c #B59A54",\r
+"[ c #BD9F51",\r
+"{ c #B59B5C",\r
+"} c #B89D5C",\r
+"| c #BEA155",\r
+" . c #BDA35D",\r
+".. c #B59C61",\r
+"X. c #B99F66",\r
+"o. c #BCA363",\r
+"O. c #BDA56C",\r
+"+. c #BCA571",\r
+"@. c #BDA873",\r
+"#. c #BFAA78",\r
+"$. c #C49D43",\r
+"%. c #C99F45",\r
+"&. c #C29E4B",\r
+"*. c #C5A144",\r
+"=. c #CCA244",\r
+"-. c #C5A44B",\r
+";. c #CAA54B",\r
+":. c #C8A84C",\r
+">. c #D0A644",\r
+",. c #D3AA44",\r
+"<. c #D3AC4C",\r
+"1. c #D8AD4D",\r
+"2. c #DAB046",\r
+"3. c #DCB24E",\r
+"4. c #C3A454",\r
+"5. c #CBA751",\r
+"6. c #CCAA53",\r
+"7. c #C1A65B",\r
+"8. c #C8A75A",\r
+"9. c #CBAC5B",\r
+"0. c #D0A650",\r
+"q. c #D2AC53",\r
+"w. c #DAAD54",\r
+"e. c #D3AD5C",\r
+"r. c #CFB259",\r
+"t. c #D4B156",\r
+"y. c #DDB454",\r
+"u. c #D4B25C",\r
+"i. c #DAB65A",\r
+"p. c #D7B95F",\r
+"a. c #DEBA5E",\r
+"s. c #E2B555",\r
+"d. c #E5BA53",\r
+"f. c #E1B55A",\r
+"g. c #E5BC5C",\r
+"h. c #EABF5D",\r
+"j. c #C1A761",\r
+"k. c #C4AA63",\r
+"l. c #CBAE63",\r
+"z. c #CBB166",\r
+"x. c #CBB26C",\r
+"c. c #D4B263",\r
+"v. c #DAB462",\r
+"b. c #D6B864",\r
+"n. c #DCB965",\r
+"m. c #D3B669",\r
+"M. c #DCB768",\r
+"N. c #D4BA6E",\r
+"B. c #DCBB6C",\r
+"V. c #CDB672",\r
+"C. c #D2B972",\r
+"Z. c #DBBE72",\r
+"A. c #E4BC62",\r
+"S. c #E9BE62",\r
+"D. c #E2BD6C",\r
+"F. c #E0BF72",\r
+"G. c #E6C05E",\r
+"H. c #EFC05D",\r
+"J. c #F0C15B",\r
+"K. c #DFC167",\r
+"L. c #D7C069",\r
+"P. c #DDC36D",\r
+"I. c #DBC376",\r
+"U. c #D4C17B",\r
+"Y. c #DAC17B",\r
+"T. c #D8C878",\r
+"R. c #E4C362",\r
+"E. c #EBC364",\r
+"W. c #E3C865",\r
+"Q. c #EDC866",\r
+"!. c #E4C36A",\r
+"~. c #E9C66B",\r
+"^. c #ECCA6B",\r
+"/. c #F1C564",\r
+"(. c #F8C765",\r
+"). c #F5CB66",\r
+"_. c #F8CC67",\r
+"`. c #F6CC6A",\r
+"'. c #F9CD6B",\r
+"]. c #EED26A",\r
+"[. c #F2D06F",\r
+"{. c #FBD26D",\r
+"}. c #E4C374",\r
+"|. c #EBC474",\r
+" X c #E1C972",\r
+".X c #EDCD72",\r
+"XX c #E4C57A",\r
+"oX c #E9C67C",\r
+"OX c #E5C87C",\r
+"+X c #EACA7D",\r
+"@X c #F2CC74",\r
+"#X c #FBCF71",\r
+"$X c #EED174",\r
+"%X c #ECD37B",\r
+"&X c #F4D274",\r
+"*X c #FDD473",\r
+"=X c #FFD975",\r
+"-X c #F4D57C",\r
+";X c #FCD57A",\r
+":X c #F3DA7C",\r
+">X c #FEDB7C",\r
+",X c #FFE37D",\r
+"<X c #DCC683",\r
+"1X c #E4C681",\r
+"2X c #E4CA84",\r
+"3X c #EBCD83",\r
+"4X c #E4CE8B",\r
+"5X c #EDCE8A",\r
+"6X c #EED186",\r
+"7X c #E5D08E",\r
+"8X c #EDD38B",\r
+"9X c #FBD581",\r
+"0X c #F5DB84",\r
+"qX c #FCDC83",\r
+"wX c #F2D38C",\r
+"eX c #F5DA8D",\r
+"rX c #FCDD8A",\r
+"tX c #EAD493",\r
+"yX c #EDDB94",\r
+"uX c #EDD898",\r
+"iX c #F1D594",\r
+"pX c #F5DB93",\r
+"aX c #F3DD9E",\r
+"sX c #F5E184",\r
+"dX c #FFE384",\r
+"fX c #FFE883",\r
+"gX c #F3E18D",\r
+"hX c #FEE38B",\r
+"jX c #FFEB8D",\r
+"kX c #FEE594",\r
+"lX c #FFEC93",\r
+"zX c #FEE599",\r
+"xX c #FFEB9B",\r
+"cX c #FFF296",\r
+"vX c #FFF39B",\r
+"bX c #FFF99C",\r
+"nX c #F3DFA0",\r
+"mX c #F6E2A3",\r
+"MX c #F8E5A5",\r
+"NX c #F4EAA4",\r
+"BX c #FEECA3",\r
+"VX c #FAE7A9",\r
+"CX c #FEEBAD",\r
+"ZX c #FFF2AD",\r
+"AX c #FEF4B4",\r
+"SX c #FFFAB5",\r
+"DX c #F9F7B9",\r
+"FX c #FFFCBC",\r
+"GX c #FFFDC2",\r
+"HX c None",\r
+/* pixels */\r
+"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX#.O.{ ~ W W ~ { o.O.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXO.W h j s f g b b S k f d 4 e ` HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHXHXHXHXHX' h f l U 1.H./.{.{.,X>X=XQ.s.=.v 5 1 < E HXHXHXHXHXHXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHXHXHX' g f F d.).).{.{.=X=X=X{.{.{.`.`.`.).g.U f 2 * a HXHXHXHXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHXHXV f b G.J.{.{.{.*X=X,X=X*X{.`.).`.).).{.`.{./.U 5 ; + HXHXHXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHX} h g 1.)._._.{.,X*X=X,X{.{.)._.).).`.`.`.{.*X*X*X`.y.g 2 & $ HXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHX{ j c G.).{.{.{.=X,X{.{.J.d.2.R 2.,.3.g.`.&X;X;X;X&X[.{.`.I 3 & + HXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHX{ d D /.{.{.*X=X=X*X).3.R I I I P F F U $.;.n.-XrXrX;X&X;X>XdX:.4 X o HXHXHXHXHXHXHX",\r
+"HXHXHXHXHX..j v /.*X=X=X=X=X`.1.R R R R I I I P K U *.e.D.|.}.+XrXqXhXhXdXfX:.4 X o HXHXHXHXHXHX",\r
+"HXHXHXHXHXh v `.{.>X,X*X{.g.>.Y R I I I I I I U U ;.t.D.|.oXB.z.F.kXvXcXjXjXjX/ 1 . + HXHXHXHXHX",\r
+"HXHXHXHXV g Q.=X=X>X>X'.>.Y Y U R I I I P P I U U <.n.~.}.F.XXXX}.%XbXbXcXcXcXsXc = # HXHXHXHX",\r
+"HXHXHX} j t.>X>X>X*X'.>.U U I U P U U I P P I U T 6.M.D.oX5XwXeXeXqX0XvXbXbXcXjXW.5 % HXHXHXHX",\r
+"HXHXHXM G hXhXqX>X*X<.U U U I I I I I I D D U T T -.9.B.3XpXpXzXgXqX:X:XbXbXcXjXfXT < o HXHXHX",\r
+"HXHX} k XlXkXkXrXA.$.D Z Z Z v v v b b v D U U *.-.9.B.OX2XOXI.P.L.K.W.$XbXcXjX,X].d % 9 HXHX",\r
+"HXHXV J xXxXxXxXrX5.&.A M m m m h h n s 5 g S K *.:.8.4.| k.x.C.N.z.7.) :.$XjXfX,X,XT ; o HXHX",\r
+"HXHXM L.vXxXxXxXF._ MXCXCXCXCXCXCXCXCXmXY.h g K *./ ^ Y.mXCXCXCXCXCXCXVXZ.4.hXfX,X,XW.4 X HXHX",\r
+"HX] k gXxXxXxXgXe.V MXCXCXCXCXVXCXCXCXCXCXyXh D G [ mXCXCXCXCXCXCXCXCXCX4XG ~.fX,X,X,Xg & $ HX",\r
+"HXV J vXxXxXxX6Xe.V MXCXCXCXCXk.N VXCXCXCXVX| h ^ MXCXCXCXCXuX( n V l.mX4XA y.fX,X,X=XT ; HX",\r
+"HXk r.xXxXxXxX|.v.V MXCXCXCXCXo.> 4XCXCXCXCXx.w tXCXCXCXCXnXn V / / M V m.&.t.=X,X,X=Xy.2 o HX",\r
+"HXk P.xXvXxXxX|.M.Q nXCXCXCXCXj.w <XCXCXCXCXz.W CXCXCXCXCXk.V e.a.i.:.-.;.e.f.@X>X>X=XH.5 X $ ",\r
+"o.k %XvXbXBXkX|.D.Q nXCXCXCXCXj., 7XCXCXCXCX~ k.CXCXCXCXCXV &.n.R.g.G.g.S.S.S.(.qX*X=X`.5 X $ ",\r
+" .k 0XvXvXvXrX@XD.^ VXCXCXCXCXx.~ VXCXCXCX<Xe C.CXCXCXCXMXn q.R.R.h.S.E.E.E.S.S.>X=X*X*Xd X $ ",\r
+"{ k sXcXvXBXeX@XD.( nXCXCXCXCXCXCXCXCXVXo., u T.CXCXCXVXmXn t.E.g.g.h.S.g.S.f.A.>X;X*X*Xf & o ",\r
+"{ k sXjXlXcX0X~.n.^ MXCXCXCXCXCXCXCXCXCXCXU.t U.CXCXCXCXmXM p.~.W.g.s.s.s.s.f.A.>X*X*X*Xj % ",\r
+"o.k :XjXlXlX-XD.v.A MXCXCXCXCXj.t mXCXCXCXCX .x.CXCXCXCXVXV p.$X^.E.g.s.w.w.w.A.9X;X*X*Xf X ",\r
+"o.g ].dXjXhX-Xn.e.V MXCXCXCXCXj.8 <XCXCXCXCX<X] CXCXCXCXCX^ r.$X$X~.A.s.w.1.q.S.qX>X*X#X5 X O ",\r
+"HXj K.dXdXhX9Xv.9.M MXCXCXCXCXk.a Z.CXCXCXCX7Xu CXCXCXCXCXV./ !.$X~.f.5.%.0.q.S.>X*X*XE.5 X # ",\r
+"HXj t.dX,XdXdXi.6.N MXCXCXCXCXo.q <XCXCXCXCX<Xy 4XCXCXCXCXMX) / e.6./ _ C.U ;.`.;X*X#Xs.1 . @ ",\r
+"HXj K >XqXqXqX!.6.m MXCXCXCXCXV.' VXCXCXZXCXk.! ] VXCXCXCXCXVXC.[ 7.Z.VX2Xx %.#X#X'.'.%.- o 6 ",\r
+"HX( g &X>X>XdX-X5.M MXCXCXCXCXCXCXCXCXCXCX7X) m.9. .MXCXCXCXCXCXCXCXCXCX2Xs 1.'.`.'.'.x % HX",\r
+"HXO.j y.>X>X>X>X6.! zXMXMXMXMXMXMXMXMXuXx.( N.8X6Xz.) C.uXCXCXCXCXCXVX7X4.c h.'.(.(.s.5 X HX",\r
+"HXHXj H &X=X:X>X~./ V h y u n n n N W ( 7.Z.8XpXpX+Xm.| V V ^ ) ( m e 3 s R (.(.'.'.Y ; . > HX",\r
+"HXHX} f G.&X&X&X:Xt._ / ) _ 4.8.l.m.B.Z.2XwXpXeXwX6X+XP.c.8.-./ C x x z P J.(.'.(./.5 % HXHX",\r
+"HXHXHXh D &X&X&X&X@X:.4.5.9.c.m.F.OX+XwXwXwXwX6X3XOX}.D.D.v.w.%.Y I P P d.(.(.'.'.=.< . + HXHX",\r
+"HXHXHX] d y.[.&X&X&X~.:.4.9.e.M.B.}.oX3X5X3X3X+X}.F.M.e.0.0.0.%.%.Y Y s.#X#X#X#XS.s % HXHXHX",\r
+"HXHXHXHXm g `.@X&X&X&X~.5.6.e.b.B.}.XX+X3XOX}.I.F.F.D.e.e.e.e.e.q.0.A.;X;X#X-X@XZ = o + HXHXHX",\r
+"HXHXHXHX..j D @X&X&X&X&X@Xp.u.M.D.}.XXOXOXZ.Z.XX1XOXoXoXF.F.F.M.D.6XrXqX9X9X9X%.1 . HXHXHXHX",\r
+"HXHXHXHXHX' f $.&X&X&X>XqXqX XB.D.!.XXXXZ.XXOX5XwXwXwXwXiXwXwXnXVXZXBXxXzXxXb.r X $ HXHXHXHX",\r
+"HXHXHXHXHXHX~ j ;.qXqXqXqXrXkXrX+XD.Z.Z.XX1X2X5X5X5XwXwXiXnXCXGXGXFXFXSXAXT.s % @ HXHXHXHXHX",\r
+"HXHXHXHXHXHXHX~ j -.0XrXzXxXzXzXzXzXwX3XXXXXOX1X2X5XpXmXAXFXGXGXGXFXFXSXL.r % O HXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHX! j / gXSXSXZXxXzXzXkXxXzXBXBXBXZXCXAXAXAXAXSXSXSXSXNX| 3 & O HXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHX} n V U.DXSXBXzXkXkXkXxXxXxXBXxXBXBXCXZXZXZXAXAXU.M < . @ HXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHXHXHXV d G Z.pXzXkXzXjXkXkXxXzXxXxXxXBXBXZXNXT.G 3 * . 9 HXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHXHXHXHX@.u s k -.K.6XhXjXhXkXlXzXzXzXeXOX9.k 3 = X O HXHXHXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHXHXHXHXHXHX..w < s j k K -.;.:.-./ C j 4 < & . O HXHXHXHXHXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXE * = - - < < - = & X . 0 HXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXi 7 7 @ o o O > 0 i HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX"\r
+};\r
--- /dev/null
+/* XPM */\r
+static char * check_xpm[] = {\r
+/* columns rows colors chars-per-pixel */\r
+"32 32 3 1",\r
+" c #008000",\r
+". c #00FF00",\r
+"X c None",\r
+/* pixels */\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXX XXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXX . XXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXX .. XXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXX . XXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXX .. XXXXXXXXXXXXX",\r
+"XXXXXXXXXXX XX . XXXXXXXXXXXXX",\r
+"XXXXXXXXXXX . .. XXXXXXXXXXXXXX",\r
+"XXXXXXXXXXX .. . XXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXX ... XXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXX . XXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXX XXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"\r
+};\r
--- /dev/null
+/* XPM */\r
+static char * send16_xpm[] = {\r
+/* columns rows colors chars-per-pixel */\r
+"16 16 256 2",\r
+" c #ADF7AD",\r
+". c #9CFF9C",\r
+"X c None",\r
+"o c #ADEFAD",\r
+"O c #94FF94",\r
+"+ c #D6CECE",\r
+"@ c #8CFF8C",\r
+"# c #CECECE",\r
+"$ c #CECEC5",\r
+"% c #84FF84",\r
+"& c #CEC5C5",\r
+"* c #73FF73",\r
+"= c #C5C5C5",\r
+"- c #6BFF6B",\r
+"; c #73F773",\r
+": c #C5BDBD",\r
+"> c #6BF76B",\r
+", c #BDBDBD",\r
+"< c #63F763",\r
+"1 c #B5B5B5",\r
+"2 c #52F752",\r
+"3 c #42FF42",\r
+"4 c #3AFF3A",\r
+"5 c #ADADAD",\r
+"6 c #ADADA5",\r
+"7 c #4AEF4A",\r
+"8 c #29FF29",\r
+"9 c #A5A5A5",\r
+"0 c #42E642",\r
+"q c #9CA59C",\r
+"w c #3AE63A",\r
+"e c #10FF10",\r
+"r c #08FF08",\r
+"t c #949C94",\r
+"y c #00FF00",\r
+"u c #00F700",\r
+"i c #8C948C",\r
+"p c #00EF00",\r
+"a c #08E608",\r
+"s c #10DE10",\r
+"d c #00E600",\r
+"f c #00DE00",\r
+"g c #19C519",\r
+"h c #00CE00",\r
+"j c #00C500",\r
+"k c #008C00",\r
+"l c #008400",\r
+"z c #669900",\r
+"x c #999900",\r
+"c c #CC9900",\r
+"v c #FF9900",\r
+"b c #00CC00",\r
+"n c #33CC00",\r
+"m c #66CC00",\r
+"M c #99CC00",\r
+"N c #CCCC00",\r
+"B c #FFCC00",\r
+"V c #66FF00",\r
+"C c #99FF00",\r
+"Z c #CCFF00",\r
+"A c #000033",\r
+"S c #330033",\r
+"D c #660033",\r
+"F c #990033",\r
+"G c #CC0033",\r
+"H c #FF0033",\r
+"J c #003333",\r
+"K c #333333",\r
+"L c #663333",\r
+"P c #993333",\r
+"I c #CC3333",\r
+"U c #FF3333",\r
+"Y c #006633",\r
+"T c #336633",\r
+"R c #666633",\r
+"E c #996633",\r
+"W c #CC6633",\r
+"Q c #FF6633",\r
+"! c #009933",\r
+"~ c #339933",\r
+"^ c #669933",\r
+"/ c #999933",\r
+"( c #CC9933",\r
+") c #FF9933",\r
+"_ c #00CC33",\r
+"` c #33CC33",\r
+"' c #66CC33",\r
+"] c #99CC33",\r
+"[ c #CCCC33",\r
+"{ c #FFCC33",\r
+"} c #33FF33",\r
+"| c #66FF33",\r
+" . c #99FF33",\r
+".. c #CCFF33",\r
+"X. c #FFFF33",\r
+"o. c #000066",\r
+"O. c #330066",\r
+"+. c #660066",\r
+"@. c #990066",\r
+"#. c #CC0066",\r
+"$. c #FF0066",\r
+"%. c #003366",\r
+"&. c #333366",\r
+"*. c #663366",\r
+"=. c #993366",\r
+"-. c #CC3366",\r
+";. c #FF3366",\r
+":. c #006666",\r
+">. c #336666",\r
+",. c #666666",\r
+"<. c #996666",\r
+"1. c #CC6666",\r
+"2. c #009966",\r
+"3. c #339966",\r
+"4. c #669966",\r
+"5. c #999966",\r
+"6. c #CC9966",\r
+"7. c #FF9966",\r
+"8. c #00CC66",\r
+"9. c #33CC66",\r
+"0. c #99CC66",\r
+"q. c #CCCC66",\r
+"w. c #FFCC66",\r
+"e. c #00FF66",\r
+"r. c #33FF66",\r
+"t. c #99FF66",\r
+"y. c #CCFF66",\r
+"u. c #FF00CC",\r
+"i. c #CC00FF",\r
+"p. c #009999",\r
+"a. c #993399",\r
+"s. c #990099",\r
+"d. c #CC0099",\r
+"f. c #000099",\r
+"g. c #333399",\r
+"h. c #660099",\r
+"j. c #CC3399",\r
+"k. c #FF0099",\r
+"l. c #006699",\r
+"z. c #336699",\r
+"x. c #663399",\r
+"c. c #996699",\r
+"v. c #CC6699",\r
+"b. c #FF3399",\r
+"n. c #339999",\r
+"m. c #669999",\r
+"M. c #999999",\r
+"N. c #CC9999",\r
+"B. c #FF9999",\r
+"V. c #00CC99",\r
+"C. c #33CC99",\r
+"Z. c #66CC66",\r
+"A. c #99CC99",\r
+"S. c #CCCC99",\r
+"D. c #FFCC99",\r
+"F. c #00FF99",\r
+"G. c #33FF99",\r
+"H. c #66CC99",\r
+"J. c #99FF99",\r
+"K. c #CCFF99",\r
+"L. c #FFFF99",\r
+"P. c #0000CC",\r
+"I. c #330099",\r
+"U. c #6600CC",\r
+"Y. c #9900CC",\r
+"T. c #CC00CC",\r
+"R. c #003399",\r
+"E. c #3333CC",\r
+"W. c #6633CC",\r
+"Q. c #9933CC",\r
+"!. c #CC33CC",\r
+"~. c #FF33CC",\r
+"^. c #0066CC",\r
+"/. c #3366CC",\r
+"(. c #666699",\r
+"). c #9966CC",\r
+"_. c #CC66CC",\r
+"`. c #FF6699",\r
+"'. c #0099CC",\r
+"]. c #3399CC",\r
+"[. c #6699CC",\r
+"{. c #9999CC",\r
+"}. c #CC99CC",\r
+"|. c #FF99CC",\r
+" X c #00CCCC",\r
+".X c #33CCCC",\r
+"XX c #66CCCC",\r
+"oX c #99CCCC",\r
+"OX c #CCCCCC",\r
+"+X c #FFCCCC",\r
+"@X c #00FFCC",\r
+"#X c #33FFCC",\r
+"$X c #66FF99",\r
+"%X c #99FFCC",\r
+"&X c #CCFFCC",\r
+"*X c #FFFFCC",\r
+"=X c #3300CC",\r
+"-X c #6600FF",\r
+";X c #9900FF",\r
+":X c #0033CC",\r
+">X c #3333FF",\r
+",X c #6633FF",\r
+"<X c #9933FF",\r
+"1X c #CC33FF",\r
+"2X c #FF33FF",\r
+"3X c #0066FF",\r
+"4X c #3366FF",\r
+"5X c #6666CC",\r
+"6X c #9966FF",\r
+"7X c #CC66FF",\r
+"8X c #FF66CC",\r
+"9X c #0099FF",\r
+"0X c #3399FF",\r
+"qX c #6699FF",\r
+"wX c #9999FF",\r
+"eX c #CC99FF",\r
+"rX c #FF99FF",\r
+"tX c #00CCFF",\r
+"yX c #33CCFF",\r
+"uX c #66CCFF",\r
+"iX c #99CCFF",\r
+"pX c #CCCCFF",\r
+"aX c #FFCCFF",\r
+"sX c #33FFFF",\r
+"dX c #66FFCC",\r
+"fX c #99FFFF",\r
+"gX c #CCFFFF",\r
+"hX c #FF6666",\r
+"jX c #66FF66",\r
+"kX c #FFFF66",\r
+"lX c #6666FF",\r
+"zX c #FF66FF",\r
+"xX c #66FFFF",\r
+"cX c #A50021",\r
+"vX c #5F5F5F",\r
+"bX c #777777",\r
+"nX c #868686",\r
+"mX c #969696",\r
+"MX c #CBCBCB",\r
+"NX c #B2B2B2",\r
+"BX c #D7D7D7",\r
+"VX c #DDDDDD",\r
+"CX c #E3E3E3",\r
+"ZX c #EAEAEA",\r
+"AX c #F1F1F1",\r
+"SX c #F8F8F8",\r
+"DX c #FFFBF0",\r
+"FX c #A0A0A4",\r
+"GX c #808080",\r
+"HX c #FF0000",\r
+"JX c #00FF00",\r
+"KX c #FFFF00",\r
+"LX c #0000FF",\r
+"PX c #FF00FF",\r
+"IX c #00FFFF",\r
+"UX c #FFFFFF",\r
+/* pixels */\r
+"X X X X X X X k k X X X X X X X ",\r
+"X X X X X X X k j k X X X X X X ",\r
+"X X X X X X X k o j k X X X X X ",\r
+"X X X X X X X k * o j k X X X X ",\r
+"l k k k k k k k * * . j k X X X ",\r
+"l @ @ @ @ @ @ @ 4 e e % j k X X ",\r
+"l O 3 8 e r r r r r r e ; j k X ",\r
+"l @ e e r r r r r u p a f < j k ",\r
+"l @ r u p a a a a a f f w j k i ",\r
+"l O ; ; ; ; ; < a f b 0 j k t : ",\r
+"l k k k k k k k s j 7 j k q = X ",\r
+"X $ = = = = = k g 7 j k 9 & X X ",\r
+"X X X X X X X k 2 j k 6 $ X X X ",\r
+"X X X X X X X k j k 5 + X X X X ",\r
+"X X X X X X X k k 1 + X X X X X ",\r
+"X X X X X X X = , X X X X X X X "\r
+};\r
--- /dev/null
+/* XPM */\r
+static char * send16noshadow_xpm[] = {\r
+/* columns rows colors chars-per-pixel */\r
+"16 16 256 2",\r
+" c #ADF7AD",\r
+". c #9CFF9C",\r
+"X c None",\r
+"o c #ADEFAD",\r
+"O c #94FF94",\r
+"+ c #D6CECE",\r
+"@ c #8CFF8C",\r
+"# c #CECECE",\r
+"$ c #CECEC5",\r
+"% c #84FF84",\r
+"& c #CEC5C5",\r
+"* c #73FF73",\r
+"= c #C5C5C5",\r
+"- c #6BFF6B",\r
+"; c #73F773",\r
+": c #C5BDBD",\r
+"> c #6BF76B",\r
+", c #BDBDBD",\r
+"< c #63F763",\r
+"1 c #B5B5B5",\r
+"2 c #52F752",\r
+"3 c #42FF42",\r
+"4 c #3AFF3A",\r
+"5 c #ADADAD",\r
+"6 c #ADADA5",\r
+"7 c #4AEF4A",\r
+"8 c #29FF29",\r
+"9 c #A5A5A5",\r
+"0 c #42E642",\r
+"q c #9CA59C",\r
+"w c #3AE63A",\r
+"e c #10FF10",\r
+"r c #08FF08",\r
+"t c #949C94",\r
+"y c #00FF00",\r
+"u c #00F700",\r
+"i c #8C948C",\r
+"p c #00EF00",\r
+"a c #08E608",\r
+"s c #10DE10",\r
+"d c #00E600",\r
+"f c #00DE00",\r
+"g c #19C519",\r
+"h c #00CE00",\r
+"j c #00C500",\r
+"k c #008C00",\r
+"l c #008400",\r
+"z c #669900",\r
+"x c #999900",\r
+"c c #CC9900",\r
+"v c #FF9900",\r
+"b c #00CC00",\r
+"n c #33CC00",\r
+"m c #66CC00",\r
+"M c #99CC00",\r
+"N c #CCCC00",\r
+"B c #FFCC00",\r
+"V c #66FF00",\r
+"C c #99FF00",\r
+"Z c #CCFF00",\r
+"A c #000033",\r
+"S c #330033",\r
+"D c #660033",\r
+"F c #990033",\r
+"G c #CC0033",\r
+"H c #FF0033",\r
+"J c #003333",\r
+"K c #333333",\r
+"L c #663333",\r
+"P c #993333",\r
+"I c #CC3333",\r
+"U c #FF3333",\r
+"Y c #006633",\r
+"T c #336633",\r
+"R c #666633",\r
+"E c #996633",\r
+"W c #CC6633",\r
+"Q c #FF6633",\r
+"! c #009933",\r
+"~ c #339933",\r
+"^ c #669933",\r
+"/ c #999933",\r
+"( c #CC9933",\r
+") c #FF9933",\r
+"_ c #00CC33",\r
+"` c #33CC33",\r
+"' c #66CC33",\r
+"] c #99CC33",\r
+"[ c #CCCC33",\r
+"{ c #FFCC33",\r
+"} c #33FF33",\r
+"| c #66FF33",\r
+" . c #99FF33",\r
+".. c #CCFF33",\r
+"X. c #FFFF33",\r
+"o. c #000066",\r
+"O. c #330066",\r
+"+. c #660066",\r
+"@. c #990066",\r
+"#. c #CC0066",\r
+"$. c #FF0066",\r
+"%. c #003366",\r
+"&. c #333366",\r
+"*. c #663366",\r
+"=. c #993366",\r
+"-. c #CC3366",\r
+";. c #FF3366",\r
+":. c #006666",\r
+">. c #336666",\r
+",. c #666666",\r
+"<. c #996666",\r
+"1. c #CC6666",\r
+"2. c #009966",\r
+"3. c #339966",\r
+"4. c #669966",\r
+"5. c #999966",\r
+"6. c #CC9966",\r
+"7. c #FF9966",\r
+"8. c #00CC66",\r
+"9. c #33CC66",\r
+"0. c #99CC66",\r
+"q. c #CCCC66",\r
+"w. c #FFCC66",\r
+"e. c #00FF66",\r
+"r. c #33FF66",\r
+"t. c #99FF66",\r
+"y. c #CCFF66",\r
+"u. c #FF00CC",\r
+"i. c #CC00FF",\r
+"p. c #009999",\r
+"a. c #993399",\r
+"s. c #990099",\r
+"d. c #CC0099",\r
+"f. c #000099",\r
+"g. c #333399",\r
+"h. c #660099",\r
+"j. c #CC3399",\r
+"k. c #FF0099",\r
+"l. c #006699",\r
+"z. c #336699",\r
+"x. c #663399",\r
+"c. c #996699",\r
+"v. c #CC6699",\r
+"b. c #FF3399",\r
+"n. c #339999",\r
+"m. c #669999",\r
+"M. c #999999",\r
+"N. c #CC9999",\r
+"B. c #FF9999",\r
+"V. c #00CC99",\r
+"C. c #33CC99",\r
+"Z. c #66CC66",\r
+"A. c #99CC99",\r
+"S. c #CCCC99",\r
+"D. c #FFCC99",\r
+"F. c #00FF99",\r
+"G. c #33FF99",\r
+"H. c #66CC99",\r
+"J. c #99FF99",\r
+"K. c #CCFF99",\r
+"L. c #FFFF99",\r
+"P. c #0000CC",\r
+"I. c #330099",\r
+"U. c #6600CC",\r
+"Y. c #9900CC",\r
+"T. c #CC00CC",\r
+"R. c #003399",\r
+"E. c #3333CC",\r
+"W. c #6633CC",\r
+"Q. c #9933CC",\r
+"!. c #CC33CC",\r
+"~. c #FF33CC",\r
+"^. c #0066CC",\r
+"/. c #3366CC",\r
+"(. c #666699",\r
+"). c #9966CC",\r
+"_. c #CC66CC",\r
+"`. c #FF6699",\r
+"'. c #0099CC",\r
+"]. c #3399CC",\r
+"[. c #6699CC",\r
+"{. c #9999CC",\r
+"}. c #CC99CC",\r
+"|. c #FF99CC",\r
+" X c #00CCCC",\r
+".X c #33CCCC",\r
+"XX c #66CCCC",\r
+"oX c #99CCCC",\r
+"OX c #CCCCCC",\r
+"+X c #FFCCCC",\r
+"@X c #00FFCC",\r
+"#X c #33FFCC",\r
+"$X c #66FF99",\r
+"%X c #99FFCC",\r
+"&X c #CCFFCC",\r
+"*X c #FFFFCC",\r
+"=X c #3300CC",\r
+"-X c #6600FF",\r
+";X c #9900FF",\r
+":X c #0033CC",\r
+">X c #3333FF",\r
+",X c #6633FF",\r
+"<X c #9933FF",\r
+"1X c #CC33FF",\r
+"2X c #FF33FF",\r
+"3X c #0066FF",\r
+"4X c #3366FF",\r
+"5X c #6666CC",\r
+"6X c #9966FF",\r
+"7X c #CC66FF",\r
+"8X c #FF66CC",\r
+"9X c #0099FF",\r
+"0X c #3399FF",\r
+"qX c #6699FF",\r
+"wX c #9999FF",\r
+"eX c #CC99FF",\r
+"rX c #FF99FF",\r
+"tX c #00CCFF",\r
+"yX c #33CCFF",\r
+"uX c #66CCFF",\r
+"iX c #99CCFF",\r
+"pX c #CCCCFF",\r
+"aX c #FFCCFF",\r
+"sX c #33FFFF",\r
+"dX c #66FFCC",\r
+"fX c #99FFFF",\r
+"gX c #CCFFFF",\r
+"hX c #FF6666",\r
+"jX c #66FF66",\r
+"kX c #FFFF66",\r
+"lX c #6666FF",\r
+"zX c #FF66FF",\r
+"xX c #66FFFF",\r
+"cX c #A50021",\r
+"vX c #5F5F5F",\r
+"bX c #777777",\r
+"nX c #868686",\r
+"mX c #969696",\r
+"MX c #CBCBCB",\r
+"NX c #B2B2B2",\r
+"BX c #D7D7D7",\r
+"VX c #DDDDDD",\r
+"CX c #E3E3E3",\r
+"ZX c #EAEAEA",\r
+"AX c #F1F1F1",\r
+"SX c #F8F8F8",\r
+"DX c #FFFBF0",\r
+"FX c #A0A0A4",\r
+"GX c #808080",\r
+"HX c #FF0000",\r
+"JX c #00FF00",\r
+"KX c #FFFF00",\r
+"LX c #0000FF",\r
+"PX c #FF00FF",\r
+"IX c #00FFFF",\r
+"UX c #FFFFFF",\r
+/* pixels */\r
+"X X X X X X X k k X X X X X X X ",\r
+"X X X X X X X k j k X X X X X X ",\r
+"X X X X X X X k o j k X X X X X ",\r
+"X X X X X X X k * o j k X X X X ",\r
+"l k k k k k k k * * . j k X X X ",\r
+"l @ @ @ @ @ @ @ 4 e e % j k X X ",\r
+"l O 3 8 e r r r r r r e ; j k X ",\r
+"l @ e e r r r r r u p a f < j k ",\r
+"l @ r u p a a a a a f f w j k X ",\r
+"l O ; ; ; ; ; < a f b 0 j k X X ",\r
+"l k k k k k k k s j 7 j k X X X ",\r
+"X X X X X X X k g 7 j k X X X X ",\r
+"X X X X X X X k 2 j k X X X X X ",\r
+"X X X X X X X k j k X X X X X X ",\r
+"X X X X X X X k k X X X X X X X ",\r
+"X X X X X X X X X X X X X X X X "\r
+};\r
--- /dev/null
+/* XPM */\r
+static char * send20_xpm[] = {\r
+/* columns rows colors chars-per-pixel */\r
+"20 20 256 2",\r
+" c #CEFFCE",\r
+". c #BDFFBD",\r
+"X c #C5F7C5",\r
+"o c #B5FFB5",\r
+"O c #ADFFAD",\r
+"+ c #A5FFA5",\r
+"@ c #9CFF9C",\r
+"# c None",\r
+"$ c #94FF94",\r
+"% c #D6CECE",\r
+"& c #8CFF8C",\r
+"* c #CECEC5",\r
+"= c #84FF84",\r
+"- c #94EF94",\r
+"; c #7BFF7B",\r
+": c #CEC5C5",\r
+"> c #73FF73",\r
+", c #C5C5C5",\r
+"< c #C5C5BD",\r
+"1 c #6BFF6B",\r
+"2 c #BDC5B5",\r
+"3 c #63FF63",\r
+"4 c #6BF76B",\r
+"5 c #BDBDBD",\r
+"6 c #BDBDB5",\r
+"7 c #5AFF5A",\r
+"8 c #63F763",\r
+"9 c #B5BDB5",\r
+"0 c #B5BDAD",\r
+"q c #52FF52",\r
+"w c #BDB5B5",\r
+"e c #5AF75A",\r
+"r c #B5B5B5",\r
+"t c #B5B5AD",\r
+"y c #52F752",\r
+"u c #42FF42",\r
+"i c #52EF52",\r
+"p c #ADADAD",\r
+"a c #ADADA5",\r
+"s c #4AEF4A",\r
+"d c #31FF31",\r
+"f c #29FF29",\r
+"g c #A5A5A5",\r
+"h c #21FF21",\r
+"j c #5AD65A",\r
+"k c #42E642",\r
+"l c #94AD94",\r
+"z c #4ADE4A",\r
+"x c #3AE63A",\r
+"c c #5ACE5A",\r
+"v c #10FF10",\r
+"b c #9C9C9C",\r
+"n c #31E631",\r
+"m c #08FF08",\r
+"M c #949C94",\r
+"N c #84A584",\r
+"B c #00FF00",\r
+"V c #3AD63A",\r
+"C c #52C552",\r
+"Z c #00F700",\r
+"A c #8C948C",\r
+"S c #849484",\r
+"D c #00EF00",\r
+"F c #739C73",\r
+"G c #08E608",\r
+"H c #4AB54A",\r
+"J c #31C531",\r
+"K c #00E600",\r
+"L c #739473",\r
+"P c #00DE00",\r
+"I c #63945A",\r
+"U c #6B8C6B",\r
+"Y c #00D600",\r
+"T c #42A542",\r
+"R c #638C63",\r
+"E c #00CE00",\r
+"W c #21B521",\r
+"Q c #5A8C5A",\r
+"! c #00C500",\r
+"~ c #528C52",\r
+"^ c #3A9C3A",\r
+"/ c #4A8C4A",\r
+"( c #00BD00",\r
+") c #319431",\r
+"_ c #219C21",\r
+"` c #318C31",\r
+"' c #3A843A",\r
+"] c #219421",\r
+"[ c #298C29",\r
+"{ c #318431",\r
+"} c #218C21",\r
+"| c #218C19",\r
+" . c #198C19",\r
+".. c #218421",\r
+"X. c #297B29",\r
+"o. c #198419",\r
+"O. c #217B21",\r
+"+. c #108410",\r
+"@. c #197B19",\r
+"#. c #CC0066",\r
+"$. c #FF0066",\r
+"%. c #003366",\r
+"&. c #333366",\r
+"*. c #663366",\r
+"=. c #993366",\r
+"-. c #CC3366",\r
+";. c #FF3366",\r
+":. c #006666",\r
+">. c #336666",\r
+",. c #666666",\r
+"<. c #996666",\r
+"1. c #CC6666",\r
+"2. c #009966",\r
+"3. c #339966",\r
+"4. c #669966",\r
+"5. c #999966",\r
+"6. c #CC9966",\r
+"7. c #FF9966",\r
+"8. c #00CC66",\r
+"9. c #33CC66",\r
+"0. c #99CC66",\r
+"q. c #CCCC66",\r
+"w. c #FFCC66",\r
+"e. c #00FF66",\r
+"r. c #33FF66",\r
+"t. c #99FF66",\r
+"y. c #CCFF66",\r
+"u. c #FF00CC",\r
+"i. c #CC00FF",\r
+"p. c #009999",\r
+"a. c #993399",\r
+"s. c #990099",\r
+"d. c #CC0099",\r
+"f. c #000099",\r
+"g. c #333399",\r
+"h. c #660099",\r
+"j. c #CC3399",\r
+"k. c #FF0099",\r
+"l. c #006699",\r
+"z. c #336699",\r
+"x. c #663399",\r
+"c. c #996699",\r
+"v. c #CC6699",\r
+"b. c #FF3399",\r
+"n. c #339999",\r
+"m. c #669999",\r
+"M. c #999999",\r
+"N. c #CC9999",\r
+"B. c #FF9999",\r
+"V. c #00CC99",\r
+"C. c #33CC99",\r
+"Z. c #66CC66",\r
+"A. c #99CC99",\r
+"S. c #CCCC99",\r
+"D. c #FFCC99",\r
+"F. c #00FF99",\r
+"G. c #33FF99",\r
+"H. c #66CC99",\r
+"J. c #99FF99",\r
+"K. c #CCFF99",\r
+"L. c #FFFF99",\r
+"P. c #0000CC",\r
+"I. c #330099",\r
+"U. c #6600CC",\r
+"Y. c #9900CC",\r
+"T. c #CC00CC",\r
+"R. c #003399",\r
+"E. c #3333CC",\r
+"W. c #6633CC",\r
+"Q. c #9933CC",\r
+"!. c #CC33CC",\r
+"~. c #FF33CC",\r
+"^. c #0066CC",\r
+"/. c #3366CC",\r
+"(. c #666699",\r
+"). c #9966CC",\r
+"_. c #CC66CC",\r
+"`. c #FF6699",\r
+"'. c #0099CC",\r
+"]. c #3399CC",\r
+"[. c #6699CC",\r
+"{. c #9999CC",\r
+"}. c #CC99CC",\r
+"|. c #FF99CC",\r
+" X c #00CCCC",\r
+".X c #33CCCC",\r
+"XX c #66CCCC",\r
+"oX c #99CCCC",\r
+"OX c #CCCCCC",\r
+"+X c #FFCCCC",\r
+"@X c #00FFCC",\r
+"#X c #33FFCC",\r
+"$X c #66FF99",\r
+"%X c #99FFCC",\r
+"&X c #CCFFCC",\r
+"*X c #FFFFCC",\r
+"=X c #3300CC",\r
+"-X c #6600FF",\r
+";X c #9900FF",\r
+":X c #0033CC",\r
+">X c #3333FF",\r
+",X c #6633FF",\r
+"<X c #9933FF",\r
+"1X c #CC33FF",\r
+"2X c #FF33FF",\r
+"3X c #0066FF",\r
+"4X c #3366FF",\r
+"5X c #6666CC",\r
+"6X c #9966FF",\r
+"7X c #CC66FF",\r
+"8X c #FF66CC",\r
+"9X c #0099FF",\r
+"0X c #3399FF",\r
+"qX c #6699FF",\r
+"wX c #9999FF",\r
+"eX c #CC99FF",\r
+"rX c #FF99FF",\r
+"tX c #00CCFF",\r
+"yX c #33CCFF",\r
+"uX c #66CCFF",\r
+"iX c #99CCFF",\r
+"pX c #CCCCFF",\r
+"aX c #FFCCFF",\r
+"sX c #33FFFF",\r
+"dX c #66FFCC",\r
+"fX c #99FFFF",\r
+"gX c #CCFFFF",\r
+"hX c #FF6666",\r
+"jX c #66FF66",\r
+"kX c #FFFF66",\r
+"lX c #6666FF",\r
+"zX c #FF66FF",\r
+"xX c #66FFFF",\r
+"cX c #A50021",\r
+"vX c #5F5F5F",\r
+"bX c #777777",\r
+"nX c #868686",\r
+"mX c #969696",\r
+"MX c #CBCBCB",\r
+"NX c #B2B2B2",\r
+"BX c #D7D7D7",\r
+"VX c #DDDDDD",\r
+"CX c #E3E3E3",\r
+"ZX c #EAEAEA",\r
+"AX c #F1F1F1",\r
+"SX c #F8F8F8",\r
+"DX c #FFFBF0",\r
+"FX c #A0A0A4",\r
+"GX c #808080",\r
+"HX c #FF0000",\r
+"JX c #00FF00",\r
+"KX c #FFFF00",\r
+"LX c #0000FF",\r
+"PX c #FF00FF",\r
+"IX c #00FFFF",\r
+"UX c #FFFFFF",\r
+/* pixels */\r
+"# # # # # # # # # # # # # # # # # # # # ",\r
+"# # # # # # # ` 0 # # # # # # # # # # # ",\r
+"# # # # # # # ..` l # # # # # # # # # # ",\r
+"# # # # # # # [ X ) N # # # # # # # # # ",\r
+"# # # # # # # [ &X. ^ F # # # # # # # # ",\r
+"# # # # # # # } o & o T I : # # # # # # ",\r
+"` ` ` ` ` ` ` ` + 7 ; + H ~ < # # # # # ",\r
+"` = = = = = = - @ d v h $ C ' 5 # # # # ",\r
+"` = = 3 u h v v v m m m v ; c { 6 # # # ",\r
+"` = f v v m m m m m m Z G G 4 j ..t # # ",\r
+"` = v m m m Z Z D D G G G P n ; _ R 5 # ",\r
+"` = m Z G G G G G G G P Y x 4 _ Q g # # ",\r
+"` = $ $ $ $ $ & e P P E k 8 .U g # # # ",\r
+"..[ ......[ [ ] e Y ! s i o.L p # # # # ",\r
+"# # 5 6 6 6 9 ..i ( i z o.S t # # # # # ",\r
+"# # # # # # # } i i V O.A r # # # # # # ",\r
+"# # # # # # # } 7 J X.M 6 # # # # # # # ",\r
+"# # # # # # # | W ' b < # # # # # # # # ",\r
+"# # # # # # # @.~ g , # # # # # # # # # ",\r
+"# # # # # # # 6 < , # # # # # # # # # # "\r
+};\r