upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--Bitflash-1.1.0-windows/glfw3.dllbin0 -> 263756 bytes
-rw-r--r--Bitflash-1.1.0-windows/libcrypto-3-x64.dllbin0 -> 5495100 bytes
-rw-r--r--Bitflash-1.1.0-windows/libdb_cxx-6.2.dllbin0 -> 1666981 bytes
-rw-r--r--Bitflash-1.1.0-windows/libgcc_s_seh-1.dllbin0 -> 153412 bytes
-rw-r--r--Bitflash-1.1.0-windows/libsodium-26.dllbin0 -> 451415 bytes
-rw-r--r--Bitflash-1.1.0-windows/libssl-3-x64.dllbin0 -> 996164 bytes
-rw-r--r--Bitflash-1.1.0-windows/libstdc++-6.dllbin0 -> 2667044 bytes
-rw-r--r--Bitflash-1.1.0-windows/libwinpthread-1.dllbin0 -> 64703 bytes
-rw-r--r--build-linux.sh72
-rw-r--r--install-bitflash-wine.sh211
-rw-r--r--src/Makefile4
-rw-r--r--src/btfrv.cpp4
-rw-r--r--src/db.cpp97
-rw-r--r--src/db.h15
-rw-r--r--src/gui.cpp701
-rw-r--r--src/headers.h2
-rw-r--r--src/headers_core.h5
-rw-r--r--src/irc.cpp271
-rw-r--r--src/irc.h7
-rw-r--r--src/main.cpp631
-rw-r--r--src/main.h23
-rw-r--r--src/main_gui.cpp4
-rw-r--r--src/makefile.linux55
-rw-r--r--src/makefile.mingw4
-rw-r--r--src/makefile.vc77
-rw-r--r--src/net.cpp391
-rw-r--r--src/net.h31
-rw-r--r--src/nostr.cpp518
-rw-r--r--src/nostr.h26
-rw-r--r--src/rc/addressbook16.bmpbin1334 -> 0 bytes
-rw-r--r--src/rc/addressbook16mask.bmpbin126 -> 0 bytes
-rw-r--r--src/rc/addressbook20.bmpbin1478 -> 0 bytes
-rw-r--r--src/rc/addressbook20mask.bmpbin142 -> 0 bytes
-rw-r--r--src/rc/bitcoin_bc_original.icobin22486 -> 0 bytes
-rw-r--r--src/rc/check.icobin766 -> 0 bytes
-rw-r--r--src/rc/send16.bmpbin1334 -> 0 bytes
-rw-r--r--src/rc/send16mask.bmpbin126 -> 0 bytes
-rw-r--r--src/rc/send16masknoshadow.bmpbin126 -> 0 bytes
-rw-r--r--src/rc/send20.bmpbin1478 -> 0 bytes
-rw-r--r--src/rc/send20mask.bmpbin142 -> 0 bytes
-rw-r--r--src/rpc.cpp1544
-rw-r--r--src/ui.rc14
-rw-r--r--src/uiproject.fbp11825
-rw-r--r--src/util.cpp108
-rw-r--r--src/util.h42
46 files changed, 2648 insertions, 14035 deletions
diff --git a/.gitignore b/.gitignore
index 29ebcff..a734faf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,3 +28,4 @@ dist/
28# Editor/OS cruft 28# Editor/OS cruft
29.DS_Store 29.DS_Store
30Thumbs.db 30Thumbs.db
31src/bitflash
diff --git a/Bitflash-1.1.0-windows/glfw3.dll b/Bitflash-1.1.0-windows/glfw3.dll
new file mode 100644
index 0000000..f988a2e
--- /dev/null
+++ b/Bitflash-1.1.0-windows/glfw3.dll
Binary files differ
diff --git a/Bitflash-1.1.0-windows/libcrypto-3-x64.dll b/Bitflash-1.1.0-windows/libcrypto-3-x64.dll
new file mode 100644
index 0000000..76250f0
--- /dev/null
+++ b/Bitflash-1.1.0-windows/libcrypto-3-x64.dll
Binary files differ
diff --git a/Bitflash-1.1.0-windows/libdb_cxx-6.2.dll b/Bitflash-1.1.0-windows/libdb_cxx-6.2.dll
new file mode 100644
index 0000000..c4279f6
--- /dev/null
+++ b/Bitflash-1.1.0-windows/libdb_cxx-6.2.dll
Binary files differ
diff --git a/Bitflash-1.1.0-windows/libgcc_s_seh-1.dll b/Bitflash-1.1.0-windows/libgcc_s_seh-1.dll
new file mode 100644
index 0000000..55f4ad1
--- /dev/null
+++ b/Bitflash-1.1.0-windows/libgcc_s_seh-1.dll
Binary files differ
diff --git a/Bitflash-1.1.0-windows/libsodium-26.dll b/Bitflash-1.1.0-windows/libsodium-26.dll
new file mode 100644
index 0000000..add05ab
--- /dev/null
+++ b/Bitflash-1.1.0-windows/libsodium-26.dll
Binary files differ
diff --git a/Bitflash-1.1.0-windows/libssl-3-x64.dll b/Bitflash-1.1.0-windows/libssl-3-x64.dll
new file mode 100644
index 0000000..cbabbbc
--- /dev/null
+++ b/Bitflash-1.1.0-windows/libssl-3-x64.dll
Binary files differ
diff --git a/Bitflash-1.1.0-windows/libstdc++-6.dll b/Bitflash-1.1.0-windows/libstdc++-6.dll
new file mode 100644
index 0000000..bd3fc0f
--- /dev/null
+++ b/Bitflash-1.1.0-windows/libstdc++-6.dll
Binary files differ
diff --git a/Bitflash-1.1.0-windows/libwinpthread-1.dll b/Bitflash-1.1.0-windows/libwinpthread-1.dll
new file mode 100644
index 0000000..32d8a01
--- /dev/null
+++ b/Bitflash-1.1.0-windows/libwinpthread-1.dll
Binary files differ
diff --git a/build-linux.sh b/build-linux.sh
deleted file mode 100644
index 4c3844d..0000000
--- a/build-linux.sh
+++ /dev/null
@@ -1,72 +0,0 @@
1#!/usr/bin/env bash
2# Bitflash headless node/miner -- one-shot Linux build (Debian/Ubuntu).
3# Builds the dependencies (libsecp256k1 with schnorrsig, RandomX) and then the
4# node itself. Run from the project root (the directory that contains src/):
5#
6# bash build-linux.sh
7#
8# Result: src/bitflash-node . Run it with: ./src/bitflash-node -gen
9
10set -e
11ROOT="$(cd "$(dirname "$0")" && pwd)"
12cd "$ROOT"
13
14# Use sudo only when not already root (a root login often has no sudo installed).
15SUDO=""
16if [ "$(id -u)" -ne 0 ]; then SUDO="sudo"; fi
17
18echo "==> installing system packages"
19if command -v apt-get >/dev/null 2>&1; then
20 $SUDO apt-get update
21 $SUDO apt-get install -y build-essential cmake git pkg-config autoconf libtool \
22 libssl-dev libdb5.3++-dev libsodium-dev nlohmann-json3-dev libboost-dev \
23 libboost-system-dev libwxgtk3.2-dev
24else
25 echo "!! non-apt system: install manually -> g++ cmake git autoconf libtool"
26 echo " libssl-dev libdb++-dev libsodium-dev nlohmann-json (headers)"
27fi
28
29# ---- libsecp256k1 (Schnorr/BIP340 + extrakeys), static, installed to /usr/local
30if [ ! -f /usr/local/lib/libsecp256k1.a ]; then
31 echo "==> building libsecp256k1"
32 rm -rf "$ROOT/secp256k1-build"
33 git clone --depth 1 https://github.com/bitcoin-core/secp256k1 "$ROOT/secp256k1-build"
34 cd "$ROOT/secp256k1-build"
35 ./autogen.sh
36 ./configure --enable-module-schnorrsig --enable-module-extrakeys \
37 --disable-shared --with-pic --disable-benchmark --disable-tests
38 make -j"$(nproc)"
39 $SUDO make install
40 $SUDO ldconfig
41 cd "$ROOT"
42else
43 echo "==> libsecp256k1 already installed, skipping"
44fi
45
46# ---- RandomX (memory-hard CPU PoW), static lib
47if [ ! -f "$HOME/RandomX/build/librandomx.a" ]; then
48 echo "==> building RandomX"
49 rm -rf "$HOME/RandomX"
50 git clone --depth 1 https://github.com/tevador/RandomX "$HOME/RandomX"
51 mkdir -p "$HOME/RandomX/build"
52 cd "$HOME/RandomX/build"
53 cmake .. -DCMAKE_BUILD_TYPE=Release
54 make -j"$(nproc)" randomx
55 cd "$ROOT"
56else
57 echo "==> RandomX already built, skipping"
58fi
59
60# ---- build
61echo "==> building bitflash"
62cd "$ROOT/src"
63make -f makefile.linux RANDOMX_DIR="$HOME/RandomX" -j"$(nproc)"
64
65echo
66echo "==================================================================="
67echo " DONE. $ROOT/src/bitflash"
68echo
69echo " GUI: ./src/bitflash"
70echo " Daemon mode: ./src/bitflash /nogui /gen"
71echo " Pool server starts automatically on Stratum :3333, stats :19012"
72echo "==================================================================="
diff --git a/install-bitflash-wine.sh b/install-bitflash-wine.sh
deleted file mode 100644
index 91fef59..0000000
--- a/install-bitflash-wine.sh
+++ /dev/null
@@ -1,211 +0,0 @@
1#!/usr/bin/env bash
2# Bitflash GUI installer for Linux (via Wine) — hardened
3set -euo pipefail
4
5INSTALL_DIR="$HOME/.btf-wine"
6WINE_DATA="$HOME/.wine/drive_c/users/$USER/AppData/Roaming/Bitflash"
7LINUX_DATA="$HOME/.bitflash"
8BIN_DIR="$HOME/.local/bin"
9REPO="Bitflash-sh/bitflash"
10
11echo "==> Bitflash GUI installer"
12echo
13
14# ---- Safety: don't run as root (breaks Wine + pollutes /root)
15if [ "$(id -u)" -eq 0 ]; then
16 echo "ERROR: do not run this as root. Run as your normal user (it will call sudo only when needed)." >&2
17 exit 1
18fi
19
20need() { command -v "$1" >/dev/null 2>&1; }
21
22# ---- Wine
23echo "==> Checking Wine..."
24if ! need wine; then
25 echo " Installing Wine..."
26 if ! need apt-get; then
27 echo "ERROR: apt-get not found. Install 'wine' manually, then re-run." >&2
28 exit 1
29 fi
30 sudo apt-get update -qq
31 sudo apt-get install -y wine
32fi
33echo " Wine: $(wine --version)"
34
35# ---- db-util (db_dump / db_load for wallet conversion)
36echo "==> Checking db-util..."
37if ! need db_dump; then
38 echo " Installing db-util..."
39 sudo apt-get install -y db-util
40fi
41echo " db_dump: $(command -v db_dump)"
42
43# ---- unzip + sha256sum must exist
44for tool in unzip sha256sum curl; do
45 if ! need "$tool"; then
46 echo " Installing $tool..."
47 sudo apt-get install -y "$tool"
48 fi
49done
50
51# ---- Resolve latest release (single API call)
52echo "==> Fetching latest release metadata from GitHub..."
53API_JSON=$(curl -fsSL "https://api.github.com/repos/$REPO/releases/latest")
54
55RELEASE_URL=$(printf '%s\n' "$API_JSON" | grep '"browser_download_url"' \
56 | grep -iE 'win|windows|gui' | head -1 | cut -d '"' -f 4 || true)
57[ -z "$RELEASE_URL" ] && RELEASE_URL=$(printf '%s\n' "$API_JSON" | grep '"browser_download_url"' \
58 | grep -iE '\.zip"?$' | head -1 | cut -d '"' -f 4 || true)
59
60if [ -z "$RELEASE_URL" ]; then
61 echo "ERROR: no downloadable release asset found at https://github.com/$REPO/releases" >&2
62 exit 1
63fi
64ASSET_NAME=$(basename "$RELEASE_URL")
65echo " Asset: $ASSET_NAME"
66
67# checksum manifest published alongside the release (SHA256SUMS)
68SUMS_URL=$(printf '%s\n' "$API_JSON" | grep '"browser_download_url"' \
69 | grep -iE 'sha256sums|checksums|\.sha256"?$' | head -1 | cut -d '"' -f 4 || true)
70
71# ---- Download the release
72TMPZIP=$(mktemp /tmp/bitflash-XXXXXX.zip)
73cleanup() { rm -f "$TMPZIP" "${TMPSUMS:-}"; }
74trap cleanup EXIT
75echo "==> Downloading release..."
76curl -fL --retry 3 --retry-delay 2 -o "$TMPZIP" "$RELEASE_URL"
77echo " Downloaded: $(du -h "$TMPZIP" | cut -f1)"
78
79# ---- MANDATORY integrity check
80echo "==> Verifying integrity..."
81GOT=$(sha256sum "$TMPZIP" | awk '{print $1}')
82if [ -n "${EXPECTED_SHA256:-}" ]; then
83 # Strongest: user pinned a known-good hash out-of-band.
84 if [ "$GOT" != "$EXPECTED_SHA256" ]; then
85 echo "ERROR: checksum mismatch. expected $EXPECTED_SHA256, got $GOT" >&2
86 exit 1
87 fi
88 echo " OK (matches pinned EXPECTED_SHA256)"
89elif [ -n "$SUMS_URL" ]; then
90 TMPSUMS=$(mktemp /tmp/bitflash-sums-XXXXXX)
91 curl -fsSL --retry 3 -o "$TMPSUMS" "$SUMS_URL"
92 WANT=$(grep -iF "$ASSET_NAME" "$TMPSUMS" | awk '{print $1}' | head -1 || true)
93 if [ -z "$WANT" ]; then
94 echo "ERROR: no checksum for $ASSET_NAME in published SHA256SUMS." >&2
95 exit 1
96 fi
97 if [ "$GOT" != "$WANT" ]; then
98 echo "ERROR: checksum mismatch. published $WANT, got $GOT" >&2
99 exit 1
100 fi
101 echo " OK (matches published SHA256SUMS)"
102else
103 echo "ERROR: no checksum available for this release." >&2
104 echo " Publish a SHA256SUMS asset with the release, or re-run with" >&2
105 echo " EXPECTED_SHA256=<hash> to verify against a known-good value." >&2
106 echo " (To bypass at your own risk: ALLOW_UNVERIFIED=1)" >&2
107 if [ "${ALLOW_UNVERIFIED:-0}" != "1" ]; then
108 exit 1
109 fi
110 echo " WARNING: proceeding UNVERIFIED (ALLOW_UNVERIFIED=1). sha256=$GOT"
111fi
112
113# ---- Extract
114echo "==> Extracting to $INSTALL_DIR..."
115rm -rf "$INSTALL_DIR"
116mkdir -p "$INSTALL_DIR"
117unzip -j -o "$TMPZIP" -d "$INSTALL_DIR" >/dev/null
118
119# ---- Rename backslash-mangled entries (Windows zip paths)
120count=0
121for f in "$INSTALL_DIR"/*; do
122 [ -f "$f" ] || continue
123 base=$(basename "$f")
124 newname=$(printf '%s' "$base" | sed 's/.*\\//')
125 if [ "$newname" != "$base" ]; then
126 mv "$f" "$INSTALL_DIR/$newname"
127 count=$((count+1))
128 fi
129done
130echo " Renamed $count files; total: $(ls "$INSTALL_DIR" | wc -l)"
131
132# Locate the Bitflash exe case-insensitively (zip may ship Bitflash.exe or bitflash.exe)
133EXE=$(find "$INSTALL_DIR" -maxdepth 1 -iname 'bitflash.exe' | head -1)
134if [ -z "$EXE" ]; then
135 echo "ERROR: bitflash exe not found after extract. Contents:" >&2
136 ls "$INSTALL_DIR" >&2
137 exit 1
138fi
139echo " Found $(basename "$EXE")"
140
141# ---- Init Wine data dir
142echo "==> Initializing Wine data directory..."
143WINEDLLOVERRIDES="libdb_cxx-6.2=n" wine "$EXE" &
144WINE_PID=$!
145created=0
146for i in $(seq 1 30); do
147 sleep 1
148 if [ -f "$WINE_DATA/wallet.dat" ]; then
149 echo " wallet.dat created after ${i}s"
150 created=1
151 break
152 fi
153done
154kill "$WINE_PID" 2>/dev/null || true
155wait "$WINE_PID" 2>/dev/null || true
156sleep 1
157mkdir -p "$WINE_DATA"
158[ "$created" -eq 1 ] || echo " NOTE: Wine did not create wallet.dat in 30s; continuing."
159
160# ---- Optional wallet import (with backup)
161echo
162if [ -f "$LINUX_DATA/wallet.dat" ]; then
163 echo "==> Found existing Linux wallet at $LINUX_DATA/wallet.dat"
164 read -r -p " Import it into the GUI wallet? [Y/n] " ans
165 ans=${ans:-Y}
166 if [[ "$ans" =~ ^[Yy] ]]; then
167 if [ -f "$WINE_DATA/wallet.dat" ]; then
168 BK="$WINE_DATA/wallet.dat.bak.$(date +%Y%m%d%H%M%S)"
169 cp "$WINE_DATA/wallet.dat" "$BK"
170 echo " Backed up existing GUI wallet -> $BK"
171 fi
172 DUMP=$(mktemp); CONVERTED=$(mktemp); rm -f "$CONVERTED"
173 echo " Converting Linux wallet format..."
174 db_dump -p "$LINUX_DATA/wallet.dat" > "$DUMP"
175 db_load -f "$DUMP" "$CONVERTED"
176 cp "$CONVERTED" "$WINE_DATA/wallet.dat"
177 rm -f "$DUMP" "$CONVERTED"
178 echo " Wallet imported."
179 else
180 echo " Skipped. Re-run to import later."
181 fi
182else
183 echo "==> No Linux wallet found, starting fresh."
184fi
185
186# ---- Launcher
187echo "==> Creating 'bitflash' command..."
188mkdir -p "$BIN_DIR"
189LAUNCHER_FILE="$BIN_DIR/bitflash"
190cat > "$LAUNCHER_FILE" <<EOF
191#!/usr/bin/env bash
192RELAY="\${BTF_RELAY:-}"
193ANNOUNCE=""
194[ -n "\$RELAY" ] && ANNOUNCE="-announcerelay=\$RELAY"
195WINEDLLOVERRIDES="libdb_cxx-6.2=n" wine "$EXE" \$ANNOUNCE "\$@"
196EOF
197chmod +x "$LAUNCHER_FILE"
198
199if [[ ":$PATH:" != *":$BIN_DIR:"* ]] && ! grep -qF 'export PATH="$HOME/.local/bin:$PATH"' "$HOME/.bashrc" 2>/dev/null; then
200 echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$HOME/.bashrc"
201 echo " Added ~/.local/bin to PATH (restart shell or: source ~/.bashrc)"
202fi
203
204echo
205echo "=================================================================="
206echo " DONE."
207echo " Launch: bitflash"
208echo " Mine: bitflash -gen"
209echo " Relay: bitflash -announcerelay=YOUR_HOST:8434"
210echo " Data: $WINE_DATA"
211echo "=================================================================="
diff --git a/src/Makefile b/src/Makefile
index 3280fd3..c0b6e1d 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -21,14 +21,14 @@ LIBS = -L$(SECP_LIB) -lsecp256k1 \
21 -lglfw -lGL 21 -lglfw -lGL
22 22
23HEADERS = headers_core.h headers.h util.h main.h serialize.h uint256.h \ 23HEADERS = headers_core.h headers.h util.h main.h serialize.h uint256.h \
24 key.h bignum.h script.h db.h base58.h net.h irc.h nostr.h \ 24 key.h bignum.h script.h db.h base58.h net.h nostr.h \
25 randomx_pow.h btfaddr.h btfchan.h btfrv.h btftunnel.h market.h compat.h 25 randomx_pow.h btfaddr.h btfchan.h btfrv.h btftunnel.h market.h compat.h
26 26
27IMGUI_OBJS = obj/imgui.o obj/imgui_draw.o obj/imgui_tables.o \ 27IMGUI_OBJS = obj/imgui.o obj/imgui_draw.o obj/imgui_tables.o \
28 obj/imgui_widgets.o obj/imgui_impl_glfw.o obj/imgui_impl_opengl3.o 28 obj/imgui_widgets.o obj/imgui_impl_glfw.o obj/imgui_impl_opengl3.o
29 29
30NODE_OBJS = obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o \ 30NODE_OBJS = obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o \
31 obj/market.o obj/sha.o obj/irc.o obj/nostr.o obj/randomx_pow.o \ 31 obj/market.o obj/sha.o obj/nostr.o obj/randomx_pow.o \
32 obj/btfaddr.o obj/btfchan.o obj/btfrv.o obj/btftunnel.o obj/rpc.o 32 obj/btfaddr.o obj/btfchan.o obj/btfrv.o obj/btftunnel.o obj/rpc.o
33 33
34GUI_OBJS = obj/gui.o obj/main_gui.o 34GUI_OBJS = obj/gui.o obj/main_gui.o
diff --git a/src/btfrv.cpp b/src/btfrv.cpp
index 812d077..0d02ca8 100644
--- a/src/btfrv.cpp
+++ b/src/btfrv.cpp
@@ -101,7 +101,7 @@ static SOCKET ConnectTo(const char* host, unsigned short port)
101 101
102 // Apply a short timeout only for the connect() and initial handshake so an 102 // Apply a short timeout only for the connect() and initial handshake so an
103 // unresponsive relay doesn't block the thread. Once the tunnel is live the 103 // unresponsive relay doesn't block the thread. Once the tunnel is live the
104 // timeout is cleared — a forwarding pipe must block indefinitely on recv(). 104 // timeout is cleared -- a forwarding pipe must block indefinitely on recv().
105#ifdef _WIN32 105#ifdef _WIN32
106 DWORD tvShort = 10000; 106 DWORD tvShort = 10000;
107 setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tvShort, sizeof(tvShort)); 107 setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tvShort, sizeof(tvShort));
@@ -118,7 +118,7 @@ static SOCKET ConnectTo(const char* host, unsigned short port)
118 } 118 }
119 freeaddrinfo(res); 119 freeaddrinfo(res);
120 120
121 // Clear the timeout — the socket is now a live tunnel and must not 121 // Clear the timeout -- the socket is now a live tunnel and must not
122 // time out when idle. recv() will block until data arrives or peer closes. 122 // time out when idle. recv() will block until data arrives or peer closes.
123#ifdef _WIN32 123#ifdef _WIN32
124 DWORD tvOff = 0; 124 DWORD tvOff = 0;
diff --git a/src/db.cpp b/src/db.cpp
index de71a57..199fa44 100644
--- a/src/db.cpp
+++ b/src/db.cpp
@@ -392,77 +392,8 @@ bool CTxDB::LoadBlockIndex()
392 392
393 393
394 394
395// 395// Legacy IP-based peer address database (CAddrDB / addr.dat) removed --
396// CAddrDB 396// peer discovery is entirely Nostr/.btf-based now.
397//
398
399bool CAddrDB::WriteAddress(const CAddress& addr)
400{
401 return Write(make_pair(string("addr"), addr.GetKey()), addr);
402}
403
404bool CAddrDB::LoadAddresses()
405{
406 CRITICAL_BLOCK(cs_mapAddresses)
407 {
408 // Load user provided addresses
409 CAutoFile filein = fopen("addr.txt", "rt");
410 if (filein)
411 {
412 try
413 {
414 char psz[1000];
415 while (fgets(psz, sizeof(psz), filein))
416 {
417 CAddress addr(psz, NODE_NETWORK);
418 if (addr.ip != 0)
419 AddAddress(*this, addr);
420 }
421 }
422 catch (...) { }
423 }
424
425 // Get cursor
426 Dbc* pcursor = GetCursor();
427 if (!pcursor)
428 return false;
429
430 loop
431 {
432 // Read next record
433 CDataStream ssKey;
434 CDataStream ssValue;
435 int ret = ReadAtCursor(pcursor, ssKey, ssValue);
436 if (ret == DB_NOTFOUND)
437 break;
438 else if (ret != 0)
439 return false;
440
441 // Unserialize
442 string strType;
443 ssKey >> strType;
444 if (strType == "addr")
445 {
446 CAddress addr;
447 ssValue >> addr;
448 mapAddresses.insert(make_pair(addr.GetKey(), addr));
449 }
450 }
451
452 //// debug print
453 printf("mapAddresses:\n");
454 foreach(const PAIRTYPE(vector<unsigned char>, CAddress)& item, mapAddresses)
455 item.second.print();
456 printf("-----\n");
457 }
458
459 return true;
460}
461
462bool LoadAddresses()
463{
464 return CAddrDB("cr+").LoadAddresses();
465}
466 397
467 398
468 399
@@ -563,24 +494,28 @@ bool CWalletDB::LoadWallet(vector<unsigned char>& vchDefaultKeyRet)
563 { 494 {
564 string strKey; 495 string strKey;
565 ssKey >> strKey; 496 ssKey >> strKey;
566 if (strKey == "fGenerateBitcoins") ssValue >> fGenerateBitcoins;
567 if (strKey == "nTransactionFee") ssValue >> nTransactionFee; 497 if (strKey == "nTransactionFee") ssValue >> nTransactionFee;
568 if (strKey == "addrIncoming") ssValue >> addrIncoming; 498 if (strKey == "addrIncoming") ssValue >> addrIncoming;
569 if (strKey == "nMineMode") ssValue >> nMineMode; 499 // Mining-mode/pool settings (nMineMode, strParticipantPool, strPoolName,
570 if (strKey == "strParticipantPool") ssValue >> strParticipantPool; 500 // strPoolDashboardUrl, dPoolFeePercent, fGenerateBitcoins) are intentionally
571 if (strKey == "strPoolName") ssValue >> strPoolName; 501 // NOT restored here. They used to be, and LoadWallet() runs after CLI flags
572 if (strKey == "strPoolDashboardUrl") ssValue >> strPoolDashboardUrl; 502 // are parsed in main_gui.cpp, so a saved value would silently overwrite
573 if (strKey == "dPoolFeePercent") ssValue >> dPoolFeePercent; 503 // whatever was just requested on the command line or in a previous Options
504 // session -- no error, no log line. That's what caused pool name/address to
505 // show correctly in the UI but stay stale in the logs, and mode to change
506 // behavior across restarts. Mode/pool config is decided fresh every launch
507 // instead: CLI flags if given, otherwise the compiled-in default. Nothing to
508 // go stale, nothing to fight over load order.
574 } 509 }
575 } 510 }
576 } 511 }
577 512
578 printf("fGenerateBitcoins = %d\n", fGenerateBitcoins);
579 printf("nTransactionFee = %lld\n", nTransactionFee); 513 printf("nTransactionFee = %lld\n", nTransactionFee);
580 printf("addrIncoming = %s\n", addrIncoming.ToString().c_str()); 514 printf("addrIncoming = %s\n", addrIncoming.ToString().c_str());
581 printf("nMineMode = %d, strParticipantPool = %s\n", nMineMode, strParticipantPool.c_str()); 515 printf("nMineMode = %d, strParticipantPool = %s, fGenerateBitcoins = %d (from CLI/default, not wallet.dat)\n",
582 printf("strPoolName = %s, dPoolFeePercent = %.2f\n", strPoolName.c_str(), dPoolFeePercent); 516 nMineMode, strParticipantPool.c_str(), fGenerateBitcoins);
583 printf("strPoolDashboardUrl = %s\n", strPoolDashboardUrl.c_str()); 517 printf("strPoolName = %s, dPoolFeePercent = %.2f, strPoolDashboardUrl = %s (from CLI/default, not wallet.dat)\n",
518 strPoolName.c_str(), dPoolFeePercent, strPoolDashboardUrl.c_str());
584 519
585 return true; 520 return true;
586} 521}
diff --git a/src/db.h b/src/db.h
index feaa45e..6dc3a4f 100644
--- a/src/db.h
+++ b/src/db.h
@@ -316,19 +316,8 @@ private:
316 316
317 317
318 318
319class CAddrDB : public CDB 319// Legacy IP-based peer address database (CAddrDB / addr.dat) removed --
320{ 320// peer discovery is entirely Nostr/.btf-based now.
321public:
322 CAddrDB(const char* pszMode="r+", bool fTxn=false) : CDB("addr.dat", pszMode, fTxn) { }
323private:
324 CAddrDB(const CAddrDB&);
325 void operator=(const CAddrDB&);
326public:
327 bool WriteAddress(const CAddress& addr);
328 bool LoadAddresses();
329};
330
331bool LoadAddresses();
332 321
333 322
334 323
diff --git a/src/gui.cpp b/src/gui.cpp
index 2210296..a1a0698 100644
--- a/src/gui.cpp
+++ b/src/gui.cpp
@@ -1,4 +1,4 @@
1// Bitflash GUI — ImGui + GLFW + OpenGL3 1// Bitflash GUI -- ImGui + GLFW + OpenGL3
2// Same source on Linux and Windows. No platform ifdefs. 2// Same source on Linux and Windows. No platform ifdefs.
3 3
4#include "imgui/imgui.h" 4#include "imgui/imgui.h"
@@ -25,6 +25,7 @@ extern std::string strParticipantPool;
25extern CAddress addrLocalHost; 25extern CAddress addrLocalHost;
26 26
27void MainFrameRepaint(); 27void MainFrameRepaint();
28int GetDiscoveredPeerCount();
28string DateTimeStr(int64 nTime); 29string DateTimeStr(int64 nTime);
29bool SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew); 30bool SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew);
30int64 GetBalance(); 31int64 GetBalance();
@@ -34,15 +35,20 @@ void ThreadBitcoinMiner(void*);
34void ThreadRPCServer(void*); 35void ThreadRPCServer(void*);
35 36
36// --------------------------------------------------------------------------- 37// ---------------------------------------------------------------------------
37// State 38// Layout constants
39// ---------------------------------------------------------------------------
40static const float STATUS_BAR_H = 22.0f;
41
42// ---------------------------------------------------------------------------
43// GUI state
38// --------------------------------------------------------------------------- 44// ---------------------------------------------------------------------------
39static std::string g_myAddress; 45static std::string g_myAddress;
40static int64 g_balance = 0; 46static int64 g_balance = 0;
41static int64 g_lastWalletRefresh = 0; 47static int64 g_lastWalletRefresh = 0;
42static bool g_showSend = false; 48static bool g_showSend = false;
43static bool g_showOptions = false; 49static bool g_showOptions = false;
44static bool g_showAbout = false; 50static bool g_showAbout = false;
45static bool g_needRefresh = true; 51static bool g_needRefresh = true;
46 52
47static char g_sendAddr[128] = {}; 53static char g_sendAddr[128] = {};
48static char g_sendAmount[32] = {}; 54static char g_sendAmount[32] = {};
@@ -73,36 +79,34 @@ static std::string FmtMoney(int64 n)
73static std::string FmtAge(int64 createdAt) 79static std::string FmtAge(int64 createdAt)
74{ 80{
75 int64 age = GetTime() - createdAt; 81 int64 age = GetTime() - createdAt;
76 if (age < 0) 82 if (age < 0) age = 0;
77 age = 0; 83 if (age < 60) return strprintf("%llds", (long long)age);
78 if (age < 60) 84 if (age < 3600) return strprintf("%lldm", (long long)(age / 60));
79 return strprintf("%llds", (long long)age); 85 return strprintf("%lldh", (long long)(age / 3600));
80 if (age < 3600)
81 return strprintf("%lldm", (long long)(age / 60));
82 return strprintf("%lldh", (long long)(age / 3600));
83} 86}
84 87
85static ImVec4 ParticipantStatusColor(const std::string& status) 88static ImVec4 StatusColor(const std::string& s)
86{ 89{
87 if (status.find("failed") != std::string::npos || 90 if (s.find("failed") != std::string::npos ||
88 status.find("rejected") != std::string::npos || 91 s.find("rejected") != std::string::npos ||
89 status.find("stopped") != std::string::npos) 92 s.find("stopped") != std::string::npos)
90 return ImVec4(1.0f, 0.38f, 0.38f, 1.0f); 93 return ImVec4(1.0f, 0.38f, 0.38f, 1.0f); // red
91 if (status.find("hashing") != std::string::npos || 94 if (s.find("hashing") != std::string::npos ||
92 status.find("accepted") != std::string::npos || 95 s.find("accepted") != std::string::npos ||
93 status.find("connected") != std::string::npos) 96 s.find("connected")!= std::string::npos)
94 return ImVec4(0.35f, 1.0f, 0.45f, 1.0f); 97 return ImVec4(0.35f, 1.0f, 0.45f, 1.0f); // green
95 if (status.find("asking") != std::string::npos || 98 if (s.find("asking") != std::string::npos ||
96 status.find("authoriz") != std::string::npos || 99 s.find("authoriz") != std::string::npos ||
97 status.find("subscrib") != std::string::npos) 100 s.find("subscrib") != std::string::npos)
98 return ImVec4(1.0f, 0.75f, 0.25f, 1.0f); 101 return ImVec4(1.0f, 0.75f, 0.25f, 1.0f); // amber
99 return ImVec4(0.55f, 0.80f, 1.0f, 1.0f); 102 return ImVec4(0.55f, 0.80f, 1.0f, 1.0f); // blue-grey
100} 103}
101 104
102static std::string PoolLabel(const BtfPoolAnnouncement& ann) 105static std::string PoolLabel(const BtfPoolAnnouncement& ann)
103{ 106{
104 std::ostringstream o; 107 std::ostringstream o;
105 o << ann.poolName << " - " << std::fixed << std::setprecision(2) << ann.feePercent << "%"; 108 o << ann.poolName << " - "
109 << std::fixed << std::setprecision(2) << ann.feePercent << "%";
106 if (ann.connectedMiners > 0) 110 if (ann.connectedMiners > 0)
107 o << " - " << ann.connectedMiners << " miners"; 111 o << " - " << ann.connectedMiners << " miners";
108 return o.str(); 112 return o.str();
@@ -118,19 +122,47 @@ static void RefreshWallet()
118 g_txRows.clear(); 122 g_txRows.clear();
119 TRY_CRITICAL_BLOCK(cs_mapWallet) 123 TRY_CRITICAL_BLOCK(cs_mapWallet)
120 { 124 {
121 std::vector<std::pair<int64,uint256>> vs; 125 // Sort: unconfirmed first (depth 0), then by depth ascending (least
122 for (auto& kv : mapWallet) vs.push_back({kv.second.GetTxTime(), kv.first}); 126 // deep = most recent). We can't use nTimeReceived because a node
123 std::sort(vs.rbegin(), vs.rend()); 127 // resync re-stamps all txs with the same time. Depth is always correct.
128 std::vector<std::pair<int,uint256>> vs;
129 for (auto& kv : mapWallet)
130 vs.push_back({kv.second.GetDepthInMainChain(), kv.second.GetHash()});
131 std::sort(vs.begin(), vs.end(),
132 [](const std::pair<int,uint256>& a, const std::pair<int,uint256>& b) {
133 return a.first < b.first; // 0 (unconfirmed) first, then shallowest
134 });
124 for (auto& sv : vs) { 135 for (auto& sv : vs) {
125 auto mi = mapWallet.find(sv.second); 136 auto mi = mapWallet.find(sv.second);
126 if (mi == mapWallet.end()) continue; 137 if (mi == mapWallet.end()) continue;
127 CWalletTx& wtx = mi->second; 138 CWalletTx& wtx = mi->second;
128 int64 net = wtx.GetCredit() - wtx.GetDebit(); 139 int depth = wtx.GetDepthInMainChain();
129 int depth = wtx.GetDepthInMainChain(); 140 int toMature = wtx.IsCoinBase() ? wtx.GetBlocksToMaturity() : 0;
141 // An orphaned coinbase has hashBlock set but depth=0 (block not in main chain).
142 // A genuinely unconfirmed tx has hashBlock==0.
143 bool isOrphaned = wtx.IsCoinBase() && wtx.hashBlock != 0 && depth == 0;
144 int64 net;
130 std::string desc; 145 std::string desc;
131 if (wtx.IsCoinBase()) desc = depth<1 ? "Generated (unconfirmed)" : "Generated"; 146 if (wtx.IsCoinBase()) {
132 else if (wtx.GetDebit() > 0) desc = "Sent"; 147 if (isOrphaned) {
133 else desc = "Received"; 148 net = 0;
149 desc = "Generated (orphaned -- block not in main chain)";
150 } else if (toMature > 0) {
151 net = wtx.GetValueOut();
152 char buf[64];
153 snprintf(buf, sizeof(buf), "Generated (matures in %d blocks)", toMature);
154 desc = buf;
155 } else {
156 net = wtx.GetCredit() - wtx.GetDebit();
157 desc = depth < 1 ? "Generated (unconfirmed)" : "Generated";
158 }
159 } else if (wtx.GetDebit() > 0) {
160 net = wtx.GetCredit() - wtx.GetDebit();
161 desc = "Sent";
162 } else {
163 net = wtx.GetCredit() - wtx.GetDebit();
164 desc = "Received";
165 }
134 g_txRows.push_back({DateTimeStr(wtx.GetTxTime()), desc, net, depth}); 166 g_txRows.push_back({DateTimeStr(wtx.GetTxTime()), desc, net, depth});
135 } 167 }
136 } 168 }
@@ -149,18 +181,103 @@ string DateTimeStr(int64 nTime)
149} 181}
150 182
151// --------------------------------------------------------------------------- 183// ---------------------------------------------------------------------------
184// Status bar -- separate fullscreen-width overlay pinned to bottom edge.
185// Drawn last so it always sits on top of everything else.
186// ---------------------------------------------------------------------------
187static void DrawStatusBar()
188{
189 ImGuiIO& io = ImGui::GetIO();
190 ImGui::SetNextWindowPos(ImVec2(0.0f, io.DisplaySize.y - STATUS_BAR_H));
191 ImGui::SetNextWindowSize(ImVec2(io.DisplaySize.x, STATUS_BAR_H));
192 ImGui::SetNextWindowBgAlpha(1.0f);
193 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(10.0f, 3.0f));
194 ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
195 ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
196 ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0.13f, 0.13f, 0.13f, 1.0f));
197 ImGui::Begin("##statusbar", nullptr,
198 ImGuiWindowFlags_NoTitleBar |
199 ImGuiWindowFlags_NoResize |
200 ImGuiWindowFlags_NoMove |
201 ImGuiWindowFlags_NoScrollbar |
202 ImGuiWindowFlags_NoScrollWithMouse|
203 ImGuiWindowFlags_NoSavedSettings |
204 ImGuiWindowFlags_NoBringToFrontOnFocus);
205 ImGui::PopStyleVar(3);
206 ImGui::PopStyleColor();
207
208 int connected = (int)vNodes.size();
209 int discovered = GetDiscoveredPeerCount();
210
211 if (nMineMode == MINE_PARTICIPANT) {
212 uint64 sent = 0, accepted = 0;
213 double hashRate = 0.0;
214 std::string st = GetParticipantMiningStatus();
215 GetParticipantMiningStats(sent, accepted, hashRate);
216 if (sent > 0 || accepted > 0 || hashRate > 0.0)
217 ImGui::TextDisabled(
218 "Connected peers: %d Detected peers: %d Height: %d"
219 " Shares: %llu sent / %llu accepted %.2f H/s",
220 connected, discovered, nBestHeight,
221 (unsigned long long)sent, (unsigned long long)accepted, hashRate);
222 else if (!st.empty())
223 ImGui::TextDisabled(
224 "Connected peers: %d Detected peers: %d Height: %d %s",
225 connected, discovered, nBestHeight, st.c_str());
226 else
227 ImGui::TextDisabled(
228 "Connected peers: %d Detected peers: %d Height: %d",
229 connected, discovered, nBestHeight);
230 } else if (nMineMode == MINE_OPERATOR) {
231 int miners = 0, blocksFound = 0;
232 uint64 roundShares = 0;
233 double totalHashRate = 0.0;
234 GetPoolOperatorStats(miners, blocksFound, roundShares, totalHashRate);
235 ImGui::TextDisabled(
236 "Connected peers: %d Detected peers: %d Height: %d"
237 " Miners: %d Round shares: %llu Blocks found: %d %.2f H/s",
238 connected, discovered, nBestHeight,
239 miners, (unsigned long long)roundShares, blocksFound, totalHashRate);
240 } else {
241 ImGui::TextDisabled(
242 "Connected peers: %d Detected peers: %d Height: %d",
243 connected, discovered, nBestHeight);
244 }
245
246 ImGui::End();
247}
248
249// ---------------------------------------------------------------------------
152// Main window 250// Main window
251//
252// Layout:
253// [menu bar] -- ImGui built-in menu
254// [header strip] -- address, balance, send button, mine status
255// [separator]
256// [telemetry strip] -- mode-specific live stats (never scrolls)
257// [separator]
258// [scrollable content child] -- transactions + mode panels
259//
260// The scrollable child ends at the top of the status bar so content never
261// hides behind it. The child is explicitly sized to fill the remaining space.
153// --------------------------------------------------------------------------- 262// ---------------------------------------------------------------------------
154static void DrawMainWindow() 263static void DrawMainWindow()
155{ 264{
156 ImGuiIO& io = ImGui::GetIO(); 265 ImGuiIO& io = ImGui::GetIO();
157 ImGui::SetNextWindowPos(ImVec2(0,0)); 266
158 ImGui::SetNextWindowSize(io.DisplaySize); 267 // Full display height minus the status bar at the bottom.
159 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(12,12)); 268 const float winH = io.DisplaySize.y - STATUS_BAR_H;
269
270 ImGui::SetNextWindowPos(ImVec2(0.0f, 0.0f));
271 ImGui::SetNextWindowSize(ImVec2(io.DisplaySize.x, winH));
272 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(12.0f, 12.0f));
160 ImGui::Begin("##main", nullptr, 273 ImGui::Begin("##main", nullptr,
161 ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | 274 ImGuiWindowFlags_NoTitleBar |
162 ImGuiWindowFlags_NoMove | ImGuiWindowFlags_MenuBar | 275 ImGuiWindowFlags_NoResize |
163 ImGuiWindowFlags_NoFocusOnAppearing); 276 ImGuiWindowFlags_NoMove |
277 ImGuiWindowFlags_NoScrollbar |
278 ImGuiWindowFlags_NoScrollWithMouse |
279 ImGuiWindowFlags_MenuBar |
280 ImGuiWindowFlags_NoBringToFrontOnFocus);
164 ImGui::SetWindowFontScale(0.92f); 281 ImGui::SetWindowFontScale(0.92f);
165 ImGui::PopStyleVar(); 282 ImGui::PopStyleVar();
166 283
@@ -170,179 +287,209 @@ static void DrawMainWindow()
170 if (ImGui::MenuItem("Exit")) glfwSetWindowShouldClose(glfwGetCurrentContext(), true); 287 if (ImGui::MenuItem("Exit")) glfwSetWindowShouldClose(glfwGetCurrentContext(), true);
171 ImGui::EndMenu(); 288 ImGui::EndMenu();
172 } 289 }
173 if (ImGui::MenuItem("Options")) g_showOptions = true; 290 if (ImGui::MenuItem("Options")) g_showOptions = true;
174 if (ImGui::MenuItem("About")) g_showAbout = true; 291 if (ImGui::MenuItem("About")) g_showAbout = true;
175 ImGui::EndMenuBar(); 292 ImGui::EndMenuBar();
176 } 293 }
177 294
178 // ---- Address bar ---- 295 // ---- Header strip (never scrolls) ----
179 ImGui::Spacing(); 296 ImGui::Spacing();
180 ImGui::TextDisabled("Address:"); 297 ImGui::TextDisabled("Address:");
181 ImGui::SameLine(); 298 ImGui::SameLine();
182 ImGui::SetNextItemWidth(-80); 299 ImGui::SetNextItemWidth(-80.0f);
183 ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(0.14f,0.14f,0.14f,1)); 300 ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(0.14f, 0.14f, 0.14f, 1.0f));
184 ImGui::InputText("##addr", (char*)g_myAddress.c_str(), g_myAddress.size()+1, 301 ImGui::InputText("##addr", (char*)g_myAddress.c_str(), g_myAddress.size()+1,
185 ImGuiInputTextFlags_ReadOnly); 302 ImGuiInputTextFlags_ReadOnly);
186 ImGui::PopStyleColor(); 303 ImGui::PopStyleColor();
187 ImGui::SameLine(); 304 ImGui::SameLine();
188 if (ImGui::Button("Copy##a")) ImGui::SetClipboardText(g_myAddress.c_str()); 305 if (ImGui::Button("Copy##a")) ImGui::SetClipboardText(g_myAddress.c_str());
189 306
190 // ---- Balance on its own line ----
191 ImGui::TextDisabled("Balance:"); 307 ImGui::TextDisabled("Balance:");
192 ImGui::SameLine(); 308 ImGui::SameLine();
193 ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.35f,1.0f,0.35f,1.0f)); 309 ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.35f, 1.0f, 0.35f, 1.0f));
194 ImGui::Text("%s BTF", FmtMoney(g_balance).c_str()); 310 ImGui::Text("%s BTF", FmtMoney(g_balance).c_str());
195 ImGui::PopStyleColor(); 311 ImGui::PopStyleColor();
196 312
197 // ---- Toolbar ----
198 ImGui::Spacing(); 313 ImGui::Spacing();
199 ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.15f,0.40f,0.15f,1)); 314 ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.15f, 0.40f, 0.15f, 1.0f));
200 ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0.20f,0.55f,0.20f,1)); 315 ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0.20f, 0.55f, 0.20f, 1.0f));
201 if (ImGui::Button(" Send Coins ")) g_showSend = true; 316 if (ImGui::Button(" Send Coins ")) g_showSend = true;
202 ImGui::PopStyleColor(2); 317 ImGui::PopStyleColor(2);
203 318
204 // Mining status indicator 319 ImGui::SameLine(0.0f, 20.0f);
205 ImGui::SameLine(0, 20);
206 if (fGenerateBitcoins) { 320 if (fGenerateBitcoins) {
207 ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f,0.6f,0.0f,1.0f)); 321 ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 0.6f, 0.0f, 1.0f));
208 const char* modeLabel = nMineMode==MINE_OPERATOR ? "Mining (operator)" : 322 const char* modeLabel =
209 nMineMode==MINE_PARTICIPANT ? "Mining (pool)" : "Mining"; 323 nMineMode == MINE_OPERATOR ? "Mining (operator)" :
210 ImGui::Text("⬤ %s", modeLabel); 324 nMineMode == MINE_PARTICIPANT ? "Mining (pool)" :
325 nMineMode == MINE_RELAY ? "Relay" : "Mining";
326 ImGui::Text("* %s", modeLabel);
211 ImGui::PopStyleColor(); 327 ImGui::PopStyleColor();
212 if (nMineMode == MINE_PARTICIPANT) { 328 if (nMineMode == MINE_PARTICIPANT) {
213 std::string mineStatus = GetParticipantMiningStatus(); 329 std::string st = GetParticipantMiningStatus();
214 if (!mineStatus.empty()) { 330 if (!st.empty()) {
215 ImGui::SameLine(0, 12); 331 ImGui::SameLine(0.0f, 12.0f);
216 ImGui::PushStyleColor(ImGuiCol_Text, ParticipantStatusColor(mineStatus)); 332 ImGui::PushStyleColor(ImGuiCol_Text, StatusColor(st));
217 ImGui::Text("[%s]", mineStatus.c_str()); 333 ImGui::Text("[%s]", st.c_str());
218 ImGui::PopStyleColor(); 334 ImGui::PopStyleColor();
219 } 335 }
220 } 336 }
221 } else { 337 } else {
222 ImGui::TextDisabled("○ Not mining"); 338 ImGui::TextDisabled("Not mining");
223 } 339 }
224 340
225 ImGui::Spacing(); 341 ImGui::Spacing();
226 ImGui::Separator(); 342 ImGui::Separator();
227 ImGui::Spacing();
228 343
229 // ---- Live telemetry strip ---- 344 // ---- Telemetry strip (never scrolls) ----
230 { 345 {
231 const char* modeName = nMineMode==MINE_OPERATOR ? "Operator" : 346 ImGui::Spacing();
232 nMineMode==MINE_PARTICIPANT ? "Participant" : "Solo"; 347 const char* modeName =
233 int64 age = g_lastWalletRefresh > 0 ? (GetTime() - g_lastWalletRefresh) : -1; 348 nMineMode == MINE_OPERATOR ? "Operator" :
234 if (age < 0) age = 0; 349 nMineMode == MINE_PARTICIPANT ? "Participant" :
350 nMineMode == MINE_RELAY ? "Relay" : "Solo";
351 int64 age = g_lastWalletRefresh > 0 ? GetTime() - g_lastWalletRefresh : 0;
235 352
236 ImGui::Text("Mode: %s", modeName); 353 ImGui::Text("Mode: %s", modeName);
237 ImGui::SameLine(0, 16); 354 ImGui::SameLine(0.0f, 16.0f);
238 ImGui::Text("Wallet refresh: %llds ago", (long long)age); 355 ImGui::TextDisabled("Wallet refreshed %llds ago", (long long)age);
239 356
240 if (nMineMode == MINE_PARTICIPANT) { 357 if (nMineMode == MINE_PARTICIPANT) {
241 uint64 sent = 0, accepted = 0; 358 uint64 sent = 0, accepted = 0;
242 double hashRate = 0.0; 359 double hashRate = 0.0;
243 std::string mineStatus = GetParticipantMiningStatus(); 360 std::string st = GetParticipantMiningStatus();
244 GetParticipantMiningStats(sent, accepted, hashRate); 361 GetParticipantMiningStats(sent, accepted, hashRate);
245 if (sent > 0 || accepted > 0 || hashRate > 0.0) { 362 if (sent > 0 || accepted > 0 || hashRate > 0.0) {
246 double acceptPct = sent ? (100.0 * (double)accepted / (double)sent) : 0.0; 363 double pct = sent ? (100.0 * (double)accepted / (double)sent) : 0.0;
247 ImGui::TextDisabled("Your mining: sent %llu, accepted %llu (%.1f%%), %.2f H/s", 364 ImGui::TextDisabled(
248 (unsigned long long)sent, 365 "Sent %llu shares, accepted %llu (%.1f%%), %.2f H/s",
249 (unsigned long long)accepted, 366 (unsigned long long)sent, (unsigned long long)accepted, pct, hashRate);
250 acceptPct, 367 } else if (!st.empty()) {
251 hashRate); 368 ImGui::TextDisabled("Status: %s", st.c_str());
252 } else if (!mineStatus.empty()) {
253 ImGui::TextDisabled("Your mining: %s", mineStatus.c_str());
254 } else { 369 } else {
255 ImGui::TextDisabled("Your mining: asking pool for work"); 370 ImGui::TextDisabled("Waiting for pool work...");
256 } 371 }
257 } else if (nMineMode == MINE_OPERATOR) { 372 } else if (nMineMode == MINE_OPERATOR) {
258 int miners = 0, blocksFound = 0; 373 int miners = 0, blocksFound = 0;
259 uint64 roundShares = 0; 374 uint64 roundShares = 0;
260 GetPoolOperatorStats(miners, blocksFound, roundShares); 375 double totalHashRate = 0.0;
376 GetPoolOperatorStats(miners, blocksFound, roundShares, totalHashRate);
261 if (miners > 0 || blocksFound > 0 || roundShares > 0) 377 if (miners > 0 || blocksFound > 0 || roundShares > 0)
262 ImGui::TextDisabled("Pool runtime: %d authorized miners, %llu round shares, %d blocks found", miners, (unsigned long long)roundShares, blocksFound); 378 ImGui::TextDisabled(
379 "Authorized miners: %d Round shares: %llu Blocks found: %d %.2f H/s",
380 miners, (unsigned long long)roundShares, blocksFound, totalHashRate);
263 else 381 else
264 ImGui::TextDisabled("Pool runtime: waiting for miners"); 382 ImGui::TextDisabled("Pool server running, waiting for miners");
383 } else if (nMineMode == MINE_RELAY) {
384 ImGui::TextDisabled("Relay mode: syncing, not mining");
265 } else { 385 } else {
266 ImGui::TextDisabled("Solo runtime: local wallet mining telemetry"); 386 ImGui::TextDisabled("Solo mining");
267 } 387 }
268 ImGui::Spacing(); 388 ImGui::Spacing();
269 ImGui::Separator(); 389 ImGui::Separator();
270 ImGui::Spacing(); 390 ImGui::Spacing();
271 } 391 }
272 392
393 // ---- Scrollable content child ----
394 // Fills all remaining height in the window (cursor Y to bottom of window).
395 // Content that overflows scrolls; nothing leaks past the window edge.
396 // Size the scrollable child to fill exactly the remaining window height.
397 // GetContentRegionAvail() already accounts for padding/borders.
398 const float availH = ImGui::GetContentRegionAvail().y;
399 ImGui::BeginChild("##scroll", ImVec2(0.0f, availH), false, 0);
400
273 // ---- Transaction list ---- 401 // ---- Transaction list ----
274 float listHeight = io.DisplaySize.y * 0.26f; 402 float txH = io.DisplaySize.y * 0.26f;
275 if (listHeight < 190.0f) listHeight = 190.0f; 403 if (txH < 180.0f) txH = 180.0f;
276 if (listHeight > 260.0f) listHeight = 260.0f; 404 if (txH > 260.0f) txH = 260.0f;
405
277 if (ImGui::BeginTable("txlist", 4, 406 if (ImGui::BeginTable("txlist", 4,
278 ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | 407 ImGuiTableFlags_Borders |
279 ImGuiTableFlags_ScrollY | ImGuiTableFlags_SizingStretchProp, 408 ImGuiTableFlags_RowBg |
280 ImVec2(0, listHeight))) 409 ImGuiTableFlags_ScrollY |
410 ImGuiTableFlags_SizingStretchProp,
411 ImVec2(0.0f, txH)))
281 { 412 {
282 ImGui::TableSetupScrollFreeze(0, 1); 413 ImGui::TableSetupScrollFreeze(0, 1);
283 ImGui::TableSetupColumn("Status", ImGuiTableColumnFlags_WidthFixed, 110); 414 ImGui::TableSetupColumn("Status", ImGuiTableColumnFlags_WidthFixed, 110.0f);
284 ImGui::TableSetupColumn("Date", ImGuiTableColumnFlags_WidthFixed, 130); 415 ImGui::TableSetupColumn("Date", ImGuiTableColumnFlags_WidthFixed, 130.0f);
285 ImGui::TableSetupColumn("Description", ImGuiTableColumnFlags_WidthStretch); 416 ImGui::TableSetupColumn("Description", ImGuiTableColumnFlags_WidthStretch);
286 ImGui::TableSetupColumn("Amount", ImGuiTableColumnFlags_WidthFixed, 140); 417 ImGui::TableSetupColumn("Amount", ImGuiTableColumnFlags_WidthFixed, 140.0f);
287 ImGui::TableHeadersRow(); 418 ImGui::TableHeadersRow();
288 419
289 for (auto& row : g_txRows) { 420 for (auto& row : g_txRows) {
290 ImGui::TableNextRow(); 421 ImGui::TableNextRow();
291 ImGui::TableSetColumnIndex(0); 422 ImGui::TableSetColumnIndex(0);
292 if (row.depth < 1) 423 bool isImmatureCoinbase = (row.desc.find("matures in") != std::string::npos);
293 ImGui::TextColored(ImVec4(1,0.6f,0,1), "Unconfirmed"); 424 bool isOrphaned = (row.desc.find("orphaned") != std::string::npos);
425 if (isOrphaned)
426 ImGui::TextColored(ImVec4(1.0f, 0.3f, 0.3f, 1.0f), "Orphaned");
427 else if (row.depth < 1)
428 ImGui::TextColored(ImVec4(1.0f, 0.6f, 0.0f, 1.0f), "Unconfirmed");
429 else if (isImmatureCoinbase)
430 ImGui::TextColored(ImVec4(1.0f, 0.75f, 0.25f, 1.0f), "Immature");
431 else if (row.depth < 6)
432 ImGui::TextColored(ImVec4(1.0f, 0.85f, 0.3f, 1.0f), "%d confirm%s",
433 row.depth, row.depth == 1 ? "" : "s");
294 else 434 else
295 ImGui::Text("%d blocks deep", row.depth); 435 ImGui::TextColored(ImVec4(0.5f, 0.9f, 0.5f, 1.0f), "Confirmed");
296 ImGui::TableSetColumnIndex(1); 436 ImGui::TableSetColumnIndex(1);
297 ImGui::TextDisabled("%s", row.date.c_str()); 437 ImGui::TextDisabled("%s", row.date.c_str());
298 ImGui::TableSetColumnIndex(2); 438 ImGui::TableSetColumnIndex(2);
299 ImGui::TextUnformatted(row.desc.c_str()); 439 ImGui::TextUnformatted(row.desc.c_str());
300 ImGui::TableSetColumnIndex(3); 440 ImGui::TableSetColumnIndex(3);
301 if (row.amount >= 0) 441 if (row.amount >= 0)
302 ImGui::TextColored(ImVec4(0.35f,1,0.35f,1), "+%s BTF", FmtMoney(row.amount).c_str()); 442 ImGui::TextColored(ImVec4(0.35f, 1.0f, 0.35f, 1.0f),
443 "+%s BTF", FmtMoney(row.amount).c_str());
303 else 444 else
304 ImGui::TextColored(ImVec4(1,0.4f,0.4f,1), "%s BTF", FmtMoney(row.amount).c_str()); 445 ImGui::TextColored(ImVec4(1.0f, 0.4f, 0.4f, 1.0f),
446 "%s BTF", FmtMoney(row.amount).c_str());
305 } 447 }
306 ImGui::EndTable(); 448 ImGui::EndTable();
307 } 449 }
308 450
451 // ---- Mode panels ----
309 std::vector<BtfPoolAnnouncement> pools; 452 std::vector<BtfPoolAnnouncement> pools;
310 BtfGetPoolAnnouncements(pools); 453 BtfGetPoolAnnouncements(pools);
311 454
312 if (nMineMode == MINE_PARTICIPANT) { 455 if (nMineMode == MINE_PARTICIPANT) {
313 ImGui::Spacing(); 456 ImGui::Spacing();
314 ImGui::SeparatorText("Participant Mining"); 457 ImGui::SeparatorText("Participant Mining");
315 ImGui::Text("Selected pool:"); 458
459 ImGui::TextDisabled("Selected pool:");
460 ImGui::SameLine();
316 if (strParticipantPool.empty()) 461 if (strParticipantPool.empty())
317 ImGui::TextDisabled("No pool selected yet"); 462 ImGui::TextDisabled("none");
318 else 463 else
319 ImGui::TextWrapped("%s", strParticipantPool.c_str()); 464 ImGui::TextWrapped("%s", strParticipantPool.c_str());
320 465
321 const BtfPoolAnnouncement* selected = NULL; 466 const BtfPoolAnnouncement* sel = nullptr;
322 for (size_t i = 0; i < pools.size(); i++) 467 for (size_t i = 0; i < pools.size(); i++)
323 if (pools[i].btfAddress == strParticipantPool) { selected = &pools[i]; break; } 468 if (pools[i].btfAddress == strParticipantPool) { sel = &pools[i]; break; }
324 469
325 if (selected) { 470 if (sel) {
326 ImGui::Text("Pool name: %s", selected->poolName.c_str()); 471 ImGui::Text("Pool: %s Fee: %.2f%% Miners: %d Blocks: %d %.2f H/s",
327 ImGui::Text("Fee: %.2f%%", selected->feePercent); 472 sel->poolName.c_str(), sel->feePercent,
328 ImGui::Text("Live stats: %d miners, %d blocks", selected->connectedMiners, selected->blocksFound); 473 sel->connectedMiners, sel->blocksFound, sel->hashRate);
329 if (!selected->dashboardUrl.empty()) 474 if (!sel->dashboardUrl.empty())
330 ImGui::TextWrapped("Dashboard: %s", selected->dashboardUrl.c_str()); 475 ImGui::TextDisabled("Dashboard: %s", sel->dashboardUrl.c_str());
331 } else if (!strParticipantPool.empty()) { 476 } else if (!strParticipantPool.empty()) {
332 ImGui::TextDisabled("No fresh announcement found for this pool yet"); 477 ImGui::TextDisabled("No live announcement for this pool yet.");
333 } 478 }
334 479
335 if (!pools.empty()) { 480 if (!pools.empty()) {
336 ImGui::Spacing(); 481 ImGui::Spacing();
337 ImGui::SeparatorText("Live Pools"); 482 ImGui::SeparatorText("Live Pools");
338 if (ImGui::BeginTable("livepools", 5, 483 if (ImGui::BeginTable("livepools", 5,
339 ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingStretchProp)) 484 ImGuiTableFlags_Borders |
485 ImGuiTableFlags_RowBg |
486 ImGuiTableFlags_SizingStretchProp))
340 { 487 {
341 ImGui::TableSetupColumn("Pool", ImGuiTableColumnFlags_WidthStretch); 488 ImGui::TableSetupColumn("Pool", ImGuiTableColumnFlags_WidthStretch);
342 ImGui::TableSetupColumn("Fee", ImGuiTableColumnFlags_WidthFixed, 70); 489 ImGui::TableSetupColumn("Fee", ImGuiTableColumnFlags_WidthFixed, 60.0f);
343 ImGui::TableSetupColumn("Stats", ImGuiTableColumnFlags_WidthFixed, 160); 490 ImGui::TableSetupColumn("Stats", ImGuiTableColumnFlags_WidthFixed, 150.0f);
344 ImGui::TableSetupColumn("Dashboard", ImGuiTableColumnFlags_WidthStretch); 491 ImGui::TableSetupColumn("Dashboard", ImGuiTableColumnFlags_WidthStretch);
345 ImGui::TableSetupColumn("Use", ImGuiTableColumnFlags_WidthFixed, 60); 492 ImGui::TableSetupColumn("Use", ImGuiTableColumnFlags_WidthFixed, 50.0f);
346 ImGui::TableHeadersRow(); 493 ImGui::TableHeadersRow();
347 for (size_t i = 0; i < pools.size(); i++) { 494 for (size_t i = 0; i < pools.size(); i++) {
348 const BtfPoolAnnouncement& ann = pools[i]; 495 const BtfPoolAnnouncement& ann = pools[i];
@@ -353,15 +500,19 @@ static void DrawMainWindow()
353 ImGui::TableSetColumnIndex(1); 500 ImGui::TableSetColumnIndex(1);
354 ImGui::Text("%.2f%%", ann.feePercent); 501 ImGui::Text("%.2f%%", ann.feePercent);
355 ImGui::TableSetColumnIndex(2); 502 ImGui::TableSetColumnIndex(2);
356 ImGui::Text("%d miners, %d blocks, %s old", ann.connectedMiners, ann.blocksFound, FmtAge(ann.createdAt).c_str()); 503 ImGui::Text("%d miners %d blocks %.2f H/s %s",
504 ann.connectedMiners, ann.blocksFound, ann.hashRate,
505 FmtAge(ann.createdAt).c_str());
357 ImGui::TableSetColumnIndex(3); 506 ImGui::TableSetColumnIndex(3);
358 if (!ann.dashboardUrl.empty()) 507 if (!ann.dashboardUrl.empty())
359 ImGui::TextWrapped("%s", ann.dashboardUrl.c_str()); 508 ImGui::TextWrapped("%s", ann.dashboardUrl.c_str());
360 else 509 else
361 ImGui::TextDisabled("-"); 510 ImGui::TextDisabled("-");
362 ImGui::TableSetColumnIndex(4); 511 ImGui::TableSetColumnIndex(4);
363 if (ImGui::SmallButton((std::string("Use##") + ann.btfAddress).c_str())) { 512 std::string btnId = "Use##" + ann.btfAddress;
364 strncpy(g_participantPool, ann.btfAddress.c_str(), sizeof(g_participantPool)-1); 513 if (ImGui::SmallButton(btnId.c_str())) {
514 strncpy(g_participantPool, ann.btfAddress.c_str(),
515 sizeof(g_participantPool)-1);
365 strParticipantPool = ann.btfAddress; 516 strParticipantPool = ann.btfAddress;
366 CWalletDB().WriteSetting("strParticipantPool", strParticipantPool); 517 CWalletDB().WriteSetting("strParticipantPool", strParticipantPool);
367 g_needRefresh = true; 518 g_needRefresh = true;
@@ -375,55 +526,60 @@ static void DrawMainWindow()
375 if (nMineMode == MINE_OPERATOR) { 526 if (nMineMode == MINE_OPERATOR) {
376 ImGui::Spacing(); 527 ImGui::Spacing();
377 ImGui::SeparatorText("Operator Overview"); 528 ImGui::SeparatorText("Operator Overview");
378 ImGui::Text("Pool .btf address:"); 529
379 std::string opAddr = BtfLocalAddress(); 530 std::string opAddr = BtfLocalAddress();
531 ImGui::TextDisabled("Pool .btf address:");
532 ImGui::SameLine();
380 if (opAddr.empty()) 533 if (opAddr.empty())
381 ImGui::TextDisabled("Identity not ready yet"); 534 ImGui::TextDisabled("identity not ready");
382 else 535 else
383 ImGui::TextWrapped("%s", opAddr.c_str()); 536 ImGui::TextWrapped("%s", opAddr.c_str());
384 537
538 // Pending payouts
385 std::vector<PendingPayoutView> owed; 539 std::vector<PendingPayoutView> owed;
386 GetPendingPayouts(owed); 540 GetPendingPayouts(owed);
387 ImGui::Spacing(); 541 ImGui::Spacing();
388 ImGui::SeparatorText("Pending Pool Payouts (you owe miners)"); 542 ImGui::SeparatorText("Pending Payouts (owed to miners)");
389 if (owed.empty()) { 543 if (owed.empty()) {
390 ImGui::TextDisabled("No pending pool payouts"); 544 ImGui::TextDisabled("No pending payouts");
391 } else if (ImGui::BeginTable("owedpayouts", 4, 545 } else if (ImGui::BeginTable("owedpayouts", 4,
392 ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingStretchProp)) 546 ImGuiTableFlags_Borders |
547 ImGuiTableFlags_RowBg |
548 ImGuiTableFlags_SizingStretchProp))
393 { 549 {
394 ImGui::TableSetupColumn("Matures At", ImGuiTableColumnFlags_WidthFixed, 100); 550 ImGui::TableSetupColumn("Matures At", ImGuiTableColumnFlags_WidthFixed, 90.0f);
395 ImGui::TableSetupColumn("Blocks Left", ImGuiTableColumnFlags_WidthFixed, 90); 551 ImGui::TableSetupColumn("Blocks left", ImGuiTableColumnFlags_WidthFixed, 80.0f);
396 ImGui::TableSetupColumn("Recipients", ImGuiTableColumnFlags_WidthFixed, 90); 552 ImGui::TableSetupColumn("Recipients", ImGuiTableColumnFlags_WidthFixed, 80.0f);
397 ImGui::TableSetupColumn("Total", ImGuiTableColumnFlags_WidthStretch); 553 ImGui::TableSetupColumn("Total", ImGuiTableColumnFlags_WidthStretch);
398 ImGui::TableHeadersRow(); 554 ImGui::TableHeadersRow();
399 for (const PendingPayoutView& row : owed) { 555 for (const PendingPayoutView& row : owed) {
400 int remaining = std::max(0, row.matureAtHeight - nBestHeight); 556 int left = std::max(0, row.matureAtHeight - nBestHeight);
401 ImGui::TableNextRow(); 557 ImGui::TableNextRow();
402 ImGui::TableSetColumnIndex(0); 558 ImGui::TableSetColumnIndex(0); ImGui::Text("%d", row.matureAtHeight);
403 ImGui::Text("%d", row.matureAtHeight); 559 ImGui::TableSetColumnIndex(1); ImGui::Text("%d", left);
404 ImGui::TableSetColumnIndex(1); 560 ImGui::TableSetColumnIndex(2); ImGui::Text("%d", row.recipients);
405 ImGui::Text("%d", remaining); 561 ImGui::TableSetColumnIndex(3); ImGui::Text("%s BTF", FmtMoney(row.totalAmount).c_str());
406 ImGui::TableSetColumnIndex(2);
407 ImGui::Text("%d", row.recipients);
408 ImGui::TableSetColumnIndex(3);
409 ImGui::Text("%s BTF", FmtMoney(row.totalAmount).c_str());
410 } 562 }
411 ImGui::EndTable(); 563 ImGui::EndTable();
412 } 564 }
413 565
566 // Workers
414 std::vector<PoolWorkerStatView> workers; 567 std::vector<PoolWorkerStatView> workers;
415 GetPoolWorkerStats(workers); 568 GetPoolWorkerStats(workers);
416 ImGui::Spacing(); 569 ImGui::Spacing();
417 ImGui::SeparatorText("Current Round Workers"); 570 ImGui::SeparatorText("Current Round Workers");
418 if (workers.empty()) { 571 if (workers.empty()) {
419 ImGui::TextDisabled("No active workers in this round"); 572 ImGui::TextDisabled("No active workers this round");
420 } else if (ImGui::BeginTable("workers", 4, 573 } else if (ImGui::BeginTable("workers", 5,
421 ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingStretchProp)) 574 ImGuiTableFlags_Borders |
575 ImGuiTableFlags_RowBg |
576 ImGuiTableFlags_SizingStretchProp))
422 { 577 {
423 ImGui::TableSetupColumn("Payout Addr", ImGuiTableColumnFlags_WidthStretch); 578 ImGui::TableSetupColumn("Payout Address", ImGuiTableColumnFlags_WidthStretch);
424 ImGui::TableSetupColumn("Worker", ImGuiTableColumnFlags_WidthStretch); 579 ImGui::TableSetupColumn("Worker", ImGuiTableColumnFlags_WidthStretch);
425 ImGui::TableSetupColumn("Round Shares", ImGuiTableColumnFlags_WidthFixed, 90); 580 ImGui::TableSetupColumn("Hashrate", ImGuiTableColumnFlags_WidthFixed, 90.0f);
426 ImGui::TableSetupColumn("Last Seen", ImGuiTableColumnFlags_WidthFixed, 100); 581 ImGui::TableSetupColumn("Round shares", ImGuiTableColumnFlags_WidthFixed, 90.0f);
582 ImGui::TableSetupColumn("Last seen", ImGuiTableColumnFlags_WidthFixed, 90.0f);
427 ImGui::TableHeadersRow(); 583 ImGui::TableHeadersRow();
428 for (const PoolWorkerStatView& row : workers) { 584 for (const PoolWorkerStatView& row : workers) {
429 ImGui::TableNextRow(); 585 ImGui::TableNextRow();
@@ -432,53 +588,19 @@ static void DrawMainWindow()
432 ImGui::TableSetColumnIndex(1); 588 ImGui::TableSetColumnIndex(1);
433 ImGui::TextDisabled("%s", row.worker.empty() ? "worker" : row.worker.c_str()); 589 ImGui::TextDisabled("%s", row.worker.empty() ? "worker" : row.worker.c_str());
434 ImGui::TableSetColumnIndex(2); 590 ImGui::TableSetColumnIndex(2);
435 ImGui::Text("%llu", (unsigned long long)row.roundShares); 591 ImGui::Text("%.2f H/s", row.hashRate);
436 ImGui::TableSetColumnIndex(3); 592 ImGui::TableSetColumnIndex(3);
437 ImGui::TextDisabled("%s", FmtAge(row.lastSeen).c_str()); 593 ImGui::Text("%llu", (unsigned long long)row.roundShares);
594 ImGui::TableSetColumnIndex(4);
595 ImGui::TextDisabled("%s ago", FmtAge(row.lastSeen).c_str());
438 } 596 }
439 ImGui::EndTable(); 597 ImGui::EndTable();
440 } 598 }
441 } 599 }
442 600
443 // ---- Status bar ---- 601 ImGui::EndChild(); // ##scroll
444 {
445 ImGui::Spacing();
446 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(4,2));
447
448 int peers = (int)vNodes.size();
449 if (nMineMode == MINE_PARTICIPANT) {
450 uint64 sent = 0, accepted = 0;
451 double hashRate = 0.0;
452 std::string mineStatus = GetParticipantMiningStatus();
453 GetParticipantMiningStats(sent, accepted, hashRate);
454 if (sent > 0 || accepted > 0 || hashRate > 0.0)
455 ImGui::TextDisabled("Peers %d height %d shares sent %llu accepted %llu hash rate %.2f H/s",
456 peers,
457 nBestHeight,
458 (unsigned long long)sent,
459 (unsigned long long)accepted,
460 hashRate);
461 else if (!mineStatus.empty())
462 ImGui::TextDisabled("Peers %d height %d %s", peers, nBestHeight, mineStatus.c_str());
463 else
464 ImGui::TextDisabled("Peers %d height %d asking pool for work", peers, nBestHeight);
465 } else if (nMineMode == MINE_OPERATOR) {
466 int miners = 0, blocksFound = 0;
467 uint64 roundShares = 0;
468 GetPoolOperatorStats(miners, blocksFound, roundShares);
469 if (miners > 0 || blocksFound > 0 || roundShares > 0)
470 ImGui::TextDisabled("Peers %d height %d authorized miners %d round shares %llu blocks found %d",
471 peers, nBestHeight, miners, (unsigned long long)roundShares, blocksFound);
472 else
473 ImGui::TextDisabled("Peers %d height %d waiting for miners", peers, nBestHeight);
474 } else {
475 ImGui::TextDisabled("Peers %d height %d", peers, nBestHeight);
476 }
477 ImGui::PopStyleVar();
478 }
479
480 ImGui::SetWindowFontScale(1.0f); 602 ImGui::SetWindowFontScale(1.0f);
481 ImGui::End(); 603 ImGui::End(); // ##main
482} 604}
483 605
484// --------------------------------------------------------------------------- 606// ---------------------------------------------------------------------------
@@ -487,42 +609,53 @@ static void DrawMainWindow()
487static void DrawSendDialog() 609static void DrawSendDialog()
488{ 610{
489 if (!g_showSend) return; 611 if (!g_showSend) return;
490 ImGui::SetNextWindowSize(ImVec2(500, 180), ImGuiCond_Always); 612 ImGui::SetNextWindowSize(ImVec2(500.0f, 180.0f), ImGuiCond_Always);
491 ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(), ImGuiCond_Always, ImVec2(.5f,.5f)); 613 ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(),
614 ImGuiCond_Always, ImVec2(0.5f, 0.5f));
492 if (ImGui::Begin("Send Coins", &g_showSend, 615 if (ImGui::Begin("Send Coins", &g_showSend,
493 ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse)) 616 ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse))
494 { 617 {
495 ImGui::Text("Recipient address:"); 618 ImGui::Text("Recipient address:");
496 ImGui::SetNextItemWidth(-1); 619 ImGui::SetNextItemWidth(-1.0f);
497 ImGui::InputText("##sa", g_sendAddr, sizeof(g_sendAddr)); 620 ImGui::InputText("##sa", g_sendAddr, sizeof(g_sendAddr));
498 621
499 ImGui::Text("Amount (BTF):"); 622 ImGui::Text("Amount (BTF):");
500 ImGui::SetNextItemWidth(180); 623 ImGui::SetNextItemWidth(180.0f);
501 ImGui::InputText("##sm", g_sendAmount, sizeof(g_sendAmount)); 624 ImGui::InputText("##sm", g_sendAmount, sizeof(g_sendAmount));
502 625
503 if (!g_sendStatus.empty()) { 626 if (!g_sendStatus.empty()) {
504 ImGui::Spacing(); 627 ImGui::Spacing();
505 ImGui::TextColored(ImVec4(1,.4f,.4f,1), "%s", g_sendStatus.c_str()); 628 ImGui::TextColored(ImVec4(1.0f, 0.4f, 0.4f, 1.0f),
629 "%s", g_sendStatus.c_str());
506 } 630 }
507 631
508 ImGui::Spacing(); ImGui::Separator(); ImGui::Spacing(); 632 ImGui::Spacing(); ImGui::Separator(); ImGui::Spacing();
509 if (ImGui::Button("Send", ImVec2(90,0))) { 633 if (ImGui::Button("Send", ImVec2(90.0f, 0.0f))) {
510 uint160 h; int64 nv = 0; 634 uint160 h; int64 nv = 0;
511 if (!AddressToHash160(g_sendAddr, h)) g_sendStatus = "Invalid address."; 635 if (!AddressToHash160(g_sendAddr, h))
512 else if (!ParseMoney(g_sendAmount,nv)||nv<=0) g_sendStatus = "Invalid amount."; 636 g_sendStatus = "Invalid address.";
637 else if (!ParseMoney(g_sendAmount, nv) || nv <= 0)
638 g_sendStatus = "Invalid amount.";
513 else { 639 else {
514 CScript s; s << OP_DUP << OP_HASH160 << h << OP_EQUALVERIFY << OP_CHECKSIG; 640 CScript sc;
641 sc << OP_DUP << OP_HASH160 << h << OP_EQUALVERIFY << OP_CHECKSIG;
515 CWalletTx wtx; 642 CWalletTx wtx;
516 if (SendMoney(s, nv, wtx)) { 643 if (SendMoney(sc, nv, wtx)) {
517 g_showSend=false; g_sendStatus=""; 644 g_showSend = false;
518 memset(g_sendAddr,0,sizeof(g_sendAddr)); 645 g_sendStatus = "";
519 memset(g_sendAmount,0,sizeof(g_sendAmount)); 646 memset(g_sendAddr, 0, sizeof(g_sendAddr));
647 memset(g_sendAmount, 0, sizeof(g_sendAmount));
520 g_needRefresh = true; 648 g_needRefresh = true;
521 } else g_sendStatus = "Transaction failed."; 649 } else {
650 g_sendStatus = "Transaction failed.";
651 }
522 } 652 }
523 } 653 }
524 ImGui::SameLine(); 654 ImGui::SameLine();
525 if (ImGui::Button("Cancel", ImVec2(90,0))) { g_showSend=false; g_sendStatus=""; } 655 if (ImGui::Button("Cancel", ImVec2(90.0f, 0.0f))) {
656 g_showSend = false;
657 g_sendStatus = "";
658 }
526 } 659 }
527 ImGui::End(); 660 ImGui::End();
528} 661}
@@ -534,7 +667,6 @@ static void DrawOptionsDialog()
534{ 667{
535 if (!g_showOptions) return; 668 if (!g_showOptions) return;
536 669
537 // Always sync from current globals when dialog opens
538 static bool wasOpen = false; 670 static bool wasOpen = false;
539 if (!wasOpen) { 671 if (!wasOpen) {
540 g_mineRadio = nMineMode; 672 g_mineRadio = nMineMode;
@@ -544,42 +676,46 @@ static void DrawOptionsDialog()
544 strncpy(g_poolDash, strPoolDashboardUrl.c_str(), sizeof(g_poolDash)-1); 676 strncpy(g_poolDash, strPoolDashboardUrl.c_str(), sizeof(g_poolDash)-1);
545 } 677 }
546 wasOpen = true; 678 wasOpen = true;
547 ImGui::SetNextWindowSize(ImVec2(500, 310), ImGuiCond_Always); 679
548 ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(), ImGuiCond_Always, ImVec2(.5f,.5f)); 680 ImGui::SetNextWindowSize(ImVec2(500.0f, 335.0f), ImGuiCond_Always);
681 ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(),
682 ImGuiCond_Always, ImVec2(0.5f, 0.5f));
549 if (ImGui::Begin("Options", &g_showOptions, 683 if (ImGui::Begin("Options", &g_showOptions,
550 ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse)) 684 ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse))
551 { 685 {
552 // Transaction fee 686 // Transaction fee
553 ImGui::SeparatorText("Transaction Fee"); 687 ImGui::SeparatorText("Transaction Fee");
554 static char feeStr[32] = {}; 688 static char feeStr[32] = {};
555 if (feeStr[0]=='\0') snprintf(feeStr,sizeof(feeStr),"%s",FmtMoney(nTransactionFee).c_str()); 689 if (feeStr[0] == '\0')
556 ImGui::SetNextItemWidth(180); 690 snprintf(feeStr, sizeof(feeStr), "%s", FmtMoney(nTransactionFee).c_str());
691 ImGui::SetNextItemWidth(180.0f);
557 ImGui::InputText("BTF per transaction##fee", feeStr, sizeof(feeStr)); 692 ImGui::InputText("BTF per transaction##fee", feeStr, sizeof(feeStr));
558 693
559 // Mining 694 // Mining mode
560 ImGui::SeparatorText("Mining Mode"); 695 ImGui::SeparatorText("Mining Mode");
561 ImGui::RadioButton("Solo — rewards go to your wallet", &g_mineRadio, MINE_SOLO); 696 ImGui::RadioButton("Relay -- just run the node, don't mine", &g_mineRadio, MINE_RELAY);
562 ImGui::RadioButton("Operator — run a pool for other miners", &g_mineRadio, MINE_OPERATOR); 697 ImGui::RadioButton("Solo -- rewards go to your wallet", &g_mineRadio, MINE_SOLO);
563 ImGui::RadioButton("Participant — mine to someone's pool", &g_mineRadio, MINE_PARTICIPANT); 698 ImGui::RadioButton("Operator -- run a pool for other miners", &g_mineRadio, MINE_OPERATOR);
699 ImGui::RadioButton("Participant -- mine to someone's pool", &g_mineRadio, MINE_PARTICIPANT);
564 700
565 if (g_mineRadio == MINE_OPERATOR) { 701 if (g_mineRadio == MINE_OPERATOR) {
566 ImGui::Spacing(); 702 ImGui::Spacing();
567 ImGui::SeparatorText("Pool Announcement"); 703 ImGui::SeparatorText("Pool Announcement");
568 ImGui::Text("Pool name:"); 704 ImGui::Text("Pool name:");
569 ImGui::SetNextItemWidth(-1); 705 ImGui::SetNextItemWidth(-1.0f);
570 ImGui::InputText("##poolname", g_poolName, sizeof(g_poolName)); 706 ImGui::InputText("##poolname", g_poolName, sizeof(g_poolName));
571 ImGui::Text("Fee %%:"); 707 ImGui::Text("Fee %%:");
572 ImGui::SetNextItemWidth(120); 708 ImGui::SetNextItemWidth(120.0f);
573 ImGui::InputText("##poolfee", g_poolFee, sizeof(g_poolFee)); 709 ImGui::InputText("##poolfee", g_poolFee, sizeof(g_poolFee));
574 ImGui::Text("Dashboard URL:"); 710 ImGui::Text("Dashboard URL:");
575 ImGui::SetNextItemWidth(-1); 711 ImGui::SetNextItemWidth(-1.0f);
576 ImGui::InputText("##pooldash", g_poolDash, sizeof(g_poolDash)); 712 ImGui::InputText("##pooldash", g_poolDash, sizeof(g_poolDash));
577 } 713 }
578 714
579 if (g_mineRadio == MINE_PARTICIPANT) { 715 if (g_mineRadio == MINE_PARTICIPANT) {
580 ImGui::Spacing(); 716 ImGui::Spacing();
581 ImGui::SeparatorText("Pool Selection"); 717 ImGui::SeparatorText("Pool Selection");
582 ImGui::TextDisabled("Pick from live discovered pools. Manual entry is disabled here."); 718 ImGui::TextDisabled("Pick from live discovered pools.");
583 719
584 std::vector<BtfPoolAnnouncement> pools; 720 std::vector<BtfPoolAnnouncement> pools;
585 BtfGetPoolAnnouncements(pools); 721 BtfGetPoolAnnouncements(pools);
@@ -591,46 +727,49 @@ static void DrawOptionsDialog()
591 break; 727 break;
592 } 728 }
593 } 729 }
594 if (ImGui::BeginCombo("Discovered pools", current.c_str())) { 730 if (ImGui::BeginCombo("Discovered pools##combo", current.c_str())) {
595 for (size_t i = 0; i < pools.size(); i++) { 731 for (size_t i = 0; i < pools.size(); i++) {
596 const BtfPoolAnnouncement& ann = pools[i]; 732 const BtfPoolAnnouncement& ann = pools[i];
597 std::string label = PoolLabel(ann); 733 bool selected = (ann.btfAddress == g_participantPool);
598 bool selected = ann.btfAddress == g_participantPool; 734 if (ImGui::Selectable(PoolLabel(ann).c_str(), selected))
599 if (ImGui::Selectable(label.c_str(), selected)) { 735 strncpy(g_participantPool, ann.btfAddress.c_str(),
600 strncpy(g_participantPool, ann.btfAddress.c_str(), sizeof(g_participantPool)-1); 736 sizeof(g_participantPool)-1);
601 }
602 } 737 }
603 ImGui::EndCombo(); 738 ImGui::EndCombo();
604 } 739 }
605 } else { 740 } else {
606 ImGui::TextDisabled("No live pools discovered yet"); 741 ImGui::TextDisabled("No live pools discovered yet.");
607 } 742 }
608 } 743 }
609 744
610 ImGui::Spacing();
611 const char* genLabel = fGenerateBitcoins ? "Stop Mining" : "Start Mining";
612 if (ImGui::Button(genLabel, ImVec2(130,0))) {
613 fGenerateBitcoins = fGenerateBitcoins ? 0 : 1;
614 if (fGenerateBitcoins) _beginthread(ThreadBitcoinMiner, 0, NULL);
615 CWalletDB().WriteSetting("fGenerateBitcoins", fGenerateBitcoins);
616 }
617
618 ImGui::Spacing(); ImGui::Separator(); ImGui::Spacing(); 745 ImGui::Spacing(); ImGui::Separator(); ImGui::Spacing();
619 if (ImGui::Button("OK", ImVec2(90,0))) { 746 if (ImGui::Button("OK", ImVec2(90.0f, 0.0f))) {
620 int64 fee=0; 747 int64 fee = 0;
621 if (ParseMoney(feeStr,fee)) { nTransactionFee=fee; CWalletDB().WriteSetting("nTransactionFee",nTransactionFee); } 748 if (ParseMoney(feeStr, fee)) {
622 749 nTransactionFee = fee;
623 bool changed = (g_mineRadio != nMineMode); 750 CWalletDB().WriteSetting("nTransactionFee", nTransactionFee);
624 nMineMode = g_mineRadio; 751 }
625 strParticipantPool = g_participantPool; 752
626 strPoolName = g_poolName[0] ? g_poolName : "Bitflash Pool"; 753 bool poolChanged =
627 strPoolDashboardUrl = g_poolDash; 754 nMineMode != g_mineRadio ||
628 dPoolFeePercent = atof(g_poolFee); 755 strPoolName != (g_poolName[0] ? g_poolName : "Bitflash Pool") ||
629 CWalletDB().WriteSetting("nMineMode", nMineMode); 756 strPoolDashboardUrl != g_poolDash ||
630 CWalletDB().WriteSetting("strParticipantPool", strParticipantPool); 757 dPoolFeePercent != atof(g_poolFee);
631 CWalletDB().WriteSetting("strPoolName", strPoolName); 758
632 CWalletDB().WriteSetting("strPoolDashboardUrl", strPoolDashboardUrl); 759 nMineMode = g_mineRadio;
633 CWalletDB().WriteSetting("dPoolFeePercent", dPoolFeePercent); 760 strParticipantPool = g_participantPool;
761 strPoolName = g_poolName[0] ? g_poolName : "Bitflash Pool";
762 strPoolDashboardUrl = g_poolDash;
763 dPoolFeePercent = atof(g_poolFee);
764
765 if (nMineMode == MINE_OPERATOR && poolChanged) gAnnounceNow = true;
766
767 if (nMineMode == MINE_RELAY) {
768 fGenerateBitcoins = 0;
769 } else {
770 fGenerateBitcoins = 1;
771 if (!vfThreadRunning[3]) _beginthread(ThreadBitcoinMiner, 0, NULL);
772 }
634 773
635 if (nMineMode == MINE_OPERATOR) { 774 if (nMineMode == MINE_OPERATOR) {
636 if (!gPoolServerRunning) { 775 if (!gPoolServerRunning) {
@@ -645,7 +784,7 @@ static void DrawOptionsDialog()
645 g_showOptions = false; 784 g_showOptions = false;
646 } 785 }
647 ImGui::SameLine(); 786 ImGui::SameLine();
648 if (ImGui::Button("Cancel", ImVec2(90,0))) g_showOptions = false; 787 if (ImGui::Button("Cancel", ImVec2(90.0f, 0.0f))) g_showOptions = false;
649 } 788 }
650 if (!g_showOptions) wasOpen = false; 789 if (!g_showOptions) wasOpen = false;
651 ImGui::End(); 790 ImGui::End();
@@ -657,18 +796,21 @@ static void DrawOptionsDialog()
657static void DrawAboutDialog() 796static void DrawAboutDialog()
658{ 797{
659 if (!g_showAbout) return; 798 if (!g_showAbout) return;
660 ImGui::SetNextWindowSize(ImVec2(380, 170), ImGuiCond_Always); 799 ImGui::SetNextWindowSize(ImVec2(380.0f, 170.0f), ImGuiCond_Always);
661 ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(), ImGuiCond_Always, ImVec2(.5f,.5f)); 800 ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(),
801 ImGuiCond_Always, ImVec2(0.5f, 0.5f));
662 if (ImGui::Begin("About Bitflash", &g_showAbout, 802 if (ImGui::Begin("About Bitflash", &g_showAbout,
663 ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse)) 803 ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse))
664 { 804 {
665 ImGui::TextColored(ImVec4(1,.6f,0,1), "Bitflash BTF v1.1.0"); 805 ImGui::TextColored(ImVec4(1.0f, 0.6f, 0.0f, 1.0f), "Bitflash BTF v1.1.0");
666 ImGui::Spacing(); 806 ImGui::Spacing();
667 ImGui::TextWrapped("CPU-only cryptocurrency. RandomX proof of work. Anonymous .btf addressing over Nostr. No premine."); 807 ImGui::TextWrapped(
808 "CPU-only cryptocurrency. RandomX proof of work. "
809 "Anonymous .btf addressing over Nostr. No premine.");
668 ImGui::Spacing(); 810 ImGui::Spacing();
669 ImGui::TextDisabled("Based on Bitcoin 0.1.0 (Satoshi Nakamoto, 2009)"); 811 ImGui::TextDisabled("Based on Bitcoin 0.1.0 (Satoshi Nakamoto, 2009)");
670 ImGui::Spacing(); 812 ImGui::Spacing();
671 if (ImGui::Button("OK", ImVec2(90,0))) g_showAbout = false; 813 if (ImGui::Button("OK", ImVec2(90.0f, 0.0f))) g_showAbout = false;
672 } 814 }
673 ImGui::End(); 815 ImGui::End();
674} 816}
@@ -705,34 +847,33 @@ int RunGUI(int argc, char* argv[])
705 ImGuiIO& io = ImGui::GetIO(); 847 ImGuiIO& io = ImGui::GetIO();
706 io.IniFilename = nullptr; 848 io.IniFilename = nullptr;
707 849
708 // Load Roboto at 16px — clean, readable on all platforms
709 io.Fonts->AddFontFromMemoryCompressedTTF( 850 io.Fonts->AddFontFromMemoryCompressedTTF(
710 RobotoMedium_compressed_data, RobotoMedium_compressed_size, 16.0f); 851 RobotoMedium_compressed_data, RobotoMedium_compressed_size, 14.0f);
711 852
712 ImGui::StyleColorsDark(); 853 ImGui::StyleColorsDark();
713 ImGuiStyle& s = ImGui::GetStyle(); 854 ImGuiStyle& st = ImGui::GetStyle();
714 s.WindowRounding = s.FrameRounding = s.PopupRounding = 4.0f; 855 st.WindowRounding = st.FrameRounding = st.PopupRounding = 4.0f;
715 s.ItemSpacing = ImVec2(10, 7); 856 st.ItemSpacing = ImVec2(10.0f, 7.0f);
716 s.FramePadding = ImVec2(8, 5); 857 st.FramePadding = ImVec2(8.0f, 5.0f);
717 s.WindowPadding = ImVec2(12, 12); 858 st.WindowPadding = ImVec2(12.0f, 12.0f);
718 // Orange accent 859 // Orange accent
719 s.Colors[ImGuiCol_TitleBgActive] = ImVec4(.80f,.45f,.00f,1); 860 st.Colors[ImGuiCol_TitleBgActive] = ImVec4(.80f, .45f, .00f, 1.0f);
720 s.Colors[ImGuiCol_CheckMark] = ImVec4(1.0f,.60f,.00f,1); 861 st.Colors[ImGuiCol_CheckMark] = ImVec4(1.0f, .60f, .00f, 1.0f);
721 s.Colors[ImGuiCol_SliderGrab] = ImVec4(.80f,.45f,.00f,1); 862 st.Colors[ImGuiCol_SliderGrab] = ImVec4(.80f, .45f, .00f, 1.0f);
722 s.Colors[ImGuiCol_Button] = ImVec4(.25f,.25f,.25f,1); 863 st.Colors[ImGuiCol_Button] = ImVec4(.25f, .25f, .25f, 1.0f);
723 s.Colors[ImGuiCol_ButtonHovered] = ImVec4(.80f,.45f,.00f,1); 864 st.Colors[ImGuiCol_ButtonHovered] = ImVec4(.80f, .45f, .00f, 1.0f);
724 s.Colors[ImGuiCol_ButtonActive] = ImVec4(.60f,.30f,.00f,1); 865 st.Colors[ImGuiCol_ButtonActive] = ImVec4(.60f, .30f, .00f, 1.0f);
725 s.Colors[ImGuiCol_Header] = ImVec4(.80f,.45f,.00f,.40f); 866 st.Colors[ImGuiCol_Header] = ImVec4(.80f, .45f, .00f, .40f);
726 s.Colors[ImGuiCol_HeaderHovered] = ImVec4(.80f,.45f,.20f,.80f); 867 st.Colors[ImGuiCol_HeaderHovered] = ImVec4(.80f, .45f, .20f, .80f);
727 s.Colors[ImGuiCol_Tab] = ImVec4(.20f,.20f,.20f,1); 868 st.Colors[ImGuiCol_Tab] = ImVec4(.20f, .20f, .20f, 1.0f);
728 s.Colors[ImGuiCol_TabHovered] = ImVec4(.80f,.45f,.00f,1); 869 st.Colors[ImGuiCol_TabHovered] = ImVec4(.80f, .45f, .00f, 1.0f);
729 s.Colors[ImGuiCol_TabActive] = ImVec4(.80f,.45f,.00f,1); 870 st.Colors[ImGuiCol_TabActive] = ImVec4(.80f, .45f, .00f, 1.0f);
730 s.Colors[ImGuiCol_SeparatorHovered]=ImVec4(.80f,.45f,.00f,1); 871 st.Colors[ImGuiCol_SeparatorHovered]= ImVec4(.80f, .45f, .00f, 1.0f);
731 s.Colors[ImGuiCol_FrameBg] = ImVec4(.14f,.14f,.14f,1); 872 st.Colors[ImGuiCol_FrameBg] = ImVec4(.14f, .14f, .14f, 1.0f);
732 s.Colors[ImGuiCol_FrameBgHovered] = ImVec4(.20f,.20f,.20f,1); 873 st.Colors[ImGuiCol_FrameBgHovered] = ImVec4(.20f, .20f, .20f, 1.0f);
733 s.Colors[ImGuiCol_TableHeaderBg] = ImVec4(.18f,.18f,.18f,1); 874 st.Colors[ImGuiCol_TableHeaderBg] = ImVec4(.18f, .18f, .18f, 1.0f);
734 s.Colors[ImGuiCol_TableRowBg] = ImVec4(.11f,.11f,.11f,1); 875 st.Colors[ImGuiCol_TableRowBg] = ImVec4(.11f, .11f, .11f, 1.0f);
735 s.Colors[ImGuiCol_TableRowBgAlt] = ImVec4(.14f,.14f,.14f,1); 876 st.Colors[ImGuiCol_TableRowBgAlt] = ImVec4(.14f, .14f, .14f, 1.0f);
736 877
737 ImGui_ImplGlfw_InitForOpenGL(window, true); 878 ImGui_ImplGlfw_InitForOpenGL(window, true);
738 ImGui_ImplOpenGL3_Init("#version 330"); 879 ImGui_ImplOpenGL3_Init("#version 330");
@@ -744,22 +885,28 @@ int RunGUI(int argc, char* argv[])
744 while (!glfwWindowShouldClose(window) && !fShutdown) 885 while (!glfwWindowShouldClose(window) && !fShutdown)
745 { 886 {
746 glfwPollEvents(); 887 glfwPollEvents();
747 if (g_needRefresh || (frame % 120 == 0)) { RefreshWallet(); g_needRefresh = false; } 888 if (g_needRefresh || (frame % 120 == 0)) {
889 RefreshWallet();
890 g_needRefresh = false;
891 }
748 frame++; 892 frame++;
749 893
750 ImGui_ImplOpenGL3_NewFrame(); 894 ImGui_ImplOpenGL3_NewFrame();
751 ImGui_ImplGlfw_NewFrame(); 895 ImGui_ImplGlfw_NewFrame();
752 ImGui::NewFrame(); 896 ImGui::NewFrame();
753 897
898 // Draw order matters: status bar last so it is always on top.
754 DrawMainWindow(); 899 DrawMainWindow();
755 DrawSendDialog(); 900 DrawSendDialog();
756 DrawOptionsDialog(); 901 DrawOptionsDialog();
757 DrawAboutDialog(); 902 DrawAboutDialog();
903 DrawStatusBar();
758 904
759 ImGui::Render(); 905 ImGui::Render();
760 int w, h; glfwGetFramebufferSize(window, &w, &h); 906 int w, h;
907 glfwGetFramebufferSize(window, &w, &h);
761 glViewport(0, 0, w, h); 908 glViewport(0, 0, w, h);
762 glClearColor(.08f,.08f,.08f,1); 909 glClearColor(.08f, .08f, .08f, 1.0f);
763 glClear(GL_COLOR_BUFFER_BIT); 910 glClear(GL_COLOR_BUFFER_BIT);
764 ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); 911 ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
765 glfwSwapBuffers(window); 912 glfwSwapBuffers(window);
diff --git a/src/headers.h b/src/headers.h
index bb252c7..367e9b0 100644
--- a/src/headers.h
+++ b/src/headers.h
@@ -1,4 +1,4 @@
1// Bitflash — main include file. 1// Bitflash -- main include file.
2// Includes core node headers. GUI is handled separately in gui.cpp. 2// Includes core node headers. GUI is handled separately in gui.cpp.
3#pragma once 3#pragma once
4#include "headers_core.h" 4#include "headers_core.h"
diff --git a/src/headers_core.h b/src/headers_core.h
index 089b67f..6c0c602 100644
--- a/src/headers_core.h
+++ b/src/headers_core.h
@@ -1,4 +1,4 @@
1// Core node headers — no GUI framework dependency. 1// Core node headers -- no GUI framework dependency.
2// Included by gui.cpp and all non-GUI source files. 2// Included by gui.cpp and all non-GUI source files.
3 3
4#ifdef _MSC_VER 4#ifdef _MSC_VER
@@ -63,12 +63,11 @@ inline typename std::common_type<T1,T2>::type max(const T1& a, const T2& b)
63#include "script.h" 63#include "script.h"
64#include "db.h" 64#include "db.h"
65#include "net.h" 65#include "net.h"
66#include "irc.h"
67#include "nostr.h" 66#include "nostr.h"
68#include "randomx_pow.h" 67#include "randomx_pow.h"
69#include "main.h" 68#include "main.h"
70#include "market.h" 69#include "market.h"
71 70
72// GUI callback — implemented in gui.cpp (or as no-op in headless builds) 71// GUI callback -- implemented in gui.cpp (or as no-op in headless builds)
73void MainFrameRepaint(); 72void MainFrameRepaint();
74string DateTimeStr(int64 nTime); 73string DateTimeStr(int64 nTime);
diff --git a/src/irc.cpp b/src/irc.cpp
deleted file mode 100644
index ff82c66..0000000
--- a/src/irc.cpp
+++ /dev/null
@@ -1,271 +0,0 @@
1// Copyright (c) 2009 Satoshi Nakamoto
2// Distributed under the MIT/X11 software license, see the accompanying
3// file license.txt or http://www.opensource.org/licenses/mit-license.php.
4
5#include "headers.h"
6
7
8
9
10#pragma pack(1)
11struct ircaddr
12{
13 int ip;
14 short port;
15};
16
17string EncodeAddress(const CAddress& addr)
18{
19 struct ircaddr tmp;
20 tmp.ip = addr.ip;
21 tmp.port = addr.port;
22
23 vector<unsigned char> vch(UBEGIN(tmp), UEND(tmp));
24 return string("u") + EncodeBase58Check(vch);
25}
26
27bool DecodeAddress(string str, CAddress& addr)
28{
29 vector<unsigned char> vch;
30 if (!DecodeBase58Check(str.substr(1), vch))
31 return false;
32
33 struct ircaddr tmp;
34 if (vch.size() != sizeof(tmp))
35 return false;
36 memcpy(&tmp, &vch[0], sizeof(tmp));
37
38 addr = CAddress(tmp.ip, tmp.port);
39 return true;
40}
41
42
43
44
45
46
47static bool Send(SOCKET hSocket, const char* pszSend)
48{
49 if (strstr(pszSend, "PONG") != pszSend)
50 printf("SENDING: %s\n", pszSend);
51 const char* psz = pszSend;
52 const char* pszEnd = psz + strlen(psz);
53 while (psz < pszEnd)
54 {
55 int ret = send(hSocket, psz, pszEnd - psz, 0);
56 if (ret < 0)
57 return false;
58 psz += ret;
59 }
60 return true;
61}
62
63bool RecvLine(SOCKET hSocket, string& strLine)
64{
65 strLine = "";
66 loop
67 {
68 char c;
69 int nBytes = recv(hSocket, &c, 1, 0);
70 if (nBytes > 0)
71 {
72 if (c == '\n')
73 continue;
74 if (c == '\r')
75 return true;
76 strLine += c;
77 }
78 else if (nBytes <= 0)
79 {
80 if (!strLine.empty())
81 return true;
82 // socket closed
83 printf("IRC socket closed\n");
84 return false;
85 }
86 else
87 {
88 // socket error
89 int nErr = WSAGetLastError();
90 if (nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS)
91 {
92 printf("IRC recv failed: %d\n", nErr);
93 return false;
94 }
95 }
96 }
97}
98
99bool RecvLineIRC(SOCKET hSocket, string& strLine)
100{
101 loop
102 {
103 bool fRet = RecvLine(hSocket, strLine);
104 if (fRet)
105 {
106 if (fShutdown)
107 return false;
108 vector<string> vWords;
109 ParseString(strLine, ' ', vWords);
110 if (vWords[0] == "PING")
111 {
112 strLine[1] = 'O';
113 strLine += '\r';
114 Send(hSocket, strLine.c_str());
115 continue;
116 }
117 }
118 return fRet;
119 }
120}
121
122bool RecvUntil(SOCKET hSocket, const char* psz1, const char* psz2=NULL, const char* psz3=NULL)
123{
124 loop
125 {
126 string strLine;
127 if (!RecvLineIRC(hSocket, strLine))
128 return false;
129 printf("IRC %s\n", strLine.c_str());
130 if (psz1 && strLine.find(psz1) != -1)
131 return true;
132 if (psz2 && strLine.find(psz2) != -1)
133 return true;
134 if (psz3 && strLine.find(psz3) != -1)
135 return true;
136 }
137}
138
139
140
141
142bool fRestartIRCSeed = false;
143
144void ThreadIRCSeed(void* parg)
145{
146 // IRC peer discovery disabled: the 2009 IRC network no longer exists (and
147 // what answers today crashes the parser). Replaced by Nostr relay
148 // discovery.
149 printf("ThreadIRCSeed: IRC peer discovery disabled (using Nostr)\n");
150 return;
151
152 loop
153 {
154 struct hostent* phostent = gethostbyname("chat.freenode.net");
155 CAddress addrConnect(*(u_long*)phostent->h_addr_list[0], htons(6667));
156
157 SOCKET hSocket;
158 if (!ConnectSocket(addrConnect, hSocket))
159 {
160 printf("IRC connect failed\n");
161 return;
162 }
163
164 if (!RecvUntil(hSocket, "Found your hostname", "using your IP address instead", "Couldn't look up your hostname"))
165 {
166 closesocket(hSocket);
167 return;
168 }
169
170 string strMyName = EncodeAddress(addrLocalHost);
171
172 if (!addrLocalHost.IsRoutable())
173 strMyName = strprintf("x%u", GetRand(1000000000));
174
175 Send(hSocket, strprintf("NICK %s\r", strMyName.c_str()).c_str());
176 Send(hSocket, strprintf("USER %s 8 * : %s\r", strMyName.c_str(), strMyName.c_str()).c_str());
177
178 if (!RecvUntil(hSocket, " 004 "))
179 {
180 closesocket(hSocket);
181 return;
182 }
183 Sleep(500);
184
185 Send(hSocket, "JOIN #bitcoin\r");
186 Send(hSocket, "WHO #bitcoin\r");
187
188 while (!fRestartIRCSeed)
189 {
190 string strLine;
191 if (fShutdown || !RecvLineIRC(hSocket, strLine))
192 {
193 closesocket(hSocket);
194 return;
195 }
196 if (strLine.empty() || strLine[0] != ':')
197 continue;
198 printf("IRC %s\n", strLine.c_str());
199
200 vector<string> vWords;
201 ParseString(strLine, ' ', vWords);
202 if (vWords.size() < 2)
203 continue;
204
205 char pszName[10000];
206 pszName[0] = '\0';
207
208 if (vWords[1] == "352" && vWords.size() >= 8)
209 {
210 // index 7 is limited to 16 characters
211 // could get full length name at index 10, but would be different from join messages
212 strcpy(pszName, vWords[7].c_str());
213 printf("GOT WHO: [%s] ", pszName);
214 }
215
216 if (vWords[1] == "JOIN")
217 {
218 // :username!username@50000007.F000000B.90000002.IP JOIN :#channelname
219 strcpy(pszName, vWords[0].c_str() + 1);
220 if (strchr(pszName, '!'))
221 *strchr(pszName, '!') = '\0';
222 printf("GOT JOIN: [%s] ", pszName);
223 }
224
225 if (pszName[0] == 'u')
226 {
227 CAddress addr;
228 if (DecodeAddress(pszName, addr))
229 {
230 CAddrDB addrdb;
231 if (AddAddress(addrdb, addr))
232 printf("new ");
233 addr.print();
234 }
235 else
236 {
237 printf("decode failed\n");
238 }
239 }
240 }
241
242 fRestartIRCSeed = false;
243 closesocket(hSocket);
244 }
245}
246
247
248
249
250
251
252
253
254
255
256#ifdef TEST
257int main(int argc, char *argv[])
258{
259 WSADATA wsadata;
260 if (WSAStartup(MAKEWORD(2,2), &wsadata) != NO_ERROR)
261 {
262 printf("Error at WSAStartup()\n");
263 return false;
264 }
265
266 ThreadIRCSeed(NULL);
267
268 WSACleanup();
269 return 0;
270}
271#endif
diff --git a/src/irc.h b/src/irc.h
deleted file mode 100644
index 1ae4ffc..0000000
--- a/src/irc.h
+++ /dev/null
@@ -1,7 +0,0 @@
1// Copyright (c) 2009 Satoshi Nakamoto
2// Distributed under the MIT/X11 software license, see the accompanying
3// file license.txt or http://www.opensource.org/licenses/mit-license.php.
4
5extern bool RecvLine(SOCKET hSocket, string& strLine);
6extern void ThreadIRCSeed(void* parg);
7extern bool fRestartIRCSeed;
diff --git a/src/main.cpp b/src/main.cpp
index f3de4d3..aff7bab 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -13,6 +13,7 @@
13#include "sha.h" 13#include "sha.h"
14#include <atomic> 14#include <atomic>
15#include <mutex> 15#include <mutex>
16#include <thread>
16#include "btfaddr.h" 17#include "btfaddr.h"
17#include "btftunnel.h" 18#include "btftunnel.h"
18#ifndef _WIN32 19#ifndef _WIN32
@@ -73,7 +74,7 @@ bool fSoloMineTest = false; // /solomine: mine without requiring a peer (local t
73int fGenerateBitcoins; 74int fGenerateBitcoins;
74int64 nTransactionFee = 0; 75int64 nTransactionFee = 0;
75CAddress addrIncoming; 76CAddress addrIncoming;
76int nMineMode = MINE_SOLO; 77int nMineMode = MINE_RELAY;
77string strParticipantPool; // participant mode: pool .btf address 78string strParticipantPool; // participant mode: pool .btf address
78string strPoolName = "Bitflash Pool"; 79string strPoolName = "Bitflash Pool";
79string strPoolDashboardUrl; 80string strPoolDashboardUrl;
@@ -88,11 +89,10 @@ static std::string gParticipantStatus;
88 89
89void SetParticipantMiningStatus(const std::string& status) 90void SetParticipantMiningStatus(const std::string& status)
90{ 91{
92 // Updates the GUI status string only. Logging is done at each call site
93 // with full context; duplicating it here just adds noise to the log.
91 std::lock_guard<std::mutex> lk(gParticipantStatusMutex); 94 std::lock_guard<std::mutex> lk(gParticipantStatusMutex);
92 if (gParticipantStatus == status)
93 return;
94 gParticipantStatus = status; 95 gParticipantStatus = status;
95 printf("PoolParticipantMiner: status -> %s\n", status.c_str());
96} 96}
97 97
98std::string GetParticipantMiningStatus() 98std::string GetParticipantMiningStatus()
@@ -159,7 +159,7 @@ bool AddToWallet(const CWalletTx& wtxIn)
159 wtx.nTimeReceived = GetAdjustedTime(); 159 wtx.nTimeReceived = GetAdjustedTime();
160 160
161 //// debug print 161 //// debug print
162 printf("AddToWallet %s %s\n", wtxIn.GetHash().ToString().substr(0,6).c_str(), fInsertedNew ? "new" : "update"); 162 if (LogAcceptsCategory("net")) printf("AddToWallet %s %s\n", wtxIn.GetHash().ToString().substr(0,6).c_str(), fInsertedNew ? "new" : "update");
163 163
164 if (!fInsertedNew) 164 if (!fInsertedNew)
165 { 165 {
@@ -372,7 +372,7 @@ int CMerkleTx::SetMerkleBranch(const CBlock* pblock)
372 { 372 {
373 vMerkleBranch.clear(); 373 vMerkleBranch.clear();
374 nIndex = -1; 374 nIndex = -1;
375 printf("ERROR: SetMerkleBranch() : couldn't find tx in block\n"); 375 if (LogAcceptsCategory("net")) printf("ERROR: SetMerkleBranch() : couldn't find tx in block\n");
376 return 0; 376 return 0;
377 } 377 }
378 378
@@ -433,7 +433,7 @@ void CWalletTx::AddSupportingTransactions(CTxDB& txdb)
433 } 433 }
434 else 434 else
435 { 435 {
436 printf("ERROR: AddSupportingTransactions() : unsupported transaction\n"); 436 if (LogAcceptsCategory("net")) printf("ERROR: AddSupportingTransactions() : unsupported transaction\n");
437 continue; 437 continue;
438 } 438 }
439 439
@@ -519,7 +519,7 @@ bool CTransaction::AcceptTransaction(CTxDB& txdb, bool fCheckInputs, bool* pfMis
519 { 519 {
520 if (ptxOld) 520 if (ptxOld)
521 { 521 {
522 printf("mapTransaction.erase(%s) replacing with new version\n", ptxOld->GetHash().ToString().c_str()); 522 if (LogAcceptsCategory("net")) printf("mapTransaction.erase(%s) replacing with new version\n", ptxOld->GetHash().ToString().c_str());
523 mapTransactions.erase(ptxOld->GetHash()); 523 mapTransactions.erase(ptxOld->GetHash());
524 } 524 }
525 AddToMemoryPool(); 525 AddToMemoryPool();
@@ -530,7 +530,7 @@ bool CTransaction::AcceptTransaction(CTxDB& txdb, bool fCheckInputs, bool* pfMis
530 if (ptxOld) 530 if (ptxOld)
531 EraseFromWallet(ptxOld->GetHash()); 531 EraseFromWallet(ptxOld->GetHash());
532 532
533 printf("AcceptTransaction(): accepted %s\n", hash.ToString().substr(0,6).c_str()); 533 if (LogAcceptsCategory("net")) printf("AcceptTransaction(): accepted %s\n", hash.ToString().substr(0,6).c_str());
534 return true; 534 return true;
535} 535}
536 536
@@ -669,7 +669,7 @@ void CWalletTx::RelayWalletTransaction(CTxDB& txdb)
669 uint256 hash = GetHash(); 669 uint256 hash = GetHash();
670 if (!txdb.ContainsTx(hash)) 670 if (!txdb.ContainsTx(hash))
671 { 671 {
672 printf("Relaying wtx %s\n", hash.ToString().substr(0,6).c_str()); 672 if (LogAcceptsCategory("net")) printf("Relaying wtx %s\n", hash.ToString().substr(0,6).c_str());
673 RelayMessage(CInv(MSG_TX, hash), (CTransaction)*this); 673 RelayMessage(CInv(MSG_TX, hash), (CTransaction)*this);
674 } 674 }
675 } 675 }
@@ -683,7 +683,7 @@ void RelayWalletTransactions()
683 nLastTime = GetTime(); 683 nLastTime = GetTime();
684 684
685 // Rebroadcast any of our txes that aren't in a block yet 685 // Rebroadcast any of our txes that aren't in a block yet
686 printf("RelayWalletTransactions()\n"); 686 if (LogAcceptsCategory("net")) printf("RelayWalletTransactions()\n");
687 CTxDB txdb("r"); 687 CTxDB txdb("r");
688 CRITICAL_BLOCK(cs_mapWallet) 688 CRITICAL_BLOCK(cs_mapWallet)
689 { 689 {
@@ -764,7 +764,7 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast)
764 764
765 // Limit adjustment step 765 // Limit adjustment step
766 unsigned int nActualTimespan = pindexLast->nTime - pindexFirst->nTime; 766 unsigned int nActualTimespan = pindexLast->nTime - pindexFirst->nTime;
767 printf(" nActualTimespan = %d before bounds\n", nActualTimespan); 767 if (LogAcceptsCategory("net")) printf(" nActualTimespan = %d before bounds\n", nActualTimespan);
768 if (nActualTimespan < nTargetTimespan/4) 768 if (nActualTimespan < nTargetTimespan/4)
769 nActualTimespan = nTargetTimespan/4; 769 nActualTimespan = nTargetTimespan/4;
770 if (nActualTimespan > nTargetTimespan*4) 770 if (nActualTimespan > nTargetTimespan*4)
@@ -780,10 +780,7 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast)
780 bnNew = bnProofOfWorkLimit; 780 bnNew = bnProofOfWorkLimit;
781 781
782 /// debug print 782 /// debug print
783 printf("\n\n\nGetNextWorkRequired RETARGET *****\n"); 783 if (LogAcceptsCategory("net")) { printf("\n\n\nGetNextWorkRequired RETARGET *****\n"); printf("nTargetTimespan = %d nActualTimespan = %d\n", nTargetTimespan, nActualTimespan); printf("Before: %08x %s\n", pindexLast->nBits, CBigNum().SetCompact(pindexLast->nBits).getuint256().ToString().c_str()); printf("After: %08x %s\n", bnNew.GetCompact(), bnNew.getuint256().ToString().c_str()); }
784 printf("nTargetTimespan = %d nActualTimespan = %d\n", nTargetTimespan, nActualTimespan);
785 printf("Before: %08x %s\n", pindexLast->nBits, CBigNum().SetCompact(pindexLast->nBits).getuint256().ToString().c_str());
786 printf("After: %08x %s\n", bnNew.GetCompact(), bnNew.getuint256().ToString().c_str());
787 784
788 return bnNew.GetCompact(); 785 return bnNew.GetCompact();
789} 786}
@@ -1037,7 +1034,7 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex)
1037 1034
1038bool Reorganize(CTxDB& txdb, CBlockIndex* pindexNew) 1035bool Reorganize(CTxDB& txdb, CBlockIndex* pindexNew)
1039{ 1036{
1040 printf("*** REORGANIZE ***\n"); 1037 LogPrint("net", "*** REORGANIZE ***\n");
1041 1038
1042 // Find the fork 1039 // Find the fork
1043 CBlockIndex* pfork = pindexBest; 1040 CBlockIndex* pfork = pindexBest;
@@ -1712,7 +1709,7 @@ bool ProcessMessages(CNode* pfrom)
1712 CDataStream& vRecv = pfrom->vRecv; 1709 CDataStream& vRecv = pfrom->vRecv;
1713 if (vRecv.empty()) 1710 if (vRecv.empty())
1714 return true; 1711 return true;
1715 printf("ProcessMessages(%d bytes)\n", vRecv.size()); 1712 LogPrint("net", "ProcessMessages(%d bytes)\n", vRecv.size());
1716 1713
1717 // 1714 //
1718 // Message format 1715 // Message format
@@ -1730,13 +1727,13 @@ bool ProcessMessages(CNode* pfrom)
1730 { 1727 {
1731 if (vRecv.size() > sizeof(CMessageHeader)) 1728 if (vRecv.size() > sizeof(CMessageHeader))
1732 { 1729 {
1733 printf("\n\nPROCESSMESSAGE MESSAGESTART NOT FOUND\n\n"); 1730 if (LogAcceptsCategory("net")) printf("\n\nPROCESSMESSAGE MESSAGESTART NOT FOUND\n\n");
1734 vRecv.erase(vRecv.begin(), vRecv.end() - sizeof(CMessageHeader)); 1731 vRecv.erase(vRecv.begin(), vRecv.end() - sizeof(CMessageHeader));
1735 } 1732 }
1736 break; 1733 break;
1737 } 1734 }
1738 if (pstart - vRecv.begin() > 0) 1735 if (pstart - vRecv.begin() > 0)
1739 printf("\n\nPROCESSMESSAGE SKIPPED %d BYTES\n\n", pstart - vRecv.begin()); 1736 if (LogAcceptsCategory("net")) printf("\n\nPROCESSMESSAGE SKIPPED %d BYTES\n\n", pstart - vRecv.begin());
1740 vRecv.erase(vRecv.begin(), pstart); 1737 vRecv.erase(vRecv.begin(), pstart);
1741 1738
1742 // Read header 1739 // Read header
@@ -1744,7 +1741,7 @@ bool ProcessMessages(CNode* pfrom)
1744 vRecv >> hdr; 1741 vRecv >> hdr;
1745 if (!hdr.IsValid()) 1742 if (!hdr.IsValid())
1746 { 1743 {
1747 printf("\n\nPROCESSMESSAGE: ERRORS IN HEADER %s\n\n\n", hdr.GetCommand().c_str()); 1744 if (LogAcceptsCategory("net")) printf("\n\nPROCESSMESSAGE: ERRORS IN HEADER %s\n\n\n", hdr.GetCommand().c_str());
1748 continue; 1745 continue;
1749 } 1746 }
1750 string strCommand = hdr.GetCommand(); 1747 string strCommand = hdr.GetCommand();
@@ -1755,7 +1752,7 @@ bool ProcessMessages(CNode* pfrom)
1755 { 1752 {
1756 // Rewind and wait for rest of message 1753 // Rewind and wait for rest of message
1757 ///// need a mechanism to give up waiting for overlong message size error 1754 ///// need a mechanism to give up waiting for overlong message size error
1758 printf("MESSAGE-BREAK 2\n"); 1755 if (LogAcceptsCategory("net")) printf("MESSAGE-BREAK 2\n");
1759 vRecv.insert(vRecv.begin(), BEGIN(hdr), END(hdr)); 1756 vRecv.insert(vRecv.begin(), BEGIN(hdr), END(hdr));
1760 Sleep(100); 1757 Sleep(100);
1761 break; 1758 break;
@@ -1776,7 +1773,7 @@ bool ProcessMessages(CNode* pfrom)
1776 } 1773 }
1777 CATCH_PRINT_EXCEPTION("ProcessMessage()") 1774 CATCH_PRINT_EXCEPTION("ProcessMessage()")
1778 if (!fRet) 1775 if (!fRet)
1779 printf("ProcessMessage(%s, %d bytes) from %s to %s FAILED\n", strCommand.c_str(), nMessageSize, pfrom->addr.ToString().c_str(), addrLocalHost.ToString().c_str()); 1776 if (LogAcceptsCategory("net")) printf("ProcessMessage(%s, %d bytes) from %s to %s FAILED\n", strCommand.c_str(), nMessageSize, pfrom->addr.ToString().c_str(), addrLocalHost.ToString().c_str());
1780 } 1777 }
1781 1778
1782 vRecv.Compact(); 1779 vRecv.Compact();
@@ -1789,13 +1786,10 @@ bool ProcessMessages(CNode* pfrom)
1789bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) 1786bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
1790{ 1787{
1791 static map<unsigned int, vector<unsigned char> > mapReuseKey; 1788 static map<unsigned int, vector<unsigned char> > mapReuseKey;
1792 printf("received: %-12s (%d bytes) ", strCommand.c_str(), vRecv.size()); 1789 if (LogAcceptsCategory("net")) { printf("received: %-12s (%d bytes) ", strCommand.c_str(), vRecv.size()); for (int i = 0; i < min(vRecv.size(), (unsigned int)25); i++) printf("%02x ", vRecv[i] & 0xff); printf("\n"); }
1793 for (int i = 0; i < min(vRecv.size(), (unsigned int)25); i++)
1794 printf("%02x ", vRecv[i] & 0xff);
1795 printf("\n");
1796 if (nDropMessagesTest > 0 && GetRand(nDropMessagesTest) == 0) 1790 if (nDropMessagesTest > 0 && GetRand(nDropMessagesTest) == 0)
1797 { 1791 {
1798 printf("dropmessages DROPPING RECV MESSAGE\n"); 1792 if (LogAcceptsCategory("net")) printf("dropmessages DROPPING RECV MESSAGE\n");
1799 return true; 1793 return true;
1800 } 1794 }
1801 1795
@@ -1833,7 +1827,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
1833 pfrom->PushMessage("getblocks", CBlockLocator(pindexBest), uint256(0)); 1827 pfrom->PushMessage("getblocks", CBlockLocator(pindexBest), uint256(0));
1834 } 1828 }
1835 1829
1836 printf("version addrMe = %s\n", addrMe.ToString().c_str()); 1830 if (LogAcceptsCategory("net")) printf("version addrMe = %s\n", addrMe.ToString().c_str());
1837 } 1831 }
1838 1832
1839 1833
@@ -1844,30 +1838,6 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
1844 } 1838 }
1845 1839
1846 1840
1847 else if (strCommand == "addr")
1848 {
1849 vector<CAddress> vAddr;
1850 vRecv >> vAddr;
1851
1852 // Store the new addresses
1853 CAddrDB addrdb;
1854 foreach(const CAddress& addr, vAddr)
1855 {
1856 if (fShutdown)
1857 return true;
1858 if (AddAddress(addrdb, addr))
1859 {
1860 // Put on lists to send to other nodes
1861 pfrom->setAddrKnown.insert(addr);
1862 CRITICAL_BLOCK(cs_vNodes)
1863 foreach(CNode* pnode, vNodes)
1864 if (!pnode->setAddrKnown.count(addr))
1865 pnode->vAddrToSend.push_back(addr);
1866 }
1867 }
1868 }
1869
1870
1871 else if (strCommand == "inv") 1841 else if (strCommand == "inv")
1872 { 1842 {
1873 vector<CInv> vInv; 1843 vector<CInv> vInv;
@@ -1881,7 +1851,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
1881 pfrom->AddInventoryKnown(inv); 1851 pfrom->AddInventoryKnown(inv);
1882 1852
1883 bool fAlreadyHave = AlreadyHave(txdb, inv); 1853 bool fAlreadyHave = AlreadyHave(txdb, inv);
1884 printf(" got inventory: %s %s\n", inv.ToString().c_str(), fAlreadyHave ? "have" : "new"); 1854 if (LogAcceptsCategory("net")) printf(" got inventory: %s %s\n", inv.ToString().c_str(), fAlreadyHave ? "have" : "new");
1885 1855
1886 if (!fAlreadyHave) 1856 if (!fAlreadyHave)
1887 pfrom->AskFor(inv); 1857 pfrom->AskFor(inv);
@@ -1900,7 +1870,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
1900 { 1870 {
1901 if (fShutdown) 1871 if (fShutdown)
1902 return true; 1872 return true;
1903 printf("received getdata for: %s\n", inv.ToString().c_str()); 1873 if (LogAcceptsCategory("net")) printf("received getdata for: %s\n", inv.ToString().c_str());
1904 1874
1905 if (inv.type == MSG_BLOCK) 1875 if (inv.type == MSG_BLOCK)
1906 { 1876 {
@@ -1940,12 +1910,12 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
1940 // Send the rest of the chain 1910 // Send the rest of the chain
1941 if (pindex) 1911 if (pindex)
1942 pindex = pindex->pnext; 1912 pindex = pindex->pnext;
1943 printf("getblocks %d to %s\n", (pindex ? pindex->nHeight : -1), hashStop.ToString().substr(0,14).c_str()); 1913 if (LogAcceptsCategory("net")) printf("getblocks %d to %s\n", (pindex ? pindex->nHeight : -1), hashStop.ToString().substr(0,14).c_str());
1944 for (; pindex; pindex = pindex->pnext) 1914 for (; pindex; pindex = pindex->pnext)
1945 { 1915 {
1946 if (pindex->GetBlockHash() == hashStop) 1916 if (pindex->GetBlockHash() == hashStop)
1947 { 1917 {
1948 printf(" getblocks stopping at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString().substr(0,14).c_str()); 1918 if (LogAcceptsCategory("net")) printf(" getblocks stopping at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString().substr(0,14).c_str());
1949 break; 1919 break;
1950 } 1920 }
1951 1921
@@ -1997,7 +1967,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
1997 1967
1998 if (tx.AcceptTransaction(true)) 1968 if (tx.AcceptTransaction(true))
1999 { 1969 {
2000 printf(" accepted orphan tx %s\n", inv.hash.ToString().substr(0,6).c_str()); 1970 if (LogAcceptsCategory("net")) printf(" accepted orphan tx %s\n", inv.hash.ToString().substr(0,6).c_str());
2001 AddToWalletIfMine(tx, NULL); 1971 AddToWalletIfMine(tx, NULL);
2002 RelayMessage(inv, vMsg); 1972 RelayMessage(inv, vMsg);
2003 mapAlreadyAskedFor.erase(inv); 1973 mapAlreadyAskedFor.erase(inv);
@@ -2011,7 +1981,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
2011 } 1981 }
2012 else if (fMissingInputs) 1982 else if (fMissingInputs)
2013 { 1983 {
2014 printf("storing orphan tx %s\n", inv.hash.ToString().substr(0,6).c_str()); 1984 if (LogAcceptsCategory("net")) printf("storing orphan tx %s\n", inv.hash.ToString().substr(0,6).c_str());
2015 AddOrphanTx(vMsg); 1985 AddOrphanTx(vMsg);
2016 } 1986 }
2017 } 1987 }
@@ -2041,7 +2011,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
2041 vRecv >> *pblock; 2011 vRecv >> *pblock;
2042 2012
2043 //// debug print 2013 //// debug print
2044 printf("received block:\n"); pblock->print(); 2014 if (LogAcceptsCategory("net")) { printf("received block:\n"); pblock->print(); }
2045 2015
2046 CInv inv(MSG_BLOCK, pblock->GetHash()); 2016 CInv inv(MSG_BLOCK, pblock->GetHash());
2047 pfrom->AddInventoryKnown(inv); 2017 pfrom->AddInventoryKnown(inv);
@@ -2051,25 +2021,6 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
2051 } 2021 }
2052 2022
2053 2023
2054 else if (strCommand == "getaddr")
2055 {
2056 pfrom->vAddrToSend.clear();
2057 //// need to expand the time range if not enough found
2058 int64 nSince = GetAdjustedTime() - 60 * 60; // in the last hour
2059 CRITICAL_BLOCK(cs_mapAddresses)
2060 {
2061 foreach(const PAIRTYPE(vector<unsigned char>, CAddress)& item, mapAddresses)
2062 {
2063 if (fShutdown)
2064 return true;
2065 const CAddress& addr = item.second;
2066 if (addr.nTime > nSince)
2067 pfrom->vAddrToSend.push_back(addr);
2068 }
2069 }
2070 }
2071
2072
2073 else if (strCommand == "checkorder") 2024 else if (strCommand == "checkorder")
2074 { 2025 {
2075 uint256 hashReply; 2026 uint256 hashReply;
@@ -2134,12 +2085,12 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
2134 else 2085 else
2135 { 2086 {
2136 // Ignore unknown commands for extensibility 2087 // Ignore unknown commands for extensibility
2137 printf("ProcessMessage(%s) : Ignored unknown message\n", strCommand.c_str()); 2088 if (LogAcceptsCategory("net")) printf("ProcessMessage(%s) : Ignored unknown message\n", strCommand.c_str());
2138 } 2089 }
2139 2090
2140 2091
2141 if (!vRecv.empty()) 2092 if (!vRecv.empty())
2142 printf("ProcessMessage(%s) : %d extra bytes\n", strCommand.c_str(), vRecv.size()); 2093 if (LogAcceptsCategory("net")) printf("ProcessMessage(%s) : %d extra bytes\n", strCommand.c_str(), vRecv.size());
2143 2094
2144 return true; 2095 return true;
2145} 2096}
@@ -2163,19 +2114,6 @@ bool SendMessages(CNode* pto)
2163 2114
2164 2115
2165 // 2116 //
2166 // Message: addr
2167 //
2168 vector<CAddress> vAddrToSend;
2169 vAddrToSend.reserve(pto->vAddrToSend.size());
2170 foreach(const CAddress& addr, pto->vAddrToSend)
2171 if (!pto->setAddrKnown.count(addr))
2172 vAddrToSend.push_back(addr);
2173 pto->vAddrToSend.clear();
2174 if (!vAddrToSend.empty())
2175 pto->PushMessage("addr", vAddrToSend);
2176
2177
2178 //
2179 // Message: inventory 2117 // Message: inventory
2180 // 2118 //
2181 vector<CInv> vInventoryToSend; 2119 vector<CInv> vInventoryToSend;
@@ -2204,7 +2142,7 @@ bool SendMessages(CNode* pto)
2204 while (!pto->mapAskFor.empty() && (*pto->mapAskFor.begin()).first <= nNow) 2142 while (!pto->mapAskFor.empty() && (*pto->mapAskFor.begin()).first <= nNow)
2205 { 2143 {
2206 const CInv& inv = (*pto->mapAskFor.begin()).second; 2144 const CInv& inv = (*pto->mapAskFor.begin()).second;
2207 printf("sending getdata: %s\n", inv.ToString().c_str()); 2145 if (LogAcceptsCategory("net")) printf("sending getdata: %s\n", inv.ToString().c_str());
2208 if (!AlreadyHave(txdb, inv)) 2146 if (!AlreadyHave(txdb, inv))
2209 vAskFor.push_back(inv); 2147 vAskFor.push_back(inv);
2210 pto->mapAskFor.erase(pto->mapAskFor.begin()); 2148 pto->mapAskFor.erase(pto->mapAskFor.begin());
@@ -2280,13 +2218,21 @@ void BlockSHA256(const void* pin, unsigned int nBlocks, void* pout)
2280 2218
2281 2219
2282// --------------------------------------------------------------------------- 2220// ---------------------------------------------------------------------------
2283// Participant pool miner — connects to an external Stratum server, receives 2221// Participant pool miner -- connects to an external Stratum server, receives
2284// RandomX jobs, hashes with the local CPU, and submits shares. 2222// RandomX jobs, hashes with the local CPU, and submits shares.
2285// Called from BitcoinMiner() when nMineMode == MINE_PARTICIPANT. 2223// Called from BitcoinMiner() when nMineMode == MINE_PARTICIPANT.
2286// --------------------------------------------------------------------------- 2224// ---------------------------------------------------------------------------
2287 2225
2288using json = nlohmann::json; 2226using json = nlohmann::json;
2289 2227
2228
2229// ---------------------------------------------------------------------------
2230// Participant miner -- connects to a pool over a .btf tunnel, runs Stratum,
2231// hashes with RandomX, submits shares. Called from BitcoinMiner().
2232// ---------------------------------------------------------------------------
2233
2234using json = nlohmann::json;
2235
2290static std::string ToHexStr(const void* p, size_t n) 2236static std::string ToHexStr(const void* p, size_t n)
2291{ 2237{
2292 const unsigned char* b = (const unsigned char*)p; 2238 const unsigned char* b = (const unsigned char*)p;
@@ -2300,10 +2246,10 @@ static std::vector<unsigned char> FromHexStr(const std::string& s)
2300{ 2246{
2301 std::vector<unsigned char> v; 2247 std::vector<unsigned char> v;
2302 for (size_t i = 0; i+1 < s.size(); i += 2) { 2248 for (size_t i = 0; i+1 < s.size(); i += 2) {
2303 auto h=[](char c)->int{ 2249 auto h = [](char c)->int{
2304 if(c>='0'&&c<='9')return c-'0'; 2250 if(c>='0'&&c<='9') return c-'0';
2305 if(c>='a'&&c<='f')return c-'a'+10; 2251 if(c>='a'&&c<='f') return c-'a'+10;
2306 if(c>='A'&&c<='F')return c-'A'+10; 2252 if(c>='A'&&c<='F') return c-'A'+10;
2307 return 0; 2253 return 0;
2308 }; 2254 };
2309 v.push_back((unsigned char)((h(s[i])<<4)|h(s[i+1]))); 2255 v.push_back((unsigned char)((h(s[i])<<4)|h(s[i+1])));
@@ -2313,14 +2259,13 @@ static std::vector<unsigned char> FromHexStr(const std::string& s)
2313 2259
2314static void UpdateParticipantHashRate(uint64 hashesSinceSample, int64 sampleStart) 2260static void UpdateParticipantHashRate(uint64 hashesSinceSample, int64 sampleStart)
2315{ 2261{
2316 int64 now = GetTime(); 2262 int64 elapsed = GetTime() - sampleStart;
2317 int64 elapsed = now - sampleStart; 2263 if (elapsed <= 0) elapsed = 1;
2318 if (elapsed <= 0) 2264 gParticipantHashRateX1000.store(
2319 elapsed = 1; 2265 (uint64)((double)hashesSinceSample / (double)elapsed * 1000.0));
2320 double rate = (double)hashesSinceSample / (double)elapsed;
2321 gParticipantHashRateX1000.store((uint64)(rate * 1000.0));
2322} 2266}
2323 2267
2268// Blocking send of a JSON line to the pool.
2324static bool StratumSendLine(SOCKET s, const json& j) 2269static bool StratumSendLine(SOCKET s, const json& j)
2325{ 2270{
2326 std::string line = j.dump() + "\n"; 2271 std::string line = j.dump() + "\n";
@@ -2333,38 +2278,59 @@ static bool StratumSendLine(SOCKET s, const json& j)
2333 return true; 2278 return true;
2334} 2279}
2335 2280
2336static bool StratumRecvLine(SOCKET s, std::string& buf, std::string& line) 2281// Non-blocking recv into carry buffer. Returns true + fills line when a
2282// complete newline-terminated message is ready. Returns false in two cases:
2283// disconnected=true -- socket closed by peer; caller must stop
2284// disconnected=false -- no complete line yet; caller should select() and retry
2285static bool StratumRecvLine(SOCKET s, std::string& buf,
2286 std::string& line, bool& disconnected)
2337{ 2287{
2338 while (true) { 2288 disconnected = false;
2339 size_t pos = buf.find('\n'); 2289 char tmp[4096];
2340 if (pos != std::string::npos) { 2290#ifdef _WIN32
2341 line = buf.substr(0, pos); 2291 u_long avail = 0;
2342 if (!line.empty() && line.back()=='\r') line.pop_back(); 2292 ioctlsocket(s, FIONREAD, &avail);
2343 buf = buf.substr(pos+1); 2293 if (avail > 0) {
2344 return true; 2294 int r = recv(s, tmp, (int)std::min((u_long)(sizeof(tmp)-1), avail), 0);
2345 } 2295 if (r > 0) { tmp[r] = 0; buf += tmp; }
2346 char tmp[4096]; 2296 else if (r == 0) { disconnected = true; return false; }
2347 int r = recv(s, tmp, sizeof(tmp)-1, 0); 2297 }
2348 if (r <= 0) return false; 2298#else
2349 tmp[r] = 0; 2299 {
2350 buf += tmp; 2300 int r = recv(s, tmp, sizeof(tmp)-1, MSG_DONTWAIT);
2301 if (r > 0) { tmp[r] = 0; buf += tmp; }
2302 else if (r == 0) { disconnected = true; return false; }
2303 // r < 0: EAGAIN -- no data right now
2351 } 2304 }
2305#endif
2306 size_t pos = buf.find('\n');
2307 if (pos == std::string::npos) return false;
2308 line = buf.substr(0, pos);
2309 if (!line.empty() && line.back() == '\r') line.pop_back();
2310 buf = buf.substr(pos + 1);
2311 return true;
2352} 2312}
2353 2313
2314// How long to wait for a mining.notify after authorize before giving up
2315static const int64 STUCK_NO_JOB_TIMEOUT_SECS = 120;
2316
2354static bool PoolParticipantMiner() 2317static bool PoolParticipantMiner()
2355{ 2318{
2356 printf("PoolParticipantMiner: connecting to %s\n", strParticipantPool.c_str()); 2319 // ------------------------------------------------------------------
2357 SetParticipantMiningStatus("resolving pool address"); 2320 // Step 1: resolve .btf address -> meeting node
2358 2321 // ------------------------------------------------------------------
2359 if (strParticipantPool.empty()) { 2322 if (strParticipantPool.empty()) {
2360 printf("PoolParticipantMiner: no pool selected\n"); 2323 LogPrint("worker", "[worker] no pool selected\n");
2361 SetParticipantMiningStatus("no pool selected"); 2324 SetParticipantMiningStatus("no pool selected");
2362 return false; 2325 return false;
2363 } 2326 }
2364 2327
2328 LogPrint("worker", "[worker] connecting to pool %s\n", strParticipantPool.c_str());
2329 SetParticipantMiningStatus("resolving pool address");
2330
2365 unsigned char target_pubkey[32]; 2331 unsigned char target_pubkey[32];
2366 if (!btf::ParseAddress(strParticipantPool, target_pubkey)) { 2332 if (!btf::ParseAddress(strParticipantPool, target_pubkey)) {
2367 printf("PoolParticipantMiner: invalid .btf address %s\n", strParticipantPool.c_str()); 2333 LogPrint("worker", "[worker] invalid .btf address: %s\n", strParticipantPool.c_str());
2368 SetParticipantMiningStatus("invalid pool address"); 2334 SetParticipantMiningStatus("invalid pool address");
2369 return false; 2335 return false;
2370 } 2336 }
@@ -2372,35 +2338,48 @@ static bool PoolParticipantMiner()
2372 std::string meetingHostPort; 2338 std::string meetingHostPort;
2373 unsigned char service_enc_pub[32]; 2339 unsigned char service_enc_pub[32];
2374 if (!BtfResolve(strParticipantPool, meetingHostPort, service_enc_pub)) { 2340 if (!BtfResolve(strParticipantPool, meetingHostPort, service_enc_pub)) {
2375 printf("PoolParticipantMiner: failed to resolve %s\n", strParticipantPool.c_str()); 2341 LogPrint("worker", "[worker] failed to resolve pool %s"
2342 " (no Nostr descriptor found -- pool may be offline or relays down)\n",
2343 strParticipantPool.c_str());
2376 SetParticipantMiningStatus("failed to resolve pool"); 2344 SetParticipantMiningStatus("failed to resolve pool");
2377 return false; 2345 return false;
2378 } 2346 }
2347 LogPrint("worker", "[worker] pool resolved to meeting node %s\n", meetingHostPort.c_str());
2379 2348
2380 size_t colon = meetingHostPort.rfind(':'); 2349 size_t colon = meetingHostPort.rfind(':');
2381 if (colon == std::string::npos) { 2350 if (colon == std::string::npos) {
2382 printf("PoolParticipantMiner: bad meeting node %s\n", meetingHostPort.c_str()); 2351 LogPrint("worker", "[worker] bad meeting node format '%s'\n", meetingHostPort.c_str());
2383 SetParticipantMiningStatus("bad pool endpoint"); 2352 SetParticipantMiningStatus("bad pool endpoint");
2384 return false; 2353 return false;
2385 } 2354 }
2386 std::string host = meetingHostPort.substr(0, colon); 2355 std::string host = meetingHostPort.substr(0, colon);
2387 int port = atoi(meetingHostPort.substr(colon + 1).c_str()); 2356 int port = atoi(meetingHostPort.substr(colon + 1).c_str());
2388 if (port <= 0 || port > 65535) { 2357 if (port <= 0 || port > 65535) {
2389 printf("PoolParticipantMiner: bad meeting port %d\n", port); 2358 LogPrint("worker", "[worker] bad meeting port %d in '%s'\n",
2359 port, meetingHostPort.c_str());
2390 SetParticipantMiningStatus("bad pool port"); 2360 SetParticipantMiningStatus("bad pool port");
2391 return false; 2361 return false;
2392 } 2362 }
2393 2363
2394 btf_socket_t s = btf::BtfClientTunnel(host.c_str(), (unsigned short)port, target_pubkey, service_enc_pub); 2364 // ------------------------------------------------------------------
2365 // Step 2: open encrypted tunnel to pool
2366 // ------------------------------------------------------------------
2367 SetParticipantMiningStatus("opening tunnel");
2368 btf_socket_t s = btf::BtfClientTunnel(host.c_str(), (unsigned short)port,
2369 target_pubkey, service_enc_pub);
2395 if (s == INVALID_SOCKET) { 2370 if (s == INVALID_SOCKET) {
2396 printf("PoolParticipantMiner: tunnel connect failed via %s\n", meetingHostPort.c_str()); 2371 LogPrint("worker", "[worker] tunnel connect FAILED via %s"
2372 " (relay unreachable or pool not listening)\n",
2373 meetingHostPort.c_str());
2397 SetParticipantMiningStatus("tunnel connect failed"); 2374 SetParticipantMiningStatus("tunnel connect failed");
2398 return false; 2375 return false;
2399 } 2376 }
2400 printf("PoolParticipantMiner: connected via %s\n", meetingHostPort.c_str()); 2377 LogPrint("worker", "[worker] tunnel open via %s\n", meetingHostPort.c_str());
2401 SetParticipantMiningStatus("tunnel connected"); 2378 SetParticipantMiningStatus("tunnel open");
2402 2379
2403 // Use our wallet address as mining username so payouts go to our wallet 2380 // ------------------------------------------------------------------
2381 // Step 3: determine our payout address (mining username)
2382 // ------------------------------------------------------------------
2404 std::string username; 2383 std::string username;
2405 { 2384 {
2406 std::vector<unsigned char> vchPubKey; 2385 std::vector<unsigned char> vchPubKey;
@@ -2408,102 +2387,260 @@ static bool PoolParticipantMiner()
2408 username = PubKeyToAddress(vchPubKey); 2387 username = PubKeyToAddress(vchPubKey);
2409 } 2388 }
2410 if (username.empty()) username = BtfLocalAddress(); 2389 if (username.empty()) username = BtfLocalAddress();
2411 if (username.empty()) username = "unknown"; 2390 if (username.empty()) {
2412 2391 LogPrint("worker", "[worker] WARNING: could not determine wallet address"
2392 " -- shares will not pay out\n");
2393 username = "unknown";
2394 }
2395 LogPrint("worker", "[worker] payout address: %s\n", username.c_str());
2396
2397 // ------------------------------------------------------------------
2398 // Step 4: build the fast (~2 GB dataset) RandomX mode if not already
2399 // built, then start our VM. Without this, RandomXCreateMinerVM() falls
2400 // back to "light" mode (cache only) forever, which is dramatically
2401 // slower per hash than fast mode -- it recomputes dataset items on the
2402 // fly for every single hash instead of a direct memory lookup. That
2403 // alone can turn a "few seconds per share" pool into "many minutes per
2404 // share" regardless of how easy the share target is.
2405 //
2406 // This MUST happen before we send mining.subscribe/authorize, not
2407 // after: it's a synchronous, single-threaded-per-call build that can
2408 // take anywhere from several seconds to a couple of minutes depending
2409 // on core count. If it runs after the handshake messages are sent,
2410 // the pool's replies (subscribe ack, authorize ack, set_difficulty,
2411 // and the first job) all land in the OS socket buffer while we're
2412 // not reading -- nothing is lost, but we sit there looking (and
2413 // logging) like we're "stuck waiting for pool response" for the
2414 // entire build duration, when really we're just not listening yet.
2415 // Building the dataset first means that by the time we say
2416 // "subscribing", we're genuinely ready to read the reply the instant
2417 // it arrives.
2418 // ------------------------------------------------------------------
2419 if (!RandomXFastReady()) {
2420 SetParticipantMiningStatus("building RandomX dataset (~2GB, one-time)");
2421 unsigned int nThreads = std::thread::hardware_concurrency();
2422 RandomXInitDataset(nThreads > 0 ? (int)nThreads : 1);
2423 }
2424 void* rxvm = RandomXCreateMinerVM();
2425 if (!rxvm) {
2426 LogPrint("worker", "[worker] failed to create RandomX VM\n");
2427 SetParticipantMiningStatus("RandomX init failed");
2428 closesocket(s); return false;
2429 }
2430 LogPrint("worker", "[worker] RandomX VM ready (%s)\n",
2431 RandomXFastReady() ? "fast 2GB" : "light 256MB");
2432
2433 // ------------------------------------------------------------------
2434 // Step 5: Stratum subscribe + authorize. The socket is read from
2435 // immediately after this, in the main loop below, so nothing sits
2436 // unread behind a blocking dataset build anymore.
2437 // ------------------------------------------------------------------
2413 std::string buf; 2438 std::string buf;
2414 int msgId = 1; 2439 int msgId = 1;
2415 std::set<int> pendingSubmitIds; 2440 std::set<int> pendingSubmitIds;
2416 2441
2417 // Subscribe
2418 SetParticipantMiningStatus("subscribing"); 2442 SetParticipantMiningStatus("subscribing");
2419 if (!StratumSendLine(s, json{{"id",msgId++},{"method","mining.subscribe"},{"params",json::array()}})) 2443 LogPrint("worker", "[worker->pool] sending mining.subscribe\n");
2420 { SetParticipantMiningStatus("subscribe failed"); closesocket(s); return false; } 2444 if (!StratumSendLine(s, json{{"id",msgId++},{"method","mining.subscribe"},
2445 {"params",json::array()}})) {
2446 LogPrint("worker", "[worker] subscribe send FAILED -- pool dropped connection\n");
2447 SetParticipantMiningStatus("subscribe send failed");
2448 RandomXDestroyMinerVM(rxvm);
2449 closesocket(s); return false;
2450 }
2421 2451
2422 // Authorize
2423 SetParticipantMiningStatus("authorizing"); 2452 SetParticipantMiningStatus("authorizing");
2453 LogPrint("worker", "[worker->pool] sending mining.authorize as %s\n", username.c_str());
2424 if (!StratumSendLine(s, json{{"id",msgId++},{"method","mining.authorize"}, 2454 if (!StratumSendLine(s, json{{"id",msgId++},{"method","mining.authorize"},
2425 {"params",json::array({username,"x"})}})) 2455 {"params",json::array({username,"x"})}})) {
2426 { SetParticipantMiningStatus("authorize failed"); closesocket(s); return false; } 2456 LogPrint("worker", "[worker] authorize send FAILED -- pool dropped connection\n");
2457 SetParticipantMiningStatus("authorize send failed");
2458 RandomXDestroyMinerVM(rxvm);
2459 closesocket(s); return false;
2460 }
2427 2461
2428 // Job state 2462 // ------------------------------------------------------------------
2463 // Step 6: main loop -- receive messages, hash, submit shares
2464 // ------------------------------------------------------------------
2429 std::string jobId; 2465 std::string jobId;
2430 unsigned char header[80]; 2466 unsigned char header[80] = {};
2431 uint256 target; 2467 uint256 target;
2432 bool haveJob = false; 2468 double currentDifficulty = 1.0; // updated by mining.set_difficulty from pool
2469 bool haveJob = false;
2433 bool gotSubscribeAck = false; 2470 bool gotSubscribeAck = false;
2434 bool gotAuthorizeAck = false; 2471 bool gotAuthorizeAck = false;
2435 int64 authWaitStart = 0; 2472 int64 authWaitStart = 0;
2436 unsigned int nNonce = 1; 2473 int64 lastStuckLog = 0;
2437 uint64 hashesSinceSample = 0; 2474 unsigned int nNonce = 1;
2438 int64 sampleStart = GetTime(); 2475 uint64 hashesSinceSample = 0;
2476 uint64 sessionSharesSent = 0; // this connection only
2477 uint64 sessionSharesAccepted = 0;
2478 int64 sampleStart = GetTime();
2439 2479
2440 void* rxvm = RandomXCreateMinerVM(); 2480 SetParticipantMiningStatus("waiting for pool response");
2441 if (!rxvm) { SetParticipantMiningStatus("failed to start RandomX miner"); closesocket(s); return false; }
2442 printf("PoolParticipantMiner: RandomX VM ready (%s)\n",
2443 RandomXFastReady() ? "fast 2GB" : "light 256MB");
2444 SetParticipantMiningStatus("authorized; asking pool for work");
2445 2481
2446 while (fGenerateBitcoins && nMineMode == MINE_PARTICIPANT && !fShutdown) 2482 while (fGenerateBitcoins && nMineMode == MINE_PARTICIPANT && !fShutdown)
2447 { 2483 {
2448 // Non-blocking receive check 2484 // -- Receive: check buffer first, then select --
2449 { 2485 {
2450 fd_set fds; FD_ZERO(&fds); FD_SET(s, &fds); 2486 bool haveBuffered = buf.find('\n') != std::string::npos;
2451 struct timeval tv={0,50000}; // 50ms 2487 bool readable = false;
2452 if (select((int)s+1, &fds, NULL, NULL, &tv) > 0) { 2488 if (!haveBuffered) {
2489 fd_set fds; FD_ZERO(&fds); FD_SET(s, &fds);
2490 struct timeval tv = {0, 50000}; // 50ms
2491 readable = select((int)s+1, &fds, NULL, NULL, &tv) > 0;
2492 }
2493
2494 if (haveBuffered || readable) {
2453 std::string line; 2495 std::string line;
2454 if (!StratumRecvLine(s, buf, line)) break; 2496 bool disc = false;
2455 try { 2497 while (StratumRecvLine(s, buf, line, disc)) {
2456 json msg = json::parse(line); 2498 json msg;
2457 if (msg.contains("id") && msg["id"].is_number_integer() && msg.contains("result")) { 2499 try { msg = json::parse(line); } catch (...) {
2458 int id = msg["id"].get<int>(); 2500 LogPrint("worker", "[pool->worker] JSON parse error: %.80s\n",
2459 if (id == 1 && msg["result"].is_boolean() && msg["result"].get<bool>()) { 2501 line.c_str());
2460 gotSubscribeAck = true; 2502 continue;
2461 SetParticipantMiningStatus("subscribed; authorizing"); 2503 }
2462 } else if (id == 2 && msg["result"].is_boolean()) { 2504
2463 gotAuthorizeAck = msg["result"].get<bool>(); 2505 // -- Response to our subscribe (id=1) --
2464 authWaitStart = GetTime(); 2506 if (msg.contains("id") && msg["id"].is_number_integer()
2465 SetParticipantMiningStatus(gotAuthorizeAck ? "authorized; asking pool for work" : "authorization rejected"); 2507 && msg["id"].get<int>() == 1
2508 && msg.contains("result") && !msg["result"].is_null()) {
2509 gotSubscribeAck = true;
2510 LogPrint("worker", "[pool->worker] subscribe ack received\n");
2511 SetParticipantMiningStatus("subscribed; waiting for authorize ack");
2512 }
2513
2514 // -- Response to our authorize (id=2) --
2515 else if (msg.contains("id") && msg["id"].is_number_integer()
2516 && msg["id"].get<int>() == 2
2517 && msg.contains("result")) {
2518 bool ok = msg["result"].is_boolean() && msg["result"].get<bool>();
2519 authWaitStart = GetTime();
2520 if (ok) {
2521 gotAuthorizeAck = true;
2522 LogPrint("worker", "[pool->worker] authorize OK -- waiting for job\n");
2523 SetParticipantMiningStatus("authorized; waiting for job");
2524 } else {
2525 std::string reason = msg.value("error", json("unspecified")).is_string()
2526 ? msg["error"].get<std::string>() : "unspecified";
2527 LogPrint("worker", "[pool->worker] authorize REJECTED: %s\n",
2528 reason.c_str());
2529 SetParticipantMiningStatus("authorization rejected");
2530 // Don't break -- pool might still send a job (some pools
2531 // reject bad addresses but still send work)
2466 } 2532 }
2467 if (pendingSubmitIds.erase(id) > 0) { 2533 }
2468 if (msg["result"].is_boolean() && msg["result"].get<bool>()) { 2534
2535 // -- Share submission response --
2536 else if (msg.contains("id") && msg["id"].is_number_integer()) {
2537 int rid = msg["id"].get<int>();
2538 if (pendingSubmitIds.erase(rid) > 0) {
2539 bool accepted = msg.contains("result")
2540 && msg["result"].is_boolean()
2541 && msg["result"].get<bool>();
2542 if (accepted) {
2469 gParticipantSharesAccepted.fetch_add(1); 2543 gParticipantSharesAccepted.fetch_add(1);
2544 sessionSharesAccepted++;
2545 LogPrint("worker", "[pool->worker] share id=%d ACCEPTED\n", rid);
2470 SetParticipantMiningStatus("share accepted"); 2546 SetParticipantMiningStatus("share accepted");
2471 } else { 2547 } else {
2472 SetParticipantMiningStatus("share rejected"); 2548 std::string reason = (msg.contains("error")
2549 && msg["error"].is_string())
2550 ? msg["error"].get<std::string>() : "unspecified";
2551 LogPrint("worker", "[pool->worker] share id=%d REJECTED: %s\n",
2552 rid, reason.c_str());
2553 SetParticipantMiningStatus("share rejected: " + reason);
2473 } 2554 }
2474 } 2555 }
2475 } 2556 }
2476 std::string method = msg.value("method",""); 2557
2477 if (method == "mining.notify") { 2558 // -- Server notification --
2478 auto& p = msg["params"]; 2559 else {
2479 jobId = p[0].get<std::string>(); 2560 std::string method = msg.value("method", "");
2480 // p[1] = full 80-byte header hex 2561
2481 auto hdrBytes = FromHexStr(p[1].get<std::string>()); 2562 if (method == "mining.notify") {
2482 if (hdrBytes.size() >= 80) 2563 auto& p = msg["params"];
2483 memcpy(header, hdrBytes.data(), 80); 2564 if (!p.is_array() || p.size() < 4) {
2484 // p[3] = share target hex (little-endian uint256) 2565 LogPrint("worker", "[pool->worker] malformed mining.notify"
2485 auto tgtBytes = FromHexStr(p[3].get<std::string>()); 2566 " (params size=%zu)\n", p.is_array() ? p.size() : 0);
2486 if (tgtBytes.size() >= 32) 2567 } else {
2487 memcpy(&target, tgtBytes.data(), 32); 2568 std::string newJobId = p[0].get<std::string>();
2488 haveJob = true; 2569 auto hdrBytes = FromHexStr(p[1].get<std::string>());
2489 nNonce = 1; 2570 auto tgtBytes = FromHexStr(p[3].get<std::string>());
2490 SetParticipantMiningStatus("job received; hashing"); 2571
2491 printf("PoolParticipantMiner: new job %s\n", jobId.c_str()); 2572 if (hdrBytes.size() < 80) {
2492 } else if (method == "mining.set_difficulty") { 2573 LogPrint("worker", "[pool->worker] mining.notify:"
2493 // acknowledged, we use the target from notify 2574 " header too short (%zu bytes)\n",
2575 hdrBytes.size());
2576 } else if (tgtBytes.size() < 32) {
2577 LogPrint("worker", "[pool->worker] mining.notify:"
2578 " target too short (%zu bytes)\n",
2579 tgtBytes.size());
2580 } else {
2581 jobId = newJobId;
2582 memcpy(header, hdrBytes.data(), 80);
2583 memcpy(&target, tgtBytes.data(), 32);
2584 haveJob = true;
2585 nNonce = 1;
2586 LogPrint("worker", "[pool->worker] new job %s received\n",
2587 jobId.c_str());
2588 SetParticipantMiningStatus("hashing job " + jobId);
2589 }
2590 }
2591 } else if (method == "mining.set_difficulty") {
2592 // Pool adjusts our share difficulty via vardiff.
2593 // Apply it immediately so we start hashing at the new target.
2594 if (msg.contains("params") && msg["params"].is_array()
2595 && msg["params"].size() > 0
2596 && msg["params"][0].is_number()) {
2597 double newDiff = msg["params"][0].get<double>();
2598 if (newDiff > 0.0) {
2599 bool changed = (newDiff != currentDifficulty);
2600 currentDifficulty = newDiff;
2601 LogPrint("worker", "[pool->worker] set_difficulty %.6f%s\n",
2602 newDiff, changed ? " (updated)" : " (initial)");
2603 }
2604 } else {
2605 LogPrint("worker", "[pool->worker] set_difficulty"
2606 " received (no valid params)\n");
2607 }
2608 } else if (!method.empty()) {
2609 LogPrint("worker", "[pool->worker] unknown server method: %s\n",
2610 method.c_str());
2611 }
2494 } 2612 }
2495 } catch(...) {} 2613 }
2614
2615 if (disc) {
2616 LogPrint("worker", "[worker] pool closed the connection"
2617 " (gotSubscribeAck=%d gotAuthorizeAck=%d haveJob=%d)\n",
2618 gotSubscribeAck, gotAuthorizeAck, haveJob);
2619 break;
2620 }
2496 } 2621 }
2497 } 2622 }
2498 2623
2499 if (gotAuthorizeAck && !haveJob && authWaitStart > 0 && GetTime() - authWaitStart > 10) { 2624 // -- Stuck watchdog: authorized but no job arriving --
2500 SetParticipantMiningStatus("authorized; waiting for pool notify"); 2625 if (gotAuthorizeAck && !haveJob && authWaitStart > 0) {
2501 authWaitStart = 0; 2626 int64 waited = GetTime() - authWaitStart;
2627 if (waited > 10 && GetTime() - lastStuckLog >= 15) {
2628 LogPrint("worker", "[worker] authorized but no job after %llds"
2629 " -- pool tunnel is live, waiting on mining.notify\n",
2630 (long long)waited);
2631 lastStuckLog = GetTime();
2632 }
2633 if (waited > STUCK_NO_JOB_TIMEOUT_SECS) {
2634 LogPrint("worker", "[worker] no job received after %llds -- disconnecting"
2635 " and reconnecting\n", (long long)STUCK_NO_JOB_TIMEOUT_SECS);
2636 SetParticipantMiningStatus("timeout waiting for job; reconnecting");
2637 break;
2638 }
2502 } 2639 }
2503 2640
2504 if (!haveJob) { Sleep(100); continue; } 2641 if (!haveJob) { Sleep(100); continue; }
2505 2642
2506 // Hash one nonce 2643 // -- Hash one nonce --
2507 memcpy(header+76, &nNonce, 4); 2644 memcpy(header+76, &nNonce, 4);
2508 uint256 hash = RandomXHashWithVM(rxvm, header, 80); 2645 uint256 hash = RandomXHashWithVM(rxvm, header, 80);
2509 hashesSinceSample++; 2646 hashesSinceSample++;
@@ -2512,38 +2649,59 @@ static bool PoolParticipantMiner()
2512 UpdateParticipantHashRate(hashesSinceSample, sampleStart); 2649 UpdateParticipantHashRate(hashesSinceSample, sampleStart);
2513 2650
2514 if (hash <= target) { 2651 if (hash <= target) {
2515 printf("PoolParticipantMiner: share found! nonce=%u\n", nNonce); 2652 LogPrint("worker", "[worker] share found! nonce=%u job=%s difficulty=%.4f\n",
2653 nNonce, jobId.c_str(), currentDifficulty);
2516 SetParticipantMiningStatus("share found; submitting"); 2654 SetParticipantMiningStatus("share found; submitting");
2517 int submitId = msgId++; 2655 int submitId = msgId++;
2518 pendingSubmitIds.insert(submitId); 2656 pendingSubmitIds.insert(submitId);
2519 gParticipantSharesSent.fetch_add(1); 2657 gParticipantSharesSent.fetch_add(1);
2658 sessionSharesSent++;
2520 json submit = {{"id",submitId},{"method","mining.submit"}, 2659 json submit = {{"id",submitId},{"method","mining.submit"},
2521 {"params",json::array({username, jobId, 2660 {"params",json::array({username, jobId, ToHexStr(&nNonce,4)})}};
2522 ToHexStr(&nNonce,4)})}}; 2661 if (!StratumSendLine(s, submit)) {
2523 if (!StratumSendLine(s, submit)) break; 2662 LogPrint("worker", "[worker] share submit send FAILED"
2663 " -- pool connection lost\n");
2664 break;
2665 }
2524 } 2666 }
2525 2667
2526 nNonce++; 2668 nNonce++;
2527 if (nNonce == 0) { haveJob = false; } // exhausted, wait for new job 2669 if (nNonce == 0) {
2670 LogPrint("worker", "[worker] nonce space exhausted for job %s"
2671 " -- waiting for new job\n", jobId.c_str());
2672 haveJob = false;
2673 }
2528 } 2674 }
2529 2675
2676 // ------------------------------------------------------------------
2677 // Cleanup
2678 // ------------------------------------------------------------------
2530 RandomXDestroyMinerVM(rxvm); 2679 RandomXDestroyMinerVM(rxvm);
2531 closesocket(s); 2680 closesocket(s);
2532 UpdateParticipantHashRate(hashesSinceSample, sampleStart); 2681 UpdateParticipantHashRate(hashesSinceSample, sampleStart);
2533 SetParticipantMiningStatus("participant miner stopped"); 2682 SetParticipantMiningStatus("disconnected");
2534 printf("PoolParticipantMiner: disconnected\n"); 2683 LogPrint("worker", "[worker] disconnected from pool"
2684 " (hashes this session: %llu, shares sent: %llu, accepted: %llu)\n",
2685 (unsigned long long)hashesSinceSample,
2686 (unsigned long long)sessionSharesSent,
2687 (unsigned long long)sessionSharesAccepted);
2535 return true; 2688 return true;
2536} 2689}
2537 2690
2538bool BitcoinMiner() 2691bool BitcoinMiner()
2539{ 2692{
2693 // Relay mode: never mines, just relays/syncs. (Shouldn't normally get here
2694 // since the GUI hides Start Mining for Relay, but guard it regardless.)
2695 if (nMineMode == MINE_RELAY)
2696 return true;
2697
2540 // Participant mode: connect to external pool instead of mining solo/operator 2698 // Participant mode: connect to external pool instead of mining solo/operator
2541 if (nMineMode == MINE_PARTICIPANT) 2699 if (nMineMode == MINE_PARTICIPANT)
2542 { 2700 {
2543 while (fGenerateBitcoins && nMineMode == MINE_PARTICIPANT && !fShutdown) { 2701 while (fGenerateBitcoins && nMineMode == MINE_PARTICIPANT && !fShutdown) {
2544 PoolParticipantMiner(); 2702 PoolParticipantMiner();
2545 if (fGenerateBitcoins && nMineMode == MINE_PARTICIPANT && !fShutdown) { 2703 if (fGenerateBitcoins && nMineMode == MINE_PARTICIPANT && !fShutdown) {
2546 printf("PoolParticipantMiner: reconnecting in 10s\n"); 2704 LogPrint("worker", "PoolParticipantMiner: reconnecting in 10s\n");
2547 for (int i = 0; i < 10 && !fShutdown; i++) Sleep(1000); 2705 for (int i = 0; i < 10 && !fShutdown; i++) Sleep(1000);
2548 } 2706 }
2549 } 2707 }
@@ -2554,9 +2712,16 @@ bool BitcoinMiner()
2554 if (nMineMode == MINE_OPERATOR) 2712 if (nMineMode == MINE_OPERATOR)
2555 return true; 2713 return true;
2556 2714
2557 printf("BitcoinMiner started\n"); 2715 LogPrint("net", "BitcoinMiner started\n");
2558 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST); 2716 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST);
2559 2717
2718 // Build the fast (~2 GB dataset) RandomX mode once, up front, so we're
2719 // not stuck mining in the much slower light/cache-only mode forever.
2720 if (!RandomXFastReady()) {
2721 unsigned int nThreads = std::thread::hardware_concurrency();
2722 RandomXInitDataset(nThreads > 0 ? (int)nThreads : 1);
2723 }
2724
2560 CKey key; 2725 CKey key;
2561 key.MakeNewKey(); 2726 key.MakeNewKey();
2562 CBigNum bnExtraNonce = 0; 2727 CBigNum bnExtraNonce = 0;
@@ -2639,7 +2804,7 @@ bool BitcoinMiner()
2639 } 2804 }
2640 pblock->nBits = nBits; 2805 pblock->nBits = nBits;
2641 pblock->vtx[0].vout[0].nValue = pblock->GetBlockValue(nFees); 2806 pblock->vtx[0].vout[0].nValue = pblock->GetBlockValue(nFees);
2642 printf("\n\nRunning BitcoinMiner with %d transactions in block\n", pblock->vtx.size()); 2807 if (LogAcceptsCategory("net")) printf("\n\nRunning BitcoinMiner with %d transactions in block\n", pblock->vtx.size());
2643 2808
2644 2809
2645 // 2810 //
@@ -2658,11 +2823,11 @@ bool BitcoinMiner()
2658 void* rxvm = RandomXCreateMinerVM(); 2823 void* rxvm = RandomXCreateMinerVM();
2659 if (!rxvm) 2824 if (!rxvm)
2660 { 2825 {
2661 printf("BitcoinMiner: failed to create RandomX VM\n"); 2826 LogPrint("net", "BitcoinMiner: failed to create RandomX VM\n");
2662 Sleep(1000); 2827 Sleep(1000);
2663 continue; 2828 continue;
2664 } 2829 }
2665 printf("BitcoinMiner: mining with RandomX (%s)\n", 2830 LogPrint("net", "BitcoinMiner: mining with RandomX (%s)\n",
2666 RandomXFastReady() ? "fast 2GB" : "light 256MB"); 2831 RandomXFastReady() ? "fast 2GB" : "light 256MB");
2667 2832
2668 unsigned int nStart = GetTime(); 2833 unsigned int nStart = GetTime();
@@ -2675,9 +2840,9 @@ bool BitcoinMiner()
2675 if (hash <= hashTarget) 2840 if (hash <= hashTarget)
2676 { 2841 {
2677 //// debug print 2842 //// debug print
2678 printf("BitcoinMiner:\n"); 2843 if (LogAcceptsCategory("net")) printf("BitcoinMiner:\n");
2679 printf("RandomX proof-of-work found \n powhash: %s \ntarget: %s\n", hash.GetHex().c_str(), hashTarget.GetHex().c_str()); 2844 if (LogAcceptsCategory("net")) printf("RandomX proof-of-work found \n powhash: %s \ntarget: %s\n", hash.GetHex().c_str(), hashTarget.GetHex().c_str());
2680 pblock->print(); 2845 if (LogAcceptsCategory("net")) pblock->print();
2681 2846
2682 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL); 2847 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
2683 CRITICAL_BLOCK(cs_main) 2848 CRITICAL_BLOCK(cs_main)
@@ -2692,7 +2857,7 @@ bool BitcoinMiner()
2692 2857
2693 // Process this block the same as if we had received it from another node 2858 // Process this block the same as if we had received it from another node
2694 if (!ProcessBlock(NULL, pblock.release())) 2859 if (!ProcessBlock(NULL, pblock.release()))
2695 printf("ERROR in BitcoinMiner, ProcessBlock, block not accepted\n"); 2860 LogPrint("net", "ERROR in BitcoinMiner, ProcessBlock, block not accepted\n");
2696 } 2861 }
2697 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST); 2862 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST);
2698 2863
@@ -2860,11 +3025,11 @@ bool SelectCoins(int64 nTargetValue, set<CWalletTx*>& setCoinsRet)
2860 setCoinsRet.insert(vValue[i].second); 3025 setCoinsRet.insert(vValue[i].second);
2861 3026
2862 //// debug print 3027 //// debug print
2863 printf("SelectCoins() best subset: "); 3028 if (LogAcceptsCategory("net")) printf("SelectCoins() best subset: ");
2864 for (int i = 0; i < vValue.size(); i++) 3029 for (int i = 0; i < vValue.size(); i++)
2865 if (vfBest[i]) 3030 if (vfBest[i])
2866 printf("%s ", FormatMoney(vValue[i].first).c_str()); 3031 if (LogAcceptsCategory("net")) printf("%s ", FormatMoney(vValue[i].first).c_str());
2867 printf("total %s\n", FormatMoney(nBest).c_str()); 3032 if (LogAcceptsCategory("net")) printf("total %s\n", FormatMoney(nBest).c_str());
2868 } 3033 }
2869 3034
2870 return true; 3035 return true;
@@ -2953,6 +3118,34 @@ bool CreateTransaction(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew, in
2953 return true; 3118 return true;
2954} 3119}
2955 3120
3121// Undo what CommitTransactionSpent did: unmark the inputs it marked spent
3122// and erase the half-committed wallet entry. Used when a transaction is
3123// accepted into the wallet but then rejected by the mempool/chain, so we
3124// don't end up with a wallet that thinks money is spent that never left.
3125void RollbackTransactionSpent(const CWalletTx& wtxNew)
3126{
3127 CRITICAL_BLOCK(cs_main)
3128 CRITICAL_BLOCK(cs_mapWallet)
3129 {
3130 set<CWalletTx*> setCoins;
3131 foreach(const CTxIn& txin, wtxNew.vin)
3132 {
3133 map<uint256, CWalletTx>::iterator mi = mapWallet.find(txin.prevout.hash);
3134 if (mi != mapWallet.end())
3135 setCoins.insert(&mi->second);
3136 }
3137 foreach(CWalletTx* pcoin, setCoins)
3138 {
3139 pcoin->fSpent = false;
3140 pcoin->WriteToDisk();
3141 vWalletUpdated.push_back(make_pair(pcoin->GetHash(), false));
3142 }
3143
3144 EraseFromWallet(wtxNew.GetHash());
3145 }
3146 MainFrameRepaint();
3147}
3148
2956// Call after CreateTransaction unless you want to abort 3149// Call after CreateTransaction unless you want to abort
2957bool CommitTransactionSpent(const CWalletTx& wtxNew) 3150bool CommitTransactionSpent(const CWalletTx& wtxNew)
2958{ 3151{
@@ -3003,13 +3196,17 @@ bool SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew)
3003 return error("SendMoney() : Error finalizing transaction"); 3196 return error("SendMoney() : Error finalizing transaction");
3004 } 3197 }
3005 3198
3006 printf("SendMoney: %s\n", wtxNew.GetHash().ToString().substr(0,6).c_str()); 3199 if (LogAcceptsCategory("net")) printf("SendMoney: %s\n", wtxNew.GetHash().ToString().substr(0,6).c_str());
3007 3200
3008 // Broadcast 3201 // Broadcast
3009 if (!wtxNew.AcceptTransaction()) 3202 if (!wtxNew.AcceptTransaction())
3010 { 3203 {
3011 // This must not fail. The transaction has already been signed and recorded. 3204 // The transaction was already signed and committed to the wallet
3012 throw runtime_error("SendMoney() : wtxNew.AcceptTransaction() failed\n"); 3205 // above, but the chain/mempool just rejected it (e.g. a raced
3206 // input already spent by another transaction). Unwind the
3207 // wallet state we just wrote instead of crashing the app.
3208 RollbackTransactionSpent(wtxNew);
3209 return error("SendMoney() : wtxNew.AcceptTransaction() failed");
3013 } 3210 }
3014 wtxNew.RelayWalletTransaction(); 3211 wtxNew.RelayWalletTransaction();
3015 } 3212 }
diff --git a/src/main.h b/src/main.h
index 3d7d6dd..8bb8609 100644
--- a/src/main.h
+++ b/src/main.h
@@ -48,13 +48,17 @@ extern CBlockIndex* pindexBest;
48extern unsigned int nTransactionsUpdated; 48extern unsigned int nTransactionsUpdated;
49extern string strSetDataDir; 49extern string strSetDataDir;
50extern int nDropMessagesTest; 50extern int nDropMessagesTest;
51// Mining mode — persisted in wallet.dat 51// Mining mode -- persisted in wallet.dat
52// MINE_SOLO (0): mine to own wallet, no pool server 52// Mining mode -- decided fresh every launch (CLI flags, else default). Never
53// MINE_OPERATOR (1): run pool server, mine to own wallet, distribute to miners 53// restored from wallet.dat; see LoadWallet() in db.cpp.
54// MINE_PARTICIPANT (2): connect to external pool, submit shares, receive payouts 54// MINE_RELAY (0): default. Node runs/syncs, never mines, no pool server.
55#define MINE_SOLO 0 55// MINE_SOLO (1): mine to own wallet, no pool server
56#define MINE_OPERATOR 1 56// MINE_OPERATOR (2): run pool server, mine to own wallet, distribute to miners
57#define MINE_PARTICIPANT 2 57// MINE_PARTICIPANT (3): connect to external pool, submit shares, receive payouts
58#define MINE_RELAY 0
59#define MINE_SOLO 1
60#define MINE_OPERATOR 2
61#define MINE_PARTICIPANT 3
58extern int nMineMode; 62extern int nMineMode;
59extern string strParticipantPool; // participant: pool .btf address 63extern string strParticipantPool; // participant: pool .btf address
60extern string strPoolName; // operator: announced pool name 64extern string strPoolName; // operator: announced pool name
@@ -78,6 +82,7 @@ struct PoolWorkerStatView
78 uint64 totalShares; 82 uint64 totalShares;
79 uint64 roundShares; 83 uint64 roundShares;
80 int64 lastSeen; 84 int64 lastSeen;
85 double hashRate; // estimated H/s, derived from share difficulty + submit rate
81}; 86};
82 87
83// Settings 88// Settings
@@ -102,11 +107,11 @@ void RelayWalletTransactions();
102bool LoadBlockIndex(bool fAllowNew=true); 107bool LoadBlockIndex(bool fAllowNew=true);
103void PrintBlockTree(); 108void PrintBlockTree();
104bool BitcoinMiner(); 109bool BitcoinMiner();
105void ThreadRPCServer(void* parg); // rpc.cpp — .btf pool server 110void ThreadRPCServer(void* parg); // rpc.cpp -- .btf pool server
106void GetParticipantMiningStats(uint64& sharesSent, uint64& sharesAccepted, double& hashRate); 111void GetParticipantMiningStats(uint64& sharesSent, uint64& sharesAccepted, double& hashRate);
107void SetParticipantMiningStatus(const std::string& status); 112void SetParticipantMiningStatus(const std::string& status);
108std::string GetParticipantMiningStatus(); 113std::string GetParticipantMiningStatus();
109void GetPoolOperatorStats(int& authorizedMiners, int& blocksFound, uint64& roundShares); 114void GetPoolOperatorStats(int& authorizedMiners, int& blocksFound, uint64& roundShares, double& totalHashRate);
110void GetPoolWorkerStats(std::vector<PoolWorkerStatView>& out); 115void GetPoolWorkerStats(std::vector<PoolWorkerStatView>& out);
111void GetPendingPayouts(std::vector<PendingPayoutView>& out); 116void GetPendingPayouts(std::vector<PendingPayoutView>& out);
112bool ProcessMessages(CNode* pfrom); 117bool ProcessMessages(CNode* pfrom);
diff --git a/src/main_gui.cpp b/src/main_gui.cpp
index b7377da..842b0d5 100644
--- a/src/main_gui.cpp
+++ b/src/main_gui.cpp
@@ -1,4 +1,4 @@
1// Bitflash entry point — starts node threads then runs GUI (or headless). 1// Bitflash entry point -- starts node threads then runs GUI (or headless).
2 2
3#include "headers_core.h" 3#include "headers_core.h"
4#ifndef _WIN32 4#ifndef _WIN32
@@ -126,8 +126,6 @@ int main(int argc, char* argv[])
126 126
127 ParseStartupArguments(argc, argv); 127 ParseStartupArguments(argc, argv);
128 128
129 printf("Loading addresses...\n");
130 if (!LoadAddresses()) printf("Warning: error loading addr.dat\n");
131 printf("Loading block index...\n"); 129 printf("Loading block index...\n");
132 string strErrors; 130 string strErrors;
133 if (!LoadBlockIndex()) { fprintf(stderr,"LoadBlockIndex failed\n"); return 1; } 131 if (!LoadBlockIndex()) { fprintf(stderr,"LoadBlockIndex failed\n"); return 1; }
diff --git a/src/makefile.linux b/src/makefile.linux
deleted file mode 100644
index 9e63f7d..0000000
--- a/src/makefile.linux
+++ /dev/null
@@ -1,55 +0,0 @@
1# Bitflash Linux build — GUI wallet + pool server + daemon mode.
2# Requires: bash build-linux.sh (installs deps, builds secp256k1 + RandomX)
3# Result: src/bitflash
4#
5# ./bitflash — GUI wallet
6# ./bitflash /nogui /gen — headless daemon (same binary, no window)
7
8CXX ?= g++
9
10SECP_INC ?= /usr/local/include
11SECP_LIB ?= /usr/local/lib
12RANDOMX_DIR ?= $(HOME)/RandomX
13
14WX_CFLAGS := $(shell wx-config --cxxflags)
15WX_LIBS := $(shell wx-config --libs)
16
17CXXFLAGS = -std=gnu++14 -O2 -w -fpermissive -pthread \
18 -DSECP256K1_STATIC \
19 -I$(SECP_INC) -I$(RANDOMX_DIR)/src \
20 -I/usr/include/nlohmann \
21 $(WX_CFLAGS)
22
23LIBS = -L$(SECP_LIB) -lsecp256k1 \
24 -L$(RANDOMX_DIR)/build -lrandomx \
25 -lsodium -lssl -lcrypto -ldb_cxx -lpthread \
26 -lboost_system \
27 $(WX_LIBS)
28
29HEADERS = headers.h util.h main.h serialize.h uint256.h key.h bignum.h script.h \
30 db.h base58.h net.h irc.h nostr.h randomx_pow.h btfaddr.h btfchan.h \
31 btfrv.h btftunnel.h market.h compat.h uibase.h ui.h
32
33OBJS = obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o obj/market.o \
34 obj/sha.o obj/irc.o obj/nostr.o obj/randomx_pow.o \
35 obj/btfaddr.o obj/btfchan.o obj/btfrv.o obj/btftunnel.o \
36 obj/rpc.o obj/uibase.o obj/ui.o
37
38all: bitflash
39
40obj/%.o: %.cpp $(HEADERS)
41 @mkdir -p obj
42 $(CXX) -c $(CXXFLAGS) -o $@ $<
43
44obj/sha.o: sha.cpp sha.h
45 @mkdir -p obj
46 $(CXX) -c $(CXXFLAGS) -O3 -o $@ $<
47
48bitflash: $(OBJS)
49 $(CXX) $(CXXFLAGS) -o $@ $(OBJS) $(LIBS)
50 @echo "Built: bitflash"
51 @echo " GUI: ./bitflash"
52 @echo " Daemon: ./bitflash /nogui /gen"
53
54clean:
55 rm -rf obj bitflash
diff --git a/src/makefile.mingw b/src/makefile.mingw
index d381653..7d35d92 100644
--- a/src/makefile.mingw
+++ b/src/makefile.mingw
@@ -28,13 +28,13 @@ IMGUI_OBJS = obj/imgui.o obj/imgui_draw.o obj/imgui_tables.o \
28 obj/imgui_widgets.o obj/imgui_impl_glfw.o obj/imgui_impl_opengl3.o 28 obj/imgui_widgets.o obj/imgui_impl_glfw.o obj/imgui_impl_opengl3.o
29 29
30NODE_OBJS = obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o \ 30NODE_OBJS = obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o \
31 obj/market.o obj/sha.o obj/irc.o obj/nostr.o obj/randomx_pow.o \ 31 obj/market.o obj/sha.o obj/nostr.o obj/randomx_pow.o \
32 obj/btfaddr.o obj/btfchan.o obj/btfrv.o obj/btftunnel.o obj/rpc.o 32 obj/btfaddr.o obj/btfchan.o obj/btfrv.o obj/btftunnel.o obj/rpc.o
33 33
34GUI_OBJS = obj/gui.o obj/main_gui.o obj/bitflash_res.o 34GUI_OBJS = obj/gui.o obj/main_gui.o obj/bitflash_res.o
35 35
36HEADERS = headers_core.h headers.h util.h main.h serialize.h uint256.h \ 36HEADERS = headers_core.h headers.h util.h main.h serialize.h uint256.h \
37 key.h bignum.h script.h db.h base58.h net.h irc.h nostr.h \ 37 key.h bignum.h script.h db.h base58.h net.h nostr.h \
38 randomx_pow.h btfaddr.h btfchan.h btfrv.h btftunnel.h market.h 38 randomx_pow.h btfaddr.h btfchan.h btfrv.h btftunnel.h market.h
39 39
40all: bitflash.exe 40all: bitflash.exe
diff --git a/src/makefile.vc b/src/makefile.vc
deleted file mode 100644
index 60dca78..0000000
--- a/src/makefile.vc
+++ /dev/null
@@ -1,77 +0,0 @@
1# Copyright (c) 2009 Satoshi Nakamoto
2# Distributed under the MIT/X11 software license, see the accompanying
3# file license.txt or http://www.opensource.org/licenses/mit-license.php.
4
5
6!IF "$(BUILD)" != "debug" && "$(BUILD)" != "release"
7BUILD=debug
8!ENDIF
9!IF "$(BUILD)" == "debug"
10D=d
11DEBUGFLAGS=/Zi /Od /D__WXDEBUG__
12!ENDIF
13
14
15
16INCLUDEPATHS=/I"/boost" /I"/DB/build_windows" /I"/OpenSSL/include" /I"/wxWidgets/lib/vc_lib/mswd" /I"/wxWidgets/include"
17LIBPATHS=/LIBPATH:"/DB/build_windows/$(BUILD)" /LIBPATH:"/OpenSSL/out" /LIBPATH:"/wxWidgets/lib/vc_lib"
18LIBS= \
19 libdb47s$(D).lib \
20 libeay32.lib \
21 wxmsw28$(D)_richtext.lib wxmsw28$(D)_html.lib wxmsw28$(D)_core.lib wxbase28$(D).lib wxtiff$(D).lib wxjpeg$(D).lib wxpng$(D).lib wxzlib$(D).lib wxregex$(D).lib wxexpat$(D).lib \
22 kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib ws2_32.lib
23WXDEFS=/DWIN32 /D__WXMSW__ /D_WINDOWS /DNOPCH
24CFLAGS=/c /nologo /Ob0 /MD$(D) /EHsc /GR /Zm300 /YX /Fpobj/headers.pch $(DEBUGFLAGS) $(WXDEFS) $(INCLUDEPATHS)
25HEADERS=headers.h util.h main.h serialize.h uint256.h key.h bignum.h script.h db.h base58.h
26
27
28
29all: bitcoin.exe
30
31
32obj\util.obj: util.cpp $(HEADERS)
33 cl $(CFLAGS) /Fo$@ %s
34
35obj\script.obj: script.cpp $(HEADERS)
36 cl $(CFLAGS) /Fo$@ %s
37
38obj\db.obj: db.cpp $(HEADERS) market.h
39 cl $(CFLAGS) /Fo$@ %s
40
41obj\net.obj: net.cpp $(HEADERS) net.h
42 cl $(CFLAGS) /Fo$@ %s
43
44obj\main.obj: main.cpp $(HEADERS) net.h market.h
45 cl $(CFLAGS) /Fo$@ %s
46
47obj\market.obj: market.cpp $(HEADERS) market.h
48 cl $(CFLAGS) /Fo$@ %s
49
50obj\ui.obj: ui.cpp $(HEADERS) net.h uibase.h ui.h market.h
51 cl $(CFLAGS) /Fo$@ %s
52
53obj\uibase.obj: uibase.cpp uibase.h
54 cl $(CFLAGS) /Fo$@ %s
55
56obj\sha.obj: sha.cpp sha.h
57 cl $(CFLAGS) /O2 /Fo$@ %s
58
59obj\irc.obj: irc.cpp $(HEADERS)
60 cl $(CFLAGS) /Fo$@ %s
61
62obj\ui.res: ui.rc rc/bitcoin.ico rc/check.ico rc/send16.bmp rc/send16mask.bmp rc/send16masknoshadow.bmp rc/send20.bmp rc/send20mask.bmp rc/addressbook16.bmp rc/addressbook16mask.bmp rc/addressbook20.bmp rc/addressbook20mask.bmp
63 rc $(INCLUDEPATHS) $(WXDEFS) /Fo$@ %s
64
65
66
67OBJS=obj\util.obj obj\script.obj obj\db.obj obj\net.obj obj\main.obj obj\market.obj \
68 obj\ui.obj obj\uibase.obj obj\sha.obj obj\irc.obj obj\ui.res
69
70bitcoin.exe: $(OBJS)
71 -kill /f bitcoin.exe & sleep 1
72 link /nologo /DEBUG /SUBSYSTEM:WINDOWS /OUT:$@ $(LIBPATHS) $** $(LIBS)
73
74clean:
75 -del /Q obj\*
76 -del *.ilk
77 -del *.pdb
diff --git a/src/net.cpp b/src/net.cpp
index bdfb9c3..ab07f94 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -12,7 +12,6 @@
12 12
13void ThreadMessageHandler2(void* parg); 13void ThreadMessageHandler2(void* parg);
14void ThreadSocketHandler2(void* parg); 14void ThreadSocketHandler2(void* parg);
15void ThreadOpenConnections2(void* parg);
16 15
17 16
18 17
@@ -32,8 +31,6 @@ bool fShutdown = false;
32array<bool, 10> vfThreadRunning; 31array<bool, 10> vfThreadRunning;
33vector<CNode*> vNodes; 32vector<CNode*> vNodes;
34CCriticalSection cs_vNodes; 33CCriticalSection cs_vNodes;
35map<vector<unsigned char>, CAddress> mapAddresses;
36CCriticalSection cs_mapAddresses;
37map<CInv, CDataStream> mapRelay; 34map<CInv, CDataStream> mapRelay;
38deque<pair<int64, CInv> > vRelayExpiration; 35deque<pair<int64, CInv> > vRelayExpiration;
39CCriticalSection cs_mapRelay; 36CCriticalSection cs_mapRelay;
@@ -41,61 +38,6 @@ map<CInv, int64> mapAlreadyAskedFor;
41string strBtfConnect; // .btf peer to keep connected to (from /connectbtf) 38string strBtfConnect; // .btf peer to keep connected to (from /connectbtf)
42 39
43 40
44
45CAddress addrProxy;
46
47bool ConnectSocket(const CAddress& addrConnect, SOCKET& hSocketRet)
48{
49 hSocketRet = INVALID_SOCKET;
50
51 SOCKET hSocket = socket(AF_INET, SOCK_STREAM, 0);
52 if (hSocket == INVALID_SOCKET)
53 return false;
54
55 bool fRoutable = !(addrConnect.GetByte(3) == 10 || (addrConnect.GetByte(3) == 192 && addrConnect.GetByte(2) == 168));
56 bool fProxy = (addrProxy.ip && fRoutable);
57 struct sockaddr_in sockaddr = (fProxy ? addrProxy.GetSockAddr() : addrConnect.GetSockAddr());
58
59 if (connect(hSocket, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == SOCKET_ERROR)
60 {
61 closesocket(hSocket);
62 return false;
63 }
64
65 if (fProxy)
66 {
67 printf("Proxy connecting to %s\n", addrConnect.ToString().c_str());
68 char pszSocks4IP[] = "\4\1\0\0\0\0\0\0user";
69 memcpy(pszSocks4IP + 2, &addrConnect.port, 2);
70 memcpy(pszSocks4IP + 4, &addrConnect.ip, 4);
71 char* pszSocks4 = pszSocks4IP;
72 int nSize = sizeof(pszSocks4IP);
73
74 int ret = send(hSocket, pszSocks4, nSize, 0);
75 if (ret != nSize)
76 {
77 closesocket(hSocket);
78 return error("Error sending to proxy\n");
79 }
80 char pchRet[8];
81 if (recv(hSocket, pchRet, 8, 0) != 8)
82 {
83 closesocket(hSocket);
84 return error("Error reading proxy response\n");
85 }
86 if (pchRet[1] != 0x5a)
87 {
88 closesocket(hSocket);
89 return error("Proxy returned error %d\n", pchRet[1]);
90 }
91 printf("Proxy connection established %s\n", addrConnect.ToString().c_str());
92 }
93
94 hSocketRet = hSocket;
95 return true;
96}
97
98
99bool GetMyExternalIP(unsigned int& ipRet) 41bool GetMyExternalIP(unsigned int& ipRet)
100{ 42{
101 // Try several plain-text IP echo services in order. 43 // Try several plain-text IP echo services in order.
@@ -178,38 +120,6 @@ bool GetMyExternalIP(unsigned int& ipRet)
178 120
179 121
180 122
181bool AddAddress(CAddrDB& addrdb, const CAddress& addr)
182{
183 if (!addr.IsRoutable())
184 return false;
185 if (addr.ip == addrLocalHost.ip)
186 return false;
187 CRITICAL_BLOCK(cs_mapAddresses)
188 {
189 map<vector<unsigned char>, CAddress>::iterator it = mapAddresses.find(addr.GetKey());
190 if (it == mapAddresses.end())
191 {
192 // New address
193 mapAddresses.insert(make_pair(addr.GetKey(), addr));
194 addrdb.WriteAddress(addr);
195 return true;
196 }
197 else
198 {
199 CAddress& addrFound = (*it).second;
200 if ((addrFound.nServices | addr.nServices) != addrFound.nServices)
201 {
202 // Services have been added
203 addrFound.nServices |= addr.nServices;
204 addrdb.WriteAddress(addrFound);
205 return true;
206 }
207 }
208 }
209 return false;
210}
211
212
213 123
214 124
215 125
@@ -330,64 +240,6 @@ CNode* FindNode(unsigned int ip)
330 return NULL; 240 return NULL;
331} 241}
332 242
333CNode* FindNode(CAddress addr)
334{
335 CRITICAL_BLOCK(cs_vNodes)
336 {
337 foreach(CNode* pnode, vNodes)
338 if (pnode->addr == addr)
339 return (pnode);
340 }
341 return NULL;
342}
343
344CNode* ConnectNode(CAddress addrConnect, int64 nTimeout)
345{
346 if (addrConnect.ip == addrLocalHost.ip)
347 return NULL;
348
349 // Look for an existing connection
350 CNode* pnode = FindNode(addrConnect.ip);
351 if (pnode)
352 {
353 if (nTimeout != 0)
354 pnode->AddRef(nTimeout);
355 else
356 pnode->AddRef();
357 return pnode;
358 }
359
360 if (fDebug)
361 printf("trying %s\n", addrConnect.ToString().c_str());
362
363 // Connect
364 SOCKET hSocket;
365 if (ConnectSocket(addrConnect, hSocket))
366 {
367 if (fDebug)
368 printf("connected %s\n", addrConnect.ToString().c_str());
369
370 // Add node
371 CNode* pnode = new CNode(hSocket, addrConnect, false);
372 if (nTimeout != 0)
373 pnode->AddRef(nTimeout);
374 else
375 pnode->AddRef();
376 CRITICAL_BLOCK(cs_vNodes)
377 vNodes.push_back(pnode);
378
379 CRITICAL_BLOCK(cs_mapAddresses)
380 mapAddresses[addrConnect.GetKey()].nLastFailed = 0;
381 return pnode;
382 }
383 else
384 {
385 CRITICAL_BLOCK(cs_mapAddresses)
386 mapAddresses[addrConnect.GetKey()].nLastFailed = GetTime();
387 return NULL;
388 }
389}
390
391// Synthetic marker address for a tunneled `.btf` peer. The real endpoint is 243// Synthetic marker address for a tunneled `.btf` peer. The real endpoint is
392// unknown by design (the tunnel hides it), so tag the CNode with a non-routable 244// unknown by design (the tunnel hides it), so tag the CNode with a non-routable
393// 10.x.x.x address (fails IsRoutable, so it is never gossiped as a real peer) 245// 10.x.x.x address (fails IsRoutable, so it is never gossiped as a real peer)
@@ -401,20 +253,15 @@ static CAddress BtfMarkerAddr(const unsigned char b5[5])
401 return CAddress(ip, port, nLocalServices); 253 return CAddress(ip, port, nLocalServices);
402} 254}
403 255
404// Connect to a peer by its `.btf` address: resolve the self-certified 256// Shared tail: given a peer's pubkey and already-resolved rendezvous
405// descriptor over Nostr, then tunnel through its meeting node with the 257// coordinates, open the tunnel and register the CNode. Used by both
406// end-to-end channel. Neither side ever learns the other's IP. 258// ConnectNodeBtf (which resolves the descriptor itself) and
407CNode* ConnectNodeBtf(const string& strBtfAddr) 259// ConnectNodeBtfResolved (which takes an already-resolved descriptor, so it
260// makes no Nostr relay calls at all -- see nostr.cpp's BtfResolveMany for why
261// that matters when dialing many candidates in parallel).
262static CNode* ConnectNodeBtfTail(const string& strBtfAddr, const unsigned char pk[32],
263 const string& strMeeting, const unsigned char enc_pub[32])
408{ 264{
409 unsigned char pk[32];
410 if (!btf::ParseAddress(strBtfAddr, pk))
411 {
412 printf("ConnectNodeBtf: invalid address %s\n", strBtfAddr.c_str());
413 return NULL;
414 }
415 if (BtfLocalAddress() == strBtfAddr)
416 return NULL; // ourselves
417
418 CAddress addr = BtfMarkerAddr(pk); 265 CAddress addr = BtfMarkerAddr(pk);
419 CNode* pnode = FindNode(addr.ip); 266 CNode* pnode = FindNode(addr.ip);
420 if (pnode) 267 if (pnode)
@@ -423,17 +270,6 @@ CNode* ConnectNodeBtf(const string& strBtfAddr)
423 return pnode; 270 return pnode;
424 } 271 }
425 272
426 if (fDebug)
427 printf("trying %s\n", strBtfAddr.c_str());
428
429 string strMeeting;
430 unsigned char enc_pub[32];
431 if (!BtfResolve(strBtfAddr, strMeeting, enc_pub))
432 {
433 if (fDebug)
434 printf("ConnectNodeBtf: could not resolve a descriptor for %s\n", strBtfAddr.c_str());
435 return NULL;
436 }
437 size_t colon = strMeeting.rfind(':'); 273 size_t colon = strMeeting.rfind(':');
438 if (colon == string::npos) 274 if (colon == string::npos)
439 return NULL; 275 return NULL;
@@ -446,12 +282,12 @@ CNode* ConnectNodeBtf(const string& strBtfAddr)
446 if (hSocket == INVALID_SOCKET) 282 if (hSocket == INVALID_SOCKET)
447 { 283 {
448 if (fDebug) 284 if (fDebug)
449 printf("ConnectNodeBtf: tunnel to %s via %s failed\n", strBtfAddr.c_str(), strMeeting.c_str()); 285 LogPrint("net", "ConnectNodeBtf: tunnel to %s via %s failed\n", strBtfAddr.c_str(), strMeeting.c_str());
450 return NULL; 286 return NULL;
451 } 287 }
452 288
453 if (fDebug) 289 if (fDebug)
454 printf("connected %s via rendezvous %s\n", strBtfAddr.c_str(), strMeeting.c_str()); 290 LogPrint("net", "connected %s via rendezvous %s\n", strBtfAddr.c_str(), strMeeting.c_str());
455 291
456 // Add node 292 // Add node
457 pnode = new CNode(hSocket, addr, false); 293 pnode = new CNode(hSocket, addr, false);
@@ -461,6 +297,53 @@ CNode* ConnectNodeBtf(const string& strBtfAddr)
461 return pnode; 297 return pnode;
462} 298}
463 299
300// Connect to a peer by its `.btf` address: resolve the self-certified
301// descriptor over Nostr, then tunnel through its meeting node with the
302// end-to-end channel. Neither side ever learns the other's IP.
303CNode* ConnectNodeBtf(const string& strBtfAddr)
304{
305 unsigned char pk[32];
306 if (!btf::ParseAddress(strBtfAddr, pk))
307 {
308 LogPrint("net", "ConnectNodeBtf: invalid address %s\n", strBtfAddr.c_str());
309 return NULL;
310 }
311 if (BtfLocalAddress() == strBtfAddr)
312 return NULL; // ourselves
313
314 if (fDebug)
315 LogPrint("net", "trying %s\n", strBtfAddr.c_str());
316
317 string strMeeting;
318 unsigned char enc_pub[32];
319 if (!BtfResolve(strBtfAddr, strMeeting, enc_pub))
320 {
321 if (fDebug)
322 LogPrint("net", "ConnectNodeBtf: could not resolve a descriptor for %s\n", strBtfAddr.c_str());
323 return NULL;
324 }
325 return ConnectNodeBtfTail(strBtfAddr, pk, strMeeting, enc_pub);
326}
327
328// Same as ConnectNodeBtf, but skips the Nostr resolve step because the caller
329// already resolved the descriptor (e.g. via BtfResolveMany, batching many
330// addresses into one relay round-trip instead of one relay round-trip per
331// address). Makes zero relay connections -- only talks to the peer's
332// rendezvous meeting node.
333CNode* ConnectNodeBtfResolved(const string& strBtfAddr, const string& strMeeting,
334 const unsigned char enc_pub[32])
335{
336 unsigned char pk[32];
337 if (!btf::ParseAddress(strBtfAddr, pk))
338 {
339 LogPrint("net", "ConnectNodeBtf: invalid address %s\n", strBtfAddr.c_str());
340 return NULL;
341 }
342 if (BtfLocalAddress() == strBtfAddr)
343 return NULL; // ourselves
344 return ConnectNodeBtfTail(strBtfAddr, pk, strMeeting, enc_pub);
345}
346
464// Anonymous inbound listener (this node's `.btf` hidden service). Registers at 347// Anonymous inbound listener (this node's `.btf` hidden service). Registers at
465// the meeting relay and blocks until a client dials our address; each pairing 348// the meeting relay and blocks until a client dials our address; each pairing
466// becomes a normal inbound CNode riding the end-to-end channel, then we 349// becomes a normal inbound CNode riding the end-to-end channel, then we
@@ -535,7 +418,7 @@ void ThreadBtfAccept(void* parg)
535 RAND_bytes(rnd, sizeof(rnd)); 418 RAND_bytes(rnd, sizeof(rnd));
536 CAddress addr = BtfMarkerAddr(rnd); 419 CAddress addr = BtfMarkerAddr(rnd);
537 420
538 printf("accepted .btf connection via rendezvous %s\n", strMeeting.c_str()); 421 LogPrint("net", "accepted .btf connection via rendezvous %s\n", strMeeting.c_str());
539 CNode* pnode = new CNode(hSocket, addr, true); 422 CNode* pnode = new CNode(hSocket, addr, true);
540 pnode->AddRef(); 423 pnode->AddRef();
541 CRITICAL_BLOCK(cs_vNodes) 424 CRITICAL_BLOCK(cs_vNodes)
@@ -574,7 +457,7 @@ void ThreadBtfConnect(void* parg)
574 457
575void CNode::Disconnect() 458void CNode::Disconnect()
576{ 459{
577 printf("disconnecting node %s\n", addr.ToString().c_str()); 460 LogPrint("net", "disconnecting node %s\n", addr.ToString().c_str());
578 461
579 closesocket(hSocket); 462 closesocket(hSocket);
580 463
@@ -653,7 +536,7 @@ void ThreadSocketHandler2(void* parg)
653 536
654 if (pnodeExtra->GetRefCount() <= (pnodeExtra->fNetworkNode ? 1 : 0)) 537 if (pnodeExtra->GetRefCount() <= (pnodeExtra->fNetworkNode ? 1 : 0))
655 { 538 {
656 printf("(%d nodes) disconnecting duplicate: %s\n", vNodes.size(), pnodeExtra->addr.ToString().c_str()); 539 LogPrint("net", "(%d nodes) disconnecting duplicate: %s\n", vNodes.size(), pnodeExtra->addr.ToString().c_str());
657 if (pnodeExtra->fNetworkNode && !pnode->fNetworkNode) 540 if (pnodeExtra->fNetworkNode && !pnode->fNetworkNode)
658 { 541 {
659 pnode->AddRef(); 542 pnode->AddRef();
@@ -745,7 +628,7 @@ void ThreadSocketHandler2(void* parg)
745 if (nSelect == SOCKET_ERROR) 628 if (nSelect == SOCKET_ERROR)
746 { 629 {
747 int nErr = WSAGetLastError(); 630 int nErr = WSAGetLastError();
748 printf("select failed: %d\n", nErr); 631 LogPrint("net", "select failed: %d\n", nErr);
749 for (int i = 0; i <= hSocketMax; i++) 632 for (int i = 0; i <= hSocketMax; i++)
750 { 633 {
751 FD_SET(i, &fdsetRecv); 634 FD_SET(i, &fdsetRecv);
@@ -784,7 +667,7 @@ void ThreadSocketHandler2(void* parg)
784 } 667 }
785 else 668 else
786 { 669 {
787 printf("accepted connection from %s\n", addr.ToString().c_str()); 670 LogPrint("net", "accepted connection from %s\n", addr.ToString().c_str());
788 CNode* pnode = new CNode(hSocket, addr, true); 671 CNode* pnode = new CNode(hSocket, addr, true);
789 pnode->AddRef(); 672 pnode->AddRef();
790 CRITICAL_BLOCK(cs_vNodes) 673 CRITICAL_BLOCK(cs_vNodes)
@@ -823,7 +706,7 @@ void ThreadSocketHandler2(void* parg)
823 { 706 {
824 // socket closed gracefully 707 // socket closed gracefully
825 if (!pnode->fDisconnect) 708 if (!pnode->fDisconnect)
826 printf("recv: socket closed\n"); 709 LogPrint("net", "recv: socket closed\n");
827 pnode->fDisconnect = true; 710 pnode->fDisconnect = true;
828 } 711 }
829 else if (nBytes < 0) 712 else if (nBytes < 0)
@@ -833,7 +716,7 @@ void ThreadSocketHandler2(void* parg)
833 if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS) 716 if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS)
834 { 717 {
835 if (!pnode->fDisconnect) 718 if (!pnode->fDisconnect)
836 printf("recv failed: %d\n", nErr); 719 LogPrint("net", "recv failed: %d\n", nErr);
837 pnode->fDisconnect = true; 720 pnode->fDisconnect = true;
838 } 721 }
839 } 722 }
@@ -862,7 +745,7 @@ void ThreadSocketHandler2(void* parg)
862 } 745 }
863 else 746 else
864 { 747 {
865 printf("send error %d\n", nBytes); 748 LogPrint("net", "send error %d\n", nBytes);
866 if (pnode->ReadyToDisconnect()) 749 if (pnode->ReadyToDisconnect())
867 pnode->vSend.clear(); 750 pnode->vSend.clear();
868 } 751 }
@@ -885,141 +768,6 @@ void ThreadSocketHandler2(void* parg)
885 768
886 769
887 770
888void ThreadOpenConnections(void* parg)
889{
890 IMPLEMENT_RANDOMIZE_STACK(ThreadOpenConnections(parg));
891
892 loop
893 {
894 vfThreadRunning[1] = true;
895 CheckForShutdown(1);
896 try
897 {
898 ThreadOpenConnections2(parg);
899 }
900 CATCH_PRINT_EXCEPTION("ThreadOpenConnections()")
901 vfThreadRunning[1] = false;
902 Sleep(5000);
903 }
904}
905
906void ThreadOpenConnections2(void* parg)
907{
908 printf("ThreadOpenConnections started\n");
909
910 // Initiate network connections
911 const int nMaxConnections = 15;
912 loop
913 {
914 // Wait
915 vfThreadRunning[1] = false;
916 Sleep(500);
917 while (vNodes.size() >= nMaxConnections || vNodes.size() >= mapAddresses.size())
918 {
919 CheckForShutdown(1);
920 Sleep(2000);
921 }
922 vfThreadRunning[1] = true;
923 CheckForShutdown(1);
924
925
926 // Make a list of unique class C's
927 unsigned char pchIPCMask[4] = { 0xff, 0xff, 0xff, 0x00 };
928 unsigned int nIPCMask = *(unsigned int*)pchIPCMask;
929 vector<unsigned int> vIPC;
930 CRITICAL_BLOCK(cs_mapAddresses)
931 {
932 vIPC.reserve(mapAddresses.size());
933 unsigned int nPrev = 0;
934 foreach(const PAIRTYPE(vector<unsigned char>, CAddress)& item, mapAddresses)
935 {
936 const CAddress& addr = item.second;
937 if (!addr.IsIPv4())
938 continue;
939
940 // Taking advantage of mapAddresses being in sorted order,
941 // with IPs of the same class C grouped together.
942 unsigned int ipC = addr.ip & nIPCMask;
943 if (ipC != nPrev)
944 vIPC.push_back(nPrev = ipC);
945 }
946 }
947
948 //
949 // The IP selection process is designed to limit vulnerability to address flooding.
950 // Any class C (a.b.c.?) has an equal chance of being chosen, then an IP is
951 // chosen within the class C. An attacker may be able to allocate many IPs, but
952 // they would normally be concentrated in blocks of class C's. They can hog the
953 // attention within their class C, but not the whole IP address space overall.
954 // A lone node in a class C will get as much attention as someone holding all 255
955 // IPs in another class C.
956 //
957 bool fSuccess = false;
958 int nLimit = vIPC.size();
959 while (!fSuccess && nLimit-- > 0)
960 {
961 // Choose a random class C
962 unsigned int ipC = vIPC[GetRand(vIPC.size())];
963
964 // Organize all addresses in the class C by IP
965 map<unsigned int, vector<CAddress> > mapIP;
966 CRITICAL_BLOCK(cs_mapAddresses)
967 {
968 unsigned int nDelay = ((30 * 60) << vNodes.size());
969 if (nDelay > 8 * 60 * 60)
970 nDelay = 8 * 60 * 60;
971 for (map<vector<unsigned char>, CAddress>::iterator mi = mapAddresses.lower_bound(CAddress(ipC, 0).GetKey());
972 mi != mapAddresses.upper_bound(CAddress(ipC | ~nIPCMask, 0xffff).GetKey());
973 ++mi)
974 {
975 const CAddress& addr = (*mi).second;
976 unsigned int nRandomizer = (addr.nLastFailed * addr.ip * 7777U) % 20000;
977 if (GetTime() - addr.nLastFailed > nDelay * nRandomizer / 10000)
978 mapIP[addr.ip].push_back(addr);
979 }
980 }
981 if (mapIP.empty())
982 break;
983
984 // Choose a random IP in the class C
985 map<unsigned int, vector<CAddress> >::iterator mi = mapIP.begin();
986 advance(mi, GetRand(mapIP.size()));
987
988 // Once we've chosen an IP, we'll try every given port before moving on
989 foreach(const CAddress& addrConnect, (*mi).second)
990 {
991 if (addrConnect.ip == addrLocalHost.ip || !addrConnect.IsIPv4() || FindNode(addrConnect.ip))
992 continue;
993
994 CNode* pnode = ConnectNode(addrConnect);
995 if (!pnode)
996 continue;
997 pnode->fNetworkNode = true;
998
999 if (addrLocalHost.IsRoutable())
1000 {
1001 // Advertise our address
1002 vector<CAddress> vAddrToSend;
1003 vAddrToSend.push_back(addrLocalHost);
1004 pnode->PushMessage("addr", vAddrToSend);
1005 }
1006
1007 // Get as many addresses as we can
1008 pnode->PushMessage("getaddr");
1009
1010 ////// should the one on the receiving end do this too?
1011 // Subscribe our local subscription list
1012 const unsigned int nHops = 0;
1013 for (unsigned int nChannel = 0; nChannel < pnodeLocalHost->vfSubscribe.size(); nChannel++)
1014 if (pnodeLocalHost->vfSubscribe[nChannel])
1015 pnode->PushMessage("subscribe", nChannel, nHops);
1016
1017 fSuccess = true;
1018 break;
1019 }
1020 }
1021 }
1022}
1023 771
1024 772
1025 773
@@ -1187,7 +935,7 @@ bool StartNode(string& strError)
1187 return false; 935 return false;
1188 } 936 }
1189 937
1190 // Get our external IP in a background thread — up to 4 HTTP requests with 938 // Get our external IP in a background thread -- up to 4 HTTP requests with
1191 // 5s timeouts each could otherwise delay startup by 20s on first run. 939 // 5s timeouts each could otherwise delay startup by 20s on first run.
1192 // addrIncoming from a previous session is used immediately as a fallback. 940 // addrIncoming from a previous session is used immediately as a fallback.
1193 if (addrIncoming.ip) 941 if (addrIncoming.ip)
@@ -1228,13 +976,6 @@ bool StartNode(string& strError)
1228 return false; 976 return false;
1229 } 977 }
1230 978
1231 if (_beginthread(ThreadOpenConnections, 0, NULL) == -1)
1232 {
1233 strError = "Error: _beginthread(ThreadOpenConnections) failed";
1234 printf("%s\n", strError.c_str());
1235 return false;
1236 }
1237
1238 if (_beginthread(ThreadMessageHandler, 0, NULL) == -1) 979 if (_beginthread(ThreadMessageHandler, 0, NULL) == -1)
1239 { 980 {
1240 strError = "Error: _beginthread(ThreadMessageHandler) failed"; 981 strError = "Error: _beginthread(ThreadMessageHandler) failed";
diff --git a/src/net.h b/src/net.h
index e732eb3..f028c3b 100644
--- a/src/net.h
+++ b/src/net.h
@@ -22,12 +22,10 @@ enum
22 22
23 23
24 24
25bool ConnectSocket(const CAddress& addrConnect, SOCKET& hSocketRet);
26bool GetMyExternalIP(unsigned int& ipRet); 25bool GetMyExternalIP(unsigned int& ipRet);
27bool AddAddress(CAddrDB& addrdb, const CAddress& addr);
28CNode* FindNode(unsigned int ip);
29CNode* ConnectNode(CAddress addrConnect, int64 nTimeout=0);
30CNode* ConnectNodeBtf(const string& strBtfAddr); 26CNode* ConnectNodeBtf(const string& strBtfAddr);
27CNode* ConnectNodeBtfResolved(const string& strBtfAddr, const string& strMeeting,
28 const unsigned char enc_pub[32]);
31void ThreadBtfAccept(void* parg); 29void ThreadBtfAccept(void* parg);
32void ThreadBtfConnect(void* parg); 30void ThreadBtfConnect(void* parg);
33extern string strBtfConnect; 31extern string strBtfConnect;
@@ -120,7 +118,7 @@ public:
120 // Message size 118 // Message size
121 if (nMessageSize > 0x10000000) 119 if (nMessageSize > 0x10000000)
122 { 120 {
123 printf("CMessageHeader::IsValid() : nMessageSize too large %u\n", nMessageSize); 121 if (LogAcceptsCategory("net")) printf("CMessageHeader::IsValid() : nMessageSize too large %u\n", nMessageSize);
124 return false; 122 return false;
125 } 123 }
126 124
@@ -294,7 +292,7 @@ public:
294 292
295 void print() const 293 void print() const
296 { 294 {
297 printf("CAddress(%s)\n", ToString().c_str()); 295 if (LogAcceptsCategory("net")) printf("CAddress(%s)\n", ToString().c_str());
298 } 296 }
299}; 297};
300 298
@@ -387,7 +385,7 @@ public:
387 385
388 void print() const 386 void print() const
389 { 387 {
390 printf("CInv(%s)\n", ToString().c_str()); 388 if (LogAcceptsCategory("net")) printf("CInv(%s)\n", ToString().c_str());
391 } 389 }
392}; 390};
393 391
@@ -426,13 +424,10 @@ extern bool fShutdown;
426extern array<bool, 10> vfThreadRunning; 424extern array<bool, 10> vfThreadRunning;
427extern vector<CNode*> vNodes; 425extern vector<CNode*> vNodes;
428extern CCriticalSection cs_vNodes; 426extern CCriticalSection cs_vNodes;
429extern map<vector<unsigned char>, CAddress> mapAddresses;
430extern CCriticalSection cs_mapAddresses;
431extern map<CInv, CDataStream> mapRelay; 427extern map<CInv, CDataStream> mapRelay;
432extern deque<pair<int64, CInv> > vRelayExpiration; 428extern deque<pair<int64, CInv> > vRelayExpiration;
433extern CCriticalSection cs_mapRelay; 429extern CCriticalSection cs_mapRelay;
434extern map<CInv, int64> mapAlreadyAskedFor; 430extern map<CInv, int64> mapAlreadyAskedFor;
435extern CAddress addrProxy;
436 431
437 432
438 433
@@ -462,10 +457,6 @@ public:
462 map<uint256, CRequestTracker> mapRequests; 457 map<uint256, CRequestTracker> mapRequests;
463 CCriticalSection cs_mapRequests; 458 CCriticalSection cs_mapRequests;
464 459
465 // flood
466 vector<CAddress> vAddrToSend;
467 set<CAddress> setAddrKnown;
468
469 // inventory based relay 460 // inventory based relay
470 set<CInv> setInventoryKnown; 461 set<CInv> setInventoryKnown;
471 set<CInv> setInventoryKnown2; 462 set<CInv> setInventoryKnown2;
@@ -555,7 +546,7 @@ public:
555 // We're using mapAskFor as a priority queue, 546 // We're using mapAskFor as a priority queue,
556 // the key is the earliest time the request can be sent 547 // the key is the earliest time the request can be sent
557 int64& nRequestTime = mapAlreadyAskedFor[inv]; 548 int64& nRequestTime = mapAlreadyAskedFor[inv];
558 printf("askfor %s %lld\n", inv.ToString().c_str(), nRequestTime); 549 if (LogAcceptsCategory("net")) printf("askfor %s %lld\n", inv.ToString().c_str(), nRequestTime);
559 550
560 // Make sure not to reuse time indexes to keep things in the same order 551 // Make sure not to reuse time indexes to keep things in the same order
561 int64 nNow = (GetTime() - 1) * 1000000; 552 int64 nNow = (GetTime() - 1) * 1000000;
@@ -576,7 +567,7 @@ public:
576 AbortMessage(); 567 AbortMessage();
577 nPushPos = vSend.size(); 568 nPushPos = vSend.size();
578 vSend << CMessageHeader(pszCommand, 0); 569 vSend << CMessageHeader(pszCommand, 0);
579 printf("sending: %-12s ", pszCommand); 570 if (LogAcceptsCategory("net")) printf("sending: %-12s ", pszCommand);
580 } 571 }
581 572
582 void AbortMessage() 573 void AbortMessage()
@@ -586,7 +577,7 @@ public:
586 vSend.resize(nPushPos); 577 vSend.resize(nPushPos);
587 nPushPos = -1; 578 nPushPos = -1;
588 LeaveCriticalSection(&cs_vSend); 579 LeaveCriticalSection(&cs_vSend);
589 printf("(aborted)\n"); 580 if (LogAcceptsCategory("net")) printf("(aborted)\n");
590 } 581 }
591 582
592 void EndMessage() 583 void EndMessage()
@@ -594,7 +585,7 @@ public:
594 extern int nDropMessagesTest; 585 extern int nDropMessagesTest;
595 if (nDropMessagesTest > 0 && GetRand(nDropMessagesTest) == 0) 586 if (nDropMessagesTest > 0 && GetRand(nDropMessagesTest) == 0)
596 { 587 {
597 printf("dropmessages DROPPING SEND MESSAGE\n"); 588 if (LogAcceptsCategory("net")) printf("dropmessages DROPPING SEND MESSAGE\n");
598 AbortMessage(); 589 AbortMessage();
599 return; 590 return;
600 } 591 }
@@ -606,10 +597,10 @@ public:
606 unsigned int nSize = vSend.size() - nPushPos - sizeof(CMessageHeader); 597 unsigned int nSize = vSend.size() - nPushPos - sizeof(CMessageHeader);
607 memcpy((char*)&vSend[nPushPos] + offsetof(CMessageHeader, nMessageSize), &nSize, sizeof(nSize)); 598 memcpy((char*)&vSend[nPushPos] + offsetof(CMessageHeader, nMessageSize), &nSize, sizeof(nSize));
608 599
609 printf("(%d bytes) ", nSize); 600 if (LogAcceptsCategory("net")) printf("(%d bytes) ", nSize);
610 //for (int i = nPushPos+sizeof(CMessageHeader); i < min(vSend.size(), nPushPos+sizeof(CMessageHeader)+20U); i++) 601 //for (int i = nPushPos+sizeof(CMessageHeader); i < min(vSend.size(), nPushPos+sizeof(CMessageHeader)+20U); i++)
611 // printf("%02x ", vSend[i] & 0xff); 602 // printf("%02x ", vSend[i] & 0xff);
612 printf("\n"); 603 if (LogAcceptsCategory("net")) printf("\n");
613 604
614 nPushPos = -1; 605 nPushPos = -1;
615 LeaveCriticalSection(&cs_vSend); 606 LeaveCriticalSection(&cs_vSend);
diff --git a/src/nostr.cpp b/src/nostr.cpp
index c2ccc4c..009edd1 100644
--- a/src/nostr.cpp
+++ b/src/nostr.cpp
@@ -45,7 +45,12 @@ static const int64 BTF_POOL_MAX_AGE = 3 * 60; // seconds
45 45
46// Anonymous auto-discovery: how many peers to keep connected via .btf rendezvous 46// Anonymous auto-discovery: how many peers to keep connected via .btf rendezvous
47// before we stop dialing more, and how many new dials to attempt per cycle. 47// before we stop dialing more, and how many new dials to attempt per cycle.
48static const unsigned int BTF_TARGET_CONN = 8; 48// Target outbound peer count. With ~100 known .btf peers on the network,
49// an Erdos-Renyi random graph stays connected with overwhelming probability
50// once average degree exceeds ln(N) (~4.6 here); 24 is ~5x past that
51// threshold, so this is plenty *provided* selection isn't fully correlated
52// across nodes -- see the diversity slice in ConnectDiscoveredBtfPeers.
53static const unsigned int BTF_TARGET_CONN = 24;
49static const int BTF_DIALS_PER_PASS = 12; // try more peers per Nostr cycle 54static const int BTF_DIALS_PER_PASS = 12; // try more peers per Nostr cycle
50 55
51// Nostr descriptor freshness cutoff: skip peers whose descriptor hasn't been 56// Nostr descriptor freshness cutoff: skip peers whose descriptor hasn't been
@@ -58,11 +63,27 @@ static map<string, int64> g_btfPeers;
58static CCriticalSection cs_btfPeers; 63static CCriticalSection cs_btfPeers;
59 64
60// Public discovery relays. Tunable. 65// Public discovery relays. Tunable.
66//
67// Picked for: free/public (no NIP-42 auth or payment wall), track record of
68// high uptime, and *infrastructure* diversity, not just different hostnames.
69// relay.damus.io, relay.snort.social and relay.primal.net are all fronted by
70// Cloudflare -- different operators, same upstream, so a Cloudflare-side
71// incident (or a Cloudflare IP range getting rate-limited/blocked on some
72// network) can take out several of them at once even though they look like
73// independent relays. Kept only one Cloudflare-fronted relay (damus.io, the
74// most established) and filled the rest with relays on different hosts
75// (Hetzner, various independents) so no single upstream provider is a
76// single point of failure for peer discovery. 7 relays lands inside the
77// commonly recommended 5-10 range for redundancy without keeping an
78// excessive number of persistent sockets open per node.
61const char* pszNostrRelays[] = { 79const char* pszNostrRelays[] = {
62 "wss://relay.damus.io", 80 "wss://relay.damus.io",
63 "wss://nos.lol", 81 "wss://nos.lol",
64 "wss://relay.nostr.band", 82 "wss://relay.nostr.band",
65 "wss://relay.snort.social", 83 "wss://nostr21.com",
84 "wss://offchain.pub",
85 "wss://nostr.mom",
86 "wss://relay.primal.net",
66}; 87};
67const int nNostrRelays = ARRAYLEN(pszNostrRelays); 88const int nNostrRelays = ARRAYLEN(pszNostrRelays);
68 89
@@ -317,6 +338,13 @@ std::string BtfLocalAddress()
317 return g_nostrKey.BtfAddress(); 338 return g_nostrKey.BtfAddress();
318} 339}
319 340
341int GetDiscoveredPeerCount()
342{
343 int n = 0;
344 CRITICAL_BLOCK(cs_btfPeers) { n = (int)g_btfPeers.size(); }
345 return n;
346}
347
320void BtfGetPoolAnnouncements(std::vector<BtfPoolAnnouncement>& out) 348void BtfGetPoolAnnouncements(std::vector<BtfPoolAnnouncement>& out)
321{ 349{
322 out.clear(); 350 out.clear();
@@ -425,38 +453,55 @@ public:
425 size_t colon = host.find(':'); 453 size_t colon = host.find(':');
426 if (colon != string::npos) { port = atoi(host.substr(colon + 1).c_str()); host = host.substr(0, colon); } 454 if (colon != string::npos) { port = atoi(host.substr(colon + 1).c_str()); host = host.substr(0, colon); }
427 455
428 // Resolve and connect (TCP) 456 // Resolve and connect (TCP). AF_UNSPEC so we get both A and AAAA
429 struct addrinfo hints, *res = NULL; 457 // records back and try them in the order the resolver prefers,
458 // rather than hard-failing whenever the IPv4 path to a relay is
459 // filtered/rate-limited (increasingly common for CDN-fronted
460 // relays) while a working IPv6 route exists right there in the
461 // same getaddrinfo() result.
462 struct addrinfo hints, *res = NULL, *rp = NULL;
430 memset(&hints, 0, sizeof(hints)); 463 memset(&hints, 0, sizeof(hints));
431 hints.ai_family = AF_INET; 464 hints.ai_family = AF_UNSPEC;
432 hints.ai_socktype = SOCK_STREAM; 465 hints.ai_socktype = SOCK_STREAM;
433 char portstr[16]; sprintf(portstr, "%d", port); 466 char portstr[16]; sprintf(portstr, "%d", port);
434 if (getaddrinfo(host.c_str(), portstr, &hints, &res) != 0 || !res) 467 if (getaddrinfo(host.c_str(), portstr, &hints, &res) != 0 || !res)
435 return error("Nostr: getaddrinfo %s failed", host.c_str()); 468 return error("Nostr: getaddrinfo %s failed", host.c_str());
436 hSocket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
437 if (hSocket == INVALID_SOCKET) { freeaddrinfo(res); return false; }
438 469
439 // Socket receive/send timeout: Windows takes a DWORD of milliseconds; 470 bool fConnected = false;
440 // POSIX takes a struct timeval. 471 for (rp = res; rp != NULL; rp = rp->ai_next)
472 {
473 hSocket = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
474 if (hSocket == INVALID_SOCKET)
475 continue;
476
477 // Socket receive/send timeout: Windows takes a DWORD of
478 // milliseconds; POSIX takes a struct timeval.
441#ifdef _WIN32 479#ifdef _WIN32
442 DWORD tv = timeoutSec * 1000; 480 DWORD tv = timeoutSec * 1000;
443 setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(tv)); 481 setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(tv));
444 setsockopt(hSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&tv, sizeof(tv)); 482 setsockopt(hSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&tv, sizeof(tv));
445#else 483#else
446 struct timeval tv; 484 struct timeval tv;
447 tv.tv_sec = timeoutSec; 485 tv.tv_sec = timeoutSec;
448 tv.tv_usec = 0; 486 tv.tv_usec = 0;
449 setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(tv)); 487 setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(tv));
450 setsockopt(hSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&tv, sizeof(tv)); 488 setsockopt(hSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&tv, sizeof(tv));
451#endif 489#endif
452 490
453 if (connect(hSocket, res->ai_addr, (int)res->ai_addrlen) != 0) 491 if (connect(hSocket, rp->ai_addr, (int)rp->ai_addrlen) == 0)
454 { 492 {
455 freeaddrinfo(res); 493 fConnected = true;
456 return error("Nostr: connect %s:%d failed", host.c_str(), port); 494 break;
495 }
496
497 closesocket(hSocket);
498 hSocket = INVALID_SOCKET;
457 } 499 }
458 freeaddrinfo(res); 500 freeaddrinfo(res);
459 501
502 if (!fConnected)
503 return error("Nostr: connect %s:%d failed", host.c_str(), port);
504
460 // TLS 505 // TLS
461 if (fTls) 506 if (fTls)
462 { 507 {
@@ -598,6 +643,88 @@ private:
598}; 643};
599 644
600 645
646// Persistent relay connections. Public relays (relay.damus.io in particular)
647// rate-limit new connections per source IP fairly aggressively. Before this,
648// every single operation -- self-test, per-pass seeding, batch descriptor
649// resolve, pool announce, pool query -- opened its own fresh CWebSocket,
650// meaning a single node could fire a dozen-plus brand-new TCP+TLS+WS
651// handshakes at the same 4 relays within any given minute (ThreadNostrSeed's
652// own loop plus the separate ThreadBtfPoolAnnouncer thread, each reconnecting
653// from scratch every cycle). That's exactly what was showing up as constant
654// "handshake refused by relay.damus.io" and "connect ... failed" -- not
655// necessarily dead relays, just this node getting rate-limited by its own
656// reconnect churn.
657//
658// Now every relay-touching call reuses one long-lived socket per relay via
659// this pool, reconnecting only when a socket actually drops. That cuts fresh
660// connections from several per minute down to essentially one per relay for
661// the life of the process.
662struct RelayConn
663{
664 CWebSocket ws;
665 CCriticalSection cs; // serializes use of this relay's socket
666 bool fConnected;
667 RelayConn() : fConnected(false) {}
668};
669static map<string, RelayConn*> g_relayPool;
670static CCriticalSection cs_relayPool;
671
672static RelayConn* GetRelayConn(const string& relay)
673{
674 CRITICAL_BLOCK(cs_relayPool)
675 {
676 map<string, RelayConn*>::iterator it = g_relayPool.find(relay);
677 if (it != g_relayPool.end())
678 return it->second;
679 RelayConn* rc = new RelayConn();
680 g_relayPool[relay] = rc;
681 return rc;
682 }
683 return NULL; // unreachable
684}
685
686// RAII lease on a relay's pooled connection: connects (if not already
687// connected) on construction, and on destruction either keeps the socket
688// alive for the next caller (if the exchange succeeded) or closes it so the
689// next caller reconnects instead of reusing a socket that may be wedged.
690// Caller must set fOk = true once its exchange with the relay completed
691// cleanly.
692class CRelayLease
693{
694public:
695 RelayConn* rc;
696 bool fOk;
697 bool fJustConnected; // true if this lease had to (re)connect, false if reusing a live socket
698
699 CRelayLease(const string& relay, int timeoutSec) : rc(NULL), fOk(false), fJustConnected(false)
700 {
701 rc = GetRelayConn(relay);
702 rc->cs.Enter();
703 if (!rc->fConnected)
704 {
705 rc->ws.Close();
706 rc->fConnected = rc->ws.Connect(relay, timeoutSec);
707 fJustConnected = rc->fConnected;
708 }
709 }
710 ~CRelayLease()
711 {
712 if (!fOk)
713 {
714 rc->ws.Close();
715 rc->fConnected = false;
716 }
717 rc->cs.Leave();
718 }
719 bool Connected() const { return rc->fConnected; }
720 CWebSocket& Ws() { return rc->ws; }
721
722private:
723 CRelayLease(const CRelayLease&);
724 CRelayLease& operator=(const CRelayLease&);
725};
726
727
601// Publish this node's self-certifying `.btf` descriptor: "reach me (this key) 728// Publish this node's self-certifying `.btf` descriptor: "reach me (this key)
602// via <meeting_node>, encrypting to my x25519 key <enc>". Signed by the node 729// via <meeting_node>, encrypting to my x25519 key <enc>". Signed by the node
603// key so only the address's owner can publish it (no hijacking). 730// key so only the address's owner can publish it (no hijacking).
@@ -673,11 +800,11 @@ bool BtfPublishPoolAnnouncement(const BtfPoolAnnouncement& ann)
673 { 800 {
674 try 801 try
675 { 802 {
676 CWebSocket ws; 803 CRelayLease lease(pszNostrRelays[i], 10);
677 if (!ws.Connect(pszNostrRelays[i], 10)) 804 if (!lease.Connected())
678 continue; 805 continue;
679 if (PublishPoolAnnouncementOnRelay(ws, g_nostrKey, ann)) 806 if (PublishPoolAnnouncementOnRelay(lease.Ws(), g_nostrKey, ann))
680 fPublished = true; 807 fPublished = lease.fOk = true;
681 } 808 }
682 CATCH_PRINT_EXCEPTION("BtfPublishPoolAnnouncement") 809 CATCH_PRINT_EXCEPTION("BtfPublishPoolAnnouncement")
683 } 810 }
@@ -699,9 +826,10 @@ bool BtfQueryPoolAnnouncement(const std::string& poolBtfAddr, BtfPoolAnnouncemen
699 { 826 {
700 try 827 try
701 { 828 {
702 CWebSocket ws; 829 CRelayLease lease(pszNostrRelays[i], 10);
703 if (!ws.Connect(pszNostrRelays[i], 10)) 830 if (!lease.Connected())
704 continue; 831 continue;
832 CWebSocket& ws = lease.Ws();
705 833
706 json filter = json::object(); 834 json filter = json::object();
707 filter["authors"] = json::array({ HexEncode(pk, 32) }); 835 filter["authors"] = json::array({ HexEncode(pk, 32) });
@@ -756,6 +884,7 @@ bool BtfQueryPoolAnnouncement(const std::string& poolBtfAddr, BtfPoolAnnouncemen
756 else if (type == "EOSE") 884 else if (type == "EOSE")
757 break; 885 break;
758 } 886 }
887 lease.fOk = true;
759 } 888 }
760 CATCH_PRINT_EXCEPTION("BtfQueryPoolAnnouncement") 889 CATCH_PRINT_EXCEPTION("BtfQueryPoolAnnouncement")
761 } 890 }
@@ -855,12 +984,16 @@ bool BtfResolve(const std::string& btfAddr, std::string& meetingHostPort,
855 { 984 {
856 try 985 try
857 { 986 {
858 CWebSocket ws; 987 CRelayLease lease(pszNostrRelays[i], 10);
859 if (!ws.Connect(pszNostrRelays[i], 10)) 988 if (!lease.Connected())
860 continue; 989 continue;
861 btf::Descriptor d; 990 btf::Descriptor d;
862 if (!ResolveDescriptor(ws, g_nostrKey.ctx, btfAddr, d)) 991 if (!ResolveDescriptor(lease.Ws(), g_nostrKey.ctx, btfAddr, d))
992 {
993 lease.fOk = true; // exchange completed, just no match
863 continue; 994 continue;
995 }
996 lease.fOk = true;
864 if (d.meeting_node.empty() || d.meeting_node == "rendezvous-pending") 997 if (d.meeting_node.empty() || d.meeting_node == "rendezvous-pending")
865 continue; // descriptor predates the owner's relay config 998 continue; // descriptor predates the owner's relay config
866 if (!HexDecode(d.enc, enc_pub, 32)) 999 if (!HexDecode(d.enc, enc_pub, 32))
@@ -873,14 +1006,115 @@ bool BtfResolve(const std::string& btfAddr, std::string& meetingHostPort,
873 return false; 1006 return false;
874} 1007}
875 1008
1009// Resolve MANY .btf addresses in one pass. A single relay connection carries
1010// a REQ with every still-unresolved address's pubkey in "authors", instead of
1011// opening one relay connection per address. This matters because callers like
1012// ConnectDiscoveredBtfPeers dial many candidates in parallel; without
1013// batching, each of those dial threads independently walks the same handful
1014// of public relays on its own, so a pass of N candidates can fire up to
1015// N * nNostrRelays near-simultaneous connections at the same few relays --
1016// enough to get rate-limited or have handshakes refused, which then looks
1017// like "dead peers" even though the descriptors are perfectly resolvable.
1018bool BtfResolveMany(const std::vector<std::string>& btfAddrs,
1019 std::map<std::string, BtfResolvedPeer>& out)
1020{
1021 if (!EnsureNostrKey() || btfAddrs.empty())
1022 return false;
1023
1024 map<string, string> hexToAddr; // pubkey hex -> .btf addr, for matching events back
1025 set<string> pending;
1026 for (const string& a : btfAddrs)
1027 {
1028 unsigned char pk[32];
1029 if (!btf::ParseAddress(a, pk))
1030 continue;
1031 hexToAddr[HexEncode(pk, 32)] = a;
1032 pending.insert(a);
1033 }
1034 if (pending.empty())
1035 return false;
1036
1037 for (int i = 0; i < nNostrRelays && !fShutdown && !pending.empty(); i++)
1038 {
1039 try
1040 {
1041 CRelayLease lease(pszNostrRelays[i], 10);
1042 if (!lease.Connected())
1043 continue;
1044 CWebSocket& ws = lease.Ws();
1045
1046 json authors = json::array();
1047 for (auto& kv : hexToAddr)
1048 if (pending.count(kv.second))
1049 authors.push_back(kv.first);
1050 if (authors.empty())
1051 {
1052 lease.fOk = true;
1053 break;
1054 }
1055
1056 json filter = json::object();
1057 filter["authors"] = authors;
1058 filter["kinds"] = json::array({ BTF_DESC_KIND });
1059 filter["limit"] = (int)authors.size();
1060 json req = json::array({ "REQ", "btf-resolve-many", filter });
1061 if (!ws.SendText(req.dump()))
1062 continue;
1063
1064 for (;;)
1065 {
1066 string msg;
1067 if (!ws.RecvText(msg))
1068 break;
1069 json j;
1070 try { j = json::parse(msg); } catch (...) { continue; }
1071 if (!j.is_array() || j.empty()) continue;
1072 string t = j[0].get<string>();
1073 if (t == "EVENT" && j.size() >= 3)
1074 {
1075 const json& ev = j[2];
1076 if (!ev.contains("pubkey") || !ev.contains("content"))
1077 continue;
1078 string hexpk = ev["pubkey"].get<string>();
1079 auto ai = hexToAddr.find(hexpk);
1080 if (ai == hexToAddr.end() || !pending.count(ai->second))
1081 continue; // not one we're waiting on (or already resolved)
1082
1083 unsigned char pk[32];
1084 if (!HexDecode(hexpk, pk, 32))
1085 continue;
1086 btf::Descriptor d;
1087 if (!btf::VerifyDescriptor(g_nostrKey.ctx, ev["content"].get<string>(), pk, d))
1088 continue;
1089 if (d.meeting_node.empty() || d.meeting_node == "rendezvous-pending")
1090 continue;
1091 BtfResolvedPeer rp;
1092 if (!HexDecode(d.enc, rp.enc_pub, 32))
1093 continue;
1094 rp.meetingHostPort = d.meeting_node;
1095 out[ai->second] = rp;
1096 pending.erase(ai->second);
1097 }
1098 else if (t == "EOSE")
1099 break;
1100 }
1101 lease.fOk = true;
1102 }
1103 CATCH_PRINT_EXCEPTION("BtfResolveMany")
1104 }
1105 return !out.empty();
1106}
1107
876 1108
877// Connect to a relay: publish our .btf descriptor and collect relay data. 1109// Connect to a relay: publish our .btf descriptor and collect relay data.
878static bool SeedFromRelay(CNostrKey& key, const string& relay) 1110static bool SeedFromRelay(CNostrKey& key, const string& relay)
879{ 1111{
880 CWebSocket ws; 1112 CRelayLease lease(relay, 10);
881 if (!ws.Connect(relay, 10)) 1113 if (!lease.Connected())
882 return false; 1114 return false;
883 printf("Nostr: connected to %s\n", relay.c_str()); 1115 CWebSocket& ws = lease.Ws();
1116 if (lease.fJustConnected)
1117 LogPrint("nostr", "Nostr: connected to %s\n", relay.c_str());
884 1118
885 // Publish our self-certifying .btf descriptor (rendezvous discovery) 1119 // Publish our self-certifying .btf descriptor (rendezvous discovery)
886 PublishDescriptor(ws, key); 1120 PublishDescriptor(ws, key);
@@ -930,7 +1164,7 @@ static bool SeedFromRelay(CNostrKey& key, const string& relay)
930 else if (createdAt > it->second) it->second = createdAt; // refresh 1164 else if (createdAt > it->second) it->second = createdAt; // refresh
931 } 1165 }
932 if (fNew && fDebug) 1166 if (fNew && fDebug)
933 printf("Nostr: discovered .btf peer %s\n", peerAddr.c_str()); 1167 LogPrint("nostr", "Nostr: discovered .btf peer %s\n", peerAddr.c_str());
934 if (++nPeers > 500) break; 1168 if (++nPeers > 500) break;
935 } 1169 }
936 else if (type == "EOSE") 1170 else if (type == "EOSE")
@@ -974,7 +1208,7 @@ static bool SeedFromRelay(CNostrKey& key, const string& relay)
974 if (g_discoveredRelays.size() < BTF_MAX_DISCOVERED_RELAYS) 1208 if (g_discoveredRelays.size() < BTF_MAX_DISCOVERED_RELAYS)
975 fNew = g_discoveredRelays.insert(r).second; 1209 fNew = g_discoveredRelays.insert(r).second;
976 if (fNew && fDebug) 1210 if (fNew && fDebug)
977 printf("Nostr: discovered relay %s\n", r.c_str()); 1211 LogPrint("nostr", "Nostr: discovered relay %s\n", r.c_str());
978 } 1212 }
979 else if (type == "EOSE") 1213 else if (type == "EOSE")
980 break; 1214 break;
@@ -1009,12 +1243,15 @@ static bool SeedFromRelay(CNostrKey& key, const string& relay)
1009 } 1243 }
1010 } 1244 }
1011 } 1245 }
1246 lease.fOk = true;
1012 return true; 1247 return true;
1013} 1248}
1014 1249
1250volatile bool gAnnounceNow = false;
1251
1015void ThreadBtfPoolAnnouncer(void*) 1252void ThreadBtfPoolAnnouncer(void*)
1016{ 1253{
1017 printf("ThreadBtfPoolAnnouncer started\n"); 1254 LogPrint("pool", "ThreadBtfPoolAnnouncer started\n");
1018 while (!fShutdown) 1255 while (!fShutdown)
1019 { 1256 {
1020 if (nMineMode == MINE_OPERATOR && gPoolRunning) 1257 if (nMineMode == MINE_OPERATOR && gPoolRunning)
@@ -1025,15 +1262,17 @@ void ThreadBtfPoolAnnouncer(void*)
1025 ann.dashboardUrl = strPoolDashboardUrl; 1262 ann.dashboardUrl = strPoolDashboardUrl;
1026 ann.feePercent = dPoolFeePercent; 1263 ann.feePercent = dPoolFeePercent;
1027 uint64 roundShares = 0; 1264 uint64 roundShares = 0;
1028 GetPoolOperatorStats(ann.connectedMiners, ann.blocksFound, roundShares); 1265 double totalHashRate = 0.0;
1029 ann.hashRate = 0.0; 1266 GetPoolOperatorStats(ann.connectedMiners, ann.blocksFound, roundShares, totalHashRate);
1267 ann.hashRate = totalHashRate;
1030 ann.createdAt = GetTime(); 1268 ann.createdAt = GetTime();
1031 if (!ann.btfAddress.empty() && !ann.poolName.empty()) 1269 if (!ann.btfAddress.empty() && !ann.poolName.empty())
1032 BtfPublishPoolAnnouncement(ann); 1270 BtfPublishPoolAnnouncement(ann);
1033 } 1271 }
1034 1272
1035 for (int i = 0; i < 60 && !fShutdown; i++) 1273 for (int i = 0; i < 60 && !fShutdown && !gAnnounceNow; i++)
1036 Sleep(1000); 1274 Sleep(1000);
1275 gAnnounceNow = false;
1037 } 1276 }
1038} 1277}
1039 1278
@@ -1042,10 +1281,29 @@ void ThreadBtfPoolAnnouncer(void*)
1042// dead/stale descriptors (e.g. abandoned test identities that linger on the 1281// dead/stale descriptors (e.g. abandoned test identities that linger on the
1043// relays) from consuming the whole per-pass dial budget and starving the live 1282// relays) from consuming the whole per-pass dial budget and starving the live
1044// peers. Backoff grows on repeated failures, capped. 1283// peers. Backoff grows on repeated failures, capped.
1284//
1285// g_btfPeerFails also doubles as the priority signal for dial ordering: a peer
1286// we've connected to before (present in g_btfPeerEverConnected) is known-good
1287// and goes first; a peer we've never tried goes next; a peer with a growing
1288// fail count is known-bad and goes last, worst offenders furthest back. This
1289// replaces the old behavior where the whole candidate list was shuffled right
1290// after being sorted by freshness, which made the freshness sort a no-op and
1291// gave dead peers equal footing with everyone else.
1045static map<string, int64> g_btfPeerBackoff; // addr -> next-try time 1292static map<string, int64> g_btfPeerBackoff; // addr -> next-try time
1046static map<string, int> g_btfPeerFails; // addr -> consecutive failures 1293static map<string, int> g_btfPeerFails; // addr -> consecutive failures
1294static set<string> g_btfPeerEverConnected; // addr -> has succeeded at least once
1047static CCriticalSection cs_btfPeerState; 1295static CCriticalSection cs_btfPeerState;
1048 1296
1297// Backoff cap for repeatedly-dead peers. The old 15-minute cap meant a
1298// descriptor that has failed many times in a row cycles back into the dial
1299// pool just as often as a peer we've never tried, wasting dial budget on
1300// known-dead addresses every pass. Once a peer has failed enough times to
1301// be "chronic", stretch the cap much further so it consumes budget far less
1302// often while still getting retried eventually in case it comes back online.
1303static const int64 BTF_BACKOFF_CAP_SECS = 15 * 60; // 15 min: initial ramp cap
1304static const int64 BTF_BACKOFF_CAP_SECS_DEAD = 6 * 60 * 60; // 6 hr: cap for chronic failures
1305static const int BTF_CHRONIC_FAIL_THRESHOLD = 6; // fails before "chronic" cap kicks in
1306
1049// Dial the .btf peers discovered on the relays, up to a target connection count. 1307// Dial the .btf peers discovered on the relays, up to a target connection count.
1050// Connections are attempted in parallel so a single slow/dead relay doesn't 1308// Connections are attempted in parallel so a single slow/dead relay doesn't
1051// stall the entire pass. Each candidate gets its own thread; all threads start 1309// stall the entire pass. Each candidate gets its own thread; all threads start
@@ -1060,23 +1318,18 @@ static void ConnectDiscoveredBtfPeers()
1060 for (auto& kv : g_btfPeers) 1318 for (auto& kv : g_btfPeers)
1061 peersWithAge.push_back({kv.second, kv.first}); 1319 peersWithAge.push_back({kv.second, kv.first});
1062 } 1320 }
1063 // Sort newest descriptor first — recently-active nodes are much more
1064 // likely to be online right now. Stale ones stay in the list as fallback.
1065 sort(peersWithAge.begin(), peersWithAge.end(),
1066 [](const pair<int64,string>& a, const pair<int64,string>& b){ return a.first > b.first; });
1067
1068 int64 cutoff = GetTime() - BTF_PEER_MAX_AGE; 1321 int64 cutoff = GetTime() - BTF_PEER_MAX_AGE;
1069 int nFresh = 0; 1322 int nFresh = 0;
1070 vector<string> peers; 1323 vector<pair<int64,string>> fresh; // (createdAt, addr), newest first
1071 for (auto& p : peersWithAge) 1324 for (auto& p : peersWithAge)
1072 { 1325 {
1073 if (p.first < cutoff) 1326 if (p.first < cutoff)
1074 continue; 1327 continue;
1075 peers.push_back(p.second); 1328 fresh.push_back(p);
1076 nFresh++; 1329 nFresh++;
1077 } 1330 }
1078 if (!peers.empty()) 1331 if (!fresh.empty())
1079 printf("Nostr: %d fresh peers, %d stale (of %d total)\n", nFresh, nTotal-nFresh, nTotal); 1332 LogPrint("nostr", "Nostr: %d fresh peers, %d stale (of %d total)\n", nFresh, nTotal-nFresh, nTotal);
1080 1333
1081 // Drop stale peers so we stop retrying dead descriptors until they refresh. 1334 // Drop stale peers so we stop retrying dead descriptors until they refresh.
1082 { 1335 {
@@ -1092,42 +1345,164 @@ static void ConnectDiscoveredBtfPeers()
1092 } 1345 }
1093 } 1346 }
1094 1347
1095 // Shuffle so we don't always retry the same dead peers at the front. 1348 // Sort newest descriptor first -- recently-active nodes are much more
1096 for (size_t i = peers.size(); i > 1; i--) 1349 // likely to be online right now.
1097 swap(peers[i - 1], peers[(size_t)GetRand(i)]); 1350 sort(fresh.begin(), fresh.end(),
1351 [](const pair<int64,string>& a, const pair<int64,string>& b){ return a.first > b.first; });
1352
1353 // Reorder into tiers: known-good (succeeded before) first, untried next,
1354 // known-bad (has a fail count) last -- worst offenders furthest back.
1355 // Freshness order is preserved *within* each tier, so recency still
1356 // matters, but a peer we know is dead no longer gets equal footing with
1357 // a peer we've never tried or one that's worked before.
1358 vector<string> tierGood, tierUntried, tierBad;
1359 CRITICAL_BLOCK(cs_btfPeerState)
1360 {
1361 for (auto& p : fresh)
1362 {
1363 const string& addr = p.second;
1364 if (g_btfPeerEverConnected.count(addr))
1365 tierGood.push_back(addr);
1366 else if (g_btfPeerFails.find(addr) == g_btfPeerFails.end())
1367 tierUntried.push_back(addr);
1368 else
1369 tierBad.push_back(addr);
1370 }
1371 // Within known-bad, put fewer-fails peers ahead of chronic offenders.
1372 sort(tierBad.begin(), tierBad.end(),
1373 [](const string& a, const string& b){ return g_btfPeerFails[a] < g_btfPeerFails[b]; });
1374 }
1375
1376 vector<string> peers;
1377 peers.reserve(fresh.size());
1378 peers.insert(peers.end(), tierGood.begin(), tierGood.end());
1379 peers.insert(peers.end(), tierUntried.begin(), tierUntried.end());
1380 peers.insert(peers.end(), tierBad.begin(), tierBad.end());
1098 1381
1099 // Pick candidates for this pass (skip those in backoff, cap at budget). 1382 // Pick candidates for this pass (skip those in backoff, cap at budget).
1383 //
1384 // The tiered order above is deliberately biased toward peers we know
1385 // are good -- that's the right default, since dialing untested/bad
1386 // peers wastes attempts. But if every node on the network applies the
1387 // same bias, everyone converges on the same small set of "known good"
1388 // peers as neighbors: that correlates peer sets across the network,
1389 // which is exactly what standard random-graph connectivity results
1390 // assume you avoid. If that shared hub set has a bad day (e.g. one
1391 // relay outage), many nodes lose the same edges at once instead of
1392 // losing independent, uncorrelated edges.
1393 //
1394 // So: fill most of the pass from the reliable/tiered order, but reserve
1395 // a slice for peers picked at random from the *entire* fresh pool
1396 // (not just the front of the sorted list). Same pattern Bitcoin's own
1397 // peer manager and Kademlia-style DHTs use -- sticky reliable peers
1398 // plus a random sample, not one or the other.
1100 int64 now = GetTime(); 1399 int64 now = GetTime();
1400 int nBudget = (int)BTF_DIALS_PER_PASS;
1401 {
1402 int nRoom = (int)BTF_TARGET_CONN - (int)vNodes.size();
1403 if (nRoom < nBudget) nBudget = nRoom;
1404 }
1405 if (nBudget < 0) nBudget = 0;
1406 int nRandomSlots = (nBudget > 0) ? max(1, nBudget * 3 / 10) : 0;
1407 int nSortedSlots = nBudget - nRandomSlots;
1408
1101 vector<string> candidates; 1409 vector<string> candidates;
1410 set<string> setChosen;
1102 CRITICAL_BLOCK(cs_btfPeerState) 1411 CRITICAL_BLOCK(cs_btfPeerState)
1103 { 1412 {
1413 // Reliability slice: walk the tiered (good -> untried -> bad) order.
1104 for (const string& addr : peers) 1414 for (const string& addr : peers)
1105 { 1415 {
1106 if ((int)vNodes.size() >= (int)BTF_TARGET_CONN) break; 1416 if ((int)vNodes.size() >= (int)BTF_TARGET_CONN) break;
1107 if ((int)candidates.size() >= BTF_DIALS_PER_PASS) break; 1417 if ((int)candidates.size() >= nSortedSlots) break;
1108 map<string, int64>::iterator bi = g_btfPeerBackoff.find(addr); 1418 map<string, int64>::iterator bi = g_btfPeerBackoff.find(addr);
1109 if (bi != g_btfPeerBackoff.end() && now < bi->second) 1419 if (bi != g_btfPeerBackoff.end() && now < bi->second)
1110 continue; 1420 continue;
1111 candidates.push_back(addr); 1421 candidates.push_back(addr);
1422 setChosen.insert(addr);
1423 }
1424
1425 // Diversity slice: random sample from the full fresh pool, so the
1426 // dial isn't limited to whatever the tiered sort put up front.
1427 vector<string> pool;
1428 for (auto& p : fresh)
1429 {
1430 const string& addr = p.second;
1431 if (setChosen.count(addr))
1432 continue;
1433 map<string, int64>::iterator bi = g_btfPeerBackoff.find(addr);
1434 if (bi != g_btfPeerBackoff.end() && now < bi->second)
1435 continue;
1436 pool.push_back(addr);
1437 }
1438 int nWant = min(nRandomSlots, (int)pool.size());
1439 for (int i = 0; i < nWant; i++)
1440 {
1441 if ((int)vNodes.size() + (int)candidates.size() >= (int)BTF_TARGET_CONN) break;
1442 if ((int)candidates.size() >= nBudget) break;
1443 size_t j = i + (size_t)GetRand((uint64)(pool.size() - i));
1444 std::swap(pool[i], pool[j]);
1445 candidates.push_back(pool[i]);
1446 setChosen.insert(pool[i]);
1112 } 1447 }
1113 } 1448 }
1114 1449
1115 if (candidates.empty()) return; 1450 if (candidates.empty()) return;
1116 1451
1117 // Launch one thread per candidate — all connect attempts run in parallel. 1452 // Resolve every candidate's descriptor in one batched pass (a handful of
1453 // relay round-trips total, one REQ per relay covering all candidates)
1454 // instead of each dial thread independently walking the relay list on
1455 // its own. That per-thread approach meant a 12-candidate pass could fire
1456 // up to 12 * nNostrRelays near-simultaneous connections at the same
1457 // handful of public relays -- enough to trip rate limits or get
1458 // handshakes refused, which then looks exactly like "dead peers" even
1459 // though the descriptors were perfectly resolvable.
1460 map<string, BtfResolvedPeer> resolved;
1461 BtfResolveMany(candidates, resolved);
1462
1463 // Candidates whose descriptor didn't resolve this pass are recorded as a
1464 // failure right away (no point spawning a tunnel thread with nothing to
1465 // dial), same bookkeeping as a failed connect attempt.
1466 vector<string> toDial;
1467 CRITICAL_BLOCK(cs_btfPeerState)
1468 {
1469 for (const string& addr : candidates)
1470 {
1471 if (resolved.count(addr))
1472 {
1473 toDial.push_back(addr);
1474 continue;
1475 }
1476 int n = ++g_btfPeerFails[addr];
1477 int64 cap = (n >= BTF_CHRONIC_FAIL_THRESHOLD) ? BTF_BACKOFF_CAP_SECS_DEAD
1478 : BTF_BACKOFF_CAP_SECS;
1479 int64 secs = 30;
1480 for (int k = 1; k < n && secs < cap; k++) secs *= 2;
1481 if (secs > cap) secs = cap;
1482 g_btfPeerBackoff[addr] = GetTime() + secs;
1483 }
1484 }
1485 if (toDial.empty()) return;
1486
1487 // Launch one thread per resolved candidate -- all connect attempts run in
1488 // parallel, but purely against each peer's own rendezvous meeting node,
1489 // not the shared Nostr relays, so there's no thundering-herd effect here.
1118 // Each thread writes its result back via shared state guarded by cs_btfPeerState. 1490 // Each thread writes its result back via shared state guarded by cs_btfPeerState.
1119 struct DialCtx { string addr; }; 1491 struct DialCtx { string addr; BtfResolvedPeer rp; };
1120 vector<DialCtx*> ctxs; 1492 vector<DialCtx*> ctxs;
1121 for (const string& addr : candidates) 1493 for (const string& addr : toDial)
1122 { 1494 {
1123 DialCtx* ctx = new DialCtx{addr}; 1495 DialCtx* ctx = new DialCtx{addr, resolved[addr]};
1124 ctxs.push_back(ctx); 1496 ctxs.push_back(ctx);
1125 _beginthread([](void* arg) { 1497 _beginthread([](void* arg) {
1126 DialCtx* ctx = (DialCtx*)arg; 1498 DialCtx* ctx = (DialCtx*)arg;
1127 string addr = ctx->addr; 1499 string addr = ctx->addr;
1500 string meeting = ctx->rp.meetingHostPort;
1501 unsigned char enc_pub[32];
1502 memcpy(enc_pub, ctx->rp.enc_pub, 32);
1128 delete ctx; 1503 delete ctx;
1129 1504
1130 CNode* pnode = ConnectNodeBtf(addr); 1505 CNode* pnode = ConnectNodeBtfResolved(addr, meeting, enc_pub);
1131 CRITICAL_BLOCK(cs_btfPeerState) 1506 CRITICAL_BLOCK(cs_btfPeerState)
1132 { 1507 {
1133 if (pnode) 1508 if (pnode)
@@ -1138,13 +1513,16 @@ static void ConnectDiscoveredBtfPeers()
1138 pnode->Release(); 1513 pnode->Release();
1139 g_btfPeerBackoff.erase(addr); 1514 g_btfPeerBackoff.erase(addr);
1140 g_btfPeerFails.erase(addr); 1515 g_btfPeerFails.erase(addr);
1516 g_btfPeerEverConnected.insert(addr);
1141 } 1517 }
1142 else 1518 else
1143 { 1519 {
1144 int n = ++g_btfPeerFails[addr]; 1520 int n = ++g_btfPeerFails[addr];
1521 int64 cap = (n >= BTF_CHRONIC_FAIL_THRESHOLD) ? BTF_BACKOFF_CAP_SECS_DEAD
1522 : BTF_BACKOFF_CAP_SECS;
1145 int64 secs = 30; 1523 int64 secs = 30;
1146 for (int k = 1; k < n && secs < 15*60; k++) secs *= 2; 1524 for (int k = 1; k < n && secs < cap; k++) secs *= 2;
1147 if (secs > 15*60) secs = 15*60; 1525 if (secs > cap) secs = cap;
1148 g_btfPeerBackoff[addr] = GetTime() + secs; 1526 g_btfPeerBackoff[addr] = GetTime() + secs;
1149 } 1527 }
1150 } 1528 }
@@ -1160,16 +1538,16 @@ static void ConnectDiscoveredBtfPeers()
1160 1538
1161void ThreadNostrSeed(void* parg) 1539void ThreadNostrSeed(void* parg)
1162{ 1540{
1163 printf("ThreadNostrSeed started\n"); 1541 LogPrint("nostr", "ThreadNostrSeed started\n");
1164 1542
1165 if (!EnsureNostrKey()) 1543 if (!EnsureNostrKey())
1166 { 1544 {
1167 printf("Nostr: failed to initialize secp256k1 key\n"); 1545 LogPrint("nostr", "Nostr: failed to initialize secp256k1 key\n");
1168 return; 1546 return;
1169 } 1547 }
1170 CNostrKey& key = g_nostrKey; 1548 CNostrKey& key = g_nostrKey;
1171 printf("Nostr: node pubkey = %s\n", key.PubKeyHex().c_str()); 1549 LogPrint("nostr", "Nostr: node pubkey = %s\n", key.PubKeyHex().c_str());
1172 printf("Nostr: node .btf address = %s\n", key.BtfAddress().c_str()); 1550 LogPrint("nostr", "Nostr: node .btf address = %s\n", key.BtfAddress().c_str());
1173 1551
1174 // One-time self-test of the rendezvous: publish our descriptor to a relay, 1552 // One-time self-test of the rendezvous: publish our descriptor to a relay,
1175 // then resolve our OWN .btf address back and verify it self-certifies. Proves 1553 // then resolve our OWN .btf address back and verify it self-certifies. Proves
@@ -1178,17 +1556,20 @@ void ThreadNostrSeed(void* parg)
1178 { 1556 {
1179 try 1557 try
1180 { 1558 {
1181 CWebSocket ws; 1559 CRelayLease lease(pszNostrRelays[i], 10);
1182 if (!ws.Connect(pszNostrRelays[i], 10)) continue; 1560 if (!lease.Connected()) continue;
1561 CWebSocket& ws = lease.Ws();
1183 PublishDescriptor(ws, key); 1562 PublishDescriptor(ws, key);
1184 Sleep(700); // let the relay store the replaceable event 1563 Sleep(700); // let the relay store the replaceable event
1185 btf::Descriptor d; 1564 btf::Descriptor d;
1186 if (ResolveDescriptor(ws, key.ctx, key.BtfAddress(), d)) 1565 if (ResolveDescriptor(ws, key.ctx, key.BtfAddress(), d))
1187 { 1566 {
1188 printf("Nostr: .btf self-resolve OK via %s (meeting_node=%s, enc=%s...)\n", 1567 LogPrint("nostr", "Nostr: .btf self-resolve OK via %s (meeting_node=%s, enc=%s...)\n",
1189 pszNostrRelays[i], d.meeting_node.c_str(), d.enc.substr(0, 16).c_str()); 1568 pszNostrRelays[i], d.meeting_node.c_str(), d.enc.substr(0, 16).c_str());
1569 lease.fOk = true;
1190 break; 1570 break;
1191 } 1571 }
1572 lease.fOk = true;
1192 } 1573 }
1193 CATCH_PRINT_EXCEPTION("btf self-test") 1574 CATCH_PRINT_EXCEPTION("btf self-test")
1194 } 1575 }
@@ -1223,8 +1604,9 @@ void ThreadNostrSeed(void* parg)
1223 ann.dashboardUrl = strPoolDashboardUrl; 1604 ann.dashboardUrl = strPoolDashboardUrl;
1224 ann.feePercent = dPoolFeePercent; 1605 ann.feePercent = dPoolFeePercent;
1225 uint64 roundShares = 0; 1606 uint64 roundShares = 0;
1226 GetPoolOperatorStats(ann.connectedMiners, ann.blocksFound, roundShares); 1607 double totalHashRate = 0.0;
1227 ann.hashRate = 0.0; 1608 GetPoolOperatorStats(ann.connectedMiners, ann.blocksFound, roundShares, totalHashRate);
1609 ann.hashRate = totalHashRate;
1228 ann.createdAt = GetTime(); 1610 ann.createdAt = GetTime();
1229 if (!ann.btfAddress.empty() && !ann.poolName.empty()) 1611 if (!ann.btfAddress.empty() && !ann.poolName.empty())
1230 BtfPublishPoolAnnouncement(ann); 1612 BtfPublishPoolAnnouncement(ann);
diff --git a/src/nostr.h b/src/nostr.h
index 63fc095..37b3b05 100644
--- a/src/nostr.h
+++ b/src/nostr.h
@@ -12,11 +12,17 @@
12 12
13#include <string> 13#include <string>
14#include <vector> 14#include <vector>
15#include <map>
15 16
16// Thread entry point (signature compatible with _beginthread) 17// Thread entry point (signature compatible with _beginthread)
17void ThreadNostrSeed(void* parg); 18void ThreadNostrSeed(void* parg);
18void ThreadBtfPoolAnnouncer(void* parg); 19void ThreadBtfPoolAnnouncer(void* parg);
19 20
21// Set to true to make ThreadBtfPoolAnnouncer publish immediately instead of
22// waiting for its ~60s sleep loop (e.g. right after the operator changes pool
23// name/fee/dashboard URL in Options). The announcer clears it after publishing.
24extern volatile bool gAnnounceNow;
25
20// Public relays used for discovery. Tunable. 26// Public relays used for discovery. Tunable.
21extern const char* pszNostrRelays[]; 27extern const char* pszNostrRelays[];
22extern const int nNostrRelays; 28extern const int nNostrRelays;
@@ -56,6 +62,9 @@ struct BtfPoolAnnouncement
56 } 62 }
57}; 63};
58 64
65// Number of .btf peers discovered from Nostr relays (includes not-yet-connected).
66int GetDiscoveredPeerCount();
67
59// Current live pool announcements discovered from Nostr relays. 68// Current live pool announcements discovered from Nostr relays.
60void BtfGetPoolAnnouncements(std::vector<BtfPoolAnnouncement>& out); 69void BtfGetPoolAnnouncements(std::vector<BtfPoolAnnouncement>& out);
61 70
@@ -78,4 +87,21 @@ std::string BtfLocalAddress();
78bool BtfResolve(const std::string& btfAddr, std::string& meetingHostPort, 87bool BtfResolve(const std::string& btfAddr, std::string& meetingHostPort,
79 unsigned char enc_pub[32]); 88 unsigned char enc_pub[32]);
80 89
90// Result of resolving one .btf address via BtfResolveMany.
91struct BtfResolvedPeer
92{
93 std::string meetingHostPort;
94 unsigned char enc_pub[32];
95};
96
97// Resolve many .btf addresses at once. Batches all still-unresolved addresses
98// into a single Nostr REQ per relay (multiple "authors"), instead of opening
99// one relay connection per address like BtfResolve does. Use this whenever
100// resolving more than a handful of addresses in the same pass -- e.g. before
101// dialing several discovered peers in parallel -- to avoid hammering the
102// same few public relays with a burst of simultaneous connections. Returns
103// true if at least one address resolved; check `out` for which ones.
104bool BtfResolveMany(const std::vector<std::string>& btfAddrs,
105 std::map<std::string, BtfResolvedPeer>& out);
106
81#endif 107#endif
diff --git a/src/rc/addressbook16.bmp b/src/rc/addressbook16.bmp
deleted file mode 100644
index c557691..0000000
--- a/src/rc/addressbook16.bmp
+++ /dev/null
Binary files differ
diff --git a/src/rc/addressbook16mask.bmp b/src/rc/addressbook16mask.bmp
deleted file mode 100644
index d3a478d..0000000
--- a/src/rc/addressbook16mask.bmp
+++ /dev/null
Binary files differ
diff --git a/src/rc/addressbook20.bmp b/src/rc/addressbook20.bmp
deleted file mode 100644
index 2b33b22..0000000
--- a/src/rc/addressbook20.bmp
+++ /dev/null
Binary files differ
diff --git a/src/rc/addressbook20mask.bmp b/src/rc/addressbook20mask.bmp
deleted file mode 100644
index 56ce612..0000000
--- a/src/rc/addressbook20mask.bmp
+++ /dev/null
Binary files differ
diff --git a/src/rc/bitcoin_bc_original.ico b/src/rc/bitcoin_bc_original.ico
deleted file mode 100644
index 88cc240..0000000
--- a/src/rc/bitcoin_bc_original.ico
+++ /dev/null
Binary files differ
diff --git a/src/rc/check.ico b/src/rc/check.ico
deleted file mode 100644
index 0c4e6e8..0000000
--- a/src/rc/check.ico
+++ /dev/null
Binary files differ
diff --git a/src/rc/send16.bmp b/src/rc/send16.bmp
deleted file mode 100644
index 676b5c4..0000000
--- a/src/rc/send16.bmp
+++ /dev/null
Binary files differ
diff --git a/src/rc/send16mask.bmp b/src/rc/send16mask.bmp
deleted file mode 100644
index 06c747f..0000000
--- a/src/rc/send16mask.bmp
+++ /dev/null
Binary files differ
diff --git a/src/rc/send16masknoshadow.bmp b/src/rc/send16masknoshadow.bmp
deleted file mode 100644
index faf24e0..0000000
--- a/src/rc/send16masknoshadow.bmp
+++ /dev/null
Binary files differ
diff --git a/src/rc/send20.bmp b/src/rc/send20.bmp
deleted file mode 100644
index 2b90422..0000000
--- a/src/rc/send20.bmp
+++ /dev/null
Binary files differ
diff --git a/src/rc/send20mask.bmp b/src/rc/send20mask.bmp
deleted file mode 100644
index f124d0d..0000000
--- a/src/rc/send20mask.bmp
+++ /dev/null
Binary files differ
diff --git a/src/rpc.cpp b/src/rpc.cpp
index 99d182e..1b529e8 100644
--- a/src/rpc.cpp
+++ b/src/rpc.cpp
@@ -1,14 +1,19 @@
1// Copyright (c) 2009 Satoshi Nakamoto / Copyright (c) 2026 Bitflash developers 1// Copyright (c) 2009 Satoshi Nakamoto / Copyright (c) 2026 Bitflash developers
2// Distributed under the MIT/X11 software license. 2// Distributed under the MIT/X11 software license.
3// 3//
4// Bitflash pool server — .btf-only pool listener. 4// Bitflash pool server -- .btf Stratum pool, operator side.
5// Miners connect through rendezvous tunnels; no raw IP:port endpoints remain.
6// Pending payouts are held until maturity and shown in the GUI.
7// 5//
8// Compiles on both Windows (mingw) and Linux unchanged. 6// Architecture:
9// Launched from ui.cpp (GUI) and headless.cpp (node) via ThreadRPCServer(). 7// PoolEventLoop -- single thread, owns all miner fds, all job/share/payout
8// state. No locks needed on any of that data.
9// AcceptOneFn -- one thread per relay. Blocks on RvServiceRegister +
10// BtfServiceWrap, pushes finished socket to gReadyQueue.
11// AcceptLoopFn -- spawns AcceptOneFn threads, re-polls relay list every
12// 60s so dynamically discovered relays get picked up.
13//
14// GUI-visible state is snapshotted under gStatsMutex every 2s.
15// Accept queue handoff uses gReadyMutex (held for microseconds).
10 16
11// nlohmann must be included before headers.h because util.h redefines snprintf
12#pragma push_macro("snprintf") 17#pragma push_macro("snprintf")
13#undef snprintf 18#undef snprintf
14#include <nlohmann/json.hpp> 19#include <nlohmann/json.hpp>
@@ -20,8 +25,6 @@
20#endif 25#endif
21#include "btftunnel.h" 26#include "btftunnel.h"
22 27
23// POSIX socket headers — already provided by compat.h on Windows,
24// and by the OS directly on Linux.
25#ifndef _WIN32 28#ifndef _WIN32
26#include <sys/socket.h> 29#include <sys/socket.h>
27#include <sys/select.h> 30#include <sys/select.h>
@@ -33,14 +36,15 @@
33#include <atomic> 36#include <atomic>
34#include <mutex> 37#include <mutex>
35#include <map> 38#include <map>
39#include <set>
36#include <deque> 40#include <deque>
41#include <vector>
42#include <algorithm>
37#include <sstream> 43#include <sstream>
38#include <iomanip> 44#include <iomanip>
39#include <ctime>
40 45
41using json = nlohmann::json; 46using json = nlohmann::json;
42 47
43// Cross-platform socket close / send flags
44#ifdef _WIN32 48#ifdef _WIN32
45#define sock_close(s) closesocket(s) 49#define sock_close(s) closesocket(s)
46#define SEND_FLAGS 0 50#define SEND_FLAGS 0
@@ -49,660 +53,1260 @@ using json = nlohmann::json;
49#define SEND_FLAGS MSG_NOSIGNAL 53#define SEND_FLAGS MSG_NOSIGNAL
50#endif 54#endif
51 55
52// Cross-platform thread launch: wraps _beginthread (compat.h maps it to
53// pthread_create+detach on Linux, native _beginthread on Windows).
54// fn must be void(*)(void*).
55static void LaunchThread(void (*fn)(void*), void* arg)
56{
57 _beginthread(fn, 0, arg);
58}
59
60// ---------------------------------------------------------------------------
61// Config — set by headless.cpp / ui.cpp before threads launch
62// ---------------------------------------------------------------------------
63std::string gRpcUser;
64std::string gRpcPassword;
65
66// Pool server running flag — set false to stop server cleanly (all loops check it)
67volatile bool gPoolRunning = false; 56volatile bool gPoolRunning = false;
68 57
69// --------------------------------------------------------------------------- 58// ---------------------------------------------------------------------------
70// Stubs for symbols absent from Bitflash 0.1.0
71// ---------------------------------------------------------------------------
72double dHashesPerSec = 0.0;
73int64 nHPSTimerStart = 0;
74
75static bool IsInitialBlockDownload()
76{
77 return (pindexBest == NULL || nBestHeight < 1);
78}
79
80// ---------------------------------------------------------------------------
81// Hex helpers 59// Hex helpers
82// --------------------------------------------------------------------------- 60// ---------------------------------------------------------------------------
83static std::string ToHex(const void* p, size_t n) 61static std::string ToHex(const void* p, size_t n)
84{ 62{
85 const unsigned char* b = (const unsigned char*)p; 63 const unsigned char* b = (const unsigned char*)p;
86 std::string s; s.reserve(n*2); 64 std::string s; s.reserve(n * 2);
87 static const char* H = "0123456789abcdef"; 65 static const char* H = "0123456789abcdef";
88 for (size_t i = 0; i < n; i++) { s += H[b[i]>>4]; s += H[b[i]&0xf]; } 66 for (size_t i = 0; i < n; i++) { s += H[b[i] >> 4]; s += H[b[i] & 0xf]; }
89 return s; 67 return s;
90} 68}
69
91static std::vector<unsigned char> FromHex(const std::string& s) 70static std::vector<unsigned char> FromHex(const std::string& s)
92{ 71{
93 std::vector<unsigned char> v; 72 std::vector<unsigned char> v;
94 for (size_t i = 0; i+1 < s.size(); i += 2) { 73 for (size_t i = 0; i + 1 < s.size(); i += 2) {
95 auto h=[](char c)->int{ 74 auto h = [](char c) -> int {
96 if(c>='0'&&c<='9') return c-'0'; 75 if (c >= '0' && c <= '9') return c - '0';
97 if(c>='a'&&c<='f') return c-'a'+10; 76 if (c >= 'a' && c <= 'f') return c - 'a' + 10;
98 if(c>='A'&&c<='F') return c-'A'+10; 77 if (c >= 'A' && c <= 'F') return c - 'A' + 10;
99 return 0; 78 return 0;
100 }; 79 };
101 v.push_back((unsigned char)((h(s[i])<<4)|h(s[i+1]))); 80 v.push_back((unsigned char)((h(s[i]) << 4) | h(s[i + 1])));
102 } 81 }
103 return v; 82 return v;
104} 83}
105 84
106// --------------------------------------------------------------------------- 85// ---------------------------------------------------------------------------
107// PPLNS share tracking 86// Job -- written and read exclusively by the event loop thread
108// ---------------------------------------------------------------------------
109struct Share {
110 std::string minerAddress;
111 int64 timestamp;
112 uint64 difficulty;
113};
114
115struct MinerStats {
116 std::string address;
117 std::string worker;
118 uint64 totalShares = 0;
119 uint64 roundShares = 0;
120 int64 lastSeen = 0;
121};
122static std::mutex gMinerStatsMutex;
123static std::map<std::string, MinerStats> gMinerStats;
124
125struct FoundBlock {
126 int height;
127 int64 timestamp;
128 std::string minerAddress;
129 uint256 hash;
130};
131static std::mutex gBlocksMutex;
132static std::deque<FoundBlock> gFoundBlocks;
133
134struct Miner;
135static std::mutex gMinersMutex;
136static std::vector<Miner*> gMiners;
137
138static std::string MinerKey(const std::string& address, const std::string& worker)
139{
140 return address + "\n" + worker;
141}
142
143void GetPoolWorkerStats(std::vector<PoolWorkerStatView>& out)
144{
145 out.clear();
146 int64 now = GetTime();
147 std::lock_guard<std::mutex> lk(gMinerStatsMutex);
148 for (std::map<std::string, MinerStats>::const_iterator it = gMinerStats.begin(); it != gMinerStats.end(); ++it)
149 {
150 const MinerStats& ms = it->second;
151 if (ms.lastSeen <= 0)
152 continue;
153 if (now - ms.lastSeen > 15 * 60)
154 continue;
155 PoolWorkerStatView view;
156 view.address = ms.address;
157 view.worker = ms.worker;
158 view.totalShares = ms.totalShares;
159 view.roundShares = ms.roundShares;
160 view.lastSeen = ms.lastSeen;
161 out.push_back(view);
162 }
163 std::sort(out.begin(), out.end(), [](const PoolWorkerStatView& a, const PoolWorkerStatView& b) {
164 if (a.roundShares != b.roundShares) return a.roundShares > b.roundShares;
165 if (a.totalShares != b.totalShares) return a.totalShares > b.totalShares;
166 return a.lastSeen > b.lastSeen;
167 });
168}
169
170// ---------------------------------------------------------------------------
171// Current mining job
172// --------------------------------------------------------------------------- 87// ---------------------------------------------------------------------------
173struct StratumJob { 88struct StratumJob {
174 std::string jobId; 89 std::string jobId;
175 CBlock block; 90 CBlock block;
176 uint256 target; 91 uint256 target; // full block target; share targets are per-miner via vardiff
177 uint256 shareTarget;
178 int height; 92 int height;
179}; 93};
94static StratumJob gCurrentJob;
95static bool gHaveJob = false;
96
97// Compute a share target from a Stratum difficulty value.
98// Stratum difficulty 1 must correspond to THIS chain's easiest allowed target
99// (bnProofOfWorkLimit = ~uint256(0) >> 12, compact 0x1f0fffff), not Bitcoin's
100// SHA256 diff-1 target (0x1d00ffff). Those differ by about 2^20 (~1e6x):
101// Bitcoin's diff-1 needs ~2^32 hashes/share on average, while this chain's PoW
102// floor needs only ~2^12. Using the Bitcoin constant made every miner's
103// "difficulty 1" about a million times harder than the chain's own floor, so a
104// worker could hash for minutes without ever finding a share -- and vardiff
105// never gets the samples it needs to correct course, because no share ever
106// comes in for it to measure. Base off the actual chain limit instead so
107// difficulty 1 is genuinely easy and vardiff has real data to retarget from.
108// Higher difficulty = smaller (harder) target.
109static uint256 ShareTargetFromDifficulty(double difficulty)
110{
111 if (difficulty <= 0.0) difficulty = 1.0;
112 static const uint256 diff1 = CBigNum(bnProofOfWorkLimit).getuint256();
113 // shareTarget = diff1 / difficulty
114 CBigNum bn; bn.setuint256(diff1);
115 // Multiply by 2^16 to keep precision, divide, shift back
116 bn <<= 16;
117 bn /= (uint64)(difficulty * 65536.0);
118 uint256 t = bn.getuint256();
119 // Cap at all-ones (maximum, easiest possible)
120 if (t < diff1 && difficulty < 1.0) t = ~uint256(0);
121 return t;
122}
180 123
181static std::mutex gJobMutex; 124// Expected number of hashes to find one share at a given Stratum difficulty,
182static StratumJob gCurrentJob; 125// on this chain's scale (difficulty 1 == bnProofOfWorkLimit, which needs on
183static bool gHaveJob = false; 126// average 2^12 = 4096 hashes). Used to turn "shares per second" into H/s.
184static std::atomic<uint32_t> gJobSeq{0}; 127static const double SHARE_HASHES_AT_DIFF_1 = 4096.0;
185 128static double ExpectedHashesForDifficulty(double difficulty)
186static uint256 MakeShareTarget(const uint256& blockTarget)
187{ 129{
188 uint256 shareTarget = blockTarget; 130 if (difficulty <= 0.0) difficulty = 1.0;
189 shareTarget <<= 8; 131 return difficulty * SHARE_HASHES_AT_DIFF_1;
190 if (shareTarget < blockTarget)
191 shareTarget = ~uint256(0);
192 return shareTarget;
193} 132}
194 133
134// Rebuild the current job from the best chain tip.
135// Must be called from the event loop thread (or startup, before the loop).
136// Returns true on success. Logs the specific failure reason on false.
195static bool RebuildJob() 137static bool RebuildJob()
196{ 138{
197 if (!pindexBest) return false; 139 CRITICAL_BLOCK(cs_main)
140 {
141 if (!pindexBest) {
142 LogPrint("pool", "RebuildJob: no chain tip (pindexBest is null)\n");
143 return false;
144 }
198 145
199 CBlockIndex* pindexPrev = pindexBest; 146 CBlockIndex* pindexPrev = pindexBest;
200 unsigned int nBits = GetNextWorkRequired(pindexPrev); 147 unsigned int nBits = GetNextWorkRequired(pindexPrev);
201 148
202 CKey key; 149 CKey key; key.MakeNewKey();
203 key.MakeNewKey(); 150 static std::atomic<uint32_t> sExtra{0};
204 static std::atomic<uint32_t> sExtra{0}; 151 uint32_t extraNonce = ++sExtra;
205 uint32_t extraNonce = ++sExtra;
206 152
207 CTransaction txNew; 153 CTransaction txNew;
208 txNew.vin.resize(1); 154 txNew.vin.resize(1);
209 txNew.vin[0].prevout.SetNull(); 155 txNew.vin[0].prevout.SetNull();
210 txNew.vin[0].scriptSig << nBits << (CBigNum)extraNonce; 156 txNew.vin[0].scriptSig << nBits << (CBigNum)extraNonce;
211 txNew.vout.resize(1); 157 txNew.vout.resize(1);
212 // Always pay coinbase to a fresh wallet key. DoPayouts() distributes 158 txNew.vout[0].scriptPubKey << key.GetPubKey() << OP_CHECKSIG;
213 // shares to miners via SendMoney() after the block is accepted.
214 txNew.vout[0].scriptPubKey << key.GetPubKey() << OP_CHECKSIG;
215 159
216 CBlock block; 160 CBlock block;
217 block.vtx.push_back(txNew); 161 block.vtx.push_back(txNew);
218 162
219 {
220 CTxDB txdb("r");
221 CRITICAL_BLOCK(cs_mapTransactions)
222 { 163 {
223 map<uint256,CTxIndex> pool; 164 CTxDB txdb("r");
224 unsigned int sz = 0; 165 CRITICAL_BLOCK(cs_mapTransactions)
225 for (auto& kv : mapTransactions) { 166 {
226 CTransaction& tx = kv.second; 167 map<uint256, CTxIndex> pool;
227 if (tx.IsCoinBase() || !tx.IsFinal()) continue; 168 unsigned int sz = 0;
228 int64 nFees = 0; 169 for (auto& kv : mapTransactions) {
229 int64 nMinFee = tx.GetMinFee(block.vtx.size() < 100); 170 CTransaction& tx = kv.second;
230 map<uint256,CTxIndex> tmp(pool); 171 if (tx.IsCoinBase() || !tx.IsFinal()) continue;
231 if (!tx.ConnectInputs(txdb, tmp, CDiskTxPos(1,1,1), 0, nFees, false, true, nMinFee)) continue; 172 int64 nFees = 0;
232 pool = tmp; 173 map<uint256, CTxIndex> tmp(pool);
233 block.vtx.push_back(tx); 174 if (!tx.ConnectInputs(txdb, tmp, CDiskTxPos(1,1,1), 0, nFees,
234 sz += ::GetSerializeSize(tx, SER_NETWORK); 175 false, true, tx.GetMinFee(block.vtx.size() < 100)))
235 if (sz > MAX_SIZE/2) break; 176 continue;
177 pool = tmp;
178 block.vtx.push_back(tx);
179 sz += ::GetSerializeSize(tx, SER_NETWORK);
180 if (sz > MAX_SIZE / 2) break;
181 }
236 } 182 }
237 } 183 }
184
185 block.vtx[0].vout[0].nValue = block.GetBlockValue(0);
186 block.hashPrevBlock = pindexPrev->GetBlockHash();
187 block.hashMerkleRoot = block.BuildMerkleTree();
188 block.nTime = max((unsigned int)(pindexPrev->GetMedianTimePast() + 1),
189 (unsigned int)GetAdjustedTime());
190 block.nBits = nBits;
191 block.nNonce = 1;
192 AddKey(key);
193
194 StratumJob job;
195 job.jobId = ToHex(&extraNonce, 4);
196 job.block = block;
197 job.target = CBigNum().SetCompact(nBits).getuint256();
198 job.height = nBestHeight + 1;
199
200 gCurrentJob = job;
201 gHaveJob = true;
202 return true;
238 } 203 }
239 block.vtx[0].vout[0].nValue = block.GetBlockValue(0); 204 return false;
240 block.hashPrevBlock = pindexPrev->GetBlockHash();
241 block.hashMerkleRoot = block.BuildMerkleTree();
242 block.nTime = max((unsigned int)(pindexPrev->GetMedianTimePast()+1),
243 (unsigned int)GetAdjustedTime());
244 block.nBits = nBits;
245 block.nNonce = 1;
246
247 AddKey(key);
248
249 StratumJob job;
250 job.jobId = ToHex(&extraNonce, 4);
251 job.block = block;
252 job.target = CBigNum().SetCompact(nBits).getuint256();
253 job.shareTarget = MakeShareTarget(job.target);
254 job.height = nBestHeight + 1;
255
256 std::lock_guard<std::mutex> lk(gJobMutex);
257 gCurrentJob = job;
258 gHaveJob = true;
259 ++gJobSeq;
260 return true;
261} 205}
262 206
263// --------------------------------------------------------------------------- 207// ---------------------------------------------------------------------------
264// PPLNS payout 208// Payouts -- event loop thread only
265// ---------------------------------------------------------------------------
266// ---------------------------------------------------------------------------
267// Deferred payouts — coinbase outputs require COINBASE_MATURITY (100) blocks
268// before they can be spent. We store the share snapshot when a block is found
269// and execute the actual SendMoney() calls once the coinbase matures.
270// --------------------------------------------------------------------------- 209// ---------------------------------------------------------------------------
271struct PendingPayout { 210struct PendingPayout {
272 int matureAtHeight; // pay out when nBestHeight >= this 211 int matureAtHeight;
273 std::map<std::string, int64> amounts; // addr -> BTF amount 212 std::map<std::string, int64> amounts; // address -> satoshis
274}; 213};
214static std::vector<PendingPayout> gPendingPayouts;
275 215
276static std::mutex gPayoutMutex; 216static std::string PayoutFilePath()
277static std::vector<PendingPayout> gPendingPayouts; 217{
218 return GetAppDir() + "/pending_payouts.json";
219}
278 220
279void GetPendingPayouts(std::vector<PendingPayoutView>& out) 221static void SavePendingPayouts()
280{ 222{
281 out.clear(); 223 nlohmann::json arr = nlohmann::json::array();
282 std::lock_guard<std::mutex> lk(gPayoutMutex); 224 for (const auto& pp : gPendingPayouts) {
283 for (const PendingPayout& p : gPendingPayouts) 225 nlohmann::json obj;
284 { 226 obj["matureAtHeight"] = pp.matureAtHeight;
285 PendingPayoutView view; 227 nlohmann::json amounts = nlohmann::json::object();
286 view.matureAtHeight = p.matureAtHeight; 228 for (const auto& kv : pp.amounts)
287 view.recipients = (int)p.amounts.size(); 229 amounts[kv.first] = kv.second;
288 view.totalAmount = 0; 230 obj["amounts"] = amounts;
289 for (const std::map<std::string, int64>::value_type& kv : p.amounts) 231 arr.push_back(obj);
290 view.totalAmount += kv.second; 232 }
291 out.push_back(view); 233 std::string path = PayoutFilePath();
234 FILE* f = fopen(path.c_str(), "w");
235 if (f) {
236 std::string s = arr.dump(2);
237 fwrite(s.c_str(), 1, s.size(), f);
238 fclose(f);
239 } else {
240 LogPrint("payout", "[payout] WARNING: could not write %s\n", path.c_str());
292 } 241 }
293} 242}
294 243
295// Called when a block is found: snapshot shares, schedule payout for maturity. 244static void LoadPendingPayouts()
296static void QueuePayouts(int blockHeight)
297{ 245{
298 if (nMineMode != MINE_OPERATOR) return; 246 std::string path = PayoutFilePath();
299 247 FILE* f = fopen(path.c_str(), "r");
300 std::map<std::string, uint64> shareCount; 248 if (!f) return; // no file yet -- first run, nothing to load
301 uint64 total = 0; 249 fseek(f, 0, SEEK_END);
302 { 250 long sz = ftell(f);
303 std::lock_guard<std::mutex> lk(gMinerStatsMutex); 251 fseek(f, 0, SEEK_SET);
304 for (std::map<std::string, MinerStats>::iterator it = gMinerStats.begin(); it != gMinerStats.end(); ++it) 252 std::string s(sz, '\0');
305 { 253 fread(&s[0], 1, sz, f);
306 MinerStats& ms = it->second; 254 fclose(f);
307 if (ms.roundShares == 0) 255 try {
308 continue; 256 nlohmann::json arr = nlohmann::json::parse(s);
309 if (ms.address.empty()) 257 for (const auto& obj : arr) {
310 continue; 258 PendingPayout pp;
311 shareCount[ms.address] += ms.roundShares; 259 pp.matureAtHeight = obj["matureAtHeight"].get<int>();
312 total += ms.roundShares; 260 for (auto it = obj["amounts"].begin(); it != obj["amounts"].end(); ++it)
313 ms.roundShares = 0; 261 pp.amounts[it.key()] = it.value().get<int64>();
262 gPendingPayouts.push_back(pp);
314 } 263 }
264 LogPrint("payout", "[payout] loaded %zu pending payout(s) from disk\n",
265 gPendingPayouts.size());
266 } catch (const std::exception& e) {
267 LogPrint("payout", "[payout] WARNING: failed to parse %s: %s\n",
268 path.c_str(), e.what());
269 }
270}
271
272// Payouts ready to execute are moved here under gPayoutExecMutex.
273// A dedicated thread drains this list so SendMoney (which takes cs_main)
274// never runs on the event loop thread and can't stall miner I/O.
275static std::vector<PendingPayout> gPayoutExecQueue;
276static std::mutex gPayoutExecMutex;
277static std::atomic<bool> gPayoutThreadRunning{false};
278
279static void QueuePayouts(int blockHeight,
280 const std::map<std::string, uint64>& shareCount,
281 uint64 total)
282{
283 if (total == 0) {
284 LogPrint("payout", "[payout] block %d: zero shares recorded -- nothing to pay out\n",
285 blockHeight);
286 return;
315 } 287 }
316 if (total == 0) return;
317 288
318 int64 blockReward = CBlock().GetBlockValue(0); 289 double feeFrac = dPoolFeePercent / 100.0;
290 if (feeFrac < 0.0) feeFrac = 0.0;
291 if (feeFrac > 1.0) feeFrac = 1.0;
292
293 // Compute the block subsidy at the height that was just found.
294 // We do not include tx fees in miner payout -- those stay in the operator
295 // wallet as part of the coinbase, which is the operator's cut on top of feeFrac.
296 int64 nSubsidy = 50 * COIN;
297 nSubsidy >>= (blockHeight / 210000); // halving schedule
298 int64 minerReward = (int64)((double)nSubsidy * (1.0 - feeFrac));
299
319 PendingPayout pp; 300 PendingPayout pp;
320 pp.matureAtHeight = blockHeight + COINBASE_MATURITY; 301 pp.matureAtHeight = blockHeight + COINBASE_MATURITY;
302
303 int skipped = 0;
304 int64 burned = 0; // amount owed to miners with bad/empty addresses
321 for (auto& kv : shareCount) { 305 for (auto& kv : shareCount) {
322 int64 amount = (int64)(((double)kv.second / (double)total) * (double)blockReward); 306 int64 amount = (int64)(((double)kv.second / (double)total) * (double)minerReward);
323 if (amount >= CENT) 307 if (amount < CENT) {
324 pp.amounts[kv.first] = amount; 308 skipped++;
309 continue;
310 }
311 uint160 addrCheck;
312 if (kv.first.empty() || !AddressToHash160(kv.first, addrCheck)) {
313 // Address was invalid at authorize time (warned then). Their share
314 // of the reward cannot be paid -- log the amount so it's visible.
315 burned += amount;
316 LogPrint("payout", "[payout] WARNING: %s owed to miner with invalid"
317 " address '%s' -- cannot pay out, amount forfeited\n",
318 FormatMoney(amount).c_str(), kv.first.c_str());
319 continue;
320 }
321 pp.amounts[kv.first] = amount;
325 } 322 }
326 323
327 { std::lock_guard<std::mutex> lk(gPayoutMutex); gPendingPayouts.push_back(pp); } 324 gPendingPayouts.push_back(pp);
328 325 SavePendingPayouts();
329 printf("Pool: block %d payout queued for height %d (%zu miners)\n", 326
330 blockHeight, pp.matureAtHeight, pp.amounts.size()); 327 int64 operatorCut = nSubsidy - minerReward;
328 LogPrint("payout",
329 "[payout] block %d: subsidy %s BTF, miners get %s"
330 " (fee %.2f%% = %s to operator),"
331 " %zu recipients, matures height %d,"
332 " %d below dust%s\n",
333 blockHeight,
334 FormatMoney(nSubsidy).c_str(),
335 FormatMoney(minerReward).c_str(),
336 dPoolFeePercent,
337 FormatMoney(operatorCut).c_str(),
338 pp.amounts.size(), pp.matureAtHeight, skipped,
339 burned > 0 ? (", " + FormatMoney(burned) + " forfeited (bad address)").c_str()
340 : "");
331} 341}
332 342
333// Called from JobWatcher every new block: execute any matured payouts. 343// Called from event loop: move matured entries to the exec queue (fast).
344// Save BEFORE moving to exec queue: if we crash between the save and SendMoney,
345// LoadPendingPayouts re-queues them from the exec-queue section of the file.
334static void FlushMaturePayouts() 346static void FlushMaturePayouts()
335{ 347{
336 if (nMineMode != MINE_OPERATOR) return; 348 std::vector<PendingPayout> ready;
337
338 std::lock_guard<std::mutex> lk(gPayoutMutex);
339 for (auto it = gPendingPayouts.begin(); it != gPendingPayouts.end(); ) { 349 for (auto it = gPendingPayouts.begin(); it != gPendingPayouts.end(); ) {
340 if (nBestHeight < it->matureAtHeight) { ++it; continue; } 350 if (nBestHeight < it->matureAtHeight) { ++it; continue; }
341 351 LogPrint("payout", "[payout] block height %d matured -- queuing %zu payments\n",
342 printf("Pool: executing payout for block matured at height %d\n", it->matureAtHeight); 352 it->matureAtHeight, it->amounts.size());
343 for (auto& kv : it->amounts) { 353 ready.push_back(*it); // copy first; erase after save
344 uint160 hash160; 354 ++it;
345 if (!AddressToHash160(kv.first, hash160)) continue; 355 }
346 CScript scriptPubKey; 356 if (!ready.empty()) {
347 scriptPubKey << OP_DUP << OP_HASH160 << hash160 << OP_EQUALVERIFY << OP_CHECKSIG; 357 // Erase from pending then save before handing off to exec thread,
348 CWalletTx wtx; 358 // so the file never contains an entry that is already being sent.
349 wtx.mapValue["comment"] = strprintf("Pool payout height %d", it->matureAtHeight); 359 for (auto it = gPendingPayouts.begin(); it != gPendingPayouts.end(); ) {
350 if (SendMoney(scriptPubKey, kv.second, wtx)) 360 if (nBestHeight >= it->matureAtHeight)
351 printf("Pool: paid %s to %s\n", FormatMoney(kv.second).c_str(), kv.first.c_str()); 361 it = gPendingPayouts.erase(it);
352 else 362 else
353 printf("Pool: payout FAILED for %s (will not retry)\n", kv.first.c_str()); 363 ++it;
364 }
365 SavePendingPayouts();
366 std::lock_guard<std::mutex> lk(gPayoutExecMutex);
367 for (auto& pp : ready)
368 gPayoutExecQueue.push_back(std::move(pp));
369 }
370}
371
372// Payout execution thread: drains gPayoutExecQueue, calls SendMoney.
373// Runs independently of the event loop so slow wallet operations
374// (SendMoney takes cs_main) never stall miner I/O.
375static void PayoutThreadFn(void*)
376{
377 gPayoutThreadRunning = true;
378 LogPrint("payout", "[payout] payout thread started\n");
379
380 while (!fShutdown && gPoolRunning) {
381 std::vector<PendingPayout> batch;
382 {
383 std::lock_guard<std::mutex> lk(gPayoutExecMutex);
384 batch.swap(gPayoutExecQueue);
385 }
386
387 for (auto& pp : batch) {
388 LogPrint("payout", "[payout] executing payments for block matured at %d"
389 " (%zu miners)\n", pp.matureAtHeight, pp.amounts.size());
390 for (auto& kv : pp.amounts) {
391 uint160 h160;
392 if (!AddressToHash160(kv.first, h160)) {
393 // Should not happen -- bad addresses are filtered in QueuePayouts
394 LogPrint("payout", "[payout] SKIPPED bad address '%s'\n",
395 kv.first.c_str());
396 continue;
397 }
398 CScript sc;
399 sc << OP_DUP << OP_HASH160 << h160 << OP_EQUALVERIFY << OP_CHECKSIG;
400 CWalletTx wtx;
401 wtx.mapValue["comment"] = strprintf("Pool payout height %d",
402 pp.matureAtHeight);
403 if (SendMoney(sc, kv.second, wtx))
404 LogPrint("payout", "[payout] paid %s to %s\n",
405 FormatMoney(kv.second).c_str(), kv.first.c_str());
406 else
407 LogPrint("payout", "[payout] FAILED to pay %s to %s"
408 " (insufficient funds or wallet locked?)\n",
409 FormatMoney(kv.second).c_str(), kv.first.c_str());
410 }
354 } 411 }
355 it = gPendingPayouts.erase(it); 412
413 Sleep(500); // check for new work every 500ms
356 } 414 }
415
416 gPayoutThreadRunning = false;
417 LogPrint("payout", "[payout] payout thread stopped\n");
357} 418}
358 419
359// --------------------------------------------------------------------------- 420// ---------------------------------------------------------------------------
360// Stratum protocol 421// GUI stats snapshot -- event loop writes, GUI threads read
361// --------------------------------------------------------------------------- 422// ---------------------------------------------------------------------------
362static json MakeNotifyParams(const StratumJob& job, bool clean) 423struct StatsSnapshot {
424 int authorizedMiners = 0;
425 int blocksFound = 0;
426 uint64 roundShares = 0;
427 double totalHashRate = 0.0;
428};
429static StatsSnapshot gStats;
430static std::vector<PoolWorkerStatView> gWorkerStats;
431static std::vector<PendingPayoutView> gPayoutViews;
432static std::mutex gStatsMutex;
433
434void GetPoolOperatorStats(int& authorizedMiners, int& blocksFound, uint64& roundShares, double& totalHashRate)
363{ 435{
364 CBlock& b = const_cast<CBlock&>(job.block); 436 std::lock_guard<std::mutex> lk(gStatsMutex);
365 unsigned char hdr[80]; 437 authorizedMiners = gStats.authorizedMiners;
366 memcpy(hdr, &b.nVersion, 4); 438 blocksFound = gStats.blocksFound;
367 memcpy(hdr+4, &b.hashPrevBlock, 32); 439 roundShares = gStats.roundShares;
368 memcpy(hdr+36, &b.hashMerkleRoot, 32); 440 totalHashRate = gStats.totalHashRate;
369 memcpy(hdr+68, &b.nTime, 4); 441}
370 memcpy(hdr+72, &b.nBits, 4); 442
371 memcpy(hdr+76, &b.nNonce, 4); 443void GetPoolWorkerStats(std::vector<PoolWorkerStatView>& out)
372 unsigned char shareTgt[32]; memcpy(shareTgt, &job.shareTarget, 32); 444{
373 return json::array({job.jobId, ToHex(hdr,80), b.hashPrevBlock.GetHex(), ToHex(shareTgt,32), clean}); 445 std::lock_guard<std::mutex> lk(gStatsMutex);
446 out = gWorkerStats;
447}
448
449void GetPendingPayouts(std::vector<PendingPayoutView>& out)
450{
451 std::lock_guard<std::mutex> lk(gStatsMutex);
452 out = gPayoutViews;
374} 453}
375 454
455// ---------------------------------------------------------------------------
456// Miner state -- event loop thread only
457// ---------------------------------------------------------------------------
458static std::atomic<uint32_t> gNextExtranonce2{1};
459
460// Vardiff target: aim for one share every VARDIFF_TARGET_SECS seconds per miner.
461// After VARDIFF_SHARES_PER_CHECK shares, recalculate and adjust if rate is off
462// by more than 50%. Shares are the stable unit; difficulty floats to match.
463static const int64 VARDIFF_TARGET_SECS = 15; // one share every 15s
464static const uint64 VARDIFF_SHARES_PER_CHECK = 5; // re-evaluate every 5 shares
465static const double VARDIFF_RETARGET_RATIO = 1.5; // adjust if >50% off target
466static const double VARDIFF_MIN = 0.001;
467static const double VARDIFF_MAX = 1e12;
468// If a miner has gone this long since its vardiff window opened with ZERO
469// shares, the normal vardiff retarget (which only fires after
470// VARDIFF_SHARES_PER_CHECK shares) can never trigger -- it has no samples to
471// act on. This is the residual gap the ShareTargetFromDifficulty fix above
472// doesn't cover: even with a correctly-easy diff-1 target, a miner stuck in
473// RandomX light mode (or otherwise much slower than expected) can go
474// indefinitely without a single share, and difficulty would never drop to
475// meet it. Force a difficulty cut on a timeout instead of waiting for shares
476// that will never come.
477static const int64 VARDIFF_STALL_SECS = 45; // 3x share target -- reacts faster without false-triggering on normal variance
478static const double VARDIFF_STALL_CUT = 4.0; // divide difficulty by this much
479
376struct Miner { 480struct Miner {
377 SOCKET fd; 481 btf_socket_t fd;
378 bool authorised; 482 bool authorised = false;
379 std::string address; 483 std::string address;
380 std::string worker; 484 std::string worker;
381 std::string readBuf; 485 std::string readBuf;
382 int64 connectTime; 486 int64 connectTime;
383 uint64 sessionShares; 487 uint64 sessionShares = 0;
384 Miner(SOCKET f) : fd(f), authorised(false), connectTime(GetTime()), sessionShares(0) {} 488 uint64 roundShares = 0;
489 uint64 totalShares = 0;
490 int64 lastSeen = 0;
491 uint32_t extranonce2;
492
493 // Vardiff state
494 double difficulty = 1.0; // current share difficulty sent to this miner
495 uint256 shareTarget; // derived from difficulty; what we check against
496 int64 vardiffWindowStart = 0; // when the current vardiff window opened
497 uint64 vardiffShares = 0; // shares found in current window
498
499 // Hashrate estimate -- EWMA of (expected hashes per share at current
500 // difficulty) / (seconds since the previous share). We had all the data
501 // to compute this (difficulty + share timing) but never actually did,
502 // so pool/GUI hashrate always showed as zero/missing.
503 int64 lastShareTime = 0; // GetTime() of the previous accepted share
504 double hashRate = 0.0; // smoothed H/s estimate
505
506 explicit Miner(btf_socket_t f)
507 : fd(f), connectTime(GetTime()),
508 extranonce2(gNextExtranonce2.fetch_add(1)) {}
385}; 509};
386 510
387void GetPoolOperatorStats(int& authorizedMiners, int& blocksFound, uint64& roundShares) 511static std::vector<Miner*> gMiners;
512
513struct FoundBlock { int height; int64 ts; std::string addr; };
514static std::deque<FoundBlock> gFoundBlocks;
515
516// ---------------------------------------------------------------------------
517// Accept queue -- accept threads push; event loop pops at top of each tick
518// ---------------------------------------------------------------------------
519static std::vector<btf_socket_t> gReadyQueue;
520static std::mutex gReadyMutex;
521
522static void PushReady(btf_socket_t s)
388{ 523{
389 authorizedMiners = 0; 524 std::lock_guard<std::mutex> lk(gReadyMutex);
390 blocksFound = 0; 525 gReadyQueue.push_back(s);
391 roundShares = 0; 526}
392 { 527
393 std::lock_guard<std::mutex> lk(gMinersMutex); 528// ---------------------------------------------------------------------------
394 for (Miner* m : gMiners) 529// I/O helpers -- event loop thread only
395 if (m->authorised) 530// ---------------------------------------------------------------------------
396 authorizedMiners++; 531
532// Blocking send of a complete JSON line. Called only from the event loop so
533// no other thread is writing to the same fd concurrently.
534static bool SendLine(btf_socket_t fd, const json& j)
535{
536 std::string s = j.dump() + "\n";
537 int off = 0, total = (int)s.size();
538 while (off < total) {
539 int r = send(fd, s.c_str() + off, total - off, SEND_FLAGS);
540 if (r <= 0) return false;
541 off += r;
397 } 542 }
398 { 543 return true;
399 std::lock_guard<std::mutex> lk(gBlocksMutex); 544}
400 blocksFound = (int)gFoundBlocks.size(); 545
546// Non-blocking recv: pull whatever bytes are available now into buf, then
547// return one complete line if one is ready. Three outcomes:
548// true -- line is filled; buf may still contain more lines
549// false, errno EAGAIN/EWOULDBLOCK (or FIONREAD==0) -- no data right now
550// false, r==0 -- clean disconnect; caller must treat fd as dead
551// Caller distinguishes disconnect from "not yet" by checking whether
552// line.empty() after a false return (line is "" on both paths, so we
553// use a separate out-param for the disconnect signal).
554static bool RecvLine(btf_socket_t fd, std::string& buf,
555 std::string& line, bool& disconnected)
556{
557 disconnected = false;
558 char tmp[4096];
559
560#ifdef _WIN32
561 u_long avail = 0;
562 ioctlsocket(fd, FIONREAD, &avail);
563 if (avail > 0) {
564 int r = recv(fd, tmp, (int)std::min((u_long)(sizeof(tmp)-1), avail), 0);
565 if (r > 0) { tmp[r] = 0; buf += tmp; }
566 else if (r == 0){ disconnected = true; return false; }
567 // r < 0: WSAEWOULDBLOCK -- fall through with what we have
401 } 568 }
569#else
402 { 570 {
403 std::lock_guard<std::mutex> lk(gMinerStatsMutex); 571 int r = recv(fd, tmp, sizeof(tmp) - 1, MSG_DONTWAIT);
404 for (std::map<std::string, MinerStats>::const_iterator it = gMinerStats.begin(); it != gMinerStats.end(); ++it) 572 if (r > 0) { tmp[r] = 0; buf += tmp; }
405 roundShares += it->second.roundShares; 573 else if (r == 0) { disconnected = true; return false; }
574 // r < 0: EAGAIN/EWOULDBLOCK -- fall through with what we have
406 } 575 }
576#endif
577
578 size_t pos = buf.find('\n');
579 if (pos == std::string::npos) return false; // no complete line yet
580
581 line = buf.substr(0, pos);
582 if (!line.empty() && line.back() == '\r') line.pop_back();
583 buf = buf.substr(pos + 1);
584 return true;
407} 585}
408 586
409static bool SendLine(Miner* m, const json& j) 587// ---------------------------------------------------------------------------
588// Job helpers
589// ---------------------------------------------------------------------------
590static CBlock BuildMinerBlock(const StratumJob& job, uint32_t extranonce2)
410{ 591{
411 std::string s = j.dump() + "\n"; 592 CBlock blk = job.block;
412 int off = 0; 593 blk.vtx[0].vin[0].scriptSig << (CBigNum)extranonce2;
413 while (off < (int)s.size()) { 594 blk.hashMerkleRoot = blk.BuildMerkleTree();
414 int n = send(m->fd, s.c_str() + off, (int)s.size() - off, SEND_FLAGS); 595 return blk;
415 if (n <= 0) 596}
416 return false; 597
417 off += n; 598// shareTarget is per-miner (set by vardiff) and passed explicitly so the
418 } 599// value in p[3] of mining.notify always matches what HandleLine checks on submit.
419 return true; 600// This is the single source of truth for share difficulty.
601static json MakeNotifyParams(const StratumJob& job, const CBlock& b,
602 const uint256& shareTarget, bool clean)
603{
604 unsigned char hdr[80];
605 memcpy(hdr, &b.nVersion, 4);
606 memcpy(hdr+4, &b.hashPrevBlock, 32);
607 memcpy(hdr+36, &b.hashMerkleRoot, 32);
608 memcpy(hdr+68, &b.nTime, 4);
609 memcpy(hdr+72, &b.nBits, 4);
610 memcpy(hdr+76, &b.nNonce, 4);
611 unsigned char tgt[32]; memcpy(tgt, &shareTarget, 32);
612 return json::array({job.jobId, ToHex(hdr, 80),
613 b.hashPrevBlock.GetHex(), ToHex(tgt, 32), clean});
614}
615
616static void SendJob(Miner* m, bool clean)
617{
618 if (!gHaveJob) return;
619 CBlock mb = BuildMinerBlock(gCurrentJob, m->extranonce2);
620 // Use this miner's own shareTarget (set by vardiff) in the notify params.
621 // The participant miner reads p[3] as its share target, and HandleLine
622 // checks m->shareTarget on submit -- both sides now use the same value.
623 json n = {{"id",nullptr},{"method","mining.notify"},
624 {"params", MakeNotifyParams(gCurrentJob, mb, m->shareTarget, clean)}};
625 if (!SendLine(m->fd, n))
626 LogPrint("worker", "[pool->worker] job send FAILED for %s -- miner will be dropped\n",
627 m->address.empty() ? "(not yet authorized)" : m->address.c_str());
420} 628}
421 629
422static void BroadcastJob(bool clean) 630static void BroadcastJob(bool clean)
423{ 631{
424 StratumJob job; 632 if (!gHaveJob) return;
425 { std::lock_guard<std::mutex> lk(gJobMutex); if(!gHaveJob) return; job=gCurrentJob; } 633 int sent = 0;
426 json n = {{"id",nullptr},{"method","mining.notify"},{"params",MakeNotifyParams(job,clean)}}; 634 for (Miner* m : gMiners) {
427 std::lock_guard<std::mutex> lk(gMinersMutex); 635 if (!m->authorised) continue;
428 for (Miner* m : gMiners) 636 SendJob(m, clean);
429 if (m->authorised && !SendLine(m, n)) 637 sent++;
430 printf("Stratum: failed to broadcast job to %s\n", m->address.c_str()); 638 }
639 LogPrint("pool", "[pool] job %s broadcast to %d miner(s)\n",
640 gCurrentJob.jobId.c_str(), sent);
431} 641}
432 642
433static void HandleLine(Miner* m, const std::string& line) 643// ---------------------------------------------------------------------------
644// Stratum message handler -- called for each complete line from a miner
645// Returns false if the miner should be disconnected immediately.
646// ---------------------------------------------------------------------------
647static bool HandleLine(Miner* m, const std::string& rawLine,
648 std::map<std::string, uint64>& roundShareCount,
649 uint64& roundShareTotal,
650 int& blocksFoundThisSession)
434{ 651{
435 json req; 652 json req;
436 try { req = json::parse(line); } catch(...){ return; } 653 try { req = json::parse(rawLine); }
654 catch (...) {
655 LogPrint("worker", "[worker] JSON parse error from %s: %.80s\n",
656 m->address.empty() ? "(unauth)" : m->address.c_str(),
657 rawLine.c_str());
658 return true; // don't disconnect on bad JSON, just ignore the line
659 }
437 660
438 json id = req.value("id", json(nullptr)); 661 json id = req.value("id", json(nullptr));
439 std::string method = req.value("method",""); 662 std::string method = req.value("method", "");
440 663
441 auto reply = [&](json result, json error=nullptr){ 664 // Reply helper: always sends result+error pair as Stratum requires
442 if (!SendLine(m, json{{"id",id},{"result",result},{"error",error}})) 665 auto reply = [&](json result, std::string error = "") {
443 printf("Stratum: failed to reply to miner %s\n", m->address.c_str()); 666 json err = error.empty() ? json(nullptr) : json(error);
667 if (!SendLine(m->fd, json{{"id",id},{"result",result},{"error",err}}))
668 LogPrint("worker", "[pool->worker] reply send FAILED for %s (method=%s)\n",
669 m->address.empty() ? "(unauth)" : m->address.c_str(),
670 method.c_str());
444 }; 671 };
445 672
673 // ------------------------------------------------------------------
446 if (method == "mining.subscribe") { 674 if (method == "mining.subscribe") {
447 std::string sid = ToHex(&m->fd, 4); 675 std::string sid = ToHex(&m->fd, 4);
448 printf("Stratum: miner subscribed %s\n", sid.c_str()); 676 LogPrint("worker", "[worker->pool] subscribe from fd=%d sid=%s\n",
677 (int)m->fd, sid.c_str());
449 reply(json::array({json::array({json::array({"mining.notify",sid})}),sid,4})); 678 reply(json::array({json::array({json::array({"mining.notify",sid})}),sid,4}));
450 return; 679 return true;
451 } 680 }
452 681
682 // ------------------------------------------------------------------
453 if (method == "mining.authorize") { 683 if (method == "mining.authorize") {
454 auto& p = req["params"]; 684 auto& p = req["params"];
455 m->address = (p.size()>0 && p[0].is_string()) ? p[0].get<std::string>() : ""; 685 m->address = (p.size() > 0 && p[0].is_string()) ? p[0].get<std::string>() : "";
456 m->worker = (p.size()>1 && p[1].is_string()) ? p[1].get<std::string>() : "worker"; 686 m->worker = (p.size() > 1 && p[1].is_string()) ? p[1].get<std::string>() : "worker";
457 m->authorised = true; 687 m->lastSeen = GetTime();
458 printf("Stratum: miner authorized address=%s worker=%s\n", m->address.c_str(), m->worker.c_str());
459 reply(true);
460 688
461 uint160 h; bool valid = AddressToHash160(m->address, h); 689 // Validate address before authorising
462 if (!valid) printf("Stratum: miner %s invalid address '%s' — shares won't pay out\n", 690 uint160 h160; bool validAddr = AddressToHash160(m->address, h160);
463 m->worker.c_str(), m->address.c_str());
464 691
465 { std::lock_guard<std::mutex> lk(gMinerStatsMutex); 692 m->authorised = true; // authorise regardless -- shares just won't pay out
466 auto& ms = gMinerStats[m->address]; 693 LogPrint("worker", "[worker->pool] authorize address=%s worker=%s addr_valid=%s\n",
467 ms.lastSeen = GetTime(); ms.worker = m->worker; } 694 m->address.c_str(), m->worker.c_str(), validAddr ? "yes" : "NO");
468 695
469 if (!SendLine(m, json{{"id",nullptr},{"method","mining.set_difficulty"},{"params",json::array({1})}})) 696 if (!validAddr)
470 printf("Stratum: failed to send difficulty to %s\n", m->address.c_str()); 697 LogPrint("worker", "[pool] WARNING: address '%s' is invalid -- "
698 "miner will hash but shares cannot be paid out\n",
699 m->address.c_str());
471 700
472 StratumJob job; bool have; 701 reply(true);
473 { std::lock_guard<std::mutex> lk(gJobMutex); have=gHaveJob; if(have) job=gCurrentJob; } 702
474 if (have) { 703 // Initialize vardiff state and send initial difficulty
475 printf("Stratum: sending job %s to %s\n", job.jobId.c_str(), m->address.c_str()); 704 m->difficulty = 1.0;
476 if (!SendLine(m, json{{"id",nullptr},{"method","mining.notify"},{"params",MakeNotifyParams(job,true)}})) 705 m->shareTarget = ShareTargetFromDifficulty(m->difficulty);
477 printf("Stratum: failed to send job %s to %s\n", job.jobId.c_str(), m->address.c_str()); 706 m->vardiffWindowStart = GetTime();
707 m->vardiffShares = 0;
708 LogPrint("worker", "[pool->worker] initial difficulty=%.4f for %s\n",
709 m->difficulty, m->address.c_str());
710 if (!SendLine(m->fd, json{{"id",nullptr},{"method","mining.set_difficulty"},
711 {"params",json::array({m->difficulty})}}))
712 LogPrint("worker", "[pool->worker] set_difficulty send FAILED for %s\n",
713 m->address.c_str());
714
715 if (gHaveJob) {
716 LogPrint("worker", "[pool->worker] sending job %s to %s\n",
717 gCurrentJob.jobId.c_str(), m->address.c_str());
718 SendJob(m, true);
478 } else { 719 } else {
479 printf("Stratum: no job available for %s\n", m->address.c_str()); 720 LogPrint("worker", "[pool->worker] no job available yet for %s"
721 " -- will be sent one as soon as the pool builds it\n",
722 m->address.c_str());
480 } 723 }
481 return; 724 return true;
482 } 725 }
483 726
484 if (method == "mining.extranonce.subscribe") { reply(true); return; } 727 // ------------------------------------------------------------------
728 if (method == "mining.extranonce.subscribe") { reply(true); return true; }
729 if (method == "mining.get_transactions") { reply(json::array()); return true; }
485 730
731 // ------------------------------------------------------------------
486 if (method == "mining.submit") { 732 if (method == "mining.submit") {
487 if (!m->authorised) { reply(false,"not authorised"); return; } 733 if (!m->authorised) {
734 LogPrint("worker", "[worker->pool] submit from unauthorized miner (fd=%d)\n",
735 (int)m->fd);
736 reply(false, "not authorised");
737 return true;
738 }
488 739
489 auto& p = req["params"]; 740 auto& p = req["params"];
490 if (p.size() < 4) { reply(false,"bad params"); return; } 741 if (p.size() < 3) {
742 LogPrint("worker", "[worker->pool] submit bad params from %s (size=%zu)\n",
743 m->address.c_str(), p.size());
744 reply(false, "bad params");
745 return true;
746 }
491 747
492 std::string jobId = p[1].get<std::string>(); 748 std::string submitJobId = p[1].get<std::string>();
493 std::string nonceHex = p[2].get<std::string>(); 749 std::string nonceHex = p[2].get<std::string>();
494 750
495 StratumJob job; 751 if (!gHaveJob) {
496 { std::lock_guard<std::mutex> lk(gJobMutex); 752 LogPrint("worker", "[worker->pool] submit from %s but pool has no current job\n",
497 if (!gHaveJob || gCurrentJob.jobId != jobId) { reply(false,"stale job"); return; } 753 m->address.c_str());
498 job = gCurrentJob; } 754 reply(false, "stale job");
755 return true;
756 }
757 if (gCurrentJob.jobId != submitJobId) {
758 LogPrint("worker", "[worker->pool] submit stale job from %s"
759 " (submitted=%s current=%s)\n",
760 m->address.c_str(), submitJobId.c_str(), gCurrentJob.jobId.c_str());
761 reply(false, "stale job");
762 return true;
763 }
499 764
500 auto nb = FromHex(nonceHex); 765 auto nb = FromHex(nonceHex);
501 if (nb.size()<4) { reply(false,"bad nonce"); return; } 766 if (nb.size() < 4) {
767 LogPrint("worker", "[worker->pool] submit bad nonce from %s: '%s'\n",
768 m->address.c_str(), nonceHex.c_str());
769 reply(false, "bad nonce");
770 return true;
771 }
502 unsigned int nNonce; memcpy(&nNonce, nb.data(), 4); 772 unsigned int nNonce; memcpy(&nNonce, nb.data(), 4);
503 773
504 CBlock& b = job.block; 774 // Rebuild this miner's exact block (unique merkle via extranonce2)
775 CBlock b = BuildMinerBlock(gCurrentJob, m->extranonce2);
505 b.nNonce = nNonce; 776 b.nNonce = nNonce;
506 unsigned char hdr[80]; 777 unsigned char hdr[80];
507 memcpy(hdr, &b.nVersion, 4); 778 memcpy(hdr, &b.nVersion, 4);
508 memcpy(hdr+4, &b.hashPrevBlock, 32); 779 memcpy(hdr+4, &b.hashPrevBlock, 32);
509 memcpy(hdr+36, &b.hashMerkleRoot,32); 780 memcpy(hdr+36, &b.hashMerkleRoot, 32);
510 memcpy(hdr+68, &b.nTime, 4); 781 memcpy(hdr+68, &b.nTime, 4);
511 memcpy(hdr+72, &b.nBits, 4); 782 memcpy(hdr+72, &b.nBits, 4);
512 memcpy(hdr+76, &b.nNonce, 4); 783 memcpy(hdr+76, &b.nNonce, 4);
513 784
514 uint256 powHash = RandomXPoWHash(hdr, 80); 785 uint256 powHash = RandomXPoWHash(hdr, 80);
515 786
516 // Record share in the current round. 787 // Check against this miner's personal share target (set by vardiff)
517 std::string key = MinerKey(m->address, m->worker); 788 if (powHash > m->shareTarget) {
518 { std::lock_guard<std::mutex> lk(gMinerStatsMutex); 789 LogPrint("worker", "[worker->pool] high-hash from %s"
519 MinerStats& ms = gMinerStats[key]; 790 " nonce=%u (difficulty=%.4f)\n",
520 ms.address = m->address; 791 m->address.c_str(), nNonce, m->difficulty);
521 ms.worker = m->worker; 792 reply(false, "high-hash");
522 ms.roundShares++; 793 return true;
523 ms.totalShares++; 794 }
524 ms.lastSeen = GetTime(); } 795
796 // Valid share -- record it
525 m->sessionShares++; 797 m->sessionShares++;
798 m->roundShares++;
799 m->totalShares++;
800 m->vardiffShares++;
801 int64 shareTime = GetTime();
802 m->lastSeen = shareTime;
803 roundShareCount[m->address]++;
804 roundShareTotal++;
805
806 // Update hashrate estimate: expected hashes for this share divided by
807 // the time since the last one, smoothed with an EWMA so a single fast
808 // or slow share doesn't make the number jump around.
809 if (m->lastShareTime > 0) {
810 int64 dt = shareTime - m->lastShareTime;
811 if (dt <= 0) dt = 1;
812 double inst = ExpectedHashesForDifficulty(m->difficulty) / (double)dt;
813 const double alpha = 0.25;
814 m->hashRate = (m->hashRate <= 0.0) ? inst
815 : alpha * inst + (1.0 - alpha) * m->hashRate;
816 }
817 m->lastShareTime = shareTime;
526 818
527 if (powHash > job.shareTarget) { reply(true); return; } // valid share, not a full block 819 LogPrint("worker", "[worker->pool] valid share from %s"
820 " nonce=%u job=%s difficulty=%.4f (session: %llu)\n",
821 m->address.c_str(), nNonce,
822 gCurrentJob.jobId.c_str(), m->difficulty,
823 (unsigned long long)m->sessionShares);
824 reply(true);
825
826 // Vardiff: after every VARDIFF_SHARES_PER_CHECK shares, check rate
827 if (m->vardiffShares >= VARDIFF_SHARES_PER_CHECK) {
828 int64 elapsed = GetTime() - m->vardiffWindowStart;
829 if (elapsed <= 0) elapsed = 1;
830 double actualSecsPerShare = (double)elapsed / (double)m->vardiffShares;
831 double ratio = actualSecsPerShare / (double)VARDIFF_TARGET_SECS;
832 // ratio < 1 means shares arriving faster than target (too easy)
833 // ratio > 1 means shares arriving slower than target (too hard)
834 if (ratio < (1.0 / VARDIFF_RETARGET_RATIO) ||
835 ratio > VARDIFF_RETARGET_RATIO) {
836 // New difficulty scales inversely with actual share rate
837 double newDiff = m->difficulty / ratio;
838 if (newDiff < VARDIFF_MIN) newDiff = VARDIFF_MIN;
839 if (newDiff > VARDIFF_MAX) newDiff = VARDIFF_MAX;
840 // Only apply if the change is meaningful (>10%)
841 if (newDiff / m->difficulty > 1.1 || m->difficulty / newDiff > 1.1) {
842 m->difficulty = newDiff;
843 m->shareTarget = ShareTargetFromDifficulty(m->difficulty);
844 LogPrint("worker", "[pool] vardiff: %s new difficulty=%.4f"
845 " (%.1fs/share actual vs %ds target)\n",
846 m->address.c_str(), m->difficulty,
847 actualSecsPerShare, (int)VARDIFF_TARGET_SECS);
848 SendLine(m->fd, json{{"id",nullptr},
849 {"method","mining.set_difficulty"},
850 {"params",json::array({m->difficulty})}});
851 // set_difficulty alone doesn't change what the worker
852 // actually hashes against -- it only reads its share
853 // target from mining.notify params[3]. Without this, the
854 // new difficulty wouldn't take effect until the next
855 // natural job broadcast (new block, or the 60s trickle
856 // refresh), so push a fresh notify for this miner now.
857 SendJob(m, false);
858 }
859 }
860 // Reset window
861 m->vardiffWindowStart = GetTime();
862 m->vardiffShares = 0;
863 }
864
865 if (powHash > gCurrentJob.target) return true; // valid share, not a block
866
867 // Full difficulty met -- submit block to the chain
868 LogPrint("pool", "[pool] BLOCK CANDIDATE from %s height=%d nNonce=%u -- submitting\n",
869 m->address.c_str(), gCurrentJob.height, nNonce);
528 870
529 // Full block
530 CBlock* pblock = new CBlock(b); 871 CBlock* pblock = new CBlock(b);
531 bool accepted = false; 872 bool accepted = false;
532 CRITICAL_BLOCK(cs_main) 873 CRITICAL_BLOCK(cs_main)
533 { 874 {
875 int heightBefore = nBestHeight;
534 if (ProcessBlock(NULL, pblock)) { 876 if (ProcessBlock(NULL, pblock)) {
535 accepted = true; 877 // ProcessBlock returns true for orphans too -- verify the chain
536 printf("Pool: BLOCK FOUND by %s height=%d nNonce=%u\n", 878 // actually advanced. If nBestHeight didn't increase, the block
537 m->address.c_str(), job.height, nNonce); 879 // was shelved as an orphan (pool was behind the chain tip) and
538 FoundBlock fb{job.height, GetTime(), m->address, pblock->GetHash()}; 880 // no coinbase was added to the wallet. Do not pay out.
539 { std::lock_guard<std::mutex> lk(gBlocksMutex); 881 if (nBestHeight > heightBefore) {
540 gFoundBlocks.push_front(fb); 882 accepted = true;
541 if (gFoundBlocks.size()>50) gFoundBlocks.pop_back(); } 883 LogPrint("pool", "[pool] BLOCK ACCEPTED height=%d by %s\n",
542 { std::lock_guard<std::mutex> lk(gJobMutex); gHaveJob=false; } 884 gCurrentJob.height, m->address.c_str());
885 gFoundBlocks.push_front({gCurrentJob.height, GetTime(), m->address});
886 if (gFoundBlocks.size() > 50) gFoundBlocks.pop_back();
887 blocksFoundThisSession++;
888 gHaveJob = false; // invalidate job immediately
889 } else {
890 LogPrint("pool", "[pool] BLOCK ORPHANED height=%d by %s"
891 " -- pool was behind chain tip, no payout\n",
892 gCurrentJob.height, m->address.c_str());
893 gHaveJob = false; // job is stale regardless
894 }
543 } else { 895 } else {
896 LogPrint("pool", "[pool] BLOCK REJECTED height=%d (ProcessBlock returned false)\n",
897 gCurrentJob.height);
544 delete pblock; 898 delete pblock;
545 } 899 }
546 } 900 }
547 reply(accepted); 901
548 if (accepted) { QueuePayouts(job.height); RebuildJob(); BroadcastJob(true); } 902 if (accepted) {
549 return; 903 // Snapshot height before RebuildJob() (which increments it)
904 int foundHeight = gCurrentJob.height;
905 QueuePayouts(foundHeight, roundShareCount, roundShareTotal);
906 // Reset round shares
907 roundShareCount.clear();
908 roundShareTotal = 0;
909 for (Miner* mi : gMiners) mi->roundShares = 0;
910 // Build and broadcast new job immediately
911 if (RebuildJob()) {
912 LogPrint("pool", "[pool] new job %s built after block %d\n",
913 gCurrentJob.jobId.c_str(), foundHeight);
914 BroadcastJob(true);
915 } else {
916 LogPrint("pool", "[pool] WARNING: RebuildJob() failed after block %d"
917 " -- miners will wait\n", foundHeight);
918 }
919 }
920 return true;
550 } 921 }
551 922
552 if (method == "mining.get_transactions") { reply(json::array()); return; } 923 // Unknown method -- log it (can reveal miner software quirks)
924 LogPrint("worker", "[worker->pool] unknown method '%s' from %s\n",
925 method.c_str(),
926 m->address.empty() ? "(unauth)" : m->address.c_str());
553 reply(nullptr, "unknown method"); 927 reply(nullptr, "unknown method");
928 return true;
554} 929}
555 930
556static void MinerThreadFn(void* arg) 931// ---------------------------------------------------------------------------
932// Stats refresh -- called every 2s from event loop
933// ---------------------------------------------------------------------------
934static void RefreshStats(int blocksFoundThisSession, uint64 roundShareTotal)
557{ 935{
558 Miner* m = (Miner*)arg; 936 std::lock_guard<std::mutex> lk(gStatsMutex);
559 while (!fShutdown && gPoolRunning) { 937
560 fd_set fds; FD_ZERO(&fds); FD_SET(m->fd, &fds); 938 gStats.authorizedMiners = 0;
561 struct timeval tv={1,0}; 939 gStats.blocksFound = blocksFoundThisSession;
562 if (select((int)m->fd+1, &fds, NULL, NULL, &tv) <= 0) continue; 940 gStats.roundShares = roundShareTotal;
563 char buf[4096]; 941 gStats.totalHashRate = 0.0;
564 int n = recv(m->fd, buf, sizeof(buf)-1, 0); 942 for (Miner* m : gMiners)
565 if (n <= 0) break; 943 if (m->authorised) gStats.authorizedMiners++;
566 buf[n]=0; m->readBuf += buf; 944
567 size_t pos; 945 gWorkerStats.clear();
568 while ((pos = m->readBuf.find('\n')) != std::string::npos) { 946 for (Miner* m : gMiners) {
569 std::string line = m->readBuf.substr(0, pos); 947 if (!m->authorised || m->lastSeen <= 0) continue;
570 m->readBuf = m->readBuf.substr(pos+1); 948 PoolWorkerStatView v;
571 if (!line.empty() && line.back()=='\r') line.pop_back(); 949 v.address = m->address;
572 if (!line.empty()) HandleLine(m, line); 950 v.worker = m->worker;
573 } 951 v.roundShares = m->roundShares;
952 v.totalShares = m->totalShares;
953 v.lastSeen = m->lastSeen;
954 v.hashRate = m->hashRate;
955 gWorkerStats.push_back(v);
956 gStats.totalHashRate += m->hashRate;
957 }
958 std::sort(gWorkerStats.begin(), gWorkerStats.end(),
959 [](const PoolWorkerStatView& a, const PoolWorkerStatView& b) {
960 return a.roundShares != b.roundShares ? a.roundShares > b.roundShares
961 : a.lastSeen > b.lastSeen;
962 });
963
964 // gPendingPayouts is event-loop-only data (no lock needed here since
965 // RefreshStats is always called from the event loop thread).
966 gPayoutViews.clear();
967 for (const PendingPayout& pp : gPendingPayouts) {
968 PendingPayoutView pv;
969 pv.matureAtHeight = pp.matureAtHeight;
970 pv.recipients = (int)pp.amounts.size();
971 pv.totalAmount = 0;
972 for (auto& kv : pp.amounts) pv.totalAmount += kv.second;
973 gPayoutViews.push_back(pv);
574 } 974 }
575 sock_close(m->fd);
576 printf("Stratum: miner %s disconnected (%llu shares)\n",
577 m->worker.empty()?"unknown":m->worker.c_str(),
578 (unsigned long long)m->sessionShares);
579 { std::lock_guard<std::mutex> lk(gMinersMutex);
580 auto it = std::find(gMiners.begin(), gMiners.end(), m);
581 if (it != gMiners.end()) gMiners.erase(it); }
582 delete m;
583} 975}
584 976
585static void JobWatcherFn(void*) 977// ---------------------------------------------------------------------------
978// Event loop
979// ---------------------------------------------------------------------------
980static void PoolEventLoop()
586{ 981{
587 int lastHeight = -1; 982 int lastHeight = -1;
983 int64 lastRefresh = GetTime();
984 int64 lastStatsRefresh = 0;
985 int blocksFoundThisSession = 0;
986 int64 noJobSince = 0; // 0 = have a job
987 bool warnedNoJob = false;
988 int64 lastNoJobRetry = 0; // throttle RebuildJob calls when no tip
989
990 std::map<std::string, uint64> roundShareCount;
991 uint64 roundShareTotal = 0;
992
993 static const int64 JOB_REFRESH_SECS = 60; // re-stamp nTime periodically
994 static const int64 NO_JOB_WARN_SECS = 15; // warn after this long with no job
995 static const int64 NO_JOB_RETRY_SECS = 5; // how often to retry RebuildJob
996
588 while (!fShutdown && gPoolRunning) { 997 while (!fShutdown && gPoolRunning) {
589 Sleep(500); 998
590 bool newBlock = false; 999 // 1. Drain accept queue
591 CRITICAL_BLOCK(cs_main) 1000 {
592 { if (nBestHeight != lastHeight && pindexBest) { lastHeight = nBestHeight; newBlock = true; } } 1001 std::lock_guard<std::mutex> lk(gReadyMutex);
593 if (newBlock) { 1002 for (btf_socket_t fd : gReadyQueue) {
594 FlushMaturePayouts(); 1003 gMiners.push_back(new Miner(fd));
595 if (RebuildJob()) { printf("Stratum: new job height=%d\n", lastHeight+1); BroadcastJob(true); } 1004 LogPrint("worker", "[pool] miner fd=%d entered event loop"
596 } else if (!gHaveJob) { 1005 " -- awaiting subscribe/authorize\n", (int)fd);
1006 }
1007 gReadyQueue.clear();
1008 }
1009
1010 // 2. Detect new block.
1011 // When our own miner found the block, HandleLine already called
1012 // RebuildJob() + BroadcastJob(true) and set gHaveJob=true.
1013 // We still flush mature payouts and update bookkeeping, but skip
1014 // rebuilding if a fresh job already exists for this height.
1015 {
1016 bool newBlock = false;
1017 CRITICAL_BLOCK(cs_main)
1018 {
1019 if (pindexBest && nBestHeight != lastHeight) {
1020 lastHeight = nBestHeight;
1021 newBlock = true;
1022 }
1023 }
1024 if (newBlock) {
1025 FlushMaturePayouts();
1026 if (!gHaveJob) {
1027 // External block (not found by our miners), or HandleLine's
1028 // RebuildJob failed. Either way this round is over with no
1029 // payout from us, so clear round shares before starting the
1030 // next one -- otherwise they'd keep accumulating across
1031 // rounds that our own miners didn't win.
1032 roundShareCount.clear();
1033 roundShareTotal = 0;
1034 for (Miner* mi : gMiners) mi->roundShares = 0;
1035
1036 // Build and broadcast now.
1037 if (RebuildJob()) {
1038 LogPrint("pool", "[pool] new block height=%d -- job %s ready,"
1039 " %zu miner(s) connected\n",
1040 lastHeight, gCurrentJob.jobId.c_str(), gMiners.size());
1041 BroadcastJob(true);
1042 } else {
1043 LogPrint("pool", "[pool] new block height=%d but RebuildJob() failed"
1044 " -- miners will wait\n", lastHeight);
1045 }
1046 } else {
1047 // HandleLine already built and broadcast for this height.
1048 LogPrint("pool", "[pool] new block height=%d -- job already"
1049 " broadcast by submit handler\n", lastHeight);
1050 }
1051 lastRefresh = GetTime();
1052 noJobSince = 0;
1053 warnedNoJob = false;
1054 }
1055 }
1056
1057 // 3. No-job watchdog (throttled: only retry every NO_JOB_RETRY_SECS)
1058 if (!gHaveJob) {
1059 int64 now = GetTime();
1060 if (noJobSince == 0) noJobSince = now;
1061
1062 if (now - lastNoJobRetry >= NO_JOB_RETRY_SECS) {
1063 lastNoJobRetry = now;
1064 if (RebuildJob()) {
1065 LogPrint("pool", "[pool] job built after %llds without one\n",
1066 (long long)(now - noJobSince));
1067 BroadcastJob(false);
1068 noJobSince = 0;
1069 warnedNoJob = false;
1070 lastRefresh = now;
1071 } else if (!warnedNoJob && now - noJobSince >= NO_JOB_WARN_SECS) {
1072 LogPrint("pool", "[pool] STUCK: no job for %llds -- %s."
1073 " Miners are waiting. Will keep retrying every %llds.\n",
1074 (long long)(now - noJobSince),
1075 pindexBest ? "RebuildJob() keeps failing (check above for why)"
1076 : "no chain tip yet (node still syncing)",
1077 (long long)NO_JOB_RETRY_SECS);
1078 warnedNoJob = true;
1079 }
1080 }
1081 } else if (GetTime() - lastRefresh >= JOB_REFRESH_SECS) {
1082 // Periodic nTime refresh -- stale timestamps cause valid hashes to be rejected
597 if (RebuildJob()) BroadcastJob(false); 1083 if (RebuildJob()) BroadcastJob(false);
1084 lastRefresh = GetTime();
1085 }
1086
1087 // 3.5. Vardiff stall watchdog -- runs independently of share count.
1088 // The normal vardiff check in HandleLine only fires once
1089 // VARDIFF_SHARES_PER_CHECK shares have arrived; a miner that never
1090 // finds a single share never reaches that check, so it can be stuck
1091 // at its initial (or last) difficulty forever. Catch that here.
1092 for (Miner* m : gMiners) {
1093 if (!m->authorised || m->vardiffShares != 0 || m->vardiffWindowStart <= 0)
1094 continue;
1095 int64 stalled = GetTime() - m->vardiffWindowStart;
1096 if (stalled < VARDIFF_STALL_SECS) continue;
1097
1098 double newDiff = m->difficulty / VARDIFF_STALL_CUT;
1099 if (newDiff < VARDIFF_MIN) newDiff = VARDIFF_MIN;
1100
1101 if (newDiff < m->difficulty) {
1102 m->difficulty = newDiff;
1103 m->shareTarget = ShareTargetFromDifficulty(m->difficulty);
1104 m->vardiffWindowStart = GetTime();
1105 LogPrint("worker", "[pool] vardiff STALL: %s sent zero shares in"
1106 " %llds -- forcing difficulty down to %.6f (no share data"
1107 " to retarget from normally)\n",
1108 m->address.c_str(), (long long)stalled, m->difficulty);
1109 SendLine(m->fd, json{{"id",nullptr},
1110 {"method","mining.set_difficulty"},
1111 {"params",json::array({m->difficulty})}});
1112 // Same reasoning as the normal vardiff retarget above: the
1113 // worker only reads its share target from mining.notify, so
1114 // push a fresh job now instead of waiting on the next
1115 // natural broadcast.
1116 SendJob(m, false);
1117 } else {
1118 // Already at the difficulty floor -- this miner's problem isn't
1119 // difficulty, it's something else (slow hashing, bad connection,
1120 // stuck RandomX light mode, etc). Log once per stall window so
1121 // it's visible without spamming.
1122 LogPrint("worker", "[pool] vardiff STALL: %s still at zero shares"
1123 " after %llds at floor difficulty %.6f -- likely a"
1124 " hashrate/connectivity problem, not a difficulty problem\n",
1125 m->address.c_str(), (long long)stalled, m->difficulty);
1126 m->vardiffWindowStart = GetTime(); // avoid re-logging every tick
1127 }
1128 }
1129
1130 // 4. Select over miner sockets
1131 if (!gMiners.empty()) {
1132 fd_set fds; FD_ZERO(&fds);
1133 int maxfd = 0;
1134 for (Miner* m : gMiners) {
1135 FD_SET(m->fd, &fds);
1136 if ((int)m->fd > maxfd) maxfd = (int)m->fd;
1137 }
1138 struct timeval tv = {0, 50000}; // 50ms
1139 if (select(maxfd + 1, &fds, NULL, NULL, &tv) > 0) {
1140 std::vector<Miner*> dead;
1141 for (Miner* m : gMiners) {
1142 if (!FD_ISSET(m->fd, &fds)) continue;
1143 std::string line;
1144 bool disc = false;
1145 // Drain all complete lines buffered for this miner.
1146 // HandleLine always returns true; disc signals clean disconnect.
1147 while (RecvLine(m->fd, m->readBuf, line, disc))
1148 HandleLine(m, line, roundShareCount,
1149 roundShareTotal, blocksFoundThisSession);
1150 if (disc) dead.push_back(m);
1151 }
1152 for (Miner* m : dead) {
1153 LogPrint("worker", "[pool] miner %s disconnected"
1154 " (session shares: %llu, round shares: %llu)\n",
1155 m->worker.empty() ? "(never authorized)" : m->worker.c_str(),
1156 (unsigned long long)m->sessionShares,
1157 (unsigned long long)m->roundShares);
1158 sock_close(m->fd);
1159 gMiners.erase(std::find(gMiners.begin(), gMiners.end(), m));
1160 delete m;
1161 }
1162 }
1163 } else {
1164 Sleep(50);
1165 }
1166
1167 // 5. Refresh GUI stats every 2s
1168 if (GetTime() - lastStatsRefresh >= 2) {
1169 RefreshStats(blocksFoundThisSession, roundShareTotal);
1170 lastStatsRefresh = GetTime();
598 } 1171 }
599 } 1172 }
1173
1174 for (Miner* m : gMiners) { sock_close(m->fd); delete m; }
1175 gMiners.clear();
600} 1176}
601 1177
602// --------------------------------------------------------------------------- 1178// ---------------------------------------------------------------------------
603// Main Stratum accept loop — entry point called from ui.cpp and headless.cpp 1179// Accept threads
604// ---------------------------------------------------------------------------
605// .btf Stratum listener — miners connect via rendezvous relay using the
606// node's .btf address instead of a raw IP:port. Same Stratum protocol,
607// same MinerThreadFn handler, works through CGNAT with no port forwarding.
608//
609// Keeps one listener registered per relay at all times. When a miner
610// connects, a replacement listener is spawned immediately so the next
611// miner doesn't have to wait.
612// --------------------------------------------------------------------------- 1180// ---------------------------------------------------------------------------
1181struct AcceptCtx { unsigned char pk[32]; unsigned char sk[32]; std::string relay; };
613 1182
614struct BtfAcceptCtx { unsigned char pk[32]; unsigned char sk[32]; string relay; }; 1183// One persistent thread per relay. Loops: register -> wrap -> push -> repeat.
615 1184static void AcceptOneFn(void* arg)
616// Track active listener count per relay to avoid pile-up when relay is slow
617static std::map<string,int> gBtfListenerCount;
618static std::mutex gBtfListenerMutex;
619
620static void BtfStratumAcceptOneFn(void* arg)
621{ 1185{
622 BtfAcceptCtx* ctx = (BtfAcceptCtx*)arg; 1186 AcceptCtx* ctx = (AcceptCtx*)arg;
623 unsigned char pk[32], sk[32]; 1187 unsigned char pk[32], sk[32];
624 memcpy(pk, ctx->pk, 32); memcpy(sk, ctx->sk, 32); 1188 memcpy(pk, ctx->pk, 32); memcpy(sk, ctx->sk, 32);
625 string relay = ctx->relay; 1189 std::string relay = ctx->relay;
626 delete ctx; 1190 delete ctx;
627 1191
628 auto decrement = [&]() {
629 std::lock_guard<std::mutex> lk(gBtfListenerMutex);
630 gBtfListenerCount[relay]--;
631 };
632
633 size_t colon = relay.rfind(':'); 1192 size_t colon = relay.rfind(':');
634 if (colon == string::npos) { decrement(); return; } 1193 if (colon == std::string::npos) {
635 string strHost = relay.substr(0, colon); 1194 LogPrint("pool", "[pool] AcceptOneFn: bad relay address '%s'\n", relay.c_str());
636 int nPort = atoi(relay.substr(colon+1).c_str()); 1195 return;
637
638 btf::RvSocket rv = btf::RvServiceRegister(strHost.c_str(), (unsigned short)nPort, pk);
639 if (fShutdown || !gPoolRunning) { if (rv != btf::RV_INVALID) btf::RvClose(rv); decrement(); return; }
640 if (rv == btf::RV_INVALID) { decrement(); return; }
641
642 // Paired: spawn replacement (count transfers to new thread)
643 if (!fShutdown && gPoolRunning) {
644 BtfAcceptCtx* next = new BtfAcceptCtx();
645 memcpy(next->pk, pk, 32); memcpy(next->sk, sk, 32);
646 next->relay = relay;
647 LaunchThread(BtfStratumAcceptOneFn, next);
648 } else {
649 decrement();
650 } 1196 }
1197 std::string host = relay.substr(0, colon);
1198 int port = atoi(relay.substr(colon + 1).c_str());
1199
1200 LogPrint("pool", "[pool] accept thread started for relay %s\n", relay.c_str());
1201
1202 while (!fShutdown && gPoolRunning) {
1203 // Blocks until a miner connects to us at this relay
1204 btf::RvSocket rv = btf::RvServiceRegister(host.c_str(), (unsigned short)port, pk);
651 1205
652 btf_socket_t hSocket = btf::BtfServiceWrap(rv, sk); 1206 if (fShutdown || !gPoolRunning) {
653 if (hSocket == INVALID_SOCKET) return; 1207 if (rv != btf::RV_INVALID) btf::RvClose(rv);
1208 break;
1209 }
1210 if (rv == btf::RV_INVALID) {
1211 LogPrint("pool", "[pool] relay %s: RvServiceRegister failed"
1212 " -- backing off 30s before retry\n", relay.c_str());
1213 for (int i = 0; i < 30 && !fShutdown && gPoolRunning; i++) Sleep(1000);
1214 continue;
1215 }
654 1216
655 printf("Stratum/.btf: miner connected via %s\n", relay.c_str()); 1217 // Echan handshake -- blocking but fast (local + relay round-trip)
656 Miner* m = new Miner(hSocket); 1218 btf_socket_t fd = btf::BtfServiceWrap(rv, sk);
657 { std::lock_guard<std::mutex> lk(gMinersMutex); gMiners.push_back(m); } 1219 if (fd == INVALID_SOCKET) {
658 LaunchThread(MinerThreadFn, m); 1220 LogPrint("pool", "[pool] relay %s: BtfServiceWrap failed (echan handshake)"
1221 " -- miner dropped, will accept next\n", relay.c_str());
1222 continue;
1223 }
1224
1225 LogPrint("worker", "[pool] miner arrived via relay %s -- pushing to event loop\n",
1226 relay.c_str());
1227 PushReady(fd);
1228 // Loop immediately: register again so the next miner can connect
1229 }
1230
1231 LogPrint("pool", "[pool] accept thread stopped for relay %s\n", relay.c_str());
659} 1232}
660 1233
661static void BtfStratumAcceptFn(void*) 1234// Spawns one AcceptOneFn per relay. Re-polls relay list every 60s to pick up
1235// newly discovered relays. Uses a set to avoid spawning duplicate threads.
1236static void AcceptLoopFn(void*)
662{ 1237{
663 printf("Stratum/.btf: starting \xe2\x80\x94 miners can connect via %s\n", 1238 LogPrint("pool", "[pool] AcceptLoopFn started -- miners can connect via %s\n",
664 BtfLocalAddress().c_str()); 1239 BtfLocalAddress().c_str());
665 1240
1241 // Wait for our identity to be ready
666 unsigned char pk[32], sk[32]; 1242 unsigned char pk[32], sk[32];
1243 int waitSecs = 0;
667 while (!BtfGetIdentity(pk, sk)) { 1244 while (!BtfGetIdentity(pk, sk)) {
668 if (fShutdown || !gPoolRunning) return; 1245 if (fShutdown || !gPoolRunning) return;
1246 if (waitSecs == 0)
1247 LogPrint("pool", "[pool] waiting for .btf identity...\n");
1248 waitSecs++;
669 Sleep(2000); 1249 Sleep(2000);
670 } 1250 }
1251 LogPrint("pool", "[pool] .btf identity ready after %ds\n", waitSecs * 2);
1252
1253 std::set<std::string> spawned; // relays we've already started a thread for
671 1254
672 while (!fShutdown && gPoolRunning) { 1255 while (!fShutdown && gPoolRunning) {
673 vector<string> relays = BtfAllRelays(); 1256 vector<string> relays = BtfAllRelays();
674 if (relays.empty()) { Sleep(5000); continue; } 1257 if (relays.empty()) {
675 1258 LogPrint("pool", "[pool] no relays available -- miners cannot connect yet\n");
676 // Spawn one listener per relay, only if none already active 1259 } else {
677 for (const string& relay : relays) { 1260 for (const string& relay : relays) {
678 std::lock_guard<std::mutex> lk(gBtfListenerMutex); 1261 if (spawned.count(relay)) continue; // already running
679 if (gBtfListenerCount[relay] == 0) { 1262 AcceptCtx* ctx = new AcceptCtx();
680 gBtfListenerCount[relay]++;
681 BtfAcceptCtx* ctx = new BtfAcceptCtx();
682 memcpy(ctx->pk, pk, 32); memcpy(ctx->sk, sk, 32); 1263 memcpy(ctx->pk, pk, 32); memcpy(ctx->sk, sk, 32);
683 ctx->relay = relay; 1264 ctx->relay = relay;
684 LaunchThread(BtfStratumAcceptOneFn, ctx); 1265 uintptr_t tid = _beginthread(AcceptOneFn, 0, ctx);
1266 if (tid == (uintptr_t)-1) {
1267 delete ctx;
1268 LogPrint("pool", "[pool] failed to spawn accept thread for %s\n",
1269 relay.c_str());
1270 } else {
1271 spawned.insert(relay);
1272 LogPrint("pool", "[pool] accept thread spawned for relay %s"
1273 " (%zu total)\n", relay.c_str(), spawned.size());
1274 }
685 } 1275 }
686 } 1276 }
687 for (int i = 0; i < 30 && !fShutdown && gPoolRunning; i++) Sleep(1000); 1277 // Re-poll every 60s -- newly discovered relays get picked up
1278 for (int i = 0; i < 60 && !fShutdown && gPoolRunning; i++) Sleep(1000);
688 } 1279 }
689} 1280}
1281
1282// ---------------------------------------------------------------------------
1283// Entry point
1284// ---------------------------------------------------------------------------
690void ThreadRPCServer(void*) 1285void ThreadRPCServer(void*)
691{ 1286{
692 gPoolRunning = true; 1287 gPoolRunning = true;
693 printf("Bitflash pool server starting\n");
694 printf(" Stratum .btf: %s (no port forwarding needed)\n",
695 BtfLocalAddress().c_str());
696 printf(" Mode: operator\n");
697 1288
698 if (RebuildJob()) 1289 LogPrint("pool", "[pool] ============================================\n");
699 printf("Stratum: initial job seeded height=%d\n", nBestHeight + 1); 1290 LogPrint("pool", "[pool] Pool server starting\n");
1291 LogPrint("pool", "[pool] .btf address: %s\n", BtfLocalAddress().c_str());
1292 LogPrint("pool", "[pool] fee: %.2f%%\n", dPoolFeePercent);
1293
1294 if (RebuildJob()) {
1295 LogPrint("pool", "[pool] initial job %s seeded at height %d\n",
1296 gCurrentJob.jobId.c_str(), nBestHeight + 1);
1297 } else {
1298 LogPrint("pool", "[pool] no chain tip yet -- job will build on first block\n");
1299 }
1300
1301 LoadPendingPayouts();
1302
1303 _beginthread(AcceptLoopFn, 0, NULL);
1304 _beginthread(ThreadBtfPoolAnnouncer, 0, NULL);
1305 _beginthread(PayoutThreadFn, 0, NULL);
700 1306
701 LaunchThread(JobWatcherFn, NULL); 1307 PoolEventLoop(); // blocks until gPoolRunning = false or fShutdown
702 LaunchThread(BtfStratumAcceptFn, NULL);
703 LaunchThread(ThreadBtfPoolAnnouncer, NULL);
704 1308
705 while (!fShutdown && gPoolRunning) 1309 LogPrint("pool", "[pool] pool server stopped\n");
706 Sleep(1000); 1310 LogPrint("pool", "[pool] ============================================\n");
707 printf("Pool server stopped\n"); 1311 gPoolRunning = false;
708} 1312}
diff --git a/src/ui.rc b/src/ui.rc
deleted file mode 100644
index ec8b142..0000000
--- a/src/ui.rc
+++ /dev/null
@@ -1,14 +0,0 @@
1bitcoin ICON "rc/bitcoin.ico"
2
3#include "wx/msw/wx.rc"
4
5check ICON "rc/check.ico"
6send16 BITMAP "rc/send16.bmp"
7send16mask BITMAP "rc/send16mask.bmp"
8send16masknoshadow BITMAP "rc/send16masknoshadow.bmp"
9send20 BITMAP "rc/send20.bmp"
10send20mask BITMAP "rc/send20mask.bmp"
11addressbook16 BITMAP "rc/addressbook16.bmp"
12addressbook16mask BITMAP "rc/addressbook16mask.bmp"
13addressbook20 BITMAP "rc/addressbook20.bmp"
14addressbook20mask BITMAP "rc/addressbook20mask.bmp"
diff --git a/src/uiproject.fbp b/src/uiproject.fbp
deleted file mode 100644
index 57a2950..0000000
--- a/src/uiproject.fbp
+++ /dev/null
@@ -1,11825 +0,0 @@
1<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
2<wxFormBuilder_Project>
3 <FileVersion major="1" minor="9" />
4 <object class="Project" expanded="1">
5 <property name="class_decoration"></property>
6 <property name="code_generation">C++</property>
7 <property name="disconnect_events">1</property>
8 <property name="encoding">UTF-8</property>
9 <property name="event_generation">connect</property>
10 <property name="file">uibase</property>
11 <property name="first_id">1000</property>
12 <property name="help_provider">none</property>
13 <property name="internationalize">0</property>
14 <property name="name"></property>
15 <property name="namespace"></property>
16 <property name="path">.</property>
17 <property name="precompiled_header"></property>
18 <property name="relative_path">1</property>
19 <property name="use_enum">0</property>
20 <property name="use_microsoft_bom">0</property>
21 <object class="Frame" expanded="0">
22 <property name="bg">wxSYS_COLOUR_BTNFACE</property>
23 <property name="center"></property>
24 <property name="context_help"></property>
25 <property name="enabled">1</property>
26 <property name="extra_style"></property>
27 <property name="fg"></property>
28 <property name="font"></property>
29 <property name="hidden">0</property>
30 <property name="id">wxID_MAINFRAME</property>
31 <property name="maximum_size"></property>
32 <property name="minimum_size"></property>
33 <property name="name">CMainFrameBase</property>
34 <property name="pos"></property>
35 <property name="size">705,484</property>
36 <property name="style">wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER</property>
37 <property name="subclass"></property>
38 <property name="title">Bitcoin</property>
39 <property name="tooltip"></property>
40 <property name="window_extra_style"></property>
41 <property name="window_name"></property>
42 <property name="window_style">wxTAB_TRAVERSAL</property>
43 <property name="xrc_skip_sizer">1</property>
44 <event name="OnActivate"></event>
45 <event name="OnActivateApp"></event>
46 <event name="OnChar"></event>
47 <event name="OnClose">OnClose</event>
48 <event name="OnEnterWindow"></event>
49 <event name="OnEraseBackground"></event>
50 <event name="OnHibernate"></event>
51 <event name="OnIconize"></event>
52 <event name="OnIdle">OnIdle</event>
53 <event name="OnKeyDown"></event>
54 <event name="OnKeyUp"></event>
55 <event name="OnKillFocus"></event>
56 <event name="OnLeaveWindow"></event>
57 <event name="OnLeftDClick"></event>
58 <event name="OnLeftDown"></event>
59 <event name="OnLeftUp"></event>
60 <event name="OnMiddleDClick"></event>
61 <event name="OnMiddleDown"></event>
62 <event name="OnMiddleUp"></event>
63 <event name="OnMotion"></event>
64 <event name="OnMouseEvents">OnMouseEvents</event>
65 <event name="OnMouseWheel"></event>
66 <event name="OnPaint">OnPaint</event>
67 <event name="OnRightDClick"></event>
68 <event name="OnRightDown"></event>
69 <event name="OnRightUp"></event>
70 <event name="OnSetFocus"></event>
71 <event name="OnSize"></event>
72 <event name="OnUpdateUI"></event>
73 <object class="wxMenuBar" expanded="1">
74 <property name="bg">240,240,240</property>
75 <property name="context_help"></property>
76 <property name="enabled">1</property>
77 <property name="fg"></property>
78 <property name="font"></property>
79 <property name="hidden">0</property>
80 <property name="id">wxID_ANY</property>
81 <property name="label">MyMenuBar</property>
82 <property name="maximum_size"></property>
83 <property name="minimum_size"></property>
84 <property name="name">m_menubar</property>
85 <property name="permission">protected</property>
86 <property name="pos"></property>
87 <property name="size"></property>
88 <property name="style"></property>
89 <property name="subclass"></property>
90 <property name="tooltip"></property>
91 <property name="window_extra_style"></property>
92 <property name="window_name"></property>
93 <property name="window_style"></property>
94 <event name="OnChar"></event>
95 <event name="OnEnterWindow"></event>
96 <event name="OnEraseBackground"></event>
97 <event name="OnKeyDown"></event>
98 <event name="OnKeyUp"></event>
99 <event name="OnKillFocus"></event>
100 <event name="OnLeaveWindow"></event>
101 <event name="OnLeftDClick"></event>
102 <event name="OnLeftDown"></event>
103 <event name="OnLeftUp"></event>
104 <event name="OnMiddleDClick"></event>
105 <event name="OnMiddleDown"></event>
106 <event name="OnMiddleUp"></event>
107 <event name="OnMotion"></event>
108 <event name="OnMouseEvents"></event>
109 <event name="OnMouseWheel"></event>
110 <event name="OnPaint"></event>
111 <event name="OnRightDClick"></event>
112 <event name="OnRightDown"></event>
113 <event name="OnRightUp"></event>
114 <event name="OnSetFocus"></event>
115 <event name="OnSize"></event>
116 <event name="OnUpdateUI"></event>
117 <object class="wxMenu" expanded="1">
118 <property name="label">&amp;File</property>
119 <property name="name">m_menuFile</property>
120 <property name="permission">protected</property>
121 <object class="wxMenuItem" expanded="1">
122 <property name="bitmap"></property>
123 <property name="checked">0</property>
124 <property name="enabled">1</property>
125 <property name="help"></property>
126 <property name="id">wxID_ANY</property>
127 <property name="kind">wxITEM_NORMAL</property>
128 <property name="label">E&amp;xit</property>
129 <property name="name">m_menuFileExit</property>
130 <property name="permission">none</property>
131 <property name="shortcut"></property>
132 <property name="unchecked_bitmap"></property>
133 <event name="OnMenuSelection">OnMenuFileExit</event>
134 <event name="OnUpdateUI"></event>
135 </object>
136 </object>
137 <object class="wxMenu" expanded="1">
138 <property name="label">&amp;Options</property>
139 <property name="name">m_menuOptions</property>
140 <property name="permission">public</property>
141 <object class="wxMenuItem" expanded="1">
142 <property name="bitmap"></property>
143 <property name="checked">0</property>
144 <property name="enabled">1</property>
145 <property name="help"></property>
146 <property name="id">wxID_OPTIONSGENERATEBITCOINS</property>
147 <property name="kind">wxITEM_CHECK</property>
148 <property name="label">&amp;Generate Coins</property>
149 <property name="name">m_menuOptionsGenerateBitcoins</property>
150 <property name="permission">none</property>
151 <property name="shortcut"></property>
152 <property name="unchecked_bitmap"></property>
153 <event name="OnMenuSelection">OnMenuOptionsGenerate</event>
154 <event name="OnUpdateUI"></event>
155 </object>
156 <object class="wxMenuItem" expanded="1">
157 <property name="bitmap"></property>
158 <property name="checked">0</property>
159 <property name="enabled">1</property>
160 <property name="help"></property>
161 <property name="id">wxID_ANY</property>
162 <property name="kind">wxITEM_NORMAL</property>
163 <property name="label">&amp;Options...</property>
164 <property name="name">m_menuOptionsOptions</property>
165 <property name="permission">none</property>
166 <property name="shortcut"></property>
167 <property name="unchecked_bitmap"></property>
168 <event name="OnMenuSelection">OnMenuOptionsOptions</event>
169 <event name="OnUpdateUI"></event>
170 </object>
171 </object>
172 <object class="wxMenu" expanded="1">
173 <property name="label">&amp;Help</property>
174 <property name="name">m_menuHelp</property>
175 <property name="permission">protected</property>
176 <object class="wxMenuItem" expanded="1">
177 <property name="bitmap"></property>
178 <property name="checked">0</property>
179 <property name="enabled">1</property>
180 <property name="help"></property>
181 <property name="id">wxID_ANY</property>
182 <property name="kind">wxITEM_NORMAL</property>
183 <property name="label">&amp;About...</property>
184 <property name="name">m_menuHelpAbout</property>
185 <property name="permission">none</property>
186 <property name="shortcut"></property>
187 <property name="unchecked_bitmap"></property>
188 <event name="OnMenuSelection">OnMenuHelpAbout</event>
189 <event name="OnUpdateUI"></event>
190 </object>
191 </object>
192 </object>
193 <object class="wxToolBar" expanded="0">
194 <property name="bg"></property>
195 <property name="bitmapsize">20,20</property>
196 <property name="context_help"></property>
197 <property name="enabled">1</property>
198 <property name="fg"></property>
199 <property name="font">,90,90,-1,70,0</property>
200 <property name="hidden">0</property>
201 <property name="id">wxID_ANY</property>
202 <property name="margins"></property>
203 <property name="maximum_size"></property>
204 <property name="minimum_size"></property>
205 <property name="name">m_toolBar</property>
206 <property name="packing">1</property>
207 <property name="permission">protected</property>
208 <property name="pos"></property>
209 <property name="separation">1</property>
210 <property name="size">-1,-1</property>
211 <property name="style">wxTB_FLAT|wxTB_HORZ_TEXT</property>
212 <property name="subclass"></property>
213 <property name="tooltip"></property>
214 <property name="window_extra_style"></property>
215 <property name="window_name"></property>
216 <property name="window_style"></property>
217 <event name="OnChar"></event>
218 <event name="OnEnterWindow"></event>
219 <event name="OnEraseBackground"></event>
220 <event name="OnKeyDown"></event>
221 <event name="OnKeyUp"></event>
222 <event name="OnKillFocus"></event>
223 <event name="OnLeaveWindow"></event>
224 <event name="OnLeftDClick"></event>
225 <event name="OnLeftDown"></event>
226 <event name="OnLeftUp"></event>
227 <event name="OnMiddleDClick"></event>
228 <event name="OnMiddleDown"></event>
229 <event name="OnMiddleUp"></event>
230 <event name="OnMotion"></event>
231 <event name="OnMouseEvents"></event>
232 <event name="OnMouseWheel"></event>
233 <event name="OnPaint"></event>
234 <event name="OnRightDClick"></event>
235 <event name="OnRightDown"></event>
236 <event name="OnRightUp"></event>
237 <event name="OnSetFocus"></event>
238 <event name="OnSize"></event>
239 <event name="OnUpdateUI"></event>
240 <object class="tool" expanded="1">
241 <property name="bitmap">send20; Load From Resource</property>
242 <property name="id">wxID_BUTTONSEND</property>
243 <property name="kind">wxITEM_NORMAL</property>
244 <property name="label">&amp;Send Coins</property>
245 <property name="name">m_tool1</property>
246 <property name="statusbar"></property>
247 <property name="tooltip"></property>
248 <event name="OnMenuSelection"></event>
249 <event name="OnToolClicked">OnButtonSend</event>
250 <event name="OnToolEnter"></event>
251 <event name="OnToolRClicked"></event>
252 <event name="OnUpdateUI"></event>
253 </object>
254 <object class="tool" expanded="1">
255 <property name="bitmap">addressbook20; Load From Resource</property>
256 <property name="id">wxID_BUTTONRECEIVE</property>
257 <property name="kind">wxITEM_NORMAL</property>
258 <property name="label">&amp;Address Book</property>
259 <property name="name">m_tool2</property>
260 <property name="statusbar"></property>
261 <property name="tooltip"></property>
262 <event name="OnMenuSelection"></event>
263 <event name="OnToolClicked">OnButtonAddressBook</event>
264 <event name="OnToolEnter"></event>
265 <event name="OnToolRClicked"></event>
266 <event name="OnUpdateUI"></event>
267 </object>
268 </object>
269 <object class="wxStatusBar" expanded="1">
270 <property name="bg">240,240,240</property>
271 <property name="context_help"></property>
272 <property name="enabled">1</property>
273 <property name="fg"></property>
274 <property name="fields">1</property>
275 <property name="font"></property>
276 <property name="hidden">0</property>
277 <property name="id">wxID_ANY</property>
278 <property name="maximum_size"></property>
279 <property name="minimum_size"></property>
280 <property name="name">m_statusBar</property>
281 <property name="permission">protected</property>
282 <property name="pos"></property>
283 <property name="size"></property>
284 <property name="style">wxST_SIZEGRIP</property>
285 <property name="subclass"></property>
286 <property name="tooltip"></property>
287 <property name="window_extra_style"></property>
288 <property name="window_name"></property>
289 <property name="window_style"></property>
290 <event name="OnChar"></event>
291 <event name="OnEnterWindow"></event>
292 <event name="OnEraseBackground"></event>
293 <event name="OnKeyDown"></event>
294 <event name="OnKeyUp"></event>
295 <event name="OnKillFocus"></event>
296 <event name="OnLeaveWindow"></event>
297 <event name="OnLeftDClick"></event>
298 <event name="OnLeftDown"></event>
299 <event name="OnLeftUp"></event>
300 <event name="OnMiddleDClick"></event>
301 <event name="OnMiddleDown"></event>
302 <event name="OnMiddleUp"></event>
303 <event name="OnMotion"></event>
304 <event name="OnMouseEvents"></event>
305 <event name="OnMouseWheel"></event>
306 <event name="OnPaint"></event>
307 <event name="OnRightDClick"></event>
308 <event name="OnRightDown"></event>
309 <event name="OnRightUp"></event>
310 <event name="OnSetFocus"></event>
311 <event name="OnSize"></event>
312 <event name="OnUpdateUI"></event>
313 </object>
314 <object class="wxBoxSizer" expanded="0">
315 <property name="minimum_size"></property>
316 <property name="name">bSizer2</property>
317 <property name="orient">wxVERTICAL</property>
318 <property name="permission">none</property>
319 <object class="sizeritem" expanded="1">
320 <property name="border">5</property>
321 <property name="flag">wxEXPAND</property>
322 <property name="proportion">0</property>
323 <object class="spacer" expanded="1">
324 <property name="height">2</property>
325 <property name="permission">protected</property>
326 <property name="width">0</property>
327 </object>
328 </object>
329 <object class="sizeritem" expanded="1">
330 <property name="border">5</property>
331 <property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
332 <property name="proportion">0</property>
333 <object class="wxBoxSizer" expanded="1">
334 <property name="minimum_size"></property>
335 <property name="name">bSizer85</property>
336 <property name="orient">wxHORIZONTAL</property>
337 <property name="permission">none</property>
338 <object class="sizeritem" expanded="1">
339 <property name="border">5</property>
340 <property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT</property>
341 <property name="proportion">0</property>
342 <object class="wxStaticText" expanded="1">
343 <property name="bg"></property>
344 <property name="context_help"></property>
345 <property name="enabled">1</property>
346 <property name="fg"></property>
347 <property name="font"></property>
348 <property name="hidden">0</property>
349 <property name="id">wxID_ANY</property>
350 <property name="label">Your Bitcoin Address:</property>
351 <property name="maximum_size"></property>
352 <property name="minimum_size"></property>
353 <property name="name">m_staticText32</property>
354 <property name="permission">protected</property>
355 <property name="pos"></property>
356 <property name="size"></property>
357 <property name="style"></property>
358 <property name="subclass"></property>
359 <property name="tooltip"></property>
360 <property name="window_extra_style"></property>
361 <property name="window_name"></property>
362 <property name="window_style"></property>
363 <property name="wrap">-1</property>
364 <event name="OnChar"></event>
365 <event name="OnEnterWindow"></event>
366 <event name="OnEraseBackground"></event>
367 <event name="OnKeyDown"></event>
368 <event name="OnKeyUp"></event>
369 <event name="OnKillFocus"></event>
370 <event name="OnLeaveWindow"></event>
371 <event name="OnLeftDClick"></event>
372 <event name="OnLeftDown"></event>
373 <event name="OnLeftUp"></event>
374 <event name="OnMiddleDClick"></event>
375 <event name="OnMiddleDown"></event>
376 <event name="OnMiddleUp"></event>
377 <event name="OnMotion"></event>
378 <event name="OnMouseEvents"></event>
379 <event name="OnMouseWheel"></event>
380 <event name="OnPaint"></event>
381 <event name="OnRightDClick"></event>
382 <event name="OnRightDown"></event>
383 <event name="OnRightUp"></event>
384 <event name="OnSetFocus"></event>
385 <event name="OnSize"></event>
386 <event name="OnUpdateUI"></event>
387 </object>
388 </object>
389 <object class="sizeritem" expanded="1">
390 <property name="border">5</property>
391 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
392 <property name="proportion">0</property>
393 <object class="wxTextCtrl" expanded="1">
394 <property name="bg">wxSYS_COLOUR_MENU</property>
395 <property name="context_help"></property>
396 <property name="enabled">1</property>
397 <property name="fg"></property>
398 <property name="font"></property>
399 <property name="hidden">0</property>
400 <property name="id">wxID_TEXTCTRLADDRESS</property>
401 <property name="maximum_size">-1,-1</property>
402 <property name="maxlength">0</property>
403 <property name="minimum_size">-1,-1</property>
404 <property name="name">m_textCtrlAddress</property>
405 <property name="permission">protected</property>
406 <property name="pos"></property>
407 <property name="size">250,-1</property>
408 <property name="style">wxTE_READONLY</property>
409 <property name="subclass"></property>
410 <property name="tooltip"></property>
411 <property name="value"></property>
412 <property name="window_extra_style"></property>
413 <property name="window_name"></property>
414 <property name="window_style"></property>
415 <event name="OnChar"></event>
416 <event name="OnEnterWindow"></event>
417 <event name="OnEraseBackground"></event>
418 <event name="OnKeyDown">OnKeyDown</event>
419 <event name="OnKeyUp"></event>
420 <event name="OnKillFocus"></event>
421 <event name="OnLeaveWindow"></event>
422 <event name="OnLeftDClick"></event>
423 <event name="OnLeftDown"></event>
424 <event name="OnLeftUp"></event>
425 <event name="OnMiddleDClick"></event>
426 <event name="OnMiddleDown"></event>
427 <event name="OnMiddleUp"></event>
428 <event name="OnMotion"></event>
429 <event name="OnMouseEvents">OnMouseEventsAddress</event>
430 <event name="OnMouseWheel"></event>
431 <event name="OnPaint"></event>
432 <event name="OnRightDClick"></event>
433 <event name="OnRightDown"></event>
434 <event name="OnRightUp"></event>
435 <event name="OnSetFocus">OnSetFocusAddress</event>
436 <event name="OnSize"></event>
437 <event name="OnText"></event>
438 <event name="OnTextEnter"></event>
439 <event name="OnTextMaxLen"></event>
440 <event name="OnTextURL"></event>
441 <event name="OnUpdateUI"></event>
442 </object>
443 </object>
444 <object class="sizeritem" expanded="1">
445 <property name="border">5</property>
446 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT</property>
447 <property name="proportion">0</property>
448 <object class="wxButton" expanded="1">
449 <property name="bg"></property>
450 <property name="context_help"></property>
451 <property name="default">0</property>
452 <property name="enabled">1</property>
453 <property name="fg"></property>
454 <property name="font"></property>
455 <property name="hidden">0</property>
456 <property name="id">wxID_BUTTONCOPY</property>
457 <property name="label">&amp;Copy to Clipboard</property>
458 <property name="maximum_size"></property>
459 <property name="minimum_size"></property>
460 <property name="name">m_buttonCopy</property>
461 <property name="permission">protected</property>
462 <property name="pos"></property>
463 <property name="size"></property>
464 <property name="style">wxBU_EXACTFIT</property>
465 <property name="subclass"></property>
466 <property name="tooltip"></property>
467 <property name="window_extra_style"></property>
468 <property name="window_name"></property>
469 <property name="window_style"></property>
470 <event name="OnButtonClick">OnButtonCopy</event>
471 <event name="OnChar"></event>
472 <event name="OnEnterWindow"></event>
473 <event name="OnEraseBackground"></event>
474 <event name="OnKeyDown"></event>
475 <event name="OnKeyUp"></event>
476 <event name="OnKillFocus"></event>
477 <event name="OnLeaveWindow"></event>
478 <event name="OnLeftDClick"></event>
479 <event name="OnLeftDown"></event>
480 <event name="OnLeftUp"></event>
481 <event name="OnMiddleDClick"></event>
482 <event name="OnMiddleDown"></event>
483 <event name="OnMiddleUp"></event>
484 <event name="OnMotion"></event>
485 <event name="OnMouseEvents"></event>
486 <event name="OnMouseWheel"></event>
487 <event name="OnPaint"></event>
488 <event name="OnRightDClick"></event>
489 <event name="OnRightDown"></event>
490 <event name="OnRightUp"></event>
491 <event name="OnSetFocus"></event>
492 <event name="OnSize"></event>
493 <event name="OnUpdateUI"></event>
494 </object>
495 </object>
496 <object class="sizeritem" expanded="1">
497 <property name="border">5</property>
498 <property name="flag">wxRIGHT</property>
499 <property name="proportion">0</property>
500 <object class="wxButton" expanded="1">
501 <property name="bg"></property>
502 <property name="context_help"></property>
503 <property name="default">0</property>
504 <property name="enabled">1</property>
505 <property name="fg"></property>
506 <property name="font"></property>
507 <property name="hidden">0</property>
508 <property name="id">wxID_BUTTONCHANGE</property>
509 <property name="label">C&amp;hange...</property>
510 <property name="maximum_size"></property>
511 <property name="minimum_size"></property>
512 <property name="name">m_button91</property>
513 <property name="permission">protected</property>
514 <property name="pos"></property>
515 <property name="size"></property>
516 <property name="style"></property>
517 <property name="subclass"></property>
518 <property name="tooltip"></property>
519 <property name="window_extra_style"></property>
520 <property name="window_name"></property>
521 <property name="window_style"></property>
522 <event name="OnButtonClick">OnButtonChange</event>
523 <event name="OnChar"></event>
524 <event name="OnEnterWindow"></event>
525 <event name="OnEraseBackground"></event>
526 <event name="OnKeyDown"></event>
527 <event name="OnKeyUp"></event>
528 <event name="OnKillFocus"></event>
529 <event name="OnLeaveWindow"></event>
530 <event name="OnLeftDClick"></event>
531 <event name="OnLeftDown"></event>
532 <event name="OnLeftUp"></event>
533 <event name="OnMiddleDClick"></event>
534 <event name="OnMiddleDown"></event>
535 <event name="OnMiddleUp"></event>
536 <event name="OnMotion"></event>
537 <event name="OnMouseEvents"></event>
538 <event name="OnMouseWheel"></event>
539 <event name="OnPaint"></event>
540 <event name="OnRightDClick"></event>
541 <event name="OnRightDown"></event>
542 <event name="OnRightUp"></event>
543 <event name="OnSetFocus"></event>
544 <event name="OnSize"></event>
545 <event name="OnUpdateUI"></event>
546 </object>
547 </object>
548 <object class="sizeritem" expanded="1">
549 <property name="border">5</property>
550 <property name="flag">wxEXPAND</property>
551 <property name="proportion">0</property>
552 <object class="spacer" expanded="1">
553 <property name="height">0</property>
554 <property name="permission">protected</property>
555 <property name="width">0</property>
556 </object>
557 </object>
558 </object>
559 </object>
560 <object class="sizeritem" expanded="1">
561 <property name="border">5</property>
562 <property name="flag">wxEXPAND</property>
563 <property name="proportion">0</property>
564 <object class="wxBoxSizer" expanded="1">
565 <property name="minimum_size"></property>
566 <property name="name">bSizer3</property>
567 <property name="orient">wxHORIZONTAL</property>
568 <property name="permission">none</property>
569 <object class="sizeritem" expanded="1">
570 <property name="border">5</property>
571 <property name="flag">wxEXPAND|wxALIGN_BOTTOM|wxALL</property>
572 <property name="proportion">1</property>
573 <object class="wxPanel" expanded="1">
574 <property name="bg"></property>
575 <property name="context_help"></property>
576 <property name="enabled">1</property>
577 <property name="fg"></property>
578 <property name="font"></property>
579 <property name="hidden">0</property>
580 <property name="id">wxID_ANY</property>
581 <property name="maximum_size"></property>
582 <property name="minimum_size"></property>
583 <property name="name">m_panel14</property>
584 <property name="permission">protected</property>
585 <property name="pos"></property>
586 <property name="size"></property>
587 <property name="subclass"></property>
588 <property name="tooltip"></property>
589 <property name="window_extra_style"></property>
590 <property name="window_name"></property>
591 <property name="window_style">wxTAB_TRAVERSAL</property>
592 <event name="OnChar"></event>
593 <event name="OnEnterWindow"></event>
594 <event name="OnEraseBackground"></event>
595 <event name="OnKeyDown"></event>
596 <event name="OnKeyUp"></event>
597 <event name="OnKillFocus"></event>
598 <event name="OnLeaveWindow"></event>
599 <event name="OnLeftDClick"></event>
600 <event name="OnLeftDown"></event>
601 <event name="OnLeftUp"></event>
602 <event name="OnMiddleDClick"></event>
603 <event name="OnMiddleDown"></event>
604 <event name="OnMiddleUp"></event>
605 <event name="OnMotion"></event>
606 <event name="OnMouseEvents"></event>
607 <event name="OnMouseWheel"></event>
608 <event name="OnPaint"></event>
609 <event name="OnRightDClick"></event>
610 <event name="OnRightDown"></event>
611 <event name="OnRightUp"></event>
612 <event name="OnSetFocus"></event>
613 <event name="OnSize"></event>
614 <event name="OnUpdateUI"></event>
615 <object class="wxBoxSizer" expanded="1">
616 <property name="minimum_size"></property>
617 <property name="name">bSizer66</property>
618 <property name="orient">wxHORIZONTAL</property>
619 <property name="permission">none</property>
620 <object class="sizeritem" expanded="1">
621 <property name="border">5</property>
622 <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT</property>
623 <property name="proportion">0</property>
624 <object class="wxStaticText" expanded="1">
625 <property name="bg"></property>
626 <property name="context_help"></property>
627 <property name="enabled">1</property>
628 <property name="fg"></property>
629 <property name="font"></property>
630 <property name="hidden">0</property>
631 <property name="id">wxID_ANY</property>
632 <property name="label">Balance:</property>
633 <property name="maximum_size"></property>
634 <property name="minimum_size"></property>
635 <property name="name">m_staticText41</property>
636 <property name="permission">protected</property>
637 <property name="pos"></property>
638 <property name="size">-1,15</property>
639 <property name="style"></property>
640 <property name="subclass"></property>
641 <property name="tooltip"></property>
642 <property name="window_extra_style"></property>
643 <property name="window_name"></property>
644 <property name="window_style"></property>
645 <property name="wrap">-1</property>
646 <event name="OnChar"></event>
647 <event name="OnEnterWindow"></event>
648 <event name="OnEraseBackground"></event>
649 <event name="OnKeyDown"></event>
650 <event name="OnKeyUp"></event>
651 <event name="OnKillFocus"></event>
652 <event name="OnLeaveWindow"></event>
653 <event name="OnLeftDClick"></event>
654 <event name="OnLeftDown"></event>
655 <event name="OnLeftUp"></event>
656 <event name="OnMiddleDClick"></event>
657 <event name="OnMiddleDown"></event>
658 <event name="OnMiddleUp"></event>
659 <event name="OnMotion"></event>
660 <event name="OnMouseEvents"></event>
661 <event name="OnMouseWheel"></event>
662 <event name="OnPaint"></event>
663 <event name="OnRightDClick"></event>
664 <event name="OnRightDown"></event>
665 <event name="OnRightUp"></event>
666 <event name="OnSetFocus"></event>
667 <event name="OnSize"></event>
668 <event name="OnUpdateUI"></event>
669 </object>
670 </object>
671 <object class="sizeritem" expanded="1">
672 <property name="border">5</property>
673 <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
674 <property name="proportion">0</property>
675 <object class="wxStaticText" expanded="1">
676 <property name="bg">240,240,240</property>
677 <property name="context_help"></property>
678 <property name="enabled">1</property>
679 <property name="fg"></property>
680 <property name="font">,90,90,8,70,0</property>
681 <property name="hidden">0</property>
682 <property name="id">wxID_ANY</property>
683 <property name="label"></property>
684 <property name="maximum_size"></property>
685 <property name="minimum_size"></property>
686 <property name="name">m_staticTextBalance</property>
687 <property name="permission">protected</property>
688 <property name="pos"></property>
689 <property name="size">120,15</property>
690 <property name="style">wxALIGN_RIGHT|wxST_NO_AUTORESIZE</property>
691 <property name="subclass"></property>
692 <property name="tooltip"></property>
693 <property name="window_extra_style"></property>
694 <property name="window_name"></property>
695 <property name="window_style"></property>
696 <property name="wrap">-1</property>
697 <event name="OnChar"></event>
698 <event name="OnEnterWindow"></event>
699 <event name="OnEraseBackground"></event>
700 <event name="OnKeyDown"></event>
701 <event name="OnKeyUp"></event>
702 <event name="OnKillFocus"></event>
703 <event name="OnLeaveWindow"></event>
704 <event name="OnLeftDClick"></event>
705 <event name="OnLeftDown"></event>
706 <event name="OnLeftUp"></event>
707 <event name="OnMiddleDClick"></event>
708 <event name="OnMiddleDown"></event>
709 <event name="OnMiddleUp"></event>
710 <event name="OnMotion"></event>
711 <event name="OnMouseEvents"></event>
712 <event name="OnMouseWheel"></event>
713 <event name="OnPaint"></event>
714 <event name="OnRightDClick"></event>
715 <event name="OnRightDown"></event>
716 <event name="OnRightUp"></event>
717 <event name="OnSetFocus"></event>
718 <event name="OnSize"></event>
719 <event name="OnUpdateUI"></event>
720 </object>
721 </object>
722 </object>
723 </object>
724 </object>
725 <object class="sizeritem" expanded="1">
726 <property name="border">5</property>
727 <property name="flag">wxEXPAND</property>
728 <property name="proportion">0</property>
729 <object class="spacer" expanded="1">
730 <property name="height">0</property>
731 <property name="permission">protected</property>
732 <property name="width">0</property>
733 </object>
734 </object>
735 <object class="sizeritem" expanded="1">
736 <property name="border">5</property>
737 <property name="flag">wxALIGN_BOTTOM|wxTOP|wxRIGHT|wxLEFT</property>
738 <property name="proportion">0</property>
739 <object class="wxChoice" expanded="1">
740 <property name="bg"></property>
741 <property name="choices">&quot; All&quot; &quot; Sent&quot; &quot; Received&quot; &quot; In Progress&quot;</property>
742 <property name="context_help"></property>
743 <property name="enabled">1</property>
744 <property name="fg"></property>
745 <property name="font"></property>
746 <property name="hidden">1</property>
747 <property name="id">wxID_ANY</property>
748 <property name="maximum_size"></property>
749 <property name="minimum_size"></property>
750 <property name="name">m_choiceFilter</property>
751 <property name="permission">protected</property>
752 <property name="pos"></property>
753 <property name="selection">0</property>
754 <property name="size">110,-1</property>
755 <property name="subclass"></property>
756 <property name="tooltip"></property>
757 <property name="window_extra_style"></property>
758 <property name="window_name"></property>
759 <property name="window_style"></property>
760 <event name="OnChar"></event>
761 <event name="OnChoice"></event>
762 <event name="OnEnterWindow"></event>
763 <event name="OnEraseBackground"></event>
764 <event name="OnKeyDown"></event>
765 <event name="OnKeyUp"></event>
766 <event name="OnKillFocus"></event>
767 <event name="OnLeaveWindow"></event>
768 <event name="OnLeftDClick"></event>
769 <event name="OnLeftDown"></event>
770 <event name="OnLeftUp"></event>
771 <event name="OnMiddleDClick"></event>
772 <event name="OnMiddleDown"></event>
773 <event name="OnMiddleUp"></event>
774 <event name="OnMotion"></event>
775 <event name="OnMouseEvents"></event>
776 <event name="OnMouseWheel"></event>
777 <event name="OnPaint"></event>
778 <event name="OnRightDClick"></event>
779 <event name="OnRightDown"></event>
780 <event name="OnRightUp"></event>
781 <event name="OnSetFocus"></event>
782 <event name="OnSize"></event>
783 <event name="OnUpdateUI"></event>
784 </object>
785 </object>
786 </object>
787 </object>
788 <object class="sizeritem" expanded="1">
789 <property name="border">5</property>
790 <property name="flag">wxEXPAND</property>
791 <property name="proportion">1</property>
792 <object class="wxNotebook" expanded="1">
793 <property name="bg"></property>
794 <property name="bitmapsize"></property>
795 <property name="context_help"></property>
796 <property name="enabled">1</property>
797 <property name="fg"></property>
798 <property name="font"></property>
799 <property name="hidden">0</property>
800 <property name="id">wxID_ANY</property>
801 <property name="maximum_size"></property>
802 <property name="minimum_size"></property>
803 <property name="name">m_notebook</property>
804 <property name="permission">protected</property>
805 <property name="pos"></property>
806 <property name="size"></property>
807 <property name="style"></property>
808 <property name="subclass"></property>
809 <property name="tooltip"></property>
810 <property name="window_extra_style"></property>
811 <property name="window_name"></property>
812 <property name="window_style"></property>
813 <event name="OnChar"></event>
814 <event name="OnEnterWindow"></event>
815 <event name="OnEraseBackground"></event>
816 <event name="OnKeyDown"></event>
817 <event name="OnKeyUp"></event>
818 <event name="OnKillFocus"></event>
819 <event name="OnLeaveWindow"></event>
820 <event name="OnLeftDClick"></event>
821 <event name="OnLeftDown"></event>
822 <event name="OnLeftUp"></event>
823 <event name="OnMiddleDClick"></event>
824 <event name="OnMiddleDown"></event>
825 <event name="OnMiddleUp"></event>
826 <event name="OnMotion"></event>
827 <event name="OnMouseEvents"></event>
828 <event name="OnMouseWheel"></event>
829 <event name="OnNotebookPageChanged"></event>
830 <event name="OnNotebookPageChanging"></event>
831 <event name="OnPaint"></event>
832 <event name="OnRightDClick"></event>
833 <event name="OnRightDown"></event>
834 <event name="OnRightUp"></event>
835 <event name="OnSetFocus"></event>
836 <event name="OnSize"></event>
837 <event name="OnUpdateUI"></event>
838 <object class="notebookpage" expanded="1">
839 <property name="bitmap"></property>
840 <property name="label">All Transactions</property>
841 <property name="select">0</property>
842 <object class="wxPanel" expanded="1">
843 <property name="bg"></property>
844 <property name="context_help"></property>
845 <property name="enabled">1</property>
846 <property name="fg"></property>
847 <property name="font"></property>
848 <property name="hidden">0</property>
849 <property name="id">wxID_ANY</property>
850 <property name="maximum_size"></property>
851 <property name="minimum_size"></property>
852 <property name="name">m_panel7</property>
853 <property name="permission">protected</property>
854 <property name="pos"></property>
855 <property name="size"></property>
856 <property name="subclass"></property>
857 <property name="tooltip"></property>
858 <property name="window_extra_style"></property>
859 <property name="window_name"></property>
860 <property name="window_style">wxTAB_TRAVERSAL</property>
861 <event name="OnChar"></event>
862 <event name="OnEnterWindow"></event>
863 <event name="OnEraseBackground"></event>
864 <event name="OnKeyDown"></event>
865 <event name="OnKeyUp"></event>
866 <event name="OnKillFocus"></event>
867 <event name="OnLeaveWindow"></event>
868 <event name="OnLeftDClick"></event>
869 <event name="OnLeftDown"></event>
870 <event name="OnLeftUp"></event>
871 <event name="OnMiddleDClick"></event>
872 <event name="OnMiddleDown"></event>
873 <event name="OnMiddleUp"></event>
874 <event name="OnMotion"></event>
875 <event name="OnMouseEvents"></event>
876 <event name="OnMouseWheel"></event>
877 <event name="OnPaint"></event>
878 <event name="OnRightDClick"></event>
879 <event name="OnRightDown"></event>
880 <event name="OnRightUp"></event>
881 <event name="OnSetFocus"></event>
882 <event name="OnSize"></event>
883 <event name="OnUpdateUI"></event>
884 <object class="wxBoxSizer" expanded="1">
885 <property name="minimum_size"></property>
886 <property name="name">bSizer157</property>
887 <property name="orient">wxVERTICAL</property>
888 <property name="permission">none</property>
889 <object class="sizeritem" expanded="1">
890 <property name="border">5</property>
891 <property name="flag">wxEXPAND|wxALL</property>
892 <property name="proportion">1</property>
893 <object class="wxListCtrl" expanded="1">
894 <property name="bg"></property>
895 <property name="context_help"></property>
896 <property name="enabled">1</property>
897 <property name="fg"></property>
898 <property name="font"></property>
899 <property name="hidden">0</property>
900 <property name="id">wxID_ANY</property>
901 <property name="maximum_size"></property>
902 <property name="minimum_size"></property>
903 <property name="name">m_listCtrl</property>
904 <property name="permission">public</property>
905 <property name="pos"></property>
906 <property name="size"></property>
907 <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_DESCENDING</property>
908 <property name="subclass"></property>
909 <property name="tooltip"></property>
910 <property name="window_extra_style"></property>
911 <property name="window_name"></property>
912 <property name="window_style">wxALWAYS_SHOW_SB</property>
913 <event name="OnChar"></event>
914 <event name="OnEnterWindow"></event>
915 <event name="OnEraseBackground"></event>
916 <event name="OnKeyDown"></event>
917 <event name="OnKeyUp"></event>
918 <event name="OnKillFocus"></event>
919 <event name="OnLeaveWindow"></event>
920 <event name="OnLeftDClick"></event>
921 <event name="OnLeftDown"></event>
922 <event name="OnLeftUp"></event>
923 <event name="OnListBeginDrag"></event>
924 <event name="OnListBeginLabelEdit"></event>
925 <event name="OnListBeginRDrag"></event>
926 <event name="OnListCacheHint"></event>
927 <event name="OnListColBeginDrag">OnListColBeginDrag</event>
928 <event name="OnListColClick"></event>
929 <event name="OnListColDragging"></event>
930 <event name="OnListColEndDrag"></event>
931 <event name="OnListColRightClick"></event>
932 <event name="OnListDeleteAllItems"></event>
933 <event name="OnListDeleteItem"></event>
934 <event name="OnListEndLabelEdit"></event>
935 <event name="OnListInsertItem"></event>
936 <event name="OnListItemActivated">OnListItemActivatedAllTransactions</event>
937 <event name="OnListItemDeselected"></event>
938 <event name="OnListItemFocused"></event>
939 <event name="OnListItemMiddleClick"></event>
940 <event name="OnListItemRightClick"></event>
941 <event name="OnListItemSelected"></event>
942 <event name="OnListKeyDown"></event>
943 <event name="OnMiddleDClick"></event>
944 <event name="OnMiddleDown"></event>
945 <event name="OnMiddleUp"></event>
946 <event name="OnMotion"></event>
947 <event name="OnMouseEvents"></event>
948 <event name="OnMouseWheel"></event>
949 <event name="OnPaint">OnPaintListCtrl</event>
950 <event name="OnRightDClick"></event>
951 <event name="OnRightDown"></event>
952 <event name="OnRightUp"></event>
953 <event name="OnSetFocus"></event>
954 <event name="OnSize"></event>
955 <event name="OnUpdateUI"></event>
956 </object>
957 </object>
958 </object>
959 </object>
960 </object>
961 </object>
962 </object>
963 <object class="sizeritem" expanded="1">
964 <property name="border">5</property>
965 <property name="flag">wxEXPAND</property>
966 <property name="proportion">1</property>
967 <object class="wxBoxSizer" expanded="1">
968 <property name="minimum_size"></property>
969 <property name="name">bSizer_TabsForFutureUse</property>
970 <property name="orient">wxVERTICAL</property>
971 <property name="permission">none</property>
972 <object class="sizeritem" expanded="1">
973 <property name="border">5</property>
974 <property name="flag">wxEXPAND | wxALL</property>
975 <property name="proportion">1</property>
976 <object class="wxPanel" expanded="1">
977 <property name="bg"></property>
978 <property name="context_help"></property>
979 <property name="enabled">1</property>
980 <property name="fg"></property>
981 <property name="font"></property>
982 <property name="hidden">1</property>
983 <property name="id">wxID_ANY</property>
984 <property name="maximum_size"></property>
985 <property name="minimum_size"></property>
986 <property name="name">m_panel9</property>
987 <property name="permission">protected</property>
988 <property name="pos"></property>
989 <property name="size"></property>
990 <property name="subclass"></property>
991 <property name="tooltip"></property>
992 <property name="window_extra_style"></property>
993 <property name="window_name"></property>
994 <property name="window_style">wxTAB_TRAVERSAL</property>
995 <event name="OnChar"></event>
996 <event name="OnEnterWindow"></event>
997 <event name="OnEraseBackground"></event>
998 <event name="OnKeyDown"></event>
999 <event name="OnKeyUp"></event>
1000 <event name="OnKillFocus"></event>
1001 <event name="OnLeaveWindow"></event>
1002 <event name="OnLeftDClick"></event>
1003 <event name="OnLeftDown"></event>
1004 <event name="OnLeftUp"></event>
1005 <event name="OnMiddleDClick"></event>
1006 <event name="OnMiddleDown"></event>
1007 <event name="OnMiddleUp"></event>
1008 <event name="OnMotion"></event>
1009 <event name="OnMouseEvents"></event>
1010 <event name="OnMouseWheel"></event>
1011 <event name="OnPaint"></event>
1012 <event name="OnRightDClick"></event>
1013 <event name="OnRightDown"></event>
1014 <event name="OnRightUp"></event>
1015 <event name="OnSetFocus"></event>
1016 <event name="OnSize"></event>
1017 <event name="OnUpdateUI"></event>
1018 <object class="wxBoxSizer" expanded="1">
1019 <property name="minimum_size"></property>
1020 <property name="name">bSizer159</property>
1021 <property name="orient">wxVERTICAL</property>
1022 <property name="permission">none</property>
1023 <object class="sizeritem" expanded="1">
1024 <property name="border">5</property>
1025 <property name="flag">wxALL|wxEXPAND</property>
1026 <property name="proportion">1</property>
1027 <object class="wxListCtrl" expanded="1">
1028 <property name="bg"></property>
1029 <property name="context_help"></property>
1030 <property name="enabled">1</property>
1031 <property name="fg"></property>
1032 <property name="font"></property>
1033 <property name="hidden">0</property>
1034 <property name="id">wxID_ANY</property>
1035 <property name="maximum_size"></property>
1036 <property name="minimum_size"></property>
1037 <property name="name">m_listCtrlEscrows</property>
1038 <property name="permission">public</property>
1039 <property name="pos"></property>
1040 <property name="size"></property>
1041 <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT</property>
1042 <property name="subclass"></property>
1043 <property name="tooltip"></property>
1044 <property name="window_extra_style"></property>
1045 <property name="window_name"></property>
1046 <property name="window_style"></property>
1047 <event name="OnChar"></event>
1048 <event name="OnEnterWindow"></event>
1049 <event name="OnEraseBackground"></event>
1050 <event name="OnKeyDown"></event>
1051 <event name="OnKeyUp"></event>
1052 <event name="OnKillFocus"></event>
1053 <event name="OnLeaveWindow"></event>
1054 <event name="OnLeftDClick"></event>
1055 <event name="OnLeftDown"></event>
1056 <event name="OnLeftUp"></event>
1057 <event name="OnListBeginDrag"></event>
1058 <event name="OnListBeginLabelEdit"></event>
1059 <event name="OnListBeginRDrag"></event>
1060 <event name="OnListCacheHint"></event>
1061 <event name="OnListColBeginDrag"></event>
1062 <event name="OnListColClick"></event>
1063 <event name="OnListColDragging"></event>
1064 <event name="OnListColEndDrag"></event>
1065 <event name="OnListColRightClick"></event>
1066 <event name="OnListDeleteAllItems"></event>
1067 <event name="OnListDeleteItem"></event>
1068 <event name="OnListEndLabelEdit"></event>
1069 <event name="OnListInsertItem"></event>
1070 <event name="OnListItemActivated"></event>
1071 <event name="OnListItemDeselected"></event>
1072 <event name="OnListItemFocused"></event>
1073 <event name="OnListItemMiddleClick"></event>
1074 <event name="OnListItemRightClick"></event>
1075 <event name="OnListItemSelected"></event>
1076 <event name="OnListKeyDown"></event>
1077 <event name="OnMiddleDClick"></event>
1078 <event name="OnMiddleDown"></event>
1079 <event name="OnMiddleUp"></event>
1080 <event name="OnMotion"></event>
1081 <event name="OnMouseEvents"></event>
1082 <event name="OnMouseWheel"></event>
1083 <event name="OnPaint"></event>
1084 <event name="OnRightDClick"></event>
1085 <event name="OnRightDown"></event>
1086 <event name="OnRightUp"></event>
1087 <event name="OnSetFocus"></event>
1088 <event name="OnSize"></event>
1089 <event name="OnUpdateUI"></event>
1090 </object>
1091 </object>
1092 </object>
1093 </object>
1094 </object>
1095 <object class="sizeritem" expanded="1">
1096 <property name="border">5</property>
1097 <property name="flag">wxEXPAND | wxALL</property>
1098 <property name="proportion">1</property>
1099 <object class="wxPanel" expanded="1">
1100 <property name="bg"></property>
1101 <property name="context_help"></property>
1102 <property name="enabled">1</property>
1103 <property name="fg"></property>
1104 <property name="font"></property>
1105 <property name="hidden">1</property>
1106 <property name="id">wxID_ANY</property>
1107 <property name="maximum_size"></property>
1108 <property name="minimum_size"></property>
1109 <property name="name">m_panel8</property>
1110 <property name="permission">protected</property>
1111 <property name="pos"></property>
1112 <property name="size"></property>
1113 <property name="subclass"></property>
1114 <property name="tooltip"></property>
1115 <property name="window_extra_style"></property>
1116 <property name="window_name"></property>
1117 <property name="window_style">wxTAB_TRAVERSAL</property>
1118 <event name="OnChar"></event>
1119 <event name="OnEnterWindow"></event>
1120 <event name="OnEraseBackground"></event>
1121 <event name="OnKeyDown"></event>
1122 <event name="OnKeyUp"></event>
1123 <event name="OnKillFocus"></event>
1124 <event name="OnLeaveWindow"></event>
1125 <event name="OnLeftDClick"></event>
1126 <event name="OnLeftDown"></event>
1127 <event name="OnLeftUp"></event>
1128 <event name="OnMiddleDClick"></event>
1129 <event name="OnMiddleDown"></event>
1130 <event name="OnMiddleUp"></event>
1131 <event name="OnMotion"></event>
1132 <event name="OnMouseEvents"></event>
1133 <event name="OnMouseWheel"></event>
1134 <event name="OnPaint"></event>
1135 <event name="OnRightDClick"></event>
1136 <event name="OnRightDown"></event>
1137 <event name="OnRightUp"></event>
1138 <event name="OnSetFocus"></event>
1139 <event name="OnSize"></event>
1140 <event name="OnUpdateUI"></event>
1141 <object class="wxBoxSizer" expanded="1">
1142 <property name="minimum_size"></property>
1143 <property name="name">bSizer158</property>
1144 <property name="orient">wxVERTICAL</property>
1145 <property name="permission">none</property>
1146 <object class="sizeritem" expanded="1">
1147 <property name="border">5</property>
1148 <property name="flag">wxALL|wxEXPAND</property>
1149 <property name="proportion">1</property>
1150 <object class="wxListCtrl" expanded="1">
1151 <property name="bg"></property>
1152 <property name="context_help"></property>
1153 <property name="enabled">1</property>
1154 <property name="fg"></property>
1155 <property name="font"></property>
1156 <property name="hidden">0</property>
1157 <property name="id">wxID_ANY</property>
1158 <property name="maximum_size"></property>
1159 <property name="minimum_size"></property>
1160 <property name="name">m_listCtrlOrdersSent</property>
1161 <property name="permission">public</property>
1162 <property name="pos"></property>
1163 <property name="size"></property>
1164 <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT</property>
1165 <property name="subclass"></property>
1166 <property name="tooltip"></property>
1167 <property name="window_extra_style"></property>
1168 <property name="window_name"></property>
1169 <property name="window_style"></property>
1170 <event name="OnChar"></event>
1171 <event name="OnEnterWindow"></event>
1172 <event name="OnEraseBackground"></event>
1173 <event name="OnKeyDown"></event>
1174 <event name="OnKeyUp"></event>
1175 <event name="OnKillFocus"></event>
1176 <event name="OnLeaveWindow"></event>
1177 <event name="OnLeftDClick"></event>
1178 <event name="OnLeftDown"></event>
1179 <event name="OnLeftUp"></event>
1180 <event name="OnListBeginDrag"></event>
1181 <event name="OnListBeginLabelEdit"></event>
1182 <event name="OnListBeginRDrag"></event>
1183 <event name="OnListCacheHint"></event>
1184 <event name="OnListColBeginDrag"></event>
1185 <event name="OnListColClick"></event>
1186 <event name="OnListColDragging"></event>
1187 <event name="OnListColEndDrag"></event>
1188 <event name="OnListColRightClick"></event>
1189 <event name="OnListDeleteAllItems"></event>
1190 <event name="OnListDeleteItem"></event>
1191 <event name="OnListEndLabelEdit"></event>
1192 <event name="OnListInsertItem"></event>
1193 <event name="OnListItemActivated">OnListItemActivatedOrdersSent</event>
1194 <event name="OnListItemDeselected"></event>
1195 <event name="OnListItemFocused"></event>
1196 <event name="OnListItemMiddleClick"></event>
1197 <event name="OnListItemRightClick"></event>
1198 <event name="OnListItemSelected"></event>
1199 <event name="OnListKeyDown"></event>
1200 <event name="OnMiddleDClick"></event>
1201 <event name="OnMiddleDown"></event>
1202 <event name="OnMiddleUp"></event>
1203 <event name="OnMotion"></event>
1204 <event name="OnMouseEvents"></event>
1205 <event name="OnMouseWheel"></event>
1206 <event name="OnPaint"></event>
1207 <event name="OnRightDClick"></event>
1208 <event name="OnRightDown"></event>
1209 <event name="OnRightUp"></event>
1210 <event name="OnSetFocus"></event>
1211 <event name="OnSize"></event>
1212 <event name="OnUpdateUI"></event>
1213 </object>
1214 </object>
1215 </object>
1216 </object>
1217 </object>
1218 <object class="sizeritem" expanded="1">
1219 <property name="border">5</property>
1220 <property name="flag">wxEXPAND | wxALL</property>
1221 <property name="proportion">1</property>
1222 <object class="wxPanel" expanded="1">
1223 <property name="bg"></property>
1224 <property name="context_help"></property>
1225 <property name="enabled">1</property>
1226 <property name="fg"></property>
1227 <property name="font"></property>
1228 <property name="hidden">1</property>
1229 <property name="id">wxID_ANY</property>
1230 <property name="maximum_size"></property>
1231 <property name="minimum_size"></property>
1232 <property name="name">m_panel10</property>
1233 <property name="permission">protected</property>
1234 <property name="pos"></property>
1235 <property name="size"></property>
1236 <property name="subclass"></property>
1237 <property name="tooltip"></property>
1238 <property name="window_extra_style"></property>
1239 <property name="window_name"></property>
1240 <property name="window_style">wxTAB_TRAVERSAL</property>
1241 <event name="OnChar"></event>
1242 <event name="OnEnterWindow"></event>
1243 <event name="OnEraseBackground"></event>
1244 <event name="OnKeyDown"></event>
1245 <event name="OnKeyUp"></event>
1246 <event name="OnKillFocus"></event>
1247 <event name="OnLeaveWindow"></event>
1248 <event name="OnLeftDClick"></event>
1249 <event name="OnLeftDown"></event>
1250 <event name="OnLeftUp"></event>
1251 <event name="OnMiddleDClick"></event>
1252 <event name="OnMiddleDown"></event>
1253 <event name="OnMiddleUp"></event>
1254 <event name="OnMotion"></event>
1255 <event name="OnMouseEvents"></event>
1256 <event name="OnMouseWheel"></event>
1257 <event name="OnPaint"></event>
1258 <event name="OnRightDClick"></event>
1259 <event name="OnRightDown"></event>
1260 <event name="OnRightUp"></event>
1261 <event name="OnSetFocus"></event>
1262 <event name="OnSize"></event>
1263 <event name="OnUpdateUI"></event>
1264 <object class="wxBoxSizer" expanded="1">
1265 <property name="minimum_size"></property>
1266 <property name="name">bSizer160</property>
1267 <property name="orient">wxVERTICAL</property>
1268 <property name="permission">none</property>
1269 <object class="sizeritem" expanded="1">
1270 <property name="border">5</property>
1271 <property name="flag">wxALL|wxEXPAND</property>
1272 <property name="proportion">1</property>
1273 <object class="wxListCtrl" expanded="1">
1274 <property name="bg"></property>
1275 <property name="context_help"></property>
1276 <property name="enabled">1</property>
1277 <property name="fg"></property>
1278 <property name="font"></property>
1279 <property name="hidden">0</property>
1280 <property name="id">wxID_ANY</property>
1281 <property name="maximum_size"></property>
1282 <property name="minimum_size"></property>
1283 <property name="name">m_listCtrlProductsSent</property>
1284 <property name="permission">public</property>
1285 <property name="pos"></property>
1286 <property name="size"></property>
1287 <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT</property>
1288 <property name="subclass"></property>
1289 <property name="tooltip"></property>
1290 <property name="window_extra_style"></property>
1291 <property name="window_name"></property>
1292 <property name="window_style"></property>
1293 <event name="OnChar"></event>
1294 <event name="OnEnterWindow"></event>
1295 <event name="OnEraseBackground"></event>
1296 <event name="OnKeyDown"></event>
1297 <event name="OnKeyUp"></event>
1298 <event name="OnKillFocus"></event>
1299 <event name="OnLeaveWindow"></event>
1300 <event name="OnLeftDClick"></event>
1301 <event name="OnLeftDown"></event>
1302 <event name="OnLeftUp"></event>
1303 <event name="OnListBeginDrag"></event>
1304 <event name="OnListBeginLabelEdit"></event>
1305 <event name="OnListBeginRDrag"></event>
1306 <event name="OnListCacheHint"></event>
1307 <event name="OnListColBeginDrag"></event>
1308 <event name="OnListColClick"></event>
1309 <event name="OnListColDragging"></event>
1310 <event name="OnListColEndDrag"></event>
1311 <event name="OnListColRightClick"></event>
1312 <event name="OnListDeleteAllItems"></event>
1313 <event name="OnListDeleteItem"></event>
1314 <event name="OnListEndLabelEdit"></event>
1315 <event name="OnListInsertItem"></event>
1316 <event name="OnListItemActivated">OnListItemActivatedProductsSent</event>
1317 <event name="OnListItemDeselected"></event>
1318 <event name="OnListItemFocused"></event>
1319 <event name="OnListItemMiddleClick"></event>
1320 <event name="OnListItemRightClick"></event>
1321 <event name="OnListItemSelected"></event>
1322 <event name="OnListKeyDown"></event>
1323 <event name="OnMiddleDClick"></event>
1324 <event name="OnMiddleDown"></event>
1325 <event name="OnMiddleUp"></event>
1326 <event name="OnMotion"></event>
1327 <event name="OnMouseEvents"></event>
1328 <event name="OnMouseWheel"></event>
1329 <event name="OnPaint"></event>
1330 <event name="OnRightDClick"></event>
1331 <event name="OnRightDown"></event>
1332 <event name="OnRightUp"></event>
1333 <event name="OnSetFocus"></event>
1334 <event name="OnSize"></event>
1335 <event name="OnUpdateUI"></event>
1336 </object>
1337 </object>
1338 </object>
1339 </object>
1340 </object>
1341 <object class="sizeritem" expanded="1">
1342 <property name="border">5</property>
1343 <property name="flag">wxEXPAND | wxALL</property>
1344 <property name="proportion">1</property>
1345 <object class="wxPanel" expanded="1">
1346 <property name="bg"></property>
1347 <property name="context_help"></property>
1348 <property name="enabled">1</property>
1349 <property name="fg"></property>
1350 <property name="font"></property>
1351 <property name="hidden">1</property>
1352 <property name="id">wxID_ANY</property>
1353 <property name="maximum_size"></property>
1354 <property name="minimum_size"></property>
1355 <property name="name">m_panel11</property>
1356 <property name="permission">protected</property>
1357 <property name="pos"></property>
1358 <property name="size"></property>
1359 <property name="subclass"></property>
1360 <property name="tooltip"></property>
1361 <property name="window_extra_style"></property>
1362 <property name="window_name"></property>
1363 <property name="window_style">wxTAB_TRAVERSAL</property>
1364 <event name="OnChar"></event>
1365 <event name="OnEnterWindow"></event>
1366 <event name="OnEraseBackground"></event>
1367 <event name="OnKeyDown"></event>
1368 <event name="OnKeyUp"></event>
1369 <event name="OnKillFocus"></event>
1370 <event name="OnLeaveWindow"></event>
1371 <event name="OnLeftDClick"></event>
1372 <event name="OnLeftDown"></event>
1373 <event name="OnLeftUp"></event>
1374 <event name="OnMiddleDClick"></event>
1375 <event name="OnMiddleDown"></event>
1376 <event name="OnMiddleUp"></event>
1377 <event name="OnMotion"></event>
1378 <event name="OnMouseEvents"></event>
1379 <event name="OnMouseWheel"></event>
1380 <event name="OnPaint"></event>
1381 <event name="OnRightDClick"></event>
1382 <event name="OnRightDown"></event>
1383 <event name="OnRightUp"></event>
1384 <event name="OnSetFocus"></event>
1385 <event name="OnSize"></event>
1386 <event name="OnUpdateUI"></event>
1387 <object class="wxBoxSizer" expanded="1">
1388 <property name="minimum_size"></property>
1389 <property name="name">bSizer161</property>
1390 <property name="orient">wxVERTICAL</property>
1391 <property name="permission">none</property>
1392 <object class="sizeritem" expanded="1">
1393 <property name="border">5</property>
1394 <property name="flag">wxALL|wxEXPAND</property>
1395 <property name="proportion">1</property>
1396 <object class="wxListCtrl" expanded="1">
1397 <property name="bg"></property>
1398 <property name="context_help"></property>
1399 <property name="enabled">1</property>
1400 <property name="fg"></property>
1401 <property name="font"></property>
1402 <property name="hidden">0</property>
1403 <property name="id">wxID_ANY</property>
1404 <property name="maximum_size"></property>
1405 <property name="minimum_size"></property>
1406 <property name="name">m_listCtrlOrdersReceived</property>
1407 <property name="permission">public</property>
1408 <property name="pos"></property>
1409 <property name="size"></property>
1410 <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT</property>
1411 <property name="subclass"></property>
1412 <property name="tooltip"></property>
1413 <property name="window_extra_style"></property>
1414 <property name="window_name"></property>
1415 <property name="window_style"></property>
1416 <event name="OnChar"></event>
1417 <event name="OnEnterWindow"></event>
1418 <event name="OnEraseBackground"></event>
1419 <event name="OnKeyDown"></event>
1420 <event name="OnKeyUp"></event>
1421 <event name="OnKillFocus"></event>
1422 <event name="OnLeaveWindow"></event>
1423 <event name="OnLeftDClick"></event>
1424 <event name="OnLeftDown"></event>
1425 <event name="OnLeftUp"></event>
1426 <event name="OnListBeginDrag"></event>
1427 <event name="OnListBeginLabelEdit"></event>
1428 <event name="OnListBeginRDrag"></event>
1429 <event name="OnListCacheHint"></event>
1430 <event name="OnListColBeginDrag"></event>
1431 <event name="OnListColClick"></event>
1432 <event name="OnListColDragging"></event>
1433 <event name="OnListColEndDrag"></event>
1434 <event name="OnListColRightClick"></event>
1435 <event name="OnListDeleteAllItems"></event>
1436 <event name="OnListDeleteItem"></event>
1437 <event name="OnListEndLabelEdit"></event>
1438 <event name="OnListInsertItem"></event>
1439 <event name="OnListItemActivated">OnListItemActivatedOrdersReceived</event>
1440 <event name="OnListItemDeselected"></event>
1441 <event name="OnListItemFocused"></event>
1442 <event name="OnListItemMiddleClick"></event>
1443 <event name="OnListItemRightClick"></event>
1444 <event name="OnListItemSelected"></event>
1445 <event name="OnListKeyDown"></event>
1446 <event name="OnMiddleDClick"></event>
1447 <event name="OnMiddleDown"></event>
1448 <event name="OnMiddleUp"></event>
1449 <event name="OnMotion"></event>
1450 <event name="OnMouseEvents"></event>
1451 <event name="OnMouseWheel"></event>
1452 <event name="OnPaint"></event>
1453 <event name="OnRightDClick"></event>
1454 <event name="OnRightDown"></event>
1455 <event name="OnRightUp"></event>
1456 <event name="OnSetFocus"></event>
1457 <event name="OnSize"></event>
1458 <event name="OnUpdateUI"></event>
1459 </object>
1460 </object>
1461 </object>
1462 </object>
1463 </object>
1464 </object>
1465 </object>
1466 </object>
1467 </object>
1468 <object class="Dialog" expanded="0">
1469 <property name="bg"></property>
1470 <property name="center"></property>
1471 <property name="context_help"></property>
1472 <property name="enabled">1</property>
1473 <property name="extra_style"></property>
1474 <property name="fg"></property>
1475 <property name="font"></property>
1476 <property name="hidden">0</property>
1477 <property name="id">wxID_ANY</property>
1478 <property name="maximum_size"></property>
1479 <property name="minimum_size"></property>
1480 <property name="name">CTxDetailsDialogBase</property>
1481 <property name="pos"></property>
1482 <property name="size">620,450</property>
1483 <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
1484 <property name="subclass"></property>
1485 <property name="title">Transaction Details</property>
1486 <property name="tooltip"></property>
1487 <property name="window_extra_style"></property>
1488 <property name="window_name"></property>
1489 <property name="window_style"></property>
1490 <event name="OnActivate"></event>
1491 <event name="OnActivateApp"></event>
1492 <event name="OnChar"></event>
1493 <event name="OnClose"></event>
1494 <event name="OnEnterWindow"></event>
1495 <event name="OnEraseBackground"></event>
1496 <event name="OnHibernate"></event>
1497 <event name="OnIconize"></event>
1498 <event name="OnIdle"></event>
1499 <event name="OnInitDialog"></event>
1500 <event name="OnKeyDown"></event>
1501 <event name="OnKeyUp"></event>
1502 <event name="OnKillFocus"></event>
1503 <event name="OnLeaveWindow"></event>
1504 <event name="OnLeftDClick"></event>
1505 <event name="OnLeftDown"></event>
1506 <event name="OnLeftUp"></event>
1507 <event name="OnMiddleDClick"></event>
1508 <event name="OnMiddleDown"></event>
1509 <event name="OnMiddleUp"></event>
1510 <event name="OnMotion"></event>
1511 <event name="OnMouseEvents"></event>
1512 <event name="OnMouseWheel"></event>
1513 <event name="OnPaint"></event>
1514 <event name="OnRightDClick"></event>
1515 <event name="OnRightDown"></event>
1516 <event name="OnRightUp"></event>
1517 <event name="OnSetFocus"></event>
1518 <event name="OnSize"></event>
1519 <event name="OnUpdateUI"></event>
1520 <object class="wxBoxSizer" expanded="1">
1521 <property name="minimum_size"></property>
1522 <property name="name">bSizer64</property>
1523 <property name="orient">wxVERTICAL</property>
1524 <property name="permission">none</property>
1525 <object class="sizeritem" expanded="1">
1526 <property name="border">5</property>
1527 <property name="flag">wxEXPAND</property>
1528 <property name="proportion">1</property>
1529 <object class="wxBoxSizer" expanded="1">
1530 <property name="minimum_size"></property>
1531 <property name="name">bSizer66</property>
1532 <property name="orient">wxVERTICAL</property>
1533 <property name="permission">none</property>
1534 <object class="sizeritem" expanded="1">
1535 <property name="border">5</property>
1536 <property name="flag">wxALL|wxEXPAND</property>
1537 <property name="proportion">1</property>
1538 <object class="wxHtmlWindow" expanded="1">
1539 <property name="bg"></property>
1540 <property name="context_help"></property>
1541 <property name="enabled">1</property>
1542 <property name="fg"></property>
1543 <property name="font"></property>
1544 <property name="hidden">0</property>
1545 <property name="id">wxID_ANY</property>
1546 <property name="maximum_size"></property>
1547 <property name="minimum_size"></property>
1548 <property name="name">m_htmlWin</property>
1549 <property name="permission">protected</property>
1550 <property name="pos"></property>
1551 <property name="size"></property>
1552 <property name="style">wxHW_SCROLLBAR_AUTO</property>
1553 <property name="subclass"></property>
1554 <property name="tooltip"></property>
1555 <property name="window_extra_style"></property>
1556 <property name="window_name"></property>
1557 <property name="window_style"></property>
1558 <event name="OnChar"></event>
1559 <event name="OnEnterWindow"></event>
1560 <event name="OnEraseBackground"></event>
1561 <event name="OnHtmlCellClicked"></event>
1562 <event name="OnHtmlCellHover"></event>
1563 <event name="OnHtmlLinkClicked"></event>
1564 <event name="OnKeyDown"></event>
1565 <event name="OnKeyUp"></event>
1566 <event name="OnKillFocus"></event>
1567 <event name="OnLeaveWindow"></event>
1568 <event name="OnLeftDClick"></event>
1569 <event name="OnLeftDown"></event>
1570 <event name="OnLeftUp"></event>
1571 <event name="OnMiddleDClick"></event>
1572 <event name="OnMiddleDown"></event>
1573 <event name="OnMiddleUp"></event>
1574 <event name="OnMotion"></event>
1575 <event name="OnMouseEvents"></event>
1576 <event name="OnMouseWheel"></event>
1577 <event name="OnPaint"></event>
1578 <event name="OnRightDClick"></event>
1579 <event name="OnRightDown"></event>
1580 <event name="OnRightUp"></event>
1581 <event name="OnSetFocus"></event>
1582 <event name="OnSize"></event>
1583 <event name="OnUpdateUI"></event>
1584 </object>
1585 </object>
1586 </object>
1587 </object>
1588 <object class="sizeritem" expanded="1">
1589 <property name="border">5</property>
1590 <property name="flag">wxALIGN_RIGHT</property>
1591 <property name="proportion">0</property>
1592 <object class="wxBoxSizer" expanded="1">
1593 <property name="minimum_size"></property>
1594 <property name="name">bSizer65</property>
1595 <property name="orient">wxVERTICAL</property>
1596 <property name="permission">none</property>
1597 <object class="sizeritem" expanded="1">
1598 <property name="border">5</property>
1599 <property name="flag">wxALL</property>
1600 <property name="proportion">0</property>
1601 <object class="wxButton" expanded="1">
1602 <property name="bg"></property>
1603 <property name="context_help"></property>
1604 <property name="default">0</property>
1605 <property name="enabled">1</property>
1606 <property name="fg"></property>
1607 <property name="font"></property>
1608 <property name="hidden">0</property>
1609 <property name="id">wxID_OK</property>
1610 <property name="label">OK</property>
1611 <property name="maximum_size"></property>
1612 <property name="minimum_size"></property>
1613 <property name="name">m_buttonOK</property>
1614 <property name="permission">protected</property>
1615 <property name="pos"></property>
1616 <property name="size">85,25</property>
1617 <property name="style"></property>
1618 <property name="subclass"></property>
1619 <property name="tooltip"></property>
1620 <property name="window_extra_style"></property>
1621 <property name="window_name"></property>
1622 <property name="window_style"></property>
1623 <event name="OnButtonClick">OnButtonOK</event>
1624 <event name="OnChar"></event>
1625 <event name="OnEnterWindow"></event>
1626 <event name="OnEraseBackground"></event>
1627 <event name="OnKeyDown"></event>
1628 <event name="OnKeyUp"></event>
1629 <event name="OnKillFocus"></event>
1630 <event name="OnLeaveWindow"></event>
1631 <event name="OnLeftDClick"></event>
1632 <event name="OnLeftDown"></event>
1633 <event name="OnLeftUp"></event>
1634 <event name="OnMiddleDClick"></event>
1635 <event name="OnMiddleDown"></event>
1636 <event name="OnMiddleUp"></event>
1637 <event name="OnMotion"></event>
1638 <event name="OnMouseEvents"></event>
1639 <event name="OnMouseWheel"></event>
1640 <event name="OnPaint"></event>
1641 <event name="OnRightDClick"></event>
1642 <event name="OnRightDown"></event>
1643 <event name="OnRightUp"></event>
1644 <event name="OnSetFocus"></event>
1645 <event name="OnSize"></event>
1646 <event name="OnUpdateUI"></event>
1647 </object>
1648 </object>
1649 </object>
1650 </object>
1651 </object>
1652 </object>
1653 <object class="Dialog" expanded="0">
1654 <property name="bg"></property>
1655 <property name="center"></property>
1656 <property name="context_help"></property>
1657 <property name="enabled">1</property>
1658 <property name="extra_style"></property>
1659 <property name="fg"></property>
1660 <property name="font"></property>
1661 <property name="hidden">0</property>
1662 <property name="id">wxID_ANY</property>
1663 <property name="maximum_size"></property>
1664 <property name="minimum_size"></property>
1665 <property name="name">COptionsDialogBase</property>
1666 <property name="pos"></property>
1667 <property name="size">500,261</property>
1668 <property name="style">wxDEFAULT_DIALOG_STYLE</property>
1669 <property name="subclass"></property>
1670 <property name="title">Options</property>
1671 <property name="tooltip"></property>
1672 <property name="window_extra_style"></property>
1673 <property name="window_name"></property>
1674 <property name="window_style"></property>
1675 <event name="OnActivate"></event>
1676 <event name="OnActivateApp"></event>
1677 <event name="OnChar"></event>
1678 <event name="OnClose"></event>
1679 <event name="OnEnterWindow"></event>
1680 <event name="OnEraseBackground"></event>
1681 <event name="OnHibernate"></event>
1682 <event name="OnIconize"></event>
1683 <event name="OnIdle"></event>
1684 <event name="OnInitDialog"></event>
1685 <event name="OnKeyDown"></event>
1686 <event name="OnKeyUp"></event>
1687 <event name="OnKillFocus"></event>
1688 <event name="OnLeaveWindow"></event>
1689 <event name="OnLeftDClick"></event>
1690 <event name="OnLeftDown"></event>
1691 <event name="OnLeftUp"></event>
1692 <event name="OnMiddleDClick"></event>
1693 <event name="OnMiddleDown"></event>
1694 <event name="OnMiddleUp"></event>
1695 <event name="OnMotion"></event>
1696 <event name="OnMouseEvents"></event>
1697 <event name="OnMouseWheel"></event>
1698 <event name="OnPaint"></event>
1699 <event name="OnRightDClick"></event>
1700 <event name="OnRightDown"></event>
1701 <event name="OnRightUp"></event>
1702 <event name="OnSetFocus"></event>
1703 <event name="OnSize"></event>
1704 <event name="OnUpdateUI"></event>
1705 <object class="wxBoxSizer" expanded="1">
1706 <property name="minimum_size"></property>
1707 <property name="name">bSizer55</property>
1708 <property name="orient">wxVERTICAL</property>
1709 <property name="permission">none</property>
1710 <object class="sizeritem" expanded="1">
1711 <property name="border">5</property>
1712 <property name="flag">wxEXPAND|wxLEFT</property>
1713 <property name="proportion">1</property>
1714 <object class="wxBoxSizer" expanded="1">
1715 <property name="minimum_size"></property>
1716 <property name="name">bSizer57</property>
1717 <property name="orient">wxVERTICAL</property>
1718 <property name="permission">none</property>
1719 <object class="sizeritem" expanded="1">
1720 <property name="border">5</property>
1721 <property name="flag">wxEXPAND</property>
1722 <property name="proportion">0</property>
1723 <object class="spacer" expanded="1">
1724 <property name="height">20</property>
1725 <property name="permission">protected</property>
1726 <property name="width">0</property>
1727 </object>
1728 </object>
1729 <object class="sizeritem" expanded="1">
1730 <property name="border">5</property>
1731 <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
1732 <property name="proportion">0</property>
1733 <object class="wxStaticText" expanded="1">
1734 <property name="bg"></property>
1735 <property name="context_help"></property>
1736 <property name="enabled">1</property>
1737 <property name="fg"></property>
1738 <property name="font"></property>
1739 <property name="hidden">0</property>
1740 <property name="id">wxID_ANY</property>
1741 <property name="label">Optional transaction fee you give to the nodes that process your transactions.</property>
1742 <property name="maximum_size"></property>
1743 <property name="minimum_size"></property>
1744 <property name="name">m_staticText32</property>
1745 <property name="permission">protected</property>
1746 <property name="pos"></property>
1747 <property name="size"></property>
1748 <property name="style"></property>
1749 <property name="subclass"></property>
1750 <property name="tooltip"></property>
1751 <property name="window_extra_style"></property>
1752 <property name="window_name"></property>
1753 <property name="window_style"></property>
1754 <property name="wrap">-1</property>
1755 <event name="OnChar"></event>
1756 <event name="OnEnterWindow"></event>
1757 <event name="OnEraseBackground"></event>
1758 <event name="OnKeyDown"></event>
1759 <event name="OnKeyUp"></event>
1760 <event name="OnKillFocus"></event>
1761 <event name="OnLeaveWindow"></event>
1762 <event name="OnLeftDClick"></event>
1763 <event name="OnLeftDown"></event>
1764 <event name="OnLeftUp"></event>
1765 <event name="OnMiddleDClick"></event>
1766 <event name="OnMiddleDown"></event>
1767 <event name="OnMiddleUp"></event>
1768 <event name="OnMotion"></event>
1769 <event name="OnMouseEvents"></event>
1770 <event name="OnMouseWheel"></event>
1771 <event name="OnPaint"></event>
1772 <event name="OnRightDClick"></event>
1773 <event name="OnRightDown"></event>
1774 <event name="OnRightUp"></event>
1775 <event name="OnSetFocus"></event>
1776 <event name="OnSize"></event>
1777 <event name="OnUpdateUI"></event>
1778 </object>
1779 </object>
1780 <object class="sizeritem" expanded="1">
1781 <property name="border">5</property>
1782 <property name="flag">wxEXPAND</property>
1783 <property name="proportion">0</property>
1784 <object class="wxBoxSizer" expanded="1">
1785 <property name="minimum_size"></property>
1786 <property name="name">bSizer56</property>
1787 <property name="orient">wxHORIZONTAL</property>
1788 <property name="permission">none</property>
1789 <object class="sizeritem" expanded="1">
1790 <property name="border">5</property>
1791 <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT</property>
1792 <property name="proportion">0</property>
1793 <object class="wxStaticText" expanded="1">
1794 <property name="bg"></property>
1795 <property name="context_help"></property>
1796 <property name="enabled">1</property>
1797 <property name="fg"></property>
1798 <property name="font"></property>
1799 <property name="hidden">0</property>
1800 <property name="id">wxID_ANY</property>
1801 <property name="label">Transaction fee:</property>
1802 <property name="maximum_size"></property>
1803 <property name="minimum_size"></property>
1804 <property name="name">m_staticText31</property>
1805 <property name="permission">protected</property>
1806 <property name="pos"></property>
1807 <property name="size"></property>
1808 <property name="style"></property>
1809 <property name="subclass"></property>
1810 <property name="tooltip"></property>
1811 <property name="window_extra_style"></property>
1812 <property name="window_name"></property>
1813 <property name="window_style"></property>
1814 <property name="wrap">-1</property>
1815 <event name="OnChar"></event>
1816 <event name="OnEnterWindow"></event>
1817 <event name="OnEraseBackground"></event>
1818 <event name="OnKeyDown"></event>
1819 <event name="OnKeyUp"></event>
1820 <event name="OnKillFocus"></event>
1821 <event name="OnLeaveWindow"></event>
1822 <event name="OnLeftDClick"></event>
1823 <event name="OnLeftDown"></event>
1824 <event name="OnLeftUp"></event>
1825 <event name="OnMiddleDClick"></event>
1826 <event name="OnMiddleDown"></event>
1827 <event name="OnMiddleUp"></event>
1828 <event name="OnMotion"></event>
1829 <event name="OnMouseEvents"></event>
1830 <event name="OnMouseWheel"></event>
1831 <event name="OnPaint"></event>
1832 <event name="OnRightDClick"></event>
1833 <event name="OnRightDown"></event>
1834 <event name="OnRightUp"></event>
1835 <event name="OnSetFocus"></event>
1836 <event name="OnSize"></event>
1837 <event name="OnUpdateUI"></event>
1838 </object>
1839 </object>
1840 <object class="sizeritem" expanded="1">
1841 <property name="border">5</property>
1842 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
1843 <property name="proportion">0</property>
1844 <object class="wxTextCtrl" expanded="1">
1845 <property name="bg"></property>
1846 <property name="context_help"></property>
1847 <property name="enabled">1</property>
1848 <property name="fg"></property>
1849 <property name="font"></property>
1850 <property name="hidden">0</property>
1851 <property name="id">wxID_TRANSACTIONFEE</property>
1852 <property name="maximum_size"></property>
1853 <property name="maxlength">0</property>
1854 <property name="minimum_size"></property>
1855 <property name="name">m_textCtrlTransactionFee</property>
1856 <property name="permission">protected</property>
1857 <property name="pos"></property>
1858 <property name="size">70,-1</property>
1859 <property name="style"></property>
1860 <property name="subclass"></property>
1861 <property name="tooltip"></property>
1862 <property name="value"></property>
1863 <property name="window_extra_style"></property>
1864 <property name="window_name"></property>
1865 <property name="window_style"></property>
1866 <event name="OnChar"></event>
1867 <event name="OnEnterWindow"></event>
1868 <event name="OnEraseBackground"></event>
1869 <event name="OnKeyDown"></event>
1870 <event name="OnKeyUp"></event>
1871 <event name="OnKillFocus">OnKillFocusTransactionFee</event>
1872 <event name="OnLeaveWindow"></event>
1873 <event name="OnLeftDClick"></event>
1874 <event name="OnLeftDown"></event>
1875 <event name="OnLeftUp"></event>
1876 <event name="OnMiddleDClick"></event>
1877 <event name="OnMiddleDown"></event>
1878 <event name="OnMiddleUp"></event>
1879 <event name="OnMotion"></event>
1880 <event name="OnMouseEvents"></event>
1881 <event name="OnMouseWheel"></event>
1882 <event name="OnPaint"></event>
1883 <event name="OnRightDClick"></event>
1884 <event name="OnRightDown"></event>
1885 <event name="OnRightUp"></event>
1886 <event name="OnSetFocus"></event>
1887 <event name="OnSize"></event>
1888 <event name="OnText"></event>
1889 <event name="OnTextEnter"></event>
1890 <event name="OnTextMaxLen"></event>
1891 <event name="OnTextURL"></event>
1892 <event name="OnUpdateUI"></event>
1893 </object>
1894 </object>
1895 </object>
1896 </object>
1897 </object>
1898 </object>
1899 <object class="sizeritem" expanded="1">
1900 <property name="border">5</property>
1901 <property name="flag">wxALIGN_RIGHT</property>
1902 <property name="proportion">0</property>
1903 <object class="wxBoxSizer" expanded="1">
1904 <property name="minimum_size"></property>
1905 <property name="name">bSizer58</property>
1906 <property name="orient">wxHORIZONTAL</property>
1907 <property name="permission">none</property>
1908 <object class="sizeritem" expanded="1">
1909 <property name="border">5</property>
1910 <property name="flag">wxALL</property>
1911 <property name="proportion">0</property>
1912 <object class="wxButton" expanded="1">
1913 <property name="bg"></property>
1914 <property name="context_help"></property>
1915 <property name="default">0</property>
1916 <property name="enabled">1</property>
1917 <property name="fg"></property>
1918 <property name="font"></property>
1919 <property name="hidden">0</property>
1920 <property name="id">wxID_OK</property>
1921 <property name="label">OK</property>
1922 <property name="maximum_size"></property>
1923 <property name="minimum_size"></property>
1924 <property name="name">m_buttonOK</property>
1925 <property name="permission">protected</property>
1926 <property name="pos"></property>
1927 <property name="size">85,25</property>
1928 <property name="style"></property>
1929 <property name="subclass"></property>
1930 <property name="tooltip"></property>
1931 <property name="window_extra_style"></property>
1932 <property name="window_name"></property>
1933 <property name="window_style"></property>
1934 <event name="OnButtonClick">OnButtonOK</event>
1935 <event name="OnChar"></event>
1936 <event name="OnEnterWindow"></event>
1937 <event name="OnEraseBackground"></event>
1938 <event name="OnKeyDown"></event>
1939 <event name="OnKeyUp"></event>
1940 <event name="OnKillFocus"></event>
1941 <event name="OnLeaveWindow"></event>
1942 <event name="OnLeftDClick"></event>
1943 <event name="OnLeftDown"></event>
1944 <event name="OnLeftUp"></event>
1945 <event name="OnMiddleDClick"></event>
1946 <event name="OnMiddleDown"></event>
1947 <event name="OnMiddleUp"></event>
1948 <event name="OnMotion"></event>
1949 <event name="OnMouseEvents"></event>
1950 <event name="OnMouseWheel"></event>
1951 <event name="OnPaint"></event>
1952 <event name="OnRightDClick"></event>
1953 <event name="OnRightDown"></event>
1954 <event name="OnRightUp"></event>
1955 <event name="OnSetFocus"></event>
1956 <event name="OnSize"></event>
1957 <event name="OnUpdateUI"></event>
1958 </object>
1959 </object>
1960 <object class="sizeritem" expanded="1">
1961 <property name="border">5</property>
1962 <property name="flag">wxALL</property>
1963 <property name="proportion">0</property>
1964 <object class="wxButton" expanded="1">
1965 <property name="bg"></property>
1966 <property name="context_help"></property>
1967 <property name="default">0</property>
1968 <property name="enabled">1</property>
1969 <property name="fg"></property>
1970 <property name="font"></property>
1971 <property name="hidden">0</property>
1972 <property name="id">wxID_CANCEL</property>
1973 <property name="label">Cancel</property>
1974 <property name="maximum_size"></property>
1975 <property name="minimum_size">85,25</property>
1976 <property name="name">m_buttonCancel</property>
1977 <property name="permission">protected</property>
1978 <property name="pos"></property>
1979 <property name="size">-1,-1</property>
1980 <property name="style"></property>
1981 <property name="subclass"></property>
1982 <property name="tooltip"></property>
1983 <property name="window_extra_style"></property>
1984 <property name="window_name"></property>
1985 <property name="window_style"></property>
1986 <event name="OnButtonClick">OnButtonCancel</event>
1987 <event name="OnChar"></event>
1988 <event name="OnEnterWindow"></event>
1989 <event name="OnEraseBackground"></event>
1990 <event name="OnKeyDown"></event>
1991 <event name="OnKeyUp"></event>
1992 <event name="OnKillFocus"></event>
1993 <event name="OnLeaveWindow"></event>
1994 <event name="OnLeftDClick"></event>
1995 <event name="OnLeftDown"></event>
1996 <event name="OnLeftUp"></event>
1997 <event name="OnMiddleDClick"></event>
1998 <event name="OnMiddleDown"></event>
1999 <event name="OnMiddleUp"></event>
2000 <event name="OnMotion"></event>
2001 <event name="OnMouseEvents"></event>
2002 <event name="OnMouseWheel"></event>
2003 <event name="OnPaint"></event>
2004 <event name="OnRightDClick"></event>
2005 <event name="OnRightDown"></event>
2006 <event name="OnRightUp"></event>
2007 <event name="OnSetFocus"></event>
2008 <event name="OnSize"></event>
2009 <event name="OnUpdateUI"></event>
2010 </object>
2011 </object>
2012 </object>
2013 </object>
2014 </object>
2015 </object>
2016 <object class="Dialog" expanded="0">
2017 <property name="bg"></property>
2018 <property name="center"></property>
2019 <property name="context_help"></property>
2020 <property name="enabled">1</property>
2021 <property name="extra_style"></property>
2022 <property name="fg"></property>
2023 <property name="font"></property>
2024 <property name="hidden">0</property>
2025 <property name="id">wxID_ANY</property>
2026 <property name="maximum_size"></property>
2027 <property name="minimum_size"></property>
2028 <property name="name">CAboutDialogBase</property>
2029 <property name="pos"></property>
2030 <property name="size">507,298</property>
2031 <property name="style">wxDEFAULT_DIALOG_STYLE</property>
2032 <property name="subclass"></property>
2033 <property name="title">About Bitcoin</property>
2034 <property name="tooltip"></property>
2035 <property name="window_extra_style"></property>
2036 <property name="window_name"></property>
2037 <property name="window_style"></property>
2038 <event name="OnActivate"></event>
2039 <event name="OnActivateApp"></event>
2040 <event name="OnChar"></event>
2041 <event name="OnClose"></event>
2042 <event name="OnEnterWindow"></event>
2043 <event name="OnEraseBackground"></event>
2044 <event name="OnHibernate"></event>
2045 <event name="OnIconize"></event>
2046 <event name="OnIdle"></event>
2047 <event name="OnInitDialog"></event>
2048 <event name="OnKeyDown"></event>
2049 <event name="OnKeyUp"></event>
2050 <event name="OnKillFocus"></event>
2051 <event name="OnLeaveWindow"></event>
2052 <event name="OnLeftDClick"></event>
2053 <event name="OnLeftDown"></event>
2054 <event name="OnLeftUp"></event>
2055 <event name="OnMiddleDClick"></event>
2056 <event name="OnMiddleDown"></event>
2057 <event name="OnMiddleUp"></event>
2058 <event name="OnMotion"></event>
2059 <event name="OnMouseEvents"></event>
2060 <event name="OnMouseWheel"></event>
2061 <event name="OnPaint"></event>
2062 <event name="OnRightDClick"></event>
2063 <event name="OnRightDown"></event>
2064 <event name="OnRightUp"></event>
2065 <event name="OnSetFocus"></event>
2066 <event name="OnSize"></event>
2067 <event name="OnUpdateUI"></event>
2068 <object class="wxBoxSizer" expanded="0">
2069 <property name="minimum_size"></property>
2070 <property name="name">bSizer60</property>
2071 <property name="orient">wxVERTICAL</property>
2072 <property name="permission">none</property>
2073 <object class="sizeritem" expanded="1">
2074 <property name="border">5</property>
2075 <property name="flag">wxEXPAND</property>
2076 <property name="proportion">1</property>
2077 <object class="wxBoxSizer" expanded="1">
2078 <property name="minimum_size"></property>
2079 <property name="name">bSizer62</property>
2080 <property name="orient">wxHORIZONTAL</property>
2081 <property name="permission">none</property>
2082 <object class="sizeritem" expanded="1">
2083 <property name="border">5</property>
2084 <property name="flag">wxEXPAND</property>
2085 <property name="proportion">0</property>
2086 <object class="spacer" expanded="1">
2087 <property name="height">0</property>
2088 <property name="permission">protected</property>
2089 <property name="width">60</property>
2090 </object>
2091 </object>
2092 <object class="sizeritem" expanded="1">
2093 <property name="border">5</property>
2094 <property name="flag">wxEXPAND</property>
2095 <property name="proportion">1</property>
2096 <object class="wxBoxSizer" expanded="1">
2097 <property name="minimum_size"></property>
2098 <property name="name">bSizer63</property>
2099 <property name="orient">wxVERTICAL</property>
2100 <property name="permission">none</property>
2101 <object class="sizeritem" expanded="1">
2102 <property name="border">5</property>
2103 <property name="flag">wxEXPAND</property>
2104 <property name="proportion">0</property>
2105 <object class="spacer" expanded="1">
2106 <property name="height">50</property>
2107 <property name="permission">protected</property>
2108 <property name="width">0</property>
2109 </object>
2110 </object>
2111 <object class="sizeritem" expanded="1">
2112 <property name="border">5</property>
2113 <property name="flag">wxEXPAND</property>
2114 <property name="proportion">0</property>
2115 <object class="wxBoxSizer" expanded="1">
2116 <property name="minimum_size"></property>
2117 <property name="name">bSizer64</property>
2118 <property name="orient">wxHORIZONTAL</property>
2119 <property name="permission">none</property>
2120 <object class="sizeritem" expanded="1">
2121 <property name="border">5</property>
2122 <property name="flag">wxALIGN_BOTTOM|wxTOP|wxBOTTOM|wxLEFT</property>
2123 <property name="proportion">0</property>
2124 <object class="wxStaticText" expanded="1">
2125 <property name="bg"></property>
2126 <property name="context_help"></property>
2127 <property name="enabled">1</property>
2128 <property name="fg"></property>
2129 <property name="font">Tahoma,90,92,10,74,0</property>
2130 <property name="hidden">0</property>
2131 <property name="id">wxID_ANY</property>
2132 <property name="label">Bitcoin </property>
2133 <property name="maximum_size"></property>
2134 <property name="minimum_size"></property>
2135 <property name="name">m_staticText40</property>
2136 <property name="permission">protected</property>
2137 <property name="pos"></property>
2138 <property name="size"></property>
2139 <property name="style"></property>
2140 <property name="subclass"></property>
2141 <property name="tooltip"></property>
2142 <property name="window_extra_style"></property>
2143 <property name="window_name"></property>
2144 <property name="window_style"></property>
2145 <property name="wrap">-1</property>
2146 <event name="OnChar"></event>
2147 <event name="OnEnterWindow"></event>
2148 <event name="OnEraseBackground"></event>
2149 <event name="OnKeyDown"></event>
2150 <event name="OnKeyUp"></event>
2151 <event name="OnKillFocus"></event>
2152 <event name="OnLeaveWindow"></event>
2153 <event name="OnLeftDClick"></event>
2154 <event name="OnLeftDown"></event>
2155 <event name="OnLeftUp"></event>
2156 <event name="OnMiddleDClick"></event>
2157 <event name="OnMiddleDown"></event>
2158 <event name="OnMiddleUp"></event>
2159 <event name="OnMotion"></event>
2160 <event name="OnMouseEvents"></event>
2161 <event name="OnMouseWheel"></event>
2162 <event name="OnPaint"></event>
2163 <event name="OnRightDClick"></event>
2164 <event name="OnRightDown"></event>
2165 <event name="OnRightUp"></event>
2166 <event name="OnSetFocus"></event>
2167 <event name="OnSize"></event>
2168 <event name="OnUpdateUI"></event>
2169 </object>
2170 </object>
2171 <object class="sizeritem" expanded="1">
2172 <property name="border">5</property>
2173 <property name="flag">wxALIGN_BOTTOM|wxTOP|wxBOTTOM|wxRIGHT</property>
2174 <property name="proportion">0</property>
2175 <object class="wxStaticText" expanded="1">
2176 <property name="bg"></property>
2177 <property name="context_help"></property>
2178 <property name="enabled">1</property>
2179 <property name="fg"></property>
2180 <property name="font">Tahoma,90,90,10,74,0</property>
2181 <property name="hidden">0</property>
2182 <property name="id">wxID_ANY</property>
2183 <property name="label">version</property>
2184 <property name="maximum_size"></property>
2185 <property name="minimum_size"></property>
2186 <property name="name">m_staticTextVersion</property>
2187 <property name="permission">public</property>
2188 <property name="pos"></property>
2189 <property name="size"></property>
2190 <property name="style"></property>
2191 <property name="subclass"></property>
2192 <property name="tooltip"></property>
2193 <property name="window_extra_style"></property>
2194 <property name="window_name"></property>
2195 <property name="window_style"></property>
2196 <property name="wrap">-1</property>
2197 <event name="OnChar"></event>
2198 <event name="OnEnterWindow"></event>
2199 <event name="OnEraseBackground"></event>
2200 <event name="OnKeyDown"></event>
2201 <event name="OnKeyUp"></event>
2202 <event name="OnKillFocus"></event>
2203 <event name="OnLeaveWindow"></event>
2204 <event name="OnLeftDClick"></event>
2205 <event name="OnLeftDown"></event>
2206 <event name="OnLeftUp"></event>
2207 <event name="OnMiddleDClick"></event>
2208 <event name="OnMiddleDown"></event>
2209 <event name="OnMiddleUp"></event>
2210 <event name="OnMotion"></event>
2211 <event name="OnMouseEvents"></event>
2212 <event name="OnMouseWheel"></event>
2213 <event name="OnPaint"></event>
2214 <event name="OnRightDClick"></event>
2215 <event name="OnRightDown"></event>
2216 <event name="OnRightUp"></event>
2217 <event name="OnSetFocus"></event>
2218 <event name="OnSize"></event>
2219 <event name="OnUpdateUI"></event>
2220 </object>
2221 </object>
2222 </object>
2223 </object>
2224 <object class="sizeritem" expanded="1">
2225 <property name="border">5</property>
2226 <property name="flag">wxEXPAND</property>
2227 <property name="proportion">0</property>
2228 <object class="spacer" expanded="1">
2229 <property name="height">4</property>
2230 <property name="permission">protected</property>
2231 <property name="width">0</property>
2232 </object>
2233 </object>
2234 <object class="sizeritem" expanded="1">
2235 <property name="border">5</property>
2236 <property name="flag">wxALL</property>
2237 <property name="proportion">0</property>
2238 <object class="wxStaticText" expanded="1">
2239 <property name="bg"></property>
2240 <property name="context_help"></property>
2241 <property name="enabled">1</property>
2242 <property name="fg"></property>
2243 <property name="font"></property>
2244 <property name="hidden">0</property>
2245 <property name="id">wxID_ANY</property>
2246 <property name="label">Copyright © 2009 Satoshi Nakamoto.&#x0A;&#x0A;This is experimental software. Do not rely on it for actual financial transactions.&#x0A;&#x0A;Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php.&#x0A;&#x0A;This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com).</property>
2247 <property name="maximum_size"></property>
2248 <property name="minimum_size"></property>
2249 <property name="name">m_staticTextMain</property>
2250 <property name="permission">protected</property>
2251 <property name="pos"></property>
2252 <property name="size"></property>
2253 <property name="style"></property>
2254 <property name="subclass"></property>
2255 <property name="tooltip"></property>
2256 <property name="window_extra_style"></property>
2257 <property name="window_name"></property>
2258 <property name="window_style"></property>
2259 <property name="wrap">400</property>
2260 <event name="OnChar"></event>
2261 <event name="OnEnterWindow"></event>
2262 <event name="OnEraseBackground"></event>
2263 <event name="OnKeyDown"></event>
2264 <event name="OnKeyUp"></event>
2265 <event name="OnKillFocus"></event>
2266 <event name="OnLeaveWindow"></event>
2267 <event name="OnLeftDClick"></event>
2268 <event name="OnLeftDown"></event>
2269 <event name="OnLeftUp"></event>
2270 <event name="OnMiddleDClick"></event>
2271 <event name="OnMiddleDown"></event>
2272 <event name="OnMiddleUp"></event>
2273 <event name="OnMotion"></event>
2274 <event name="OnMouseEvents"></event>
2275 <event name="OnMouseWheel"></event>
2276 <event name="OnPaint"></event>
2277 <event name="OnRightDClick"></event>
2278 <event name="OnRightDown"></event>
2279 <event name="OnRightUp"></event>
2280 <event name="OnSetFocus"></event>
2281 <event name="OnSize"></event>
2282 <event name="OnUpdateUI"></event>
2283 </object>
2284 </object>
2285 <object class="sizeritem" expanded="1">
2286 <property name="border">5</property>
2287 <property name="flag">wxEXPAND</property>
2288 <property name="proportion">1</property>
2289 <object class="spacer" expanded="1">
2290 <property name="height">0</property>
2291 <property name="permission">protected</property>
2292 <property name="width">0</property>
2293 </object>
2294 </object>
2295 </object>
2296 </object>
2297 </object>
2298 </object>
2299 <object class="sizeritem" expanded="1">
2300 <property name="border">5</property>
2301 <property name="flag">wxALIGN_RIGHT|wxEXPAND</property>
2302 <property name="proportion">0</property>
2303 <object class="wxBoxSizer" expanded="1">
2304 <property name="minimum_size"></property>
2305 <property name="name">bSizer61</property>
2306 <property name="orient">wxHORIZONTAL</property>
2307 <property name="permission">none</property>
2308 <object class="sizeritem" expanded="1">
2309 <property name="border">5</property>
2310 <property name="flag">wxEXPAND</property>
2311 <property name="proportion">1</property>
2312 <object class="spacer" expanded="1">
2313 <property name="height">0</property>
2314 <property name="permission">protected</property>
2315 <property name="width">0</property>
2316 </object>
2317 </object>
2318 <object class="sizeritem" expanded="1">
2319 <property name="border">5</property>
2320 <property name="flag">wxALL</property>
2321 <property name="proportion">0</property>
2322 <object class="wxButton" expanded="1">
2323 <property name="bg"></property>
2324 <property name="context_help"></property>
2325 <property name="default">0</property>
2326 <property name="enabled">1</property>
2327 <property name="fg"></property>
2328 <property name="font"></property>
2329 <property name="hidden">0</property>
2330 <property name="id">wxID_OK</property>
2331 <property name="label">OK</property>
2332 <property name="maximum_size"></property>
2333 <property name="minimum_size"></property>
2334 <property name="name">m_buttonOK</property>
2335 <property name="permission">protected</property>
2336 <property name="pos"></property>
2337 <property name="size">85,25</property>
2338 <property name="style"></property>
2339 <property name="subclass"></property>
2340 <property name="tooltip"></property>
2341 <property name="window_extra_style"></property>
2342 <property name="window_name"></property>
2343 <property name="window_style"></property>
2344 <event name="OnButtonClick">OnButtonOK</event>
2345 <event name="OnChar"></event>
2346 <event name="OnEnterWindow"></event>
2347 <event name="OnEraseBackground"></event>
2348 <event name="OnKeyDown"></event>
2349 <event name="OnKeyUp"></event>
2350 <event name="OnKillFocus"></event>
2351 <event name="OnLeaveWindow"></event>
2352 <event name="OnLeftDClick"></event>
2353 <event name="OnLeftDown"></event>
2354 <event name="OnLeftUp"></event>
2355 <event name="OnMiddleDClick"></event>
2356 <event name="OnMiddleDown"></event>
2357 <event name="OnMiddleUp"></event>
2358 <event name="OnMotion"></event>
2359 <event name="OnMouseEvents"></event>
2360 <event name="OnMouseWheel"></event>
2361 <event name="OnPaint"></event>
2362 <event name="OnRightDClick"></event>
2363 <event name="OnRightDown"></event>
2364 <event name="OnRightUp"></event>
2365 <event name="OnSetFocus"></event>
2366 <event name="OnSize"></event>
2367 <event name="OnUpdateUI"></event>
2368 </object>
2369 </object>
2370 </object>
2371 </object>
2372 </object>
2373 </object>
2374 <object class="Dialog" expanded="0">
2375 <property name="bg"></property>
2376 <property name="center"></property>
2377 <property name="context_help"></property>
2378 <property name="enabled">1</property>
2379 <property name="extra_style"></property>
2380 <property name="fg"></property>
2381 <property name="font"></property>
2382 <property name="hidden">0</property>
2383 <property name="id">wxID_ANY</property>
2384 <property name="maximum_size"></property>
2385 <property name="minimum_size"></property>
2386 <property name="name">CSendDialogBase</property>
2387 <property name="pos"></property>
2388 <property name="size">675,338</property>
2389 <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
2390 <property name="subclass"></property>
2391 <property name="title">Send Coins</property>
2392 <property name="tooltip"></property>
2393 <property name="window_extra_style"></property>
2394 <property name="window_name"></property>
2395 <property name="window_style"></property>
2396 <event name="OnActivate"></event>
2397 <event name="OnActivateApp"></event>
2398 <event name="OnChar"></event>
2399 <event name="OnClose"></event>
2400 <event name="OnEnterWindow"></event>
2401 <event name="OnEraseBackground"></event>
2402 <event name="OnHibernate"></event>
2403 <event name="OnIconize"></event>
2404 <event name="OnIdle"></event>
2405 <event name="OnInitDialog"></event>
2406 <event name="OnKeyDown"></event>
2407 <event name="OnKeyUp"></event>
2408 <event name="OnKillFocus"></event>
2409 <event name="OnLeaveWindow"></event>
2410 <event name="OnLeftDClick"></event>
2411 <event name="OnLeftDown"></event>
2412 <event name="OnLeftUp"></event>
2413 <event name="OnMiddleDClick"></event>
2414 <event name="OnMiddleDown"></event>
2415 <event name="OnMiddleUp"></event>
2416 <event name="OnMotion"></event>
2417 <event name="OnMouseEvents"></event>
2418 <event name="OnMouseWheel"></event>
2419 <event name="OnPaint"></event>
2420 <event name="OnRightDClick"></event>
2421 <event name="OnRightDown"></event>
2422 <event name="OnRightUp"></event>
2423 <event name="OnSetFocus"></event>
2424 <event name="OnSize"></event>
2425 <event name="OnUpdateUI"></event>
2426 <object class="wxBoxSizer" expanded="1">
2427 <property name="minimum_size"></property>
2428 <property name="name">bSizer21</property>
2429 <property name="orient">wxVERTICAL</property>
2430 <property name="permission">none</property>
2431 <object class="sizeritem" expanded="1">
2432 <property name="border">5</property>
2433 <property name="flag">wxEXPAND</property>
2434 <property name="proportion">0</property>
2435 <object class="spacer" expanded="1">
2436 <property name="height">5</property>
2437 <property name="permission">protected</property>
2438 <property name="width">0</property>
2439 </object>
2440 </object>
2441 <object class="sizeritem" expanded="1">
2442 <property name="border">5</property>
2443 <property name="flag">wxEXPAND|wxLEFT</property>
2444 <property name="proportion">0</property>
2445 <object class="wxFlexGridSizer" expanded="0">
2446 <property name="cols">2</property>
2447 <property name="flexible_direction">wxBOTH</property>
2448 <property name="growablecols">1</property>
2449 <property name="growablerows"></property>
2450 <property name="hgap">0</property>
2451 <property name="minimum_size"></property>
2452 <property name="name">fgSizer1</property>
2453 <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
2454 <property name="permission">none</property>
2455 <property name="rows">3</property>
2456 <property name="vgap">0</property>
2457 <object class="sizeritem" expanded="1">
2458 <property name="border">5</property>
2459 <property name="flag">wxEXPAND</property>
2460 <property name="proportion">0</property>
2461 <object class="spacer" expanded="1">
2462 <property name="height">0</property>
2463 <property name="permission">protected</property>
2464 <property name="width">0</property>
2465 </object>
2466 </object>
2467 <object class="sizeritem" expanded="1">
2468 <property name="border">5</property>
2469 <property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
2470 <property name="proportion">0</property>
2471 <object class="wxStaticText" expanded="1">
2472 <property name="bg"></property>
2473 <property name="context_help"></property>
2474 <property name="enabled">1</property>
2475 <property name="fg"></property>
2476 <property name="font"></property>
2477 <property name="hidden">0</property>
2478 <property name="id">wxID_ANY</property>
2479 <property name="label">Enter the recipient&apos;s IP address (e.g. 123.45.6.7) for online transfer with comments and confirmation, &#x0A;or bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJED9L) if recipient is not online.</property>
2480 <property name="maximum_size"></property>
2481 <property name="minimum_size"></property>
2482 <property name="name">m_staticText14</property>
2483 <property name="permission">protected</property>
2484 <property name="pos"></property>
2485 <property name="size"></property>
2486 <property name="style"></property>
2487 <property name="subclass"></property>
2488 <property name="tooltip"></property>
2489 <property name="window_extra_style"></property>
2490 <property name="window_name"></property>
2491 <property name="window_style"></property>
2492 <property name="wrap">-1</property>
2493 <event name="OnChar"></event>
2494 <event name="OnEnterWindow"></event>
2495 <event name="OnEraseBackground"></event>
2496 <event name="OnKeyDown"></event>
2497 <event name="OnKeyUp"></event>
2498 <event name="OnKillFocus"></event>
2499 <event name="OnLeaveWindow"></event>
2500 <event name="OnLeftDClick"></event>
2501 <event name="OnLeftDown"></event>
2502 <event name="OnLeftUp"></event>
2503 <event name="OnMiddleDClick"></event>
2504 <event name="OnMiddleDown"></event>
2505 <event name="OnMiddleUp"></event>
2506 <event name="OnMotion"></event>
2507 <event name="OnMouseEvents"></event>
2508 <event name="OnMouseWheel"></event>
2509 <event name="OnPaint"></event>
2510 <event name="OnRightDClick"></event>
2511 <event name="OnRightDown"></event>
2512 <event name="OnRightUp"></event>
2513 <event name="OnSetFocus"></event>
2514 <event name="OnSize"></event>
2515 <event name="OnUpdateUI"></event>
2516 </object>
2517 </object>
2518 <object class="sizeritem" expanded="1">
2519 <property name="border">5</property>
2520 <property name="flag">wxEXPAND|wxLEFT</property>
2521 <property name="proportion">1</property>
2522 <object class="wxBoxSizer" expanded="1">
2523 <property name="minimum_size">70,-1</property>
2524 <property name="name">bSizer47</property>
2525 <property name="orient">wxHORIZONTAL</property>
2526 <property name="permission">none</property>
2527 <object class="sizeritem" expanded="1">
2528 <property name="border">5</property>
2529 <property name="flag">wxEXPAND</property>
2530 <property name="proportion">1</property>
2531 <object class="spacer" expanded="1">
2532 <property name="height">0</property>
2533 <property name="permission">protected</property>
2534 <property name="width">0</property>
2535 </object>
2536 </object>
2537 <object class="sizeritem" expanded="1">
2538 <property name="border">5</property>
2539 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
2540 <property name="proportion">0</property>
2541 <object class="wxStaticBitmap" expanded="1">
2542 <property name="bg"></property>
2543 <property name="bitmap">check; Load From Icon Resource [-1; -1]</property>
2544 <property name="context_help"></property>
2545 <property name="enabled">1</property>
2546 <property name="fg"></property>
2547 <property name="font"></property>
2548 <property name="hidden">0</property>
2549 <property name="id">wxID_ANY</property>
2550 <property name="maximum_size"></property>
2551 <property name="minimum_size"></property>
2552 <property name="name">m_bitmapCheckMark</property>
2553 <property name="permission">protected</property>
2554 <property name="pos"></property>
2555 <property name="size">16,16</property>
2556 <property name="subclass"></property>
2557 <property name="tooltip"></property>
2558 <property name="window_extra_style"></property>
2559 <property name="window_name"></property>
2560 <property name="window_style"></property>
2561 <event name="OnChar"></event>
2562 <event name="OnEnterWindow"></event>
2563 <event name="OnEraseBackground"></event>
2564 <event name="OnKeyDown"></event>
2565 <event name="OnKeyUp"></event>
2566 <event name="OnKillFocus"></event>
2567 <event name="OnLeaveWindow"></event>
2568 <event name="OnLeftDClick"></event>
2569 <event name="OnLeftDown"></event>
2570 <event name="OnLeftUp"></event>
2571 <event name="OnMiddleDClick"></event>
2572 <event name="OnMiddleDown"></event>
2573 <event name="OnMiddleUp"></event>
2574 <event name="OnMotion"></event>
2575 <event name="OnMouseEvents"></event>
2576 <event name="OnMouseWheel"></event>
2577 <event name="OnPaint"></event>
2578 <event name="OnRightDClick"></event>
2579 <event name="OnRightDown"></event>
2580 <event name="OnRightUp"></event>
2581 <event name="OnSetFocus"></event>
2582 <event name="OnSize"></event>
2583 <event name="OnUpdateUI"></event>
2584 </object>
2585 </object>
2586 <object class="sizeritem" expanded="1">
2587 <property name="border">5</property>
2588 <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT</property>
2589 <property name="proportion">0</property>
2590 <object class="wxStaticText" expanded="1">
2591 <property name="bg"></property>
2592 <property name="context_help"></property>
2593 <property name="enabled">1</property>
2594 <property name="fg"></property>
2595 <property name="font"></property>
2596 <property name="hidden">0</property>
2597 <property name="id">wxID_ANY</property>
2598 <property name="label">Pay &amp;To:</property>
2599 <property name="maximum_size"></property>
2600 <property name="minimum_size"></property>
2601 <property name="name">m_staticText36</property>
2602 <property name="permission">protected</property>
2603 <property name="pos"></property>
2604 <property name="size">-1,-1</property>
2605 <property name="style">wxALIGN_RIGHT</property>
2606 <property name="subclass"></property>
2607 <property name="tooltip"></property>
2608 <property name="window_extra_style"></property>
2609 <property name="window_name"></property>
2610 <property name="window_style"></property>
2611 <property name="wrap">-1</property>
2612 <event name="OnChar"></event>
2613 <event name="OnEnterWindow"></event>
2614 <event name="OnEraseBackground"></event>
2615 <event name="OnKeyDown"></event>
2616 <event name="OnKeyUp"></event>
2617 <event name="OnKillFocus"></event>
2618 <event name="OnLeaveWindow"></event>
2619 <event name="OnLeftDClick"></event>
2620 <event name="OnLeftDown"></event>
2621 <event name="OnLeftUp"></event>
2622 <event name="OnMiddleDClick"></event>
2623 <event name="OnMiddleDown"></event>
2624 <event name="OnMiddleUp"></event>
2625 <event name="OnMotion"></event>
2626 <event name="OnMouseEvents"></event>
2627 <event name="OnMouseWheel"></event>
2628 <event name="OnPaint"></event>
2629 <event name="OnRightDClick"></event>
2630 <event name="OnRightDown"></event>
2631 <event name="OnRightUp"></event>
2632 <event name="OnSetFocus"></event>
2633 <event name="OnSize"></event>
2634 <event name="OnUpdateUI"></event>
2635 </object>
2636 </object>
2637 </object>
2638 </object>
2639 <object class="sizeritem" expanded="1">
2640 <property name="border">5</property>
2641 <property name="flag">wxEXPAND|wxRIGHT</property>
2642 <property name="proportion">1</property>
2643 <object class="wxBoxSizer" expanded="1">
2644 <property name="minimum_size"></property>
2645 <property name="name">bSizer19</property>
2646 <property name="orient">wxHORIZONTAL</property>
2647 <property name="permission">none</property>
2648 <object class="sizeritem" expanded="1">
2649 <property name="border">5</property>
2650 <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
2651 <property name="proportion">1</property>
2652 <object class="wxTextCtrl" expanded="1">
2653 <property name="bg"></property>
2654 <property name="context_help"></property>
2655 <property name="enabled">1</property>
2656 <property name="fg"></property>
2657 <property name="font"></property>
2658 <property name="hidden">0</property>
2659 <property name="id">wxID_TEXTCTRLPAYTO</property>
2660 <property name="maximum_size"></property>
2661 <property name="maxlength">0</property>
2662 <property name="minimum_size"></property>
2663 <property name="name">m_textCtrlAddress</property>
2664 <property name="permission">protected</property>
2665 <property name="pos"></property>
2666 <property name="size"></property>
2667 <property name="style"></property>
2668 <property name="subclass"></property>
2669 <property name="tooltip"></property>
2670 <property name="value"></property>
2671 <property name="window_extra_style"></property>
2672 <property name="window_name"></property>
2673 <property name="window_style"></property>
2674 <event name="OnChar"></event>
2675 <event name="OnEnterWindow"></event>
2676 <event name="OnEraseBackground"></event>
2677 <event name="OnKeyDown">OnKeyDown</event>
2678 <event name="OnKeyUp"></event>
2679 <event name="OnKillFocus"></event>
2680 <event name="OnLeaveWindow"></event>
2681 <event name="OnLeftDClick"></event>
2682 <event name="OnLeftDown"></event>
2683 <event name="OnLeftUp"></event>
2684 <event name="OnMiddleDClick"></event>
2685 <event name="OnMiddleDown"></event>
2686 <event name="OnMiddleUp"></event>
2687 <event name="OnMotion"></event>
2688 <event name="OnMouseEvents"></event>
2689 <event name="OnMouseWheel"></event>
2690 <event name="OnPaint"></event>
2691 <event name="OnRightDClick"></event>
2692 <event name="OnRightDown"></event>
2693 <event name="OnRightUp"></event>
2694 <event name="OnSetFocus"></event>
2695 <event name="OnSize"></event>
2696 <event name="OnText">OnTextAddress</event>
2697 <event name="OnTextEnter"></event>
2698 <event name="OnTextMaxLen"></event>
2699 <event name="OnTextURL"></event>
2700 <event name="OnUpdateUI"></event>
2701 </object>
2702 </object>
2703 <object class="sizeritem" expanded="1">
2704 <property name="border">5</property>
2705 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT</property>
2706 <property name="proportion">0</property>
2707 <object class="wxButton" expanded="1">
2708 <property name="bg"></property>
2709 <property name="context_help"></property>
2710 <property name="default">0</property>
2711 <property name="enabled">1</property>
2712 <property name="fg"></property>
2713 <property name="font"></property>
2714 <property name="hidden">0</property>
2715 <property name="id">wxID_BUTTONPASTE</property>
2716 <property name="label">&amp;Paste</property>
2717 <property name="maximum_size"></property>
2718 <property name="minimum_size"></property>
2719 <property name="name">m_buttonPaste</property>
2720 <property name="permission">protected</property>
2721 <property name="pos"></property>
2722 <property name="size">-1,-1</property>
2723 <property name="style">wxBU_EXACTFIT</property>
2724 <property name="subclass"></property>
2725 <property name="tooltip"></property>
2726 <property name="window_extra_style"></property>
2727 <property name="window_name"></property>
2728 <property name="window_style"></property>
2729 <event name="OnButtonClick">OnButtonPaste</event>
2730 <event name="OnChar"></event>
2731 <event name="OnEnterWindow"></event>
2732 <event name="OnEraseBackground"></event>
2733 <event name="OnKeyDown"></event>
2734 <event name="OnKeyUp"></event>
2735 <event name="OnKillFocus"></event>
2736 <event name="OnLeaveWindow"></event>
2737 <event name="OnLeftDClick"></event>
2738 <event name="OnLeftDown"></event>
2739 <event name="OnLeftUp"></event>
2740 <event name="OnMiddleDClick"></event>
2741 <event name="OnMiddleDown"></event>
2742 <event name="OnMiddleUp"></event>
2743 <event name="OnMotion"></event>
2744 <event name="OnMouseEvents"></event>
2745 <event name="OnMouseWheel"></event>
2746 <event name="OnPaint"></event>
2747 <event name="OnRightDClick"></event>
2748 <event name="OnRightDown"></event>
2749 <event name="OnRightUp"></event>
2750 <event name="OnSetFocus"></event>
2751 <event name="OnSize"></event>
2752 <event name="OnUpdateUI"></event>
2753 </object>
2754 </object>
2755 <object class="sizeritem" expanded="1">
2756 <property name="border">5</property>
2757 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT</property>
2758 <property name="proportion">0</property>
2759 <object class="wxButton" expanded="1">
2760 <property name="bg"></property>
2761 <property name="context_help"></property>
2762 <property name="default">0</property>
2763 <property name="enabled">1</property>
2764 <property name="fg"></property>
2765 <property name="font"></property>
2766 <property name="hidden">0</property>
2767 <property name="id">wxID_BUTTONADDRESSBOOK</property>
2768 <property name="label"> Address &amp;Book...</property>
2769 <property name="maximum_size"></property>
2770 <property name="minimum_size"></property>
2771 <property name="name">m_buttonAddress</property>
2772 <property name="permission">protected</property>
2773 <property name="pos"></property>
2774 <property name="size"></property>
2775 <property name="style"></property>
2776 <property name="subclass"></property>
2777 <property name="tooltip"></property>
2778 <property name="window_extra_style"></property>
2779 <property name="window_name"></property>
2780 <property name="window_style"></property>
2781 <event name="OnButtonClick">OnButtonAddressBook</event>
2782 <event name="OnChar"></event>
2783 <event name="OnEnterWindow"></event>
2784 <event name="OnEraseBackground"></event>
2785 <event name="OnKeyDown"></event>
2786 <event name="OnKeyUp"></event>
2787 <event name="OnKillFocus"></event>
2788 <event name="OnLeaveWindow"></event>
2789 <event name="OnLeftDClick"></event>
2790 <event name="OnLeftDown"></event>
2791 <event name="OnLeftUp"></event>
2792 <event name="OnMiddleDClick"></event>
2793 <event name="OnMiddleDown"></event>
2794 <event name="OnMiddleUp"></event>
2795 <event name="OnMotion"></event>
2796 <event name="OnMouseEvents"></event>
2797 <event name="OnMouseWheel"></event>
2798 <event name="OnPaint"></event>
2799 <event name="OnRightDClick"></event>
2800 <event name="OnRightDown"></event>
2801 <event name="OnRightUp"></event>
2802 <event name="OnSetFocus"></event>
2803 <event name="OnSize"></event>
2804 <event name="OnUpdateUI"></event>
2805 </object>
2806 </object>
2807 </object>
2808 </object>
2809 <object class="sizeritem" expanded="1">
2810 <property name="border">5</property>
2811 <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT|wxALIGN_RIGHT</property>
2812 <property name="proportion">0</property>
2813 <object class="wxStaticText" expanded="1">
2814 <property name="bg"></property>
2815 <property name="context_help"></property>
2816 <property name="enabled">1</property>
2817 <property name="fg"></property>
2818 <property name="font"></property>
2819 <property name="hidden">0</property>
2820 <property name="id">wxID_ANY</property>
2821 <property name="label">&amp;Amount:</property>
2822 <property name="maximum_size"></property>
2823 <property name="minimum_size"></property>
2824 <property name="name">m_staticText19</property>
2825 <property name="permission">protected</property>
2826 <property name="pos"></property>
2827 <property name="size">-1,-1</property>
2828 <property name="style">wxALIGN_RIGHT</property>
2829 <property name="subclass"></property>
2830 <property name="tooltip"></property>
2831 <property name="window_extra_style"></property>
2832 <property name="window_name"></property>
2833 <property name="window_style"></property>
2834 <property name="wrap">-1</property>
2835 <event name="OnChar"></event>
2836 <event name="OnEnterWindow"></event>
2837 <event name="OnEraseBackground"></event>
2838 <event name="OnKeyDown"></event>
2839 <event name="OnKeyUp"></event>
2840 <event name="OnKillFocus"></event>
2841 <event name="OnLeaveWindow"></event>
2842 <event name="OnLeftDClick"></event>
2843 <event name="OnLeftDown"></event>
2844 <event name="OnLeftUp"></event>
2845 <event name="OnMiddleDClick"></event>
2846 <event name="OnMiddleDown"></event>
2847 <event name="OnMiddleUp"></event>
2848 <event name="OnMotion"></event>
2849 <event name="OnMouseEvents"></event>
2850 <event name="OnMouseWheel"></event>
2851 <event name="OnPaint"></event>
2852 <event name="OnRightDClick"></event>
2853 <event name="OnRightDown"></event>
2854 <event name="OnRightUp"></event>
2855 <event name="OnSetFocus"></event>
2856 <event name="OnSize"></event>
2857 <event name="OnUpdateUI"></event>
2858 </object>
2859 </object>
2860 <object class="sizeritem" expanded="1">
2861 <property name="border">5</property>
2862 <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
2863 <property name="proportion">0</property>
2864 <object class="wxTextCtrl" expanded="1">
2865 <property name="bg"></property>
2866 <property name="context_help"></property>
2867 <property name="enabled">1</property>
2868 <property name="fg"></property>
2869 <property name="font">,90,90,-1,70,0</property>
2870 <property name="hidden">0</property>
2871 <property name="id">wxID_TEXTCTRLAMOUNT</property>
2872 <property name="maximum_size"></property>
2873 <property name="maxlength">20</property>
2874 <property name="minimum_size"></property>
2875 <property name="name">m_textCtrlAmount</property>
2876 <property name="permission">protected</property>
2877 <property name="pos"></property>
2878 <property name="size">145,-1</property>
2879 <property name="style"></property>
2880 <property name="subclass"></property>
2881 <property name="tooltip"></property>
2882 <property name="value"></property>
2883 <property name="window_extra_style"></property>
2884 <property name="window_name"></property>
2885 <property name="window_style"></property>
2886 <event name="OnChar"></event>
2887 <event name="OnEnterWindow"></event>
2888 <event name="OnEraseBackground"></event>
2889 <event name="OnKeyDown">OnKeyDown</event>
2890 <event name="OnKeyUp"></event>
2891 <event name="OnKillFocus">OnKillFocusAmount</event>
2892 <event name="OnLeaveWindow"></event>
2893 <event name="OnLeftDClick"></event>
2894 <event name="OnLeftDown"></event>
2895 <event name="OnLeftUp"></event>
2896 <event name="OnMiddleDClick"></event>
2897 <event name="OnMiddleDown"></event>
2898 <event name="OnMiddleUp"></event>
2899 <event name="OnMotion"></event>
2900 <event name="OnMouseEvents"></event>
2901 <event name="OnMouseWheel"></event>
2902 <event name="OnPaint"></event>
2903 <event name="OnRightDClick"></event>
2904 <event name="OnRightDown"></event>
2905 <event name="OnRightUp"></event>
2906 <event name="OnSetFocus"></event>
2907 <event name="OnSize"></event>
2908 <event name="OnText"></event>
2909 <event name="OnTextEnter"></event>
2910 <event name="OnTextMaxLen"></event>
2911 <event name="OnTextURL"></event>
2912 <event name="OnUpdateUI"></event>
2913 </object>
2914 </object>
2915 <object class="sizeritem" expanded="1">
2916 <property name="border">5</property>
2917 <property name="flag">wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT</property>
2918 <property name="proportion">0</property>
2919 <object class="wxStaticText" expanded="1">
2920 <property name="bg"></property>
2921 <property name="context_help"></property>
2922 <property name="enabled">1</property>
2923 <property name="fg"></property>
2924 <property name="font"></property>
2925 <property name="hidden">0</property>
2926 <property name="id">wxID_ANY</property>
2927 <property name="label">T&amp;ransfer:</property>
2928 <property name="maximum_size"></property>
2929 <property name="minimum_size"></property>
2930 <property name="name">m_staticText20</property>
2931 <property name="permission">protected</property>
2932 <property name="pos"></property>
2933 <property name="size">-1,-1</property>
2934 <property name="style">wxALIGN_RIGHT</property>
2935 <property name="subclass"></property>
2936 <property name="tooltip"></property>
2937 <property name="window_extra_style"></property>
2938 <property name="window_name"></property>
2939 <property name="window_style"></property>
2940 <property name="wrap">-1</property>
2941 <event name="OnChar"></event>
2942 <event name="OnEnterWindow"></event>
2943 <event name="OnEraseBackground"></event>
2944 <event name="OnKeyDown"></event>
2945 <event name="OnKeyUp"></event>
2946 <event name="OnKillFocus"></event>
2947 <event name="OnLeaveWindow"></event>
2948 <event name="OnLeftDClick"></event>
2949 <event name="OnLeftDown"></event>
2950 <event name="OnLeftUp"></event>
2951 <event name="OnMiddleDClick"></event>
2952 <event name="OnMiddleDown"></event>
2953 <event name="OnMiddleUp"></event>
2954 <event name="OnMotion"></event>
2955 <event name="OnMouseEvents"></event>
2956 <event name="OnMouseWheel"></event>
2957 <event name="OnPaint"></event>
2958 <event name="OnRightDClick"></event>
2959 <event name="OnRightDown"></event>
2960 <event name="OnRightUp"></event>
2961 <event name="OnSetFocus"></event>
2962 <event name="OnSize"></event>
2963 <event name="OnUpdateUI"></event>
2964 </object>
2965 </object>
2966 <object class="sizeritem" expanded="1">
2967 <property name="border">5</property>
2968 <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
2969 <property name="proportion">0</property>
2970 <object class="wxChoice" expanded="1">
2971 <property name="bg"></property>
2972 <property name="choices">&quot; Standard&quot;</property>
2973 <property name="context_help"></property>
2974 <property name="enabled">1</property>
2975 <property name="fg"></property>
2976 <property name="font"></property>
2977 <property name="hidden">0</property>
2978 <property name="id">wxID_CHOICETRANSFERTYPE</property>
2979 <property name="maximum_size"></property>
2980 <property name="minimum_size"></property>
2981 <property name="name">m_choiceTransferType</property>
2982 <property name="permission">protected</property>
2983 <property name="pos"></property>
2984 <property name="selection">0</property>
2985 <property name="size"></property>
2986 <property name="subclass"></property>
2987 <property name="tooltip"></property>
2988 <property name="window_extra_style"></property>
2989 <property name="window_name"></property>
2990 <property name="window_style"></property>
2991 <event name="OnChar"></event>
2992 <event name="OnChoice"></event>
2993 <event name="OnEnterWindow"></event>
2994 <event name="OnEraseBackground"></event>
2995 <event name="OnKeyDown"></event>
2996 <event name="OnKeyUp"></event>
2997 <event name="OnKillFocus"></event>
2998 <event name="OnLeaveWindow"></event>
2999 <event name="OnLeftDClick"></event>
3000 <event name="OnLeftDown"></event>
3001 <event name="OnLeftUp"></event>
3002 <event name="OnMiddleDClick"></event>
3003 <event name="OnMiddleDown"></event>
3004 <event name="OnMiddleUp"></event>
3005 <event name="OnMotion"></event>
3006 <event name="OnMouseEvents"></event>
3007 <event name="OnMouseWheel"></event>
3008 <event name="OnPaint"></event>
3009 <event name="OnRightDClick"></event>
3010 <event name="OnRightDown"></event>
3011 <event name="OnRightUp"></event>
3012 <event name="OnSetFocus"></event>
3013 <event name="OnSize"></event>
3014 <event name="OnUpdateUI"></event>
3015 </object>
3016 </object>
3017 </object>
3018 </object>
3019 <object class="sizeritem" expanded="1">
3020 <property name="border">5</property>
3021 <property name="flag">wxEXPAND</property>
3022 <property name="proportion">0</property>
3023 <object class="wxBoxSizer" expanded="1">
3024 <property name="minimum_size"></property>
3025 <property name="name">bSizer672</property>
3026 <property name="orient">wxHORIZONTAL</property>
3027 <property name="permission">none</property>
3028 <object class="sizeritem" expanded="1">
3029 <property name="border">5</property>
3030 <property name="flag">wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT</property>
3031 <property name="proportion">1</property>
3032 <object class="wxBoxSizer" expanded="1">
3033 <property name="minimum_size"></property>
3034 <property name="name">bSizer681</property>
3035 <property name="orient">wxVERTICAL</property>
3036 <property name="permission">none</property>
3037 <object class="sizeritem" expanded="1">
3038 <property name="border">5</property>
3039 <property name="flag">wxBOTTOM|wxLEFT</property>
3040 <property name="proportion">0</property>
3041 <object class="wxStaticText" expanded="1">
3042 <property name="bg"></property>
3043 <property name="context_help"></property>
3044 <property name="enabled">1</property>
3045 <property name="fg"></property>
3046 <property name="font"></property>
3047 <property name="hidden">0</property>
3048 <property name="id">wxID_ANY</property>
3049 <property name="label">&amp;From:</property>
3050 <property name="maximum_size"></property>
3051 <property name="minimum_size"></property>
3052 <property name="name">m_staticTextFrom</property>
3053 <property name="permission">protected</property>
3054 <property name="pos"></property>
3055 <property name="size"></property>
3056 <property name="style"></property>
3057 <property name="subclass"></property>
3058 <property name="tooltip"></property>
3059 <property name="window_extra_style"></property>
3060 <property name="window_name"></property>
3061 <property name="window_style"></property>
3062 <property name="wrap">-1</property>
3063 <event name="OnChar"></event>
3064 <event name="OnEnterWindow"></event>
3065 <event name="OnEraseBackground"></event>
3066 <event name="OnKeyDown"></event>
3067 <event name="OnKeyUp"></event>
3068 <event name="OnKillFocus"></event>
3069 <event name="OnLeaveWindow"></event>
3070 <event name="OnLeftDClick"></event>
3071 <event name="OnLeftDown"></event>
3072 <event name="OnLeftUp"></event>
3073 <event name="OnMiddleDClick"></event>
3074 <event name="OnMiddleDown"></event>
3075 <event name="OnMiddleUp"></event>
3076 <event name="OnMotion"></event>
3077 <event name="OnMouseEvents"></event>
3078 <event name="OnMouseWheel"></event>
3079 <event name="OnPaint"></event>
3080 <event name="OnRightDClick"></event>
3081 <event name="OnRightDown"></event>
3082 <event name="OnRightUp"></event>
3083 <event name="OnSetFocus"></event>
3084 <event name="OnSize"></event>
3085 <event name="OnUpdateUI"></event>
3086 </object>
3087 </object>
3088 <object class="sizeritem" expanded="1">
3089 <property name="border">5</property>
3090 <property name="flag">wxLEFT|wxEXPAND</property>
3091 <property name="proportion">0</property>
3092 <object class="wxTextCtrl" expanded="1">
3093 <property name="bg"></property>
3094 <property name="context_help"></property>
3095 <property name="enabled">1</property>
3096 <property name="fg"></property>
3097 <property name="font"></property>
3098 <property name="hidden">0</property>
3099 <property name="id">wxID_ANY</property>
3100 <property name="maximum_size"></property>
3101 <property name="maxlength">0</property>
3102 <property name="minimum_size"></property>
3103 <property name="name">m_textCtrlFrom</property>
3104 <property name="permission">protected</property>
3105 <property name="pos"></property>
3106 <property name="size">-1,-1</property>
3107 <property name="style"></property>
3108 <property name="subclass"></property>
3109 <property name="tooltip"></property>
3110 <property name="value"></property>
3111 <property name="window_extra_style"></property>
3112 <property name="window_name"></property>
3113 <property name="window_style"></property>
3114 <event name="OnChar"></event>
3115 <event name="OnEnterWindow"></event>
3116 <event name="OnEraseBackground"></event>
3117 <event name="OnKeyDown">OnKeyDown</event>
3118 <event name="OnKeyUp"></event>
3119 <event name="OnKillFocus"></event>
3120 <event name="OnLeaveWindow"></event>
3121 <event name="OnLeftDClick"></event>
3122 <event name="OnLeftDown"></event>
3123 <event name="OnLeftUp"></event>
3124 <event name="OnMiddleDClick"></event>
3125 <event name="OnMiddleDown"></event>
3126 <event name="OnMiddleUp"></event>
3127 <event name="OnMotion"></event>
3128 <event name="OnMouseEvents"></event>
3129 <event name="OnMouseWheel"></event>
3130 <event name="OnPaint"></event>
3131 <event name="OnRightDClick"></event>
3132 <event name="OnRightDown"></event>
3133 <event name="OnRightUp"></event>
3134 <event name="OnSetFocus"></event>
3135 <event name="OnSize"></event>
3136 <event name="OnText"></event>
3137 <event name="OnTextEnter"></event>
3138 <event name="OnTextMaxLen"></event>
3139 <event name="OnTextURL"></event>
3140 <event name="OnUpdateUI"></event>
3141 </object>
3142 </object>
3143 </object>
3144 </object>
3145 </object>
3146 </object>
3147 <object class="sizeritem" expanded="1">
3148 <property name="border">5</property>
3149 <property name="flag">wxEXPAND</property>
3150 <property name="proportion">1</property>
3151 <object class="wxBoxSizer" expanded="1">
3152 <property name="minimum_size"></property>
3153 <property name="name">bSizer67</property>
3154 <property name="orient">wxHORIZONTAL</property>
3155 <property name="permission">none</property>
3156 <object class="sizeritem" expanded="1">
3157 <property name="border">5</property>
3158 <property name="flag">wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT</property>
3159 <property name="proportion">1</property>
3160 <object class="wxBoxSizer" expanded="1">
3161 <property name="minimum_size"></property>
3162 <property name="name">bSizer68</property>
3163 <property name="orient">wxVERTICAL</property>
3164 <property name="permission">none</property>
3165 <object class="sizeritem" expanded="1">
3166 <property name="border">5</property>
3167 <property name="flag">wxTOP|wxBOTTOM|wxLEFT</property>
3168 <property name="proportion">0</property>
3169 <object class="wxStaticText" expanded="1">
3170 <property name="bg"></property>
3171 <property name="context_help"></property>
3172 <property name="enabled">1</property>
3173 <property name="fg"></property>
3174 <property name="font"></property>
3175 <property name="hidden">0</property>
3176 <property name="id">wxID_ANY</property>
3177 <property name="label">&amp;Message:</property>
3178 <property name="maximum_size"></property>
3179 <property name="minimum_size"></property>
3180 <property name="name">m_staticTextMessage</property>
3181 <property name="permission">protected</property>
3182 <property name="pos"></property>
3183 <property name="size"></property>
3184 <property name="style"></property>
3185 <property name="subclass"></property>
3186 <property name="tooltip"></property>
3187 <property name="window_extra_style"></property>
3188 <property name="window_name"></property>
3189 <property name="window_style"></property>
3190 <property name="wrap">-1</property>
3191 <event name="OnChar"></event>
3192 <event name="OnEnterWindow"></event>
3193 <event name="OnEraseBackground"></event>
3194 <event name="OnKeyDown"></event>
3195 <event name="OnKeyUp"></event>
3196 <event name="OnKillFocus"></event>
3197 <event name="OnLeaveWindow"></event>
3198 <event name="OnLeftDClick"></event>
3199 <event name="OnLeftDown"></event>
3200 <event name="OnLeftUp"></event>
3201 <event name="OnMiddleDClick"></event>
3202 <event name="OnMiddleDown"></event>
3203 <event name="OnMiddleUp"></event>
3204 <event name="OnMotion"></event>
3205 <event name="OnMouseEvents"></event>
3206 <event name="OnMouseWheel"></event>
3207 <event name="OnPaint"></event>
3208 <event name="OnRightDClick"></event>
3209 <event name="OnRightDown"></event>
3210 <event name="OnRightUp"></event>
3211 <event name="OnSetFocus"></event>
3212 <event name="OnSize"></event>
3213 <event name="OnUpdateUI"></event>
3214 </object>
3215 </object>
3216 <object class="sizeritem" expanded="1">
3217 <property name="border">5</property>
3218 <property name="flag">wxEXPAND|wxLEFT</property>
3219 <property name="proportion">1</property>
3220 <object class="wxTextCtrl" expanded="1">
3221 <property name="bg"></property>
3222 <property name="context_help"></property>
3223 <property name="enabled">1</property>
3224 <property name="fg"></property>
3225 <property name="font"></property>
3226 <property name="hidden">0</property>
3227 <property name="id">wxID_ANY</property>
3228 <property name="maximum_size"></property>
3229 <property name="maxlength">0</property>
3230 <property name="minimum_size"></property>
3231 <property name="name">m_textCtrlMessage</property>
3232 <property name="permission">protected</property>
3233 <property name="pos"></property>
3234 <property name="size"></property>
3235 <property name="style">wxTE_MULTILINE</property>
3236 <property name="subclass"></property>
3237 <property name="tooltip"></property>
3238 <property name="value"></property>
3239 <property name="window_extra_style"></property>
3240 <property name="window_name"></property>
3241 <property name="window_style"></property>
3242 <event name="OnChar"></event>
3243 <event name="OnEnterWindow"></event>
3244 <event name="OnEraseBackground"></event>
3245 <event name="OnKeyDown">OnKeyDown</event>
3246 <event name="OnKeyUp"></event>
3247 <event name="OnKillFocus"></event>
3248 <event name="OnLeaveWindow"></event>
3249 <event name="OnLeftDClick"></event>
3250 <event name="OnLeftDown"></event>
3251 <event name="OnLeftUp"></event>
3252 <event name="OnMiddleDClick"></event>
3253 <event name="OnMiddleDown"></event>
3254 <event name="OnMiddleUp"></event>
3255 <event name="OnMotion"></event>
3256 <event name="OnMouseEvents"></event>
3257 <event name="OnMouseWheel"></event>
3258 <event name="OnPaint"></event>
3259 <event name="OnRightDClick"></event>
3260 <event name="OnRightDown"></event>
3261 <event name="OnRightUp"></event>
3262 <event name="OnSetFocus"></event>
3263 <event name="OnSize"></event>
3264 <event name="OnText"></event>
3265 <event name="OnTextEnter"></event>
3266 <event name="OnTextMaxLen"></event>
3267 <event name="OnTextURL"></event>
3268 <event name="OnUpdateUI"></event>
3269 </object>
3270 </object>
3271 </object>
3272 </object>
3273 </object>
3274 </object>
3275 <object class="sizeritem" expanded="1">
3276 <property name="border">5</property>
3277 <property name="flag">wxEXPAND</property>
3278 <property name="proportion">0</property>
3279 <object class="wxBoxSizer" expanded="1">
3280 <property name="minimum_size"></property>
3281 <property name="name">bSizer23</property>
3282 <property name="orient">wxHORIZONTAL</property>
3283 <property name="permission">none</property>
3284 <object class="sizeritem" expanded="1">
3285 <property name="border">5</property>
3286 <property name="flag">wxEXPAND</property>
3287 <property name="proportion">1</property>
3288 <object class="spacer" expanded="1">
3289 <property name="height">0</property>
3290 <property name="permission">protected</property>
3291 <property name="width">0</property>
3292 </object>
3293 </object>
3294 <object class="sizeritem" expanded="1">
3295 <property name="border">5</property>
3296 <property name="flag">wxALL</property>
3297 <property name="proportion">0</property>
3298 <object class="wxButton" expanded="1">
3299 <property name="bg"></property>
3300 <property name="context_help"></property>
3301 <property name="default">0</property>
3302 <property name="enabled">1</property>
3303 <property name="fg"></property>
3304 <property name="font">,90,90,-1,70,0</property>
3305 <property name="hidden">0</property>
3306 <property name="id">wxID_BUTTONSEND</property>
3307 <property name="label">&amp;Send</property>
3308 <property name="maximum_size"></property>
3309 <property name="minimum_size">85,25</property>
3310 <property name="name">m_buttonSend</property>
3311 <property name="permission">protected</property>
3312 <property name="pos"></property>
3313 <property name="size">-1,-1</property>
3314 <property name="style"></property>
3315 <property name="subclass"></property>
3316 <property name="tooltip"></property>
3317 <property name="window_extra_style"></property>
3318 <property name="window_name"></property>
3319 <property name="window_style"></property>
3320 <event name="OnButtonClick">OnButtonSend</event>
3321 <event name="OnChar"></event>
3322 <event name="OnEnterWindow"></event>
3323 <event name="OnEraseBackground"></event>
3324 <event name="OnKeyDown"></event>
3325 <event name="OnKeyUp"></event>
3326 <event name="OnKillFocus"></event>
3327 <event name="OnLeaveWindow"></event>
3328 <event name="OnLeftDClick"></event>
3329 <event name="OnLeftDown"></event>
3330 <event name="OnLeftUp"></event>
3331 <event name="OnMiddleDClick"></event>
3332 <event name="OnMiddleDown"></event>
3333 <event name="OnMiddleUp"></event>
3334 <event name="OnMotion"></event>
3335 <event name="OnMouseEvents"></event>
3336 <event name="OnMouseWheel"></event>
3337 <event name="OnPaint"></event>
3338 <event name="OnRightDClick"></event>
3339 <event name="OnRightDown"></event>
3340 <event name="OnRightUp"></event>
3341 <event name="OnSetFocus"></event>
3342 <event name="OnSize"></event>
3343 <event name="OnUpdateUI"></event>
3344 </object>
3345 </object>
3346 <object class="sizeritem" expanded="1">
3347 <property name="border">5</property>
3348 <property name="flag">wxALL</property>
3349 <property name="proportion">0</property>
3350 <object class="wxButton" expanded="1">
3351 <property name="bg"></property>
3352 <property name="context_help"></property>
3353 <property name="default">0</property>
3354 <property name="enabled">1</property>
3355 <property name="fg"></property>
3356 <property name="font"></property>
3357 <property name="hidden">0</property>
3358 <property name="id">wxID_CANCEL</property>
3359 <property name="label">Cancel</property>
3360 <property name="maximum_size"></property>
3361 <property name="minimum_size">85,25</property>
3362 <property name="name">m_buttonCancel</property>
3363 <property name="permission">protected</property>
3364 <property name="pos"></property>
3365 <property name="size">-1,-1</property>
3366 <property name="style"></property>
3367 <property name="subclass"></property>
3368 <property name="tooltip"></property>
3369 <property name="window_extra_style"></property>
3370 <property name="window_name"></property>
3371 <property name="window_style"></property>
3372 <event name="OnButtonClick">OnButtonCancel</event>
3373 <event name="OnChar"></event>
3374 <event name="OnEnterWindow"></event>
3375 <event name="OnEraseBackground"></event>
3376 <event name="OnKeyDown"></event>
3377 <event name="OnKeyUp"></event>
3378 <event name="OnKillFocus"></event>
3379 <event name="OnLeaveWindow"></event>
3380 <event name="OnLeftDClick"></event>
3381 <event name="OnLeftDown"></event>
3382 <event name="OnLeftUp"></event>
3383 <event name="OnMiddleDClick"></event>
3384 <event name="OnMiddleDown"></event>
3385 <event name="OnMiddleUp"></event>
3386 <event name="OnMotion"></event>
3387 <event name="OnMouseEvents"></event>
3388 <event name="OnMouseWheel"></event>
3389 <event name="OnPaint"></event>
3390 <event name="OnRightDClick"></event>
3391 <event name="OnRightDown"></event>
3392 <event name="OnRightUp"></event>
3393 <event name="OnSetFocus"></event>
3394 <event name="OnSize"></event>
3395 <event name="OnUpdateUI"></event>
3396 </object>
3397 </object>
3398 </object>
3399 </object>
3400 </object>
3401 </object>
3402 <object class="Dialog" expanded="1">
3403 <property name="bg"></property>
3404 <property name="center"></property>
3405 <property name="context_help"></property>
3406 <property name="enabled">1</property>
3407 <property name="extra_style"></property>
3408 <property name="fg"></property>
3409 <property name="font"></property>
3410 <property name="hidden">0</property>
3411 <property name="id">wxID_ANY</property>
3412 <property name="maximum_size"></property>
3413 <property name="minimum_size"></property>
3414 <property name="name">CSendingDialogBase</property>
3415 <property name="pos"></property>
3416 <property name="size">442,151</property>
3417 <property name="style">wxDEFAULT_DIALOG_STYLE</property>
3418 <property name="subclass"></property>
3419 <property name="title">Sending...</property>
3420 <property name="tooltip"></property>
3421 <property name="window_extra_style"></property>
3422 <property name="window_name"></property>
3423 <property name="window_style"></property>
3424 <event name="OnActivate"></event>
3425 <event name="OnActivateApp"></event>
3426 <event name="OnChar"></event>
3427 <event name="OnClose">OnClose</event>
3428 <event name="OnEnterWindow"></event>
3429 <event name="OnEraseBackground"></event>
3430 <event name="OnHibernate"></event>
3431 <event name="OnIconize"></event>
3432 <event name="OnIdle"></event>
3433 <event name="OnInitDialog"></event>
3434 <event name="OnKeyDown"></event>
3435 <event name="OnKeyUp"></event>
3436 <event name="OnKillFocus"></event>
3437 <event name="OnLeaveWindow"></event>
3438 <event name="OnLeftDClick"></event>
3439 <event name="OnLeftDown"></event>
3440 <event name="OnLeftUp"></event>
3441 <event name="OnMiddleDClick"></event>
3442 <event name="OnMiddleDown"></event>
3443 <event name="OnMiddleUp"></event>
3444 <event name="OnMotion"></event>
3445 <event name="OnMouseEvents"></event>
3446 <event name="OnMouseWheel"></event>
3447 <event name="OnPaint">OnPaint</event>
3448 <event name="OnRightDClick"></event>
3449 <event name="OnRightDown"></event>
3450 <event name="OnRightUp"></event>
3451 <event name="OnSetFocus"></event>
3452 <event name="OnSize"></event>
3453 <event name="OnUpdateUI"></event>
3454 <object class="wxBoxSizer" expanded="1">
3455 <property name="minimum_size"></property>
3456 <property name="name">bSizer68</property>
3457 <property name="orient">wxVERTICAL</property>
3458 <property name="permission">none</property>
3459 <object class="sizeritem" expanded="1">
3460 <property name="border">8</property>
3461 <property name="flag">wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT</property>
3462 <property name="proportion">0</property>
3463 <object class="wxStaticText" expanded="1">
3464 <property name="bg"></property>
3465 <property name="context_help"></property>
3466 <property name="enabled">1</property>
3467 <property name="fg"></property>
3468 <property name="font"></property>
3469 <property name="hidden">0</property>
3470 <property name="id">wxID_ANY</property>
3471 <property name="label"></property>
3472 <property name="maximum_size"></property>
3473 <property name="minimum_size"></property>
3474 <property name="name">m_staticTextSending</property>
3475 <property name="permission">protected</property>
3476 <property name="pos"></property>
3477 <property name="size">-1,14</property>
3478 <property name="style"></property>
3479 <property name="subclass"></property>
3480 <property name="tooltip"></property>
3481 <property name="window_extra_style"></property>
3482 <property name="window_name"></property>
3483 <property name="window_style"></property>
3484 <property name="wrap">-1</property>
3485 <event name="OnChar"></event>
3486 <event name="OnEnterWindow"></event>
3487 <event name="OnEraseBackground"></event>
3488 <event name="OnKeyDown"></event>
3489 <event name="OnKeyUp"></event>
3490 <event name="OnKillFocus"></event>
3491 <event name="OnLeaveWindow"></event>
3492 <event name="OnLeftDClick"></event>
3493 <event name="OnLeftDown"></event>
3494 <event name="OnLeftUp"></event>
3495 <event name="OnMiddleDClick"></event>
3496 <event name="OnMiddleDown"></event>
3497 <event name="OnMiddleUp"></event>
3498 <event name="OnMotion"></event>
3499 <event name="OnMouseEvents"></event>
3500 <event name="OnMouseWheel"></event>
3501 <event name="OnPaint"></event>
3502 <event name="OnRightDClick"></event>
3503 <event name="OnRightDown"></event>
3504 <event name="OnRightUp"></event>
3505 <event name="OnSetFocus"></event>
3506 <event name="OnSize"></event>
3507 <event name="OnUpdateUI"></event>
3508 </object>
3509 </object>
3510 <object class="sizeritem" expanded="1">
3511 <property name="border">10</property>
3512 <property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
3513 <property name="proportion">1</property>
3514 <object class="wxTextCtrl" expanded="1">
3515 <property name="bg">wxSYS_COLOUR_BTNFACE</property>
3516 <property name="context_help"></property>
3517 <property name="enabled">1</property>
3518 <property name="fg"></property>
3519 <property name="font"></property>
3520 <property name="hidden">0</property>
3521 <property name="id">wxID_ANY</property>
3522 <property name="maximum_size"></property>
3523 <property name="maxlength">0</property>
3524 <property name="minimum_size"></property>
3525 <property name="name">m_textCtrlStatus</property>
3526 <property name="permission">protected</property>
3527 <property name="pos"></property>
3528 <property name="size"></property>
3529 <property name="style">wxTE_CENTRE|wxTE_MULTILINE|wxTE_NO_VSCROLL|wxTE_READONLY</property>
3530 <property name="subclass"></property>
3531 <property name="tooltip"></property>
3532 <property name="value">&#x0A;&#x0A;Connecting...</property>
3533 <property name="window_extra_style"></property>
3534 <property name="window_name"></property>
3535 <property name="window_style">wxNO_BORDER</property>
3536 <event name="OnChar"></event>
3537 <event name="OnEnterWindow"></event>
3538 <event name="OnEraseBackground"></event>
3539 <event name="OnKeyDown"></event>
3540 <event name="OnKeyUp"></event>
3541 <event name="OnKillFocus"></event>
3542 <event name="OnLeaveWindow"></event>
3543 <event name="OnLeftDClick"></event>
3544 <event name="OnLeftDown"></event>
3545 <event name="OnLeftUp"></event>
3546 <event name="OnMiddleDClick"></event>
3547 <event name="OnMiddleDown"></event>
3548 <event name="OnMiddleUp"></event>
3549 <event name="OnMotion"></event>
3550 <event name="OnMouseEvents"></event>
3551 <event name="OnMouseWheel"></event>
3552 <event name="OnPaint"></event>
3553 <event name="OnRightDClick"></event>
3554 <event name="OnRightDown"></event>
3555 <event name="OnRightUp"></event>
3556 <event name="OnSetFocus"></event>
3557 <event name="OnSize"></event>
3558 <event name="OnText"></event>
3559 <event name="OnTextEnter"></event>
3560 <event name="OnTextMaxLen"></event>
3561 <event name="OnTextURL"></event>
3562 <event name="OnUpdateUI"></event>
3563 </object>
3564 </object>
3565 <object class="sizeritem" expanded="1">
3566 <property name="border">5</property>
3567 <property name="flag">wxEXPAND</property>
3568 <property name="proportion">0</property>
3569 <object class="wxBoxSizer" expanded="1">
3570 <property name="minimum_size"></property>
3571 <property name="name">bSizer69</property>
3572 <property name="orient">wxHORIZONTAL</property>
3573 <property name="permission">none</property>
3574 <object class="sizeritem" expanded="1">
3575 <property name="border">5</property>
3576 <property name="flag">wxEXPAND</property>
3577 <property name="proportion">1</property>
3578 <object class="spacer" expanded="1">
3579 <property name="height">0</property>
3580 <property name="permission">protected</property>
3581 <property name="width">0</property>
3582 </object>
3583 </object>
3584 <object class="sizeritem" expanded="1">
3585 <property name="border">5</property>
3586 <property name="flag">wxALL</property>
3587 <property name="proportion">0</property>
3588 <object class="wxButton" expanded="1">
3589 <property name="bg"></property>
3590 <property name="context_help"></property>
3591 <property name="default">0</property>
3592 <property name="enabled">0</property>
3593 <property name="fg"></property>
3594 <property name="font"></property>
3595 <property name="hidden">0</property>
3596 <property name="id">wxID_ANY</property>
3597 <property name="label">OK</property>
3598 <property name="maximum_size"></property>
3599 <property name="minimum_size">85,25</property>
3600 <property name="name">m_buttonOK</property>
3601 <property name="permission">protected</property>
3602 <property name="pos"></property>
3603 <property name="size"></property>
3604 <property name="style"></property>
3605 <property name="subclass"></property>
3606 <property name="tooltip"></property>
3607 <property name="window_extra_style"></property>
3608 <property name="window_name"></property>
3609 <property name="window_style"></property>
3610 <event name="OnButtonClick">OnButtonOK</event>
3611 <event name="OnChar"></event>
3612 <event name="OnEnterWindow"></event>
3613 <event name="OnEraseBackground"></event>
3614 <event name="OnKeyDown"></event>
3615 <event name="OnKeyUp"></event>
3616 <event name="OnKillFocus"></event>
3617 <event name="OnLeaveWindow"></event>
3618 <event name="OnLeftDClick"></event>
3619 <event name="OnLeftDown"></event>
3620 <event name="OnLeftUp"></event>
3621 <event name="OnMiddleDClick"></event>
3622 <event name="OnMiddleDown"></event>
3623 <event name="OnMiddleUp"></event>
3624 <event name="OnMotion"></event>
3625 <event name="OnMouseEvents"></event>
3626 <event name="OnMouseWheel"></event>
3627 <event name="OnPaint"></event>
3628 <event name="OnRightDClick"></event>
3629 <event name="OnRightDown"></event>
3630 <event name="OnRightUp"></event>
3631 <event name="OnSetFocus"></event>
3632 <event name="OnSize"></event>
3633 <event name="OnUpdateUI"></event>
3634 </object>
3635 </object>
3636 <object class="sizeritem" expanded="1">
3637 <property name="border">5</property>
3638 <property name="flag">wxALL</property>
3639 <property name="proportion">0</property>
3640 <object class="wxButton" expanded="1">
3641 <property name="bg"></property>
3642 <property name="context_help"></property>
3643 <property name="default">0</property>
3644 <property name="enabled">1</property>
3645 <property name="fg"></property>
3646 <property name="font"></property>
3647 <property name="hidden">0</property>
3648 <property name="id">wxID_CANCEL</property>
3649 <property name="label">Cancel</property>
3650 <property name="maximum_size"></property>
3651 <property name="minimum_size">85,25</property>
3652 <property name="name">m_buttonCancel</property>
3653 <property name="permission">protected</property>
3654 <property name="pos"></property>
3655 <property name="size">-1,-1</property>
3656 <property name="style"></property>
3657 <property name="subclass"></property>
3658 <property name="tooltip"></property>
3659 <property name="window_extra_style"></property>
3660 <property name="window_name"></property>
3661 <property name="window_style"></property>
3662 <event name="OnButtonClick">OnButtonCancel</event>
3663 <event name="OnChar"></event>
3664 <event name="OnEnterWindow"></event>
3665 <event name="OnEraseBackground"></event>
3666 <event name="OnKeyDown"></event>
3667 <event name="OnKeyUp"></event>
3668 <event name="OnKillFocus"></event>
3669 <event name="OnLeaveWindow"></event>
3670 <event name="OnLeftDClick"></event>
3671 <event name="OnLeftDown"></event>
3672 <event name="OnLeftUp"></event>
3673 <event name="OnMiddleDClick"></event>
3674 <event name="OnMiddleDown"></event>
3675 <event name="OnMiddleUp"></event>
3676 <event name="OnMotion"></event>
3677 <event name="OnMouseEvents"></event>
3678 <event name="OnMouseWheel"></event>
3679 <event name="OnPaint"></event>
3680 <event name="OnRightDClick"></event>
3681 <event name="OnRightDown"></event>
3682 <event name="OnRightUp"></event>
3683 <event name="OnSetFocus"></event>
3684 <event name="OnSize"></event>
3685 <event name="OnUpdateUI"></event>
3686 </object>
3687 </object>
3688 </object>
3689 </object>
3690 </object>
3691 </object>
3692 <object class="Dialog" expanded="0">
3693 <property name="bg"></property>
3694 <property name="center"></property>
3695 <property name="context_help"></property>
3696 <property name="enabled">1</property>
3697 <property name="extra_style"></property>
3698 <property name="fg"></property>
3699 <property name="font"></property>
3700 <property name="hidden">0</property>
3701 <property name="id">wxID_ANY</property>
3702 <property name="maximum_size"></property>
3703 <property name="minimum_size"></property>
3704 <property name="name">CYourAddressDialogBase</property>
3705 <property name="pos"></property>
3706 <property name="size">610,390</property>
3707 <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
3708 <property name="subclass"></property>
3709 <property name="title">Your Bitcoin Address</property>
3710 <property name="tooltip"></property>
3711 <property name="window_extra_style"></property>
3712 <property name="window_name"></property>
3713 <property name="window_style"></property>
3714 <event name="OnActivate"></event>
3715 <event name="OnActivateApp"></event>
3716 <event name="OnChar"></event>
3717 <event name="OnClose">OnClose</event>
3718 <event name="OnEnterWindow"></event>
3719 <event name="OnEraseBackground"></event>
3720 <event name="OnHibernate"></event>
3721 <event name="OnIconize"></event>
3722 <event name="OnIdle"></event>
3723 <event name="OnInitDialog"></event>
3724 <event name="OnKeyDown"></event>
3725 <event name="OnKeyUp"></event>
3726 <event name="OnKillFocus"></event>
3727 <event name="OnLeaveWindow"></event>
3728 <event name="OnLeftDClick"></event>
3729 <event name="OnLeftDown"></event>
3730 <event name="OnLeftUp"></event>
3731 <event name="OnMiddleDClick"></event>
3732 <event name="OnMiddleDown"></event>
3733 <event name="OnMiddleUp"></event>
3734 <event name="OnMotion"></event>
3735 <event name="OnMouseEvents"></event>
3736 <event name="OnMouseWheel"></event>
3737 <event name="OnPaint"></event>
3738 <event name="OnRightDClick"></event>
3739 <event name="OnRightDown"></event>
3740 <event name="OnRightUp"></event>
3741 <event name="OnSetFocus"></event>
3742 <event name="OnSize"></event>
3743 <event name="OnUpdateUI"></event>
3744 <object class="wxBoxSizer" expanded="1">
3745 <property name="minimum_size"></property>
3746 <property name="name">bSizer68</property>
3747 <property name="orient">wxVERTICAL</property>
3748 <property name="permission">none</property>
3749 <object class="sizeritem" expanded="1">
3750 <property name="border">5</property>
3751 <property name="flag">wxEXPAND</property>
3752 <property name="proportion">0</property>
3753 <object class="spacer" expanded="1">
3754 <property name="height">5</property>
3755 <property name="permission">protected</property>
3756 <property name="width">0</property>
3757 </object>
3758 </object>
3759 <object class="sizeritem" expanded="1">
3760 <property name="border">5</property>
3761 <property name="flag">wxALL</property>
3762 <property name="proportion">0</property>
3763 <object class="wxStaticText" expanded="1">
3764 <property name="bg"></property>
3765 <property name="context_help"></property>
3766 <property name="enabled">1</property>
3767 <property name="fg"></property>
3768 <property name="font"></property>
3769 <property name="hidden">0</property>
3770 <property name="id">wxID_ANY</property>
3771 <property name="label">These are your Bitcoin addresses for receiving payments.&#x0A;You may want to give a different one to each sender so you can keep track of who is paying you.</property>
3772 <property name="maximum_size"></property>
3773 <property name="minimum_size"></property>
3774 <property name="name">m_staticText45</property>
3775 <property name="permission">protected</property>
3776 <property name="pos"></property>
3777 <property name="size"></property>
3778 <property name="style"></property>
3779 <property name="subclass"></property>
3780 <property name="tooltip"></property>
3781 <property name="window_extra_style"></property>
3782 <property name="window_name"></property>
3783 <property name="window_style"></property>
3784 <property name="wrap">600</property>
3785 <event name="OnChar"></event>
3786 <event name="OnEnterWindow"></event>
3787 <event name="OnEraseBackground"></event>
3788 <event name="OnKeyDown"></event>
3789 <event name="OnKeyUp"></event>
3790 <event name="OnKillFocus"></event>
3791 <event name="OnLeaveWindow"></event>
3792 <event name="OnLeftDClick"></event>
3793 <event name="OnLeftDown"></event>
3794 <event name="OnLeftUp"></event>
3795 <event name="OnMiddleDClick"></event>
3796 <event name="OnMiddleDown"></event>
3797 <event name="OnMiddleUp"></event>
3798 <event name="OnMotion"></event>
3799 <event name="OnMouseEvents"></event>
3800 <event name="OnMouseWheel"></event>
3801 <event name="OnPaint"></event>
3802 <event name="OnRightDClick"></event>
3803 <event name="OnRightDown"></event>
3804 <event name="OnRightUp"></event>
3805 <event name="OnSetFocus"></event>
3806 <event name="OnSize"></event>
3807 <event name="OnUpdateUI"></event>
3808 </object>
3809 </object>
3810 <object class="sizeritem" expanded="1">
3811 <property name="border">5</property>
3812 <property name="flag">wxALL|wxEXPAND</property>
3813 <property name="proportion">1</property>
3814 <object class="wxListCtrl" expanded="1">
3815 <property name="bg"></property>
3816 <property name="context_help"></property>
3817 <property name="enabled">1</property>
3818 <property name="fg"></property>
3819 <property name="font"></property>
3820 <property name="hidden">0</property>
3821 <property name="id">wxID_LISTCTRL</property>
3822 <property name="maximum_size"></property>
3823 <property name="minimum_size"></property>
3824 <property name="name">m_listCtrl</property>
3825 <property name="permission">protected</property>
3826 <property name="pos"></property>
3827 <property name="size"></property>
3828 <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_ASCENDING</property>
3829 <property name="subclass"></property>
3830 <property name="tooltip"></property>
3831 <property name="window_extra_style"></property>
3832 <property name="window_name"></property>
3833 <property name="window_style"></property>
3834 <event name="OnChar"></event>
3835 <event name="OnEnterWindow"></event>
3836 <event name="OnEraseBackground"></event>
3837 <event name="OnKeyDown"></event>
3838 <event name="OnKeyUp"></event>
3839 <event name="OnKillFocus"></event>
3840 <event name="OnLeaveWindow"></event>
3841 <event name="OnLeftDClick"></event>
3842 <event name="OnLeftDown"></event>
3843 <event name="OnLeftUp"></event>
3844 <event name="OnListBeginDrag"></event>
3845 <event name="OnListBeginLabelEdit"></event>
3846 <event name="OnListBeginRDrag"></event>
3847 <event name="OnListCacheHint"></event>
3848 <event name="OnListColBeginDrag"></event>
3849 <event name="OnListColClick"></event>
3850 <event name="OnListColDragging"></event>
3851 <event name="OnListColEndDrag"></event>
3852 <event name="OnListColRightClick"></event>
3853 <event name="OnListDeleteAllItems"></event>
3854 <event name="OnListDeleteItem"></event>
3855 <event name="OnListEndLabelEdit">OnListEndLabelEdit</event>
3856 <event name="OnListInsertItem"></event>
3857 <event name="OnListItemActivated">OnListItemActivated</event>
3858 <event name="OnListItemDeselected"></event>
3859 <event name="OnListItemFocused"></event>
3860 <event name="OnListItemMiddleClick"></event>
3861 <event name="OnListItemRightClick"></event>
3862 <event name="OnListItemSelected">OnListItemSelected</event>
3863 <event name="OnListKeyDown"></event>
3864 <event name="OnMiddleDClick"></event>
3865 <event name="OnMiddleDown"></event>
3866 <event name="OnMiddleUp"></event>
3867 <event name="OnMotion"></event>
3868 <event name="OnMouseEvents"></event>
3869 <event name="OnMouseWheel"></event>
3870 <event name="OnPaint"></event>
3871 <event name="OnRightDClick"></event>
3872 <event name="OnRightDown"></event>
3873 <event name="OnRightUp"></event>
3874 <event name="OnSetFocus"></event>
3875 <event name="OnSize"></event>
3876 <event name="OnUpdateUI"></event>
3877 </object>
3878 </object>
3879 <object class="sizeritem" expanded="1">
3880 <property name="border">5</property>
3881 <property name="flag">wxEXPAND</property>
3882 <property name="proportion">0</property>
3883 <object class="wxBoxSizer" expanded="1">
3884 <property name="minimum_size"></property>
3885 <property name="name">bSizer69</property>
3886 <property name="orient">wxHORIZONTAL</property>
3887 <property name="permission">none</property>
3888 <object class="sizeritem" expanded="1">
3889 <property name="border">5</property>
3890 <property name="flag">wxEXPAND</property>
3891 <property name="proportion">1</property>
3892 <object class="spacer" expanded="1">
3893 <property name="height">0</property>
3894 <property name="permission">protected</property>
3895 <property name="width">0</property>
3896 </object>
3897 </object>
3898 <object class="sizeritem" expanded="1">
3899 <property name="border">5</property>
3900 <property name="flag">wxALL</property>
3901 <property name="proportion">0</property>
3902 <object class="wxButton" expanded="1">
3903 <property name="bg"></property>
3904 <property name="context_help"></property>
3905 <property name="default">0</property>
3906 <property name="enabled">1</property>
3907 <property name="fg"></property>
3908 <property name="font"></property>
3909 <property name="hidden">0</property>
3910 <property name="id">wxID_BUTTONRENAME</property>
3911 <property name="label">&amp;Rename...</property>
3912 <property name="maximum_size"></property>
3913 <property name="minimum_size">85,25</property>
3914 <property name="name">m_buttonRename</property>
3915 <property name="permission">protected</property>
3916 <property name="pos"></property>
3917 <property name="size"></property>
3918 <property name="style"></property>
3919 <property name="subclass"></property>
3920 <property name="tooltip"></property>
3921 <property name="window_extra_style"></property>
3922 <property name="window_name"></property>
3923 <property name="window_style"></property>
3924 <event name="OnButtonClick">OnButtonRename</event>
3925 <event name="OnChar"></event>
3926 <event name="OnEnterWindow"></event>
3927 <event name="OnEraseBackground"></event>
3928 <event name="OnKeyDown"></event>
3929 <event name="OnKeyUp"></event>
3930 <event name="OnKillFocus"></event>
3931 <event name="OnLeaveWindow"></event>
3932 <event name="OnLeftDClick"></event>
3933 <event name="OnLeftDown"></event>
3934 <event name="OnLeftUp"></event>
3935 <event name="OnMiddleDClick"></event>
3936 <event name="OnMiddleDown"></event>
3937 <event name="OnMiddleUp"></event>
3938 <event name="OnMotion"></event>
3939 <event name="OnMouseEvents"></event>
3940 <event name="OnMouseWheel"></event>
3941 <event name="OnPaint"></event>
3942 <event name="OnRightDClick"></event>
3943 <event name="OnRightDown"></event>
3944 <event name="OnRightUp"></event>
3945 <event name="OnSetFocus"></event>
3946 <event name="OnSize"></event>
3947 <event name="OnUpdateUI"></event>
3948 </object>
3949 </object>
3950 <object class="sizeritem" expanded="1">
3951 <property name="border">5</property>
3952 <property name="flag">wxALL</property>
3953 <property name="proportion">0</property>
3954 <object class="wxButton" expanded="1">
3955 <property name="bg"></property>
3956 <property name="context_help"></property>
3957 <property name="default">0</property>
3958 <property name="enabled">1</property>
3959 <property name="fg"></property>
3960 <property name="font"></property>
3961 <property name="hidden">0</property>
3962 <property name="id">wxID_BUTTONNEW</property>
3963 <property name="label">&amp;New Address...</property>
3964 <property name="maximum_size"></property>
3965 <property name="minimum_size">110,25</property>
3966 <property name="name">m_buttonNew</property>
3967 <property name="permission">protected</property>
3968 <property name="pos"></property>
3969 <property name="size">-1,-1</property>
3970 <property name="style"></property>
3971 <property name="subclass"></property>
3972 <property name="tooltip"></property>
3973 <property name="window_extra_style"></property>
3974 <property name="window_name"></property>
3975 <property name="window_style"></property>
3976 <event name="OnButtonClick">OnButtonNew</event>
3977 <event name="OnChar"></event>
3978 <event name="OnEnterWindow"></event>
3979 <event name="OnEraseBackground"></event>
3980 <event name="OnKeyDown"></event>
3981 <event name="OnKeyUp"></event>
3982 <event name="OnKillFocus"></event>
3983 <event name="OnLeaveWindow"></event>
3984 <event name="OnLeftDClick"></event>
3985 <event name="OnLeftDown"></event>
3986 <event name="OnLeftUp"></event>
3987 <event name="OnMiddleDClick"></event>
3988 <event name="OnMiddleDown"></event>
3989 <event name="OnMiddleUp"></event>
3990 <event name="OnMotion"></event>
3991 <event name="OnMouseEvents"></event>
3992 <event name="OnMouseWheel"></event>
3993 <event name="OnPaint"></event>
3994 <event name="OnRightDClick"></event>
3995 <event name="OnRightDown"></event>
3996 <event name="OnRightUp"></event>
3997 <event name="OnSetFocus"></event>
3998 <event name="OnSize"></event>
3999 <event name="OnUpdateUI"></event>
4000 </object>
4001 </object>
4002 <object class="sizeritem" expanded="1">
4003 <property name="border">5</property>
4004 <property name="flag">wxALL</property>
4005 <property name="proportion">0</property>
4006 <object class="wxButton" expanded="1">
4007 <property name="bg"></property>
4008 <property name="context_help"></property>
4009 <property name="default">0</property>
4010 <property name="enabled">1</property>
4011 <property name="fg"></property>
4012 <property name="font"></property>
4013 <property name="hidden">0</property>
4014 <property name="id">wxID_BUTTONCOPY</property>
4015 <property name="label">&amp;Copy to Clipboard</property>
4016 <property name="maximum_size"></property>
4017 <property name="minimum_size">120,25</property>
4018 <property name="name">m_buttonCopy</property>
4019 <property name="permission">protected</property>
4020 <property name="pos"></property>
4021 <property name="size">-1,-1</property>
4022 <property name="style"></property>
4023 <property name="subclass"></property>
4024 <property name="tooltip"></property>
4025 <property name="window_extra_style"></property>
4026 <property name="window_name"></property>
4027 <property name="window_style"></property>
4028 <event name="OnButtonClick">OnButtonCopy</event>
4029 <event name="OnChar"></event>
4030 <event name="OnEnterWindow"></event>
4031 <event name="OnEraseBackground"></event>
4032 <event name="OnKeyDown"></event>
4033 <event name="OnKeyUp"></event>
4034 <event name="OnKillFocus"></event>
4035 <event name="OnLeaveWindow"></event>
4036 <event name="OnLeftDClick"></event>
4037 <event name="OnLeftDown"></event>
4038 <event name="OnLeftUp"></event>
4039 <event name="OnMiddleDClick"></event>
4040 <event name="OnMiddleDown"></event>
4041 <event name="OnMiddleUp"></event>
4042 <event name="OnMotion"></event>
4043 <event name="OnMouseEvents"></event>
4044 <event name="OnMouseWheel"></event>
4045 <event name="OnPaint"></event>
4046 <event name="OnRightDClick"></event>
4047 <event name="OnRightDown"></event>
4048 <event name="OnRightUp"></event>
4049 <event name="OnSetFocus"></event>
4050 <event name="OnSize"></event>
4051 <event name="OnUpdateUI"></event>
4052 </object>
4053 </object>
4054 <object class="sizeritem" expanded="1">
4055 <property name="border">5</property>
4056 <property name="flag">wxALL</property>
4057 <property name="proportion">0</property>
4058 <object class="wxButton" expanded="1">
4059 <property name="bg"></property>
4060 <property name="context_help"></property>
4061 <property name="default">0</property>
4062 <property name="enabled">1</property>
4063 <property name="fg"></property>
4064 <property name="font"></property>
4065 <property name="hidden">0</property>
4066 <property name="id">wxID_OK</property>
4067 <property name="label">OK</property>
4068 <property name="maximum_size"></property>
4069 <property name="minimum_size">85,25</property>
4070 <property name="name">m_buttonOK</property>
4071 <property name="permission">protected</property>
4072 <property name="pos"></property>
4073 <property name="size"></property>
4074 <property name="style"></property>
4075 <property name="subclass"></property>
4076 <property name="tooltip"></property>
4077 <property name="window_extra_style"></property>
4078 <property name="window_name"></property>
4079 <property name="window_style"></property>
4080 <event name="OnButtonClick">OnButtonOK</event>
4081 <event name="OnChar"></event>
4082 <event name="OnEnterWindow"></event>
4083 <event name="OnEraseBackground"></event>
4084 <event name="OnKeyDown"></event>
4085 <event name="OnKeyUp"></event>
4086 <event name="OnKillFocus"></event>
4087 <event name="OnLeaveWindow"></event>
4088 <event name="OnLeftDClick"></event>
4089 <event name="OnLeftDown"></event>
4090 <event name="OnLeftUp"></event>
4091 <event name="OnMiddleDClick"></event>
4092 <event name="OnMiddleDown"></event>
4093 <event name="OnMiddleUp"></event>
4094 <event name="OnMotion"></event>
4095 <event name="OnMouseEvents"></event>
4096 <event name="OnMouseWheel"></event>
4097 <event name="OnPaint"></event>
4098 <event name="OnRightDClick"></event>
4099 <event name="OnRightDown"></event>
4100 <event name="OnRightUp"></event>
4101 <event name="OnSetFocus"></event>
4102 <event name="OnSize"></event>
4103 <event name="OnUpdateUI"></event>
4104 </object>
4105 </object>
4106 <object class="sizeritem" expanded="1">
4107 <property name="border">5</property>
4108 <property name="flag">wxALL</property>
4109 <property name="proportion">0</property>
4110 <object class="wxButton" expanded="1">
4111 <property name="bg"></property>
4112 <property name="context_help"></property>
4113 <property name="default">0</property>
4114 <property name="enabled">1</property>
4115 <property name="fg"></property>
4116 <property name="font"></property>
4117 <property name="hidden">0</property>
4118 <property name="id">wxID_CANCEL</property>
4119 <property name="label">Cancel</property>
4120 <property name="maximum_size"></property>
4121 <property name="minimum_size">85,25</property>
4122 <property name="name">m_buttonCancel</property>
4123 <property name="permission">protected</property>
4124 <property name="pos"></property>
4125 <property name="size">-1,-1</property>
4126 <property name="style"></property>
4127 <property name="subclass"></property>
4128 <property name="tooltip"></property>
4129 <property name="window_extra_style"></property>
4130 <property name="window_name"></property>
4131 <property name="window_style"></property>
4132 <event name="OnButtonClick">OnButtonCancel</event>
4133 <event name="OnChar"></event>
4134 <event name="OnEnterWindow"></event>
4135 <event name="OnEraseBackground"></event>
4136 <event name="OnKeyDown"></event>
4137 <event name="OnKeyUp"></event>
4138 <event name="OnKillFocus"></event>
4139 <event name="OnLeaveWindow"></event>
4140 <event name="OnLeftDClick"></event>
4141 <event name="OnLeftDown"></event>
4142 <event name="OnLeftUp"></event>
4143 <event name="OnMiddleDClick"></event>
4144 <event name="OnMiddleDown"></event>
4145 <event name="OnMiddleUp"></event>
4146 <event name="OnMotion"></event>
4147 <event name="OnMouseEvents"></event>
4148 <event name="OnMouseWheel"></event>
4149 <event name="OnPaint"></event>
4150 <event name="OnRightDClick"></event>
4151 <event name="OnRightDown"></event>
4152 <event name="OnRightUp"></event>
4153 <event name="OnSetFocus"></event>
4154 <event name="OnSize"></event>
4155 <event name="OnUpdateUI"></event>
4156 </object>
4157 </object>
4158 </object>
4159 </object>
4160 </object>
4161 </object>
4162 <object class="Dialog" expanded="0">
4163 <property name="bg"></property>
4164 <property name="center"></property>
4165 <property name="context_help"></property>
4166 <property name="enabled">1</property>
4167 <property name="extra_style"></property>
4168 <property name="fg"></property>
4169 <property name="font"></property>
4170 <property name="hidden">0</property>
4171 <property name="id">wxID_ANY</property>
4172 <property name="maximum_size"></property>
4173 <property name="minimum_size"></property>
4174 <property name="name">CAddressBookDialogBase</property>
4175 <property name="pos"></property>
4176 <property name="size">610,390</property>
4177 <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
4178 <property name="subclass"></property>
4179 <property name="title">Address Book</property>
4180 <property name="tooltip"></property>
4181 <property name="window_extra_style"></property>
4182 <property name="window_name"></property>
4183 <property name="window_style"></property>
4184 <event name="OnActivate"></event>
4185 <event name="OnActivateApp"></event>
4186 <event name="OnChar"></event>
4187 <event name="OnClose">OnClose</event>
4188 <event name="OnEnterWindow"></event>
4189 <event name="OnEraseBackground"></event>
4190 <event name="OnHibernate"></event>
4191 <event name="OnIconize"></event>
4192 <event name="OnIdle"></event>
4193 <event name="OnInitDialog"></event>
4194 <event name="OnKeyDown"></event>
4195 <event name="OnKeyUp"></event>
4196 <event name="OnKillFocus"></event>
4197 <event name="OnLeaveWindow"></event>
4198 <event name="OnLeftDClick"></event>
4199 <event name="OnLeftDown"></event>
4200 <event name="OnLeftUp"></event>
4201 <event name="OnMiddleDClick"></event>
4202 <event name="OnMiddleDown"></event>
4203 <event name="OnMiddleUp"></event>
4204 <event name="OnMotion"></event>
4205 <event name="OnMouseEvents"></event>
4206 <event name="OnMouseWheel"></event>
4207 <event name="OnPaint"></event>
4208 <event name="OnRightDClick"></event>
4209 <event name="OnRightDown"></event>
4210 <event name="OnRightUp"></event>
4211 <event name="OnSetFocus"></event>
4212 <event name="OnSize"></event>
4213 <event name="OnUpdateUI"></event>
4214 <object class="wxBoxSizer" expanded="1">
4215 <property name="minimum_size"></property>
4216 <property name="name">bSizer68</property>
4217 <property name="orient">wxVERTICAL</property>
4218 <property name="permission">none</property>
4219 <object class="sizeritem" expanded="1">
4220 <property name="border">5</property>
4221 <property name="flag">wxEXPAND</property>
4222 <property name="proportion">0</property>
4223 <object class="spacer" expanded="1">
4224 <property name="height">5</property>
4225 <property name="permission">protected</property>
4226 <property name="width">0</property>
4227 </object>
4228 </object>
4229 <object class="sizeritem" expanded="1">
4230 <property name="border">5</property>
4231 <property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
4232 <property name="proportion">0</property>
4233 <object class="wxStaticText" expanded="1">
4234 <property name="bg"></property>
4235 <property name="context_help"></property>
4236 <property name="enabled">1</property>
4237 <property name="fg"></property>
4238 <property name="font"></property>
4239 <property name="hidden">1</property>
4240 <property name="id">wxID_ANY</property>
4241 <property name="label">Bitcoin Address</property>
4242 <property name="maximum_size"></property>
4243 <property name="minimum_size"></property>
4244 <property name="name">m_staticText55</property>
4245 <property name="permission">protected</property>
4246 <property name="pos"></property>
4247 <property name="size"></property>
4248 <property name="style"></property>
4249 <property name="subclass"></property>
4250 <property name="tooltip"></property>
4251 <property name="window_extra_style"></property>
4252 <property name="window_name"></property>
4253 <property name="window_style"></property>
4254 <property name="wrap">-1</property>
4255 <event name="OnChar"></event>
4256 <event name="OnEnterWindow"></event>
4257 <event name="OnEraseBackground"></event>
4258 <event name="OnKeyDown"></event>
4259 <event name="OnKeyUp"></event>
4260 <event name="OnKillFocus"></event>
4261 <event name="OnLeaveWindow"></event>
4262 <event name="OnLeftDClick"></event>
4263 <event name="OnLeftDown"></event>
4264 <event name="OnLeftUp"></event>
4265 <event name="OnMiddleDClick"></event>
4266 <event name="OnMiddleDown"></event>
4267 <event name="OnMiddleUp"></event>
4268 <event name="OnMotion"></event>
4269 <event name="OnMouseEvents"></event>
4270 <event name="OnMouseWheel"></event>
4271 <event name="OnPaint"></event>
4272 <event name="OnRightDClick"></event>
4273 <event name="OnRightDown"></event>
4274 <event name="OnRightUp"></event>
4275 <event name="OnSetFocus"></event>
4276 <event name="OnSize"></event>
4277 <event name="OnUpdateUI"></event>
4278 </object>
4279 </object>
4280 <object class="sizeritem" expanded="1">
4281 <property name="border">5</property>
4282 <property name="flag">wxALL|wxEXPAND</property>
4283 <property name="proportion">1</property>
4284 <object class="wxListCtrl" expanded="1">
4285 <property name="bg"></property>
4286 <property name="context_help"></property>
4287 <property name="enabled">1</property>
4288 <property name="fg"></property>
4289 <property name="font"></property>
4290 <property name="hidden">0</property>
4291 <property name="id">wxID_LISTCTRL</property>
4292 <property name="maximum_size"></property>
4293 <property name="minimum_size"></property>
4294 <property name="name">m_listCtrl</property>
4295 <property name="permission">protected</property>
4296 <property name="pos"></property>
4297 <property name="size"></property>
4298 <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_ASCENDING</property>
4299 <property name="subclass"></property>
4300 <property name="tooltip"></property>
4301 <property name="window_extra_style"></property>
4302 <property name="window_name"></property>
4303 <property name="window_style"></property>
4304 <event name="OnChar"></event>
4305 <event name="OnEnterWindow"></event>
4306 <event name="OnEraseBackground"></event>
4307 <event name="OnKeyDown"></event>
4308 <event name="OnKeyUp"></event>
4309 <event name="OnKillFocus"></event>
4310 <event name="OnLeaveWindow"></event>
4311 <event name="OnLeftDClick"></event>
4312 <event name="OnLeftDown"></event>
4313 <event name="OnLeftUp"></event>
4314 <event name="OnListBeginDrag"></event>
4315 <event name="OnListBeginLabelEdit"></event>
4316 <event name="OnListBeginRDrag"></event>
4317 <event name="OnListCacheHint"></event>
4318 <event name="OnListColBeginDrag"></event>
4319 <event name="OnListColClick"></event>
4320 <event name="OnListColDragging"></event>
4321 <event name="OnListColEndDrag"></event>
4322 <event name="OnListColRightClick"></event>
4323 <event name="OnListDeleteAllItems"></event>
4324 <event name="OnListDeleteItem"></event>
4325 <event name="OnListEndLabelEdit">OnListEndLabelEdit</event>
4326 <event name="OnListInsertItem"></event>
4327 <event name="OnListItemActivated">OnListItemActivated</event>
4328 <event name="OnListItemDeselected"></event>
4329 <event name="OnListItemFocused"></event>
4330 <event name="OnListItemMiddleClick"></event>
4331 <event name="OnListItemRightClick"></event>
4332 <event name="OnListItemSelected">OnListItemSelected</event>
4333 <event name="OnListKeyDown"></event>
4334 <event name="OnMiddleDClick"></event>
4335 <event name="OnMiddleDown"></event>
4336 <event name="OnMiddleUp"></event>
4337 <event name="OnMotion"></event>
4338 <event name="OnMouseEvents"></event>
4339 <event name="OnMouseWheel"></event>
4340 <event name="OnPaint"></event>
4341 <event name="OnRightDClick"></event>
4342 <event name="OnRightDown"></event>
4343 <event name="OnRightUp"></event>
4344 <event name="OnSetFocus"></event>
4345 <event name="OnSize"></event>
4346 <event name="OnUpdateUI"></event>
4347 </object>
4348 </object>
4349 <object class="sizeritem" expanded="1">
4350 <property name="border">5</property>
4351 <property name="flag">wxEXPAND</property>
4352 <property name="proportion">0</property>
4353 <object class="wxBoxSizer" expanded="1">
4354 <property name="minimum_size"></property>
4355 <property name="name">bSizer69</property>
4356 <property name="orient">wxHORIZONTAL</property>
4357 <property name="permission">none</property>
4358 <object class="sizeritem" expanded="1">
4359 <property name="border">5</property>
4360 <property name="flag">wxEXPAND</property>
4361 <property name="proportion">1</property>
4362 <object class="spacer" expanded="1">
4363 <property name="height">0</property>
4364 <property name="permission">protected</property>
4365 <property name="width">0</property>
4366 </object>
4367 </object>
4368 <object class="sizeritem" expanded="1">
4369 <property name="border">5</property>
4370 <property name="flag">wxALL</property>
4371 <property name="proportion">0</property>
4372 <object class="wxButton" expanded="1">
4373 <property name="bg"></property>
4374 <property name="context_help"></property>
4375 <property name="default">0</property>
4376 <property name="enabled">1</property>
4377 <property name="fg"></property>
4378 <property name="font"></property>
4379 <property name="hidden">0</property>
4380 <property name="id">wxID_BUTTONEDIT</property>
4381 <property name="label">&amp;Edit...</property>
4382 <property name="maximum_size"></property>
4383 <property name="minimum_size">85,25</property>
4384 <property name="name">m_buttonEdit</property>
4385 <property name="permission">protected</property>
4386 <property name="pos"></property>
4387 <property name="size"></property>
4388 <property name="style"></property>
4389 <property name="subclass"></property>
4390 <property name="tooltip"></property>
4391 <property name="window_extra_style"></property>
4392 <property name="window_name"></property>
4393 <property name="window_style"></property>
4394 <event name="OnButtonClick">OnButtonEdit</event>
4395 <event name="OnChar"></event>
4396 <event name="OnEnterWindow"></event>
4397 <event name="OnEraseBackground"></event>
4398 <event name="OnKeyDown"></event>
4399 <event name="OnKeyUp"></event>
4400 <event name="OnKillFocus"></event>
4401 <event name="OnLeaveWindow"></event>
4402 <event name="OnLeftDClick"></event>
4403 <event name="OnLeftDown"></event>
4404 <event name="OnLeftUp"></event>
4405 <event name="OnMiddleDClick"></event>
4406 <event name="OnMiddleDown"></event>
4407 <event name="OnMiddleUp"></event>
4408 <event name="OnMotion"></event>
4409 <event name="OnMouseEvents"></event>
4410 <event name="OnMouseWheel"></event>
4411 <event name="OnPaint"></event>
4412 <event name="OnRightDClick"></event>
4413 <event name="OnRightDown"></event>
4414 <event name="OnRightUp"></event>
4415 <event name="OnSetFocus"></event>
4416 <event name="OnSize"></event>
4417 <event name="OnUpdateUI"></event>
4418 </object>
4419 </object>
4420 <object class="sizeritem" expanded="1">
4421 <property name="border">5</property>
4422 <property name="flag">wxALL</property>
4423 <property name="proportion">0</property>
4424 <object class="wxButton" expanded="1">
4425 <property name="bg"></property>
4426 <property name="context_help"></property>
4427 <property name="default">0</property>
4428 <property name="enabled">1</property>
4429 <property name="fg"></property>
4430 <property name="font"></property>
4431 <property name="hidden">0</property>
4432 <property name="id">wxID_BUTTONNEW</property>
4433 <property name="label">&amp;New Address...</property>
4434 <property name="maximum_size"></property>
4435 <property name="minimum_size">110,25</property>
4436 <property name="name">m_buttonNew</property>
4437 <property name="permission">protected</property>
4438 <property name="pos"></property>
4439 <property name="size"></property>
4440 <property name="style"></property>
4441 <property name="subclass"></property>
4442 <property name="tooltip"></property>
4443 <property name="window_extra_style"></property>
4444 <property name="window_name"></property>
4445 <property name="window_style"></property>
4446 <event name="OnButtonClick">OnButtonNew</event>
4447 <event name="OnChar"></event>
4448 <event name="OnEnterWindow"></event>
4449 <event name="OnEraseBackground"></event>
4450 <event name="OnKeyDown"></event>
4451 <event name="OnKeyUp"></event>
4452 <event name="OnKillFocus"></event>
4453 <event name="OnLeaveWindow"></event>
4454 <event name="OnLeftDClick"></event>
4455 <event name="OnLeftDown"></event>
4456 <event name="OnLeftUp"></event>
4457 <event name="OnMiddleDClick"></event>
4458 <event name="OnMiddleDown"></event>
4459 <event name="OnMiddleUp"></event>
4460 <event name="OnMotion"></event>
4461 <event name="OnMouseEvents"></event>
4462 <event name="OnMouseWheel"></event>
4463 <event name="OnPaint"></event>
4464 <event name="OnRightDClick"></event>
4465 <event name="OnRightDown"></event>
4466 <event name="OnRightUp"></event>
4467 <event name="OnSetFocus"></event>
4468 <event name="OnSize"></event>
4469 <event name="OnUpdateUI"></event>
4470 </object>
4471 </object>
4472 <object class="sizeritem" expanded="1">
4473 <property name="border">5</property>
4474 <property name="flag">wxALL</property>
4475 <property name="proportion">0</property>
4476 <object class="wxButton" expanded="1">
4477 <property name="bg"></property>
4478 <property name="context_help"></property>
4479 <property name="default">0</property>
4480 <property name="enabled">1</property>
4481 <property name="fg"></property>
4482 <property name="font"></property>
4483 <property name="hidden">0</property>
4484 <property name="id">wxID_BUTTONDELETE</property>
4485 <property name="label">&amp;Delete</property>
4486 <property name="maximum_size"></property>
4487 <property name="minimum_size">85,25</property>
4488 <property name="name">m_buttonDelete</property>
4489 <property name="permission">protected</property>
4490 <property name="pos"></property>
4491 <property name="size"></property>
4492 <property name="style"></property>
4493 <property name="subclass"></property>
4494 <property name="tooltip"></property>
4495 <property name="window_extra_style"></property>
4496 <property name="window_name"></property>
4497 <property name="window_style"></property>
4498 <event name="OnButtonClick">OnButtonDelete</event>
4499 <event name="OnChar"></event>
4500 <event name="OnEnterWindow"></event>
4501 <event name="OnEraseBackground"></event>
4502 <event name="OnKeyDown"></event>
4503 <event name="OnKeyUp"></event>
4504 <event name="OnKillFocus"></event>
4505 <event name="OnLeaveWindow"></event>
4506 <event name="OnLeftDClick"></event>
4507 <event name="OnLeftDown"></event>
4508 <event name="OnLeftUp"></event>
4509 <event name="OnMiddleDClick"></event>
4510 <event name="OnMiddleDown"></event>
4511 <event name="OnMiddleUp"></event>
4512 <event name="OnMotion"></event>
4513 <event name="OnMouseEvents"></event>
4514 <event name="OnMouseWheel"></event>
4515 <event name="OnPaint"></event>
4516 <event name="OnRightDClick"></event>
4517 <event name="OnRightDown"></event>
4518 <event name="OnRightUp"></event>
4519 <event name="OnSetFocus"></event>
4520 <event name="OnSize"></event>
4521 <event name="OnUpdateUI"></event>
4522 </object>
4523 </object>
4524 <object class="sizeritem" expanded="1">
4525 <property name="border">5</property>
4526 <property name="flag">wxALL</property>
4527 <property name="proportion">0</property>
4528 <object class="wxButton" expanded="1">
4529 <property name="bg"></property>
4530 <property name="context_help"></property>
4531 <property name="default">0</property>
4532 <property name="enabled">1</property>
4533 <property name="fg"></property>
4534 <property name="font"></property>
4535 <property name="hidden">0</property>
4536 <property name="id">wxID_OK</property>
4537 <property name="label">OK</property>
4538 <property name="maximum_size"></property>
4539 <property name="minimum_size">85,25</property>
4540 <property name="name">m_buttonOK</property>
4541 <property name="permission">protected</property>
4542 <property name="pos"></property>
4543 <property name="size">-1,-1</property>
4544 <property name="style"></property>
4545 <property name="subclass"></property>
4546 <property name="tooltip"></property>
4547 <property name="window_extra_style"></property>
4548 <property name="window_name"></property>
4549 <property name="window_style"></property>
4550 <event name="OnButtonClick">OnButtonOK</event>
4551 <event name="OnChar"></event>
4552 <event name="OnEnterWindow"></event>
4553 <event name="OnEraseBackground"></event>
4554 <event name="OnKeyDown"></event>
4555 <event name="OnKeyUp"></event>
4556 <event name="OnKillFocus"></event>
4557 <event name="OnLeaveWindow"></event>
4558 <event name="OnLeftDClick"></event>
4559 <event name="OnLeftDown"></event>
4560 <event name="OnLeftUp"></event>
4561 <event name="OnMiddleDClick"></event>
4562 <event name="OnMiddleDown"></event>
4563 <event name="OnMiddleUp"></event>
4564 <event name="OnMotion"></event>
4565 <event name="OnMouseEvents"></event>
4566 <event name="OnMouseWheel"></event>
4567 <event name="OnPaint"></event>
4568 <event name="OnRightDClick"></event>
4569 <event name="OnRightDown"></event>
4570 <event name="OnRightUp"></event>
4571 <event name="OnSetFocus"></event>
4572 <event name="OnSize"></event>
4573 <event name="OnUpdateUI"></event>
4574 </object>
4575 </object>
4576 <object class="sizeritem" expanded="1">
4577 <property name="border">5</property>
4578 <property name="flag">wxALL</property>
4579 <property name="proportion">0</property>
4580 <object class="wxButton" expanded="1">
4581 <property name="bg"></property>
4582 <property name="context_help"></property>
4583 <property name="default">0</property>
4584 <property name="enabled">1</property>
4585 <property name="fg"></property>
4586 <property name="font"></property>
4587 <property name="hidden">0</property>
4588 <property name="id">wxID_CANCEL</property>
4589 <property name="label">Cancel</property>
4590 <property name="maximum_size"></property>
4591 <property name="minimum_size">85,25</property>
4592 <property name="name">m_buttonCancel</property>
4593 <property name="permission">public</property>
4594 <property name="pos"></property>
4595 <property name="size">-1,-1</property>
4596 <property name="style"></property>
4597 <property name="subclass"></property>
4598 <property name="tooltip"></property>
4599 <property name="window_extra_style"></property>
4600 <property name="window_name"></property>
4601 <property name="window_style"></property>
4602 <event name="OnButtonClick">OnButtonCancel</event>
4603 <event name="OnChar"></event>
4604 <event name="OnEnterWindow"></event>
4605 <event name="OnEraseBackground"></event>
4606 <event name="OnKeyDown"></event>
4607 <event name="OnKeyUp"></event>
4608 <event name="OnKillFocus"></event>
4609 <event name="OnLeaveWindow"></event>
4610 <event name="OnLeftDClick"></event>
4611 <event name="OnLeftDown"></event>
4612 <event name="OnLeftUp"></event>
4613 <event name="OnMiddleDClick"></event>
4614 <event name="OnMiddleDown"></event>
4615 <event name="OnMiddleUp"></event>
4616 <event name="OnMotion"></event>
4617 <event name="OnMouseEvents"></event>
4618 <event name="OnMouseWheel"></event>
4619 <event name="OnPaint"></event>
4620 <event name="OnRightDClick"></event>
4621 <event name="OnRightDown"></event>
4622 <event name="OnRightUp"></event>
4623 <event name="OnSetFocus"></event>
4624 <event name="OnSize"></event>
4625 <event name="OnUpdateUI"></event>
4626 </object>
4627 </object>
4628 </object>
4629 </object>
4630 </object>
4631 </object>
4632 <object class="Dialog" expanded="0">
4633 <property name="bg"></property>
4634 <property name="center"></property>
4635 <property name="context_help"></property>
4636 <property name="enabled">1</property>
4637 <property name="extra_style"></property>
4638 <property name="fg"></property>
4639 <property name="font"></property>
4640 <property name="hidden">0</property>
4641 <property name="id">wxID_ANY</property>
4642 <property name="maximum_size"></property>
4643 <property name="minimum_size"></property>
4644 <property name="name">CProductsDialogBase</property>
4645 <property name="pos"></property>
4646 <property name="size">708,535</property>
4647 <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
4648 <property name="subclass"></property>
4649 <property name="title">Marketplace</property>
4650 <property name="tooltip"></property>
4651 <property name="window_extra_style"></property>
4652 <property name="window_name"></property>
4653 <property name="window_style"></property>
4654 <event name="OnActivate"></event>
4655 <event name="OnActivateApp"></event>
4656 <event name="OnChar"></event>
4657 <event name="OnClose"></event>
4658 <event name="OnEnterWindow"></event>
4659 <event name="OnEraseBackground"></event>
4660 <event name="OnHibernate"></event>
4661 <event name="OnIconize"></event>
4662 <event name="OnIdle"></event>
4663 <event name="OnInitDialog"></event>
4664 <event name="OnKeyDown"></event>
4665 <event name="OnKeyUp"></event>
4666 <event name="OnKillFocus"></event>
4667 <event name="OnLeaveWindow"></event>
4668 <event name="OnLeftDClick"></event>
4669 <event name="OnLeftDown"></event>
4670 <event name="OnLeftUp"></event>
4671 <event name="OnMiddleDClick"></event>
4672 <event name="OnMiddleDown"></event>
4673 <event name="OnMiddleUp"></event>
4674 <event name="OnMotion"></event>
4675 <event name="OnMouseEvents"></event>
4676 <event name="OnMouseWheel"></event>
4677 <event name="OnPaint"></event>
4678 <event name="OnRightDClick"></event>
4679 <event name="OnRightDown"></event>
4680 <event name="OnRightUp"></event>
4681 <event name="OnSetFocus"></event>
4682 <event name="OnSize"></event>
4683 <event name="OnUpdateUI"></event>
4684 <object class="wxBoxSizer" expanded="1">
4685 <property name="minimum_size"></property>
4686 <property name="name">bSizer22</property>
4687 <property name="orient">wxVERTICAL</property>
4688 <property name="permission">none</property>
4689 <object class="sizeritem" expanded="1">
4690 <property name="border">5</property>
4691 <property name="flag">wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT</property>
4692 <property name="proportion">0</property>
4693 <object class="wxBoxSizer" expanded="1">
4694 <property name="minimum_size"></property>
4695 <property name="name">bSizer23</property>
4696 <property name="orient">wxHORIZONTAL</property>
4697 <property name="permission">none</property>
4698 <object class="sizeritem" expanded="1">
4699 <property name="border">5</property>
4700 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
4701 <property name="proportion">0</property>
4702 <object class="wxComboBox" expanded="1">
4703 <property name="bg"></property>
4704 <property name="choices">&quot;(Any Category)&quot;</property>
4705 <property name="context_help"></property>
4706 <property name="enabled">1</property>
4707 <property name="fg"></property>
4708 <property name="font"></property>
4709 <property name="hidden">0</property>
4710 <property name="id">wxID_ANY</property>
4711 <property name="maximum_size"></property>
4712 <property name="minimum_size"></property>
4713 <property name="name">m_comboBoxCategory</property>
4714 <property name="permission">protected</property>
4715 <property name="pos"></property>
4716 <property name="size">150,-1</property>
4717 <property name="style"></property>
4718 <property name="subclass"></property>
4719 <property name="tooltip"></property>
4720 <property name="value">(Any Category)</property>
4721 <property name="window_extra_style"></property>
4722 <property name="window_name"></property>
4723 <property name="window_style"></property>
4724 <event name="OnChar"></event>
4725 <event name="OnCombobox">OnCombobox</event>
4726 <event name="OnEnterWindow"></event>
4727 <event name="OnEraseBackground"></event>
4728 <event name="OnKeyDown"></event>
4729 <event name="OnKeyUp"></event>
4730 <event name="OnKillFocus"></event>
4731 <event name="OnLeaveWindow"></event>
4732 <event name="OnLeftDClick"></event>
4733 <event name="OnLeftDown"></event>
4734 <event name="OnLeftUp"></event>
4735 <event name="OnMiddleDClick"></event>
4736 <event name="OnMiddleDown"></event>
4737 <event name="OnMiddleUp"></event>
4738 <event name="OnMotion"></event>
4739 <event name="OnMouseEvents"></event>
4740 <event name="OnMouseWheel"></event>
4741 <event name="OnPaint"></event>
4742 <event name="OnRightDClick"></event>
4743 <event name="OnRightDown"></event>
4744 <event name="OnRightUp"></event>
4745 <event name="OnSetFocus"></event>
4746 <event name="OnSize"></event>
4747 <event name="OnText"></event>
4748 <event name="OnTextEnter"></event>
4749 <event name="OnUpdateUI"></event>
4750 </object>
4751 </object>
4752 <object class="sizeritem" expanded="1">
4753 <property name="border">5</property>
4754 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
4755 <property name="proportion">1</property>
4756 <object class="wxTextCtrl" expanded="1">
4757 <property name="bg"></property>
4758 <property name="context_help"></property>
4759 <property name="enabled">1</property>
4760 <property name="fg"></property>
4761 <property name="font"></property>
4762 <property name="hidden">0</property>
4763 <property name="id">wxID_ANY</property>
4764 <property name="maximum_size"></property>
4765 <property name="maxlength">0</property>
4766 <property name="minimum_size"></property>
4767 <property name="name">m_textCtrlSearch</property>
4768 <property name="permission">protected</property>
4769 <property name="pos"></property>
4770 <property name="size"></property>
4771 <property name="style"></property>
4772 <property name="subclass"></property>
4773 <property name="tooltip"></property>
4774 <property name="value"></property>
4775 <property name="window_extra_style"></property>
4776 <property name="window_name"></property>
4777 <property name="window_style"></property>
4778 <event name="OnChar"></event>
4779 <event name="OnEnterWindow"></event>
4780 <event name="OnEraseBackground"></event>
4781 <event name="OnKeyDown">OnKeyDown</event>
4782 <event name="OnKeyUp"></event>
4783 <event name="OnKillFocus"></event>
4784 <event name="OnLeaveWindow"></event>
4785 <event name="OnLeftDClick"></event>
4786 <event name="OnLeftDown"></event>
4787 <event name="OnLeftUp"></event>
4788 <event name="OnMiddleDClick"></event>
4789 <event name="OnMiddleDown"></event>
4790 <event name="OnMiddleUp"></event>
4791 <event name="OnMotion"></event>
4792 <event name="OnMouseEvents"></event>
4793 <event name="OnMouseWheel"></event>
4794 <event name="OnPaint"></event>
4795 <event name="OnRightDClick"></event>
4796 <event name="OnRightDown"></event>
4797 <event name="OnRightUp"></event>
4798 <event name="OnSetFocus"></event>
4799 <event name="OnSize"></event>
4800 <event name="OnText"></event>
4801 <event name="OnTextEnter"></event>
4802 <event name="OnTextMaxLen"></event>
4803 <event name="OnTextURL"></event>
4804 <event name="OnUpdateUI"></event>
4805 </object>
4806 </object>
4807 <object class="sizeritem" expanded="1">
4808 <property name="border">5</property>
4809 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
4810 <property name="proportion">0</property>
4811 <object class="wxButton" expanded="1">
4812 <property name="bg"></property>
4813 <property name="context_help"></property>
4814 <property name="default">0</property>
4815 <property name="enabled">1</property>
4816 <property name="fg"></property>
4817 <property name="font"></property>
4818 <property name="hidden">0</property>
4819 <property name="id">wxID_ANY</property>
4820 <property name="label">&amp;Search</property>
4821 <property name="maximum_size"></property>
4822 <property name="minimum_size"></property>
4823 <property name="name">m_buttonSearch</property>
4824 <property name="permission">protected</property>
4825 <property name="pos"></property>
4826 <property name="size"></property>
4827 <property name="style"></property>
4828 <property name="subclass"></property>
4829 <property name="tooltip"></property>
4830 <property name="window_extra_style"></property>
4831 <property name="window_name"></property>
4832 <property name="window_style"></property>
4833 <event name="OnButtonClick">OnButtonSearch</event>
4834 <event name="OnChar"></event>
4835 <event name="OnEnterWindow"></event>
4836 <event name="OnEraseBackground"></event>
4837 <event name="OnKeyDown"></event>
4838 <event name="OnKeyUp"></event>
4839 <event name="OnKillFocus"></event>
4840 <event name="OnLeaveWindow"></event>
4841 <event name="OnLeftDClick"></event>
4842 <event name="OnLeftDown"></event>
4843 <event name="OnLeftUp"></event>
4844 <event name="OnMiddleDClick"></event>
4845 <event name="OnMiddleDown"></event>
4846 <event name="OnMiddleUp"></event>
4847 <event name="OnMotion"></event>
4848 <event name="OnMouseEvents"></event>
4849 <event name="OnMouseWheel"></event>
4850 <event name="OnPaint"></event>
4851 <event name="OnRightDClick"></event>
4852 <event name="OnRightDown"></event>
4853 <event name="OnRightUp"></event>
4854 <event name="OnSetFocus"></event>
4855 <event name="OnSize"></event>
4856 <event name="OnUpdateUI"></event>
4857 </object>
4858 </object>
4859 </object>
4860 </object>
4861 <object class="sizeritem" expanded="1">
4862 <property name="border">5</property>
4863 <property name="flag">wxALL|wxEXPAND</property>
4864 <property name="proportion">1</property>
4865 <object class="wxListCtrl" expanded="1">
4866 <property name="bg"></property>
4867 <property name="context_help"></property>
4868 <property name="enabled">1</property>
4869 <property name="fg"></property>
4870 <property name="font"></property>
4871 <property name="hidden">0</property>
4872 <property name="id">wxID_ANY</property>
4873 <property name="maximum_size"></property>
4874 <property name="minimum_size"></property>
4875 <property name="name">m_listCtrl</property>
4876 <property name="permission">protected</property>
4877 <property name="pos"></property>
4878 <property name="size"></property>
4879 <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT</property>
4880 <property name="subclass"></property>
4881 <property name="tooltip"></property>
4882 <property name="window_extra_style"></property>
4883 <property name="window_name"></property>
4884 <property name="window_style"></property>
4885 <event name="OnChar"></event>
4886 <event name="OnEnterWindow"></event>
4887 <event name="OnEraseBackground"></event>
4888 <event name="OnKeyDown"></event>
4889 <event name="OnKeyUp"></event>
4890 <event name="OnKillFocus"></event>
4891 <event name="OnLeaveWindow"></event>
4892 <event name="OnLeftDClick"></event>
4893 <event name="OnLeftDown"></event>
4894 <event name="OnLeftUp"></event>
4895 <event name="OnListBeginDrag"></event>
4896 <event name="OnListBeginLabelEdit"></event>
4897 <event name="OnListBeginRDrag"></event>
4898 <event name="OnListCacheHint"></event>
4899 <event name="OnListColBeginDrag"></event>
4900 <event name="OnListColClick"></event>
4901 <event name="OnListColDragging"></event>
4902 <event name="OnListColEndDrag"></event>
4903 <event name="OnListColRightClick"></event>
4904 <event name="OnListDeleteAllItems"></event>
4905 <event name="OnListDeleteItem"></event>
4906 <event name="OnListEndLabelEdit"></event>
4907 <event name="OnListInsertItem"></event>
4908 <event name="OnListItemActivated">OnListItemActivated</event>
4909 <event name="OnListItemDeselected"></event>
4910 <event name="OnListItemFocused"></event>
4911 <event name="OnListItemMiddleClick"></event>
4912 <event name="OnListItemRightClick"></event>
4913 <event name="OnListItemSelected"></event>
4914 <event name="OnListKeyDown"></event>
4915 <event name="OnMiddleDClick"></event>
4916 <event name="OnMiddleDown"></event>
4917 <event name="OnMiddleUp"></event>
4918 <event name="OnMotion"></event>
4919 <event name="OnMouseEvents"></event>
4920 <event name="OnMouseWheel"></event>
4921 <event name="OnPaint"></event>
4922 <event name="OnRightDClick"></event>
4923 <event name="OnRightDown"></event>
4924 <event name="OnRightUp"></event>
4925 <event name="OnSetFocus"></event>
4926 <event name="OnSize"></event>
4927 <event name="OnUpdateUI"></event>
4928 </object>
4929 </object>
4930 </object>
4931 </object>
4932 <object class="Frame" expanded="0">
4933 <property name="bg">wxSYS_COLOUR_MENU</property>
4934 <property name="center"></property>
4935 <property name="context_help"></property>
4936 <property name="enabled">1</property>
4937 <property name="extra_style"></property>
4938 <property name="fg"></property>
4939 <property name="font"></property>
4940 <property name="hidden">0</property>
4941 <property name="id">wxID_ANY</property>
4942 <property name="maximum_size"></property>
4943 <property name="minimum_size"></property>
4944 <property name="name">CEditProductDialogBase</property>
4945 <property name="pos"></property>
4946 <property name="size">660,640</property>
4947 <property name="style">wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER</property>
4948 <property name="subclass"></property>
4949 <property name="title">Edit Product</property>
4950 <property name="tooltip"></property>
4951 <property name="window_extra_style"></property>
4952 <property name="window_name"></property>
4953 <property name="window_style">wxTAB_TRAVERSAL</property>
4954 <property name="xrc_skip_sizer">1</property>
4955 <event name="OnActivate"></event>
4956 <event name="OnActivateApp"></event>
4957 <event name="OnChar"></event>
4958 <event name="OnClose"></event>
4959 <event name="OnEnterWindow"></event>
4960 <event name="OnEraseBackground"></event>
4961 <event name="OnHibernate"></event>
4962 <event name="OnIconize"></event>
4963 <event name="OnIdle"></event>
4964 <event name="OnKeyDown"></event>
4965 <event name="OnKeyUp"></event>
4966 <event name="OnKillFocus"></event>
4967 <event name="OnLeaveWindow"></event>
4968 <event name="OnLeftDClick"></event>
4969 <event name="OnLeftDown"></event>
4970 <event name="OnLeftUp"></event>
4971 <event name="OnMiddleDClick"></event>
4972 <event name="OnMiddleDown"></event>
4973 <event name="OnMiddleUp"></event>
4974 <event name="OnMotion"></event>
4975 <event name="OnMouseEvents"></event>
4976 <event name="OnMouseWheel"></event>
4977 <event name="OnPaint"></event>
4978 <event name="OnRightDClick"></event>
4979 <event name="OnRightDown"></event>
4980 <event name="OnRightUp"></event>
4981 <event name="OnSetFocus"></event>
4982 <event name="OnSize"></event>
4983 <event name="OnUpdateUI"></event>
4984 <object class="wxBoxSizer" expanded="1">
4985 <property name="minimum_size"></property>
4986 <property name="name">bSizer20</property>
4987 <property name="orient">wxVERTICAL</property>
4988 <property name="permission">none</property>
4989 <object class="sizeritem" expanded="1">
4990 <property name="border">5</property>
4991 <property name="flag">wxEXPAND|wxALL</property>
4992 <property name="proportion">1</property>
4993 <object class="wxScrolledWindow" expanded="1">
4994 <property name="bg">wxSYS_COLOUR_WINDOW</property>
4995 <property name="context_help"></property>
4996 <property name="enabled">1</property>
4997 <property name="fg"></property>
4998 <property name="font"></property>
4999 <property name="hidden">0</property>
5000 <property name="id">wxID_ANY</property>
5001 <property name="maximum_size"></property>
5002 <property name="minimum_size"></property>
5003 <property name="name">m_scrolledWindow</property>
5004 <property name="permission">protected</property>
5005 <property name="pos"></property>
5006 <property name="scroll_rate_x">5</property>
5007 <property name="scroll_rate_y">5</property>
5008 <property name="size"></property>
5009 <property name="subclass"></property>
5010 <property name="tooltip"></property>
5011 <property name="window_extra_style"></property>
5012 <property name="window_name"></property>
5013 <property name="window_style">wxHSCROLL|wxTAB_TRAVERSAL|wxVSCROLL</property>
5014 <event name="OnChar"></event>
5015 <event name="OnEnterWindow"></event>
5016 <event name="OnEraseBackground"></event>
5017 <event name="OnKeyDown"></event>
5018 <event name="OnKeyUp"></event>
5019 <event name="OnKillFocus"></event>
5020 <event name="OnLeaveWindow"></event>
5021 <event name="OnLeftDClick"></event>
5022 <event name="OnLeftDown"></event>
5023 <event name="OnLeftUp"></event>
5024 <event name="OnMiddleDClick"></event>
5025 <event name="OnMiddleDown"></event>
5026 <event name="OnMiddleUp"></event>
5027 <event name="OnMotion"></event>
5028 <event name="OnMouseEvents"></event>
5029 <event name="OnMouseWheel"></event>
5030 <event name="OnPaint"></event>
5031 <event name="OnRightDClick"></event>
5032 <event name="OnRightDown"></event>
5033 <event name="OnRightUp"></event>
5034 <event name="OnSetFocus"></event>
5035 <event name="OnSize"></event>
5036 <event name="OnUpdateUI"></event>
5037 <object class="wxBoxSizer" expanded="1">
5038 <property name="minimum_size"></property>
5039 <property name="name">bSizer21</property>
5040 <property name="orient">wxVERTICAL</property>
5041 <property name="permission">none</property>
5042 <object class="sizeritem" expanded="1">
5043 <property name="border">5</property>
5044 <property name="flag">wxEXPAND|wxTOP|wxRIGHT|wxLEFT</property>
5045 <property name="proportion">0</property>
5046 <object class="wxFlexGridSizer" expanded="1">
5047 <property name="cols">2</property>
5048 <property name="flexible_direction">wxBOTH</property>
5049 <property name="growablecols">1</property>
5050 <property name="growablerows"></property>
5051 <property name="hgap">0</property>
5052 <property name="minimum_size"></property>
5053 <property name="name">fgSizer8</property>
5054 <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
5055 <property name="permission">none</property>
5056 <property name="rows">0</property>
5057 <property name="vgap">0</property>
5058 <object class="sizeritem" expanded="1">
5059 <property name="border">5</property>
5060 <property name="flag">wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT</property>
5061 <property name="proportion">0</property>
5062 <object class="wxStaticText" expanded="1">
5063 <property name="bg"></property>
5064 <property name="context_help"></property>
5065 <property name="enabled">1</property>
5066 <property name="fg"></property>
5067 <property name="font"></property>
5068 <property name="hidden">0</property>
5069 <property name="id">wxID_ANY</property>
5070 <property name="label">Category</property>
5071 <property name="maximum_size"></property>
5072 <property name="minimum_size"></property>
5073 <property name="name">m_staticText106</property>
5074 <property name="permission">protected</property>
5075 <property name="pos"></property>
5076 <property name="size"></property>
5077 <property name="style">wxALIGN_RIGHT</property>
5078 <property name="subclass"></property>
5079 <property name="tooltip"></property>
5080 <property name="window_extra_style"></property>
5081 <property name="window_name"></property>
5082 <property name="window_style"></property>
5083 <property name="wrap">-1</property>
5084 <event name="OnChar"></event>
5085 <event name="OnEnterWindow"></event>
5086 <event name="OnEraseBackground"></event>
5087 <event name="OnKeyDown"></event>
5088 <event name="OnKeyUp"></event>
5089 <event name="OnKillFocus"></event>
5090 <event name="OnLeaveWindow"></event>
5091 <event name="OnLeftDClick"></event>
5092 <event name="OnLeftDown"></event>
5093 <event name="OnLeftUp"></event>
5094 <event name="OnMiddleDClick"></event>
5095 <event name="OnMiddleDown"></event>
5096 <event name="OnMiddleUp"></event>
5097 <event name="OnMotion"></event>
5098 <event name="OnMouseEvents"></event>
5099 <event name="OnMouseWheel"></event>
5100 <event name="OnPaint"></event>
5101 <event name="OnRightDClick"></event>
5102 <event name="OnRightDown"></event>
5103 <event name="OnRightUp"></event>
5104 <event name="OnSetFocus"></event>
5105 <event name="OnSize"></event>
5106 <event name="OnUpdateUI"></event>
5107 </object>
5108 </object>
5109 <object class="sizeritem" expanded="1">
5110 <property name="border">5</property>
5111 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
5112 <property name="proportion">0</property>
5113 <object class="wxComboBox" expanded="1">
5114 <property name="bg"></property>
5115 <property name="choices"></property>
5116 <property name="context_help"></property>
5117 <property name="enabled">1</property>
5118 <property name="fg"></property>
5119 <property name="font"></property>
5120 <property name="hidden">0</property>
5121 <property name="id">wxID_ANY</property>
5122 <property name="maximum_size"></property>
5123 <property name="minimum_size">180,-1</property>
5124 <property name="name">m_comboBoxCategory</property>
5125 <property name="permission">protected</property>
5126 <property name="pos"></property>
5127 <property name="size"></property>
5128 <property name="style"></property>
5129 <property name="subclass"></property>
5130 <property name="tooltip"></property>
5131 <property name="value"></property>
5132 <property name="window_extra_style"></property>
5133 <property name="window_name"></property>
5134 <property name="window_style"></property>
5135 <event name="OnChar"></event>
5136 <event name="OnCombobox"></event>
5137 <event name="OnEnterWindow"></event>
5138 <event name="OnEraseBackground"></event>
5139 <event name="OnKeyDown"></event>
5140 <event name="OnKeyUp"></event>
5141 <event name="OnKillFocus"></event>
5142 <event name="OnLeaveWindow"></event>
5143 <event name="OnLeftDClick"></event>
5144 <event name="OnLeftDown"></event>
5145 <event name="OnLeftUp"></event>
5146 <event name="OnMiddleDClick"></event>
5147 <event name="OnMiddleDown"></event>
5148 <event name="OnMiddleUp"></event>
5149 <event name="OnMotion"></event>
5150 <event name="OnMouseEvents"></event>
5151 <event name="OnMouseWheel"></event>
5152 <event name="OnPaint"></event>
5153 <event name="OnRightDClick"></event>
5154 <event name="OnRightDown"></event>
5155 <event name="OnRightUp"></event>
5156 <event name="OnSetFocus"></event>
5157 <event name="OnSize"></event>
5158 <event name="OnText"></event>
5159 <event name="OnTextEnter"></event>
5160 <event name="OnUpdateUI"></event>
5161 </object>
5162 </object>
5163 <object class="sizeritem" expanded="1">
5164 <property name="border">5</property>
5165 <property name="flag">wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT</property>
5166 <property name="proportion">0</property>
5167 <object class="wxStaticText" expanded="1">
5168 <property name="bg"></property>
5169 <property name="context_help"></property>
5170 <property name="enabled">1</property>
5171 <property name="fg"></property>
5172 <property name="font"></property>
5173 <property name="hidden">0</property>
5174 <property name="id">wxID_ANY</property>
5175 <property name="label">Title</property>
5176 <property name="maximum_size"></property>
5177 <property name="minimum_size"></property>
5178 <property name="name">m_staticText108</property>
5179 <property name="permission">protected</property>
5180 <property name="pos"></property>
5181 <property name="size"></property>
5182 <property name="style">wxALIGN_RIGHT</property>
5183 <property name="subclass"></property>
5184 <property name="tooltip"></property>
5185 <property name="window_extra_style"></property>
5186 <property name="window_name"></property>
5187 <property name="window_style"></property>
5188 <property name="wrap">-1</property>
5189 <event name="OnChar"></event>
5190 <event name="OnEnterWindow"></event>
5191 <event name="OnEraseBackground"></event>
5192 <event name="OnKeyDown"></event>
5193 <event name="OnKeyUp"></event>
5194 <event name="OnKillFocus"></event>
5195 <event name="OnLeaveWindow"></event>
5196 <event name="OnLeftDClick"></event>
5197 <event name="OnLeftDown"></event>
5198 <event name="OnLeftUp"></event>
5199 <event name="OnMiddleDClick"></event>
5200 <event name="OnMiddleDown"></event>
5201 <event name="OnMiddleUp"></event>
5202 <event name="OnMotion"></event>
5203 <event name="OnMouseEvents"></event>
5204 <event name="OnMouseWheel"></event>
5205 <event name="OnPaint"></event>
5206 <event name="OnRightDClick"></event>
5207 <event name="OnRightDown"></event>
5208 <event name="OnRightUp"></event>
5209 <event name="OnSetFocus"></event>
5210 <event name="OnSize"></event>
5211 <event name="OnUpdateUI"></event>
5212 </object>
5213 </object>
5214 <object class="sizeritem" expanded="1">
5215 <property name="border">5</property>
5216 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND</property>
5217 <property name="proportion">1</property>
5218 <object class="wxTextCtrl" expanded="1">
5219 <property name="bg"></property>
5220 <property name="context_help"></property>
5221 <property name="enabled">1</property>
5222 <property name="fg"></property>
5223 <property name="font"></property>
5224 <property name="hidden">0</property>
5225 <property name="id">wxID_ANY</property>
5226 <property name="maximum_size"></property>
5227 <property name="maxlength">0</property>
5228 <property name="minimum_size"></property>
5229 <property name="name">m_textCtrlTitle</property>
5230 <property name="permission">protected</property>
5231 <property name="pos"></property>
5232 <property name="size"></property>
5233 <property name="style"></property>
5234 <property name="subclass"></property>
5235 <property name="tooltip"></property>
5236 <property name="value"></property>
5237 <property name="window_extra_style"></property>
5238 <property name="window_name"></property>
5239 <property name="window_style"></property>
5240 <event name="OnChar"></event>
5241 <event name="OnEnterWindow"></event>
5242 <event name="OnEraseBackground"></event>
5243 <event name="OnKeyDown">OnKeyDown</event>
5244 <event name="OnKeyUp"></event>
5245 <event name="OnKillFocus"></event>
5246 <event name="OnLeaveWindow"></event>
5247 <event name="OnLeftDClick"></event>
5248 <event name="OnLeftDown"></event>
5249 <event name="OnLeftUp"></event>
5250 <event name="OnMiddleDClick"></event>
5251 <event name="OnMiddleDown"></event>
5252 <event name="OnMiddleUp"></event>
5253 <event name="OnMotion"></event>
5254 <event name="OnMouseEvents"></event>
5255 <event name="OnMouseWheel"></event>
5256 <event name="OnPaint"></event>
5257 <event name="OnRightDClick"></event>
5258 <event name="OnRightDown"></event>
5259 <event name="OnRightUp"></event>
5260 <event name="OnSetFocus"></event>
5261 <event name="OnSize"></event>
5262 <event name="OnText"></event>
5263 <event name="OnTextEnter"></event>
5264 <event name="OnTextMaxLen"></event>
5265 <event name="OnTextURL"></event>
5266 <event name="OnUpdateUI"></event>
5267 </object>
5268 </object>
5269 <object class="sizeritem" expanded="1">
5270 <property name="border">5</property>
5271 <property name="flag">wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT</property>
5272 <property name="proportion">0</property>
5273 <object class="wxStaticText" expanded="1">
5274 <property name="bg"></property>
5275 <property name="context_help"></property>
5276 <property name="enabled">1</property>
5277 <property name="fg"></property>
5278 <property name="font"></property>
5279 <property name="hidden">0</property>
5280 <property name="id">wxID_ANY</property>
5281 <property name="label">Price</property>
5282 <property name="maximum_size"></property>
5283 <property name="minimum_size"></property>
5284 <property name="name">m_staticText107</property>
5285 <property name="permission">protected</property>
5286 <property name="pos"></property>
5287 <property name="size"></property>
5288 <property name="style">wxALIGN_RIGHT</property>
5289 <property name="subclass"></property>
5290 <property name="tooltip"></property>
5291 <property name="window_extra_style"></property>
5292 <property name="window_name"></property>
5293 <property name="window_style"></property>
5294 <property name="wrap">-1</property>
5295 <event name="OnChar"></event>
5296 <event name="OnEnterWindow"></event>
5297 <event name="OnEraseBackground"></event>
5298 <event name="OnKeyDown"></event>
5299 <event name="OnKeyUp"></event>
5300 <event name="OnKillFocus"></event>
5301 <event name="OnLeaveWindow"></event>
5302 <event name="OnLeftDClick"></event>
5303 <event name="OnLeftDown"></event>
5304 <event name="OnLeftUp"></event>
5305 <event name="OnMiddleDClick"></event>
5306 <event name="OnMiddleDown"></event>
5307 <event name="OnMiddleUp"></event>
5308 <event name="OnMotion"></event>
5309 <event name="OnMouseEvents"></event>
5310 <event name="OnMouseWheel"></event>
5311 <event name="OnPaint"></event>
5312 <event name="OnRightDClick"></event>
5313 <event name="OnRightDown"></event>
5314 <event name="OnRightUp"></event>
5315 <event name="OnSetFocus"></event>
5316 <event name="OnSize"></event>
5317 <event name="OnUpdateUI"></event>
5318 </object>
5319 </object>
5320 <object class="sizeritem" expanded="1">
5321 <property name="border">5</property>
5322 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
5323 <property name="proportion">0</property>
5324 <object class="wxTextCtrl" expanded="1">
5325 <property name="bg"></property>
5326 <property name="context_help"></property>
5327 <property name="enabled">1</property>
5328 <property name="fg"></property>
5329 <property name="font"></property>
5330 <property name="hidden">0</property>
5331 <property name="id">wxID_ANY</property>
5332 <property name="maximum_size"></property>
5333 <property name="maxlength">0</property>
5334 <property name="minimum_size">105,-1</property>
5335 <property name="name">m_textCtrlPrice</property>
5336 <property name="permission">protected</property>
5337 <property name="pos"></property>
5338 <property name="size"></property>
5339 <property name="style"></property>
5340 <property name="subclass"></property>
5341 <property name="tooltip"></property>
5342 <property name="value"></property>
5343 <property name="window_extra_style"></property>
5344 <property name="window_name"></property>
5345 <property name="window_style"></property>
5346 <event name="OnChar"></event>
5347 <event name="OnEnterWindow"></event>
5348 <event name="OnEraseBackground"></event>
5349 <event name="OnKeyDown">OnKeyDown</event>
5350 <event name="OnKeyUp"></event>
5351 <event name="OnKillFocus"></event>
5352 <event name="OnLeaveWindow"></event>
5353 <event name="OnLeftDClick"></event>
5354 <event name="OnLeftDown"></event>
5355 <event name="OnLeftUp"></event>
5356 <event name="OnMiddleDClick"></event>
5357 <event name="OnMiddleDown"></event>
5358 <event name="OnMiddleUp"></event>
5359 <event name="OnMotion"></event>
5360 <event name="OnMouseEvents"></event>
5361 <event name="OnMouseWheel"></event>
5362 <event name="OnPaint"></event>
5363 <event name="OnRightDClick"></event>
5364 <event name="OnRightDown"></event>
5365 <event name="OnRightUp"></event>
5366 <event name="OnSetFocus"></event>
5367 <event name="OnSize"></event>
5368 <event name="OnText"></event>
5369 <event name="OnTextEnter"></event>
5370 <event name="OnTextMaxLen"></event>
5371 <event name="OnTextURL"></event>
5372 <event name="OnUpdateUI"></event>
5373 </object>
5374 </object>
5375 </object>
5376 </object>
5377 <object class="sizeritem" expanded="1">
5378 <property name="border">5</property>
5379 <property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
5380 <property name="proportion">0</property>
5381 <object class="wxStaticText" expanded="1">
5382 <property name="bg"></property>
5383 <property name="context_help"></property>
5384 <property name="enabled">1</property>
5385 <property name="fg"></property>
5386 <property name="font"></property>
5387 <property name="hidden">0</property>
5388 <property name="id">wxID_ANY</property>
5389 <property name="label">Page 1: Description</property>
5390 <property name="maximum_size"></property>
5391 <property name="minimum_size"></property>
5392 <property name="name">m_staticText22</property>
5393 <property name="permission">protected</property>
5394 <property name="pos"></property>
5395 <property name="size"></property>
5396 <property name="style"></property>
5397 <property name="subclass"></property>
5398 <property name="tooltip"></property>
5399 <property name="window_extra_style"></property>
5400 <property name="window_name"></property>
5401 <property name="window_style"></property>
5402 <property name="wrap">-1</property>
5403 <event name="OnChar"></event>
5404 <event name="OnEnterWindow"></event>
5405 <event name="OnEraseBackground"></event>
5406 <event name="OnKeyDown"></event>
5407 <event name="OnKeyUp"></event>
5408 <event name="OnKillFocus"></event>
5409 <event name="OnLeaveWindow"></event>
5410 <event name="OnLeftDClick"></event>
5411 <event name="OnLeftDown"></event>
5412 <event name="OnLeftUp"></event>
5413 <event name="OnMiddleDClick"></event>
5414 <event name="OnMiddleDown"></event>
5415 <event name="OnMiddleUp"></event>
5416 <event name="OnMotion"></event>
5417 <event name="OnMouseEvents"></event>
5418 <event name="OnMouseWheel"></event>
5419 <event name="OnPaint"></event>
5420 <event name="OnRightDClick"></event>
5421 <event name="OnRightDown"></event>
5422 <event name="OnRightUp"></event>
5423 <event name="OnSetFocus"></event>
5424 <event name="OnSize"></event>
5425 <event name="OnUpdateUI"></event>
5426 </object>
5427 </object>
5428 <object class="sizeritem" expanded="1">
5429 <property name="border">5</property>
5430 <property name="flag">wxALL|wxEXPAND</property>
5431 <property name="proportion">0</property>
5432 <object class="wxTextCtrl" expanded="1">
5433 <property name="bg"></property>
5434 <property name="context_help"></property>
5435 <property name="enabled">1</property>
5436 <property name="fg"></property>
5437 <property name="font"></property>
5438 <property name="hidden">0</property>
5439 <property name="id">wxID_ANY</property>
5440 <property name="maximum_size"></property>
5441 <property name="maxlength">0</property>
5442 <property name="minimum_size">-1,170</property>
5443 <property name="name">m_textCtrlDescription</property>
5444 <property name="permission">protected</property>
5445 <property name="pos"></property>
5446 <property name="size"></property>
5447 <property name="style">wxTE_MULTILINE</property>
5448 <property name="subclass"></property>
5449 <property name="tooltip"></property>
5450 <property name="value"></property>
5451 <property name="window_extra_style"></property>
5452 <property name="window_name"></property>
5453 <property name="window_style"></property>
5454 <event name="OnChar"></event>
5455 <event name="OnEnterWindow"></event>
5456 <event name="OnEraseBackground"></event>
5457 <event name="OnKeyDown">OnKeyDown</event>
5458 <event name="OnKeyUp"></event>
5459 <event name="OnKillFocus"></event>
5460 <event name="OnLeaveWindow"></event>
5461 <event name="OnLeftDClick"></event>
5462 <event name="OnLeftDown"></event>
5463 <event name="OnLeftUp"></event>
5464 <event name="OnMiddleDClick"></event>
5465 <event name="OnMiddleDown"></event>
5466 <event name="OnMiddleUp"></event>
5467 <event name="OnMotion"></event>
5468 <event name="OnMouseEvents"></event>
5469 <event name="OnMouseWheel"></event>
5470 <event name="OnPaint"></event>
5471 <event name="OnRightDClick"></event>
5472 <event name="OnRightDown"></event>
5473 <event name="OnRightUp"></event>
5474 <event name="OnSetFocus"></event>
5475 <event name="OnSize"></event>
5476 <event name="OnText"></event>
5477 <event name="OnTextEnter"></event>
5478 <event name="OnTextMaxLen"></event>
5479 <event name="OnTextURL"></event>
5480 <event name="OnUpdateUI"></event>
5481 </object>
5482 </object>
5483 <object class="sizeritem" expanded="1">
5484 <property name="border">5</property>
5485 <property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
5486 <property name="proportion">0</property>
5487 <object class="wxStaticText" expanded="1">
5488 <property name="bg"></property>
5489 <property name="context_help"></property>
5490 <property name="enabled">1</property>
5491 <property name="fg"></property>
5492 <property name="font"></property>
5493 <property name="hidden">0</property>
5494 <property name="id">wxID_ANY</property>
5495 <property name="label">Page 2: Order Form</property>
5496 <property name="maximum_size"></property>
5497 <property name="minimum_size"></property>
5498 <property name="name">m_staticText23</property>
5499 <property name="permission">protected</property>
5500 <property name="pos"></property>
5501 <property name="size"></property>
5502 <property name="style"></property>
5503 <property name="subclass"></property>
5504 <property name="tooltip"></property>
5505 <property name="window_extra_style"></property>
5506 <property name="window_name"></property>
5507 <property name="window_style"></property>
5508 <property name="wrap">-1</property>
5509 <event name="OnChar"></event>
5510 <event name="OnEnterWindow"></event>
5511 <event name="OnEraseBackground"></event>
5512 <event name="OnKeyDown"></event>
5513 <event name="OnKeyUp"></event>
5514 <event name="OnKillFocus"></event>
5515 <event name="OnLeaveWindow"></event>
5516 <event name="OnLeftDClick"></event>
5517 <event name="OnLeftDown"></event>
5518 <event name="OnLeftUp"></event>
5519 <event name="OnMiddleDClick"></event>
5520 <event name="OnMiddleDown"></event>
5521 <event name="OnMiddleUp"></event>
5522 <event name="OnMotion"></event>
5523 <event name="OnMouseEvents"></event>
5524 <event name="OnMouseWheel"></event>
5525 <event name="OnPaint"></event>
5526 <event name="OnRightDClick"></event>
5527 <event name="OnRightDown"></event>
5528 <event name="OnRightUp"></event>
5529 <event name="OnSetFocus"></event>
5530 <event name="OnSize"></event>
5531 <event name="OnUpdateUI"></event>
5532 </object>
5533 </object>
5534 <object class="sizeritem" expanded="1">
5535 <property name="border">5</property>
5536 <property name="flag">wxEXPAND|wxALL</property>
5537 <property name="proportion">0</property>
5538 <object class="wxTextCtrl" expanded="1">
5539 <property name="bg"></property>
5540 <property name="context_help"></property>
5541 <property name="enabled">1</property>
5542 <property name="fg"></property>
5543 <property name="font"></property>
5544 <property name="hidden">0</property>
5545 <property name="id">wxID_ANY</property>
5546 <property name="maximum_size"></property>
5547 <property name="maxlength">0</property>
5548 <property name="minimum_size">-1,120</property>
5549 <property name="name">m_textCtrlInstructions</property>
5550 <property name="permission">protected</property>
5551 <property name="pos"></property>
5552 <property name="size"></property>
5553 <property name="style">wxTE_MULTILINE</property>
5554 <property name="subclass"></property>
5555 <property name="tooltip"></property>
5556 <property name="value"></property>
5557 <property name="window_extra_style"></property>
5558 <property name="window_name"></property>
5559 <property name="window_style"></property>
5560 <event name="OnChar"></event>
5561 <event name="OnEnterWindow"></event>
5562 <event name="OnEraseBackground"></event>
5563 <event name="OnKeyDown">OnKeyDown</event>
5564 <event name="OnKeyUp"></event>
5565 <event name="OnKillFocus"></event>
5566 <event name="OnLeaveWindow"></event>
5567 <event name="OnLeftDClick"></event>
5568 <event name="OnLeftDown"></event>
5569 <event name="OnLeftUp"></event>
5570 <event name="OnMiddleDClick"></event>
5571 <event name="OnMiddleDown"></event>
5572 <event name="OnMiddleUp"></event>
5573 <event name="OnMotion"></event>
5574 <event name="OnMouseEvents"></event>
5575 <event name="OnMouseWheel"></event>
5576 <event name="OnPaint"></event>
5577 <event name="OnRightDClick"></event>
5578 <event name="OnRightDown"></event>
5579 <event name="OnRightUp"></event>
5580 <event name="OnSetFocus"></event>
5581 <event name="OnSize"></event>
5582 <event name="OnText"></event>
5583 <event name="OnTextEnter"></event>
5584 <event name="OnTextMaxLen"></event>
5585 <event name="OnTextURL"></event>
5586 <event name="OnUpdateUI"></event>
5587 </object>
5588 </object>
5589 <object class="sizeritem" expanded="1">
5590 <property name="border">5</property>
5591 <property name="flag">wxEXPAND</property>
5592 <property name="proportion">0</property>
5593 <object class="wxFlexGridSizer" expanded="0">
5594 <property name="cols">3</property>
5595 <property name="flexible_direction">wxBOTH</property>
5596 <property name="growablecols">1</property>
5597 <property name="growablerows"></property>
5598 <property name="hgap">0</property>
5599 <property name="minimum_size"></property>
5600 <property name="name">fgSizer5</property>
5601 <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
5602 <property name="permission">public</property>
5603 <property name="rows">0</property>
5604 <property name="vgap">0</property>
5605 <object class="sizeritem" expanded="1">
5606 <property name="border">5</property>
5607 <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT|wxLEFT</property>
5608 <property name="proportion">0</property>
5609 <object class="wxStaticText" expanded="1">
5610 <property name="bg"></property>
5611 <property name="context_help"></property>
5612 <property name="enabled">1</property>
5613 <property name="fg"></property>
5614 <property name="font"></property>
5615 <property name="hidden">0</property>
5616 <property name="id">wxID_ANY</property>
5617 <property name="label">Label</property>
5618 <property name="maximum_size"></property>
5619 <property name="minimum_size"></property>
5620 <property name="name">m_staticText24</property>
5621 <property name="permission">protected</property>
5622 <property name="pos"></property>
5623 <property name="size"></property>
5624 <property name="style"></property>
5625 <property name="subclass"></property>
5626 <property name="tooltip"></property>
5627 <property name="window_extra_style"></property>
5628 <property name="window_name"></property>
5629 <property name="window_style"></property>
5630 <property name="wrap">-1</property>
5631 <event name="OnChar"></event>
5632 <event name="OnEnterWindow"></event>
5633 <event name="OnEraseBackground"></event>
5634 <event name="OnKeyDown"></event>
5635 <event name="OnKeyUp"></event>
5636 <event name="OnKillFocus"></event>
5637 <event name="OnLeaveWindow"></event>
5638 <event name="OnLeftDClick"></event>
5639 <event name="OnLeftDown"></event>
5640 <event name="OnLeftUp"></event>
5641 <event name="OnMiddleDClick"></event>
5642 <event name="OnMiddleDown"></event>
5643 <event name="OnMiddleUp"></event>
5644 <event name="OnMotion"></event>
5645 <event name="OnMouseEvents"></event>
5646 <event name="OnMouseWheel"></event>
5647 <event name="OnPaint"></event>
5648 <event name="OnRightDClick"></event>
5649 <event name="OnRightDown"></event>
5650 <event name="OnRightUp"></event>
5651 <event name="OnSetFocus"></event>
5652 <event name="OnSize"></event>
5653 <event name="OnUpdateUI"></event>
5654 </object>
5655 </object>
5656 <object class="sizeritem" expanded="1">
5657 <property name="border">5</property>
5658 <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT|wxLEFT</property>
5659 <property name="proportion">0</property>
5660 <object class="wxStaticText" expanded="1">
5661 <property name="bg"></property>
5662 <property name="context_help"></property>
5663 <property name="enabled">1</property>
5664 <property name="fg"></property>
5665 <property name="font"></property>
5666 <property name="hidden">0</property>
5667 <property name="id">wxID_ANY</property>
5668 <property name="label">Comma separated list of choices, or leave blank for text field</property>
5669 <property name="maximum_size"></property>
5670 <property name="minimum_size"></property>
5671 <property name="name">m_staticText25</property>
5672 <property name="permission">protected</property>
5673 <property name="pos"></property>
5674 <property name="size"></property>
5675 <property name="style"></property>
5676 <property name="subclass"></property>
5677 <property name="tooltip"></property>
5678 <property name="window_extra_style"></property>
5679 <property name="window_name"></property>
5680 <property name="window_style"></property>
5681 <property name="wrap">-1</property>
5682 <event name="OnChar"></event>
5683 <event name="OnEnterWindow"></event>
5684 <event name="OnEraseBackground"></event>
5685 <event name="OnKeyDown"></event>
5686 <event name="OnKeyUp"></event>
5687 <event name="OnKillFocus"></event>
5688 <event name="OnLeaveWindow"></event>
5689 <event name="OnLeftDClick"></event>
5690 <event name="OnLeftDown"></event>
5691 <event name="OnLeftUp"></event>
5692 <event name="OnMiddleDClick"></event>
5693 <event name="OnMiddleDown"></event>
5694 <event name="OnMiddleUp"></event>
5695 <event name="OnMotion"></event>
5696 <event name="OnMouseEvents"></event>
5697 <event name="OnMouseWheel"></event>
5698 <event name="OnPaint"></event>
5699 <event name="OnRightDClick"></event>
5700 <event name="OnRightDown"></event>
5701 <event name="OnRightUp"></event>
5702 <event name="OnSetFocus"></event>
5703 <event name="OnSize"></event>
5704 <event name="OnUpdateUI"></event>
5705 </object>
5706 </object>
5707 <object class="sizeritem" expanded="1">
5708 <property name="border">5</property>
5709 <property name="flag">wxEXPAND</property>
5710 <property name="proportion">1</property>
5711 <object class="spacer" expanded="1">
5712 <property name="height">0</property>
5713 <property name="permission">protected</property>
5714 <property name="width">0</property>
5715 </object>
5716 </object>
5717 <object class="sizeritem" expanded="1">
5718 <property name="border">5</property>
5719 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
5720 <property name="proportion">0</property>
5721 <object class="wxTextCtrl" expanded="1">
5722 <property name="bg"></property>
5723 <property name="context_help"></property>
5724 <property name="enabled">1</property>
5725 <property name="fg"></property>
5726 <property name="font"></property>
5727 <property name="hidden">0</property>
5728 <property name="id">wxID_ANY</property>
5729 <property name="maximum_size"></property>
5730 <property name="maxlength">0</property>
5731 <property name="minimum_size">150,-1</property>
5732 <property name="name">m_textCtrlLabel0</property>
5733 <property name="permission">protected</property>
5734 <property name="pos"></property>
5735 <property name="size"></property>
5736 <property name="style"></property>
5737 <property name="subclass"></property>
5738 <property name="tooltip"></property>
5739 <property name="value"></property>
5740 <property name="window_extra_style"></property>
5741 <property name="window_name"></property>
5742 <property name="window_style"></property>
5743 <event name="OnChar"></event>
5744 <event name="OnEnterWindow"></event>
5745 <event name="OnEraseBackground"></event>
5746 <event name="OnKeyDown">OnKeyDown</event>
5747 <event name="OnKeyUp"></event>
5748 <event name="OnKillFocus"></event>
5749 <event name="OnLeaveWindow"></event>
5750 <event name="OnLeftDClick"></event>
5751 <event name="OnLeftDown"></event>
5752 <event name="OnLeftUp"></event>
5753 <event name="OnMiddleDClick"></event>
5754 <event name="OnMiddleDown"></event>
5755 <event name="OnMiddleUp"></event>
5756 <event name="OnMotion"></event>
5757 <event name="OnMouseEvents"></event>
5758 <event name="OnMouseWheel"></event>
5759 <event name="OnPaint"></event>
5760 <event name="OnRightDClick"></event>
5761 <event name="OnRightDown"></event>
5762 <event name="OnRightUp"></event>
5763 <event name="OnSetFocus"></event>
5764 <event name="OnSize"></event>
5765 <event name="OnText"></event>
5766 <event name="OnTextEnter"></event>
5767 <event name="OnTextMaxLen"></event>
5768 <event name="OnTextURL"></event>
5769 <event name="OnUpdateUI"></event>
5770 </object>
5771 </object>
5772 <object class="sizeritem" expanded="1">
5773 <property name="border">5</property>
5774 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
5775 <property name="proportion">0</property>
5776 <object class="wxTextCtrl" expanded="1">
5777 <property name="bg"></property>
5778 <property name="context_help"></property>
5779 <property name="enabled">1</property>
5780 <property name="fg"></property>
5781 <property name="font"></property>
5782 <property name="hidden">0</property>
5783 <property name="id">wxID_ANY</property>
5784 <property name="maximum_size">-1,-1</property>
5785 <property name="maxlength">0</property>
5786 <property name="minimum_size">-1,-1</property>
5787 <property name="name">m_textCtrlField0</property>
5788 <property name="permission">protected</property>
5789 <property name="pos"></property>
5790 <property name="size">-1,-1</property>
5791 <property name="style"></property>
5792 <property name="subclass"></property>
5793 <property name="tooltip"></property>
5794 <property name="value"></property>
5795 <property name="window_extra_style"></property>
5796 <property name="window_name"></property>
5797 <property name="window_style"></property>
5798 <event name="OnChar"></event>
5799 <event name="OnEnterWindow"></event>
5800 <event name="OnEraseBackground"></event>
5801 <event name="OnKeyDown">OnKeyDown</event>
5802 <event name="OnKeyUp"></event>
5803 <event name="OnKillFocus"></event>
5804 <event name="OnLeaveWindow"></event>
5805 <event name="OnLeftDClick"></event>
5806 <event name="OnLeftDown"></event>
5807 <event name="OnLeftUp"></event>
5808 <event name="OnMiddleDClick"></event>
5809 <event name="OnMiddleDown"></event>
5810 <event name="OnMiddleUp"></event>
5811 <event name="OnMotion"></event>
5812 <event name="OnMouseEvents"></event>
5813 <event name="OnMouseWheel"></event>
5814 <event name="OnPaint"></event>
5815 <event name="OnRightDClick"></event>
5816 <event name="OnRightDown"></event>
5817 <event name="OnRightUp"></event>
5818 <event name="OnSetFocus"></event>
5819 <event name="OnSize"></event>
5820 <event name="OnText"></event>
5821 <event name="OnTextEnter"></event>
5822 <event name="OnTextMaxLen"></event>
5823 <event name="OnTextURL"></event>
5824 <event name="OnUpdateUI"></event>
5825 </object>
5826 </object>
5827 <object class="sizeritem" expanded="1">
5828 <property name="border">5</property>
5829 <property name="flag">wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL</property>
5830 <property name="proportion">0</property>
5831 <object class="wxButton" expanded="1">
5832 <property name="bg"></property>
5833 <property name="context_help"></property>
5834 <property name="default">0</property>
5835 <property name="enabled">1</property>
5836 <property name="fg"></property>
5837 <property name="font"></property>
5838 <property name="hidden">0</property>
5839 <property name="id">wxID_DEL0</property>
5840 <property name="label">Delete</property>
5841 <property name="maximum_size"></property>
5842 <property name="minimum_size">-1,-1</property>
5843 <property name="name">m_buttonDel0</property>
5844 <property name="permission">protected</property>
5845 <property name="pos"></property>
5846 <property name="size">60,20</property>
5847 <property name="style"></property>
5848 <property name="subclass"></property>
5849 <property name="tooltip"></property>
5850 <property name="window_extra_style"></property>
5851 <property name="window_name"></property>
5852 <property name="window_style"></property>
5853 <event name="OnButtonClick">OnButtonDel0</event>
5854 <event name="OnChar"></event>
5855 <event name="OnEnterWindow"></event>
5856 <event name="OnEraseBackground"></event>
5857 <event name="OnKeyDown"></event>
5858 <event name="OnKeyUp"></event>
5859 <event name="OnKillFocus"></event>
5860 <event name="OnLeaveWindow"></event>
5861 <event name="OnLeftDClick"></event>
5862 <event name="OnLeftDown"></event>
5863 <event name="OnLeftUp"></event>
5864 <event name="OnMiddleDClick"></event>
5865 <event name="OnMiddleDown"></event>
5866 <event name="OnMiddleUp"></event>
5867 <event name="OnMotion"></event>
5868 <event name="OnMouseEvents"></event>
5869 <event name="OnMouseWheel"></event>
5870 <event name="OnPaint"></event>
5871 <event name="OnRightDClick"></event>
5872 <event name="OnRightDown"></event>
5873 <event name="OnRightUp"></event>
5874 <event name="OnSetFocus"></event>
5875 <event name="OnSize"></event>
5876 <event name="OnUpdateUI"></event>
5877 </object>
5878 </object>
5879 <object class="sizeritem" expanded="1">
5880 <property name="border">5</property>
5881 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
5882 <property name="proportion">0</property>
5883 <object class="wxTextCtrl" expanded="1">
5884 <property name="bg"></property>
5885 <property name="context_help"></property>
5886 <property name="enabled">1</property>
5887 <property name="fg"></property>
5888 <property name="font"></property>
5889 <property name="hidden">0</property>
5890 <property name="id">wxID_ANY</property>
5891 <property name="maximum_size"></property>
5892 <property name="maxlength">0</property>
5893 <property name="minimum_size">150,-1</property>
5894 <property name="name">m_textCtrlLabel1</property>
5895 <property name="permission">protected</property>
5896 <property name="pos"></property>
5897 <property name="size"></property>
5898 <property name="style"></property>
5899 <property name="subclass"></property>
5900 <property name="tooltip"></property>
5901 <property name="value"></property>
5902 <property name="window_extra_style"></property>
5903 <property name="window_name"></property>
5904 <property name="window_style"></property>
5905 <event name="OnChar"></event>
5906 <event name="OnEnterWindow"></event>
5907 <event name="OnEraseBackground"></event>
5908 <event name="OnKeyDown">OnKeyDown</event>
5909 <event name="OnKeyUp"></event>
5910 <event name="OnKillFocus"></event>
5911 <event name="OnLeaveWindow"></event>
5912 <event name="OnLeftDClick"></event>
5913 <event name="OnLeftDown"></event>
5914 <event name="OnLeftUp"></event>
5915 <event name="OnMiddleDClick"></event>
5916 <event name="OnMiddleDown"></event>
5917 <event name="OnMiddleUp"></event>
5918 <event name="OnMotion"></event>
5919 <event name="OnMouseEvents"></event>
5920 <event name="OnMouseWheel"></event>
5921 <event name="OnPaint"></event>
5922 <event name="OnRightDClick"></event>
5923 <event name="OnRightDown"></event>
5924 <event name="OnRightUp"></event>
5925 <event name="OnSetFocus"></event>
5926 <event name="OnSize"></event>
5927 <event name="OnText"></event>
5928 <event name="OnTextEnter"></event>
5929 <event name="OnTextMaxLen"></event>
5930 <event name="OnTextURL"></event>
5931 <event name="OnUpdateUI"></event>
5932 </object>
5933 </object>
5934 <object class="sizeritem" expanded="1">
5935 <property name="border">5</property>
5936 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
5937 <property name="proportion">0</property>
5938 <object class="wxTextCtrl" expanded="1">
5939 <property name="bg"></property>
5940 <property name="context_help"></property>
5941 <property name="enabled">1</property>
5942 <property name="fg"></property>
5943 <property name="font"></property>
5944 <property name="hidden">0</property>
5945 <property name="id">wxID_ANY</property>
5946 <property name="maximum_size">-1,-1</property>
5947 <property name="maxlength">0</property>
5948 <property name="minimum_size">-1,-1</property>
5949 <property name="name">m_textCtrlField1</property>
5950 <property name="permission">protected</property>
5951 <property name="pos"></property>
5952 <property name="size">-1,-1</property>
5953 <property name="style"></property>
5954 <property name="subclass"></property>
5955 <property name="tooltip"></property>
5956 <property name="value"></property>
5957 <property name="window_extra_style"></property>
5958 <property name="window_name"></property>
5959 <property name="window_style"></property>
5960 <event name="OnChar"></event>
5961 <event name="OnEnterWindow"></event>
5962 <event name="OnEraseBackground"></event>
5963 <event name="OnKeyDown">OnKeyDown</event>
5964 <event name="OnKeyUp"></event>
5965 <event name="OnKillFocus"></event>
5966 <event name="OnLeaveWindow"></event>
5967 <event name="OnLeftDClick"></event>
5968 <event name="OnLeftDown"></event>
5969 <event name="OnLeftUp"></event>
5970 <event name="OnMiddleDClick"></event>
5971 <event name="OnMiddleDown"></event>
5972 <event name="OnMiddleUp"></event>
5973 <event name="OnMotion"></event>
5974 <event name="OnMouseEvents"></event>
5975 <event name="OnMouseWheel"></event>
5976 <event name="OnPaint"></event>
5977 <event name="OnRightDClick"></event>
5978 <event name="OnRightDown"></event>
5979 <event name="OnRightUp"></event>
5980 <event name="OnSetFocus"></event>
5981 <event name="OnSize"></event>
5982 <event name="OnText"></event>
5983 <event name="OnTextEnter"></event>
5984 <event name="OnTextMaxLen"></event>
5985 <event name="OnTextURL"></event>
5986 <event name="OnUpdateUI"></event>
5987 </object>
5988 </object>
5989 <object class="sizeritem" expanded="1">
5990 <property name="border">5</property>
5991 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
5992 <property name="proportion">0</property>
5993 <object class="wxButton" expanded="1">
5994 <property name="bg"></property>
5995 <property name="context_help"></property>
5996 <property name="default">0</property>
5997 <property name="enabled">1</property>
5998 <property name="fg"></property>
5999 <property name="font"></property>
6000 <property name="hidden">0</property>
6001 <property name="id">wxID_DEL1</property>
6002 <property name="label">Delete</property>
6003 <property name="maximum_size"></property>
6004 <property name="minimum_size">-1,-1</property>
6005 <property name="name">m_buttonDel1</property>
6006 <property name="permission">protected</property>
6007 <property name="pos"></property>
6008 <property name="size">60,20</property>
6009 <property name="style"></property>
6010 <property name="subclass"></property>
6011 <property name="tooltip"></property>
6012 <property name="window_extra_style"></property>
6013 <property name="window_name"></property>
6014 <property name="window_style"></property>
6015 <event name="OnButtonClick">OnButtonDel1</event>
6016 <event name="OnChar"></event>
6017 <event name="OnEnterWindow"></event>
6018 <event name="OnEraseBackground"></event>
6019 <event name="OnKeyDown"></event>
6020 <event name="OnKeyUp"></event>
6021 <event name="OnKillFocus"></event>
6022 <event name="OnLeaveWindow"></event>
6023 <event name="OnLeftDClick"></event>
6024 <event name="OnLeftDown"></event>
6025 <event name="OnLeftUp"></event>
6026 <event name="OnMiddleDClick"></event>
6027 <event name="OnMiddleDown"></event>
6028 <event name="OnMiddleUp"></event>
6029 <event name="OnMotion"></event>
6030 <event name="OnMouseEvents"></event>
6031 <event name="OnMouseWheel"></event>
6032 <event name="OnPaint"></event>
6033 <event name="OnRightDClick"></event>
6034 <event name="OnRightDown"></event>
6035 <event name="OnRightUp"></event>
6036 <event name="OnSetFocus"></event>
6037 <event name="OnSize"></event>
6038 <event name="OnUpdateUI"></event>
6039 </object>
6040 </object>
6041 <object class="sizeritem" expanded="1">
6042 <property name="border">5</property>
6043 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
6044 <property name="proportion">0</property>
6045 <object class="wxTextCtrl" expanded="1">
6046 <property name="bg"></property>
6047 <property name="context_help"></property>
6048 <property name="enabled">1</property>
6049 <property name="fg"></property>
6050 <property name="font"></property>
6051 <property name="hidden">0</property>
6052 <property name="id">wxID_ANY</property>
6053 <property name="maximum_size"></property>
6054 <property name="maxlength">0</property>
6055 <property name="minimum_size">150,-1</property>
6056 <property name="name">m_textCtrlLabel2</property>
6057 <property name="permission">protected</property>
6058 <property name="pos"></property>
6059 <property name="size"></property>
6060 <property name="style"></property>
6061 <property name="subclass"></property>
6062 <property name="tooltip"></property>
6063 <property name="value"></property>
6064 <property name="window_extra_style"></property>
6065 <property name="window_name"></property>
6066 <property name="window_style"></property>
6067 <event name="OnChar"></event>
6068 <event name="OnEnterWindow"></event>
6069 <event name="OnEraseBackground"></event>
6070 <event name="OnKeyDown">OnKeyDown</event>
6071 <event name="OnKeyUp"></event>
6072 <event name="OnKillFocus"></event>
6073 <event name="OnLeaveWindow"></event>
6074 <event name="OnLeftDClick"></event>
6075 <event name="OnLeftDown"></event>
6076 <event name="OnLeftUp"></event>
6077 <event name="OnMiddleDClick"></event>
6078 <event name="OnMiddleDown"></event>
6079 <event name="OnMiddleUp"></event>
6080 <event name="OnMotion"></event>
6081 <event name="OnMouseEvents"></event>
6082 <event name="OnMouseWheel"></event>
6083 <event name="OnPaint"></event>
6084 <event name="OnRightDClick"></event>
6085 <event name="OnRightDown"></event>
6086 <event name="OnRightUp"></event>
6087 <event name="OnSetFocus"></event>
6088 <event name="OnSize"></event>
6089 <event name="OnText"></event>
6090 <event name="OnTextEnter"></event>
6091 <event name="OnTextMaxLen"></event>
6092 <event name="OnTextURL"></event>
6093 <event name="OnUpdateUI"></event>
6094 </object>
6095 </object>
6096 <object class="sizeritem" expanded="1">
6097 <property name="border">5</property>
6098 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
6099 <property name="proportion">0</property>
6100 <object class="wxTextCtrl" expanded="1">
6101 <property name="bg"></property>
6102 <property name="context_help"></property>
6103 <property name="enabled">1</property>
6104 <property name="fg"></property>
6105 <property name="font"></property>
6106 <property name="hidden">0</property>
6107 <property name="id">wxID_ANY</property>
6108 <property name="maximum_size">-1,-1</property>
6109 <property name="maxlength">0</property>
6110 <property name="minimum_size">-1,-1</property>
6111 <property name="name">m_textCtrlField2</property>
6112 <property name="permission">protected</property>
6113 <property name="pos"></property>
6114 <property name="size">-1,-1</property>
6115 <property name="style"></property>
6116 <property name="subclass"></property>
6117 <property name="tooltip"></property>
6118 <property name="value"></property>
6119 <property name="window_extra_style"></property>
6120 <property name="window_name"></property>
6121 <property name="window_style"></property>
6122 <event name="OnChar"></event>
6123 <event name="OnEnterWindow"></event>
6124 <event name="OnEraseBackground"></event>
6125 <event name="OnKeyDown">OnKeyDown</event>
6126 <event name="OnKeyUp"></event>
6127 <event name="OnKillFocus"></event>
6128 <event name="OnLeaveWindow"></event>
6129 <event name="OnLeftDClick"></event>
6130 <event name="OnLeftDown"></event>
6131 <event name="OnLeftUp"></event>
6132 <event name="OnMiddleDClick"></event>
6133 <event name="OnMiddleDown"></event>
6134 <event name="OnMiddleUp"></event>
6135 <event name="OnMotion"></event>
6136 <event name="OnMouseEvents"></event>
6137 <event name="OnMouseWheel"></event>
6138 <event name="OnPaint"></event>
6139 <event name="OnRightDClick"></event>
6140 <event name="OnRightDown"></event>
6141 <event name="OnRightUp"></event>
6142 <event name="OnSetFocus"></event>
6143 <event name="OnSize"></event>
6144 <event name="OnText"></event>
6145 <event name="OnTextEnter"></event>
6146 <event name="OnTextMaxLen"></event>
6147 <event name="OnTextURL"></event>
6148 <event name="OnUpdateUI"></event>
6149 </object>
6150 </object>
6151 <object class="sizeritem" expanded="1">
6152 <property name="border">5</property>
6153 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
6154 <property name="proportion">0</property>
6155 <object class="wxButton" expanded="1">
6156 <property name="bg"></property>
6157 <property name="context_help"></property>
6158 <property name="default">0</property>
6159 <property name="enabled">1</property>
6160 <property name="fg"></property>
6161 <property name="font"></property>
6162 <property name="hidden">0</property>
6163 <property name="id">wxID_DEL2</property>
6164 <property name="label">Delete</property>
6165 <property name="maximum_size"></property>
6166 <property name="minimum_size">-1,-1</property>
6167 <property name="name">m_buttonDel2</property>
6168 <property name="permission">protected</property>
6169 <property name="pos"></property>
6170 <property name="size">60,20</property>
6171 <property name="style"></property>
6172 <property name="subclass"></property>
6173 <property name="tooltip"></property>
6174 <property name="window_extra_style"></property>
6175 <property name="window_name"></property>
6176 <property name="window_style"></property>
6177 <event name="OnButtonClick">OnButtonDel2</event>
6178 <event name="OnChar"></event>
6179 <event name="OnEnterWindow"></event>
6180 <event name="OnEraseBackground"></event>
6181 <event name="OnKeyDown"></event>
6182 <event name="OnKeyUp"></event>
6183 <event name="OnKillFocus"></event>
6184 <event name="OnLeaveWindow"></event>
6185 <event name="OnLeftDClick"></event>
6186 <event name="OnLeftDown"></event>
6187 <event name="OnLeftUp"></event>
6188 <event name="OnMiddleDClick"></event>
6189 <event name="OnMiddleDown"></event>
6190 <event name="OnMiddleUp"></event>
6191 <event name="OnMotion"></event>
6192 <event name="OnMouseEvents"></event>
6193 <event name="OnMouseWheel"></event>
6194 <event name="OnPaint"></event>
6195 <event name="OnRightDClick"></event>
6196 <event name="OnRightDown"></event>
6197 <event name="OnRightUp"></event>
6198 <event name="OnSetFocus"></event>
6199 <event name="OnSize"></event>
6200 <event name="OnUpdateUI"></event>
6201 </object>
6202 </object>
6203 <object class="sizeritem" expanded="1">
6204 <property name="border">5</property>
6205 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
6206 <property name="proportion">0</property>
6207 <object class="wxTextCtrl" expanded="1">
6208 <property name="bg"></property>
6209 <property name="context_help"></property>
6210 <property name="enabled">1</property>
6211 <property name="fg"></property>
6212 <property name="font"></property>
6213 <property name="hidden">0</property>
6214 <property name="id">wxID_ANY</property>
6215 <property name="maximum_size"></property>
6216 <property name="maxlength">0</property>
6217 <property name="minimum_size">150,-1</property>
6218 <property name="name">m_textCtrlLabel3</property>
6219 <property name="permission">protected</property>
6220 <property name="pos"></property>
6221 <property name="size"></property>
6222 <property name="style"></property>
6223 <property name="subclass"></property>
6224 <property name="tooltip"></property>
6225 <property name="value"></property>
6226 <property name="window_extra_style"></property>
6227 <property name="window_name"></property>
6228 <property name="window_style"></property>
6229 <event name="OnChar"></event>
6230 <event name="OnEnterWindow"></event>
6231 <event name="OnEraseBackground"></event>
6232 <event name="OnKeyDown">OnKeyDown</event>
6233 <event name="OnKeyUp"></event>
6234 <event name="OnKillFocus"></event>
6235 <event name="OnLeaveWindow"></event>
6236 <event name="OnLeftDClick"></event>
6237 <event name="OnLeftDown"></event>
6238 <event name="OnLeftUp"></event>
6239 <event name="OnMiddleDClick"></event>
6240 <event name="OnMiddleDown"></event>
6241 <event name="OnMiddleUp"></event>
6242 <event name="OnMotion"></event>
6243 <event name="OnMouseEvents"></event>
6244 <event name="OnMouseWheel"></event>
6245 <event name="OnPaint"></event>
6246 <event name="OnRightDClick"></event>
6247 <event name="OnRightDown"></event>
6248 <event name="OnRightUp"></event>
6249 <event name="OnSetFocus"></event>
6250 <event name="OnSize"></event>
6251 <event name="OnText"></event>
6252 <event name="OnTextEnter"></event>
6253 <event name="OnTextMaxLen"></event>
6254 <event name="OnTextURL"></event>
6255 <event name="OnUpdateUI"></event>
6256 </object>
6257 </object>
6258 <object class="sizeritem" expanded="1">
6259 <property name="border">5</property>
6260 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
6261 <property name="proportion">0</property>
6262 <object class="wxTextCtrl" expanded="1">
6263 <property name="bg"></property>
6264 <property name="context_help"></property>
6265 <property name="enabled">1</property>
6266 <property name="fg"></property>
6267 <property name="font"></property>
6268 <property name="hidden">0</property>
6269 <property name="id">wxID_ANY</property>
6270 <property name="maximum_size">-1,-1</property>
6271 <property name="maxlength">0</property>
6272 <property name="minimum_size">-1,-1</property>
6273 <property name="name">m_textCtrlField3</property>
6274 <property name="permission">protected</property>
6275 <property name="pos"></property>
6276 <property name="size">-1,-1</property>
6277 <property name="style"></property>
6278 <property name="subclass"></property>
6279 <property name="tooltip"></property>
6280 <property name="value"></property>
6281 <property name="window_extra_style"></property>
6282 <property name="window_name"></property>
6283 <property name="window_style"></property>
6284 <event name="OnChar"></event>
6285 <event name="OnEnterWindow"></event>
6286 <event name="OnEraseBackground"></event>
6287 <event name="OnKeyDown">OnKeyDown</event>
6288 <event name="OnKeyUp"></event>
6289 <event name="OnKillFocus"></event>
6290 <event name="OnLeaveWindow"></event>
6291 <event name="OnLeftDClick"></event>
6292 <event name="OnLeftDown"></event>
6293 <event name="OnLeftUp"></event>
6294 <event name="OnMiddleDClick"></event>
6295 <event name="OnMiddleDown"></event>
6296 <event name="OnMiddleUp"></event>
6297 <event name="OnMotion"></event>
6298 <event name="OnMouseEvents"></event>
6299 <event name="OnMouseWheel"></event>
6300 <event name="OnPaint"></event>
6301 <event name="OnRightDClick"></event>
6302 <event name="OnRightDown"></event>
6303 <event name="OnRightUp"></event>
6304 <event name="OnSetFocus"></event>
6305 <event name="OnSize"></event>
6306 <event name="OnText"></event>
6307 <event name="OnTextEnter"></event>
6308 <event name="OnTextMaxLen"></event>
6309 <event name="OnTextURL"></event>
6310 <event name="OnUpdateUI"></event>
6311 </object>
6312 </object>
6313 <object class="sizeritem" expanded="1">
6314 <property name="border">5</property>
6315 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
6316 <property name="proportion">0</property>
6317 <object class="wxButton" expanded="1">
6318 <property name="bg"></property>
6319 <property name="context_help"></property>
6320 <property name="default">0</property>
6321 <property name="enabled">1</property>
6322 <property name="fg"></property>
6323 <property name="font"></property>
6324 <property name="hidden">0</property>
6325 <property name="id">wxID_DEL3</property>
6326 <property name="label">Delete</property>
6327 <property name="maximum_size"></property>
6328 <property name="minimum_size">-1,-1</property>
6329 <property name="name">m_buttonDel3</property>
6330 <property name="permission">protected</property>
6331 <property name="pos"></property>
6332 <property name="size">60,20</property>
6333 <property name="style"></property>
6334 <property name="subclass"></property>
6335 <property name="tooltip"></property>
6336 <property name="window_extra_style"></property>
6337 <property name="window_name"></property>
6338 <property name="window_style"></property>
6339 <event name="OnButtonClick">OnButtonDel3</event>
6340 <event name="OnChar"></event>
6341 <event name="OnEnterWindow"></event>
6342 <event name="OnEraseBackground"></event>
6343 <event name="OnKeyDown"></event>
6344 <event name="OnKeyUp"></event>
6345 <event name="OnKillFocus"></event>
6346 <event name="OnLeaveWindow"></event>
6347 <event name="OnLeftDClick"></event>
6348 <event name="OnLeftDown"></event>
6349 <event name="OnLeftUp"></event>
6350 <event name="OnMiddleDClick"></event>
6351 <event name="OnMiddleDown"></event>
6352 <event name="OnMiddleUp"></event>
6353 <event name="OnMotion"></event>
6354 <event name="OnMouseEvents"></event>
6355 <event name="OnMouseWheel"></event>
6356 <event name="OnPaint"></event>
6357 <event name="OnRightDClick"></event>
6358 <event name="OnRightDown"></event>
6359 <event name="OnRightUp"></event>
6360 <event name="OnSetFocus"></event>
6361 <event name="OnSize"></event>
6362 <event name="OnUpdateUI"></event>
6363 </object>
6364 </object>
6365 <object class="sizeritem" expanded="1">
6366 <property name="border">5</property>
6367 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
6368 <property name="proportion">0</property>
6369 <object class="wxTextCtrl" expanded="1">
6370 <property name="bg"></property>
6371 <property name="context_help"></property>
6372 <property name="enabled">1</property>
6373 <property name="fg"></property>
6374 <property name="font"></property>
6375 <property name="hidden">0</property>
6376 <property name="id">wxID_ANY</property>
6377 <property name="maximum_size"></property>
6378 <property name="maxlength">0</property>
6379 <property name="minimum_size">150,-1</property>
6380 <property name="name">m_textCtrlLabel4</property>
6381 <property name="permission">protected</property>
6382 <property name="pos"></property>
6383 <property name="size"></property>
6384 <property name="style"></property>
6385 <property name="subclass"></property>
6386 <property name="tooltip"></property>
6387 <property name="value"></property>
6388 <property name="window_extra_style"></property>
6389 <property name="window_name"></property>
6390 <property name="window_style"></property>
6391 <event name="OnChar"></event>
6392 <event name="OnEnterWindow"></event>
6393 <event name="OnEraseBackground"></event>
6394 <event name="OnKeyDown">OnKeyDown</event>
6395 <event name="OnKeyUp"></event>
6396 <event name="OnKillFocus"></event>
6397 <event name="OnLeaveWindow"></event>
6398 <event name="OnLeftDClick"></event>
6399 <event name="OnLeftDown"></event>
6400 <event name="OnLeftUp"></event>
6401 <event name="OnMiddleDClick"></event>
6402 <event name="OnMiddleDown"></event>
6403 <event name="OnMiddleUp"></event>
6404 <event name="OnMotion"></event>
6405 <event name="OnMouseEvents"></event>
6406 <event name="OnMouseWheel"></event>
6407 <event name="OnPaint"></event>
6408 <event name="OnRightDClick"></event>
6409 <event name="OnRightDown"></event>
6410 <event name="OnRightUp"></event>
6411 <event name="OnSetFocus"></event>
6412 <event name="OnSize"></event>
6413 <event name="OnText"></event>
6414 <event name="OnTextEnter"></event>
6415 <event name="OnTextMaxLen"></event>
6416 <event name="OnTextURL"></event>
6417 <event name="OnUpdateUI"></event>
6418 </object>
6419 </object>
6420 <object class="sizeritem" expanded="1">
6421 <property name="border">5</property>
6422 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
6423 <property name="proportion">0</property>
6424 <object class="wxTextCtrl" expanded="1">
6425 <property name="bg"></property>
6426 <property name="context_help"></property>
6427 <property name="enabled">1</property>
6428 <property name="fg"></property>
6429 <property name="font"></property>
6430 <property name="hidden">0</property>
6431 <property name="id">wxID_ANY</property>
6432 <property name="maximum_size">-1,-1</property>
6433 <property name="maxlength">0</property>
6434 <property name="minimum_size">-1,-1</property>
6435 <property name="name">m_textCtrlField4</property>
6436 <property name="permission">protected</property>
6437 <property name="pos"></property>
6438 <property name="size">-1,-1</property>
6439 <property name="style"></property>
6440 <property name="subclass"></property>
6441 <property name="tooltip"></property>
6442 <property name="value"></property>
6443 <property name="window_extra_style"></property>
6444 <property name="window_name"></property>
6445 <property name="window_style"></property>
6446 <event name="OnChar"></event>
6447 <event name="OnEnterWindow"></event>
6448 <event name="OnEraseBackground"></event>
6449 <event name="OnKeyDown">OnKeyDown</event>
6450 <event name="OnKeyUp"></event>
6451 <event name="OnKillFocus"></event>
6452 <event name="OnLeaveWindow"></event>
6453 <event name="OnLeftDClick"></event>
6454 <event name="OnLeftDown"></event>
6455 <event name="OnLeftUp"></event>
6456 <event name="OnMiddleDClick"></event>
6457 <event name="OnMiddleDown"></event>
6458 <event name="OnMiddleUp"></event>
6459 <event name="OnMotion"></event>
6460 <event name="OnMouseEvents"></event>
6461 <event name="OnMouseWheel"></event>
6462 <event name="OnPaint"></event>
6463 <event name="OnRightDClick"></event>
6464 <event name="OnRightDown"></event>
6465 <event name="OnRightUp"></event>
6466 <event name="OnSetFocus"></event>
6467 <event name="OnSize"></event>
6468 <event name="OnText"></event>
6469 <event name="OnTextEnter"></event>
6470 <event name="OnTextMaxLen"></event>
6471 <event name="OnTextURL"></event>
6472 <event name="OnUpdateUI"></event>
6473 </object>
6474 </object>
6475 <object class="sizeritem" expanded="1">
6476 <property name="border">5</property>
6477 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
6478 <property name="proportion">0</property>
6479 <object class="wxButton" expanded="1">
6480 <property name="bg"></property>
6481 <property name="context_help"></property>
6482 <property name="default">0</property>
6483 <property name="enabled">1</property>
6484 <property name="fg"></property>
6485 <property name="font"></property>
6486 <property name="hidden">0</property>
6487 <property name="id">wxID_DEL4</property>
6488 <property name="label">Delete</property>
6489 <property name="maximum_size"></property>
6490 <property name="minimum_size">-1,-1</property>
6491 <property name="name">m_buttonDel4</property>
6492 <property name="permission">protected</property>
6493 <property name="pos"></property>
6494 <property name="size">60,20</property>
6495 <property name="style"></property>
6496 <property name="subclass"></property>
6497 <property name="tooltip"></property>
6498 <property name="window_extra_style"></property>
6499 <property name="window_name"></property>
6500 <property name="window_style"></property>
6501 <event name="OnButtonClick">OnButtonDel4</event>
6502 <event name="OnChar"></event>
6503 <event name="OnEnterWindow"></event>
6504 <event name="OnEraseBackground"></event>
6505 <event name="OnKeyDown"></event>
6506 <event name="OnKeyUp"></event>
6507 <event name="OnKillFocus"></event>
6508 <event name="OnLeaveWindow"></event>
6509 <event name="OnLeftDClick"></event>
6510 <event name="OnLeftDown"></event>
6511 <event name="OnLeftUp"></event>
6512 <event name="OnMiddleDClick"></event>
6513 <event name="OnMiddleDown"></event>
6514 <event name="OnMiddleUp"></event>
6515 <event name="OnMotion"></event>
6516 <event name="OnMouseEvents"></event>
6517 <event name="OnMouseWheel"></event>
6518 <event name="OnPaint"></event>
6519 <event name="OnRightDClick"></event>
6520 <event name="OnRightDown"></event>
6521 <event name="OnRightUp"></event>
6522 <event name="OnSetFocus"></event>
6523 <event name="OnSize"></event>
6524 <event name="OnUpdateUI"></event>
6525 </object>
6526 </object>
6527 <object class="sizeritem" expanded="1">
6528 <property name="border">5</property>
6529 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
6530 <property name="proportion">0</property>
6531 <object class="wxTextCtrl" expanded="1">
6532 <property name="bg"></property>
6533 <property name="context_help"></property>
6534 <property name="enabled">1</property>
6535 <property name="fg"></property>
6536 <property name="font"></property>
6537 <property name="hidden">0</property>
6538 <property name="id">wxID_ANY</property>
6539 <property name="maximum_size"></property>
6540 <property name="maxlength">0</property>
6541 <property name="minimum_size">150,-1</property>
6542 <property name="name">m_textCtrlLabel5</property>
6543 <property name="permission">protected</property>
6544 <property name="pos"></property>
6545 <property name="size"></property>
6546 <property name="style"></property>
6547 <property name="subclass"></property>
6548 <property name="tooltip"></property>
6549 <property name="value"></property>
6550 <property name="window_extra_style"></property>
6551 <property name="window_name"></property>
6552 <property name="window_style"></property>
6553 <event name="OnChar"></event>
6554 <event name="OnEnterWindow"></event>
6555 <event name="OnEraseBackground"></event>
6556 <event name="OnKeyDown">OnKeyDown</event>
6557 <event name="OnKeyUp"></event>
6558 <event name="OnKillFocus"></event>
6559 <event name="OnLeaveWindow"></event>
6560 <event name="OnLeftDClick"></event>
6561 <event name="OnLeftDown"></event>
6562 <event name="OnLeftUp"></event>
6563 <event name="OnMiddleDClick"></event>
6564 <event name="OnMiddleDown"></event>
6565 <event name="OnMiddleUp"></event>
6566 <event name="OnMotion"></event>
6567 <event name="OnMouseEvents"></event>
6568 <event name="OnMouseWheel"></event>
6569 <event name="OnPaint"></event>
6570 <event name="OnRightDClick"></event>
6571 <event name="OnRightDown"></event>
6572 <event name="OnRightUp"></event>
6573 <event name="OnSetFocus"></event>
6574 <event name="OnSize"></event>
6575 <event name="OnText"></event>
6576 <event name="OnTextEnter"></event>
6577 <event name="OnTextMaxLen"></event>
6578 <event name="OnTextURL"></event>
6579 <event name="OnUpdateUI"></event>
6580 </object>
6581 </object>
6582 <object class="sizeritem" expanded="1">
6583 <property name="border">5</property>
6584 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
6585 <property name="proportion">0</property>
6586 <object class="wxTextCtrl" expanded="1">
6587 <property name="bg"></property>
6588 <property name="context_help"></property>
6589 <property name="enabled">1</property>
6590 <property name="fg"></property>
6591 <property name="font"></property>
6592 <property name="hidden">0</property>
6593 <property name="id">wxID_ANY</property>
6594 <property name="maximum_size">-1,-1</property>
6595 <property name="maxlength">0</property>
6596 <property name="minimum_size">-1,-1</property>
6597 <property name="name">m_textCtrlField5</property>
6598 <property name="permission">protected</property>
6599 <property name="pos"></property>
6600 <property name="size">-1,-1</property>
6601 <property name="style"></property>
6602 <property name="subclass"></property>
6603 <property name="tooltip"></property>
6604 <property name="value"></property>
6605 <property name="window_extra_style"></property>
6606 <property name="window_name"></property>
6607 <property name="window_style"></property>
6608 <event name="OnChar"></event>
6609 <event name="OnEnterWindow"></event>
6610 <event name="OnEraseBackground"></event>
6611 <event name="OnKeyDown">OnKeyDown</event>
6612 <event name="OnKeyUp"></event>
6613 <event name="OnKillFocus"></event>
6614 <event name="OnLeaveWindow"></event>
6615 <event name="OnLeftDClick"></event>
6616 <event name="OnLeftDown"></event>
6617 <event name="OnLeftUp"></event>
6618 <event name="OnMiddleDClick"></event>
6619 <event name="OnMiddleDown"></event>
6620 <event name="OnMiddleUp"></event>
6621 <event name="OnMotion"></event>
6622 <event name="OnMouseEvents"></event>
6623 <event name="OnMouseWheel"></event>
6624 <event name="OnPaint"></event>
6625 <event name="OnRightDClick"></event>
6626 <event name="OnRightDown"></event>
6627 <event name="OnRightUp"></event>
6628 <event name="OnSetFocus"></event>
6629 <event name="OnSize"></event>
6630 <event name="OnText"></event>
6631 <event name="OnTextEnter"></event>
6632 <event name="OnTextMaxLen"></event>
6633 <event name="OnTextURL"></event>
6634 <event name="OnUpdateUI"></event>
6635 </object>
6636 </object>
6637 <object class="sizeritem" expanded="1">
6638 <property name="border">5</property>
6639 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
6640 <property name="proportion">0</property>
6641 <object class="wxButton" expanded="1">
6642 <property name="bg"></property>
6643 <property name="context_help"></property>
6644 <property name="default">0</property>
6645 <property name="enabled">1</property>
6646 <property name="fg"></property>
6647 <property name="font"></property>
6648 <property name="hidden">0</property>
6649 <property name="id">wxID_DEL5</property>
6650 <property name="label">Delete</property>
6651 <property name="maximum_size"></property>
6652 <property name="minimum_size">-1,-1</property>
6653 <property name="name">m_buttonDel5</property>
6654 <property name="permission">protected</property>
6655 <property name="pos"></property>
6656 <property name="size">60,20</property>
6657 <property name="style"></property>
6658 <property name="subclass"></property>
6659 <property name="tooltip"></property>
6660 <property name="window_extra_style"></property>
6661 <property name="window_name"></property>
6662 <property name="window_style"></property>
6663 <event name="OnButtonClick">OnButtonDel5</event>
6664 <event name="OnChar"></event>
6665 <event name="OnEnterWindow"></event>
6666 <event name="OnEraseBackground"></event>
6667 <event name="OnKeyDown"></event>
6668 <event name="OnKeyUp"></event>
6669 <event name="OnKillFocus"></event>
6670 <event name="OnLeaveWindow"></event>
6671 <event name="OnLeftDClick"></event>
6672 <event name="OnLeftDown"></event>
6673 <event name="OnLeftUp"></event>
6674 <event name="OnMiddleDClick"></event>
6675 <event name="OnMiddleDown"></event>
6676 <event name="OnMiddleUp"></event>
6677 <event name="OnMotion"></event>
6678 <event name="OnMouseEvents"></event>
6679 <event name="OnMouseWheel"></event>
6680 <event name="OnPaint"></event>
6681 <event name="OnRightDClick"></event>
6682 <event name="OnRightDown"></event>
6683 <event name="OnRightUp"></event>
6684 <event name="OnSetFocus"></event>
6685 <event name="OnSize"></event>
6686 <event name="OnUpdateUI"></event>
6687 </object>
6688 </object>
6689 <object class="sizeritem" expanded="1">
6690 <property name="border">5</property>
6691 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
6692 <property name="proportion">0</property>
6693 <object class="wxTextCtrl" expanded="1">
6694 <property name="bg"></property>
6695 <property name="context_help"></property>
6696 <property name="enabled">1</property>
6697 <property name="fg"></property>
6698 <property name="font"></property>
6699 <property name="hidden">0</property>
6700 <property name="id">wxID_ANY</property>
6701 <property name="maximum_size"></property>
6702 <property name="maxlength">0</property>
6703 <property name="minimum_size">150,-1</property>
6704 <property name="name">m_textCtrlLabel6</property>
6705 <property name="permission">protected</property>
6706 <property name="pos"></property>
6707 <property name="size"></property>
6708 <property name="style"></property>
6709 <property name="subclass"></property>
6710 <property name="tooltip"></property>
6711 <property name="value"></property>
6712 <property name="window_extra_style"></property>
6713 <property name="window_name"></property>
6714 <property name="window_style"></property>
6715 <event name="OnChar"></event>
6716 <event name="OnEnterWindow"></event>
6717 <event name="OnEraseBackground"></event>
6718 <event name="OnKeyDown">OnKeyDown</event>
6719 <event name="OnKeyUp"></event>
6720 <event name="OnKillFocus"></event>
6721 <event name="OnLeaveWindow"></event>
6722 <event name="OnLeftDClick"></event>
6723 <event name="OnLeftDown"></event>
6724 <event name="OnLeftUp"></event>
6725 <event name="OnMiddleDClick"></event>
6726 <event name="OnMiddleDown"></event>
6727 <event name="OnMiddleUp"></event>
6728 <event name="OnMotion"></event>
6729 <event name="OnMouseEvents"></event>
6730 <event name="OnMouseWheel"></event>
6731 <event name="OnPaint"></event>
6732 <event name="OnRightDClick"></event>
6733 <event name="OnRightDown"></event>
6734 <event name="OnRightUp"></event>
6735 <event name="OnSetFocus"></event>
6736 <event name="OnSize"></event>
6737 <event name="OnText"></event>
6738 <event name="OnTextEnter"></event>
6739 <event name="OnTextMaxLen"></event>
6740 <event name="OnTextURL"></event>
6741 <event name="OnUpdateUI"></event>
6742 </object>
6743 </object>
6744 <object class="sizeritem" expanded="1">
6745 <property name="border">5</property>
6746 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
6747 <property name="proportion">0</property>
6748 <object class="wxTextCtrl" expanded="1">
6749 <property name="bg"></property>
6750 <property name="context_help"></property>
6751 <property name="enabled">1</property>
6752 <property name="fg"></property>
6753 <property name="font"></property>
6754 <property name="hidden">0</property>
6755 <property name="id">wxID_ANY</property>
6756 <property name="maximum_size">-1,-1</property>
6757 <property name="maxlength">0</property>
6758 <property name="minimum_size">-1,-1</property>
6759 <property name="name">m_textCtrlField6</property>
6760 <property name="permission">protected</property>
6761 <property name="pos"></property>
6762 <property name="size">-1,-1</property>
6763 <property name="style"></property>
6764 <property name="subclass"></property>
6765 <property name="tooltip"></property>
6766 <property name="value"></property>
6767 <property name="window_extra_style"></property>
6768 <property name="window_name"></property>
6769 <property name="window_style"></property>
6770 <event name="OnChar"></event>
6771 <event name="OnEnterWindow"></event>
6772 <event name="OnEraseBackground"></event>
6773 <event name="OnKeyDown">OnKeyDown</event>
6774 <event name="OnKeyUp"></event>
6775 <event name="OnKillFocus"></event>
6776 <event name="OnLeaveWindow"></event>
6777 <event name="OnLeftDClick"></event>
6778 <event name="OnLeftDown"></event>
6779 <event name="OnLeftUp"></event>
6780 <event name="OnMiddleDClick"></event>
6781 <event name="OnMiddleDown"></event>
6782 <event name="OnMiddleUp"></event>
6783 <event name="OnMotion"></event>
6784 <event name="OnMouseEvents"></event>
6785 <event name="OnMouseWheel"></event>
6786 <event name="OnPaint"></event>
6787 <event name="OnRightDClick"></event>
6788 <event name="OnRightDown"></event>
6789 <event name="OnRightUp"></event>
6790 <event name="OnSetFocus"></event>
6791 <event name="OnSize"></event>
6792 <event name="OnText"></event>
6793 <event name="OnTextEnter"></event>
6794 <event name="OnTextMaxLen"></event>
6795 <event name="OnTextURL"></event>
6796 <event name="OnUpdateUI"></event>
6797 </object>
6798 </object>
6799 <object class="sizeritem" expanded="1">
6800 <property name="border">5</property>
6801 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
6802 <property name="proportion">0</property>
6803 <object class="wxButton" expanded="1">
6804 <property name="bg"></property>
6805 <property name="context_help"></property>
6806 <property name="default">0</property>
6807 <property name="enabled">1</property>
6808 <property name="fg"></property>
6809 <property name="font"></property>
6810 <property name="hidden">0</property>
6811 <property name="id">wxID_DEL6</property>
6812 <property name="label">Delete</property>
6813 <property name="maximum_size"></property>
6814 <property name="minimum_size">-1,-1</property>
6815 <property name="name">m_buttonDel6</property>
6816 <property name="permission">protected</property>
6817 <property name="pos"></property>
6818 <property name="size">60,20</property>
6819 <property name="style"></property>
6820 <property name="subclass"></property>
6821 <property name="tooltip"></property>
6822 <property name="window_extra_style"></property>
6823 <property name="window_name"></property>
6824 <property name="window_style"></property>
6825 <event name="OnButtonClick">OnButtonDel6</event>
6826 <event name="OnChar"></event>
6827 <event name="OnEnterWindow"></event>
6828 <event name="OnEraseBackground"></event>
6829 <event name="OnKeyDown"></event>
6830 <event name="OnKeyUp"></event>
6831 <event name="OnKillFocus"></event>
6832 <event name="OnLeaveWindow"></event>
6833 <event name="OnLeftDClick"></event>
6834 <event name="OnLeftDown"></event>
6835 <event name="OnLeftUp"></event>
6836 <event name="OnMiddleDClick"></event>
6837 <event name="OnMiddleDown"></event>
6838 <event name="OnMiddleUp"></event>
6839 <event name="OnMotion"></event>
6840 <event name="OnMouseEvents"></event>
6841 <event name="OnMouseWheel"></event>
6842 <event name="OnPaint"></event>
6843 <event name="OnRightDClick"></event>
6844 <event name="OnRightDown"></event>
6845 <event name="OnRightUp"></event>
6846 <event name="OnSetFocus"></event>
6847 <event name="OnSize"></event>
6848 <event name="OnUpdateUI"></event>
6849 </object>
6850 </object>
6851 <object class="sizeritem" expanded="1">
6852 <property name="border">5</property>
6853 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
6854 <property name="proportion">0</property>
6855 <object class="wxTextCtrl" expanded="1">
6856 <property name="bg"></property>
6857 <property name="context_help"></property>
6858 <property name="enabled">1</property>
6859 <property name="fg"></property>
6860 <property name="font"></property>
6861 <property name="hidden">0</property>
6862 <property name="id">wxID_ANY</property>
6863 <property name="maximum_size"></property>
6864 <property name="maxlength">0</property>
6865 <property name="minimum_size">150,-1</property>
6866 <property name="name">m_textCtrlLabel7</property>
6867 <property name="permission">protected</property>
6868 <property name="pos"></property>
6869 <property name="size"></property>
6870 <property name="style"></property>
6871 <property name="subclass"></property>
6872 <property name="tooltip"></property>
6873 <property name="value"></property>
6874 <property name="window_extra_style"></property>
6875 <property name="window_name"></property>
6876 <property name="window_style"></property>
6877 <event name="OnChar"></event>
6878 <event name="OnEnterWindow"></event>
6879 <event name="OnEraseBackground"></event>
6880 <event name="OnKeyDown">OnKeyDown</event>
6881 <event name="OnKeyUp"></event>
6882 <event name="OnKillFocus"></event>
6883 <event name="OnLeaveWindow"></event>
6884 <event name="OnLeftDClick"></event>
6885 <event name="OnLeftDown"></event>
6886 <event name="OnLeftUp"></event>
6887 <event name="OnMiddleDClick"></event>
6888 <event name="OnMiddleDown"></event>
6889 <event name="OnMiddleUp"></event>
6890 <event name="OnMotion"></event>
6891 <event name="OnMouseEvents"></event>
6892 <event name="OnMouseWheel"></event>
6893 <event name="OnPaint"></event>
6894 <event name="OnRightDClick"></event>
6895 <event name="OnRightDown"></event>
6896 <event name="OnRightUp"></event>
6897 <event name="OnSetFocus"></event>
6898 <event name="OnSize"></event>
6899 <event name="OnText"></event>
6900 <event name="OnTextEnter"></event>
6901 <event name="OnTextMaxLen"></event>
6902 <event name="OnTextURL"></event>
6903 <event name="OnUpdateUI"></event>
6904 </object>
6905 </object>
6906 <object class="sizeritem" expanded="1">
6907 <property name="border">5</property>
6908 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
6909 <property name="proportion">0</property>
6910 <object class="wxTextCtrl" expanded="1">
6911 <property name="bg"></property>
6912 <property name="context_help"></property>
6913 <property name="enabled">1</property>
6914 <property name="fg"></property>
6915 <property name="font"></property>
6916 <property name="hidden">0</property>
6917 <property name="id">wxID_ANY</property>
6918 <property name="maximum_size">-1,-1</property>
6919 <property name="maxlength">0</property>
6920 <property name="minimum_size">-1,-1</property>
6921 <property name="name">m_textCtrlField7</property>
6922 <property name="permission">protected</property>
6923 <property name="pos"></property>
6924 <property name="size">-1,-1</property>
6925 <property name="style"></property>
6926 <property name="subclass"></property>
6927 <property name="tooltip"></property>
6928 <property name="value"></property>
6929 <property name="window_extra_style"></property>
6930 <property name="window_name"></property>
6931 <property name="window_style"></property>
6932 <event name="OnChar"></event>
6933 <event name="OnEnterWindow"></event>
6934 <event name="OnEraseBackground"></event>
6935 <event name="OnKeyDown">OnKeyDown</event>
6936 <event name="OnKeyUp"></event>
6937 <event name="OnKillFocus"></event>
6938 <event name="OnLeaveWindow"></event>
6939 <event name="OnLeftDClick"></event>
6940 <event name="OnLeftDown"></event>
6941 <event name="OnLeftUp"></event>
6942 <event name="OnMiddleDClick"></event>
6943 <event name="OnMiddleDown"></event>
6944 <event name="OnMiddleUp"></event>
6945 <event name="OnMotion"></event>
6946 <event name="OnMouseEvents"></event>
6947 <event name="OnMouseWheel"></event>
6948 <event name="OnPaint"></event>
6949 <event name="OnRightDClick"></event>
6950 <event name="OnRightDown"></event>
6951 <event name="OnRightUp"></event>
6952 <event name="OnSetFocus"></event>
6953 <event name="OnSize"></event>
6954 <event name="OnText"></event>
6955 <event name="OnTextEnter"></event>
6956 <event name="OnTextMaxLen"></event>
6957 <event name="OnTextURL"></event>
6958 <event name="OnUpdateUI"></event>
6959 </object>
6960 </object>
6961 <object class="sizeritem" expanded="1">
6962 <property name="border">5</property>
6963 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
6964 <property name="proportion">0</property>
6965 <object class="wxButton" expanded="1">
6966 <property name="bg"></property>
6967 <property name="context_help"></property>
6968 <property name="default">0</property>
6969 <property name="enabled">1</property>
6970 <property name="fg"></property>
6971 <property name="font"></property>
6972 <property name="hidden">0</property>
6973 <property name="id">wxID_DEL7</property>
6974 <property name="label">Delete</property>
6975 <property name="maximum_size"></property>
6976 <property name="minimum_size">-1,-1</property>
6977 <property name="name">m_buttonDel7</property>
6978 <property name="permission">protected</property>
6979 <property name="pos"></property>
6980 <property name="size">60,20</property>
6981 <property name="style"></property>
6982 <property name="subclass"></property>
6983 <property name="tooltip"></property>
6984 <property name="window_extra_style"></property>
6985 <property name="window_name"></property>
6986 <property name="window_style"></property>
6987 <event name="OnButtonClick">OnButtonDel7</event>
6988 <event name="OnChar"></event>
6989 <event name="OnEnterWindow"></event>
6990 <event name="OnEraseBackground"></event>
6991 <event name="OnKeyDown"></event>
6992 <event name="OnKeyUp"></event>
6993 <event name="OnKillFocus"></event>
6994 <event name="OnLeaveWindow"></event>
6995 <event name="OnLeftDClick"></event>
6996 <event name="OnLeftDown"></event>
6997 <event name="OnLeftUp"></event>
6998 <event name="OnMiddleDClick"></event>
6999 <event name="OnMiddleDown"></event>
7000 <event name="OnMiddleUp"></event>
7001 <event name="OnMotion"></event>
7002 <event name="OnMouseEvents"></event>
7003 <event name="OnMouseWheel"></event>
7004 <event name="OnPaint"></event>
7005 <event name="OnRightDClick"></event>
7006 <event name="OnRightDown"></event>
7007 <event name="OnRightUp"></event>
7008 <event name="OnSetFocus"></event>
7009 <event name="OnSize"></event>
7010 <event name="OnUpdateUI"></event>
7011 </object>
7012 </object>
7013 <object class="sizeritem" expanded="1">
7014 <property name="border">5</property>
7015 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
7016 <property name="proportion">0</property>
7017 <object class="wxTextCtrl" expanded="1">
7018 <property name="bg"></property>
7019 <property name="context_help"></property>
7020 <property name="enabled">1</property>
7021 <property name="fg"></property>
7022 <property name="font"></property>
7023 <property name="hidden">0</property>
7024 <property name="id">wxID_ANY</property>
7025 <property name="maximum_size"></property>
7026 <property name="maxlength">0</property>
7027 <property name="minimum_size">150,-1</property>
7028 <property name="name">m_textCtrlLabel8</property>
7029 <property name="permission">protected</property>
7030 <property name="pos"></property>
7031 <property name="size"></property>
7032 <property name="style"></property>
7033 <property name="subclass"></property>
7034 <property name="tooltip"></property>
7035 <property name="value"></property>
7036 <property name="window_extra_style"></property>
7037 <property name="window_name"></property>
7038 <property name="window_style"></property>
7039 <event name="OnChar"></event>
7040 <event name="OnEnterWindow"></event>
7041 <event name="OnEraseBackground"></event>
7042 <event name="OnKeyDown">OnKeyDown</event>
7043 <event name="OnKeyUp"></event>
7044 <event name="OnKillFocus"></event>
7045 <event name="OnLeaveWindow"></event>
7046 <event name="OnLeftDClick"></event>
7047 <event name="OnLeftDown"></event>
7048 <event name="OnLeftUp"></event>
7049 <event name="OnMiddleDClick"></event>
7050 <event name="OnMiddleDown"></event>
7051 <event name="OnMiddleUp"></event>
7052 <event name="OnMotion"></event>
7053 <event name="OnMouseEvents"></event>
7054 <event name="OnMouseWheel"></event>
7055 <event name="OnPaint"></event>
7056 <event name="OnRightDClick"></event>
7057 <event name="OnRightDown"></event>
7058 <event name="OnRightUp"></event>
7059 <event name="OnSetFocus"></event>
7060 <event name="OnSize"></event>
7061 <event name="OnText"></event>
7062 <event name="OnTextEnter"></event>
7063 <event name="OnTextMaxLen"></event>
7064 <event name="OnTextURL"></event>
7065 <event name="OnUpdateUI"></event>
7066 </object>
7067 </object>
7068 <object class="sizeritem" expanded="1">
7069 <property name="border">5</property>
7070 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
7071 <property name="proportion">0</property>
7072 <object class="wxTextCtrl" expanded="1">
7073 <property name="bg"></property>
7074 <property name="context_help"></property>
7075 <property name="enabled">1</property>
7076 <property name="fg"></property>
7077 <property name="font"></property>
7078 <property name="hidden">0</property>
7079 <property name="id">wxID_ANY</property>
7080 <property name="maximum_size">-1,-1</property>
7081 <property name="maxlength">0</property>
7082 <property name="minimum_size">-1,-1</property>
7083 <property name="name">m_textCtrlField8</property>
7084 <property name="permission">protected</property>
7085 <property name="pos"></property>
7086 <property name="size">-1,-1</property>
7087 <property name="style"></property>
7088 <property name="subclass"></property>
7089 <property name="tooltip"></property>
7090 <property name="value"></property>
7091 <property name="window_extra_style"></property>
7092 <property name="window_name"></property>
7093 <property name="window_style"></property>
7094 <event name="OnChar"></event>
7095 <event name="OnEnterWindow"></event>
7096 <event name="OnEraseBackground"></event>
7097 <event name="OnKeyDown">OnKeyDown</event>
7098 <event name="OnKeyUp"></event>
7099 <event name="OnKillFocus"></event>
7100 <event name="OnLeaveWindow"></event>
7101 <event name="OnLeftDClick"></event>
7102 <event name="OnLeftDown"></event>
7103 <event name="OnLeftUp"></event>
7104 <event name="OnMiddleDClick"></event>
7105 <event name="OnMiddleDown"></event>
7106 <event name="OnMiddleUp"></event>
7107 <event name="OnMotion"></event>
7108 <event name="OnMouseEvents"></event>
7109 <event name="OnMouseWheel"></event>
7110 <event name="OnPaint"></event>
7111 <event name="OnRightDClick"></event>
7112 <event name="OnRightDown"></event>
7113 <event name="OnRightUp"></event>
7114 <event name="OnSetFocus"></event>
7115 <event name="OnSize"></event>
7116 <event name="OnText"></event>
7117 <event name="OnTextEnter"></event>
7118 <event name="OnTextMaxLen"></event>
7119 <event name="OnTextURL"></event>
7120 <event name="OnUpdateUI"></event>
7121 </object>
7122 </object>
7123 <object class="sizeritem" expanded="1">
7124 <property name="border">5</property>
7125 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
7126 <property name="proportion">0</property>
7127 <object class="wxButton" expanded="1">
7128 <property name="bg"></property>
7129 <property name="context_help"></property>
7130 <property name="default">0</property>
7131 <property name="enabled">1</property>
7132 <property name="fg"></property>
7133 <property name="font"></property>
7134 <property name="hidden">0</property>
7135 <property name="id">wxID_DEL8</property>
7136 <property name="label">Delete</property>
7137 <property name="maximum_size"></property>
7138 <property name="minimum_size">-1,-1</property>
7139 <property name="name">m_buttonDel8</property>
7140 <property name="permission">protected</property>
7141 <property name="pos"></property>
7142 <property name="size">60,20</property>
7143 <property name="style"></property>
7144 <property name="subclass"></property>
7145 <property name="tooltip"></property>
7146 <property name="window_extra_style"></property>
7147 <property name="window_name"></property>
7148 <property name="window_style"></property>
7149 <event name="OnButtonClick">OnButtonDel8</event>
7150 <event name="OnChar"></event>
7151 <event name="OnEnterWindow"></event>
7152 <event name="OnEraseBackground"></event>
7153 <event name="OnKeyDown"></event>
7154 <event name="OnKeyUp"></event>
7155 <event name="OnKillFocus"></event>
7156 <event name="OnLeaveWindow"></event>
7157 <event name="OnLeftDClick"></event>
7158 <event name="OnLeftDown"></event>
7159 <event name="OnLeftUp"></event>
7160 <event name="OnMiddleDClick"></event>
7161 <event name="OnMiddleDown"></event>
7162 <event name="OnMiddleUp"></event>
7163 <event name="OnMotion"></event>
7164 <event name="OnMouseEvents"></event>
7165 <event name="OnMouseWheel"></event>
7166 <event name="OnPaint"></event>
7167 <event name="OnRightDClick"></event>
7168 <event name="OnRightDown"></event>
7169 <event name="OnRightUp"></event>
7170 <event name="OnSetFocus"></event>
7171 <event name="OnSize"></event>
7172 <event name="OnUpdateUI"></event>
7173 </object>
7174 </object>
7175 <object class="sizeritem" expanded="1">
7176 <property name="border">5</property>
7177 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
7178 <property name="proportion">0</property>
7179 <object class="wxTextCtrl" expanded="1">
7180 <property name="bg"></property>
7181 <property name="context_help"></property>
7182 <property name="enabled">1</property>
7183 <property name="fg"></property>
7184 <property name="font"></property>
7185 <property name="hidden">0</property>
7186 <property name="id">wxID_ANY</property>
7187 <property name="maximum_size"></property>
7188 <property name="maxlength">0</property>
7189 <property name="minimum_size">150,-1</property>
7190 <property name="name">m_textCtrlLabel9</property>
7191 <property name="permission">protected</property>
7192 <property name="pos"></property>
7193 <property name="size"></property>
7194 <property name="style"></property>
7195 <property name="subclass"></property>
7196 <property name="tooltip"></property>
7197 <property name="value"></property>
7198 <property name="window_extra_style"></property>
7199 <property name="window_name"></property>
7200 <property name="window_style"></property>
7201 <event name="OnChar"></event>
7202 <event name="OnEnterWindow"></event>
7203 <event name="OnEraseBackground"></event>
7204 <event name="OnKeyDown">OnKeyDown</event>
7205 <event name="OnKeyUp"></event>
7206 <event name="OnKillFocus"></event>
7207 <event name="OnLeaveWindow"></event>
7208 <event name="OnLeftDClick"></event>
7209 <event name="OnLeftDown"></event>
7210 <event name="OnLeftUp"></event>
7211 <event name="OnMiddleDClick"></event>
7212 <event name="OnMiddleDown"></event>
7213 <event name="OnMiddleUp"></event>
7214 <event name="OnMotion"></event>
7215 <event name="OnMouseEvents"></event>
7216 <event name="OnMouseWheel"></event>
7217 <event name="OnPaint"></event>
7218 <event name="OnRightDClick"></event>
7219 <event name="OnRightDown"></event>
7220 <event name="OnRightUp"></event>
7221 <event name="OnSetFocus"></event>
7222 <event name="OnSize"></event>
7223 <event name="OnText"></event>
7224 <event name="OnTextEnter"></event>
7225 <event name="OnTextMaxLen"></event>
7226 <event name="OnTextURL"></event>
7227 <event name="OnUpdateUI"></event>
7228 </object>
7229 </object>
7230 <object class="sizeritem" expanded="1">
7231 <property name="border">5</property>
7232 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
7233 <property name="proportion">0</property>
7234 <object class="wxTextCtrl" expanded="1">
7235 <property name="bg"></property>
7236 <property name="context_help"></property>
7237 <property name="enabled">1</property>
7238 <property name="fg"></property>
7239 <property name="font"></property>
7240 <property name="hidden">0</property>
7241 <property name="id">wxID_ANY</property>
7242 <property name="maximum_size">-1,-1</property>
7243 <property name="maxlength">0</property>
7244 <property name="minimum_size">-1,-1</property>
7245 <property name="name">m_textCtrlField9</property>
7246 <property name="permission">protected</property>
7247 <property name="pos"></property>
7248 <property name="size">-1,-1</property>
7249 <property name="style"></property>
7250 <property name="subclass"></property>
7251 <property name="tooltip"></property>
7252 <property name="value"></property>
7253 <property name="window_extra_style"></property>
7254 <property name="window_name"></property>
7255 <property name="window_style"></property>
7256 <event name="OnChar"></event>
7257 <event name="OnEnterWindow"></event>
7258 <event name="OnEraseBackground"></event>
7259 <event name="OnKeyDown">OnKeyDown</event>
7260 <event name="OnKeyUp"></event>
7261 <event name="OnKillFocus"></event>
7262 <event name="OnLeaveWindow"></event>
7263 <event name="OnLeftDClick"></event>
7264 <event name="OnLeftDown"></event>
7265 <event name="OnLeftUp"></event>
7266 <event name="OnMiddleDClick"></event>
7267 <event name="OnMiddleDown"></event>
7268 <event name="OnMiddleUp"></event>
7269 <event name="OnMotion"></event>
7270 <event name="OnMouseEvents"></event>
7271 <event name="OnMouseWheel"></event>
7272 <event name="OnPaint"></event>
7273 <event name="OnRightDClick"></event>
7274 <event name="OnRightDown"></event>
7275 <event name="OnRightUp"></event>
7276 <event name="OnSetFocus"></event>
7277 <event name="OnSize"></event>
7278 <event name="OnText"></event>
7279 <event name="OnTextEnter"></event>
7280 <event name="OnTextMaxLen"></event>
7281 <event name="OnTextURL"></event>
7282 <event name="OnUpdateUI"></event>
7283 </object>
7284 </object>
7285 <object class="sizeritem" expanded="1">
7286 <property name="border">5</property>
7287 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
7288 <property name="proportion">0</property>
7289 <object class="wxButton" expanded="1">
7290 <property name="bg"></property>
7291 <property name="context_help"></property>
7292 <property name="default">0</property>
7293 <property name="enabled">1</property>
7294 <property name="fg"></property>
7295 <property name="font"></property>
7296 <property name="hidden">0</property>
7297 <property name="id">wxID_DEL9</property>
7298 <property name="label">Delete</property>
7299 <property name="maximum_size"></property>
7300 <property name="minimum_size">-1,-1</property>
7301 <property name="name">m_buttonDel9</property>
7302 <property name="permission">protected</property>
7303 <property name="pos"></property>
7304 <property name="size">60,20</property>
7305 <property name="style"></property>
7306 <property name="subclass"></property>
7307 <property name="tooltip"></property>
7308 <property name="window_extra_style"></property>
7309 <property name="window_name"></property>
7310 <property name="window_style"></property>
7311 <event name="OnButtonClick">OnButtonDel9</event>
7312 <event name="OnChar"></event>
7313 <event name="OnEnterWindow"></event>
7314 <event name="OnEraseBackground"></event>
7315 <event name="OnKeyDown"></event>
7316 <event name="OnKeyUp"></event>
7317 <event name="OnKillFocus"></event>
7318 <event name="OnLeaveWindow"></event>
7319 <event name="OnLeftDClick"></event>
7320 <event name="OnLeftDown"></event>
7321 <event name="OnLeftUp"></event>
7322 <event name="OnMiddleDClick"></event>
7323 <event name="OnMiddleDown"></event>
7324 <event name="OnMiddleUp"></event>
7325 <event name="OnMotion"></event>
7326 <event name="OnMouseEvents"></event>
7327 <event name="OnMouseWheel"></event>
7328 <event name="OnPaint"></event>
7329 <event name="OnRightDClick"></event>
7330 <event name="OnRightDown"></event>
7331 <event name="OnRightUp"></event>
7332 <event name="OnSetFocus"></event>
7333 <event name="OnSize"></event>
7334 <event name="OnUpdateUI"></event>
7335 </object>
7336 </object>
7337 <object class="sizeritem" expanded="1">
7338 <property name="border">5</property>
7339 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
7340 <property name="proportion">0</property>
7341 <object class="wxTextCtrl" expanded="1">
7342 <property name="bg"></property>
7343 <property name="context_help"></property>
7344 <property name="enabled">1</property>
7345 <property name="fg"></property>
7346 <property name="font"></property>
7347 <property name="hidden">0</property>
7348 <property name="id">wxID_ANY</property>
7349 <property name="maximum_size"></property>
7350 <property name="maxlength">0</property>
7351 <property name="minimum_size">150,-1</property>
7352 <property name="name">m_textCtrlLabel10</property>
7353 <property name="permission">protected</property>
7354 <property name="pos"></property>
7355 <property name="size"></property>
7356 <property name="style"></property>
7357 <property name="subclass"></property>
7358 <property name="tooltip"></property>
7359 <property name="value"></property>
7360 <property name="window_extra_style"></property>
7361 <property name="window_name"></property>
7362 <property name="window_style"></property>
7363 <event name="OnChar"></event>
7364 <event name="OnEnterWindow"></event>
7365 <event name="OnEraseBackground"></event>
7366 <event name="OnKeyDown">OnKeyDown</event>
7367 <event name="OnKeyUp"></event>
7368 <event name="OnKillFocus"></event>
7369 <event name="OnLeaveWindow"></event>
7370 <event name="OnLeftDClick"></event>
7371 <event name="OnLeftDown"></event>
7372 <event name="OnLeftUp"></event>
7373 <event name="OnMiddleDClick"></event>
7374 <event name="OnMiddleDown"></event>
7375 <event name="OnMiddleUp"></event>
7376 <event name="OnMotion"></event>
7377 <event name="OnMouseEvents"></event>
7378 <event name="OnMouseWheel"></event>
7379 <event name="OnPaint"></event>
7380 <event name="OnRightDClick"></event>
7381 <event name="OnRightDown"></event>
7382 <event name="OnRightUp"></event>
7383 <event name="OnSetFocus"></event>
7384 <event name="OnSize"></event>
7385 <event name="OnText"></event>
7386 <event name="OnTextEnter"></event>
7387 <event name="OnTextMaxLen"></event>
7388 <event name="OnTextURL"></event>
7389 <event name="OnUpdateUI"></event>
7390 </object>
7391 </object>
7392 <object class="sizeritem" expanded="1">
7393 <property name="border">5</property>
7394 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
7395 <property name="proportion">0</property>
7396 <object class="wxTextCtrl" expanded="1">
7397 <property name="bg"></property>
7398 <property name="context_help"></property>
7399 <property name="enabled">1</property>
7400 <property name="fg"></property>
7401 <property name="font"></property>
7402 <property name="hidden">0</property>
7403 <property name="id">wxID_ANY</property>
7404 <property name="maximum_size">-1,-1</property>
7405 <property name="maxlength">0</property>
7406 <property name="minimum_size">-1,-1</property>
7407 <property name="name">m_textCtrlField10</property>
7408 <property name="permission">protected</property>
7409 <property name="pos"></property>
7410 <property name="size">-1,-1</property>
7411 <property name="style"></property>
7412 <property name="subclass"></property>
7413 <property name="tooltip"></property>
7414 <property name="value"></property>
7415 <property name="window_extra_style"></property>
7416 <property name="window_name"></property>
7417 <property name="window_style"></property>
7418 <event name="OnChar"></event>
7419 <event name="OnEnterWindow"></event>
7420 <event name="OnEraseBackground"></event>
7421 <event name="OnKeyDown">OnKeyDown</event>
7422 <event name="OnKeyUp"></event>
7423 <event name="OnKillFocus"></event>
7424 <event name="OnLeaveWindow"></event>
7425 <event name="OnLeftDClick"></event>
7426 <event name="OnLeftDown"></event>
7427 <event name="OnLeftUp"></event>
7428 <event name="OnMiddleDClick"></event>
7429 <event name="OnMiddleDown"></event>
7430 <event name="OnMiddleUp"></event>
7431 <event name="OnMotion"></event>
7432 <event name="OnMouseEvents"></event>
7433 <event name="OnMouseWheel"></event>
7434 <event name="OnPaint"></event>
7435 <event name="OnRightDClick"></event>
7436 <event name="OnRightDown"></event>
7437 <event name="OnRightUp"></event>
7438 <event name="OnSetFocus"></event>
7439 <event name="OnSize"></event>
7440 <event name="OnText"></event>
7441 <event name="OnTextEnter"></event>
7442 <event name="OnTextMaxLen"></event>
7443 <event name="OnTextURL"></event>
7444 <event name="OnUpdateUI"></event>
7445 </object>
7446 </object>
7447 <object class="sizeritem" expanded="1">
7448 <property name="border">5</property>
7449 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
7450 <property name="proportion">0</property>
7451 <object class="wxButton" expanded="1">
7452 <property name="bg"></property>
7453 <property name="context_help"></property>
7454 <property name="default">0</property>
7455 <property name="enabled">1</property>
7456 <property name="fg"></property>
7457 <property name="font"></property>
7458 <property name="hidden">0</property>
7459 <property name="id">wxID_DEL10</property>
7460 <property name="label">Delete</property>
7461 <property name="maximum_size"></property>
7462 <property name="minimum_size">-1,-1</property>
7463 <property name="name">m_buttonDel10</property>
7464 <property name="permission">protected</property>
7465 <property name="pos"></property>
7466 <property name="size">60,20</property>
7467 <property name="style"></property>
7468 <property name="subclass"></property>
7469 <property name="tooltip"></property>
7470 <property name="window_extra_style"></property>
7471 <property name="window_name"></property>
7472 <property name="window_style"></property>
7473 <event name="OnButtonClick">OnButtonDel10</event>
7474 <event name="OnChar"></event>
7475 <event name="OnEnterWindow"></event>
7476 <event name="OnEraseBackground"></event>
7477 <event name="OnKeyDown"></event>
7478 <event name="OnKeyUp"></event>
7479 <event name="OnKillFocus"></event>
7480 <event name="OnLeaveWindow"></event>
7481 <event name="OnLeftDClick"></event>
7482 <event name="OnLeftDown"></event>
7483 <event name="OnLeftUp"></event>
7484 <event name="OnMiddleDClick"></event>
7485 <event name="OnMiddleDown"></event>
7486 <event name="OnMiddleUp"></event>
7487 <event name="OnMotion"></event>
7488 <event name="OnMouseEvents"></event>
7489 <event name="OnMouseWheel"></event>
7490 <event name="OnPaint"></event>
7491 <event name="OnRightDClick"></event>
7492 <event name="OnRightDown"></event>
7493 <event name="OnRightUp"></event>
7494 <event name="OnSetFocus"></event>
7495 <event name="OnSize"></event>
7496 <event name="OnUpdateUI"></event>
7497 </object>
7498 </object>
7499 <object class="sizeritem" expanded="1">
7500 <property name="border">5</property>
7501 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
7502 <property name="proportion">0</property>
7503 <object class="wxTextCtrl" expanded="1">
7504 <property name="bg"></property>
7505 <property name="context_help"></property>
7506 <property name="enabled">1</property>
7507 <property name="fg"></property>
7508 <property name="font"></property>
7509 <property name="hidden">0</property>
7510 <property name="id">wxID_ANY</property>
7511 <property name="maximum_size"></property>
7512 <property name="maxlength">0</property>
7513 <property name="minimum_size">150,-1</property>
7514 <property name="name">m_textCtrlLabel11</property>
7515 <property name="permission">protected</property>
7516 <property name="pos"></property>
7517 <property name="size"></property>
7518 <property name="style"></property>
7519 <property name="subclass"></property>
7520 <property name="tooltip"></property>
7521 <property name="value"></property>
7522 <property name="window_extra_style"></property>
7523 <property name="window_name"></property>
7524 <property name="window_style"></property>
7525 <event name="OnChar"></event>
7526 <event name="OnEnterWindow"></event>
7527 <event name="OnEraseBackground"></event>
7528 <event name="OnKeyDown">OnKeyDown</event>
7529 <event name="OnKeyUp"></event>
7530 <event name="OnKillFocus"></event>
7531 <event name="OnLeaveWindow"></event>
7532 <event name="OnLeftDClick"></event>
7533 <event name="OnLeftDown"></event>
7534 <event name="OnLeftUp"></event>
7535 <event name="OnMiddleDClick"></event>
7536 <event name="OnMiddleDown"></event>
7537 <event name="OnMiddleUp"></event>
7538 <event name="OnMotion"></event>
7539 <event name="OnMouseEvents"></event>
7540 <event name="OnMouseWheel"></event>
7541 <event name="OnPaint"></event>
7542 <event name="OnRightDClick"></event>
7543 <event name="OnRightDown"></event>
7544 <event name="OnRightUp"></event>
7545 <event name="OnSetFocus"></event>
7546 <event name="OnSize"></event>
7547 <event name="OnText"></event>
7548 <event name="OnTextEnter"></event>
7549 <event name="OnTextMaxLen"></event>
7550 <event name="OnTextURL"></event>
7551 <event name="OnUpdateUI"></event>
7552 </object>
7553 </object>
7554 <object class="sizeritem" expanded="1">
7555 <property name="border">5</property>
7556 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
7557 <property name="proportion">0</property>
7558 <object class="wxTextCtrl" expanded="1">
7559 <property name="bg"></property>
7560 <property name="context_help"></property>
7561 <property name="enabled">1</property>
7562 <property name="fg"></property>
7563 <property name="font"></property>
7564 <property name="hidden">0</property>
7565 <property name="id">wxID_ANY</property>
7566 <property name="maximum_size">-1,-1</property>
7567 <property name="maxlength">0</property>
7568 <property name="minimum_size">-1,-1</property>
7569 <property name="name">m_textCtrlField11</property>
7570 <property name="permission">protected</property>
7571 <property name="pos"></property>
7572 <property name="size">-1,-1</property>
7573 <property name="style"></property>
7574 <property name="subclass"></property>
7575 <property name="tooltip"></property>
7576 <property name="value"></property>
7577 <property name="window_extra_style"></property>
7578 <property name="window_name"></property>
7579 <property name="window_style"></property>
7580 <event name="OnChar"></event>
7581 <event name="OnEnterWindow"></event>
7582 <event name="OnEraseBackground"></event>
7583 <event name="OnKeyDown">OnKeyDown</event>
7584 <event name="OnKeyUp"></event>
7585 <event name="OnKillFocus"></event>
7586 <event name="OnLeaveWindow"></event>
7587 <event name="OnLeftDClick"></event>
7588 <event name="OnLeftDown"></event>
7589 <event name="OnLeftUp"></event>
7590 <event name="OnMiddleDClick"></event>
7591 <event name="OnMiddleDown"></event>
7592 <event name="OnMiddleUp"></event>
7593 <event name="OnMotion"></event>
7594 <event name="OnMouseEvents"></event>
7595 <event name="OnMouseWheel"></event>
7596 <event name="OnPaint"></event>
7597 <event name="OnRightDClick"></event>
7598 <event name="OnRightDown"></event>
7599 <event name="OnRightUp"></event>
7600 <event name="OnSetFocus"></event>
7601 <event name="OnSize"></event>
7602 <event name="OnText"></event>
7603 <event name="OnTextEnter"></event>
7604 <event name="OnTextMaxLen"></event>
7605 <event name="OnTextURL"></event>
7606 <event name="OnUpdateUI"></event>
7607 </object>
7608 </object>
7609 <object class="sizeritem" expanded="1">
7610 <property name="border">5</property>
7611 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
7612 <property name="proportion">0</property>
7613 <object class="wxButton" expanded="1">
7614 <property name="bg"></property>
7615 <property name="context_help"></property>
7616 <property name="default">0</property>
7617 <property name="enabled">1</property>
7618 <property name="fg"></property>
7619 <property name="font"></property>
7620 <property name="hidden">0</property>
7621 <property name="id">wxID_DEL11</property>
7622 <property name="label">Delete</property>
7623 <property name="maximum_size"></property>
7624 <property name="minimum_size">-1,-1</property>
7625 <property name="name">m_buttonDel11</property>
7626 <property name="permission">protected</property>
7627 <property name="pos"></property>
7628 <property name="size">60,20</property>
7629 <property name="style"></property>
7630 <property name="subclass"></property>
7631 <property name="tooltip"></property>
7632 <property name="window_extra_style"></property>
7633 <property name="window_name"></property>
7634 <property name="window_style"></property>
7635 <event name="OnButtonClick">OnButtonDel11</event>
7636 <event name="OnChar"></event>
7637 <event name="OnEnterWindow"></event>
7638 <event name="OnEraseBackground"></event>
7639 <event name="OnKeyDown"></event>
7640 <event name="OnKeyUp"></event>
7641 <event name="OnKillFocus"></event>
7642 <event name="OnLeaveWindow"></event>
7643 <event name="OnLeftDClick"></event>
7644 <event name="OnLeftDown"></event>
7645 <event name="OnLeftUp"></event>
7646 <event name="OnMiddleDClick"></event>
7647 <event name="OnMiddleDown"></event>
7648 <event name="OnMiddleUp"></event>
7649 <event name="OnMotion"></event>
7650 <event name="OnMouseEvents"></event>
7651 <event name="OnMouseWheel"></event>
7652 <event name="OnPaint"></event>
7653 <event name="OnRightDClick"></event>
7654 <event name="OnRightDown"></event>
7655 <event name="OnRightUp"></event>
7656 <event name="OnSetFocus"></event>
7657 <event name="OnSize"></event>
7658 <event name="OnUpdateUI"></event>
7659 </object>
7660 </object>
7661 <object class="sizeritem" expanded="1">
7662 <property name="border">5</property>
7663 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
7664 <property name="proportion">0</property>
7665 <object class="wxTextCtrl" expanded="1">
7666 <property name="bg"></property>
7667 <property name="context_help"></property>
7668 <property name="enabled">1</property>
7669 <property name="fg"></property>
7670 <property name="font"></property>
7671 <property name="hidden">0</property>
7672 <property name="id">wxID_ANY</property>
7673 <property name="maximum_size"></property>
7674 <property name="maxlength">0</property>
7675 <property name="minimum_size">150,-1</property>
7676 <property name="name">m_textCtrlLabel12</property>
7677 <property name="permission">protected</property>
7678 <property name="pos"></property>
7679 <property name="size"></property>
7680 <property name="style"></property>
7681 <property name="subclass"></property>
7682 <property name="tooltip"></property>
7683 <property name="value"></property>
7684 <property name="window_extra_style"></property>
7685 <property name="window_name"></property>
7686 <property name="window_style"></property>
7687 <event name="OnChar"></event>
7688 <event name="OnEnterWindow"></event>
7689 <event name="OnEraseBackground"></event>
7690 <event name="OnKeyDown">OnKeyDown</event>
7691 <event name="OnKeyUp"></event>
7692 <event name="OnKillFocus"></event>
7693 <event name="OnLeaveWindow"></event>
7694 <event name="OnLeftDClick"></event>
7695 <event name="OnLeftDown"></event>
7696 <event name="OnLeftUp"></event>
7697 <event name="OnMiddleDClick"></event>
7698 <event name="OnMiddleDown"></event>
7699 <event name="OnMiddleUp"></event>
7700 <event name="OnMotion"></event>
7701 <event name="OnMouseEvents"></event>
7702 <event name="OnMouseWheel"></event>
7703 <event name="OnPaint"></event>
7704 <event name="OnRightDClick"></event>
7705 <event name="OnRightDown"></event>
7706 <event name="OnRightUp"></event>
7707 <event name="OnSetFocus"></event>
7708 <event name="OnSize"></event>
7709 <event name="OnText"></event>
7710 <event name="OnTextEnter"></event>
7711 <event name="OnTextMaxLen"></event>
7712 <event name="OnTextURL"></event>
7713 <event name="OnUpdateUI"></event>
7714 </object>
7715 </object>
7716 <object class="sizeritem" expanded="1">
7717 <property name="border">5</property>
7718 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
7719 <property name="proportion">0</property>
7720 <object class="wxTextCtrl" expanded="1">
7721 <property name="bg"></property>
7722 <property name="context_help"></property>
7723 <property name="enabled">1</property>
7724 <property name="fg"></property>
7725 <property name="font"></property>
7726 <property name="hidden">0</property>
7727 <property name="id">wxID_ANY</property>
7728 <property name="maximum_size">-1,-1</property>
7729 <property name="maxlength">0</property>
7730 <property name="minimum_size">-1,-1</property>
7731 <property name="name">m_textCtrlField12</property>
7732 <property name="permission">protected</property>
7733 <property name="pos"></property>
7734 <property name="size">-1,-1</property>
7735 <property name="style"></property>
7736 <property name="subclass"></property>
7737 <property name="tooltip"></property>
7738 <property name="value"></property>
7739 <property name="window_extra_style"></property>
7740 <property name="window_name"></property>
7741 <property name="window_style"></property>
7742 <event name="OnChar"></event>
7743 <event name="OnEnterWindow"></event>
7744 <event name="OnEraseBackground"></event>
7745 <event name="OnKeyDown">OnKeyDown</event>
7746 <event name="OnKeyUp"></event>
7747 <event name="OnKillFocus"></event>
7748 <event name="OnLeaveWindow"></event>
7749 <event name="OnLeftDClick"></event>
7750 <event name="OnLeftDown"></event>
7751 <event name="OnLeftUp"></event>
7752 <event name="OnMiddleDClick"></event>
7753 <event name="OnMiddleDown"></event>
7754 <event name="OnMiddleUp"></event>
7755 <event name="OnMotion"></event>
7756 <event name="OnMouseEvents"></event>
7757 <event name="OnMouseWheel"></event>
7758 <event name="OnPaint"></event>
7759 <event name="OnRightDClick"></event>
7760 <event name="OnRightDown"></event>
7761 <event name="OnRightUp"></event>
7762 <event name="OnSetFocus"></event>
7763 <event name="OnSize"></event>
7764 <event name="OnText"></event>
7765 <event name="OnTextEnter"></event>
7766 <event name="OnTextMaxLen"></event>
7767 <event name="OnTextURL"></event>
7768 <event name="OnUpdateUI"></event>
7769 </object>
7770 </object>
7771 <object class="sizeritem" expanded="1">
7772 <property name="border">5</property>
7773 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
7774 <property name="proportion">0</property>
7775 <object class="wxButton" expanded="1">
7776 <property name="bg"></property>
7777 <property name="context_help"></property>
7778 <property name="default">0</property>
7779 <property name="enabled">1</property>
7780 <property name="fg"></property>
7781 <property name="font"></property>
7782 <property name="hidden">0</property>
7783 <property name="id">wxID_DEL12</property>
7784 <property name="label">Delete</property>
7785 <property name="maximum_size"></property>
7786 <property name="minimum_size">-1,-1</property>
7787 <property name="name">m_buttonDel12</property>
7788 <property name="permission">protected</property>
7789 <property name="pos"></property>
7790 <property name="size">60,20</property>
7791 <property name="style"></property>
7792 <property name="subclass"></property>
7793 <property name="tooltip"></property>
7794 <property name="window_extra_style"></property>
7795 <property name="window_name"></property>
7796 <property name="window_style"></property>
7797 <event name="OnButtonClick">OnButtonDel12</event>
7798 <event name="OnChar"></event>
7799 <event name="OnEnterWindow"></event>
7800 <event name="OnEraseBackground"></event>
7801 <event name="OnKeyDown"></event>
7802 <event name="OnKeyUp"></event>
7803 <event name="OnKillFocus"></event>
7804 <event name="OnLeaveWindow"></event>
7805 <event name="OnLeftDClick"></event>
7806 <event name="OnLeftDown"></event>
7807 <event name="OnLeftUp"></event>
7808 <event name="OnMiddleDClick"></event>
7809 <event name="OnMiddleDown"></event>
7810 <event name="OnMiddleUp"></event>
7811 <event name="OnMotion"></event>
7812 <event name="OnMouseEvents"></event>
7813 <event name="OnMouseWheel"></event>
7814 <event name="OnPaint"></event>
7815 <event name="OnRightDClick"></event>
7816 <event name="OnRightDown"></event>
7817 <event name="OnRightUp"></event>
7818 <event name="OnSetFocus"></event>
7819 <event name="OnSize"></event>
7820 <event name="OnUpdateUI"></event>
7821 </object>
7822 </object>
7823 <object class="sizeritem" expanded="1">
7824 <property name="border">5</property>
7825 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
7826 <property name="proportion">0</property>
7827 <object class="wxTextCtrl" expanded="1">
7828 <property name="bg"></property>
7829 <property name="context_help"></property>
7830 <property name="enabled">1</property>
7831 <property name="fg"></property>
7832 <property name="font"></property>
7833 <property name="hidden">0</property>
7834 <property name="id">wxID_ANY</property>
7835 <property name="maximum_size"></property>
7836 <property name="maxlength">0</property>
7837 <property name="minimum_size">150,-1</property>
7838 <property name="name">m_textCtrlLabel13</property>
7839 <property name="permission">protected</property>
7840 <property name="pos"></property>
7841 <property name="size"></property>
7842 <property name="style"></property>
7843 <property name="subclass"></property>
7844 <property name="tooltip"></property>
7845 <property name="value"></property>
7846 <property name="window_extra_style"></property>
7847 <property name="window_name"></property>
7848 <property name="window_style"></property>
7849 <event name="OnChar"></event>
7850 <event name="OnEnterWindow"></event>
7851 <event name="OnEraseBackground"></event>
7852 <event name="OnKeyDown">OnKeyDown</event>
7853 <event name="OnKeyUp"></event>
7854 <event name="OnKillFocus"></event>
7855 <event name="OnLeaveWindow"></event>
7856 <event name="OnLeftDClick"></event>
7857 <event name="OnLeftDown"></event>
7858 <event name="OnLeftUp"></event>
7859 <event name="OnMiddleDClick"></event>
7860 <event name="OnMiddleDown"></event>
7861 <event name="OnMiddleUp"></event>
7862 <event name="OnMotion"></event>
7863 <event name="OnMouseEvents"></event>
7864 <event name="OnMouseWheel"></event>
7865 <event name="OnPaint"></event>
7866 <event name="OnRightDClick"></event>
7867 <event name="OnRightDown"></event>
7868 <event name="OnRightUp"></event>
7869 <event name="OnSetFocus"></event>
7870 <event name="OnSize"></event>
7871 <event name="OnText"></event>
7872 <event name="OnTextEnter"></event>
7873 <event name="OnTextMaxLen"></event>
7874 <event name="OnTextURL"></event>
7875 <event name="OnUpdateUI"></event>
7876 </object>
7877 </object>
7878 <object class="sizeritem" expanded="1">
7879 <property name="border">5</property>
7880 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
7881 <property name="proportion">0</property>
7882 <object class="wxTextCtrl" expanded="1">
7883 <property name="bg"></property>
7884 <property name="context_help"></property>
7885 <property name="enabled">1</property>
7886 <property name="fg"></property>
7887 <property name="font"></property>
7888 <property name="hidden">0</property>
7889 <property name="id">wxID_ANY</property>
7890 <property name="maximum_size">-1,-1</property>
7891 <property name="maxlength">0</property>
7892 <property name="minimum_size">-1,-1</property>
7893 <property name="name">m_textCtrlField13</property>
7894 <property name="permission">protected</property>
7895 <property name="pos"></property>
7896 <property name="size">-1,-1</property>
7897 <property name="style"></property>
7898 <property name="subclass"></property>
7899 <property name="tooltip"></property>
7900 <property name="value"></property>
7901 <property name="window_extra_style"></property>
7902 <property name="window_name"></property>
7903 <property name="window_style"></property>
7904 <event name="OnChar"></event>
7905 <event name="OnEnterWindow"></event>
7906 <event name="OnEraseBackground"></event>
7907 <event name="OnKeyDown">OnKeyDown</event>
7908 <event name="OnKeyUp"></event>
7909 <event name="OnKillFocus"></event>
7910 <event name="OnLeaveWindow"></event>
7911 <event name="OnLeftDClick"></event>
7912 <event name="OnLeftDown"></event>
7913 <event name="OnLeftUp"></event>
7914 <event name="OnMiddleDClick"></event>
7915 <event name="OnMiddleDown"></event>
7916 <event name="OnMiddleUp"></event>
7917 <event name="OnMotion"></event>
7918 <event name="OnMouseEvents"></event>
7919 <event name="OnMouseWheel"></event>
7920 <event name="OnPaint"></event>
7921 <event name="OnRightDClick"></event>
7922 <event name="OnRightDown"></event>
7923 <event name="OnRightUp"></event>
7924 <event name="OnSetFocus"></event>
7925 <event name="OnSize"></event>
7926 <event name="OnText"></event>
7927 <event name="OnTextEnter"></event>
7928 <event name="OnTextMaxLen"></event>
7929 <event name="OnTextURL"></event>
7930 <event name="OnUpdateUI"></event>
7931 </object>
7932 </object>
7933 <object class="sizeritem" expanded="1">
7934 <property name="border">5</property>
7935 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
7936 <property name="proportion">0</property>
7937 <object class="wxButton" expanded="1">
7938 <property name="bg"></property>
7939 <property name="context_help"></property>
7940 <property name="default">0</property>
7941 <property name="enabled">1</property>
7942 <property name="fg"></property>
7943 <property name="font"></property>
7944 <property name="hidden">0</property>
7945 <property name="id">wxID_DEL13</property>
7946 <property name="label">Delete</property>
7947 <property name="maximum_size"></property>
7948 <property name="minimum_size">-1,-1</property>
7949 <property name="name">m_buttonDel13</property>
7950 <property name="permission">protected</property>
7951 <property name="pos"></property>
7952 <property name="size">60,20</property>
7953 <property name="style"></property>
7954 <property name="subclass"></property>
7955 <property name="tooltip"></property>
7956 <property name="window_extra_style"></property>
7957 <property name="window_name"></property>
7958 <property name="window_style"></property>
7959 <event name="OnButtonClick">OnButtonDel13</event>
7960 <event name="OnChar"></event>
7961 <event name="OnEnterWindow"></event>
7962 <event name="OnEraseBackground"></event>
7963 <event name="OnKeyDown"></event>
7964 <event name="OnKeyUp"></event>
7965 <event name="OnKillFocus"></event>
7966 <event name="OnLeaveWindow"></event>
7967 <event name="OnLeftDClick"></event>
7968 <event name="OnLeftDown"></event>
7969 <event name="OnLeftUp"></event>
7970 <event name="OnMiddleDClick"></event>
7971 <event name="OnMiddleDown"></event>
7972 <event name="OnMiddleUp"></event>
7973 <event name="OnMotion"></event>
7974 <event name="OnMouseEvents"></event>
7975 <event name="OnMouseWheel"></event>
7976 <event name="OnPaint"></event>
7977 <event name="OnRightDClick"></event>
7978 <event name="OnRightDown"></event>
7979 <event name="OnRightUp"></event>
7980 <event name="OnSetFocus"></event>
7981 <event name="OnSize"></event>
7982 <event name="OnUpdateUI"></event>
7983 </object>
7984 </object>
7985 <object class="sizeritem" expanded="1">
7986 <property name="border">5</property>
7987 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
7988 <property name="proportion">0</property>
7989 <object class="wxTextCtrl" expanded="1">
7990 <property name="bg"></property>
7991 <property name="context_help"></property>
7992 <property name="enabled">1</property>
7993 <property name="fg"></property>
7994 <property name="font"></property>
7995 <property name="hidden">0</property>
7996 <property name="id">wxID_ANY</property>
7997 <property name="maximum_size"></property>
7998 <property name="maxlength">0</property>
7999 <property name="minimum_size">150,-1</property>
8000 <property name="name">m_textCtrlLabel14</property>
8001 <property name="permission">protected</property>
8002 <property name="pos"></property>
8003 <property name="size"></property>
8004 <property name="style"></property>
8005 <property name="subclass"></property>
8006 <property name="tooltip"></property>
8007 <property name="value"></property>
8008 <property name="window_extra_style"></property>
8009 <property name="window_name"></property>
8010 <property name="window_style"></property>
8011 <event name="OnChar"></event>
8012 <event name="OnEnterWindow"></event>
8013 <event name="OnEraseBackground"></event>
8014 <event name="OnKeyDown">OnKeyDown</event>
8015 <event name="OnKeyUp"></event>
8016 <event name="OnKillFocus"></event>
8017 <event name="OnLeaveWindow"></event>
8018 <event name="OnLeftDClick"></event>
8019 <event name="OnLeftDown"></event>
8020 <event name="OnLeftUp"></event>
8021 <event name="OnMiddleDClick"></event>
8022 <event name="OnMiddleDown"></event>
8023 <event name="OnMiddleUp"></event>
8024 <event name="OnMotion"></event>
8025 <event name="OnMouseEvents"></event>
8026 <event name="OnMouseWheel"></event>
8027 <event name="OnPaint"></event>
8028 <event name="OnRightDClick"></event>
8029 <event name="OnRightDown"></event>
8030 <event name="OnRightUp"></event>
8031 <event name="OnSetFocus"></event>
8032 <event name="OnSize"></event>
8033 <event name="OnText"></event>
8034 <event name="OnTextEnter"></event>
8035 <event name="OnTextMaxLen"></event>
8036 <event name="OnTextURL"></event>
8037 <event name="OnUpdateUI"></event>
8038 </object>
8039 </object>
8040 <object class="sizeritem" expanded="1">
8041 <property name="border">5</property>
8042 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
8043 <property name="proportion">0</property>
8044 <object class="wxTextCtrl" expanded="1">
8045 <property name="bg"></property>
8046 <property name="context_help"></property>
8047 <property name="enabled">1</property>
8048 <property name="fg"></property>
8049 <property name="font"></property>
8050 <property name="hidden">0</property>
8051 <property name="id">wxID_ANY</property>
8052 <property name="maximum_size">-1,-1</property>
8053 <property name="maxlength">0</property>
8054 <property name="minimum_size">-1,-1</property>
8055 <property name="name">m_textCtrlField14</property>
8056 <property name="permission">protected</property>
8057 <property name="pos"></property>
8058 <property name="size">-1,-1</property>
8059 <property name="style"></property>
8060 <property name="subclass"></property>
8061 <property name="tooltip"></property>
8062 <property name="value"></property>
8063 <property name="window_extra_style"></property>
8064 <property name="window_name"></property>
8065 <property name="window_style"></property>
8066 <event name="OnChar"></event>
8067 <event name="OnEnterWindow"></event>
8068 <event name="OnEraseBackground"></event>
8069 <event name="OnKeyDown">OnKeyDown</event>
8070 <event name="OnKeyUp"></event>
8071 <event name="OnKillFocus"></event>
8072 <event name="OnLeaveWindow"></event>
8073 <event name="OnLeftDClick"></event>
8074 <event name="OnLeftDown"></event>
8075 <event name="OnLeftUp"></event>
8076 <event name="OnMiddleDClick"></event>
8077 <event name="OnMiddleDown"></event>
8078 <event name="OnMiddleUp"></event>
8079 <event name="OnMotion"></event>
8080 <event name="OnMouseEvents"></event>
8081 <event name="OnMouseWheel"></event>
8082 <event name="OnPaint"></event>
8083 <event name="OnRightDClick"></event>
8084 <event name="OnRightDown"></event>
8085 <event name="OnRightUp"></event>
8086 <event name="OnSetFocus"></event>
8087 <event name="OnSize"></event>
8088 <event name="OnText"></event>
8089 <event name="OnTextEnter"></event>
8090 <event name="OnTextMaxLen"></event>
8091 <event name="OnTextURL"></event>
8092 <event name="OnUpdateUI"></event>
8093 </object>
8094 </object>
8095 <object class="sizeritem" expanded="1">
8096 <property name="border">5</property>
8097 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
8098 <property name="proportion">0</property>
8099 <object class="wxButton" expanded="1">
8100 <property name="bg"></property>
8101 <property name="context_help"></property>
8102 <property name="default">0</property>
8103 <property name="enabled">1</property>
8104 <property name="fg"></property>
8105 <property name="font"></property>
8106 <property name="hidden">0</property>
8107 <property name="id">wxID_DEL14</property>
8108 <property name="label">Delete</property>
8109 <property name="maximum_size"></property>
8110 <property name="minimum_size">-1,-1</property>
8111 <property name="name">m_buttonDel14</property>
8112 <property name="permission">protected</property>
8113 <property name="pos"></property>
8114 <property name="size">60,20</property>
8115 <property name="style"></property>
8116 <property name="subclass"></property>
8117 <property name="tooltip"></property>
8118 <property name="window_extra_style"></property>
8119 <property name="window_name"></property>
8120 <property name="window_style"></property>
8121 <event name="OnButtonClick">OnButtonDel14</event>
8122 <event name="OnChar"></event>
8123 <event name="OnEnterWindow"></event>
8124 <event name="OnEraseBackground"></event>
8125 <event name="OnKeyDown"></event>
8126 <event name="OnKeyUp"></event>
8127 <event name="OnKillFocus"></event>
8128 <event name="OnLeaveWindow"></event>
8129 <event name="OnLeftDClick"></event>
8130 <event name="OnLeftDown"></event>
8131 <event name="OnLeftUp"></event>
8132 <event name="OnMiddleDClick"></event>
8133 <event name="OnMiddleDown"></event>
8134 <event name="OnMiddleUp"></event>
8135 <event name="OnMotion"></event>
8136 <event name="OnMouseEvents"></event>
8137 <event name="OnMouseWheel"></event>
8138 <event name="OnPaint"></event>
8139 <event name="OnRightDClick"></event>
8140 <event name="OnRightDown"></event>
8141 <event name="OnRightUp"></event>
8142 <event name="OnSetFocus"></event>
8143 <event name="OnSize"></event>
8144 <event name="OnUpdateUI"></event>
8145 </object>
8146 </object>
8147 <object class="sizeritem" expanded="1">
8148 <property name="border">5</property>
8149 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
8150 <property name="proportion">0</property>
8151 <object class="wxTextCtrl" expanded="1">
8152 <property name="bg"></property>
8153 <property name="context_help"></property>
8154 <property name="enabled">1</property>
8155 <property name="fg"></property>
8156 <property name="font"></property>
8157 <property name="hidden">0</property>
8158 <property name="id">wxID_ANY</property>
8159 <property name="maximum_size"></property>
8160 <property name="maxlength">0</property>
8161 <property name="minimum_size">150,-1</property>
8162 <property name="name">m_textCtrlLabel15</property>
8163 <property name="permission">protected</property>
8164 <property name="pos"></property>
8165 <property name="size"></property>
8166 <property name="style"></property>
8167 <property name="subclass"></property>
8168 <property name="tooltip"></property>
8169 <property name="value"></property>
8170 <property name="window_extra_style"></property>
8171 <property name="window_name"></property>
8172 <property name="window_style"></property>
8173 <event name="OnChar"></event>
8174 <event name="OnEnterWindow"></event>
8175 <event name="OnEraseBackground"></event>
8176 <event name="OnKeyDown">OnKeyDown</event>
8177 <event name="OnKeyUp"></event>
8178 <event name="OnKillFocus"></event>
8179 <event name="OnLeaveWindow"></event>
8180 <event name="OnLeftDClick"></event>
8181 <event name="OnLeftDown"></event>
8182 <event name="OnLeftUp"></event>
8183 <event name="OnMiddleDClick"></event>
8184 <event name="OnMiddleDown"></event>
8185 <event name="OnMiddleUp"></event>
8186 <event name="OnMotion"></event>
8187 <event name="OnMouseEvents"></event>
8188 <event name="OnMouseWheel"></event>
8189 <event name="OnPaint"></event>
8190 <event name="OnRightDClick"></event>
8191 <event name="OnRightDown"></event>
8192 <event name="OnRightUp"></event>
8193 <event name="OnSetFocus"></event>
8194 <event name="OnSize"></event>
8195 <event name="OnText"></event>
8196 <event name="OnTextEnter"></event>
8197 <event name="OnTextMaxLen"></event>
8198 <event name="OnTextURL"></event>
8199 <event name="OnUpdateUI"></event>
8200 </object>
8201 </object>
8202 <object class="sizeritem" expanded="1">
8203 <property name="border">5</property>
8204 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
8205 <property name="proportion">0</property>
8206 <object class="wxTextCtrl" expanded="1">
8207 <property name="bg"></property>
8208 <property name="context_help"></property>
8209 <property name="enabled">1</property>
8210 <property name="fg"></property>
8211 <property name="font"></property>
8212 <property name="hidden">0</property>
8213 <property name="id">wxID_ANY</property>
8214 <property name="maximum_size">-1,-1</property>
8215 <property name="maxlength">0</property>
8216 <property name="minimum_size">-1,-1</property>
8217 <property name="name">m_textCtrlField15</property>
8218 <property name="permission">protected</property>
8219 <property name="pos"></property>
8220 <property name="size">-1,-1</property>
8221 <property name="style"></property>
8222 <property name="subclass"></property>
8223 <property name="tooltip"></property>
8224 <property name="value"></property>
8225 <property name="window_extra_style"></property>
8226 <property name="window_name"></property>
8227 <property name="window_style"></property>
8228 <event name="OnChar"></event>
8229 <event name="OnEnterWindow"></event>
8230 <event name="OnEraseBackground"></event>
8231 <event name="OnKeyDown">OnKeyDown</event>
8232 <event name="OnKeyUp"></event>
8233 <event name="OnKillFocus"></event>
8234 <event name="OnLeaveWindow"></event>
8235 <event name="OnLeftDClick"></event>
8236 <event name="OnLeftDown"></event>
8237 <event name="OnLeftUp"></event>
8238 <event name="OnMiddleDClick"></event>
8239 <event name="OnMiddleDown"></event>
8240 <event name="OnMiddleUp"></event>
8241 <event name="OnMotion"></event>
8242 <event name="OnMouseEvents"></event>
8243 <event name="OnMouseWheel"></event>
8244 <event name="OnPaint"></event>
8245 <event name="OnRightDClick"></event>
8246 <event name="OnRightDown"></event>
8247 <event name="OnRightUp"></event>
8248 <event name="OnSetFocus"></event>
8249 <event name="OnSize"></event>
8250 <event name="OnText"></event>
8251 <event name="OnTextEnter"></event>
8252 <event name="OnTextMaxLen"></event>
8253 <event name="OnTextURL"></event>
8254 <event name="OnUpdateUI"></event>
8255 </object>
8256 </object>
8257 <object class="sizeritem" expanded="1">
8258 <property name="border">5</property>
8259 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
8260 <property name="proportion">0</property>
8261 <object class="wxButton" expanded="1">
8262 <property name="bg"></property>
8263 <property name="context_help"></property>
8264 <property name="default">0</property>
8265 <property name="enabled">1</property>
8266 <property name="fg"></property>
8267 <property name="font"></property>
8268 <property name="hidden">0</property>
8269 <property name="id">wxID_DEL15</property>
8270 <property name="label">Delete</property>
8271 <property name="maximum_size"></property>
8272 <property name="minimum_size">-1,-1</property>
8273 <property name="name">m_buttonDel15</property>
8274 <property name="permission">protected</property>
8275 <property name="pos"></property>
8276 <property name="size">60,20</property>
8277 <property name="style"></property>
8278 <property name="subclass"></property>
8279 <property name="tooltip"></property>
8280 <property name="window_extra_style"></property>
8281 <property name="window_name"></property>
8282 <property name="window_style"></property>
8283 <event name="OnButtonClick">OnButtonDel15</event>
8284 <event name="OnChar"></event>
8285 <event name="OnEnterWindow"></event>
8286 <event name="OnEraseBackground"></event>
8287 <event name="OnKeyDown"></event>
8288 <event name="OnKeyUp"></event>
8289 <event name="OnKillFocus"></event>
8290 <event name="OnLeaveWindow"></event>
8291 <event name="OnLeftDClick"></event>
8292 <event name="OnLeftDown"></event>
8293 <event name="OnLeftUp"></event>
8294 <event name="OnMiddleDClick"></event>
8295 <event name="OnMiddleDown"></event>
8296 <event name="OnMiddleUp"></event>
8297 <event name="OnMotion"></event>
8298 <event name="OnMouseEvents"></event>
8299 <event name="OnMouseWheel"></event>
8300 <event name="OnPaint"></event>
8301 <event name="OnRightDClick"></event>
8302 <event name="OnRightDown"></event>
8303 <event name="OnRightUp"></event>
8304 <event name="OnSetFocus"></event>
8305 <event name="OnSize"></event>
8306 <event name="OnUpdateUI"></event>
8307 </object>
8308 </object>
8309 <object class="sizeritem" expanded="1">
8310 <property name="border">5</property>
8311 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
8312 <property name="proportion">0</property>
8313 <object class="wxTextCtrl" expanded="1">
8314 <property name="bg"></property>
8315 <property name="context_help"></property>
8316 <property name="enabled">1</property>
8317 <property name="fg"></property>
8318 <property name="font"></property>
8319 <property name="hidden">0</property>
8320 <property name="id">wxID_ANY</property>
8321 <property name="maximum_size"></property>
8322 <property name="maxlength">0</property>
8323 <property name="minimum_size">150,-1</property>
8324 <property name="name">m_textCtrlLabel16</property>
8325 <property name="permission">protected</property>
8326 <property name="pos"></property>
8327 <property name="size"></property>
8328 <property name="style"></property>
8329 <property name="subclass"></property>
8330 <property name="tooltip"></property>
8331 <property name="value"></property>
8332 <property name="window_extra_style"></property>
8333 <property name="window_name"></property>
8334 <property name="window_style"></property>
8335 <event name="OnChar"></event>
8336 <event name="OnEnterWindow"></event>
8337 <event name="OnEraseBackground"></event>
8338 <event name="OnKeyDown">OnKeyDown</event>
8339 <event name="OnKeyUp"></event>
8340 <event name="OnKillFocus"></event>
8341 <event name="OnLeaveWindow"></event>
8342 <event name="OnLeftDClick"></event>
8343 <event name="OnLeftDown"></event>
8344 <event name="OnLeftUp"></event>
8345 <event name="OnMiddleDClick"></event>
8346 <event name="OnMiddleDown"></event>
8347 <event name="OnMiddleUp"></event>
8348 <event name="OnMotion"></event>
8349 <event name="OnMouseEvents"></event>
8350 <event name="OnMouseWheel"></event>
8351 <event name="OnPaint"></event>
8352 <event name="OnRightDClick"></event>
8353 <event name="OnRightDown"></event>
8354 <event name="OnRightUp"></event>
8355 <event name="OnSetFocus"></event>
8356 <event name="OnSize"></event>
8357 <event name="OnText"></event>
8358 <event name="OnTextEnter"></event>
8359 <event name="OnTextMaxLen"></event>
8360 <event name="OnTextURL"></event>
8361 <event name="OnUpdateUI"></event>
8362 </object>
8363 </object>
8364 <object class="sizeritem" expanded="1">
8365 <property name="border">5</property>
8366 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
8367 <property name="proportion">0</property>
8368 <object class="wxTextCtrl" expanded="1">
8369 <property name="bg"></property>
8370 <property name="context_help"></property>
8371 <property name="enabled">1</property>
8372 <property name="fg"></property>
8373 <property name="font"></property>
8374 <property name="hidden">0</property>
8375 <property name="id">wxID_ANY</property>
8376 <property name="maximum_size">-1,-1</property>
8377 <property name="maxlength">0</property>
8378 <property name="minimum_size">-1,-1</property>
8379 <property name="name">m_textCtrlField16</property>
8380 <property name="permission">protected</property>
8381 <property name="pos"></property>
8382 <property name="size">-1,-1</property>
8383 <property name="style"></property>
8384 <property name="subclass"></property>
8385 <property name="tooltip"></property>
8386 <property name="value"></property>
8387 <property name="window_extra_style"></property>
8388 <property name="window_name"></property>
8389 <property name="window_style"></property>
8390 <event name="OnChar"></event>
8391 <event name="OnEnterWindow"></event>
8392 <event name="OnEraseBackground"></event>
8393 <event name="OnKeyDown">OnKeyDown</event>
8394 <event name="OnKeyUp"></event>
8395 <event name="OnKillFocus"></event>
8396 <event name="OnLeaveWindow"></event>
8397 <event name="OnLeftDClick"></event>
8398 <event name="OnLeftDown"></event>
8399 <event name="OnLeftUp"></event>
8400 <event name="OnMiddleDClick"></event>
8401 <event name="OnMiddleDown"></event>
8402 <event name="OnMiddleUp"></event>
8403 <event name="OnMotion"></event>
8404 <event name="OnMouseEvents"></event>
8405 <event name="OnMouseWheel"></event>
8406 <event name="OnPaint"></event>
8407 <event name="OnRightDClick"></event>
8408 <event name="OnRightDown"></event>
8409 <event name="OnRightUp"></event>
8410 <event name="OnSetFocus"></event>
8411 <event name="OnSize"></event>
8412 <event name="OnText"></event>
8413 <event name="OnTextEnter"></event>
8414 <event name="OnTextMaxLen"></event>
8415 <event name="OnTextURL"></event>
8416 <event name="OnUpdateUI"></event>
8417 </object>
8418 </object>
8419 <object class="sizeritem" expanded="1">
8420 <property name="border">5</property>
8421 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
8422 <property name="proportion">0</property>
8423 <object class="wxButton" expanded="1">
8424 <property name="bg"></property>
8425 <property name="context_help"></property>
8426 <property name="default">0</property>
8427 <property name="enabled">1</property>
8428 <property name="fg"></property>
8429 <property name="font"></property>
8430 <property name="hidden">0</property>
8431 <property name="id">wxID_DEL16</property>
8432 <property name="label">Delete</property>
8433 <property name="maximum_size"></property>
8434 <property name="minimum_size">-1,-1</property>
8435 <property name="name">m_buttonDel16</property>
8436 <property name="permission">protected</property>
8437 <property name="pos"></property>
8438 <property name="size">60,20</property>
8439 <property name="style"></property>
8440 <property name="subclass"></property>
8441 <property name="tooltip"></property>
8442 <property name="window_extra_style"></property>
8443 <property name="window_name"></property>
8444 <property name="window_style"></property>
8445 <event name="OnButtonClick">OnButtonDel16</event>
8446 <event name="OnChar"></event>
8447 <event name="OnEnterWindow"></event>
8448 <event name="OnEraseBackground"></event>
8449 <event name="OnKeyDown"></event>
8450 <event name="OnKeyUp"></event>
8451 <event name="OnKillFocus"></event>
8452 <event name="OnLeaveWindow"></event>
8453 <event name="OnLeftDClick"></event>
8454 <event name="OnLeftDown"></event>
8455 <event name="OnLeftUp"></event>
8456 <event name="OnMiddleDClick"></event>
8457 <event name="OnMiddleDown"></event>
8458 <event name="OnMiddleUp"></event>
8459 <event name="OnMotion"></event>
8460 <event name="OnMouseEvents"></event>
8461 <event name="OnMouseWheel"></event>
8462 <event name="OnPaint"></event>
8463 <event name="OnRightDClick"></event>
8464 <event name="OnRightDown"></event>
8465 <event name="OnRightUp"></event>
8466 <event name="OnSetFocus"></event>
8467 <event name="OnSize"></event>
8468 <event name="OnUpdateUI"></event>
8469 </object>
8470 </object>
8471 <object class="sizeritem" expanded="1">
8472 <property name="border">5</property>
8473 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
8474 <property name="proportion">0</property>
8475 <object class="wxTextCtrl" expanded="1">
8476 <property name="bg"></property>
8477 <property name="context_help"></property>
8478 <property name="enabled">1</property>
8479 <property name="fg"></property>
8480 <property name="font"></property>
8481 <property name="hidden">0</property>
8482 <property name="id">wxID_ANY</property>
8483 <property name="maximum_size"></property>
8484 <property name="maxlength">0</property>
8485 <property name="minimum_size">150,-1</property>
8486 <property name="name">m_textCtrlLabel17</property>
8487 <property name="permission">protected</property>
8488 <property name="pos"></property>
8489 <property name="size"></property>
8490 <property name="style"></property>
8491 <property name="subclass"></property>
8492 <property name="tooltip"></property>
8493 <property name="value"></property>
8494 <property name="window_extra_style"></property>
8495 <property name="window_name"></property>
8496 <property name="window_style"></property>
8497 <event name="OnChar"></event>
8498 <event name="OnEnterWindow"></event>
8499 <event name="OnEraseBackground"></event>
8500 <event name="OnKeyDown">OnKeyDown</event>
8501 <event name="OnKeyUp"></event>
8502 <event name="OnKillFocus"></event>
8503 <event name="OnLeaveWindow"></event>
8504 <event name="OnLeftDClick"></event>
8505 <event name="OnLeftDown"></event>
8506 <event name="OnLeftUp"></event>
8507 <event name="OnMiddleDClick"></event>
8508 <event name="OnMiddleDown"></event>
8509 <event name="OnMiddleUp"></event>
8510 <event name="OnMotion"></event>
8511 <event name="OnMouseEvents"></event>
8512 <event name="OnMouseWheel"></event>
8513 <event name="OnPaint"></event>
8514 <event name="OnRightDClick"></event>
8515 <event name="OnRightDown"></event>
8516 <event name="OnRightUp"></event>
8517 <event name="OnSetFocus"></event>
8518 <event name="OnSize"></event>
8519 <event name="OnText"></event>
8520 <event name="OnTextEnter"></event>
8521 <event name="OnTextMaxLen"></event>
8522 <event name="OnTextURL"></event>
8523 <event name="OnUpdateUI"></event>
8524 </object>
8525 </object>
8526 <object class="sizeritem" expanded="1">
8527 <property name="border">5</property>
8528 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
8529 <property name="proportion">0</property>
8530 <object class="wxTextCtrl" expanded="1">
8531 <property name="bg"></property>
8532 <property name="context_help"></property>
8533 <property name="enabled">1</property>
8534 <property name="fg"></property>
8535 <property name="font"></property>
8536 <property name="hidden">0</property>
8537 <property name="id">wxID_ANY</property>
8538 <property name="maximum_size">-1,-1</property>
8539 <property name="maxlength">0</property>
8540 <property name="minimum_size">-1,-1</property>
8541 <property name="name">m_textCtrlField17</property>
8542 <property name="permission">protected</property>
8543 <property name="pos"></property>
8544 <property name="size">-1,-1</property>
8545 <property name="style"></property>
8546 <property name="subclass"></property>
8547 <property name="tooltip"></property>
8548 <property name="value"></property>
8549 <property name="window_extra_style"></property>
8550 <property name="window_name"></property>
8551 <property name="window_style"></property>
8552 <event name="OnChar"></event>
8553 <event name="OnEnterWindow"></event>
8554 <event name="OnEraseBackground"></event>
8555 <event name="OnKeyDown">OnKeyDown</event>
8556 <event name="OnKeyUp"></event>
8557 <event name="OnKillFocus"></event>
8558 <event name="OnLeaveWindow"></event>
8559 <event name="OnLeftDClick"></event>
8560 <event name="OnLeftDown"></event>
8561 <event name="OnLeftUp"></event>
8562 <event name="OnMiddleDClick"></event>
8563 <event name="OnMiddleDown"></event>
8564 <event name="OnMiddleUp"></event>
8565 <event name="OnMotion"></event>
8566 <event name="OnMouseEvents"></event>
8567 <event name="OnMouseWheel"></event>
8568 <event name="OnPaint"></event>
8569 <event name="OnRightDClick"></event>
8570 <event name="OnRightDown"></event>
8571 <event name="OnRightUp"></event>
8572 <event name="OnSetFocus"></event>
8573 <event name="OnSize"></event>
8574 <event name="OnText"></event>
8575 <event name="OnTextEnter"></event>
8576 <event name="OnTextMaxLen"></event>
8577 <event name="OnTextURL"></event>
8578 <event name="OnUpdateUI"></event>
8579 </object>
8580 </object>
8581 <object class="sizeritem" expanded="1">
8582 <property name="border">5</property>
8583 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
8584 <property name="proportion">0</property>
8585 <object class="wxButton" expanded="1">
8586 <property name="bg"></property>
8587 <property name="context_help"></property>
8588 <property name="default">0</property>
8589 <property name="enabled">1</property>
8590 <property name="fg"></property>
8591 <property name="font"></property>
8592 <property name="hidden">0</property>
8593 <property name="id">wxID_DEL17</property>
8594 <property name="label">Delete</property>
8595 <property name="maximum_size"></property>
8596 <property name="minimum_size">-1,-1</property>
8597 <property name="name">m_buttonDel17</property>
8598 <property name="permission">protected</property>
8599 <property name="pos"></property>
8600 <property name="size">60,20</property>
8601 <property name="style"></property>
8602 <property name="subclass"></property>
8603 <property name="tooltip"></property>
8604 <property name="window_extra_style"></property>
8605 <property name="window_name"></property>
8606 <property name="window_style"></property>
8607 <event name="OnButtonClick">OnButtonDel17</event>
8608 <event name="OnChar"></event>
8609 <event name="OnEnterWindow"></event>
8610 <event name="OnEraseBackground"></event>
8611 <event name="OnKeyDown"></event>
8612 <event name="OnKeyUp"></event>
8613 <event name="OnKillFocus"></event>
8614 <event name="OnLeaveWindow"></event>
8615 <event name="OnLeftDClick"></event>
8616 <event name="OnLeftDown"></event>
8617 <event name="OnLeftUp"></event>
8618 <event name="OnMiddleDClick"></event>
8619 <event name="OnMiddleDown"></event>
8620 <event name="OnMiddleUp"></event>
8621 <event name="OnMotion"></event>
8622 <event name="OnMouseEvents"></event>
8623 <event name="OnMouseWheel"></event>
8624 <event name="OnPaint"></event>
8625 <event name="OnRightDClick"></event>
8626 <event name="OnRightDown"></event>
8627 <event name="OnRightUp"></event>
8628 <event name="OnSetFocus"></event>
8629 <event name="OnSize"></event>
8630 <event name="OnUpdateUI"></event>
8631 </object>
8632 </object>
8633 <object class="sizeritem" expanded="1">
8634 <property name="border">5</property>
8635 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
8636 <property name="proportion">0</property>
8637 <object class="wxTextCtrl" expanded="1">
8638 <property name="bg"></property>
8639 <property name="context_help"></property>
8640 <property name="enabled">1</property>
8641 <property name="fg"></property>
8642 <property name="font"></property>
8643 <property name="hidden">0</property>
8644 <property name="id">wxID_ANY</property>
8645 <property name="maximum_size"></property>
8646 <property name="maxlength">0</property>
8647 <property name="minimum_size">150,-1</property>
8648 <property name="name">m_textCtrlLabel18</property>
8649 <property name="permission">protected</property>
8650 <property name="pos"></property>
8651 <property name="size"></property>
8652 <property name="style"></property>
8653 <property name="subclass"></property>
8654 <property name="tooltip"></property>
8655 <property name="value"></property>
8656 <property name="window_extra_style"></property>
8657 <property name="window_name"></property>
8658 <property name="window_style"></property>
8659 <event name="OnChar"></event>
8660 <event name="OnEnterWindow"></event>
8661 <event name="OnEraseBackground"></event>
8662 <event name="OnKeyDown">OnKeyDown</event>
8663 <event name="OnKeyUp"></event>
8664 <event name="OnKillFocus"></event>
8665 <event name="OnLeaveWindow"></event>
8666 <event name="OnLeftDClick"></event>
8667 <event name="OnLeftDown"></event>
8668 <event name="OnLeftUp"></event>
8669 <event name="OnMiddleDClick"></event>
8670 <event name="OnMiddleDown"></event>
8671 <event name="OnMiddleUp"></event>
8672 <event name="OnMotion"></event>
8673 <event name="OnMouseEvents"></event>
8674 <event name="OnMouseWheel"></event>
8675 <event name="OnPaint"></event>
8676 <event name="OnRightDClick"></event>
8677 <event name="OnRightDown"></event>
8678 <event name="OnRightUp"></event>
8679 <event name="OnSetFocus"></event>
8680 <event name="OnSize"></event>
8681 <event name="OnText"></event>
8682 <event name="OnTextEnter"></event>
8683 <event name="OnTextMaxLen"></event>
8684 <event name="OnTextURL"></event>
8685 <event name="OnUpdateUI"></event>
8686 </object>
8687 </object>
8688 <object class="sizeritem" expanded="1">
8689 <property name="border">5</property>
8690 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
8691 <property name="proportion">0</property>
8692 <object class="wxTextCtrl" expanded="1">
8693 <property name="bg"></property>
8694 <property name="context_help"></property>
8695 <property name="enabled">1</property>
8696 <property name="fg"></property>
8697 <property name="font"></property>
8698 <property name="hidden">0</property>
8699 <property name="id">wxID_ANY</property>
8700 <property name="maximum_size">-1,-1</property>
8701 <property name="maxlength">0</property>
8702 <property name="minimum_size">-1,-1</property>
8703 <property name="name">m_textCtrlField18</property>
8704 <property name="permission">protected</property>
8705 <property name="pos"></property>
8706 <property name="size">-1,-1</property>
8707 <property name="style"></property>
8708 <property name="subclass"></property>
8709 <property name="tooltip"></property>
8710 <property name="value"></property>
8711 <property name="window_extra_style"></property>
8712 <property name="window_name"></property>
8713 <property name="window_style"></property>
8714 <event name="OnChar"></event>
8715 <event name="OnEnterWindow"></event>
8716 <event name="OnEraseBackground"></event>
8717 <event name="OnKeyDown">OnKeyDown</event>
8718 <event name="OnKeyUp"></event>
8719 <event name="OnKillFocus"></event>
8720 <event name="OnLeaveWindow"></event>
8721 <event name="OnLeftDClick"></event>
8722 <event name="OnLeftDown"></event>
8723 <event name="OnLeftUp"></event>
8724 <event name="OnMiddleDClick"></event>
8725 <event name="OnMiddleDown"></event>
8726 <event name="OnMiddleUp"></event>
8727 <event name="OnMotion"></event>
8728 <event name="OnMouseEvents"></event>
8729 <event name="OnMouseWheel"></event>
8730 <event name="OnPaint"></event>
8731 <event name="OnRightDClick"></event>
8732 <event name="OnRightDown"></event>
8733 <event name="OnRightUp"></event>
8734 <event name="OnSetFocus"></event>
8735 <event name="OnSize"></event>
8736 <event name="OnText"></event>
8737 <event name="OnTextEnter"></event>
8738 <event name="OnTextMaxLen"></event>
8739 <event name="OnTextURL"></event>
8740 <event name="OnUpdateUI"></event>
8741 </object>
8742 </object>
8743 <object class="sizeritem" expanded="1">
8744 <property name="border">5</property>
8745 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
8746 <property name="proportion">0</property>
8747 <object class="wxButton" expanded="1">
8748 <property name="bg"></property>
8749 <property name="context_help"></property>
8750 <property name="default">0</property>
8751 <property name="enabled">1</property>
8752 <property name="fg"></property>
8753 <property name="font"></property>
8754 <property name="hidden">0</property>
8755 <property name="id">wxID_DEL18</property>
8756 <property name="label">Delete</property>
8757 <property name="maximum_size"></property>
8758 <property name="minimum_size">-1,-1</property>
8759 <property name="name">m_buttonDel18</property>
8760 <property name="permission">protected</property>
8761 <property name="pos"></property>
8762 <property name="size">60,20</property>
8763 <property name="style"></property>
8764 <property name="subclass"></property>
8765 <property name="tooltip"></property>
8766 <property name="window_extra_style"></property>
8767 <property name="window_name"></property>
8768 <property name="window_style"></property>
8769 <event name="OnButtonClick">OnButtonDel18</event>
8770 <event name="OnChar"></event>
8771 <event name="OnEnterWindow"></event>
8772 <event name="OnEraseBackground"></event>
8773 <event name="OnKeyDown"></event>
8774 <event name="OnKeyUp"></event>
8775 <event name="OnKillFocus"></event>
8776 <event name="OnLeaveWindow"></event>
8777 <event name="OnLeftDClick"></event>
8778 <event name="OnLeftDown"></event>
8779 <event name="OnLeftUp"></event>
8780 <event name="OnMiddleDClick"></event>
8781 <event name="OnMiddleDown"></event>
8782 <event name="OnMiddleUp"></event>
8783 <event name="OnMotion"></event>
8784 <event name="OnMouseEvents"></event>
8785 <event name="OnMouseWheel"></event>
8786 <event name="OnPaint"></event>
8787 <event name="OnRightDClick"></event>
8788 <event name="OnRightDown"></event>
8789 <event name="OnRightUp"></event>
8790 <event name="OnSetFocus"></event>
8791 <event name="OnSize"></event>
8792 <event name="OnUpdateUI"></event>
8793 </object>
8794 </object>
8795 <object class="sizeritem" expanded="1">
8796 <property name="border">5</property>
8797 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
8798 <property name="proportion">0</property>
8799 <object class="wxTextCtrl" expanded="1">
8800 <property name="bg"></property>
8801 <property name="context_help"></property>
8802 <property name="enabled">1</property>
8803 <property name="fg"></property>
8804 <property name="font"></property>
8805 <property name="hidden">0</property>
8806 <property name="id">wxID_ANY</property>
8807 <property name="maximum_size"></property>
8808 <property name="maxlength">0</property>
8809 <property name="minimum_size">150,-1</property>
8810 <property name="name">m_textCtrlLabel19</property>
8811 <property name="permission">protected</property>
8812 <property name="pos"></property>
8813 <property name="size"></property>
8814 <property name="style"></property>
8815 <property name="subclass"></property>
8816 <property name="tooltip"></property>
8817 <property name="value"></property>
8818 <property name="window_extra_style"></property>
8819 <property name="window_name"></property>
8820 <property name="window_style"></property>
8821 <event name="OnChar"></event>
8822 <event name="OnEnterWindow"></event>
8823 <event name="OnEraseBackground"></event>
8824 <event name="OnKeyDown">OnKeyDown</event>
8825 <event name="OnKeyUp"></event>
8826 <event name="OnKillFocus"></event>
8827 <event name="OnLeaveWindow"></event>
8828 <event name="OnLeftDClick"></event>
8829 <event name="OnLeftDown"></event>
8830 <event name="OnLeftUp"></event>
8831 <event name="OnMiddleDClick"></event>
8832 <event name="OnMiddleDown"></event>
8833 <event name="OnMiddleUp"></event>
8834 <event name="OnMotion"></event>
8835 <event name="OnMouseEvents"></event>
8836 <event name="OnMouseWheel"></event>
8837 <event name="OnPaint"></event>
8838 <event name="OnRightDClick"></event>
8839 <event name="OnRightDown"></event>
8840 <event name="OnRightUp"></event>
8841 <event name="OnSetFocus"></event>
8842 <event name="OnSize"></event>
8843 <event name="OnText"></event>
8844 <event name="OnTextEnter"></event>
8845 <event name="OnTextMaxLen"></event>
8846 <event name="OnTextURL"></event>
8847 <event name="OnUpdateUI"></event>
8848 </object>
8849 </object>
8850 <object class="sizeritem" expanded="1">
8851 <property name="border">5</property>
8852 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
8853 <property name="proportion">0</property>
8854 <object class="wxTextCtrl" expanded="1">
8855 <property name="bg"></property>
8856 <property name="context_help"></property>
8857 <property name="enabled">1</property>
8858 <property name="fg"></property>
8859 <property name="font"></property>
8860 <property name="hidden">0</property>
8861 <property name="id">wxID_ANY</property>
8862 <property name="maximum_size">-1,-1</property>
8863 <property name="maxlength">0</property>
8864 <property name="minimum_size">-1,-1</property>
8865 <property name="name">m_textCtrlField19</property>
8866 <property name="permission">protected</property>
8867 <property name="pos"></property>
8868 <property name="size">-1,-1</property>
8869 <property name="style"></property>
8870 <property name="subclass"></property>
8871 <property name="tooltip"></property>
8872 <property name="value"></property>
8873 <property name="window_extra_style"></property>
8874 <property name="window_name"></property>
8875 <property name="window_style"></property>
8876 <event name="OnChar"></event>
8877 <event name="OnEnterWindow"></event>
8878 <event name="OnEraseBackground"></event>
8879 <event name="OnKeyDown">OnKeyDown</event>
8880 <event name="OnKeyUp"></event>
8881 <event name="OnKillFocus"></event>
8882 <event name="OnLeaveWindow"></event>
8883 <event name="OnLeftDClick"></event>
8884 <event name="OnLeftDown"></event>
8885 <event name="OnLeftUp"></event>
8886 <event name="OnMiddleDClick"></event>
8887 <event name="OnMiddleDown"></event>
8888 <event name="OnMiddleUp"></event>
8889 <event name="OnMotion"></event>
8890 <event name="OnMouseEvents"></event>
8891 <event name="OnMouseWheel"></event>
8892 <event name="OnPaint"></event>
8893 <event name="OnRightDClick"></event>
8894 <event name="OnRightDown"></event>
8895 <event name="OnRightUp"></event>
8896 <event name="OnSetFocus"></event>
8897 <event name="OnSize"></event>
8898 <event name="OnText"></event>
8899 <event name="OnTextEnter"></event>
8900 <event name="OnTextMaxLen"></event>
8901 <event name="OnTextURL"></event>
8902 <event name="OnUpdateUI"></event>
8903 </object>
8904 </object>
8905 <object class="sizeritem" expanded="1">
8906 <property name="border">5</property>
8907 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
8908 <property name="proportion">0</property>
8909 <object class="wxButton" expanded="1">
8910 <property name="bg"></property>
8911 <property name="context_help"></property>
8912 <property name="default">0</property>
8913 <property name="enabled">1</property>
8914 <property name="fg"></property>
8915 <property name="font"></property>
8916 <property name="hidden">0</property>
8917 <property name="id">wxID_DEL19</property>
8918 <property name="label">Delete</property>
8919 <property name="maximum_size"></property>
8920 <property name="minimum_size">-1,-1</property>
8921 <property name="name">m_buttonDel19</property>
8922 <property name="permission">protected</property>
8923 <property name="pos"></property>
8924 <property name="size">60,20</property>
8925 <property name="style"></property>
8926 <property name="subclass"></property>
8927 <property name="tooltip"></property>
8928 <property name="window_extra_style"></property>
8929 <property name="window_name"></property>
8930 <property name="window_style"></property>
8931 <event name="OnButtonClick">OnButtonDel19</event>
8932 <event name="OnChar"></event>
8933 <event name="OnEnterWindow"></event>
8934 <event name="OnEraseBackground"></event>
8935 <event name="OnKeyDown"></event>
8936 <event name="OnKeyUp"></event>
8937 <event name="OnKillFocus"></event>
8938 <event name="OnLeaveWindow"></event>
8939 <event name="OnLeftDClick"></event>
8940 <event name="OnLeftDown"></event>
8941 <event name="OnLeftUp"></event>
8942 <event name="OnMiddleDClick"></event>
8943 <event name="OnMiddleDown"></event>
8944 <event name="OnMiddleUp"></event>
8945 <event name="OnMotion"></event>
8946 <event name="OnMouseEvents"></event>
8947 <event name="OnMouseWheel"></event>
8948 <event name="OnPaint"></event>
8949 <event name="OnRightDClick"></event>
8950 <event name="OnRightDown"></event>
8951 <event name="OnRightUp"></event>
8952 <event name="OnSetFocus"></event>
8953 <event name="OnSize"></event>
8954 <event name="OnUpdateUI"></event>
8955 </object>
8956 </object>
8957 </object>
8958 </object>
8959 <object class="sizeritem" expanded="1">
8960 <property name="border">5</property>
8961 <property name="flag">wxALIGN_CENTER_HORIZONTAL</property>
8962 <property name="proportion">0</property>
8963 <object class="wxBoxSizer" expanded="1">
8964 <property name="minimum_size"></property>
8965 <property name="name">bSizer25</property>
8966 <property name="orient">wxHORIZONTAL</property>
8967 <property name="permission">none</property>
8968 <object class="sizeritem" expanded="1">
8969 <property name="border">5</property>
8970 <property name="flag">wxALL</property>
8971 <property name="proportion">0</property>
8972 <object class="wxButton" expanded="1">
8973 <property name="bg"></property>
8974 <property name="context_help"></property>
8975 <property name="default">0</property>
8976 <property name="enabled">1</property>
8977 <property name="fg"></property>
8978 <property name="font"></property>
8979 <property name="hidden">0</property>
8980 <property name="id">wxID_ANY</property>
8981 <property name="label">&amp;Add Field</property>
8982 <property name="maximum_size"></property>
8983 <property name="minimum_size"></property>
8984 <property name="name">m_buttonAddField</property>
8985 <property name="permission">protected</property>
8986 <property name="pos"></property>
8987 <property name="size"></property>
8988 <property name="style"></property>
8989 <property name="subclass"></property>
8990 <property name="tooltip"></property>
8991 <property name="window_extra_style"></property>
8992 <property name="window_name"></property>
8993 <property name="window_style"></property>
8994 <event name="OnButtonClick">OnButtonAddField</event>
8995 <event name="OnChar"></event>
8996 <event name="OnEnterWindow"></event>
8997 <event name="OnEraseBackground"></event>
8998 <event name="OnKeyDown"></event>
8999 <event name="OnKeyUp"></event>
9000 <event name="OnKillFocus"></event>
9001 <event name="OnLeaveWindow"></event>
9002 <event name="OnLeftDClick"></event>
9003 <event name="OnLeftDown"></event>
9004 <event name="OnLeftUp"></event>
9005 <event name="OnMiddleDClick"></event>
9006 <event name="OnMiddleDown"></event>
9007 <event name="OnMiddleUp"></event>
9008 <event name="OnMotion"></event>
9009 <event name="OnMouseEvents"></event>
9010 <event name="OnMouseWheel"></event>
9011 <event name="OnPaint"></event>
9012 <event name="OnRightDClick"></event>
9013 <event name="OnRightDown"></event>
9014 <event name="OnRightUp"></event>
9015 <event name="OnSetFocus"></event>
9016 <event name="OnSize"></event>
9017 <event name="OnUpdateUI"></event>
9018 </object>
9019 </object>
9020 </object>
9021 </object>
9022 </object>
9023 </object>
9024 </object>
9025 <object class="sizeritem" expanded="1">
9026 <property name="border">5</property>
9027 <property name="flag">wxALIGN_RIGHT</property>
9028 <property name="proportion">0</property>
9029 <object class="wxBoxSizer" expanded="1">
9030 <property name="minimum_size"></property>
9031 <property name="name">bSizer26</property>
9032 <property name="orient">wxHORIZONTAL</property>
9033 <property name="permission">none</property>
9034 <object class="sizeritem" expanded="1">
9035 <property name="border">5</property>
9036 <property name="flag">wxALL</property>
9037 <property name="proportion">0</property>
9038 <object class="wxButton" expanded="1">
9039 <property name="bg"></property>
9040 <property name="context_help"></property>
9041 <property name="default">0</property>
9042 <property name="enabled">1</property>
9043 <property name="fg"></property>
9044 <property name="font"></property>
9045 <property name="hidden">0</property>
9046 <property name="id">wxID_BUTTONSEND</property>
9047 <property name="label">&amp;Send</property>
9048 <property name="maximum_size"></property>
9049 <property name="minimum_size">85,25</property>
9050 <property name="name">m_buttonOK</property>
9051 <property name="permission">protected</property>
9052 <property name="pos"></property>
9053 <property name="size"></property>
9054 <property name="style"></property>
9055 <property name="subclass"></property>
9056 <property name="tooltip"></property>
9057 <property name="window_extra_style"></property>
9058 <property name="window_name"></property>
9059 <property name="window_style"></property>
9060 <event name="OnButtonClick">OnButtonSend</event>
9061 <event name="OnChar"></event>
9062 <event name="OnEnterWindow"></event>
9063 <event name="OnEraseBackground"></event>
9064 <event name="OnKeyDown"></event>
9065 <event name="OnKeyUp"></event>
9066 <event name="OnKillFocus"></event>
9067 <event name="OnLeaveWindow"></event>
9068 <event name="OnLeftDClick"></event>
9069 <event name="OnLeftDown"></event>
9070 <event name="OnLeftUp"></event>
9071 <event name="OnMiddleDClick"></event>
9072 <event name="OnMiddleDown"></event>
9073 <event name="OnMiddleUp"></event>
9074 <event name="OnMotion"></event>
9075 <event name="OnMouseEvents"></event>
9076 <event name="OnMouseWheel"></event>
9077 <event name="OnPaint"></event>
9078 <event name="OnRightDClick"></event>
9079 <event name="OnRightDown"></event>
9080 <event name="OnRightUp"></event>
9081 <event name="OnSetFocus"></event>
9082 <event name="OnSize"></event>
9083 <event name="OnUpdateUI"></event>
9084 </object>
9085 </object>
9086 <object class="sizeritem" expanded="1">
9087 <property name="border">5</property>
9088 <property name="flag">wxALL</property>
9089 <property name="proportion">0</property>
9090 <object class="wxButton" expanded="1">
9091 <property name="bg"></property>
9092 <property name="context_help"></property>
9093 <property name="default">0</property>
9094 <property name="enabled">1</property>
9095 <property name="fg"></property>
9096 <property name="font"></property>
9097 <property name="hidden">0</property>
9098 <property name="id">wxID_BUTTONPREVIEW</property>
9099 <property name="label">&amp;Preview</property>
9100 <property name="maximum_size"></property>
9101 <property name="minimum_size">85,25</property>
9102 <property name="name">m_buttonPreview</property>
9103 <property name="permission">protected</property>
9104 <property name="pos"></property>
9105 <property name="size"></property>
9106 <property name="style"></property>
9107 <property name="subclass"></property>
9108 <property name="tooltip"></property>
9109 <property name="window_extra_style"></property>
9110 <property name="window_name"></property>
9111 <property name="window_style"></property>
9112 <event name="OnButtonClick">OnButtonPreview</event>
9113 <event name="OnChar"></event>
9114 <event name="OnEnterWindow"></event>
9115 <event name="OnEraseBackground"></event>
9116 <event name="OnKeyDown"></event>
9117 <event name="OnKeyUp"></event>
9118 <event name="OnKillFocus"></event>
9119 <event name="OnLeaveWindow"></event>
9120 <event name="OnLeftDClick"></event>
9121 <event name="OnLeftDown"></event>
9122 <event name="OnLeftUp"></event>
9123 <event name="OnMiddleDClick"></event>
9124 <event name="OnMiddleDown"></event>
9125 <event name="OnMiddleUp"></event>
9126 <event name="OnMotion"></event>
9127 <event name="OnMouseEvents"></event>
9128 <event name="OnMouseWheel"></event>
9129 <event name="OnPaint"></event>
9130 <event name="OnRightDClick"></event>
9131 <event name="OnRightDown"></event>
9132 <event name="OnRightUp"></event>
9133 <event name="OnSetFocus"></event>
9134 <event name="OnSize"></event>
9135 <event name="OnUpdateUI"></event>
9136 </object>
9137 </object>
9138 <object class="sizeritem" expanded="1">
9139 <property name="border">5</property>
9140 <property name="flag">wxALL</property>
9141 <property name="proportion">0</property>
9142 <object class="wxButton" expanded="1">
9143 <property name="bg"></property>
9144 <property name="context_help"></property>
9145 <property name="default">0</property>
9146 <property name="enabled">1</property>
9147 <property name="fg"></property>
9148 <property name="font"></property>
9149 <property name="hidden">0</property>
9150 <property name="id">wxID_CANCEL</property>
9151 <property name="label">Cancel</property>
9152 <property name="maximum_size"></property>
9153 <property name="minimum_size">85,25</property>
9154 <property name="name">m_buttonCancel</property>
9155 <property name="permission">protected</property>
9156 <property name="pos"></property>
9157 <property name="size"></property>
9158 <property name="style"></property>
9159 <property name="subclass"></property>
9160 <property name="tooltip"></property>
9161 <property name="window_extra_style"></property>
9162 <property name="window_name"></property>
9163 <property name="window_style"></property>
9164 <event name="OnButtonClick">OnButtonCancel</event>
9165 <event name="OnChar"></event>
9166 <event name="OnEnterWindow"></event>
9167 <event name="OnEraseBackground"></event>
9168 <event name="OnKeyDown"></event>
9169 <event name="OnKeyUp"></event>
9170 <event name="OnKillFocus"></event>
9171 <event name="OnLeaveWindow"></event>
9172 <event name="OnLeftDClick"></event>
9173 <event name="OnLeftDown"></event>
9174 <event name="OnLeftUp"></event>
9175 <event name="OnMiddleDClick"></event>
9176 <event name="OnMiddleDown"></event>
9177 <event name="OnMiddleUp"></event>
9178 <event name="OnMotion"></event>
9179 <event name="OnMouseEvents"></event>
9180 <event name="OnMouseWheel"></event>
9181 <event name="OnPaint"></event>
9182 <event name="OnRightDClick"></event>
9183 <event name="OnRightDown"></event>
9184 <event name="OnRightUp"></event>
9185 <event name="OnSetFocus"></event>
9186 <event name="OnSize"></event>
9187 <event name="OnUpdateUI"></event>
9188 </object>
9189 </object>
9190 </object>
9191 </object>
9192 </object>
9193 </object>
9194 <object class="Frame" expanded="0">
9195 <property name="bg">wxSYS_COLOUR_MENU</property>
9196 <property name="center"></property>
9197 <property name="context_help"></property>
9198 <property name="enabled">1</property>
9199 <property name="extra_style"></property>
9200 <property name="fg"></property>
9201 <property name="font"></property>
9202 <property name="hidden">0</property>
9203 <property name="id">wxID_ANY</property>
9204 <property name="maximum_size"></property>
9205 <property name="minimum_size"></property>
9206 <property name="name">CViewProductDialogBase</property>
9207 <property name="pos"></property>
9208 <property name="size">630,520</property>
9209 <property name="style">wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER</property>
9210 <property name="subclass"></property>
9211 <property name="title">Order Form</property>
9212 <property name="tooltip"></property>
9213 <property name="window_extra_style"></property>
9214 <property name="window_name"></property>
9215 <property name="window_style">wxTAB_TRAVERSAL</property>
9216 <property name="xrc_skip_sizer">1</property>
9217 <event name="OnActivate"></event>
9218 <event name="OnActivateApp"></event>
9219 <event name="OnChar"></event>
9220 <event name="OnClose"></event>
9221 <event name="OnEnterWindow"></event>
9222 <event name="OnEraseBackground"></event>
9223 <event name="OnHibernate"></event>
9224 <event name="OnIconize"></event>
9225 <event name="OnIdle"></event>
9226 <event name="OnKeyDown"></event>
9227 <event name="OnKeyUp"></event>
9228 <event name="OnKillFocus"></event>
9229 <event name="OnLeaveWindow"></event>
9230 <event name="OnLeftDClick"></event>
9231 <event name="OnLeftDown"></event>
9232 <event name="OnLeftUp"></event>
9233 <event name="OnMiddleDClick"></event>
9234 <event name="OnMiddleDown"></event>
9235 <event name="OnMiddleUp"></event>
9236 <event name="OnMotion"></event>
9237 <event name="OnMouseEvents"></event>
9238 <event name="OnMouseWheel"></event>
9239 <event name="OnPaint"></event>
9240 <event name="OnRightDClick"></event>
9241 <event name="OnRightDown"></event>
9242 <event name="OnRightUp"></event>
9243 <event name="OnSetFocus"></event>
9244 <event name="OnSize"></event>
9245 <event name="OnUpdateUI"></event>
9246 <object class="wxBoxSizer" expanded="1">
9247 <property name="minimum_size"></property>
9248 <property name="name">bSizer20</property>
9249 <property name="orient">wxVERTICAL</property>
9250 <property name="permission">none</property>
9251 <object class="sizeritem" expanded="1">
9252 <property name="border">5</property>
9253 <property name="flag">wxEXPAND</property>
9254 <property name="proportion">1</property>
9255 <object class="wxBoxSizer" expanded="1">
9256 <property name="minimum_size"></property>
9257 <property name="name">bSizer116</property>
9258 <property name="orient">wxHORIZONTAL</property>
9259 <property name="permission">none</property>
9260 <object class="sizeritem" expanded="1">
9261 <property name="border">5</property>
9262 <property name="flag">wxALL|wxEXPAND</property>
9263 <property name="proportion">1</property>
9264 <object class="wxHtmlWindow" expanded="1">
9265 <property name="bg"></property>
9266 <property name="context_help"></property>
9267 <property name="enabled">1</property>
9268 <property name="fg"></property>
9269 <property name="font"></property>
9270 <property name="hidden">1</property>
9271 <property name="id">wxID_ANY</property>
9272 <property name="maximum_size"></property>
9273 <property name="minimum_size"></property>
9274 <property name="name">m_htmlWinReviews</property>
9275 <property name="permission">protected</property>
9276 <property name="pos"></property>
9277 <property name="size"></property>
9278 <property name="style">wxHW_SCROLLBAR_AUTO</property>
9279 <property name="subclass"></property>
9280 <property name="tooltip"></property>
9281 <property name="window_extra_style"></property>
9282 <property name="window_name"></property>
9283 <property name="window_style"></property>
9284 <event name="OnChar"></event>
9285 <event name="OnEnterWindow"></event>
9286 <event name="OnEraseBackground"></event>
9287 <event name="OnHtmlCellClicked"></event>
9288 <event name="OnHtmlCellHover"></event>
9289 <event name="OnHtmlLinkClicked"></event>
9290 <event name="OnKeyDown"></event>
9291 <event name="OnKeyUp"></event>
9292 <event name="OnKillFocus"></event>
9293 <event name="OnLeaveWindow"></event>
9294 <event name="OnLeftDClick"></event>
9295 <event name="OnLeftDown"></event>
9296 <event name="OnLeftUp"></event>
9297 <event name="OnMiddleDClick"></event>
9298 <event name="OnMiddleDown"></event>
9299 <event name="OnMiddleUp"></event>
9300 <event name="OnMotion"></event>
9301 <event name="OnMouseEvents"></event>
9302 <event name="OnMouseWheel"></event>
9303 <event name="OnPaint"></event>
9304 <event name="OnRightDClick"></event>
9305 <event name="OnRightDown"></event>
9306 <event name="OnRightUp"></event>
9307 <event name="OnSetFocus"></event>
9308 <event name="OnSize"></event>
9309 <event name="OnUpdateUI"></event>
9310 </object>
9311 </object>
9312 <object class="sizeritem" expanded="1">
9313 <property name="border">5</property>
9314 <property name="flag">wxEXPAND|wxALL</property>
9315 <property name="proportion">1</property>
9316 <object class="wxScrolledWindow" expanded="1">
9317 <property name="bg">wxSYS_COLOUR_WINDOW</property>
9318 <property name="context_help"></property>
9319 <property name="enabled">1</property>
9320 <property name="fg"></property>
9321 <property name="font"></property>
9322 <property name="hidden">0</property>
9323 <property name="id">wxID_ANY</property>
9324 <property name="maximum_size"></property>
9325 <property name="minimum_size"></property>
9326 <property name="name">m_scrolledWindow</property>
9327 <property name="permission">protected</property>
9328 <property name="pos"></property>
9329 <property name="scroll_rate_x">5</property>
9330 <property name="scroll_rate_y">5</property>
9331 <property name="size"></property>
9332 <property name="subclass"></property>
9333 <property name="tooltip"></property>
9334 <property name="window_extra_style"></property>
9335 <property name="window_name"></property>
9336 <property name="window_style">wxHSCROLL|wxTAB_TRAVERSAL|wxVSCROLL</property>
9337 <event name="OnChar"></event>
9338 <event name="OnEnterWindow"></event>
9339 <event name="OnEraseBackground"></event>
9340 <event name="OnKeyDown"></event>
9341 <event name="OnKeyUp"></event>
9342 <event name="OnKillFocus"></event>
9343 <event name="OnLeaveWindow"></event>
9344 <event name="OnLeftDClick"></event>
9345 <event name="OnLeftDown"></event>
9346 <event name="OnLeftUp"></event>
9347 <event name="OnMiddleDClick"></event>
9348 <event name="OnMiddleDown"></event>
9349 <event name="OnMiddleUp"></event>
9350 <event name="OnMotion"></event>
9351 <event name="OnMouseEvents"></event>
9352 <event name="OnMouseWheel"></event>
9353 <event name="OnPaint"></event>
9354 <event name="OnRightDClick"></event>
9355 <event name="OnRightDown"></event>
9356 <event name="OnRightUp"></event>
9357 <event name="OnSetFocus"></event>
9358 <event name="OnSize"></event>
9359 <event name="OnUpdateUI"></event>
9360 <object class="wxBoxSizer" expanded="1">
9361 <property name="minimum_size"></property>
9362 <property name="name">bSizer21</property>
9363 <property name="orient">wxVERTICAL</property>
9364 <property name="permission">none</property>
9365 <object class="sizeritem" expanded="1">
9366 <property name="border">5</property>
9367 <property name="flag">wxEXPAND</property>
9368 <property name="proportion">0</property>
9369 <object class="wxRichTextCtrl" expanded="1">
9370 <property name="bg"></property>
9371 <property name="context_help"></property>
9372 <property name="enabled">1</property>
9373 <property name="fg"></property>
9374 <property name="font"></property>
9375 <property name="hidden">0</property>
9376 <property name="id">wxID_ANY</property>
9377 <property name="maximum_size"></property>
9378 <property name="minimum_size">-1,-1</property>
9379 <property name="name">m_richTextHeading</property>
9380 <property name="permission">protected</property>
9381 <property name="pos"></property>
9382 <property name="size">-1,50</property>
9383 <property name="style">wxTE_READONLY</property>
9384 <property name="subclass"></property>
9385 <property name="tooltip"></property>
9386 <property name="window_extra_style"></property>
9387 <property name="window_name"></property>
9388 <property name="window_style">wxNO_BORDER</property>
9389 <event name="OnChar"></event>
9390 <event name="OnEnterWindow"></event>
9391 <event name="OnEraseBackground"></event>
9392 <event name="OnKeyDown"></event>
9393 <event name="OnKeyUp"></event>
9394 <event name="OnKillFocus"></event>
9395 <event name="OnLeaveWindow"></event>
9396 <event name="OnLeftDClick"></event>
9397 <event name="OnLeftDown"></event>
9398 <event name="OnLeftUp"></event>
9399 <event name="OnMiddleDClick"></event>
9400 <event name="OnMiddleDown"></event>
9401 <event name="OnMiddleUp"></event>
9402 <event name="OnMotion"></event>
9403 <event name="OnMouseEvents"></event>
9404 <event name="OnMouseWheel"></event>
9405 <event name="OnPaint"></event>
9406 <event name="OnRichTextCharacter"></event>
9407 <event name="OnRichTextContentDeleted"></event>
9408 <event name="OnRichTextContentInserted"></event>
9409 <event name="OnRichTextDelete"></event>
9410 <event name="OnRichTextReturn"></event>
9411 <event name="OnRichTextStyleChanged"></event>
9412 <event name="OnRichTextStyleSheetChanged"></event>
9413 <event name="OnRichTextStyleSheetReplaced"></event>
9414 <event name="OnRichTextStyleSheetReplacing"></event>
9415 <event name="OnRightDClick"></event>
9416 <event name="OnRightDown"></event>
9417 <event name="OnRightUp"></event>
9418 <event name="OnSetFocus"></event>
9419 <event name="OnSize"></event>
9420 <event name="OnText"></event>
9421 <event name="OnTextEnter"></event>
9422 <event name="OnTextMaxLen"></event>
9423 <event name="OnTextURL"></event>
9424 <event name="OnUpdateUI"></event>
9425 </object>
9426 </object>
9427 <object class="sizeritem" expanded="1">
9428 <property name="border">5</property>
9429 <property name="flag">wxALL|wxEXPAND</property>
9430 <property name="proportion">0</property>
9431 <object class="wxStaticText" expanded="1">
9432 <property name="bg"></property>
9433 <property name="context_help"></property>
9434 <property name="enabled">1</property>
9435 <property name="fg"></property>
9436 <property name="font"></property>
9437 <property name="hidden">0</property>
9438 <property name="id">wxID_ANY</property>
9439 <property name="label">Order Form instructions here&#x0A;multiple lines&#x0A;1&#x0A;2&#x0A;3&#x0A;4&#x0A;5&#x0A;6</property>
9440 <property name="maximum_size"></property>
9441 <property name="minimum_size"></property>
9442 <property name="name">m_staticTextInstructions</property>
9443 <property name="permission">protected</property>
9444 <property name="pos"></property>
9445 <property name="size"></property>
9446 <property name="style"></property>
9447 <property name="subclass"></property>
9448 <property name="tooltip"></property>
9449 <property name="window_extra_style"></property>
9450 <property name="window_name"></property>
9451 <property name="window_style"></property>
9452 <property name="wrap">-1</property>
9453 <event name="OnChar"></event>
9454 <event name="OnEnterWindow"></event>
9455 <event name="OnEraseBackground"></event>
9456 <event name="OnKeyDown"></event>
9457 <event name="OnKeyUp"></event>
9458 <event name="OnKillFocus"></event>
9459 <event name="OnLeaveWindow"></event>
9460 <event name="OnLeftDClick"></event>
9461 <event name="OnLeftDown"></event>
9462 <event name="OnLeftUp"></event>
9463 <event name="OnMiddleDClick"></event>
9464 <event name="OnMiddleDown"></event>
9465 <event name="OnMiddleUp"></event>
9466 <event name="OnMotion"></event>
9467 <event name="OnMouseEvents"></event>
9468 <event name="OnMouseWheel"></event>
9469 <event name="OnPaint"></event>
9470 <event name="OnRightDClick"></event>
9471 <event name="OnRightDown"></event>
9472 <event name="OnRightUp"></event>
9473 <event name="OnSetFocus"></event>
9474 <event name="OnSize"></event>
9475 <event name="OnUpdateUI"></event>
9476 </object>
9477 </object>
9478 <object class="sizeritem" expanded="1">
9479 <property name="border">5</property>
9480 <property name="flag">wxALIGN_CENTER_HORIZONTAL</property>
9481 <property name="proportion">0</property>
9482 <object class="wxBoxSizer" expanded="1">
9483 <property name="minimum_size"></property>
9484 <property name="name">bSizer25</property>
9485 <property name="orient">wxHORIZONTAL</property>
9486 <property name="permission">none</property>
9487 <object class="sizeritem" expanded="1">
9488 <property name="border">5</property>
9489 <property name="flag">wxALL</property>
9490 <property name="proportion">0</property>
9491 <object class="wxButton" expanded="1">
9492 <property name="bg"></property>
9493 <property name="context_help"></property>
9494 <property name="default">0</property>
9495 <property name="enabled">1</property>
9496 <property name="fg"></property>
9497 <property name="font"></property>
9498 <property name="hidden">0</property>
9499 <property name="id">wxID_BUTTONSAMPLE</property>
9500 <property name="label">&amp;Submit</property>
9501 <property name="maximum_size"></property>
9502 <property name="minimum_size">-1,-1</property>
9503 <property name="name">m_buttonSubmitForm</property>
9504 <property name="permission">protected</property>
9505 <property name="pos"></property>
9506 <property name="size"></property>
9507 <property name="style"></property>
9508 <property name="subclass"></property>
9509 <property name="tooltip"></property>
9510 <property name="window_extra_style"></property>
9511 <property name="window_name"></property>
9512 <property name="window_style"></property>
9513 <event name="OnButtonClick">OnButtonSubmitForm</event>
9514 <event name="OnChar"></event>
9515 <event name="OnEnterWindow"></event>
9516 <event name="OnEraseBackground"></event>
9517 <event name="OnKeyDown"></event>
9518 <event name="OnKeyUp"></event>
9519 <event name="OnKillFocus"></event>
9520 <event name="OnLeaveWindow"></event>
9521 <event name="OnLeftDClick"></event>
9522 <event name="OnLeftDown"></event>
9523 <event name="OnLeftUp"></event>
9524 <event name="OnMiddleDClick"></event>
9525 <event name="OnMiddleDown"></event>
9526 <event name="OnMiddleUp"></event>
9527 <event name="OnMotion"></event>
9528 <event name="OnMouseEvents"></event>
9529 <event name="OnMouseWheel"></event>
9530 <event name="OnPaint"></event>
9531 <event name="OnRightDClick"></event>
9532 <event name="OnRightDown"></event>
9533 <event name="OnRightUp"></event>
9534 <event name="OnSetFocus"></event>
9535 <event name="OnSize"></event>
9536 <event name="OnUpdateUI"></event>
9537 </object>
9538 </object>
9539 <object class="sizeritem" expanded="1">
9540 <property name="border">5</property>
9541 <property name="flag">wxALL</property>
9542 <property name="proportion">0</property>
9543 <object class="wxButton" expanded="1">
9544 <property name="bg"></property>
9545 <property name="context_help"></property>
9546 <property name="default">0</property>
9547 <property name="enabled">1</property>
9548 <property name="fg"></property>
9549 <property name="font"></property>
9550 <property name="hidden">0</property>
9551 <property name="id">wxID_CANCEL2</property>
9552 <property name="label">Cancel</property>
9553 <property name="maximum_size"></property>
9554 <property name="minimum_size"></property>
9555 <property name="name">m_buttonCancelForm</property>
9556 <property name="permission">protected</property>
9557 <property name="pos"></property>
9558 <property name="size"></property>
9559 <property name="style"></property>
9560 <property name="subclass"></property>
9561 <property name="tooltip"></property>
9562 <property name="window_extra_style"></property>
9563 <property name="window_name"></property>
9564 <property name="window_style"></property>
9565 <event name="OnButtonClick">OnButtonCancelForm</event>
9566 <event name="OnChar"></event>
9567 <event name="OnEnterWindow"></event>
9568 <event name="OnEraseBackground"></event>
9569 <event name="OnKeyDown"></event>
9570 <event name="OnKeyUp"></event>
9571 <event name="OnKillFocus"></event>
9572 <event name="OnLeaveWindow"></event>
9573 <event name="OnLeftDClick"></event>
9574 <event name="OnLeftDown"></event>
9575 <event name="OnLeftUp"></event>
9576 <event name="OnMiddleDClick"></event>
9577 <event name="OnMiddleDown"></event>
9578 <event name="OnMiddleUp"></event>
9579 <event name="OnMotion"></event>
9580 <event name="OnMouseEvents"></event>
9581 <event name="OnMouseWheel"></event>
9582 <event name="OnPaint"></event>
9583 <event name="OnRightDClick"></event>
9584 <event name="OnRightDown"></event>
9585 <event name="OnRightUp"></event>
9586 <event name="OnSetFocus"></event>
9587 <event name="OnSize"></event>
9588 <event name="OnUpdateUI"></event>
9589 </object>
9590 </object>
9591 </object>
9592 </object>
9593 </object>
9594 </object>
9595 </object>
9596 </object>
9597 </object>
9598 <object class="sizeritem" expanded="1">
9599 <property name="border">5</property>
9600 <property name="flag">wxALIGN_RIGHT</property>
9601 <property name="proportion">0</property>
9602 <object class="wxBoxSizer" expanded="1">
9603 <property name="minimum_size"></property>
9604 <property name="name">bSizer26</property>
9605 <property name="orient">wxHORIZONTAL</property>
9606 <property name="permission">none</property>
9607 <object class="sizeritem" expanded="1">
9608 <property name="border">5</property>
9609 <property name="flag">wxALL</property>
9610 <property name="proportion">0</property>
9611 <object class="wxButton" expanded="1">
9612 <property name="bg"></property>
9613 <property name="context_help"></property>
9614 <property name="default">0</property>
9615 <property name="enabled">0</property>
9616 <property name="fg"></property>
9617 <property name="font"></property>
9618 <property name="hidden">0</property>
9619 <property name="id">wxID_BUTTONBACK</property>
9620 <property name="label">&lt; &amp;Back </property>
9621 <property name="maximum_size"></property>
9622 <property name="minimum_size">85,25</property>
9623 <property name="name">m_buttonBack</property>
9624 <property name="permission">protected</property>
9625 <property name="pos"></property>
9626 <property name="size"></property>
9627 <property name="style"></property>
9628 <property name="subclass"></property>
9629 <property name="tooltip"></property>
9630 <property name="window_extra_style"></property>
9631 <property name="window_name"></property>
9632 <property name="window_style"></property>
9633 <event name="OnButtonClick">OnButtonBack</event>
9634 <event name="OnChar"></event>
9635 <event name="OnEnterWindow"></event>
9636 <event name="OnEraseBackground"></event>
9637 <event name="OnKeyDown"></event>
9638 <event name="OnKeyUp"></event>
9639 <event name="OnKillFocus"></event>
9640 <event name="OnLeaveWindow"></event>
9641 <event name="OnLeftDClick"></event>
9642 <event name="OnLeftDown"></event>
9643 <event name="OnLeftUp"></event>
9644 <event name="OnMiddleDClick"></event>
9645 <event name="OnMiddleDown"></event>
9646 <event name="OnMiddleUp"></event>
9647 <event name="OnMotion"></event>
9648 <event name="OnMouseEvents"></event>
9649 <event name="OnMouseWheel"></event>
9650 <event name="OnPaint"></event>
9651 <event name="OnRightDClick"></event>
9652 <event name="OnRightDown"></event>
9653 <event name="OnRightUp"></event>
9654 <event name="OnSetFocus"></event>
9655 <event name="OnSize"></event>
9656 <event name="OnUpdateUI"></event>
9657 </object>
9658 </object>
9659 <object class="sizeritem" expanded="1">
9660 <property name="border">5</property>
9661 <property name="flag">wxALL</property>
9662 <property name="proportion">0</property>
9663 <object class="wxButton" expanded="1">
9664 <property name="bg"></property>
9665 <property name="context_help"></property>
9666 <property name="default">0</property>
9667 <property name="enabled">1</property>
9668 <property name="fg"></property>
9669 <property name="font"></property>
9670 <property name="hidden">0</property>
9671 <property name="id">wxID_BUTTONNEXT</property>
9672 <property name="label"> &amp;Next &gt;</property>
9673 <property name="maximum_size"></property>
9674 <property name="minimum_size">85,25</property>
9675 <property name="name">m_buttonNext</property>
9676 <property name="permission">protected</property>
9677 <property name="pos"></property>
9678 <property name="size"></property>
9679 <property name="style"></property>
9680 <property name="subclass"></property>
9681 <property name="tooltip"></property>
9682 <property name="window_extra_style"></property>
9683 <property name="window_name"></property>
9684 <property name="window_style"></property>
9685 <event name="OnButtonClick">OnButtonNext</event>
9686 <event name="OnChar"></event>
9687 <event name="OnEnterWindow"></event>
9688 <event name="OnEraseBackground"></event>
9689 <event name="OnKeyDown"></event>
9690 <event name="OnKeyUp"></event>
9691 <event name="OnKillFocus"></event>
9692 <event name="OnLeaveWindow"></event>
9693 <event name="OnLeftDClick"></event>
9694 <event name="OnLeftDown"></event>
9695 <event name="OnLeftUp"></event>
9696 <event name="OnMiddleDClick"></event>
9697 <event name="OnMiddleDown"></event>
9698 <event name="OnMiddleUp"></event>
9699 <event name="OnMotion"></event>
9700 <event name="OnMouseEvents"></event>
9701 <event name="OnMouseWheel"></event>
9702 <event name="OnPaint"></event>
9703 <event name="OnRightDClick"></event>
9704 <event name="OnRightDown"></event>
9705 <event name="OnRightUp"></event>
9706 <event name="OnSetFocus"></event>
9707 <event name="OnSize"></event>
9708 <event name="OnUpdateUI"></event>
9709 </object>
9710 </object>
9711 <object class="sizeritem" expanded="1">
9712 <property name="border">5</property>
9713 <property name="flag">wxALL</property>
9714 <property name="proportion">0</property>
9715 <object class="wxButton" expanded="1">
9716 <property name="bg"></property>
9717 <property name="context_help"></property>
9718 <property name="default">0</property>
9719 <property name="enabled">1</property>
9720 <property name="fg"></property>
9721 <property name="font"></property>
9722 <property name="hidden">0</property>
9723 <property name="id">wxID_CANCEL</property>
9724 <property name="label">Cancel</property>
9725 <property name="maximum_size"></property>
9726 <property name="minimum_size">85,25</property>
9727 <property name="name">m_buttonCancel</property>
9728 <property name="permission">protected</property>
9729 <property name="pos"></property>
9730 <property name="size"></property>
9731 <property name="style"></property>
9732 <property name="subclass"></property>
9733 <property name="tooltip"></property>
9734 <property name="window_extra_style"></property>
9735 <property name="window_name"></property>
9736 <property name="window_style"></property>
9737 <event name="OnButtonClick">OnButtonCancel</event>
9738 <event name="OnChar"></event>
9739 <event name="OnEnterWindow"></event>
9740 <event name="OnEraseBackground"></event>
9741 <event name="OnKeyDown"></event>
9742 <event name="OnKeyUp"></event>
9743 <event name="OnKillFocus"></event>
9744 <event name="OnLeaveWindow"></event>
9745 <event name="OnLeftDClick"></event>
9746 <event name="OnLeftDown"></event>
9747 <event name="OnLeftUp"></event>
9748 <event name="OnMiddleDClick"></event>
9749 <event name="OnMiddleDown"></event>
9750 <event name="OnMiddleUp"></event>
9751 <event name="OnMotion"></event>
9752 <event name="OnMouseEvents"></event>
9753 <event name="OnMouseWheel"></event>
9754 <event name="OnPaint"></event>
9755 <event name="OnRightDClick"></event>
9756 <event name="OnRightDown"></event>
9757 <event name="OnRightUp"></event>
9758 <event name="OnSetFocus"></event>
9759 <event name="OnSize"></event>
9760 <event name="OnUpdateUI"></event>
9761 </object>
9762 </object>
9763 </object>
9764 </object>
9765 </object>
9766 </object>
9767 <object class="Frame" expanded="0">
9768 <property name="bg">wxSYS_COLOUR_MENU</property>
9769 <property name="center"></property>
9770 <property name="context_help"></property>
9771 <property name="enabled">1</property>
9772 <property name="extra_style"></property>
9773 <property name="fg"></property>
9774 <property name="font"></property>
9775 <property name="hidden">0</property>
9776 <property name="id">wxID_ANY</property>
9777 <property name="maximum_size"></property>
9778 <property name="minimum_size"></property>
9779 <property name="name">CViewOrderDialogBase</property>
9780 <property name="pos"></property>
9781 <property name="size">630,520</property>
9782 <property name="style">wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER</property>
9783 <property name="subclass"></property>
9784 <property name="title">View Order</property>
9785 <property name="tooltip"></property>
9786 <property name="window_extra_style"></property>
9787 <property name="window_name"></property>
9788 <property name="window_style">wxTAB_TRAVERSAL</property>
9789 <property name="xrc_skip_sizer">1</property>
9790 <event name="OnActivate"></event>
9791 <event name="OnActivateApp"></event>
9792 <event name="OnChar"></event>
9793 <event name="OnClose"></event>
9794 <event name="OnEnterWindow"></event>
9795 <event name="OnEraseBackground"></event>
9796 <event name="OnHibernate"></event>
9797 <event name="OnIconize"></event>
9798 <event name="OnIdle"></event>
9799 <event name="OnKeyDown"></event>
9800 <event name="OnKeyUp"></event>
9801 <event name="OnKillFocus"></event>
9802 <event name="OnLeaveWindow"></event>
9803 <event name="OnLeftDClick"></event>
9804 <event name="OnLeftDown"></event>
9805 <event name="OnLeftUp"></event>
9806 <event name="OnMiddleDClick"></event>
9807 <event name="OnMiddleDown"></event>
9808 <event name="OnMiddleUp"></event>
9809 <event name="OnMotion"></event>
9810 <event name="OnMouseEvents"></event>
9811 <event name="OnMouseWheel"></event>
9812 <event name="OnPaint"></event>
9813 <event name="OnRightDClick"></event>
9814 <event name="OnRightDown"></event>
9815 <event name="OnRightUp"></event>
9816 <event name="OnSetFocus"></event>
9817 <event name="OnSize"></event>
9818 <event name="OnUpdateUI"></event>
9819 <object class="wxBoxSizer" expanded="1">
9820 <property name="minimum_size"></property>
9821 <property name="name">bSizer20</property>
9822 <property name="orient">wxVERTICAL</property>
9823 <property name="permission">none</property>
9824 <object class="sizeritem" expanded="1">
9825 <property name="border">5</property>
9826 <property name="flag">wxEXPAND</property>
9827 <property name="proportion">1</property>
9828 <object class="wxBoxSizer" expanded="1">
9829 <property name="minimum_size"></property>
9830 <property name="name">bSizer116</property>
9831 <property name="orient">wxHORIZONTAL</property>
9832 <property name="permission">none</property>
9833 <object class="sizeritem" expanded="1">
9834 <property name="border">5</property>
9835 <property name="flag">wxALL|wxEXPAND</property>
9836 <property name="proportion">1</property>
9837 <object class="wxHtmlWindow" expanded="1">
9838 <property name="bg"></property>
9839 <property name="context_help"></property>
9840 <property name="enabled">1</property>
9841 <property name="fg"></property>
9842 <property name="font"></property>
9843 <property name="hidden">0</property>
9844 <property name="id">wxID_ANY</property>
9845 <property name="maximum_size"></property>
9846 <property name="minimum_size"></property>
9847 <property name="name">m_htmlWin</property>
9848 <property name="permission">protected</property>
9849 <property name="pos"></property>
9850 <property name="size"></property>
9851 <property name="style">wxHW_SCROLLBAR_AUTO</property>
9852 <property name="subclass"></property>
9853 <property name="tooltip"></property>
9854 <property name="window_extra_style"></property>
9855 <property name="window_name"></property>
9856 <property name="window_style"></property>
9857 <event name="OnChar"></event>
9858 <event name="OnEnterWindow"></event>
9859 <event name="OnEraseBackground"></event>
9860 <event name="OnHtmlCellClicked"></event>
9861 <event name="OnHtmlCellHover"></event>
9862 <event name="OnHtmlLinkClicked"></event>
9863 <event name="OnKeyDown"></event>
9864 <event name="OnKeyUp"></event>
9865 <event name="OnKillFocus"></event>
9866 <event name="OnLeaveWindow"></event>
9867 <event name="OnLeftDClick"></event>
9868 <event name="OnLeftDown"></event>
9869 <event name="OnLeftUp"></event>
9870 <event name="OnMiddleDClick"></event>
9871 <event name="OnMiddleDown"></event>
9872 <event name="OnMiddleUp"></event>
9873 <event name="OnMotion"></event>
9874 <event name="OnMouseEvents"></event>
9875 <event name="OnMouseWheel"></event>
9876 <event name="OnPaint"></event>
9877 <event name="OnRightDClick"></event>
9878 <event name="OnRightDown"></event>
9879 <event name="OnRightUp"></event>
9880 <event name="OnSetFocus"></event>
9881 <event name="OnSize"></event>
9882 <event name="OnUpdateUI"></event>
9883 </object>
9884 </object>
9885 </object>
9886 </object>
9887 <object class="sizeritem" expanded="1">
9888 <property name="border">5</property>
9889 <property name="flag">wxALIGN_RIGHT</property>
9890 <property name="proportion">0</property>
9891 <object class="wxBoxSizer" expanded="1">
9892 <property name="minimum_size"></property>
9893 <property name="name">bSizer26</property>
9894 <property name="orient">wxHORIZONTAL</property>
9895 <property name="permission">none</property>
9896 <object class="sizeritem" expanded="1">
9897 <property name="border">5</property>
9898 <property name="flag">wxALL</property>
9899 <property name="proportion">0</property>
9900 <object class="wxButton" expanded="1">
9901 <property name="bg"></property>
9902 <property name="context_help"></property>
9903 <property name="default">0</property>
9904 <property name="enabled">1</property>
9905 <property name="fg"></property>
9906 <property name="font"></property>
9907 <property name="hidden">0</property>
9908 <property name="id">wxID_OK</property>
9909 <property name="label">OK</property>
9910 <property name="maximum_size"></property>
9911 <property name="minimum_size">85,25</property>
9912 <property name="name">m_buttonOK</property>
9913 <property name="permission">protected</property>
9914 <property name="pos"></property>
9915 <property name="size"></property>
9916 <property name="style"></property>
9917 <property name="subclass"></property>
9918 <property name="tooltip"></property>
9919 <property name="window_extra_style"></property>
9920 <property name="window_name"></property>
9921 <property name="window_style"></property>
9922 <event name="OnButtonClick">OnButtonOK</event>
9923 <event name="OnChar"></event>
9924 <event name="OnEnterWindow"></event>
9925 <event name="OnEraseBackground"></event>
9926 <event name="OnKeyDown"></event>
9927 <event name="OnKeyUp"></event>
9928 <event name="OnKillFocus"></event>
9929 <event name="OnLeaveWindow"></event>
9930 <event name="OnLeftDClick"></event>
9931 <event name="OnLeftDown"></event>
9932 <event name="OnLeftUp"></event>
9933 <event name="OnMiddleDClick"></event>
9934 <event name="OnMiddleDown"></event>
9935 <event name="OnMiddleUp"></event>
9936 <event name="OnMotion"></event>
9937 <event name="OnMouseEvents"></event>
9938 <event name="OnMouseWheel"></event>
9939 <event name="OnPaint"></event>
9940 <event name="OnRightDClick"></event>
9941 <event name="OnRightDown"></event>
9942 <event name="OnRightUp"></event>
9943 <event name="OnSetFocus"></event>
9944 <event name="OnSize"></event>
9945 <event name="OnUpdateUI"></event>
9946 </object>
9947 </object>
9948 </object>
9949 </object>
9950 </object>
9951 </object>
9952 <object class="Frame" expanded="0">
9953 <property name="bg">wxSYS_COLOUR_MENU</property>
9954 <property name="center"></property>
9955 <property name="context_help"></property>
9956 <property name="enabled">1</property>
9957 <property name="extra_style"></property>
9958 <property name="fg"></property>
9959 <property name="font"></property>
9960 <property name="hidden">0</property>
9961 <property name="id">wxID_ANY</property>
9962 <property name="maximum_size"></property>
9963 <property name="minimum_size"></property>
9964 <property name="name">CEditReviewDialogBase</property>
9965 <property name="pos"></property>
9966 <property name="size">630,440</property>
9967 <property name="style">wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER</property>
9968 <property name="subclass"></property>
9969 <property name="title">Enter Review</property>
9970 <property name="tooltip"></property>
9971 <property name="window_extra_style"></property>
9972 <property name="window_name"></property>
9973 <property name="window_style">wxTAB_TRAVERSAL</property>
9974 <property name="xrc_skip_sizer">1</property>
9975 <event name="OnActivate"></event>
9976 <event name="OnActivateApp"></event>
9977 <event name="OnChar"></event>
9978 <event name="OnClose"></event>
9979 <event name="OnEnterWindow"></event>
9980 <event name="OnEraseBackground"></event>
9981 <event name="OnHibernate"></event>
9982 <event name="OnIconize"></event>
9983 <event name="OnIdle"></event>
9984 <event name="OnKeyDown"></event>
9985 <event name="OnKeyUp"></event>
9986 <event name="OnKillFocus"></event>
9987 <event name="OnLeaveWindow"></event>
9988 <event name="OnLeftDClick"></event>
9989 <event name="OnLeftDown"></event>
9990 <event name="OnLeftUp"></event>
9991 <event name="OnMiddleDClick"></event>
9992 <event name="OnMiddleDown"></event>
9993 <event name="OnMiddleUp"></event>
9994 <event name="OnMotion"></event>
9995 <event name="OnMouseEvents"></event>
9996 <event name="OnMouseWheel"></event>
9997 <event name="OnPaint"></event>
9998 <event name="OnRightDClick"></event>
9999 <event name="OnRightDown"></event>
10000 <event name="OnRightUp"></event>
10001 <event name="OnSetFocus"></event>
10002 <event name="OnSize"></event>
10003 <event name="OnUpdateUI"></event>
10004 <object class="wxBoxSizer" expanded="1">
10005 <property name="minimum_size"></property>
10006 <property name="name">bSizer112</property>
10007 <property name="orient">wxVERTICAL</property>
10008 <property name="permission">none</property>
10009 <object class="sizeritem" expanded="1">
10010 <property name="border">5</property>
10011 <property name="flag"></property>
10012 <property name="proportion">0</property>
10013 <object class="spacer" expanded="1">
10014 <property name="height">3</property>
10015 <property name="permission">protected</property>
10016 <property name="width">0</property>
10017 </object>
10018 </object>
10019 <object class="sizeritem" expanded="1">
10020 <property name="border">5</property>
10021 <property name="flag">wxALL|wxEXPAND</property>
10022 <property name="proportion">0</property>
10023 <object class="wxStaticText" expanded="1">
10024 <property name="bg"></property>
10025 <property name="context_help"></property>
10026 <property name="enabled">1</property>
10027 <property name="fg"></property>
10028 <property name="font"></property>
10029 <property name="hidden">0</property>
10030 <property name="id">wxID_ANY</property>
10031 <property name="label"></property>
10032 <property name="maximum_size"></property>
10033 <property name="minimum_size"></property>
10034 <property name="name">m_staticTextSeller</property>
10035 <property name="permission">protected</property>
10036 <property name="pos"></property>
10037 <property name="size"></property>
10038 <property name="style"></property>
10039 <property name="subclass"></property>
10040 <property name="tooltip"></property>
10041 <property name="window_extra_style"></property>
10042 <property name="window_name"></property>
10043 <property name="window_style"></property>
10044 <property name="wrap">-1</property>
10045 <event name="OnChar"></event>
10046 <event name="OnEnterWindow"></event>
10047 <event name="OnEraseBackground"></event>
10048 <event name="OnKeyDown"></event>
10049 <event name="OnKeyUp"></event>
10050 <event name="OnKillFocus"></event>
10051 <event name="OnLeaveWindow"></event>
10052 <event name="OnLeftDClick"></event>
10053 <event name="OnLeftDown"></event>
10054 <event name="OnLeftUp"></event>
10055 <event name="OnMiddleDClick"></event>
10056 <event name="OnMiddleDown"></event>
10057 <event name="OnMiddleUp"></event>
10058 <event name="OnMotion"></event>
10059 <event name="OnMouseEvents"></event>
10060 <event name="OnMouseWheel"></event>
10061 <event name="OnPaint"></event>
10062 <event name="OnRightDClick"></event>
10063 <event name="OnRightDown"></event>
10064 <event name="OnRightUp"></event>
10065 <event name="OnSetFocus"></event>
10066 <event name="OnSize"></event>
10067 <event name="OnUpdateUI"></event>
10068 </object>
10069 </object>
10070 <object class="sizeritem" expanded="1">
10071 <property name="border">5</property>
10072 <property name="flag"></property>
10073 <property name="proportion">0</property>
10074 <object class="spacer" expanded="1">
10075 <property name="height">3</property>
10076 <property name="permission">protected</property>
10077 <property name="width">0</property>
10078 </object>
10079 </object>
10080 <object class="sizeritem" expanded="1">
10081 <property name="border">5</property>
10082 <property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
10083 <property name="proportion">0</property>
10084 <object class="wxStaticText" expanded="1">
10085 <property name="bg"></property>
10086 <property name="context_help"></property>
10087 <property name="enabled">1</property>
10088 <property name="fg"></property>
10089 <property name="font"></property>
10090 <property name="hidden">0</property>
10091 <property name="id">wxID_ANY</property>
10092 <property name="label">Rating</property>
10093 <property name="maximum_size"></property>
10094 <property name="minimum_size"></property>
10095 <property name="name">m_staticText110</property>
10096 <property name="permission">protected</property>
10097 <property name="pos"></property>
10098 <property name="size"></property>
10099 <property name="style"></property>
10100 <property name="subclass"></property>
10101 <property name="tooltip"></property>
10102 <property name="window_extra_style"></property>
10103 <property name="window_name"></property>
10104 <property name="window_style"></property>
10105 <property name="wrap">-1</property>
10106 <event name="OnChar"></event>
10107 <event name="OnEnterWindow"></event>
10108 <event name="OnEraseBackground"></event>
10109 <event name="OnKeyDown"></event>
10110 <event name="OnKeyUp"></event>
10111 <event name="OnKillFocus"></event>
10112 <event name="OnLeaveWindow"></event>
10113 <event name="OnLeftDClick"></event>
10114 <event name="OnLeftDown"></event>
10115 <event name="OnLeftUp"></event>
10116 <event name="OnMiddleDClick"></event>
10117 <event name="OnMiddleDown"></event>
10118 <event name="OnMiddleUp"></event>
10119 <event name="OnMotion"></event>
10120 <event name="OnMouseEvents"></event>
10121 <event name="OnMouseWheel"></event>
10122 <event name="OnPaint"></event>
10123 <event name="OnRightDClick"></event>
10124 <event name="OnRightDown"></event>
10125 <event name="OnRightUp"></event>
10126 <event name="OnSetFocus"></event>
10127 <event name="OnSize"></event>
10128 <event name="OnUpdateUI"></event>
10129 </object>
10130 </object>
10131 <object class="sizeritem" expanded="1">
10132 <property name="border">5</property>
10133 <property name="flag">wxALL</property>
10134 <property name="proportion">0</property>
10135 <object class="wxChoice" expanded="1">
10136 <property name="bg"></property>
10137 <property name="choices">&quot; 1 star&quot; &quot; 2 stars&quot; &quot; 3 stars&quot; &quot; 4 stars&quot; &quot; 5 stars&quot;</property>
10138 <property name="context_help"></property>
10139 <property name="enabled">1</property>
10140 <property name="fg"></property>
10141 <property name="font"></property>
10142 <property name="hidden">0</property>
10143 <property name="id">wxID_ANY</property>
10144 <property name="maximum_size"></property>
10145 <property name="minimum_size"></property>
10146 <property name="name">m_choiceStars</property>
10147 <property name="permission">protected</property>
10148 <property name="pos"></property>
10149 <property name="selection">0</property>
10150 <property name="size"></property>
10151 <property name="subclass"></property>
10152 <property name="tooltip"></property>
10153 <property name="window_extra_style"></property>
10154 <property name="window_name"></property>
10155 <property name="window_style"></property>
10156 <event name="OnChar"></event>
10157 <event name="OnChoice"></event>
10158 <event name="OnEnterWindow"></event>
10159 <event name="OnEraseBackground"></event>
10160 <event name="OnKeyDown"></event>
10161 <event name="OnKeyUp"></event>
10162 <event name="OnKillFocus"></event>
10163 <event name="OnLeaveWindow"></event>
10164 <event name="OnLeftDClick"></event>
10165 <event name="OnLeftDown"></event>
10166 <event name="OnLeftUp"></event>
10167 <event name="OnMiddleDClick"></event>
10168 <event name="OnMiddleDown"></event>
10169 <event name="OnMiddleUp"></event>
10170 <event name="OnMotion"></event>
10171 <event name="OnMouseEvents"></event>
10172 <event name="OnMouseWheel"></event>
10173 <event name="OnPaint"></event>
10174 <event name="OnRightDClick"></event>
10175 <event name="OnRightDown"></event>
10176 <event name="OnRightUp"></event>
10177 <event name="OnSetFocus"></event>
10178 <event name="OnSize"></event>
10179 <event name="OnUpdateUI"></event>
10180 </object>
10181 </object>
10182 <object class="sizeritem" expanded="1">
10183 <property name="border">5</property>
10184 <property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
10185 <property name="proportion">0</property>
10186 <object class="wxStaticText" expanded="1">
10187 <property name="bg"></property>
10188 <property name="context_help"></property>
10189 <property name="enabled">1</property>
10190 <property name="fg"></property>
10191 <property name="font"></property>
10192 <property name="hidden">0</property>
10193 <property name="id">wxID_ANY</property>
10194 <property name="label">Review</property>
10195 <property name="maximum_size"></property>
10196 <property name="minimum_size"></property>
10197 <property name="name">m_staticText43</property>
10198 <property name="permission">protected</property>
10199 <property name="pos"></property>
10200 <property name="size"></property>
10201 <property name="style"></property>
10202 <property name="subclass"></property>
10203 <property name="tooltip"></property>
10204 <property name="window_extra_style"></property>
10205 <property name="window_name"></property>
10206 <property name="window_style"></property>
10207 <property name="wrap">-1</property>
10208 <event name="OnChar"></event>
10209 <event name="OnEnterWindow"></event>
10210 <event name="OnEraseBackground"></event>
10211 <event name="OnKeyDown"></event>
10212 <event name="OnKeyUp"></event>
10213 <event name="OnKillFocus"></event>
10214 <event name="OnLeaveWindow"></event>
10215 <event name="OnLeftDClick"></event>
10216 <event name="OnLeftDown"></event>
10217 <event name="OnLeftUp"></event>
10218 <event name="OnMiddleDClick"></event>
10219 <event name="OnMiddleDown"></event>
10220 <event name="OnMiddleUp"></event>
10221 <event name="OnMotion"></event>
10222 <event name="OnMouseEvents"></event>
10223 <event name="OnMouseWheel"></event>
10224 <event name="OnPaint"></event>
10225 <event name="OnRightDClick"></event>
10226 <event name="OnRightDown"></event>
10227 <event name="OnRightUp"></event>
10228 <event name="OnSetFocus"></event>
10229 <event name="OnSize"></event>
10230 <event name="OnUpdateUI"></event>
10231 </object>
10232 </object>
10233 <object class="sizeritem" expanded="1">
10234 <property name="border">5</property>
10235 <property name="flag">wxALL|wxEXPAND</property>
10236 <property name="proportion">1</property>
10237 <object class="wxTextCtrl" expanded="1">
10238 <property name="bg"></property>
10239 <property name="context_help"></property>
10240 <property name="enabled">1</property>
10241 <property name="fg"></property>
10242 <property name="font"></property>
10243 <property name="hidden">0</property>
10244 <property name="id">wxID_ANY</property>
10245 <property name="maximum_size"></property>
10246 <property name="maxlength">0</property>
10247 <property name="minimum_size"></property>
10248 <property name="name">m_textCtrlReview</property>
10249 <property name="permission">protected</property>
10250 <property name="pos"></property>
10251 <property name="size"></property>
10252 <property name="style">wxTE_MULTILINE</property>
10253 <property name="subclass"></property>
10254 <property name="tooltip"></property>
10255 <property name="value"></property>
10256 <property name="window_extra_style"></property>
10257 <property name="window_name"></property>
10258 <property name="window_style"></property>
10259 <event name="OnChar"></event>
10260 <event name="OnEnterWindow"></event>
10261 <event name="OnEraseBackground"></event>
10262 <event name="OnKeyDown">OnKeyDown</event>
10263 <event name="OnKeyUp"></event>
10264 <event name="OnKillFocus"></event>
10265 <event name="OnLeaveWindow"></event>
10266 <event name="OnLeftDClick"></event>
10267 <event name="OnLeftDown"></event>
10268 <event name="OnLeftUp"></event>
10269 <event name="OnMiddleDClick"></event>
10270 <event name="OnMiddleDown"></event>
10271 <event name="OnMiddleUp"></event>
10272 <event name="OnMotion"></event>
10273 <event name="OnMouseEvents"></event>
10274 <event name="OnMouseWheel"></event>
10275 <event name="OnPaint"></event>
10276 <event name="OnRightDClick"></event>
10277 <event name="OnRightDown"></event>
10278 <event name="OnRightUp"></event>
10279 <event name="OnSetFocus"></event>
10280 <event name="OnSize"></event>
10281 <event name="OnText"></event>
10282 <event name="OnTextEnter"></event>
10283 <event name="OnTextMaxLen"></event>
10284 <event name="OnTextURL"></event>
10285 <event name="OnUpdateUI"></event>
10286 </object>
10287 </object>
10288 <object class="sizeritem" expanded="1">
10289 <property name="border">5</property>
10290 <property name="flag">wxALIGN_RIGHT</property>
10291 <property name="proportion">0</property>
10292 <object class="wxBoxSizer" expanded="1">
10293 <property name="minimum_size"></property>
10294 <property name="name">bSizer113</property>
10295 <property name="orient">wxHORIZONTAL</property>
10296 <property name="permission">none</property>
10297 <object class="sizeritem" expanded="1">
10298 <property name="border">5</property>
10299 <property name="flag">wxALL</property>
10300 <property name="proportion">0</property>
10301 <object class="wxButton" expanded="1">
10302 <property name="bg"></property>
10303 <property name="context_help"></property>
10304 <property name="default">0</property>
10305 <property name="enabled">1</property>
10306 <property name="fg"></property>
10307 <property name="font"></property>
10308 <property name="hidden">0</property>
10309 <property name="id">wxID_SUBMIT</property>
10310 <property name="label">&amp;Submit</property>
10311 <property name="maximum_size"></property>
10312 <property name="minimum_size">85,25</property>
10313 <property name="name">m_buttonSubmit</property>
10314 <property name="permission">protected</property>
10315 <property name="pos"></property>
10316 <property name="size"></property>
10317 <property name="style"></property>
10318 <property name="subclass"></property>
10319 <property name="tooltip"></property>
10320 <property name="window_extra_style"></property>
10321 <property name="window_name"></property>
10322 <property name="window_style"></property>
10323 <event name="OnButtonClick">OnButtonSubmit</event>
10324 <event name="OnChar"></event>
10325 <event name="OnEnterWindow"></event>
10326 <event name="OnEraseBackground"></event>
10327 <event name="OnKeyDown"></event>
10328 <event name="OnKeyUp"></event>
10329 <event name="OnKillFocus"></event>
10330 <event name="OnLeaveWindow"></event>
10331 <event name="OnLeftDClick"></event>
10332 <event name="OnLeftDown"></event>
10333 <event name="OnLeftUp"></event>
10334 <event name="OnMiddleDClick"></event>
10335 <event name="OnMiddleDown"></event>
10336 <event name="OnMiddleUp"></event>
10337 <event name="OnMotion"></event>
10338 <event name="OnMouseEvents"></event>
10339 <event name="OnMouseWheel"></event>
10340 <event name="OnPaint"></event>
10341 <event name="OnRightDClick"></event>
10342 <event name="OnRightDown"></event>
10343 <event name="OnRightUp"></event>
10344 <event name="OnSetFocus"></event>
10345 <event name="OnSize"></event>
10346 <event name="OnUpdateUI"></event>
10347 </object>
10348 </object>
10349 <object class="sizeritem" expanded="1">
10350 <property name="border">5</property>
10351 <property name="flag">wxALL</property>
10352 <property name="proportion">0</property>
10353 <object class="wxButton" expanded="1">
10354 <property name="bg"></property>
10355 <property name="context_help"></property>
10356 <property name="default">0</property>
10357 <property name="enabled">1</property>
10358 <property name="fg"></property>
10359 <property name="font"></property>
10360 <property name="hidden">0</property>
10361 <property name="id">wxID_CANCEL</property>
10362 <property name="label">Cancel</property>
10363 <property name="maximum_size"></property>
10364 <property name="minimum_size">85,25</property>
10365 <property name="name">m_buttonCancel</property>
10366 <property name="permission">protected</property>
10367 <property name="pos"></property>
10368 <property name="size"></property>
10369 <property name="style"></property>
10370 <property name="subclass"></property>
10371 <property name="tooltip"></property>
10372 <property name="window_extra_style"></property>
10373 <property name="window_name"></property>
10374 <property name="window_style"></property>
10375 <event name="OnButtonClick">OnButtonCancel</event>
10376 <event name="OnChar"></event>
10377 <event name="OnEnterWindow"></event>
10378 <event name="OnEraseBackground"></event>
10379 <event name="OnKeyDown"></event>
10380 <event name="OnKeyUp"></event>
10381 <event name="OnKillFocus"></event>
10382 <event name="OnLeaveWindow"></event>
10383 <event name="OnLeftDClick"></event>
10384 <event name="OnLeftDown"></event>
10385 <event name="OnLeftUp"></event>
10386 <event name="OnMiddleDClick"></event>
10387 <event name="OnMiddleDown"></event>
10388 <event name="OnMiddleUp"></event>
10389 <event name="OnMotion"></event>
10390 <event name="OnMouseEvents"></event>
10391 <event name="OnMouseWheel"></event>
10392 <event name="OnPaint"></event>
10393 <event name="OnRightDClick"></event>
10394 <event name="OnRightDown"></event>
10395 <event name="OnRightUp"></event>
10396 <event name="OnSetFocus"></event>
10397 <event name="OnSize"></event>
10398 <event name="OnUpdateUI"></event>
10399 </object>
10400 </object>
10401 </object>
10402 </object>
10403 </object>
10404 </object>
10405 <object class="Frame" expanded="0">
10406 <property name="bg">wxSYS_COLOUR_BTNFACE</property>
10407 <property name="center"></property>
10408 <property name="context_help"></property>
10409 <property name="enabled">1</property>
10410 <property name="extra_style"></property>
10411 <property name="fg"></property>
10412 <property name="font"></property>
10413 <property name="hidden">0</property>
10414 <property name="id">wxID_ANY</property>
10415 <property name="maximum_size"></property>
10416 <property name="minimum_size"></property>
10417 <property name="name">CPokerLobbyDialogBase</property>
10418 <property name="pos"></property>
10419 <property name="size">586,457</property>
10420 <property name="style">wxDEFAULT_FRAME_STYLE</property>
10421 <property name="subclass"></property>
10422 <property name="title">Poker Lobby</property>
10423 <property name="tooltip"></property>
10424 <property name="window_extra_style"></property>
10425 <property name="window_name"></property>
10426 <property name="window_style">wxTAB_TRAVERSAL</property>
10427 <property name="xrc_skip_sizer">1</property>
10428 <event name="OnActivate"></event>
10429 <event name="OnActivateApp"></event>
10430 <event name="OnChar"></event>
10431 <event name="OnClose"></event>
10432 <event name="OnEnterWindow"></event>
10433 <event name="OnEraseBackground"></event>
10434 <event name="OnHibernate"></event>
10435 <event name="OnIconize"></event>
10436 <event name="OnIdle"></event>
10437 <event name="OnKeyDown"></event>
10438 <event name="OnKeyUp"></event>
10439 <event name="OnKillFocus"></event>
10440 <event name="OnLeaveWindow"></event>
10441 <event name="OnLeftDClick"></event>
10442 <event name="OnLeftDown"></event>
10443 <event name="OnLeftUp"></event>
10444 <event name="OnMiddleDClick"></event>
10445 <event name="OnMiddleDown"></event>
10446 <event name="OnMiddleUp"></event>
10447 <event name="OnMotion"></event>
10448 <event name="OnMouseEvents"></event>
10449 <event name="OnMouseWheel"></event>
10450 <event name="OnPaint"></event>
10451 <event name="OnRightDClick"></event>
10452 <event name="OnRightDown"></event>
10453 <event name="OnRightUp"></event>
10454 <event name="OnSetFocus"></event>
10455 <event name="OnSize"></event>
10456 <event name="OnUpdateUI"></event>
10457 <object class="wxBoxSizer" expanded="1">
10458 <property name="minimum_size"></property>
10459 <property name="name">bSizer156</property>
10460 <property name="orient">wxHORIZONTAL</property>
10461 <property name="permission">none</property>
10462 <object class="sizeritem" expanded="1">
10463 <property name="border">5</property>
10464 <property name="flag">wxEXPAND|wxTOP|wxBOTTOM|wxLEFT</property>
10465 <property name="proportion">0</property>
10466 <object class="wxTreeCtrl" expanded="1">
10467 <property name="bg"></property>
10468 <property name="context_help"></property>
10469 <property name="enabled">1</property>
10470 <property name="fg"></property>
10471 <property name="font"></property>
10472 <property name="hidden">0</property>
10473 <property name="id">wxID_ANY</property>
10474 <property name="maximum_size"></property>
10475 <property name="minimum_size">130,-1</property>
10476 <property name="name">m_treeCtrl</property>
10477 <property name="permission">protected</property>
10478 <property name="pos"></property>
10479 <property name="size"></property>
10480 <property name="style">wxTR_HAS_BUTTONS|wxTR_HIDE_ROOT|wxTR_LINES_AT_ROOT</property>
10481 <property name="subclass"></property>
10482 <property name="tooltip"></property>
10483 <property name="window_extra_style"></property>
10484 <property name="window_name"></property>
10485 <property name="window_style"></property>
10486 <event name="OnChar"></event>
10487 <event name="OnEnterWindow"></event>
10488 <event name="OnEraseBackground"></event>
10489 <event name="OnKeyDown"></event>
10490 <event name="OnKeyUp"></event>
10491 <event name="OnKillFocus"></event>
10492 <event name="OnLeaveWindow"></event>
10493 <event name="OnLeftDClick"></event>
10494 <event name="OnLeftDown"></event>
10495 <event name="OnLeftUp"></event>
10496 <event name="OnMiddleDClick"></event>
10497 <event name="OnMiddleDown"></event>
10498 <event name="OnMiddleUp"></event>
10499 <event name="OnMotion"></event>
10500 <event name="OnMouseEvents"></event>
10501 <event name="OnMouseWheel"></event>
10502 <event name="OnPaint"></event>
10503 <event name="OnRightDClick"></event>
10504 <event name="OnRightDown"></event>
10505 <event name="OnRightUp"></event>
10506 <event name="OnSetFocus"></event>
10507 <event name="OnSize"></event>
10508 <event name="OnTreeBeginDrag"></event>
10509 <event name="OnTreeBeginLabelEdit"></event>
10510 <event name="OnTreeBeginRDrag"></event>
10511 <event name="OnTreeDeleteItem"></event>
10512 <event name="OnTreeEndDrag"></event>
10513 <event name="OnTreeEndLabelEdit"></event>
10514 <event name="OnTreeGetInfo"></event>
10515 <event name="OnTreeItemActivated"></event>
10516 <event name="OnTreeItemCollapsed"></event>
10517 <event name="OnTreeItemCollapsing"></event>
10518 <event name="OnTreeItemExpanded"></event>
10519 <event name="OnTreeItemExpanding"></event>
10520 <event name="OnTreeItemGetTooltip"></event>
10521 <event name="OnTreeItemMenu"></event>
10522 <event name="OnTreeItemMiddleClick"></event>
10523 <event name="OnTreeItemRightClick"></event>
10524 <event name="OnTreeKeyDown"></event>
10525 <event name="OnTreeSelChanged">OnTreeSelChanged</event>
10526 <event name="OnTreeSelChanging"></event>
10527 <event name="OnTreeSetInfo"></event>
10528 <event name="OnTreeStateImageClick"></event>
10529 <event name="OnUpdateUI"></event>
10530 </object>
10531 </object>
10532 <object class="sizeritem" expanded="1">
10533 <property name="border">5</property>
10534 <property name="flag">wxEXPAND</property>
10535 <property name="proportion">1</property>
10536 <object class="wxBoxSizer" expanded="1">
10537 <property name="minimum_size"></property>
10538 <property name="name">bSizer172</property>
10539 <property name="orient">wxVERTICAL</property>
10540 <property name="permission">none</property>
10541 <object class="sizeritem" expanded="1">
10542 <property name="border">5</property>
10543 <property name="flag">wxEXPAND|wxALL</property>
10544 <property name="proportion">1</property>
10545 <object class="wxListCtrl" expanded="1">
10546 <property name="bg"></property>
10547 <property name="context_help"></property>
10548 <property name="enabled">1</property>
10549 <property name="fg"></property>
10550 <property name="font"></property>
10551 <property name="hidden">0</property>
10552 <property name="id">wxID_ANY</property>
10553 <property name="maximum_size"></property>
10554 <property name="minimum_size"></property>
10555 <property name="name">m_listCtrl</property>
10556 <property name="permission">protected</property>
10557 <property name="pos"></property>
10558 <property name="size"></property>
10559 <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT</property>
10560 <property name="subclass"></property>
10561 <property name="tooltip"></property>
10562 <property name="window_extra_style"></property>
10563 <property name="window_name"></property>
10564 <property name="window_style"></property>
10565 <event name="OnChar"></event>
10566 <event name="OnEnterWindow"></event>
10567 <event name="OnEraseBackground"></event>
10568 <event name="OnKeyDown"></event>
10569 <event name="OnKeyUp"></event>
10570 <event name="OnKillFocus"></event>
10571 <event name="OnLeaveWindow"></event>
10572 <event name="OnLeftDClick"></event>
10573 <event name="OnLeftDown"></event>
10574 <event name="OnLeftUp"></event>
10575 <event name="OnListBeginDrag"></event>
10576 <event name="OnListBeginLabelEdit"></event>
10577 <event name="OnListBeginRDrag"></event>
10578 <event name="OnListCacheHint"></event>
10579 <event name="OnListColBeginDrag"></event>
10580 <event name="OnListColClick"></event>
10581 <event name="OnListColDragging"></event>
10582 <event name="OnListColEndDrag"></event>
10583 <event name="OnListColRightClick"></event>
10584 <event name="OnListDeleteAllItems"></event>
10585 <event name="OnListDeleteItem"></event>
10586 <event name="OnListEndLabelEdit"></event>
10587 <event name="OnListInsertItem"></event>
10588 <event name="OnListItemActivated">OnListItemActivated</event>
10589 <event name="OnListItemDeselected"></event>
10590 <event name="OnListItemFocused"></event>
10591 <event name="OnListItemMiddleClick"></event>
10592 <event name="OnListItemRightClick"></event>
10593 <event name="OnListItemSelected">OnListItemSelected</event>
10594 <event name="OnListKeyDown"></event>
10595 <event name="OnMiddleDClick"></event>
10596 <event name="OnMiddleDown"></event>
10597 <event name="OnMiddleUp"></event>
10598 <event name="OnMotion"></event>
10599 <event name="OnMouseEvents"></event>
10600 <event name="OnMouseWheel"></event>
10601 <event name="OnPaint"></event>
10602 <event name="OnRightDClick"></event>
10603 <event name="OnRightDown"></event>
10604 <event name="OnRightUp"></event>
10605 <event name="OnSetFocus"></event>
10606 <event name="OnSize"></event>
10607 <event name="OnUpdateUI"></event>
10608 </object>
10609 </object>
10610 <object class="sizeritem" expanded="1">
10611 <property name="border">5</property>
10612 <property name="flag">wxALL</property>
10613 <property name="proportion">0</property>
10614 <object class="wxButton" expanded="1">
10615 <property name="bg"></property>
10616 <property name="context_help"></property>
10617 <property name="default">0</property>
10618 <property name="enabled">1</property>
10619 <property name="fg"></property>
10620 <property name="font"></property>
10621 <property name="hidden">0</property>
10622 <property name="id">wxID_OPENNEWTABLE</property>
10623 <property name="label">&amp;Open New Table</property>
10624 <property name="maximum_size"></property>
10625 <property name="minimum_size"></property>
10626 <property name="name">m_buttonNewTable</property>
10627 <property name="permission">protected</property>
10628 <property name="pos"></property>
10629 <property name="size"></property>
10630 <property name="style"></property>
10631 <property name="subclass"></property>
10632 <property name="tooltip"></property>
10633 <property name="window_extra_style"></property>
10634 <property name="window_name"></property>
10635 <property name="window_style"></property>
10636 <event name="OnButtonClick">OnButtonNewTable</event>
10637 <event name="OnChar"></event>
10638 <event name="OnEnterWindow"></event>
10639 <event name="OnEraseBackground"></event>
10640 <event name="OnKeyDown"></event>
10641 <event name="OnKeyUp"></event>
10642 <event name="OnKillFocus"></event>
10643 <event name="OnLeaveWindow"></event>
10644 <event name="OnLeftDClick"></event>
10645 <event name="OnLeftDown"></event>
10646 <event name="OnLeftUp"></event>
10647 <event name="OnMiddleDClick"></event>
10648 <event name="OnMiddleDown"></event>
10649 <event name="OnMiddleUp"></event>
10650 <event name="OnMotion"></event>
10651 <event name="OnMouseEvents"></event>
10652 <event name="OnMouseWheel"></event>
10653 <event name="OnPaint"></event>
10654 <event name="OnRightDClick"></event>
10655 <event name="OnRightDown"></event>
10656 <event name="OnRightUp"></event>
10657 <event name="OnSetFocus"></event>
10658 <event name="OnSize"></event>
10659 <event name="OnUpdateUI"></event>
10660 </object>
10661 </object>
10662 </object>
10663 </object>
10664 </object>
10665 </object>
10666 <object class="Frame" expanded="0">
10667 <property name="bg"></property>
10668 <property name="center"></property>
10669 <property name="context_help"></property>
10670 <property name="enabled">1</property>
10671 <property name="extra_style"></property>
10672 <property name="fg"></property>
10673 <property name="font"></property>
10674 <property name="hidden">0</property>
10675 <property name="id">wxID_ANY</property>
10676 <property name="maximum_size"></property>
10677 <property name="minimum_size"></property>
10678 <property name="name">CPokerDialogBase</property>
10679 <property name="pos"></property>
10680 <property name="size">806,550</property>
10681 <property name="style">wxDEFAULT_FRAME_STYLE|wxFRAME_NO_TASKBAR</property>
10682 <property name="subclass"></property>
10683 <property name="title">Poker</property>
10684 <property name="tooltip"></property>
10685 <property name="window_extra_style"></property>
10686 <property name="window_name"></property>
10687 <property name="window_style">wxFULL_REPAINT_ON_RESIZE|wxTAB_TRAVERSAL</property>
10688 <property name="xrc_skip_sizer">1</property>
10689 <event name="OnActivate"></event>
10690 <event name="OnActivateApp"></event>
10691 <event name="OnChar"></event>
10692 <event name="OnClose">OnClose</event>
10693 <event name="OnEnterWindow"></event>
10694 <event name="OnEraseBackground"></event>
10695 <event name="OnHibernate"></event>
10696 <event name="OnIconize"></event>
10697 <event name="OnIdle"></event>
10698 <event name="OnKeyDown"></event>
10699 <event name="OnKeyUp"></event>
10700 <event name="OnKillFocus"></event>
10701 <event name="OnLeaveWindow"></event>
10702 <event name="OnLeftDClick"></event>
10703 <event name="OnLeftDown"></event>
10704 <event name="OnLeftUp"></event>
10705 <event name="OnMiddleDClick"></event>
10706 <event name="OnMiddleDown"></event>
10707 <event name="OnMiddleUp"></event>
10708 <event name="OnMotion"></event>
10709 <event name="OnMouseEvents">OnMouseEvents</event>
10710 <event name="OnMouseWheel"></event>
10711 <event name="OnPaint">OnPaint</event>
10712 <event name="OnRightDClick"></event>
10713 <event name="OnRightDown"></event>
10714 <event name="OnRightUp"></event>
10715 <event name="OnSetFocus"></event>
10716 <event name="OnSize">OnSize</event>
10717 <event name="OnUpdateUI"></event>
10718 <object class="wxBoxSizer" expanded="1">
10719 <property name="minimum_size"></property>
10720 <property name="name">bSizer174</property>
10721 <property name="orient">wxVERTICAL</property>
10722 <property name="permission">none</property>
10723 <object class="sizeritem" expanded="1">
10724 <property name="border">5</property>
10725 <property name="flag">wxALL</property>
10726 <property name="proportion">0</property>
10727 <object class="wxCheckBox" expanded="1">
10728 <property name="bg"></property>
10729 <property name="checked">0</property>
10730 <property name="context_help"></property>
10731 <property name="enabled">1</property>
10732 <property name="fg"></property>
10733 <property name="font"></property>
10734 <property name="hidden">0</property>
10735 <property name="id">wxID_ANY</property>
10736 <property name="label">Deal Me Out</property>
10737 <property name="maximum_size"></property>
10738 <property name="minimum_size"></property>
10739 <property name="name">m_checkSitOut</property>
10740 <property name="permission">public</property>
10741 <property name="pos"></property>
10742 <property name="size"></property>
10743 <property name="style"></property>
10744 <property name="subclass"></property>
10745 <property name="tooltip"></property>
10746 <property name="window_extra_style"></property>
10747 <property name="window_name"></property>
10748 <property name="window_style"></property>
10749 <event name="OnChar"></event>
10750 <event name="OnCheckBox">OnCheckSitOut</event>
10751 <event name="OnEnterWindow"></event>
10752 <event name="OnEraseBackground"></event>
10753 <event name="OnKeyDown"></event>
10754 <event name="OnKeyUp"></event>
10755 <event name="OnKillFocus"></event>
10756 <event name="OnLeaveWindow"></event>
10757 <event name="OnLeftDClick"></event>
10758 <event name="OnLeftDown"></event>
10759 <event name="OnLeftUp"></event>
10760 <event name="OnMiddleDClick"></event>
10761 <event name="OnMiddleDown"></event>
10762 <event name="OnMiddleUp"></event>
10763 <event name="OnMotion"></event>
10764 <event name="OnMouseEvents"></event>
10765 <event name="OnMouseWheel"></event>
10766 <event name="OnPaint"></event>
10767 <event name="OnRightDClick"></event>
10768 <event name="OnRightDown"></event>
10769 <event name="OnRightUp"></event>
10770 <event name="OnSetFocus"></event>
10771 <event name="OnSize"></event>
10772 <event name="OnUpdateUI"></event>
10773 </object>
10774 </object>
10775 <object class="sizeritem" expanded="1">
10776 <property name="border">5</property>
10777 <property name="flag">wxALL</property>
10778 <property name="proportion">0</property>
10779 <object class="wxButton" expanded="1">
10780 <property name="bg"></property>
10781 <property name="context_help"></property>
10782 <property name="default">0</property>
10783 <property name="enabled">1</property>
10784 <property name="fg"></property>
10785 <property name="font"></property>
10786 <property name="hidden">0</property>
10787 <property name="id">wxID_DEALHAND</property>
10788 <property name="label">&amp;Deal Hand</property>
10789 <property name="maximum_size"></property>
10790 <property name="minimum_size"></property>
10791 <property name="name">m_buttonDealHand</property>
10792 <property name="permission">protected</property>
10793 <property name="pos"></property>
10794 <property name="size">150,25</property>
10795 <property name="style"></property>
10796 <property name="subclass"></property>
10797 <property name="tooltip"></property>
10798 <property name="window_extra_style"></property>
10799 <property name="window_name"></property>
10800 <property name="window_style"></property>
10801 <event name="OnButtonClick">OnButtonDealHand</event>
10802 <event name="OnChar"></event>
10803 <event name="OnEnterWindow"></event>
10804 <event name="OnEraseBackground"></event>
10805 <event name="OnKeyDown"></event>
10806 <event name="OnKeyUp"></event>
10807 <event name="OnKillFocus"></event>
10808 <event name="OnLeaveWindow"></event>
10809 <event name="OnLeftDClick"></event>
10810 <event name="OnLeftDown"></event>
10811 <event name="OnLeftUp"></event>
10812 <event name="OnMiddleDClick"></event>
10813 <event name="OnMiddleDown"></event>
10814 <event name="OnMiddleUp"></event>
10815 <event name="OnMotion"></event>
10816 <event name="OnMouseEvents"></event>
10817 <event name="OnMouseWheel"></event>
10818 <event name="OnPaint"></event>
10819 <event name="OnRightDClick"></event>
10820 <event name="OnRightDown"></event>
10821 <event name="OnRightUp"></event>
10822 <event name="OnSetFocus"></event>
10823 <event name="OnSize"></event>
10824 <event name="OnUpdateUI"></event>
10825 </object>
10826 </object>
10827 <object class="sizeritem" expanded="1">
10828 <property name="border">5</property>
10829 <property name="flag">wxALL</property>
10830 <property name="proportion">0</property>
10831 <object class="wxButton" expanded="1">
10832 <property name="bg"></property>
10833 <property name="context_help"></property>
10834 <property name="default">0</property>
10835 <property name="enabled">1</property>
10836 <property name="fg"></property>
10837 <property name="font"></property>
10838 <property name="hidden">0</property>
10839 <property name="id">wxID_FOLD</property>
10840 <property name="label">&amp;Fold</property>
10841 <property name="maximum_size"></property>
10842 <property name="minimum_size"></property>
10843 <property name="name">m_buttonFold</property>
10844 <property name="permission">protected</property>
10845 <property name="pos"></property>
10846 <property name="size">80,25</property>
10847 <property name="style"></property>
10848 <property name="subclass"></property>
10849 <property name="tooltip"></property>
10850 <property name="window_extra_style"></property>
10851 <property name="window_name"></property>
10852 <property name="window_style"></property>
10853 <event name="OnButtonClick">OnButtonFold</event>
10854 <event name="OnChar"></event>
10855 <event name="OnEnterWindow"></event>
10856 <event name="OnEraseBackground"></event>
10857 <event name="OnKeyDown"></event>
10858 <event name="OnKeyUp"></event>
10859 <event name="OnKillFocus"></event>
10860 <event name="OnLeaveWindow"></event>
10861 <event name="OnLeftDClick"></event>
10862 <event name="OnLeftDown"></event>
10863 <event name="OnLeftUp"></event>
10864 <event name="OnMiddleDClick"></event>
10865 <event name="OnMiddleDown"></event>
10866 <event name="OnMiddleUp"></event>
10867 <event name="OnMotion"></event>
10868 <event name="OnMouseEvents"></event>
10869 <event name="OnMouseWheel"></event>
10870 <event name="OnPaint"></event>
10871 <event name="OnRightDClick"></event>
10872 <event name="OnRightDown"></event>
10873 <event name="OnRightUp"></event>
10874 <event name="OnSetFocus"></event>
10875 <event name="OnSize"></event>
10876 <event name="OnUpdateUI"></event>
10877 </object>
10878 </object>
10879 <object class="sizeritem" expanded="1">
10880 <property name="border">5</property>
10881 <property name="flag">wxALL</property>
10882 <property name="proportion">0</property>
10883 <object class="wxButton" expanded="1">
10884 <property name="bg"></property>
10885 <property name="context_help"></property>
10886 <property name="default">0</property>
10887 <property name="enabled">1</property>
10888 <property name="fg"></property>
10889 <property name="font"></property>
10890 <property name="hidden">0</property>
10891 <property name="id">wxID_CALL</property>
10892 <property name="label">&amp;Call</property>
10893 <property name="maximum_size"></property>
10894 <property name="minimum_size"></property>
10895 <property name="name">m_buttonCall</property>
10896 <property name="permission">protected</property>
10897 <property name="pos"></property>
10898 <property name="size">80,25</property>
10899 <property name="style"></property>
10900 <property name="subclass"></property>
10901 <property name="tooltip"></property>
10902 <property name="window_extra_style"></property>
10903 <property name="window_name"></property>
10904 <property name="window_style"></property>
10905 <event name="OnButtonClick">OnButtonCall</event>
10906 <event name="OnChar"></event>
10907 <event name="OnEnterWindow"></event>
10908 <event name="OnEraseBackground"></event>
10909 <event name="OnKeyDown"></event>
10910 <event name="OnKeyUp"></event>
10911 <event name="OnKillFocus"></event>
10912 <event name="OnLeaveWindow"></event>
10913 <event name="OnLeftDClick"></event>
10914 <event name="OnLeftDown"></event>
10915 <event name="OnLeftUp"></event>
10916 <event name="OnMiddleDClick"></event>
10917 <event name="OnMiddleDown"></event>
10918 <event name="OnMiddleUp"></event>
10919 <event name="OnMotion"></event>
10920 <event name="OnMouseEvents"></event>
10921 <event name="OnMouseWheel"></event>
10922 <event name="OnPaint"></event>
10923 <event name="OnRightDClick"></event>
10924 <event name="OnRightDown"></event>
10925 <event name="OnRightUp"></event>
10926 <event name="OnSetFocus"></event>
10927 <event name="OnSize"></event>
10928 <event name="OnUpdateUI"></event>
10929 </object>
10930 </object>
10931 <object class="sizeritem" expanded="1">
10932 <property name="border">5</property>
10933 <property name="flag">wxALL</property>
10934 <property name="proportion">0</property>
10935 <object class="wxButton" expanded="1">
10936 <property name="bg"></property>
10937 <property name="context_help"></property>
10938 <property name="default">0</property>
10939 <property name="enabled">1</property>
10940 <property name="fg"></property>
10941 <property name="font"></property>
10942 <property name="hidden">0</property>
10943 <property name="id">wxID_RAISE</property>
10944 <property name="label">&amp;Raise</property>
10945 <property name="maximum_size"></property>
10946 <property name="minimum_size"></property>
10947 <property name="name">m_buttonRaise</property>
10948 <property name="permission">protected</property>
10949 <property name="pos"></property>
10950 <property name="size">80,25</property>
10951 <property name="style"></property>
10952 <property name="subclass"></property>
10953 <property name="tooltip"></property>
10954 <property name="window_extra_style"></property>
10955 <property name="window_name"></property>
10956 <property name="window_style"></property>
10957 <event name="OnButtonClick">OnButtonRaise</event>
10958 <event name="OnChar"></event>
10959 <event name="OnEnterWindow"></event>
10960 <event name="OnEraseBackground"></event>
10961 <event name="OnKeyDown"></event>
10962 <event name="OnKeyUp"></event>
10963 <event name="OnKillFocus"></event>
10964 <event name="OnLeaveWindow"></event>
10965 <event name="OnLeftDClick"></event>
10966 <event name="OnLeftDown"></event>
10967 <event name="OnLeftUp"></event>
10968 <event name="OnMiddleDClick"></event>
10969 <event name="OnMiddleDown"></event>
10970 <event name="OnMiddleUp"></event>
10971 <event name="OnMotion"></event>
10972 <event name="OnMouseEvents"></event>
10973 <event name="OnMouseWheel"></event>
10974 <event name="OnPaint"></event>
10975 <event name="OnRightDClick"></event>
10976 <event name="OnRightDown"></event>
10977 <event name="OnRightUp"></event>
10978 <event name="OnSetFocus"></event>
10979 <event name="OnSize"></event>
10980 <event name="OnUpdateUI"></event>
10981 </object>
10982 </object>
10983 <object class="sizeritem" expanded="1">
10984 <property name="border">5</property>
10985 <property name="flag">wxALL</property>
10986 <property name="proportion">0</property>
10987 <object class="wxButton" expanded="1">
10988 <property name="bg"></property>
10989 <property name="context_help"></property>
10990 <property name="default">0</property>
10991 <property name="enabled">1</property>
10992 <property name="fg"></property>
10993 <property name="font"></property>
10994 <property name="hidden">0</property>
10995 <property name="id">wxID_LEAVETABLE</property>
10996 <property name="label">&amp;Leave Table</property>
10997 <property name="maximum_size"></property>
10998 <property name="minimum_size"></property>
10999 <property name="name">m_buttonLeaveTable</property>
11000 <property name="permission">protected</property>
11001 <property name="pos"></property>
11002 <property name="size">90,25</property>
11003 <property name="style"></property>
11004 <property name="subclass"></property>
11005 <property name="tooltip"></property>
11006 <property name="window_extra_style"></property>
11007 <property name="window_name"></property>
11008 <property name="window_style"></property>
11009 <event name="OnButtonClick">OnButtonLeaveTable</event>
11010 <event name="OnChar"></event>
11011 <event name="OnEnterWindow"></event>
11012 <event name="OnEraseBackground"></event>
11013 <event name="OnKeyDown"></event>
11014 <event name="OnKeyUp"></event>
11015 <event name="OnKillFocus"></event>
11016 <event name="OnLeaveWindow"></event>
11017 <event name="OnLeftDClick"></event>
11018 <event name="OnLeftDown"></event>
11019 <event name="OnLeftUp"></event>
11020 <event name="OnMiddleDClick"></event>
11021 <event name="OnMiddleDown"></event>
11022 <event name="OnMiddleUp"></event>
11023 <event name="OnMotion"></event>
11024 <event name="OnMouseEvents"></event>
11025 <event name="OnMouseWheel"></event>
11026 <event name="OnPaint"></event>
11027 <event name="OnRightDClick"></event>
11028 <event name="OnRightDown"></event>
11029 <event name="OnRightUp"></event>
11030 <event name="OnSetFocus"></event>
11031 <event name="OnSize"></event>
11032 <event name="OnUpdateUI"></event>
11033 </object>
11034 </object>
11035 <object class="sizeritem" expanded="1">
11036 <property name="border">5</property>
11037 <property name="flag">wxALL</property>
11038 <property name="proportion">0</property>
11039 <object class="wxTextCtrl" expanded="1">
11040 <property name="bg"></property>
11041 <property name="context_help"></property>
11042 <property name="enabled">1</property>
11043 <property name="fg"></property>
11044 <property name="font"></property>
11045 <property name="hidden">0</property>
11046 <property name="id">wxID_DITCHPLAYER</property>
11047 <property name="maximum_size"></property>
11048 <property name="maxlength">0</property>
11049 <property name="minimum_size"></property>
11050 <property name="name">m_textDitchPlayer</property>
11051 <property name="permission">protected</property>
11052 <property name="pos"></property>
11053 <property name="size">45,-1</property>
11054 <property name="style">wxTE_PROCESS_ENTER</property>
11055 <property name="subclass"></property>
11056 <property name="tooltip"></property>
11057 <property name="value"></property>
11058 <property name="window_extra_style"></property>
11059 <property name="window_name"></property>
11060 <property name="window_style"></property>
11061 <event name="OnChar"></event>
11062 <event name="OnEnterWindow"></event>
11063 <event name="OnEraseBackground"></event>
11064 <event name="OnKeyDown"></event>
11065 <event name="OnKeyUp"></event>
11066 <event name="OnKillFocus"></event>
11067 <event name="OnLeaveWindow"></event>
11068 <event name="OnLeftDClick"></event>
11069 <event name="OnLeftDown"></event>
11070 <event name="OnLeftUp"></event>
11071 <event name="OnMiddleDClick"></event>
11072 <event name="OnMiddleDown"></event>
11073 <event name="OnMiddleUp"></event>
11074 <event name="OnMotion"></event>
11075 <event name="OnMouseEvents"></event>
11076 <event name="OnMouseWheel"></event>
11077 <event name="OnPaint"></event>
11078 <event name="OnRightDClick"></event>
11079 <event name="OnRightDown"></event>
11080 <event name="OnRightUp"></event>
11081 <event name="OnSetFocus"></event>
11082 <event name="OnSize"></event>
11083 <event name="OnText"></event>
11084 <event name="OnTextEnter">OnDitchPlayer</event>
11085 <event name="OnTextMaxLen"></event>
11086 <event name="OnTextURL"></event>
11087 <event name="OnUpdateUI"></event>
11088 </object>
11089 </object>
11090 <object class="sizeritem" expanded="1">
11091 <property name="border">5</property>
11092 <property name="flag">wxALL</property>
11093 <property name="proportion">0</property>
11094 <object class="wxCheckBox" expanded="1">
11095 <property name="bg"></property>
11096 <property name="checked">0</property>
11097 <property name="context_help"></property>
11098 <property name="enabled">1</property>
11099 <property name="fg"></property>
11100 <property name="font"></property>
11101 <property name="hidden">0</property>
11102 <property name="id">wxID_ANY</property>
11103 <property name="label">FOLD</property>
11104 <property name="maximum_size"></property>
11105 <property name="minimum_size"></property>
11106 <property name="name">m_checkPreFold</property>
11107 <property name="permission">public</property>
11108 <property name="pos"></property>
11109 <property name="size">100,-1</property>
11110 <property name="style"></property>
11111 <property name="subclass"></property>
11112 <property name="tooltip"></property>
11113 <property name="window_extra_style"></property>
11114 <property name="window_name"></property>
11115 <property name="window_style"></property>
11116 <event name="OnChar"></event>
11117 <event name="OnCheckBox">OnCheckPreFold</event>
11118 <event name="OnEnterWindow"></event>
11119 <event name="OnEraseBackground"></event>
11120 <event name="OnKeyDown"></event>
11121 <event name="OnKeyUp"></event>
11122 <event name="OnKillFocus"></event>
11123 <event name="OnLeaveWindow"></event>
11124 <event name="OnLeftDClick"></event>
11125 <event name="OnLeftDown"></event>
11126 <event name="OnLeftUp"></event>
11127 <event name="OnMiddleDClick"></event>
11128 <event name="OnMiddleDown"></event>
11129 <event name="OnMiddleUp"></event>
11130 <event name="OnMotion"></event>
11131 <event name="OnMouseEvents"></event>
11132 <event name="OnMouseWheel"></event>
11133 <event name="OnPaint"></event>
11134 <event name="OnRightDClick"></event>
11135 <event name="OnRightDown"></event>
11136 <event name="OnRightUp"></event>
11137 <event name="OnSetFocus"></event>
11138 <event name="OnSize"></event>
11139 <event name="OnUpdateUI"></event>
11140 </object>
11141 </object>
11142 <object class="sizeritem" expanded="1">
11143 <property name="border">5</property>
11144 <property name="flag">wxALL</property>
11145 <property name="proportion">0</property>
11146 <object class="wxCheckBox" expanded="1">
11147 <property name="bg"></property>
11148 <property name="checked">0</property>
11149 <property name="context_help"></property>
11150 <property name="enabled">1</property>
11151 <property name="fg"></property>
11152 <property name="font"></property>
11153 <property name="hidden">0</property>
11154 <property name="id">wxID_ANY</property>
11155 <property name="label">CALL</property>
11156 <property name="maximum_size"></property>
11157 <property name="minimum_size"></property>
11158 <property name="name">m_checkPreCall</property>
11159 <property name="permission">public</property>
11160 <property name="pos"></property>
11161 <property name="size">100,-1</property>
11162 <property name="style"></property>
11163 <property name="subclass"></property>
11164 <property name="tooltip"></property>
11165 <property name="window_extra_style"></property>
11166 <property name="window_name"></property>
11167 <property name="window_style"></property>
11168 <event name="OnChar"></event>
11169 <event name="OnCheckBox">OnCheckPreCall</event>
11170 <event name="OnEnterWindow"></event>
11171 <event name="OnEraseBackground"></event>
11172 <event name="OnKeyDown"></event>
11173 <event name="OnKeyUp"></event>
11174 <event name="OnKillFocus"></event>
11175 <event name="OnLeaveWindow"></event>
11176 <event name="OnLeftDClick"></event>
11177 <event name="OnLeftDown"></event>
11178 <event name="OnLeftUp"></event>
11179 <event name="OnMiddleDClick"></event>
11180 <event name="OnMiddleDown"></event>
11181 <event name="OnMiddleUp"></event>
11182 <event name="OnMotion"></event>
11183 <event name="OnMouseEvents"></event>
11184 <event name="OnMouseWheel"></event>
11185 <event name="OnPaint"></event>
11186 <event name="OnRightDClick"></event>
11187 <event name="OnRightDown"></event>
11188 <event name="OnRightUp"></event>
11189 <event name="OnSetFocus"></event>
11190 <event name="OnSize"></event>
11191 <event name="OnUpdateUI"></event>
11192 </object>
11193 </object>
11194 <object class="sizeritem" expanded="1">
11195 <property name="border">5</property>
11196 <property name="flag">wxALL</property>
11197 <property name="proportion">0</property>
11198 <object class="wxCheckBox" expanded="1">
11199 <property name="bg"></property>
11200 <property name="checked">0</property>
11201 <property name="context_help"></property>
11202 <property name="enabled">1</property>
11203 <property name="fg"></property>
11204 <property name="font"></property>
11205 <property name="hidden">0</property>
11206 <property name="id">wxID_ANY</property>
11207 <property name="label">CALL ANY</property>
11208 <property name="maximum_size"></property>
11209 <property name="minimum_size"></property>
11210 <property name="name">m_checkPreCallAny</property>
11211 <property name="permission">public</property>
11212 <property name="pos"></property>
11213 <property name="size">100,-1</property>
11214 <property name="style"></property>
11215 <property name="subclass"></property>
11216 <property name="tooltip"></property>
11217 <property name="window_extra_style"></property>
11218 <property name="window_name"></property>
11219 <property name="window_style"></property>
11220 <event name="OnChar"></event>
11221 <event name="OnCheckBox">OnCheckPreCallAny</event>
11222 <event name="OnEnterWindow"></event>
11223 <event name="OnEraseBackground"></event>
11224 <event name="OnKeyDown"></event>
11225 <event name="OnKeyUp"></event>
11226 <event name="OnKillFocus"></event>
11227 <event name="OnLeaveWindow"></event>
11228 <event name="OnLeftDClick"></event>
11229 <event name="OnLeftDown"></event>
11230 <event name="OnLeftUp"></event>
11231 <event name="OnMiddleDClick"></event>
11232 <event name="OnMiddleDown"></event>
11233 <event name="OnMiddleUp"></event>
11234 <event name="OnMotion"></event>
11235 <event name="OnMouseEvents"></event>
11236 <event name="OnMouseWheel"></event>
11237 <event name="OnPaint"></event>
11238 <event name="OnRightDClick"></event>
11239 <event name="OnRightDown"></event>
11240 <event name="OnRightUp"></event>
11241 <event name="OnSetFocus"></event>
11242 <event name="OnSize"></event>
11243 <event name="OnUpdateUI"></event>
11244 </object>
11245 </object>
11246 <object class="sizeritem" expanded="1">
11247 <property name="border">5</property>
11248 <property name="flag">wxALL</property>
11249 <property name="proportion">0</property>
11250 <object class="wxCheckBox" expanded="1">
11251 <property name="bg"></property>
11252 <property name="checked">0</property>
11253 <property name="context_help"></property>
11254 <property name="enabled">1</property>
11255 <property name="fg"></property>
11256 <property name="font"></property>
11257 <property name="hidden">0</property>
11258 <property name="id">wxID_ANY</property>
11259 <property name="label">RAISE</property>
11260 <property name="maximum_size"></property>
11261 <property name="minimum_size"></property>
11262 <property name="name">m_checkPreRaise</property>
11263 <property name="permission">public</property>
11264 <property name="pos"></property>
11265 <property name="size">100,-1</property>
11266 <property name="style"></property>
11267 <property name="subclass"></property>
11268 <property name="tooltip"></property>
11269 <property name="window_extra_style"></property>
11270 <property name="window_name"></property>
11271 <property name="window_style"></property>
11272 <event name="OnChar"></event>
11273 <event name="OnCheckBox">OnCheckPreRaise</event>
11274 <event name="OnEnterWindow"></event>
11275 <event name="OnEraseBackground"></event>
11276 <event name="OnKeyDown"></event>
11277 <event name="OnKeyUp"></event>
11278 <event name="OnKillFocus"></event>
11279 <event name="OnLeaveWindow"></event>
11280 <event name="OnLeftDClick"></event>
11281 <event name="OnLeftDown"></event>
11282 <event name="OnLeftUp"></event>
11283 <event name="OnMiddleDClick"></event>
11284 <event name="OnMiddleDown"></event>
11285 <event name="OnMiddleUp"></event>
11286 <event name="OnMotion"></event>
11287 <event name="OnMouseEvents"></event>
11288 <event name="OnMouseWheel"></event>
11289 <event name="OnPaint"></event>
11290 <event name="OnRightDClick"></event>
11291 <event name="OnRightDown"></event>
11292 <event name="OnRightUp"></event>
11293 <event name="OnSetFocus"></event>
11294 <event name="OnSize"></event>
11295 <event name="OnUpdateUI"></event>
11296 </object>
11297 </object>
11298 <object class="sizeritem" expanded="1">
11299 <property name="border">5</property>
11300 <property name="flag">wxALL</property>
11301 <property name="proportion">0</property>
11302 <object class="wxCheckBox" expanded="1">
11303 <property name="bg"></property>
11304 <property name="checked">0</property>
11305 <property name="context_help"></property>
11306 <property name="enabled">1</property>
11307 <property name="fg"></property>
11308 <property name="font"></property>
11309 <property name="hidden">0</property>
11310 <property name="id">wxID_ANY</property>
11311 <property name="label">RAISE ANY</property>
11312 <property name="maximum_size"></property>
11313 <property name="minimum_size"></property>
11314 <property name="name">m_checkPreRaiseAny</property>
11315 <property name="permission">public</property>
11316 <property name="pos"></property>
11317 <property name="size">100,-1</property>
11318 <property name="style"></property>
11319 <property name="subclass"></property>
11320 <property name="tooltip"></property>
11321 <property name="window_extra_style"></property>
11322 <property name="window_name"></property>
11323 <property name="window_style"></property>
11324 <event name="OnChar"></event>
11325 <event name="OnCheckBox">OnCheckPreRaiseAny</event>
11326 <event name="OnEnterWindow"></event>
11327 <event name="OnEraseBackground"></event>
11328 <event name="OnKeyDown"></event>
11329 <event name="OnKeyUp"></event>
11330 <event name="OnKillFocus"></event>
11331 <event name="OnLeaveWindow"></event>
11332 <event name="OnLeftDClick"></event>
11333 <event name="OnLeftDown"></event>
11334 <event name="OnLeftUp"></event>
11335 <event name="OnMiddleDClick"></event>
11336 <event name="OnMiddleDown"></event>
11337 <event name="OnMiddleUp"></event>
11338 <event name="OnMotion"></event>
11339 <event name="OnMouseEvents"></event>
11340 <event name="OnMouseWheel"></event>
11341 <event name="OnPaint"></event>
11342 <event name="OnRightDClick"></event>
11343 <event name="OnRightDown"></event>
11344 <event name="OnRightUp"></event>
11345 <event name="OnSetFocus"></event>
11346 <event name="OnSize"></event>
11347 <event name="OnUpdateUI"></event>
11348 </object>
11349 </object>
11350 </object>
11351 <object class="wxStatusBar" expanded="1">
11352 <property name="bg"></property>
11353 <property name="context_help"></property>
11354 <property name="enabled">1</property>
11355 <property name="fg"></property>
11356 <property name="fields">1</property>
11357 <property name="font"></property>
11358 <property name="hidden">0</property>
11359 <property name="id">wxID_ANY</property>
11360 <property name="maximum_size"></property>
11361 <property name="minimum_size"></property>
11362 <property name="name">m_statusBar</property>
11363 <property name="permission">public</property>
11364 <property name="pos"></property>
11365 <property name="size"></property>
11366 <property name="style">wxST_SIZEGRIP</property>
11367 <property name="subclass"></property>
11368 <property name="tooltip"></property>
11369 <property name="window_extra_style"></property>
11370 <property name="window_name"></property>
11371 <property name="window_style"></property>
11372 <event name="OnChar"></event>
11373 <event name="OnEnterWindow"></event>
11374 <event name="OnEraseBackground"></event>
11375 <event name="OnKeyDown"></event>
11376 <event name="OnKeyUp"></event>
11377 <event name="OnKillFocus"></event>
11378 <event name="OnLeaveWindow"></event>
11379 <event name="OnLeftDClick"></event>
11380 <event name="OnLeftDown"></event>
11381 <event name="OnLeftUp"></event>
11382 <event name="OnMiddleDClick"></event>
11383 <event name="OnMiddleDown"></event>
11384 <event name="OnMiddleUp"></event>
11385 <event name="OnMotion"></event>
11386 <event name="OnMouseEvents"></event>
11387 <event name="OnMouseWheel"></event>
11388 <event name="OnPaint"></event>
11389 <event name="OnRightDClick"></event>
11390 <event name="OnRightDown"></event>
11391 <event name="OnRightUp"></event>
11392 <event name="OnSetFocus"></event>
11393 <event name="OnSize"></event>
11394 <event name="OnUpdateUI"></event>
11395 </object>
11396 </object>
11397 <object class="Dialog" expanded="0">
11398 <property name="bg"></property>
11399 <property name="center"></property>
11400 <property name="context_help"></property>
11401 <property name="enabled">1</property>
11402 <property name="extra_style"></property>
11403 <property name="fg"></property>
11404 <property name="font"></property>
11405 <property name="hidden">0</property>
11406 <property name="id">wxID_ANY</property>
11407 <property name="maximum_size"></property>
11408 <property name="minimum_size"></property>
11409 <property name="name">CGetTextFromUserDialogBase</property>
11410 <property name="pos"></property>
11411 <property name="size">403,138</property>
11412 <property name="style">wxDEFAULT_DIALOG_STYLE</property>
11413 <property name="subclass"></property>
11414 <property name="title"></property>
11415 <property name="tooltip"></property>
11416 <property name="window_extra_style"></property>
11417 <property name="window_name"></property>
11418 <property name="window_style"></property>
11419 <event name="OnActivate"></event>
11420 <event name="OnActivateApp"></event>
11421 <event name="OnChar"></event>
11422 <event name="OnClose">OnClose</event>
11423 <event name="OnEnterWindow"></event>
11424 <event name="OnEraseBackground"></event>
11425 <event name="OnHibernate"></event>
11426 <event name="OnIconize"></event>
11427 <event name="OnIdle"></event>
11428 <event name="OnInitDialog"></event>
11429 <event name="OnKeyDown"></event>
11430 <event name="OnKeyUp"></event>
11431 <event name="OnKillFocus"></event>
11432 <event name="OnLeaveWindow"></event>
11433 <event name="OnLeftDClick"></event>
11434 <event name="OnLeftDown"></event>
11435 <event name="OnLeftUp"></event>
11436 <event name="OnMiddleDClick"></event>
11437 <event name="OnMiddleDown"></event>
11438 <event name="OnMiddleUp"></event>
11439 <event name="OnMotion"></event>
11440 <event name="OnMouseEvents"></event>
11441 <event name="OnMouseWheel"></event>
11442 <event name="OnPaint"></event>
11443 <event name="OnRightDClick"></event>
11444 <event name="OnRightDown"></event>
11445 <event name="OnRightUp"></event>
11446 <event name="OnSetFocus"></event>
11447 <event name="OnSize"></event>
11448 <event name="OnUpdateUI"></event>
11449 <object class="wxBoxSizer" expanded="1">
11450 <property name="minimum_size"></property>
11451 <property name="name">bSizer79</property>
11452 <property name="orient">wxVERTICAL</property>
11453 <property name="permission">none</property>
11454 <object class="sizeritem" expanded="1">
11455 <property name="border">10</property>
11456 <property name="flag">wxEXPAND|wxALL</property>
11457 <property name="proportion">1</property>
11458 <object class="wxBoxSizer" expanded="1">
11459 <property name="minimum_size"></property>
11460 <property name="name">bSizer81</property>
11461 <property name="orient">wxVERTICAL</property>
11462 <property name="permission">none</property>
11463 <object class="sizeritem" expanded="1">
11464 <property name="border">5</property>
11465 <property name="flag">wxEXPAND</property>
11466 <property name="proportion">1</property>
11467 <object class="spacer" expanded="1">
11468 <property name="height">0</property>
11469 <property name="permission">protected</property>
11470 <property name="width">0</property>
11471 </object>
11472 </object>
11473 <object class="sizeritem" expanded="1">
11474 <property name="border">5</property>
11475 <property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
11476 <property name="proportion">0</property>
11477 <object class="wxStaticText" expanded="1">
11478 <property name="bg"></property>
11479 <property name="context_help"></property>
11480 <property name="enabled">1</property>
11481 <property name="fg"></property>
11482 <property name="font"></property>
11483 <property name="hidden">0</property>
11484 <property name="id">wxID_ANY</property>
11485 <property name="label"></property>
11486 <property name="maximum_size"></property>
11487 <property name="minimum_size"></property>
11488 <property name="name">m_staticTextMessage1</property>
11489 <property name="permission">protected</property>
11490 <property name="pos"></property>
11491 <property name="size"></property>
11492 <property name="style"></property>
11493 <property name="subclass"></property>
11494 <property name="tooltip"></property>
11495 <property name="window_extra_style"></property>
11496 <property name="window_name"></property>
11497 <property name="window_style"></property>
11498 <property name="wrap">-1</property>
11499 <event name="OnChar"></event>
11500 <event name="OnEnterWindow"></event>
11501 <event name="OnEraseBackground"></event>
11502 <event name="OnKeyDown"></event>
11503 <event name="OnKeyUp"></event>
11504 <event name="OnKillFocus"></event>
11505 <event name="OnLeaveWindow"></event>
11506 <event name="OnLeftDClick"></event>
11507 <event name="OnLeftDown"></event>
11508 <event name="OnLeftUp"></event>
11509 <event name="OnMiddleDClick"></event>
11510 <event name="OnMiddleDown"></event>
11511 <event name="OnMiddleUp"></event>
11512 <event name="OnMotion"></event>
11513 <event name="OnMouseEvents"></event>
11514 <event name="OnMouseWheel"></event>
11515 <event name="OnPaint"></event>
11516 <event name="OnRightDClick"></event>
11517 <event name="OnRightDown"></event>
11518 <event name="OnRightUp"></event>
11519 <event name="OnSetFocus"></event>
11520 <event name="OnSize"></event>
11521 <event name="OnUpdateUI"></event>
11522 </object>
11523 </object>
11524 <object class="sizeritem" expanded="1">
11525 <property name="border">5</property>
11526 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL</property>
11527 <property name="proportion">0</property>
11528 <object class="wxTextCtrl" expanded="1">
11529 <property name="bg"></property>
11530 <property name="context_help"></property>
11531 <property name="enabled">1</property>
11532 <property name="fg"></property>
11533 <property name="font"></property>
11534 <property name="hidden">0</property>
11535 <property name="id">wxID_TEXTCTRL</property>
11536 <property name="maximum_size"></property>
11537 <property name="maxlength">0</property>
11538 <property name="minimum_size"></property>
11539 <property name="name">m_textCtrl1</property>
11540 <property name="permission">protected</property>
11541 <property name="pos"></property>
11542 <property name="size"></property>
11543 <property name="style">wxTE_PROCESS_ENTER</property>
11544 <property name="subclass"></property>
11545 <property name="tooltip"></property>
11546 <property name="value"></property>
11547 <property name="window_extra_style"></property>
11548 <property name="window_name"></property>
11549 <property name="window_style"></property>
11550 <event name="OnChar"></event>
11551 <event name="OnEnterWindow"></event>
11552 <event name="OnEraseBackground"></event>
11553 <event name="OnKeyDown">OnKeyDown</event>
11554 <event name="OnKeyUp"></event>
11555 <event name="OnKillFocus"></event>
11556 <event name="OnLeaveWindow"></event>
11557 <event name="OnLeftDClick"></event>
11558 <event name="OnLeftDown"></event>
11559 <event name="OnLeftUp"></event>
11560 <event name="OnMiddleDClick"></event>
11561 <event name="OnMiddleDown"></event>
11562 <event name="OnMiddleUp"></event>
11563 <event name="OnMotion"></event>
11564 <event name="OnMouseEvents"></event>
11565 <event name="OnMouseWheel"></event>
11566 <event name="OnPaint"></event>
11567 <event name="OnRightDClick"></event>
11568 <event name="OnRightDown"></event>
11569 <event name="OnRightUp"></event>
11570 <event name="OnSetFocus"></event>
11571 <event name="OnSize"></event>
11572 <event name="OnText"></event>
11573 <event name="OnTextEnter"></event>
11574 <event name="OnTextMaxLen"></event>
11575 <event name="OnTextURL"></event>
11576 <event name="OnUpdateUI"></event>
11577 </object>
11578 </object>
11579 <object class="sizeritem" expanded="1">
11580 <property name="border">5</property>
11581 <property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
11582 <property name="proportion">0</property>
11583 <object class="wxStaticText" expanded="1">
11584 <property name="bg"></property>
11585 <property name="context_help"></property>
11586 <property name="enabled">1</property>
11587 <property name="fg"></property>
11588 <property name="font"></property>
11589 <property name="hidden">1</property>
11590 <property name="id">wxID_ANY</property>
11591 <property name="label"></property>
11592 <property name="maximum_size"></property>
11593 <property name="minimum_size"></property>
11594 <property name="name">m_staticTextMessage2</property>
11595 <property name="permission">protected</property>
11596 <property name="pos"></property>
11597 <property name="size"></property>
11598 <property name="style"></property>
11599 <property name="subclass"></property>
11600 <property name="tooltip"></property>
11601 <property name="window_extra_style"></property>
11602 <property name="window_name"></property>
11603 <property name="window_style"></property>
11604 <property name="wrap">-1</property>
11605 <event name="OnChar"></event>
11606 <event name="OnEnterWindow"></event>
11607 <event name="OnEraseBackground"></event>
11608 <event name="OnKeyDown"></event>
11609 <event name="OnKeyUp"></event>
11610 <event name="OnKillFocus"></event>
11611 <event name="OnLeaveWindow"></event>
11612 <event name="OnLeftDClick"></event>
11613 <event name="OnLeftDown"></event>
11614 <event name="OnLeftUp"></event>
11615 <event name="OnMiddleDClick"></event>
11616 <event name="OnMiddleDown"></event>
11617 <event name="OnMiddleUp"></event>
11618 <event name="OnMotion"></event>
11619 <event name="OnMouseEvents"></event>
11620 <event name="OnMouseWheel"></event>
11621 <event name="OnPaint"></event>
11622 <event name="OnRightDClick"></event>
11623 <event name="OnRightDown"></event>
11624 <event name="OnRightUp"></event>
11625 <event name="OnSetFocus"></event>
11626 <event name="OnSize"></event>
11627 <event name="OnUpdateUI"></event>
11628 </object>
11629 </object>
11630 <object class="sizeritem" expanded="1">
11631 <property name="border">5</property>
11632 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL</property>
11633 <property name="proportion">0</property>
11634 <object class="wxTextCtrl" expanded="1">
11635 <property name="bg"></property>
11636 <property name="context_help"></property>
11637 <property name="enabled">1</property>
11638 <property name="fg"></property>
11639 <property name="font"></property>
11640 <property name="hidden">1</property>
11641 <property name="id">wxID_TEXTCTRL</property>
11642 <property name="maximum_size"></property>
11643 <property name="maxlength">0</property>
11644 <property name="minimum_size"></property>
11645 <property name="name">m_textCtrl2</property>
11646 <property name="permission">protected</property>
11647 <property name="pos"></property>
11648 <property name="size"></property>
11649 <property name="style">wxTE_PROCESS_ENTER</property>
11650 <property name="subclass"></property>
11651 <property name="tooltip"></property>
11652 <property name="value"></property>
11653 <property name="window_extra_style"></property>
11654 <property name="window_name"></property>
11655 <property name="window_style"></property>
11656 <event name="OnChar"></event>
11657 <event name="OnEnterWindow"></event>
11658 <event name="OnEraseBackground"></event>
11659 <event name="OnKeyDown">OnKeyDown</event>
11660 <event name="OnKeyUp"></event>
11661 <event name="OnKillFocus"></event>
11662 <event name="OnLeaveWindow"></event>
11663 <event name="OnLeftDClick"></event>
11664 <event name="OnLeftDown"></event>
11665 <event name="OnLeftUp"></event>
11666 <event name="OnMiddleDClick"></event>
11667 <event name="OnMiddleDown"></event>
11668 <event name="OnMiddleUp"></event>
11669 <event name="OnMotion"></event>
11670 <event name="OnMouseEvents"></event>
11671 <event name="OnMouseWheel"></event>
11672 <event name="OnPaint"></event>
11673 <event name="OnRightDClick"></event>
11674 <event name="OnRightDown"></event>
11675 <event name="OnRightUp"></event>
11676 <event name="OnSetFocus"></event>
11677 <event name="OnSize"></event>
11678 <event name="OnText"></event>
11679 <event name="OnTextEnter"></event>
11680 <event name="OnTextMaxLen"></event>
11681 <event name="OnTextURL"></event>
11682 <event name="OnUpdateUI"></event>
11683 </object>
11684 </object>
11685 <object class="sizeritem" expanded="1">
11686 <property name="border">5</property>
11687 <property name="flag">wxEXPAND</property>
11688 <property name="proportion">1</property>
11689 <object class="spacer" expanded="1">
11690 <property name="height">0</property>
11691 <property name="permission">protected</property>
11692 <property name="width">0</property>
11693 </object>
11694 </object>
11695 </object>
11696 </object>
11697 <object class="sizeritem" expanded="1">
11698 <property name="border">5</property>
11699 <property name="flag">wxEXPAND</property>
11700 <property name="proportion">0</property>
11701 <object class="wxBoxSizer" expanded="1">
11702 <property name="minimum_size"></property>
11703 <property name="name">bSizer80</property>
11704 <property name="orient">wxHORIZONTAL</property>
11705 <property name="permission">none</property>
11706 <object class="sizeritem" expanded="1">
11707 <property name="border">5</property>
11708 <property name="flag">wxEXPAND</property>
11709 <property name="proportion">1</property>
11710 <object class="spacer" expanded="1">
11711 <property name="height">0</property>
11712 <property name="permission">protected</property>
11713 <property name="width">0</property>
11714 </object>
11715 </object>
11716 <object class="sizeritem" expanded="1">
11717 <property name="border">5</property>
11718 <property name="flag">wxALL</property>
11719 <property name="proportion">0</property>
11720 <object class="wxButton" expanded="1">
11721 <property name="bg"></property>
11722 <property name="context_help"></property>
11723 <property name="default">0</property>
11724 <property name="enabled">1</property>
11725 <property name="fg"></property>
11726 <property name="font"></property>
11727 <property name="hidden">0</property>
11728 <property name="id">wxID_OK</property>
11729 <property name="label">OK</property>
11730 <property name="maximum_size"></property>
11731 <property name="minimum_size">85,25</property>
11732 <property name="name">m_buttonOK</property>
11733 <property name="permission">protected</property>
11734 <property name="pos"></property>
11735 <property name="size">-1,-1</property>
11736 <property name="style"></property>
11737 <property name="subclass"></property>
11738 <property name="tooltip"></property>
11739 <property name="window_extra_style"></property>
11740 <property name="window_name"></property>
11741 <property name="window_style"></property>
11742 <event name="OnButtonClick">OnButtonOK</event>
11743 <event name="OnChar"></event>
11744 <event name="OnEnterWindow"></event>
11745 <event name="OnEraseBackground"></event>
11746 <event name="OnKeyDown"></event>
11747 <event name="OnKeyUp"></event>
11748 <event name="OnKillFocus"></event>
11749 <event name="OnLeaveWindow"></event>
11750 <event name="OnLeftDClick"></event>
11751 <event name="OnLeftDown"></event>
11752 <event name="OnLeftUp"></event>
11753 <event name="OnMiddleDClick"></event>
11754 <event name="OnMiddleDown"></event>
11755 <event name="OnMiddleUp"></event>
11756 <event name="OnMotion"></event>
11757 <event name="OnMouseEvents"></event>
11758 <event name="OnMouseWheel"></event>
11759 <event name="OnPaint"></event>
11760 <event name="OnRightDClick"></event>
11761 <event name="OnRightDown"></event>
11762 <event name="OnRightUp"></event>
11763 <event name="OnSetFocus"></event>
11764 <event name="OnSize"></event>
11765 <event name="OnUpdateUI"></event>
11766 </object>
11767 </object>
11768 <object class="sizeritem" expanded="1">
11769 <property name="border">5</property>
11770 <property name="flag">wxALL</property>
11771 <property name="proportion">0</property>
11772 <object class="wxButton" expanded="1">
11773 <property name="bg"></property>
11774 <property name="context_help"></property>
11775 <property name="default">0</property>
11776 <property name="enabled">1</property>
11777 <property name="fg"></property>
11778 <property name="font"></property>
11779 <property name="hidden">0</property>
11780 <property name="id">wxID_CANCEL</property>
11781 <property name="label">Cancel</property>
11782 <property name="maximum_size"></property>
11783 <property name="minimum_size">85,25</property>
11784 <property name="name">m_buttonCancel</property>
11785 <property name="permission">protected</property>
11786 <property name="pos"></property>
11787 <property name="size"></property>
11788 <property name="style"></property>
11789 <property name="subclass"></property>
11790 <property name="tooltip"></property>
11791 <property name="window_extra_style"></property>
11792 <property name="window_name"></property>
11793 <property name="window_style"></property>
11794 <event name="OnButtonClick">OnButtonCancel</event>
11795 <event name="OnChar"></event>
11796 <event name="OnEnterWindow"></event>
11797 <event name="OnEraseBackground"></event>
11798 <event name="OnKeyDown"></event>
11799 <event name="OnKeyUp"></event>
11800 <event name="OnKillFocus"></event>
11801 <event name="OnLeaveWindow"></event>
11802 <event name="OnLeftDClick"></event>
11803 <event name="OnLeftDown"></event>
11804 <event name="OnLeftUp"></event>
11805 <event name="OnMiddleDClick"></event>
11806 <event name="OnMiddleDown"></event>
11807 <event name="OnMiddleUp"></event>
11808 <event name="OnMotion"></event>
11809 <event name="OnMouseEvents"></event>
11810 <event name="OnMouseWheel"></event>
11811 <event name="OnPaint"></event>
11812 <event name="OnRightDClick"></event>
11813 <event name="OnRightDown"></event>
11814 <event name="OnRightUp"></event>
11815 <event name="OnSetFocus"></event>
11816 <event name="OnSize"></event>
11817 <event name="OnUpdateUI"></event>
11818 </object>
11819 </object>
11820 </object>
11821 </object>
11822 </object>
11823 </object>
11824 </object>
11825</wxFormBuilder_Project>
diff --git a/src/util.cpp b/src/util.cpp
index 7f56530..68bd18e 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -8,6 +8,99 @@
8 8
9bool fDebug = false; 9bool fDebug = false;
10 10
11// ---------------------------------------------------------------------------
12// Categorized, burst-collapsing logging -- see the LogPrint doc comment in
13// util.h for the problem this solves.
14// ---------------------------------------------------------------------------
15
16// Categories that explain the pool/worker/payout pipeline are on unconditionally:
17// silence there is exactly the "worker stuck, nothing then happens" complaint
18// this exists to fix, so it can't be opted out of by forgetting -debug.
19// "net" and "nostr" cover the per-address connection/discovery chatter that
20// used to dominate debug.log; they're gated behind fDebug like the printf()
21// calls they replace, so default output stays quiet unless requested.
22static bool LogCategoryDefaultOn(const char* category)
23{
24 return strcmp(category, "pool") == 0 ||
25 strcmp(category, "worker") == 0 ||
26 strcmp(category, "payout") == 0;
27}
28
29bool LogAcceptsCategory(const char* category)
30{
31 if (LogCategoryDefaultOn(category))
32 return true;
33 return fDebug;
34}
35
36// Only collapse bursts from the exact same call site within this window;
37// a different LogPrint() call (different file/line) is never merged with
38// this one, so unrelated messages never get mixed into one summary.
39static const int64 DEDUP_WINDOW_SECS = 3;
40
41struct LogDedupState {
42 int64 windowStart; // GetTime() when the current window opened
43 int suppressed; // calls swallowed so far this window
44 std::string lastMsg; // most recent message text, for the summary line
45};
46
47static std::map<std::string, LogDedupState> g_logDedup;
48static CCriticalSection cs_logDedup;
49
50void LogPrintDedup(const char* category, const char* file, int line, const std::string& msgIn)
51{
52 // Call sites follow the existing printf() convention of ending their
53 // format string with \n; strip it here so the single \n this function
54 // adds below doesn't turn into a blank line.
55 std::string msg = msgIn;
56 while (!msg.empty() && (msg.back() == '\n' || msg.back() == '\r'))
57 msg.pop_back();
58
59 char key[512];
60 my_snprintf(key, sizeof(key), "%s|%s:%d", category, file, line);
61
62 int64 now = GetTime();
63 bool fEmitNow = false;
64 int suppressedToFlush = 0;
65 std::string flushedMsg;
66
67 CRITICAL_BLOCK(cs_logDedup)
68 {
69 std::map<std::string, LogDedupState>::iterator it = g_logDedup.find(key);
70 if (it == g_logDedup.end())
71 {
72 // First time this call site has fired (or its last window is long
73 // gone) -- print it directly and open a fresh window.
74 g_logDedup[key] = LogDedupState{now, 0, msg};
75 fEmitNow = true;
76 }
77 else if (now - it->second.windowStart >= DEDUP_WINDOW_SECS)
78 {
79 // Window rolled over: flush what was suppressed during it (if
80 // anything), then start a new window with this call printed.
81 suppressedToFlush = it->second.suppressed;
82 flushedMsg = it->second.lastMsg;
83 it->second.windowStart = now;
84 it->second.suppressed = 0;
85 it->second.lastMsg = msg;
86 fEmitNow = true;
87 }
88 else
89 {
90 // Still inside the window and already printed one line for it:
91 // count this occurrence instead of writing another near-duplicate.
92 it->second.suppressed++;
93 it->second.lastMsg = msg;
94 }
95 }
96
97 if (suppressedToFlush > 0)
98 OutputDebugStringF("[%s] (%d similar in %llds, last: %s)\n",
99 category, suppressedToFlush, (long long)DEDUP_WINDOW_SECS, flushedMsg.c_str());
100 if (fEmitNow)
101 OutputDebugStringF("[%s] %s\n", category, msg.c_str());
102}
103
11 104
12 105
13 106
@@ -200,11 +293,16 @@ void PrintException(std::exception* pex, const char* pszThread)
200 snprintf(pszMessage, sizeof(pszMessage), 293 snprintf(pszMessage, sizeof(pszMessage),
201 "UNKNOWN EXCEPTION \n%s in %s \n", pszModule, pszThread); 294 "UNKNOWN EXCEPTION \n%s in %s \n", pszModule, pszThread);
202 printf("\n\n************************\n%s", pszMessage); 295 printf("\n\n************************\n%s", pszMessage);
203 // Suppress the dialog and rethrow during shutdown — threads unwinding on 296 // Do NOT rethrow here. Every caller of PrintException (via
204 // exit cause spurious "UNKNOWN EXCEPTION" popups that aren't real errors. 297 // CATCH_PRINT_EXCEPTION) is a thread wrapped in its own
205 // Show error in GUI via repaint signal — GUI polls g_errorMessage 298 // "try { ThreadFoo2() } catch(...) { log, sleep, loop again }" self-healing
206 if (!fShutdown) 299 // retry loop -- that's the whole point of the wrapper. Rethrowing from
207 throw; 300 // inside that catch block escapes the retry loop entirely (nothing above
301 // it in the thread catches it) and takes down the whole process with
302 // std::terminate() on the very first transient error -- a flaky relay
303 // connection, a malformed message, anything -- instead of letting the
304 // thread log it, sleep 5s, and try again like it's designed to.
305 // Show error in GUI via repaint signal -- GUI polls g_errorMessage
208} 306}
209 307
210 308
diff --git a/src/util.h b/src/util.h
index c53293a..641b838 100644
--- a/src/util.h
+++ b/src/util.h
@@ -26,11 +26,14 @@ typedef unsigned long long uint64;
26#define UEND(a) ((unsigned char*)&((&(a))[1])) 26#define UEND(a) ((unsigned char*)&((&(a))[1]))
27#define ARRAYLEN(array) (sizeof(array)/sizeof((array)[0])) 27#define ARRAYLEN(array) (sizeof(array)/sizeof((array)[0]))
28 28
29// Route printf to debug.log (and the console) on the GUI Windows build and on 29// Route printf to debug.log (and the console on non-Windows) everywhere.
30// the headless Linux build alike. 30// (Previously gated on `defined(_WINDOWS) || !defined(_WIN32)` -- but
31#if defined(_WINDOWS) || !defined(_WIN32) 31// _WINDOWS is only ever defined by the legacy, unused makefile.vc build;
32// the real Windows build (makefile.mingw) never defines it, so on actual
33// Windows this condition was always false and debug.log was never written.
34// OutputDebugStringF() is already platform-safe internally: it always
35// writes debug.log, and only echoes to the console when not on Windows.)
32#define printf OutputDebugStringF 36#define printf OutputDebugStringF
33#endif
34 37
35#ifdef snprintf 38#ifdef snprintf
36#undef snprintf 39#undef snprintf
@@ -70,6 +73,35 @@ inline T& REF(const T& val)
70 73
71extern bool fDebug; 74extern bool fDebug;
72 75
76// ---------------------------------------------------------------------------
77// Categorized, burst-collapsing logging
78//
79// Plain printf() (routed to OutputDebugStringF below) writes every call
80// unfiltered to debug.log. That's fine for one-off events, but a loop that
81// logs once per item -- once per discovered peer, once per connect attempt,
82// once per share -- turns debug.log into a wall of near-identical lines that
83// differ only by an address, while the line that actually explains a stuck
84// flow ("Stratum: no job available for ...") scrolls off screen under the
85// noise. LogPrint() is a drop-in replacement for printf() that fixes both
86// problems without touching call sites' formatting:
87//
88// 1. Category tag: every call names the subsystem it belongs to ("pool",
89// "worker", "payout", "net", "nostr", ...). LogAcceptsCategory()
90// controls what's written (see util.cpp); the pool/worker/payout flow
91// the person actually needs visibility into is on by default.
92// 2. Burst collapse: repeated LogPrint() calls from the *same source line*
93// only emit one line per DEDUP_WINDOW_SECS; if more calls land inside
94// that window they're counted instead of reprinted, and the count is
95// flushed as a single "(xN similar in Ws)" line the moment the window
96// rolls over. A loop discovering 500 peers by address now produces a
97// small, bounded number of lines instead of 500 -- log growth is capped
98// by elapsed time, not by how many similar events happen to fire.
99// ---------------------------------------------------------------------------
100bool LogAcceptsCategory(const char* category);
101void LogPrintDedup(const char* category, const char* file, int line, const std::string& msg);
102#define LogPrint(category, ...) \
103 do { if (LogAcceptsCategory(category)) LogPrintDedup((category), __FILE__, __LINE__, strprintf(__VA_ARGS__)); } while (0)
104
73void RandAddSeed(bool fPerfmon=false); 105void RandAddSeed(bool fPerfmon=false);
74int my_snprintf(char* buffer, size_t limit, const char* format, ...); 106int my_snprintf(char* buffer, size_t limit, const char* format, ...);
75string strprintf(const char* format, ...); 107string strprintf(const char* format, ...);
@@ -231,7 +263,7 @@ void PrintHex(const T pbegin, const T pend, const char* pszFormat="%s", bool fSp
231 263
232 264
233 265
234// Forward declaration — defined in main.cpp 266// Forward declaration -- defined in main.cpp
235string GetAppDir(); 267string GetAppDir();
236 268
237inline int OutputDebugStringF(const char* pszFormat, ...) 269inline int OutputDebugStringF(const char* pszFormat, ...)