diff --git a/Makefile b/Makefile index 5e09eeb..b7da336 100644 --- a/Makefile +++ b/Makefile @@ -18,6 +18,7 @@ clean: rm -rf src/backup rm -f -v src/richmemo/*.o src/richmemo/*.ppu src/richmemo/gtk2/*.ppu src/richmemo/gtk2/*.o rm -f -v tools/adif_hash_generator tools/adif_hash_generator.lpi tools/adif_hash_generator.lps + rm -rf /tmp/.lazarus install: install -d -v $(bindir) diff --git a/README.md b/README.md index 13c3316..19b80c2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,13 @@ +About this "Alpha" version by OH1KH +--------------- +This is a clone of Cqrlog source with some additons of my own. +From folder "compiled" you find ready compiled binary files against official Cqrlog and for this "local_testing" source. +There is also "newupdate.zip" that includes "newupdate.sh", a script that does Cqrlog backup and update for you with selected binary file. +Same folder has also README.md that holds further informations. + + + + What is CQRLOG? --------------- diff --git a/compiled/README.md b/compiled/README.md new file mode 100755 index 0000000..eb258f3 --- /dev/null +++ b/compiled/README.md @@ -0,0 +1,228 @@ + + #### NOTE: Upgrading to 2.6.0.(115) ,or higer, will change database table "cqrlog_common" to version 6. + If you return back to previous cqrlog version you need to restore the database. +( if you used newupdate.sh it is to copy backup foder ~/.config/cqrlog-YYYYMMDD-HHMMSS to name ~/.config/cqrlog ) + + #### NOTE: For now on alpha test binaries beginning from 2.6.0.(107) are compiled using system that has GLIBC version 2.35. +If you can not start Cqrlog after update check your GLIBC version with command console: ***ldd --version*** +Update GLIBC if it is below 2.3.5. +If you do not want to do that you can compile this source (see 1 folder up) with your current OS version and get it running. +Note that the source version is usually one step higher than ready compiled versions. + + #### NOTE: At the moment there is no new official version source release. That is why Alpha (119) is ***VERY far ahead*** from official. +From [Changelog](https://htmlpreview.github.io/?https://github.com/OH1KH/cqrlog/blob/loc_testing/src/changelog.html) +you can see all changes. It appears also at first start of (119), and can be accessed via "Help" when Cqrlog is running. + + +Latest cqrlog alpha test binaries can be found from this folder. +This folder holds ready compiled binary files of source "loc_testing" that is the version of cqrlog that I am using myself daily. +They contain all accepted pull requests from official source (that may not be released offically yet) plus some test code that is not pull requested yet (and may not be pull requested ever) + +## ABOUT THESE BINARIES: + These binaries (cqr0,cqr1,cqr4 zips) include latest official source having updates up to commit: + + Commits on Jul 24, 2022 Merge pull request #529 from OH1KH/direct_load_filter + + Binaries (cqr2,cqr3,cqr5,cqr6 zips) include latest official source ***WITH alpha additions and Pull Requests that have not yet applied***. + + To see what are the latest official updates look at + To see updates in this alpha version look at + + To read about UTF8 special charcters in logs read file UTF8_logs.md + + +BINARIES: +--------- + - **cqr0.zip holds binary for 64bit systems compiled for GTK2 widgets (official release )** + - **cqr1.zip holds binary for 32bit systems compiled for GTK2 widgets (official release )** + - **cqr2.zip holds binary for 64bit systems compiled for GTK2 widgets (official release of cqrlog with alpha additions)** + - **cqr3.zip holds binary for 32bit systems compiled for GTK2 widgets (official release of cqrlog with alpha additions)** + - **cqr4.zip holds binary for 64bit Arm (Rpi4) compiled for GTK2 widgets (official release )** + - **cqr5.zip holds binary for 64bit systems compiled for QT5 widgets (official release of cqrlog with alpha additions,you may need to install libqt5pas to run this)** + - **cqr6.zip holds binary for 64bit Arm (Rpi4) compiled for GTK2 widgets (official release of cqrlog with alpha additions)** + - **help.tgz holds latest help files** + - **newupdate.zip holds the newupdate.sh script for easy update** + +**All binaries must be copied over complete, working, official installation. These do not work alone.** +======================================================================================================== + + + +------------------WARNINGS----------------- +=========================================== + +**This is NOT official release !** + + ***ALWAYS !! FIRST DO BACKUP OF YOUR LOGS AND SETTINGS !!*** + + If you use script-install (see below) it makes backups for you. + Otherwise see "manual-install (below). + + In some cases it has happen that alpha binary compiled using Fedora linux may not run flawlessly with Ubuntu derivates. + if you start to get mysterious errors it might be the reason. + I have now added version that has no special additions from me. It is compiled with Mint20 from up to date official source. + You could try that or otherwise consider to compile cqrlog either from official or from my alpha source. + I have written few messages to Cqrlog forum how to make the compile. + +-----------YOU HAVE BEEN WARNED!------------ +============================================ + + +### -------------------SCRIPT-INSTALL-------------------- + +**There is now new script for update. You need to download only the script and start it.** +**It will do rest of downloads for you and then install updates.** + + +Use it this way: + +Download newupdate.zip from GitHub page. + - click blue link of newupdate.zip file. New page opens. You see that there is a button "Download" click it. + Your browser downloads the zip. If it asks where to save, select folder from where you can find the zip. + +Open command console. Go to your download directory. + + cd [your download directory path] + +Unzip newupdate.zip to find the newupdate.sh script: + + unzip newupdate.zip + +Then start newupdate.sh script with command: + + ./newupdate.sh + + If you can not start script then check that you can execute newupdate.sh by giving a command: + chmod a+x newupdate.sh + Then try again to start script. + + There has been one case where starting newupdate.sh it complains error at line 5 (arch bracket). + In that case solution was to start newupdate.sh as: + + bash newupdate.sh + + That (Ubuntu 20) linux obviously did not had bash as default shell. + +Script checks frist that you have cqrlog installed and that you have some other needed programs. +If they are not found it will stop and tell what you should do before new try. + +I have tested this script many times while writing it. How ever it may fail with your setup. + +So you USE IT ON YOUR OWN RISK ! + +Here is a video showing update in use https://www.youtube.com/watch?v=H_QLQhQyFVg&t + +Other way to update is to do it manually as follows: + +## -------------------MANUAL-INSTALL-------------------- + + Simplest way to backup everything is to copy whole folder with console command + + cp -a ~/.config/cqrlog ~/.config/cqrlog_save + + After doing this, if you ever need to restore old settings and logs, just give console commands + + rm -rf ~/.config/cqrlog + cp -a ~/.config/cqrlog_save ~/.config/cqrlog + + +(you need to become root (sudo) using sudo to do following): + +#### -------------INSTALL NEW HELP FILES---------------- + +Your /usr/share should usually contain folder cqrlog, if so, do install help files. + + cd /usr/share/cqrlog + sudo tar vxf /your/download/folder/help.tgz + + +#### ------------THEN INSTALL THE CQRLOG ITSELF--------- + + cd /tmp + unzip /your/download/folder/cqr5.zip (cqr3.zip or cqr2.zip) + + +Then just copy '/tmp/cqrlog' over your existing 'cqrlog' (usually in /usr/bin folder) +when first saving the old one to cqrlog_old that you can copy back if new one does not work. +Then check execution rights. + + sudo cp /usr/bin/cqrlog /usr/bin/cqrlog_old + sudo cp /tmp/cqrlog /usr/bin/ + sudo chmod a+x /usr/bin/cqrlog + + +## -------------------MANUAL-COMPILE-------------------- + + +Once you have a running Cqrlog installed you can do update also by making the compile from source code. +For getting source code there are two ways: + +clone my whole Git reporsitory using command terminal: + + git clone https://github.com/OH1KH/cqrlog.git + +This will make folder "cqrlog" to your home directory if cloning is issued on that directory. +After that, to get into Alpha branch, give command: + + git checkout loc_testing + +Now you have the Alpha source in hand. +Good side with "git clone" is that on next time you like to upgrade you just open command console and change directory to "cqrlog" ("cd cqrlog") and issue command "git pull" and new updates are applied and you are ready to compile and install again. + +Other way is to download just the current version's source with web browser from https://github.com/OH1KH/cqrlog/tree/loc_testing At that page you see green button "Code". By pressing that you find "Download.zip" that allows to download the source code as zip file. +Once downloaded and extracted you are at same point as after "git checkout loc_testing" above. +How ever you can not do new uptates later with "git pull". You have to download the zip file again. + +Once you have source you need tools to compile. Using command termnal install them. + + sudo apt install lazarus + +That will install FreePascal compiler and Lazarus GUI. Issuing that line results a long list of dependencies to install, just say Y (yes) to install them all. + +If your Lazarus is very old from package you find latest version from https://www.lazarus-ide.org It is always recommended to use latest version as package versions can be very old, as seen with Cqrlog packages. At the moment lazarus-ide version is 2.2.6 + +When lazarus-ide is installed you need to change to source directory, either git cloned or extracted from zip. ("cd cqrlog") +After that start the compile process, issue: + + make + +When compile has finished install the new Cqrlog with command + + sudo make install + +That is all! + + + +With some OS "make" result errors. Then usually using the lazarus-ide works. +Start lazarus-ide typing that to command terminal, or start from startup menu icon "lazarus". +At first start it goes through some settings. If all Tabs show OK you are ready to continue. + +Lazarus starts first to empty form. Use top menu "Project/Open Project" and navigate to your "cqrlog" source folder. There you see subfolder "src". Navigate to that folder and you see "cqrlog.lpi". Open that. + +Once opened select top menu "View/Messages" to see compiler messages. Then select top menu "Run/Compile". +Wait and finally you should see a green line on Messages window. It means that compile is over. + +You find new cqrlog from folder "src" as file "cqrlog" +You can now try command terminal: + + cd cqrlog (this is the source root folder, as before) + sudo make install + +If succeeded you have new version with new help installed. If not, you can just copy file "cqrlog" from folder "src" to "/usr/bin" +There already exists a file named "cqrlog" (that is the old version) you can first copy it somewhere, if you like, before +coping over the new one. +You need "sudo" for this copy. + + sudo cp src/cqrlog /usr/bin + + + + +### A list what is not included into official cqrlog GitHub source and exist only in Alpha test versions can be found from [Changelog](https://htmlpreview.github.io/?https://github.com/OH1KH/cqrlog/blob/loc_testing/src/changelog.html) + +### Some Cqrlog related videos can be found from + +All kind of reports are welcome. You can find my address from callbooks. + + diff --git a/compiled/UTF8_logs.md b/compiled/UTF8_logs.md new file mode 100755 index 0000000..62b362f --- /dev/null +++ b/compiled/UTF8_logs.md @@ -0,0 +1,31 @@ +# READ AND UNDERSTAND THIS! + From version 2.5.2(102) on *and also official version compiled from source after 2021-02-15* + Database opening has fixed so that special charcters like ÜéÄ etc. work properly with latest Freepascal version. + This means that your earlier made loggings that have special charcters in qth, name, remarks etc. + will show up as garbage. While your new loggings will show special charcters fine. + + If you like them all show out ok you have to do full adif export/import from your log(s) + *before you upgrade cqrlog*. Do it this way: + 1) Open cqrlog that is not updated yet. + 2) When in "Database Connection" window select your log to be exported. + (if your cqrlog opens directly to NewQSO select File/Open or create new log + to get "Database Connection" window. There uncheck "Open recent log after + program start" and close cqrlog. Open cqrlog again and you are in "Database Connection" window ) + 3) press "Utils" select "configuration/export" and give filename for example. "log" + 4) When done that open log and then open QSO list and /File/Export/Adif give filename + and then check all checkboxes to make full ADIF export. + 5) Close cqrlog and make cqrlog update to new version + 6) Open new cqrlog and your log and confirm that special charcters are garbage. + 7) Close cqrlog. Open it again to get "Database Connection" window + 8) Press button "new log" Give log number and name. See that new log gets selected. Not open it yet. + 9) Press "utils" select "configuration/import" and find your newly created file example "log.ini" + 10) press on and after succesfull import open that log. + 11) Open QSO list File/import/ADIF and find and load your newly created full adif export file. + 12) Once loaded confirm that you can again see special characters properly and also new qso entries + will have them properly. + +## Do not try to be smart and try invent a shortcut for this 12 line guide + + Update scirpt will do backups from old /usr/bin/cqrlog programs, so + do not worry if you missed this and regret. Look at /usr/bin to find old cqrlog backups. + copy one of them to name /usr/bin/cqrlog (you need sudo) and you can start guide above. diff --git a/compiled/cqr0.zip b/compiled/cqr0.zip new file mode 100755 index 0000000..6f9eba4 Binary files /dev/null and b/compiled/cqr0.zip differ diff --git a/compiled/cqr1.zip b/compiled/cqr1.zip new file mode 100755 index 0000000..320f38b Binary files /dev/null and b/compiled/cqr1.zip differ diff --git a/compiled/cqr2.zip b/compiled/cqr2.zip new file mode 100644 index 0000000..73ba92e Binary files /dev/null and b/compiled/cqr2.zip differ diff --git a/compiled/cqr3.zip b/compiled/cqr3.zip new file mode 100755 index 0000000..8fc8f7f Binary files /dev/null and b/compiled/cqr3.zip differ diff --git a/compiled/cqr4.zip b/compiled/cqr4.zip new file mode 100755 index 0000000..2c04185 Binary files /dev/null and b/compiled/cqr4.zip differ diff --git a/compiled/cqr5.zip b/compiled/cqr5.zip new file mode 100644 index 0000000..bf47027 Binary files /dev/null and b/compiled/cqr5.zip differ diff --git a/compiled/cqr6.zip b/compiled/cqr6.zip new file mode 100644 index 0000000..c3497ef Binary files /dev/null and b/compiled/cqr6.zip differ diff --git a/compiled/help.tgz b/compiled/help.tgz new file mode 100644 index 0000000..e367a76 Binary files /dev/null and b/compiled/help.tgz differ diff --git a/compiled/newupdate.zip b/compiled/newupdate.zip new file mode 100755 index 0000000..8761d3d Binary files /dev/null and b/compiled/newupdate.zip differ diff --git a/compiled/setting_rigctld_for_all_programs.pdf b/compiled/setting_rigctld_for_all_programs.pdf new file mode 100755 index 0000000..24dcabe Binary files /dev/null and b/compiled/setting_rigctld_for_all_programs.pdf differ diff --git a/ctyfiles/sat_name.tab b/ctyfiles/sat_name.tab index 06b3cb5..ccdf1f5 100644 --- a/ctyfiles/sat_name.tab +++ b/ctyfiles/sat_name.tab @@ -20,12 +20,14 @@ ARISS|ARISS Arsene|OSCAR 24 BO-102|BIT Progress-OSCAR 102 (CAS-7B) BY70-1|Bayi Kepu Weixing 1 +CAS-2T|CAS-2T CAS-3H|LilacSat-2 CAS-4A|CAMSAT 4A (CAS-4A) CAS-4B|CAMSAT 4B (CAS-4B) DO-64|Delfi OSCAR-64 EO-79|FUNcube-3 EO-88|Emirates-OSCAR 88 (Nayif-1) +FO-118|CAS-5A FO-12|Fuji-OSCAR 12 FO-20|Fuji-OSCAR 20 FO-29|Fuji-OSCAR 29 @@ -34,6 +36,7 @@ FS-3|FalconSAT 3 HO-107|HuskySat OSCAR 107 HO-113|HO-113 HO-68|Hope-Oscar 68 +IO-117|GreenCube IO-86|Indonesia-OSCAR 86 (LAPAN-ORARI) JO-97|Jordan-OSCAR 97(JY1Sat) KEDR|ARISSat-1 @@ -44,6 +47,7 @@ LO-90|LilacSat-OSCAR 90 (LilacSat-1) MAYA-3|Cubesat MAYA-4|Cubesat MIREX|MIR Packet Digipeater +MO-112|Mirsat-1 NO-103|Navy-OSCAR 103 (BRICSAT 2) NO-104|Navy-OSCAR 104 (PSAT 2) NO-44|Navy-OSCAR 44 diff --git a/help/contest.html b/help/contest.html index ddc282a..46f8059 100644 --- a/help/contest.html +++ b/help/contest.html @@ -30,66 +30,103 @@
CQRLOG for LINUX by OK2CQR & OK1RR

Contest support

-

You will find contest selection from NewQSO/Window dropdown menu. -

When contest window is open NewQSO has contest exchange fields visible. You may have to stretch NewQSO window horizontally to see them. -
You do not normally need NewQSO window during contest. Only need for NewQSO is in case you have to edit an already worked qso. -
Select qso normally via QSO list and press edit QSO button and you are able to edit qso, also the contest message part of it. -

NewQSO is not meant to be used during contest qso feeds. All new qsos are entered via contest window.

+

You will find contest selection from NewQSO/Window dropdown menu. Contest support of Cqrlog is very limited, but will serve you well if you just +like to take a part to contest without winning in mind. + +
Contest window is just a "child form" for NewQSO to make qso logging faster when working in contests. +With Tru and Msg is Loc setting it is useful also in VHF, UHF, SHF Tropo, Es etc. openings for fast qso +logging. Perhaps also in some other operations like WWFF activations. +

Note: This is NOT a contest logging add-on!!! It is a contest-notepad. +It is meant to be a tool for "Sunday contesters working in Tourist Class". Do not expect wonders! +

When contest window is open NewQSO has contest exchange fields visible. You may have to stretch NewQSO window horizontally to see them. +You do not normally need NewQSO window during contest. +
Only need for NewQSO is in case you have to edit an already worked qso. +Select qso normally via QSO list and press edit QSO button and you are able to edit qso, also the contest message part of it. +

Repeat: NewQSO is not meant to be used during contest qso feeds. All new qsos are entered via contest window.

-RECOMMENDATION: Make new log for each contest, consider not to allow qrz/hamqth search, it may slow down qso feed. -Note: This is NOT a contest logging add-on!!! It is a contest-notepad. -It is meant to be a tool for "Sunday contesters working in Tourist Class". Do not expect wonders! +RECOMMENDATION:
Make new log for each contest, consider not to allow qrz/hamqth search, it may slow down qso feed. +
It might be a good idea to have two logs the "contest" that is used during a contest and then cleared for new contest and the other as +"contest archive" where contents of "contest" are moved with adif export after Cabrillo log is sent. +
Benefit of having "contest" log with one contest is also that you get DXCC statistic right after cursor leaves callsign column. You can place contest window just above NewQSO/DXCC statistic.(see pic above).

-Contest window is just a "child form" for NewQSO to make qso logging faster when working in contests. -With Tru and Msg is Loc setting it is useful also in VHF, UHF, SHF Tropo, Es etc. openings for fast qso -logging. Perhaps also in some other operations like WWFF activations. -

-Contest window has a simple dupe check that turns typed duplicate callsign bold red printed. If you save a duplicate qso it is marked as "Dupe" in "Comment to qso" field. -
To get this working properly you must either create a new log for every contest or set dupe start date (I.E. contest starting day) with button "from YYYY-MM-DD" + +Contest window has a simple dupe check that turns typed duplicate callsign bold red printed. If you save a duplicate qso it is marked as "/D" in "RST sent" field. +When doing Cabrillo export it is operator's duty to decide what to do with "/D" reports +
To get duplication check working properly you must either create a new log for every contest or set dupe start date (I.E. contest starting day) with button "from YYYY-MM-DD"

-HOTKEYS work like with New QSO window. +

Hotkeys:

+Hotkeys work same way as with New QSO window.
  • 2x ESC clears all fileds
  • Note: 1x ESC returns cursor back to Call-field (if cursor is in some of the other fields like RSTr) and places cursor at the end of callsign for possible repairs.
    It also halts CW memory output if it is just running.
  • -
  • F1..F10 send CW macros etc.
  • +
  • F1..F10 send CW or VOICE messages depending on used mode.
  • TAB-key moves cursor between fields. (may also be SPACE key, if set)
  • +
  • Ctrl+Tab will set S&P mode
  • +
  • Shift+Tab will reset S&P mode

-Contest window has following fields and checkboxes:
+

Contest window has following fields and checkboxes:

    -
  • Tab in order when checked overrides all other Tab settings (below) and Tab Order is Call-RSTs-NRs-MSGs-RSTr-NRr-MSGr-SaveQSO-ClearAll
  • -
  • Call when you leave this field callsign is moved to NewQSO. Callsign turns BOLD RED if it is duplicate.
  • +
  • Contest name Selection box has a list of predefined contest names. When selecting one and leaving Contest name combo box name will be cut from "|"(including it) that separates contest name and explanation. + You can also type contest name here if it is not in list. Be sure you do not use "|" character(s) in name because program will cut name from the first one found. +
    RECOMMENDATION:
    +Add date to contest name if you keep many contests in same log. That way QSO list/Filter/Contest filter can separate contests by name.
  • +
  • Tab in order when checked overrides all other Tab settings (see below) and Tab Order is: Call-RSTs-NRs-MSGs-RSTr-NRr-MSGr-SaveQSO-ClearAll
  • +
  • Show hint when checked shows help text of object that mouse cursor currently points
  • +
  • CQ panel is visible when S&P is not checked (CQ calling mode)
  • +
    • CQ period timer period in millisecons to send one CQ+listen (5000 - 50000, 5-50sec) +
      To adjust: Set repeats=1, press CQ start, adjust period value so that F1 has time to run + listening time
    • +
    • CQ repeats repeat period how many times CQ period is repeated (1 - 20)s
    • +
    • CQ start start/stop repeated CQ calling. Shorcut key: Shift+F1. +
      Pressing ESC stops timer and CW send. It can not stop voice keyer script. +
      Also writing anyting to Call will stop running timer and CW sending.
    • + +
    • Last Cq Freq will show last used CQ frequency and mode. CQ frequency and mode is stored when F1 memory is launched either from keybord or from Memory keys F1 button. + Click on frequency or mode reading or Ctrl+L will restore rig to that frequency and mode. This value is not stored and clears when contest window is closed.
    +
  • Call when you leave this field callsign is moved to NewQSO. Callsign turns BOLD RED while typing if it is duplicate (and duplicate check is active).
  • SPACE is TAB when checked space bar acts like TAB-key moving to next field. Note:This prevents typing space (perhaps needed in MSG fields).
  • -
  • Dupe check Default checked. -
  • from YY-MM-DD Button to set duplicate check start date (I.E. contest start date). Must be set if you have all qsos in same log. -
    If every contest has it's own log can be as default (1900-01-01). Button is not visible if Ignore dupes is set. -
  • NoMode4Dupe Means that same callsign can be worked again on same band if mode is different. -
  • -
  • Ignore dupes Do not check duplicate qsos at all.
  • +
  • Dupe check Default checked. If you use same log for several contests, and/or other working, set the contest start date with from YY-MM-DD button. +
    if NoMode4Dupe is selected duplicate check allows qso with same station in same band if mode differs. +
    if Ignore dupes is selected it will ignore duplication check completely. +
    When dupe check is active and callsign is found as duplicate, but still saved, program will add /D to RST sent. + It is then operator's duty to clean or leave /D to exported Cabrillo log.

  • -
  • RST s copied from NewQSO, so should correspond used mode. Can be changed. -
    Note: defaults to 599 (as NewQSO) If mode is not CW it will change after cursor leaves callsign column. So do not worry when working non-cw contest!
  • +
  • RST s RST sent. Can be changed. +
    Note: defaults to 599 (CW) 59(phone). If rig mode is changed you get corresponding RST with 2xESC. +
    It also changes when cursol leaves call column. So do not worry when working mixed mode contest!
  • Tru means you like to exchange true reports. Makes Tab order to stop at RST (s & r) fields. Useful in some high band contests, Es and tropo openings.

  • -
  • NR s serial number to send. +
  • NR s serial number to send.
    Note: you can type only numbers to NR s field.
  • Inc if checked it will auto increment serial number. You may change this number at any time. Increment goes on from typed number.

  • -
  • MSG s sometimes you may need an additional message with number, or just a message with no number. On high band contests you may type your locator here.
  • -
  • Qsp if checked makes TAB order stop at MSG s. Content of MSG s is taken from last logged MSG r. Cursor is placed at the end of message for possible edit. For contests where you have circulating message: At 1st qso you set your own word to send, after that you send previously received word as your next own message.
  • +
  • MSG s sometimes you may need an additional message with number, or just a message with no number. + On high band contests you may type your locator here.
  • +
  • Qsp if checked makes TAB order stop at MSG s. Content of MSG s is taken from last logged MSG r. Cursor is placed at the end of message for possible edit. + For contests where you have circulating message: At 1st qso you set your own word to send, after that you send previously received word as your next own message.
  • +
  • S&P When Search & Pounce is checked operator launces all CW/Voice messages manually. +
    When S&P is not checked (in RUN mode) program launches message F2 when cursor enters one of RSTr, NRr, or MSGr columns. This way also if true reports are selected F2 is sent after your message is ready. +
    In case duplicate checking is enabled and callsign is duplicate, message F3 is launched instead of F2 and it happens always when cursor leaves callsign column. +
    When Enter or Save qso button is pressed program will send message F4. +
    Message F1 can be used for CQ that is manually launched. +
    When phone modes are used messages are lauched same way but you need very special voice script if you want to include worked station's callsign into F2 and F3 messages, but launcing F4 at QSO save may be useful. +
    NOTE: When S&P checkbox changes state then also CW memory sets are switched between "S&P" and "Run". +
    See more about CW messages how to define messages with macros and save/load different setups of CW messages.

  • -
  • RST r copied from NewQSO, so should correspond used mode. Can be changed.
  • +
  • RST r RST received. Default to 599 (CW) 59 (phone). Can be changed. +
    Default rst for CW and phone is created from rig's current mode. If you do not have cat controlled rig select "Hamlib dummy #1" as rig and set correct band and mode from TRXControl's band buttons. +

  • NR r serial number you receive.
    Note: you can type only numbers to NR r field.
  • -
  • No if no serial number then setting this changes tab order so that it jumps directly to MSG r.
  • +
  • No if thre is no serial number in contest this setting changes tab order so that it jumps over, directly to MSG r.

  • MSG r message you receive
  • MSG is Grid If 'MSG is ...' is checked then message will be logged in SRX_String AND ALSO to selected NewQSO column. @@ -98,13 +135,16 @@ Contest window has following fields and checkboxes:

    If MSG is Grid but the entered locator is not valid it will NOT be copied to NewQSO/Grid column and stays only in Srx_String.

    In case of MSG is State and callsign is detected by prefix to be a Germany callsign srx_string is copied to DarcDOC column, orherwise to State column. -
    In case of MSG is Comment and dupe checking is allowed, and dupe found, Comment to QSO contains first "Dupe " and then the copied message.
  • -
    +
    In other cases MSG is copied to correspondig NewQSO column. +
    NOTE: After selecting 'MSG is ...' remember also to check the checkbox to get it activated! +
+

Buttons you really do not need (you should NOT use mouse when working contest!):

+
  • Save QSO Save QSO button at NewQSO, increments NR and clears all fields. -
    Note: pressing ENTER at any time after Call field is filled does the same.
  • -
  • Clear QSO Clear all QSO information. +
    Note: pressing ENTER at any time after cursor is out from Call column does the same.
  • +
  • Clear QSO Clear all QSO information.
    Note: Pressing 2x ESC key does the same.
  • -
  • Clear all Clear all fields. Usefull when starting a new contest to remove saved settings.
  • +
  • Clear all Clear all fields. Usefull when starting a new contest to remove all saved settings.

All settings, including contest name, are saved when closing contest form. When opening cqrlog and contest form again after rest period you can directly continue contest working. @@ -113,18 +153,72 @@ All settings, including contest name, are saved when closing contest form. When

Typical contest qso goes like this:
Type callsign->press TAB->type contest rxnumber->press TAB->type contest message->press ENTER. -Or hit ENTER after rxnumber if no additional message is exchanged. +Or hit ENTER after rxnumber if no additional message is exchanged. When S&P is checked you maybe need to launch some Cw messages manually.

-

Remember that pressing ENTER key at any field saves qso with existing values. How ever there must be -callsign of least three characters long. Sent/Received number and message are not needed. +

Remember that pressing ENTER key at any column saves qso with existing values. How ever there must be +callsign of least three characters long. Sent/Received number and message(s) are not needed.
There is no need to use the mouse. Keep your hands on keyboard (and possible on CW key / PTT (if not foot pedal in use)). It is faster.

-Contest numbers and messages are saved in log into their own columns. Use preferences/Visible columns to show them in Qso list. +Contest numbers and messages are saved in log in their own columns. Use preferences/Visible columns to show them in Qso list.

-CW macros can be used for sending contest meessages. Look them from help section CW Operation +CW messages can be used for sending contest messages. Look at help section CW Operation + how to use macros in messages. +
NOTE: If you use macro that sends whole contest message (%xrs = RST, STX, STXString) message will skip empty ones. This way %xrs works for all contests. +

+

Status view support

+NOTE: If you have one log called contest that you clear always before contest, to have just qsos of that contest, and after contest you move all qsos +with adif export to another log called archive you can view contest status afterwards from that log if you have used unique contest names I.E. added contest start date to name. +
Find contest with Filter/Contest filter and copy name from selection list box and paste it to Contest window. You do not have to activate contest filter to see the status of that contest. +

OK1WC memorial contest status is supported. +

+

-ADIF exports fields to right tags.

+If contest name has "mwc" or "ok1wc" included (no case sensitive) then status counting is activated. At the start of contest (and any oher time when no qso to save) it can be seen by pressing 2xESC. +After saving a qso Status view is updated. +
TRXControl must show that rig is on 80m or 40m band. If you do not have cat controlled rig select "Hamlib dummy #1" as rig and set correct band and mode from TRXControl's band buttons. +
Only bands 80M and 40M and mode CW are counted (See rules of contest). +

+

+
+

Nordic Activity Contest (NAC) status is supported. +

+ +

+

+If contest name has "nac" included (no case sensitive) then status counting is activated. At the start of contest (and any oher time when no qso to save) it can be seen by pressing 2xESC. +After saving a qso Status view is updated. +
+

+

+

Common status is supported. +

+ +

+

+If contest name has any name that does not fit rules of two above status counting is activated. At the start of contest (and any oher time when no qso to save) it can be seen by pressing 2xESC. +After saving a qso Status view is updated. +
There are several items shown in Status display. You can control them by left click below text Status (but above status display itself). +
The DX and own continent counts (EU in picture) are defined against your callsign in preferences/station/call. +

To see Status section you may need to stretch the bottom part of Contest window. +
NOTE: Status counting may have errors! It is just for showing progress of contest, not to show final score. +

+ +

+

After contest

+Most contests expect Cabrillo log format. Cqrlog has a limited support of Cabrillo exports. Mostly enough for a Sunday contester. +
In case you want to use external Cabrillo program you have to make ADIF export of qsos +and then use another program.

+
+I found nice adif2cabrillo program for Linux from http://users.telenet.be/on4qz/ that supports ADIF importing. +

Starting is bit complicated: +
You need to compile it from source. Qt5 with qmake (called qmake-qt5 if your distro is Fedora) is needed to be able to compile +it.
+Then there are no templates for different contests. You have to create them, but after that it serves you well! +It accepts nicely exported ADIF format from cqrlog and dig out STX and SRX as expected. +

+

+

ADIF exports fields to right tags.
<RST_SENT:3>599<STX:3>001
<RST_RCVD:3>599<SRX:3>002
<RST_SENT:3>599<STX:3>003<STX_STRING:2>SA
@@ -138,19 +232,7 @@ ADIF exports fields to right tags.

HTML export will look like this:

-

-
-Most contests expect Cabrillo log format. Cqrlog has a limited support of Cabrillo exports. Mostly enough for a Sunday contester. -
In case you want to use external Cabrillo program you have to make ADIF export of qsos -and then use another program.

-
-I found nice adif2cabrillo program for Linux from http://users.telenet.be/on4qz/ that supports ADIF importing. -

Starting is bit complicated: -
You need to compile it from source. Qt5 with qmake (called qmake-qt5 if your distro is Fedora) is needed to be able to compile -it.
-Then there are no templates for different contests. You have to create them, but after that it serves you well! -It accepts nicely exported ADIF format from cqrlog and dig out STX and SRX as expected. -

+


diff --git a/help/h1.html b/help/h1.html index df3c08c..33cb9c3 100644 --- a/help/h1.html +++ b/help/h1.html @@ -34,9 +34,9 @@
There are some additional startup parameters that you can use with command terminal, or add them to your startup menu parameters of cqrlog. Those parameters can be listed in command terminal starting cqrlog as: cqrlog -h , or: cqrlog --help

-

Starting with --remote or -r takes one letter argument J, M or K that is not case sensitive. Letters correspond quick control keys in NewQSO/File to start three remote modes. +

Starting with --remote or -r takes one letter argument J, M or K that is not case sensitive. Letters correspond quick control keys in NewQSO/File to start three remote modes.
When one of these are assigned cqrlog will jump to selected remote mode 10 seconds after startup is complete. -

Starting with --debug takes one number (NR) usually 1 to see full debug. Thtere are also some negative numbers in use to limit debug prints to certain functions. Mainly for developer usage. +

Starting with --debug takes one number (NR) usually 1 to see full debug. Thtere are also some negative numbers in use to limit debug prints to certain functions. Mainly for developer usage.

Preferences

@@ -101,9 +101,11 @@ Grayline offset - sometimes the gray line position is not accurate. You can set your own correction.

- Great circle Short and Long path line plotting may be adjusted here. Plotting step is decimal degrees > 0.0 and < 40.0. In polar areas where distance/degree is smaller this value is divided by integer divisor value > 0 and < 40. + Great circle Short and Long path line plotting on Grayline map may be adjusted here. Plotting step is decimal degrees > 0.0 and < 40.0. In polar areas where distance/degree is smaller this value is divided by integer divisor value > 0 and < 40.
You may test different values if you like. If Columns are left empty the default values 0.1 and 10 are replaced.
Color for Short- and Longpath lines can be selected, as well as the line plot width (1 -5 pixels) +
If rotor control is used also beam heading path may be plotted on Grayline map. Color, plot line width and length may be adjusted. +
Note:At N and S polar areas beam length may be cutted to avoid false plotting. Then reduce the lenght of beam line (fixes to calculation routine are welcome)

Check for newer version of DXCC tables after program startup
- if checked, CQRLOG will check if any update of the country files is available. If a new version is found, @@ -171,7 +173,7 @@ QSO appears in this list immediately after logging, however the refresh procedure is quite slow. To save time, keep this box unchecked.
The 'Skip over mode and frequency when radio is connected' is very important if the radio control is active.
- The 'Enable auto search on HamQTH.com/QRZ.COM' switches on the automated search + The 'Enable auto search on HamQTH.com/QRZ.COM/QRZCQ.com' switches on the automated search for HamQTH/QRZ callbook data for any worked station. This option does the same as F6 on the logging screen, however it can be rather slow depending on the HamQTH.com/QRZ.COM server availability.
@@ -208,48 +210,92 @@ Checked bands are visible in both statistics appearing at the bottom of logging screen (bands/modes of the actual logged station) and main DXCC, WAZ and ITU zones statistics. It also affects the Challenge points at the bottom of the DXCC statistics.
- Pressing button frequencies band, and mode limits within bands, can be set. + Pressing button frequencies band, and mode limits within bands, can be set.


TRX Control



-
-

Note: Running same time CQRLOG and other software that uses rig's CAT control can not be done by just setting rig same parameters to both programs. -
That causes problems. See this document for more information: https://github.com/OH1KH/cqrlog/blob/loc_testing/compiled/setting_rigctld_for_all_programs.pdf -

Note: CQRLOG supports operating with two TRX radios but only one can be active at a time. -

- Radio one, desc: is a description you'll see in TRX control window. It is only - descriptive text, you can write whatever you want.

- Host: computer where rigctld is running, localhost is fine for most cases.

+
Running same time CQRLOG and other software that uses same rig's CAT control can not be done by just setting rig same parameters to both programs. + That causes problems. See this document for more information: https://github.com/OH1KH/cqrlog/blob/loc_testing/compiled/setting_rigctld_for_all_programs.pdf + +
  • Note: CQRLOG supports operating with six Rigs but only one can be active at a time. +
+ Path to rigctld binary This tells Cqrlog from where to find rigctld that is a part of Hamlib. That is important for two + reasons. +
1st The rig model list is loaded from rigctld when preferences open. That makes model list to be always up to date and Cqrlog + supports always all rigs that current rigctld can support. +
2nd rigctld is started when Cqrlog starts (most of cases). Writing whole path makes rigctld to be found also the when it is not found + from default path. +
  • Note: Usuallly rigctld is found from /usr/bin, but if you have compiled it by yourself from source it may default to /usr/local/bin +
+ Nr of radios: With this you can select how many radios Cqrlog will support (Max 6, now). +

+ Name:This is the radio name that you will see in combo box selector lists: TRXControl, Prefrences/TRXControl, Modes, CW interface. + If rig is not defined, means rig Model is empty, you will see "None" here. If you want to remove existing rig definition select it from selector, then clear + rig Model manually using delete key and change selector to another rig, or close prfereces with "OK" button. +
This will remove also rig's Modes and CW interface definition from configuration file. Next time you select deleted rig Cqrlog will load all defaults to settings. +
  • Note: If you have 3 rigs and you delete rig #2 Cqrlog does not reorder selection list. Your rig #3 stays as 3rd in + selector list and #2 becomes "None" +
+ Host: computer where rigctld is running, localhost is fine for most cases but can be IP address of another computer where + rigctld is running (I.E. even over local network or internet)

RIG model: choose your radio model from the list.
Rig models below 10 (Dummy, NET rigctld, FLRig, TRXManager) are using TCP communication and so the Device as well - as Radio serial parameters do not need settings.

+ as Radio serial parameters do not need settings. +

Device: device which the radio is connected to. /dev/ttyS0 is COM1, /dev/ttyS1 is COM2 etc. If you use USB to serial interface, the device will usually be /dev/ttyUSB0 for COM1 etc. If you are using Ubuntu or Debian, you have to be member of the dialout users - group to have rights to the serial ports.

- Poll rate: specifies how often CQRLOG should read data from rigctld. 500 milliseconds - is fine.

+ group to have rights to the serial ports. +
  • Note: When connecting to rigctld emulator that imitates a rig via TCP connection the IPaddress and port may be written here like: 192.168.60.1:1234 +
  • Note: With recent rigctlds you can use also names in /dev/serial/by-id/ folder. That way the device name does not change + like it often happens if you reorder USB wires in PS's sokets. +
    (I.E my ci7300 shows out as /dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_IC-7300_03003483-if00-port0 ) +
+ Poll rate: specifies how often CQRLOG should read data from rigctld. 500 milliseconds is defaut. + If your rig is old and slow values 1000 - 3000 may work better. +

Port number is the number of the port used to communicate with rigctld. - Default value is 4532. The second radio, has to have a different port e.g. 4533.
-
Extra command line arguments usefull when you have to specify more parameters to - rigctld. E.g. CIV address (--civaddr=ID, where ID is the CIV address).

- Run rigctld when program starts is usually checked but when rig model #2 Hamlib Net Rigctld is used then it is unchecked and disabled because with that rig setting we are trying to connect external rigctld. Either in same PC or in network. -
If rig model #1 Hamlib Dummy is selected Run rigctld when program starts is forced to be checked. This allows testing and simulated operations without rig CAT control. -

Use \chkvfo is normally checked. Then cqrlog tries to find out is rigctld started with parameter "--vfo" because that changes rigctld command format. Uncheck of this disables this function. Use it in case of problems. -

Serial port parameters Use the manual of your rig, please choose the correct options. + Default value of rigctld is 4532. +

+ Extra command line arguments usefull when you have to specify more parameters to + rigctld. E.g. CIV address (--civaddr=ID, where ID is the CIV address) or similars. See rigctld man page for supported parameters. +

+ Use CWR insted of CW means that mode CW will use reverse sideband in receive. +

+ Run rigctld when program starts is usually checked but when rig model #2 Hamlib Net Rigctld is used then + it is unchecked and disabled because with that rig model we are trying to connect externally running rigctld. Either in same PC or in network. +
If rig model #1 Hamlib Dummy is selected Run rigctld when program starts is forced to be checked. + This allows testing and simulated operations without rig with CAT control. +
  • Note: If you use Cqrlog without connected rig it may be usefull to select rig model #1. Then you can open TRXConrol + window and set bands, modes and frequency from there that might be more convinient than selecting them from NewQSO window. +
    Model Hamlib Dummy starts default from 145MHz frequency. Seeing that in TRXControl window tells you that Dummy rig is running. +
+ Use \chkvfo is normally checked. Then cqrlog tries to find out is rigctld started with parameter "--vfo" because + that changes rigctld command format. Uncheck of this disables this function. Use it in case of problems. This may be default ON in future + Hamlibs version > 5. +

+ Serial port parameters Use the manual of your rig, please choose the correct options. Very often it is much better to specify only serial speed and leave other options as default. - Default value means that the settings from HamLib will be used.
-
- User defined TRXControl buttons can be defined here. Your defined buttons will shown in the TRX Control window after - you drop select this option in using the Preferences tab in the TRXControl window. For setting up buttons use - preferences option from TRXControl drop select option Preferences. From TRX Control tab you will find group - box named User defined TRX control buttons. - The first column is button name shown (4char max). In the same area the second column is the command(s) to execute. Definition can consist one - command or several in a queue, rigctld commands may be used or if definition starts with word "run" (without quotes) it can be a program or - script name with full file path for your computer. + Default value means that the default settings from HamLib will be used. That should be fine in normal cases. +

+ Rig pwr ON cmd When checked Cqrlog will send power ON command at startup to rig if rig can support power commands. +

+ Set UTC to Rig When checked Cqrlog will send "set_clock" command with current UTC time to rig on next full minute change after initialization. +
Note: All rigs do not support set_clock command. +

+ Compound poll When checked Cqrlog will send rig poll command as one line "+f +m +v". That is Cqrlog default. +
When unchecked every command will be sent with LineEnding, I.E. in it's own line. This may help poor rigctld emulators like WFview. +

+ User defined TRXControl buttons can be defined here. Your defined buttons will be shown in the TRX Control window after + you select this option using the Preferences menu/Show Usr buttons in the TRXControl window. +
+ The first column is button name shown (4char max). In the same area the second column is for the command(s) to execute. + Definition can consist one command or several ones in a queue. +
rigctld commands may be used directly or if definition starts with word "run" (without quotes) + it can be a program or script name with full file path.
  • Note: Rigctld supports raw command W. Parameter for it is the rig cat command in bytes. Prefix \0x must be added for Hex values. Usr1 command in picture Sets IC7300 to 60m CW with 500Hz filter and reduces output power to leagal limit with raw command.
  • @@ -279,7 +325,6 @@
    Ctrl-0 will disable XIT.
    Ctrl-9 has a random value 0-990Hz that is added to setting if split is up. If split is down it is subtracted.
    -


@@ -289,11 +334,11 @@ Setting up Rotator control is very similar to setting up Rig control. Rotor models 1 and 2 (Dummy, NET rotctld ) are using TCP communication and so the Device as well as Rotor serial parameters do not need settings.


-
If Use rotctld \dump_state info for limits cheked rotctld asks turning limits AzMin and AzMax values from rotctld with command '+\dump_state'. +
If Use rotctld \dump_state info for limits cheked rotctld asks turning limits AzMin and AzMax values from rotctld with command '+\dump_state'. That makes user possible to set turning limits other than rotator default turn with Extra command line arguments. Using string --set-conf=min_az=10,max_az=355 you can set rotator so that cqrlog will never turn it below 10deg or over 355deg.
Using negative value at az_min causes Cqrlog set it's 0degrees "P"-command to given negative value (while still displaying 0). I.E if az_min=-180 Cqrlog will use turning commands from "P-180" to "P180". -
Without negative az_min or when checkbox Use rotctld \dump_state info for limits is not set Cqrlog sends commands in usual range "P0 to "P360". +
Without negative az_min or when checkbox Use rotctld \dump_state info for limits is not set Cqrlog sends commands in usual range "P0 to "P360".

Some rotators have turn from -180deg-0deg-180deg (south stop), like Hamlib Dummy test rotator.
Most of rotators have turn 0deg - 360deg.
Some may turn 0deg - >360 deg. With them cqrlog never drives values over 360, but reads position right if rotor sends over 360 deg value (sent_value-360 = cqrlog display). @@ -305,32 +350,45 @@ Setting up Rotator control is very similar to setting up Rig control. Rotor mode You can define your own favourite frequencis and swich between them directly in New QSO window using ALT+V (Mem down) and ALT+B (Mem up). These keys are used in N6TR clones to switch between bands.
-You can also switch between memory frequencies with TRXControl's M up and M dwn buttons and set rig frequencies +You can also switch between memory frequencies with TRXControl's M up and M dwn buttons and set rig frequencies by double clicking rows in TRXControl's Add/Modify memory list.



Modes



-

Here you can set up the default bandwidth for any of the supported modes (CW - SSB - RTTY - AM - FM). -If your radio is tuned to the corresponding band segment or if you switch the mode on the radio -control panel, CQRLOG will change the bandwidth to the desired value. The bandwidth can be -changed at any time, however a program restart will probably be needed to make the changes -take effect.
-Some TRX like ICOM don't have support for this in HamLib. To get mode settings work, set -all values to 0 (zero). -

User definable digital modes can be set up in a separate box. Use comma -as a separator, ie. MYMODE1,MYMODE2 etc.
-user should add digital modes (submode names) exactly as written in this table ADIF.org: Mode_Enumeration +

Here you can set up the default bandwidth for any of the supported modes (CW - SSB - DATA - AM - FM) for rig selectd from Radio +selector list box. +If your rig is tuned to the corresponding band segment or if you switch the mode from TRXControl buttons CQRLOG will change the bandwidth + to the defined value. +
Setting 0 (zero) to values means that rig should use default bandwidth. This is good selection also when rig can not support bandwidth +settings (like some ICOM rigs). +
Setting -1 here means that bandwidth setting must be kept as it was. This also needs that rigctld supports negative value (version >= 4). +

+Log mode This is the data mode you most often use. Defaulting to RTTY. From mode selector you can select another mode. +If mode does not exist you have to define it in User defined digital modes and then come back to mode selector. +
+This mode efftects to DXCluster window's spot line coloring (See DX Cluster ) and also sets defined mode if DX spot line +is double clicked. +

+CAT cmd This is the rigctld mode command that needs to be sent to rig to get rig to proper mode for Log mode. +

+Use also reverse (cat -> rig) This defines if Cqrlog should show Log mode when rig is set to CAT cmd +mode. This may have a pitfall. If your settings are for example SSTV and USB then Cqrlog will select mode as SSTV also when you are working USB fone qsos. +
Usually this needs not to be set if DATA qsos are worked with external program using Cqrlog remote modes. +

+User defined digital modes can be set up in a separate box. Use comma as a separator, ie. MYMODE1,MYMODE2 etc.
+User should add digital modes (submode names) exactly as written in this table ADIF.org: Mode_Enumeration If mode is missing from NewQSO/mode selection list and not added to User defined digital modes it may prevent ADIF import causing "wrong mode" error. -

-Note:
-Cqrlog uses internally modefied mode name. We call it here CqrMode. CqrMode is created from ADIF mode and submode with conversion table. CqrMode is mainly ADIF submode if it exist, with some exceptions. +

  • +Note: Cqrlog uses internally modified mode name. We call it here CqrMode. CqrMode is created from ADIF mode and + submode with conversion table. CqrMode is mainly ADIF submode if it exist, with some exceptions.
    Cqrlog will create four files in ~/.config/cqrlog folder for this use if they do not exist. One is a brief README_modefiles explaining three other files purposes. -

    If files exist they are not overwritten keeping possible user changes there. How ever user must do backups by himself if files are edited from original format. +
+If files exist they are not overwritten keeping possible user changes there. How ever user must do backups by himself if files are edited from original format. These files apply to all logs created. They are not log based. -
    -
  • submode_mode.txt +
    • +submode_mode.txt
      This file holds submode=mode pairs used to convert incoming mode+submode pair to CqrMode that mainly is the submode.

      All pairs must be in uppercase format. User can add or delete mode pairs with text editor if definition at
      ADIF.org: Mode_Enumeration changes. @@ -391,23 +449,29 @@ for each operation.


This option allows an easy setup of the log fields to be exported into ADIF or HTML format. -Only checked fields are exported. The 'Column' option names columns at header line. 'Width' option denotes the column width in approx. count of 16px characters. +
Only checked fields are exported. The 'Column' option names columns at header line. 'Width' option denotes the column width in approx. count of 16px characters. Both options affect only for the HTML export.
The SAT mode field is not stored in the database but instead calculated on the fly from frequency and RX frequency and for SAT QSOs only.
Width setting is ignored if "HTML auto column width" is checked when longest text in column (column name or data) sets the column width. -
Distances are not exported when doing log backup at cqlog closing phase. They will be calculated and exported (if selected) in ADIF, HTML and QSL label printing. +

Distances are not exported when doing log backup at cqlog closing phase. They will be calculated and exported (if selected) in ADIF, HTML and QSL label printing. Calculation of distances requires that preferences/station/locator is set and applied (automatic) to every qso and that at least 4 digit locator - (in case "ll" is added as 5 and 6th char to get the center of grid) of destination station logged. Sometimes importing logs from other logging program may leave own station locator unset. In this case QSO list/File/Group edit must be used for updating "my locator" field. + (in case "ll" is added as 5 and 6th char to get the center of grid) of destination station logged. +
Sometimes importing logs from other logging program may leave own station locator unset. In this case QSO list/File/Group edit must be used for updating "my locator" field.

DX cluster



-This dialog allows an easy setup of the DX cluster spot filtering. Check the bands you want -to display. If you want to supress (ie. filter out) spots for some DX countries, put -its prefixes in the box below. Use a semicolon as a separator. +Show only spots
+This dialog allows an easy setup of the DX cluster spot filtering. Check the bands and modes you want +to display. +

Note: Mode checkboxes here refer to Preferences/Modes set for every rig separately, and DATA refers to setting of "Log mode" there. +
Each mode's frequency limits are set at Preferences/Bands/Frequencies. +
Without proper setting of these spot filtering can not work and may not drop Spots you wish to disable, or may not show Spots you want to see. +

If you want to supress (ie. filter out) spots for some DX countries, put +those prefixes in the box below. Use a semicolon as a separator.

-Callsign alert - allows you to enter callsigns that you are interested in. Eg. some special station for an award etc.
-Run this command when callsign is spotted: will run select command when any of callsigns you've enter appears in the cluster.
+Callsign alert
Allows you to enter callsigns that you are interested in. Eg. some special station for an award etc.
+Run this command when callsign is spotted
Will run select command when any of callsigns you've enter appears in the cluster.
E.g. use this if you want to see small window with information:

zenity --info --text='Callsign $CALLSIGN detected at $FREQ $MODE' --title=Info

You have to install zenity, first. (Thans to SV2RCK for the tip!) @@ -424,10 +488,11 @@ This is also possible with "notify-send". The display duration is set in ms (-t

-Show country name in the DX cluster spot - next to every spot, you will se the coutry name of the DX station
-Send these commands to telnet DXCluster when connected - one or several commands with comma separated can be sent to DXCluster after connect is initialized. - If your command(s) have space(s) between, like "acc/spot by_zone 14,15,16 and not (on hf/data or on hf/rtty)" it is recommended to close each command between double quotes.
-Connect to DX cluster after program startup - after log is opened, cqrlog will connect to your default cluster. Please remember that +Show country name in the DX cluster spot
Next to every spot, you will se the coutry name of the DX station
+Send these commands to telnet DXCluster when connected
One or several commands with comma separated can be sent to DXCluster after connect is initialized. + If your command(s) have space(s) between, +
like "acc/spot by_zone 14,15,16 and not (on hf/data or on hf/rtty)" it is recommended to close each command between double quotes.
+Connect to DX cluster after program startup
After log is opened, cqrlog will connect to your default cluster. Please remember that username and password(if needed) have to be filled in the cluster list.

@@ -639,18 +704,22 @@ There are no known dependencies issues.


Normally you do not need to touch eQSL addresses. But in case something changes at eQSL web pages it might be possible to fix it here without rebuilding cqrlog program.

CW interface



- Choose your preferred CW interface for radios you have. There are 5 options: None, WinKeyer USB, - cwdaemon, K3NG keyer and HamLib. We strongly recommend Winkey USB by Steve Elliot, K1EL, - which provides 'all in one' keying, including one of most advanced paddle keyers available. - cwdaemon should be seen as a backup option with many limitations, which may need - a custom linux kernel to avoid sloppy CW at speeds above 25 WPM. If cwdaemon is used, - only keyboard keying is possible. -
If you use same keyer for both rigs, and it is not HamLib, you can check Do not reset when switch radios to prevent keyer reset (that sets CW speed to default). + Choose your preferred CW interface for radio you have selected from Radio selector list. +
There are 5 options: None, WinKeyer ,cwdaemon, K3NG keyer and HamLib in CW interface type selector list. +
We strongly recommend Winkeyer by Steve Elliot, K1EL, which provides 'all in one' keying, including one of most + advanced paddle keyers available. +
When checking Use potentiometer's CW speed Cqrlog does not send Default CW speed command to keyer + when it is initialized.

- Detailed setup of the CW devices is here: + cwdaemon should be seen as a backup option with many limitations, which may need a custom linux kernel to avoid + sloppy CW at speeds above 25 WPM. If cwdaemon is used, only keyboard keying is possible. +

If you use Do not reset when switching radios it prevents keyer reset (that sets CW speed to default). + This option does not apply with Hamlib keyer in use. +

+ Detailed setup of the CW devices are here:
    +
  • Winkeyer
  • cwdaemon -
  • Winkey USB
  • K3NG
  • HamLib @@ -683,9 +752,9 @@ There are no known dependencies issues.

    Setting wsjt-x interface is mainly same as setting fldigi. How ever communication is done via UDP frames and so the IP address and Port must be specified.
    Default values are 127.0.0.1 or localhost for address and 2237 for port. These are set in wsjt-x settings/reporting and if changed there, must also to be changed here.
    - Address can also be other PC's IP address if wsjt-x is running in different networked PC than cqrlog, or even 0.0.0.0 when cqrlog listens all transmits from every wsjt-x in network. + Address can also be other PC's IP address if wsjt-x is running in different networked PC than cqrlog, or even 0.0.0.0 when cqrlog listens all transmits from every wsjt-x in network. -

    You can also use a multicast address for both wsjt-x/settings/Reporting/UDP Server and cqrlog/preferences/fldigi/wsjt interface/wsjt addr. Cqrlog will handle ip addresses starting with "239." as multicast addresses. +

    You can also use a multicast address for both wsjt-x/settings/Reporting/UDP Server and cqrlog/preferences/fldigi/wsjt interface/wsjt addr. Cqrlog will handle ip addresses starting with "239." as multicast addresses.
    With multicast you are able to run several programs listening to wsjt-x udp broadcasts at same time. To start with multicast try multicast group address "239.255.0.0" for both cqrlog and wsjt-x (and also other programs needed to listen wsjt-x)

    Using WB4 chk starts from it is possible to limit log search starting from given date for callsign and/or locator. @@ -734,9 +803,9 @@ There are no known dependencies issues.


    Note: Setting html browser here affects only to call attachments and it can be different than system default, or different than selected at preferences/program tab.
    Hint: If you click Web browser name edit box a file open dialog opens and you can navigate to your browser. If you place cursor on Web browser name edit box, press left button and keep it down, you can paint exisiting text and use delete button to clear it and type new text.

    Callbook support

    - CQRLOG supports HamQTH and QRZ.com + CQRLOG supports HamQTH, QRZ.com and QRZCQ.com callbooks but only access through the XML interface is supported. HamQTH has a free interface, - for QRZ.com you have to pay an annual fee.

    + for QRZ.com and QRZCQ.com you have to pay an annual fee.



    RBN support

    @@ -767,17 +836,19 @@ There are no known dependencies issues.

  • Delete old information after XX seconds The dots won't stay on the map forever. 180 seconds (3 minutes) is a good default value. -
    Note: Dots also depend on the band, if you change band, dots will always be deleted. All data is band related.
  • +
    Note: Dots also depend on the band, if you change band, dots will always be deleted. All data is band related.

    Online log upload support

    CQRLOG supports online log upload to HamQTH, - ClubLog.org and - HRDLOG.net
    + ClubLog.org, + HRDLOG.net and + N1MM+ UDP contact messages


    Both ClubLog and HamQTH need a username and password, Clublog also needs the email address used when you registered. HRDLog.net needs only user name and the code you got by e-mail. + N1MM+ format UDP messages require a hostname/IP and port number in format hostname:port (e.g. 127.0.0.1:5444). You can set different color for each service. This color will be used for status messages which will inform you about upload progress. Upload QSO data immediately after save, update or delete means that every @@ -789,6 +860,7 @@ There are no known dependencies issues.

    How to get it to work?

    • check if you have set correct username, password (email, Code)
    • +
    • in case Url address of online log API has changed you are able to change it here
    • export all data from the log to ADIF file
    • import this adif file to the website of online log you are going to use (if you are using HamQTH, please wait untill the email about a successful import arrives) diff --git a/help/h20.html b/help/h20.html index 82ce727..b6fe649 100644 --- a/help/h20.html +++ b/help/h20.html @@ -60,13 +60,13 @@ - Ctrl-1...Ctrl-9 + Ctrl-1...Ctrl-9

      Set split using XIT if rig supports it. Value 0 - 9999Hz UP/DOWN
      Ctrl-9 will add random value 0 - 990Hz to setting. Subtract if split is DOWN
      Keys work also when TRXcontrol window is active - Ctrl-0 + Ctrl-0
      Disables XIT
      Key works also when TRXcontrol window is active @@ -293,6 +293,54 @@

      +When "Contest" window is active:

      + + + + + +
      + The "Contest" is the screen for fast qso input and some contest related properties +
      +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      ESC

      1x Stops CW memory sending
      2x Returns cursor to Call column
      3x Empty all fields and prepare program for a new QSO
      F1..F10
      Sends CW memories 1..10 when rig is in CW mode
      Call voice keyer script 1..10 when rig is in phone mode
      Shift+F1
      Starts/stops Memory1 (CW or phone) repeat timer when S&P is enabled
      Writing to call column or 1xESC stops repeat sending (in case of CW memory)
      PgUpCW Speed +2 WPM (QRQ)
      PgDnCW Speed -2 WPM (QRS)
      Ctrl-1...Ctrl-9

      Set split using XIT if rig supports it. Value 0 - 9999Hz UP/DOWN +
      Ctrl-9 will add random value 0 - 990Hz to setting. Subtract if split is DOWN
      Ctrl-0
      Disables XIT
      Ctrl-A
      Sets callsign to Band map (for later return with double click)
      +

      New QSO (online logging)

      While logging online (during your QSO), date, start and end time are diff --git a/help/h21.html b/help/h21.html index 15f228f..e68b188 100644 --- a/help/h21.html +++ b/help/h21.html @@ -31,10 +31,10 @@

      DX Cluster Operation



      There are two basic options - web cluster and the usual DX cluster with -telnet options. The web cluster method is good for monitoring. There is no -internal node setup, but you can't spot. CQRLOG downloads the spots at +telnet options. The web cluster method is good for monitoring. There is no +internal node setup, you can not spot. CQRLOG downloads the spots at regular intervals, the interval is fixed and cannot be changed. -

      Telnet cluster is fully featured. You can also set up your +

      Telnet cluster is fully featured. You can also set up your preferences on the node. The Command line box is used for all commands, settings etc. with one exception - the Tilde key (~) is used for spotting. The color coding and spot filtering is set up in the @@ -42,6 +42,10 @@ The color coding and spot filtering is set up in the Cluster node by simply clicking the 'Connect' button. You should see the cluster node messages indicating progress. You can enter any command into the 'Command' field (ie. SH/DX to display last spots, SH/U to see the users connected to the node etc.). +



      +When Telnet connection is active the "F-keys" tab becomes visible. There you can define 10 commands to be sent to DXCluster by pressing corresponding +F1 -F10 key while keeping also Shift key pressed. +

      Double click with mouse left on DX spot line applies DX callsign to NewQSO and sets rig frequency to spot QRG. If you have checked NewQSO/Auto checkbox and set mode frequencies at preferences/bands/frequencies also right mode will be set to rig.
      If there is additional info available on spot line it is copied to clipboard. You can set cursor to desired NewQSO field and apply info from clipboard with Ctrl-V. diff --git a/help/h24.html b/help/h24.html index 254660d..e342939 100644 --- a/help/h24.html +++ b/help/h24.html @@ -115,22 +115,26 @@ The 'Save' button exports the statistics to an ASCII text file. The DOK statistics give you an overview of your collected German DOKs. These statistic is derived from the DOK field of each logged contact.
      If a QSO record does not contain DOK information, the statistics do not reflect this fact.

      -To resolve the DOK into a readable name, please activate in menu preferences - program the setting "Check for newer version of DOK database after program startup". This will download dok.csv and sdok.csv files to ~/.config/cqrlog/dok_data

      - -The option 'Show logged (S)DOKs only' will reduce the list, to show only worked DOKs and not all known DOks.

      - -The ComboBox 'DOK & SDOK' give you the option to see DOK&SDOK, only DOK and only SDOK.

      - +To resolve the DOK into a readable name, please activate in menu preferences - program the setting "Check for newer version of DOK database after program startup". This will download dok.csv and sdok.csv files to ~/.config/cqrlog/dok_data
      +The option 'Show logged (S)DOKs only' will reduce the list, to show only worked DOKs and not all known DOks.
      +The ComboBox 'DOK & SDOK' give you the option to see DOK&SDOK, only DOK and only SDOK.
      Caution: Be aware that the DOK statistic window will not open, when dok.csv and sdok.csv files are missing on ~/.config/cqrlog/dok_data.

      -The 'Export to HTML' button exports the statistics to a HTML table file.

      - +The 'Export to HTML' button exports the statistics to a HTML table file.
      The 'Show station list' button will show a list of all stations behind the selected and confirmed DOKs.

      +

      +The BIG SQUARE and COUNTY gives you band based report of worked Squares or Counties.
      +With County the column filling must be excactly same with all similar counties. Count is based to compare and even one space in county name can make different results.
      +The 'Save to...' button exports the statistics to a HTML file.

      + +
      +

      + diff --git a/help/h26.html b/help/h26.html index 8d5e077..4a671f3 100644 --- a/help/h26.html +++ b/help/h26.html @@ -32,12 +32,13 @@

      Assuming that your CW interface is properly set up and working, you can add and/or edit your CW messages.

      Set up your CW messages via Preferences/CW inteface/CW messages button. -
      You can also access CW messages from the upper menu bar of the New QSO window. +
      You can also access CW messages from the top menu of the New QSO window. Click on the 'File' item and select CW Messages.

        

      - Choose the CW Messages option. By using the form opened you can edit your CW messages that - will be sent when you press the corresponding F-key(s). - You can set up to 10 predefined messages. Save and load them from file for quick change of all messages.

      + CW messages will be sent when you press the corresponding F-key(s) or click message buttons in Memory keys or CW type windows. + You can set up to 10 predefined messages in two sets.
      + Set1 "S&P" is always default. Set2 "Run" is active when contest window is opened and checkbox "S&P" is NOT checked.
      + Use buttons Save and Load for save/load both sets to/from file.



      There are some predefined macros which you can use in your messages:

      @@ -57,8 +58,11 @@
    • %h - greeting GM/GA/GE calculated from the %c station location time

    • %xn - contest exchange serial number
    • -
    • %xm - contest exchange message
    • %xns - contest exchenge serial number sends 9->N and 0->T
    • +
    • %xnr - contest exchange serial number received
    • +
    • %xnrs- contest exchenge serial number received sends 9->N and 0->T
    • +
    • %xm - contest exchange message
    • +
    • %xmr - contest exchange message received
    • %xrs - full contest exchange RST+SerialNR+Message sends 9->N and 0->T.
      (May be used always instead of %rs as if serNR and Message are empty just sends plain report.)
    • + or - in macro text will increase/decrease CW speed by 5WPM/one mark. @@ -67,7 +71,7 @@
      1) Version of Hamlib must be at least Hamlib 4.1~git Last commit 2020-10-20 03:22:59 2020 +0000 SHA=8a769c
      2) Do not use space(s) between text and +(or -) rigctld will add them I.E. "TU+++599---001"
      3) Speed change works only with BKIN mode (not F-BKIN) and at the moment new Icom rigs (tested only ic7300) -
    • +
      4) Does not work if Hamlib CW buffering is used @@ -75,7 +79,14 @@
      -


      +

      +

      +
      + Send hex bytes to keyer. Will send hex bytes to Winkeyer or K3NG allowing non charcter bytes to be sent from Cqrlog in case there sudden need to change some of keyer's settings. +
      Consult your keyer's manual to find needed commands. +

      + +

      Memory keys form has buttons PgUp and PgDn that are not configurable. They alter CW speed in same way as keyboard keys PgUp and PgDn that some, specially laptop computers, may not even have.
      When using Memory keys-form with mouse, or keyboard, you are able to lauch memories by mouse click or by F-key press from keyboard keys. Same with PgUp and PgDn, both are working, keys and mouse click. diff --git a/help/h30.html b/help/h30.html index 9a781b7..e4d4290 100644 --- a/help/h30.html +++ b/help/h30.html @@ -1,4 +1,4 @@ - +OS @@ -36,34 +36,45 @@

      -TRX Control window Shows current frequency and buttons allow change of Band, mode, memory and rig. Additional selections are User defined buttons, Power buttons, Vfo A and B buttons and memory information field. +TRX Control window shows current frequency and buttons that allow change of band, mode, memory and rig. +
      Additional selections are User defined buttons, Power buttons, Vfo A and B buttons and memory information field.
      When pressing band selection button rig moves to that band using predefined frequency of currently active mode. Default frequencies and User buttons can be defined in preferecences/TRX control. -

      You can select rig vfo with buttons A and B but there is no feedback what vfo is currenty used as Icom brand rigs do not support "Get_vfo" command. -

      If M_up or M_dwn are pressed or memory is selected by double click of memory list, the information text will show up to Mem Info field. If frequency is changed manually after that info text will disappear. -
      If memory does not have info text (max 25chr) just x of y is displayed where x refers to memory order in Add/Modify memory list and y total amount of memories. -None (in red) indicates that there are no memory lines. -
      With P-on/off/stb buttons current rig can be set ON, OFF or STANDBY (if it supports rigctld power commands). -
      Default setting for power buttons is hidden. You can change it via dropdown menu "Preferences". -

      M_up and M_dwn buttons select next/previous entry from memory list. M_Wri adds entry to memory list from current rig frequency and mode and info field shows "MW ok". -

      You can change rig frequency by clicking frequency display. Then you can enter a new MHz value and press enter. -
      You can also use mouse wheel to change frequency. One wheel step is 100Hz, Keeping Shift key pressed the step is 1kHz. Keeping Ctrl key pressed the step is 10kHz. +

      +By clicking frequency display you can set a new frequency and click again (or press enter) to send command to rig. +
      You can also use mouse roll to move frequency after first clicking the frequency display. + +

      • By default steps are 100Hz +
      • Keeping Shift key pressed while turning the roll steps are 1kHz +
      • Keeping Ctrl key pressed while turning the roll steps are 10kHz +
      • Keeping both Shift key and Ctrl key pressed while turning the roll steps are 1MHz +
      +You can select rig vfo with buttons A and B but there may be no feedback what vfo is currenty used (Icom brand rigs do not support "Get_vfo" command). +

      If M_up or M_dwn are pressed or memory is selected by double click of memory list, the information text will show up to Mem Info field. If frequency is changed manually after that info text will disappear. +
      If memory does not have info text (max 25chr) just x of y is displayed where x refers to memory order in Add/Modify memory list and y total amount of memories. +None (in red) indicates that there are no memory lines. +
      With P-on/off/stb buttons current rig can be set ON, OFF or STANDBY (if it supports rigctld power commands). +
      Default setting for power buttons is hidden. You can change it via dropdown menu "Preferences". They are also hidden if rig can not support power commands. +

      M_up and M_dwn buttons select next/previous entry from memory list. M_Wri adds entry to memory list from current rig frequency and mode and info field shows "MW ok". +

      You can change rig frequency by clicking frequency display. Then you can enter a new MHz value and press enter. +
      You can also use mouse wheel to change frequency. One wheel step is 100Hz, Keeping Shift key pressed the step is 1kHz. Keeping Ctrl key pressed the step is 10kHz. Keeping both keys pressed the step is 1MHz.
      If you use mouse wheel the rig frequency is changed while turning. There is no need to press enter then. Just move mouse cursor away from frequency display. -

      NOTE!!!
      Check pereferences/TRXcontrol/Switch only between mode related memories
      Cqrlog TRXcontrol memories are categorized by mode (groups). CW, SSB(=AM+USB+LSB+FM), RTTY(=RTTY+DATA+PKTLSB+PKTUSB+PKTFM)[no mode selector for PKT* but you may "M wri" them anyway]. -So do not wonder if you get smaller amount of memories than in your list when pressing M_up and M_dwn with "Show mode related" checked. -

      +

      • NOTE: Check pereferences/TRXcontrol/Switch only between mode related memories
        Cqrlog TRXcontrol memories are categorized by mode (groups). CW, SSB(=AM+USB+LSB+FM), RTTY(=RTTY+DATA+PKTLSB+PKTUSB+PKTFM)[no mode selector for PKT* but you may "M wri" them anyway]. +So do not wonder if you get smaller amount of memories than in your list when pressing M_up and M_dwn with "Show mode related" checked. +

      -
      You can set rig by double click of an memory row in Open memory list. Similar action happen also in Add/Modify memories. The differense is that you can keep - Open memory list open while loggeing qsos etc. Where as Add/Modify memories, when open, blocks other functionality. -
      While Add/Modify memories is open you can use buttons in right frame. Texts of buttons are quite self explaining. -
      Deleting a memory line, or all lines, do not have any further warning questions (Are you sure?). In case you deleted something wrong just close window with Cancel. No changes are recorded then. -
      Closing Add/Modify memories is done with buttons OK or Cancel. Closing Open memory list window must be done using x at top right corner of window. -
      Open memory list closes also if Add/Modify memories is opened. They can not be open at same time. -

      If you make changes to preferences/TRXControl after that just select another radio (even if not existing) from radio buttons Radio 1 , Radio 2. Then select back the previous radio and new values are read. It is possible also reload settings from NewQSO/File/Refresh TRX/ROT control.

      +
      You can search a memory by clicking the first (header) line of grid. Search is done against the column you clicked. +
      You can set rig by double click of an memory row in Open memory list. Similar action happen also in Add/Modify memories. The differense is that you can keep + Open memory list open while loggeing qsos etc. Where as Add/Modify memories, when open, blocks other functionality. +
      While Add/Modify memories is open you can use buttons in right frame. Texts of buttons are quite self explaining. +
      Deleting a memory line, or all lines, do not have any further warning questions (Are you sure?). In case you deleted something wrong just close window with Cancel. No changes are recorded then. +
      Closing Add/Modify memories is done with buttons OK or Cancel. Closing Open memory list window must be done using x at top right corner of window. +
      Open memory list closes also if Add/Modify memories is opened. They can not be open at same time. +

      If you make changes to preferences/TRXControl after that just select another radio (even if not existing) from radio buttons Radio 1 , Radio 2. Then select back the previous radio and new values are read. It is possible also reload settings from NewQSO/File/Refresh TRX/ROT control.

      See also setting up TRX/ROTControl

      @@ -76,23 +87,24 @@ From NewQSO/Window you can open Rotor control window.

      -Window shows current position of rotor with numerical display, Short and Long path Buttons and radio buttons to select rotor 1 or rotor 2. -
      User can resize window and select additional bar display, direction and stop buttons. +Window shows current position of rotor with numerical display, Short and Long path Buttons and radio buttons to select rotor 1 or rotor 2. +
      User can resize window and select additional bar display, direction and stop buttons.
      Small numbers on top of bar display shows current rotor limits. Usually this is 0..360, but may be also -180..180 depending on rotor model, or other user defined limits.
      Direction drive buttons run rotor until stop button is pressed or maximum 15sec time limit is reached. -

      When a call is entered to NewQSO callsign field and cursor is moved away from that field DXCC info part gets filled against call prefix and/or locator grid, - then, when DXCC/AZIM shows a value, it is possible to press Short Path or Long Path buttons and your ro +

      When a call is entered to NewQSO callsign field and cursor is moved away from that field DXCC info part gets filled against call prefix and/or locator grid, + then, when DXCC/AZIM shows a value, it is possible to press Short Path or Long Path buttons and your ro tor will turn your antenna to that direction. -

      It is also possible to set new direction by a click on Azimuth display, type a new direction value and press Enter or use mouse wheel to select degrees. -
      One wheel step is one degree. If you keep Shift key pressed while turning mouse wheel the step will be 10 degrees. If Ctrl key is pressed instead step will be 100 degrees. +

      It is also possible to set new direction by a click on Azimuth display, type a new direction value and press Enter or use mouse wheel to select degrees. +
      One wheel step is one degree. If you keep Shift key pressed while turning mouse wheel the step will be 10 degrees. If Ctrl key is pressed instead step will be 100 degrees.
      If you have used mouse wheel it is enough to move mouse away from Azimuth reading to get rotor turning. No enter keypress is needed then. -

      Pressing Stop button stops rotor turning started either with path or turn buttons.

      +

      Pressing Stop button stops rotor turning started either with path or turn buttons.

      Progress bar displays Az value relative to AzLimits (if Use \dump_state is checked in preferences) so do not wonder if it in some cases may look different than numerical true direction display.
      If error message is received from rotctld button area turns red. If requested turn command is ok, but az_min or az_maz limits change requested direction from true direction (then antenna may not always reach requested direction) button area will turn yellow as warning sign.
      The length of color flash depends on poll rate and is error permanent or not.
      -
      If you make changes to preferences/Rot Control after that just select another rotor (even if not existing) from radio buttons Rotor 1 , Rotor 2. Then select back the previous rotor and new values are read. It is possible also reload settings from NewQSO/File/Refresh TRX/ROT control.

      +
      If you make changes to preferences/Rot Control after that just select another rotor (even if not existing) from radio buttons Rotor 1 , Rotor 2. Then select back the previous rotor and new values are read. It is possible also reload settings from +NewQSO/File/Refresh TRX/ROT control.

      See also setting up TRX/ROTControl

      diff --git a/help/h32.html b/help/h32.html index 8ff2dcd..5b215ac 100644 --- a/help/h32.html +++ b/help/h32.html @@ -40,15 +40,17 @@
    • Show ShortPath By default Grayline map will show straight line from your station (from your locator defined) to station you enter to NewQSO/callsign. With this selection you can switch the straight line to plotted great circle short path.
    • Show LongPath As another option you can select great circle longpath. This can be selected with, or without short path. +
    • Show BeamPath If you use ROT control you can select to show Beam path heading.
    • Clear all spots Clears all RBN spots from map.
      Note: Dots also depend on the band, if you change band, dots will always be deleted. All data is band related.
    • Watch for Opens an edit window where you can change callsign or prefix watched without opening preferences. see: RBN support


    • -

      - - +
      +
      +
      +


      diff --git a/help/img/CountyStat.png b/help/img/CountyStat.png new file mode 100644 index 0000000..b8c0e67 Binary files /dev/null and b/help/img/CountyStat.png differ diff --git a/help/img/SquareStat.png b/help/img/SquareStat.png new file mode 100644 index 0000000..92b2da2 Binary files /dev/null and b/help/img/SquareStat.png differ diff --git a/help/img/contest.png b/help/img/contest.png index f12587b..91189f9 100644 Binary files a/help/img/contest.png and b/help/img/contest.png differ diff --git a/help/img/contest_cmn.png b/help/img/contest_cmn.png new file mode 100644 index 0000000..991b94c Binary files /dev/null and b/help/img/contest_cmn.png differ diff --git a/help/img/contest_mwc.png b/help/img/contest_mwc.png new file mode 100644 index 0000000..bb6b066 Binary files /dev/null and b/help/img/contest_mwc.png differ diff --git a/help/img/contest_nac.png b/help/img/contest_nac.png new file mode 100644 index 0000000..2ba3641 Binary files /dev/null and b/help/img/contest_nac.png differ diff --git a/help/img/eqsl2.png b/help/img/eqsl2.png index aed1752..da5a172 100644 Binary files a/help/img/eqsl2.png and b/help/img/eqsl2.png differ diff --git a/help/img/h10.png b/help/img/h10.png index 5729f06..2ff8b0a 100644 Binary files a/help/img/h10.png and b/help/img/h10.png differ diff --git a/help/img/h11.png b/help/img/h11.png index 1da9a5e..f72ac6c 100644 Binary files a/help/img/h11.png and b/help/img/h11.png differ diff --git a/help/img/h1112.png b/help/img/h1112.png index 1ad1e8d..941c5d4 100644 Binary files a/help/img/h1112.png and b/help/img/h1112.png differ diff --git a/help/img/h11141.png b/help/img/h11141.png new file mode 100644 index 0000000..fb8dbea Binary files /dev/null and b/help/img/h11141.png differ diff --git a/help/img/h11142.png b/help/img/h11142.png new file mode 100644 index 0000000..c1d5ed5 Binary files /dev/null and b/help/img/h11142.png differ diff --git a/help/img/h11143.png b/help/img/h11143.png new file mode 100644 index 0000000..18f53c4 Binary files /dev/null and b/help/img/h11143.png differ diff --git a/help/img/h11144.png b/help/img/h11144.png new file mode 100644 index 0000000..363db6e Binary files /dev/null and b/help/img/h11144.png differ diff --git a/help/img/h1114b.png b/help/img/h1114b.png deleted file mode 100644 index b8c3fa4..0000000 Binary files a/help/img/h1114b.png and /dev/null differ diff --git a/help/img/h1116.png b/help/img/h1116.png index 7aeb992..8df992c 100644 Binary files a/help/img/h1116.png and b/help/img/h1116.png differ diff --git a/help/img/h117.png b/help/img/h117.png index 63b9ab8..be0aa68 100644 Binary files a/help/img/h117.png and b/help/img/h117.png differ diff --git a/help/img/h118.png b/help/img/h118.png index 485d5be..fe276a5 100644 Binary files a/help/img/h118.png and b/help/img/h118.png differ diff --git a/help/img/h118b.png b/help/img/h118b.png index 17d3d44..07830f7 100644 Binary files a/help/img/h118b.png and b/help/img/h118b.png differ diff --git a/help/img/h14.png b/help/img/h14.png index d074037..b6c0fa4 100644 Binary files a/help/img/h14.png and b/help/img/h14.png differ diff --git a/help/img/h20.png b/help/img/h20.png index 00b26a5..4452e00 100644 Binary files a/help/img/h20.png and b/help/img/h20.png differ diff --git a/help/img/h29.png b/help/img/h29.png index a18e3f9..0be4ee2 100644 Binary files a/help/img/h29.png and b/help/img/h29.png differ diff --git a/help/img/h31-3.png b/help/img/h31-3.png index 41351e4..bbab2eb 100644 Binary files a/help/img/h31-3.png and b/help/img/h31-3.png differ diff --git a/help/img/h4.png b/help/img/h4.png index 7a6c4b1..57602e1 100644 Binary files a/help/img/h4.png and b/help/img/h4.png differ diff --git a/help/img/h46.png b/help/img/h46.png index a9d0595..e54fa6e 100644 Binary files a/help/img/h46.png and b/help/img/h46.png differ diff --git a/help/img/h4f.png b/help/img/h4f.png new file mode 100644 index 0000000..175db59 Binary files /dev/null and b/help/img/h4f.png differ diff --git a/help/img/h5.png b/help/img/h5.png index 38a3690..64554f3 100644 Binary files a/help/img/h5.png and b/help/img/h5.png differ diff --git a/help/img/h88.png b/help/img/h88.png index 506c68e..e1a5600 100644 Binary files a/help/img/h88.png and b/help/img/h88.png differ diff --git a/help/img/h95.png b/help/img/h95.png index b2444b1..2835bff 100644 Binary files a/help/img/h95.png and b/help/img/h95.png differ diff --git a/help/img/h96.png b/help/img/h96.png index 775ac66..a321781 100644 Binary files a/help/img/h96.png and b/help/img/h96.png differ diff --git a/help/img/h96a.png b/help/img/h96a.png new file mode 100644 index 0000000..460c139 Binary files /dev/null and b/help/img/h96a.png differ diff --git a/help/img/h96b.png b/help/img/h96b.png index 0fe3f3f..8669615 100644 Binary files a/help/img/h96b.png and b/help/img/h96b.png differ diff --git a/help/img/h97.png b/help/img/h97.png index 4fb8f16..229f1c6 100644 Binary files a/help/img/h97.png and b/help/img/h97.png differ diff --git a/help/img/h9b.png b/help/img/h9b.png index c1e6898..90996db 100644 Binary files a/help/img/h9b.png and b/help/img/h9b.png differ diff --git a/help/img/wsjt21b.png b/help/img/wsjt21b.png new file mode 100644 index 0000000..30358c5 Binary files /dev/null and b/help/img/wsjt21b.png differ diff --git a/help/img/wsjt37.png b/help/img/wsjt37.png new file mode 100644 index 0000000..00ce36c Binary files /dev/null and b/help/img/wsjt37.png differ diff --git a/help/index_left.html b/help/index_left.html index fa39f20..53aae99 100644 --- a/help/index_left.html +++ b/help/index_left.html @@ -12,6 +12,7 @@

      Contents:

      Quick start

        +
      • Changelog
      • Starting cqrlog
      • Running first time
      • Preferences
      • diff --git a/help/index_right.html b/help/index_right.html index d3c0e20..d126854 100644 --- a/help/index_right.html +++ b/help/index_right.html @@ -98,8 +98,8 @@ and at http://hamlib.sourceforge.net/, however precompiled packages are available for almost all major Linux distributions. -
      • MySQL server and client - The MySQL client must be installed, - without this the program will not work at all. A MySQL server must be reachable, +
      • MariaDB mysql server and client - The MariaDB client must be installed, + without this the program will not work at all. A MariaDB server must be reachable, either on the local machine or via a network.
      • libssl-devel needed if you want to use LoTW and/or online log upload diff --git a/help/wsjt.html b/help/wsjt.html index 434644c..15364fd 100644 --- a/help/wsjt.html +++ b/help/wsjt.html @@ -1,3 +1,4 @@ + @@ -76,6 +77,14 @@ Top line will show band and mode that is in use, Checking "noHst” (no h
        If there are no CQ lines during period then old monitor lines will turn to silver gray indicating that right period of possible answer is passed. This happens ONLY if "noHst” is checked. If not, colors stay as they are.
        CQ-lines turning to silver gray does not disable double click answering property. It is just informative color change.
        If not checked form will show also older CQs (scrolling) to see what you missed while having a coffee break :). Only 20 lines, how ever. +

        +

        Checking "USt” (USA states) will show US states of CQ callers. Color of text is based to same formula against your logged qsos as described below with callsigns and locators. +
        State is checked against a list of callsigns=states that is created from file EN.dat wich is a part of zip file from http://wireless.fcc.gov/uls/data/complete/l_amat.zip +
        This list is named as fcc_states.tab and created into ~/.config/cqrlog/ctyfiles folder. Creation needs command line programs wget and unzip. You can test existense of those by simply writing those names, one by one, to command terminal. +If they exist response should be some kind of help text. If they do not exist use your package manager to install them. +
        Cqrlog will inform you about fcc_states.tab when you check the "USt" checkbox (if file is over 90d ays old or missing). File holds all US calls with states and is over 10Mb in size amd that size is taken from computers RAM memory when USt is checked. It should not be problem with modern computers, but may be it with small one card computers like Raspberry Pi (specially older versions). + +

        Checking "sTx” (Stop TX) will fix missing Wsjt-x property: If you answer to someone's CQ at same frequency Wsjt-x will stop your TX if CQ-caller answers to someone else than you. How ever Wsjt-x developing team has decided that if you anśwer to CQ caller on other frequency (split) your TX remains on even if the answer was directed to someone else. To reduce band QRM caused by you, you may check sTx to stop your TX if answer was not for you. @@ -88,13 +97,35 @@ In some cases your TX may be shut down after you have first tried to answer some

        +If you do not want any information texts, just alerts, you can check nTxt to prevent richmemo text updates and minimize window size horizontal or drop it completely down with (_) while alerts and follow are still working. +
        +If you have Wsjt-x devel version 1.9.0-rc3 r8592 (or higher) coloring is sent back to Wsjt-x with same choosed colours as CQ-monitor uses. +How ever there are some limitations compared to CQ-monitor: +

      • color back can not change lower case letters of Band Activity line in case call or locator is worked. Just font color is changed
      • +
      • color back can not print locator with 2 colors in case main grid is worked, but subgrid(numerical part) is not. In that case locator will have maingrid color and yellow background.
      • +
      • color back will paint both "CQ" and cq-direction with "CQ ext" color if CQ is not directed to you.
      • +
        +With older versions of wsjt-x this causes unkonwn command error and then nTxt should not be checked until you get newer version of Wsjt-x. +

        + + + +

        +If you are able to use color back feature you may want to change some Wsjt-x color settings and maybe check "CQ only" checbox at Main window. Selecting also font to some of "mono"+ "bold" ones from "Configuration/General/Decoded Text Font" could make a better view.

        +

        +

          A word of warning:
        In Wsjt-x selecting CQ only will disable Generating of Std messages by double click either followed message line or Wsjt-x map's non-cq lines. +
        This does not happen if CQ only is uncheked. Unchecking it after not working double click does not help if Band Activiy window does not contain that line from which Wsjt map or follow line was created. +
        That is because Wsjt-x must found equal line from Band activity and UDP command that produces Std General messages creation. +
        This may change in future devel versions or in official release of 1.9.0, but at the moment you should be aware of that.

        +

        Hint: If you have had CQ only checked and you want to load Std message from just appeared line from Wsjt map or follow line uncheck CQ only immediately during time that entry is not grayed (ongoing period). + Wsjtx will produce again last periods decode (wsjt map will show it double) and after that you can have effect for double click. If you do not want any information texts, just alerts, you can check nTxt to prevent text updates and minimize window size horizontal or drop it completely down with (_) while alerts and follow are still working.

        Selecting DX checkbox cqrlog fiters away all calls that are from same continent as you are. This works both in Cq monitor and MAP mode
        - - +Checking Show LoTW, eQSL usage in CQ-monitor from preferences/fldigi- wsjt interface L & E will show up in front of continent in CQ-monitor

        +

        Checking “flw” new part of monitor opens. This will make easier to follow a DX who does not stay on same frequency, but jumps around answering to callers.
        Type in a callsing. The callsign is checked to be written in upcase letters and spaces are trimmed away. Pressing RETURN at the end of typing turns Follow button ON (green). diff --git a/src/changelog.html b/src/changelog.html index 43fa4cc..4a10ea9 100644 --- a/src/changelog.html +++ b/src/changelog.html @@ -4,9 +4,235 @@ List of changes in CQRLOG - New user? Please look at Help -> Keys and shortcuts to find out how to operate CQRLOG from keyboard. + New user? Please look at Help -> Keys and shortcuts to find out how to operate CQRLOG from keyboard.
        + You can return to this changelog via Help after Cqrlog has started.

        + Alpha test version of CQRLOG 2.6.0 (119)
        + New in this alpha version (not in official version):
        +
          +
        • eQSL download: Fixed the stuck up caused by eQSL starting to add one more empty line at the end of downloaded file
        • +
        • Contest: Inform remote mode 'on' when saving manual entered qso. Multimode contests like
          + NAC (CW,Phone,MGM) it may happen that remote is left on when jump from FT8 to CW/Phone.
          + Then entering qso manually looks like saved, but will never appear into log. +
        • Makefile: Clean fix (by Bill, WK2X)
        • +
        • Contest filter: If Contest window is open contest name is copied to filter
        • +
        • (118)
        • +
        • CW Messages: Fix to open/close when Contest window open and S&P not checked
        • +
        • CW Messages: Added another set F1-F10 for Contest RUN mode
        • +
        • RigControl: Update Hamlib error codes list
        • +
        • Log Upload: Add UDP Log Uploader based on N1MM+ format(by Steven, M1SDH)
        • +
        • Preferences:CWinterface: Layout fixes
        • +
        • Hammlib:CW and Voice keying: Changes for latest Hamlib w34/2023
        • +
        • DBConnection:Utils:Configuration:Export: Force file extension to be '.ini' as Configuration:Import lists only '.ini' files
        • +
        • NewQSO: Details has new Tab 'Call statistic' After call entered shows wkd/L/E status on band grid
        • +
        • RigControl: rigctld parameter '-C auto_power=1' is added only if user checks 'Rig pwr ON cmd' in TRXControl preferences. + This should help old Hamlibs that claim auto_power is wrong parameter and refude to start
        • +
        • NewQSO: Details Tab selected remembered even when satellite mode enabled
        • +
        • RigControl: Fix to set_powerstat at init
        • +
        • Group edit: QSL sent and received date can be cleared
        • +
        • Fixed date format checking routine
        • +
        • HRDUpload: Fix to error codes
        • +
        • NewQSO+Contest: Use rigctld:\send_voice_mem instead of voice_keyer script if rig supports it
        • +
        • eQSL Import: Checkbox to change Rcvd date to current date -1 after successfull download
        • +
        • Added HamQTH & Clublog error hanling code by phl0 that can be found from
          + https://github.com/ok2cqr/cqrlog/compare/master...phl0:moreDetailedErrorHandlingForOnlineLogs
        • +
        • Group edit warning color change for readability
        • +
        • CW:Hamlib keyer: Should now detect Hamlib>=Jul-2023 that differs with CW commands
        • +
        • Cabrillo export: Sets now suffix '.cbr' for filename as default
        • +
        • (117)
        • +
        • Preferences:TRXControl: Added checkbox 'compound poll' (default checked) When unchecked rig polling commands are sent each one on it's own line. This may help poor emulators like WFview.
        • +
        • HamlibCW: Fixed StopSending procedure. Has now '+\stop_morse currVFO' that should work also other rigs than ts480 and Icoms and is implemented in rigctld at least from Jan2023
        • +
        • Callbook: CQRZCQ XML fixd and tested. Should be mostly ok now.
        • +
        • Callbook: Added support to QRZCQ, not tested at all yet because of lack of premium account
        • +
        • Preferences:TRXControl:#1 Dummy rig: Starting rigctld can be changed (was disabled)
        • +
        • HamlibCW: Added checkbox to use Hamlib (past Jul-2023) 1k CW buffer.(Sends memory as string despite length)
        • +
        • QsoList:Fix:Return cursor to last worked qso when saving edited Qso should not happen
        • +
        • CWkeying:Hamlib: Quick fix for sending because new Hamlib is not backward compatible
        • +
        • Grayline+CWkeying:Fix: Some debug print fixes
        • +
        • NewQso+QsoList:Statistics:Big squares+County:Add: Filter(F12) is now effective if used
        • +
        • NewQso+QsoList:Statistics:Big squares+County:Fix: Totals printing
        • +
        • NewQso+QsoList:Statistics:Big squares+County: Added 'ALL band'. Fixed layouts
        • +
        • Fix: Broken Group edit
        • +
        • NewQso+QsoList:Statistics: Added County statistic. Fixed Help.
        • +
        • Grayline: Removed some unconditional debug prints
        • +
        • Wsjtx:Map:fix: dB view at Map init now read
        • +
        • NewQSO:Contest:Fix: Fixed keep propagation also when contest window used
        • +
        • NewQSO:Fix:Keep propagation mode when 2xESC even when no qsos saved yet
        • +
        • Preferences:NewQSO: Added default operator setting (if different that station callsign)
        • +
        • Grayline: Show also rotor beam path if in use and selected
        • +
        • ROT control: Fix: Remember used rotor (1 or 2) over Cqrlog restart.
        • +
        • WSJTremote, Map mode: '*' appear fixed when line ends ' 73'
        • +
        • Preferences/TRXControl: Added checkbox 'Set UTC to Rig'. Uses rigctld '\set_clock' command on next full minute after rig initialization
        • +
        • WSJTremote, Map mode: '*' appeared when CQ-callers locator ended '73' (should appear only 'RR73' or ' 73' endings). Fixed
        • +
        • Contest: Set TX column lables Green/Red by state of S&P to indicate CW memory auto sending on/off
        • +
        • Contest: Enable CQ panel also when in S&P
        • +
        • Contest: Increase size between status panel and status view for easier acces to status settings (click area)
        • +
        • Fixed: 8M & 5M frequency add to bands when 1st start of Cqrlog. (DB upgrade was ok before)
        • +
        • Contest: pressing 'CQ start' moves focus to Call column
        • +
        • Added hint texts to first start DB selection window
        • +
        • Cabrillo export: Changed export to use time_off instead of time_on. +
          With CW and Phone qsos this does not matter as times are usually same. +
          With FT8 qso takes longer and WSTX's (and N1MM's) exports are using time_off. +
          Now Cqrlog's export is equal to others.
        • +
        • (116)
        • +
        • Preferences: wsjt/fldigi: fixed hidden checkbox
        • +
        • DXCluster: Added user defined command keys F1-F10 See help for details.
        • +
        • WSJT remote: fixed contest logging. Remote name should have WSJT instead of being exactly WSJT-X.
          + Remote name changes when using special configs.(wsjtx -r cfg_name)
        • +
        • Contest: counter HH:MM since last logged qso, QSO rate /10min and /1hour(these need testing)
        • +
        • Contest: Shift+ESC removes callsign (same as 3x ESC)
        • +
        • LoTW inport: changed date to be (today-1day) to be sure
        • +
        • LoTW Import: Checkbox to change Rcvd date to current date after successfull download (tu: 4X6GP)
        • +
        • When creating a new log it is now possible to copy configuration automated from existing log
          + (FYI: Configuration is log based)
        • +
        • (115)
        • +
        • Moved also solar data (propagation window) text address to user editable in preferences.
        • +
        • Fixed solar data (propagation window) addresses from 'http' to 'https'
        • +
        • Contest: Stores last used CQ frequency and mode when in Run. Click (or Ctrl+L) over reading resets rig to that freq+mode
        • +
        • Added checbox 'DATA' to 'show only spots' at /preferences/DXCluster. Help files fixed
        • +
        • DXCluster: fixed response missing for "sh/he e6" (all prefixes E1..E9)
        • +
        • Small view fix in RBN monitor header
        • +
        • Small view fix in adif errorfile import
        • +
        • (114)
        • +
        • Added 8M and 5M bands
        • +
        • Fixed radio memory loading/saving (tested with 12000 memories)
        • +
        • Added search to radio memory list
        • +
        • Fixes several SQL query record count requests in many units
        • +
        • Fixed file open dialogs to check file exists. QT5 opendialog allowsuser to type filename and it needs checking
        • +
        • Fixed DXCluster spot:Any of QSL, LoTW, eQSL received prints with confirmed color
        • +
        • Fixed DXCluster font style saving/loading
        • +
        • (113)
        • +
        • Fixed wsjtx std messages clean when remote was set active
        • +
        • Added option (from preferences) to show LoTW/eQSL users in wsjtx CQ-monitor
        • +
        • (112)
        • +
        • Fixed spot splitter a bit and cleaned DXCluster code too
        • +
        • Clicking DXSpot line now sets wsjt std messages if wsjt-remote is active
        • +
        • Rewritten DXCluster spot splitter because of faulty call grep
        • +
        • Wsjtx remote:
          + Cqrlog will clear wsjt-x DXcall, DXgrid and StdMessages when band changes
          + HamQTH/QRZ info is now looked when Wsjtx/DXCall changes on RX and TX period
          + (Was before only on TX period)
        • +
        • Contest window:
          + Fixed ESC key: 1x stops Cw sending, 2x returns cursor to Call column, 3x clears qso entry
          + Fixed F2 memory sending in S&P mode when exit from Call column after callisgn was fixed (using 2xESC)
          + Fixed Call entry so that CW macro %c (callsign) works also with partial callsigns (when in Call column)
        • +
        • Fixed shortcut keys help page: Added Contest window shortcuts
        • +
        • Fixed warning splash and help that you can not spot with WebDXluster
        • +
        • Added missing 'OR' to Qso list/Qsl selection
        • +
        • Fixed update QSO list view when Preferences/Visible columns change
        • +
        • Fixed bug in Qsolist/View/Show Details checbox visibility
        • +
        • (111)
        • +
        • Fixed bug in preferences/Online log edited and saved urls could not be loaded
        • +
        • (110)
        • +
        • Added numeric divide-key to work in contest/call column
        • +
        • Added End-key to work in contest/call column
        • +
        • Added Home-key to work in contest/call column
        • +
        • Changed CQmonitor/Mapmode worked locator color printing
          + Should now respond better to true situation of current band
        • +
        • Removed one debug print from rigcontrol
        • +
        • (109)
        • +
        • Fixed numkeypad in contest/callsign/gtk2, QT5 was already working
        • +
        • RBNmonitor: Added source callsign filter
        • +
        • Removed small change to "remove all upload triggers". No good
          + Instead added warnings for use with more than on online log
        • +
        • (108)
        • +
        • Very small change to "remove all upload triggers". Helps?
        • +
        • Fixed startup rig power on with rig models below 10, mainly for mod #2
        • +
        • Fixed Cabrillo export to have adjustable RST fields
        • +
        • Fixed TAB key funtion in Contest window
        • +
        • Added Contest/msg multipliers count and list by contest bands
        • +
        • (107)
        • +
        • Added cache write while preferences closing. Speeds up %50
        • +
        • Added retry counter for rigctld connecting.
        • +
        • Updated sat_names.tab (from Florian,DF2ET)
        • +
        • Made Online logs Urls defineable
        • +
        • Fix for DXCCRef edit/save. Now user changes are saved
        • +
        • Fixed unwanted chars filter in contest/callsign that cause SQL error
        • +
        • Fixed bug in "Fixed ver(104) bug where rig did not initialize" +
        • Set default values for TRX and rotor port and poll
        • +
        • Fixed some rig and rot parameter readings
        • +
        • Fixed ver(104) bug where rig did not initialize if TRXControl window +
          stayed closed during Cqrlog start
        • +
        • (105)
        • +
        • Added macros: +
          %xnr - contest exchange serial number received +
          %xnrs- contest exchenge serial number received sends 9->N and 0->T +
          %xmr - contest exchange message received
        • +
        • Fixed offline qso feed. When qso is saved returns to QsoDate column. +
          This makes qso manual feed from paper log easier as things start +
          from date and tabulation continues in chronological order: +
          date,start,end,call,freq, mode .. etc and when qso is saved +
          focus returns again to date column. +
          When typing in Date and times in Offline Cqrlog will add punctuation +
          marks ('-' or ':') automatic. This way only number keys need to be typed. +
          When not valid locator is entered (usually odd number of characters) +
          NewQSO/GRID label will turn bold red as warning sign when exit from +
          grid column.
        • +
        • Added support for 1-6 rigs. User can define how many rigs he want to use +
          As before, only one rig can be active at time. +
          This change affects also mode/bandwidths settings and CW keyer settings. +
          All rigs can have their own settings for BW and CW keyer.
        • +
        • Fix for quick split settings. +
          Fixed all edtboxes value limits to 0..9999. Fixed tabulation orders
        • +
        • Added serial CW keyer commanding menu item. +
          Menuitem: NewQSO/File/Send hex bytes to keyer (W or K) +
          Item is visible with winkeyer or K3NG keyer and allows non text +
          hex bytes to be sent to serial line.
        • +
        • Fix for contest name in contests that have all modes in use +
          CW/SSB/FM/MGM like NAC has. +
          Then MGM qsos coming from WSJT-X will get name from Cqrlog contest +
          name currently in contest window if it is open during remote. +
          This overwrites WSJT-X predefined 4 contest names making all +
          qsos in contest to have same contest name defined in contest window.
        • +
        • Upgrade to Contest window +
          -Has now checkbox "S&P". When checked works as before. +
          When not checked launches memories F2,F3,F4 automated when +
          moving on columns. +
          F1 for sending CQ. Can be auto-repeated +
          F2 for sending call, rst and message +
          F3 for sending duplicate qso warning +
          F4 for sending after qso is logged with button or enter key +
          -Has now hint texts added. They can be turned off with checkbox. +
          -Has now status display to see how contest progress. +
          procedure MWC will show OK1WC memorial status +
          procedure NAC will show Nordic VUSHf activiy contest status +
          Common status will show status of other (unspecified) contest statuses +
          with user defined view. +
          More status procedures can be added later. +
          -Duplicate check will work now while typing in callsign. (before worked +
          after cursor left callsign column) +
          -Added "Mark Dupe" checbox. When checked with duplicate check ON +
          saved dupicate qso is marked to "RST send" with "/D". It is operator's +
          duty to do something (or not) with this after Cabrillo log is produced. +
          +
          For more specific information see revised contest help file, please!
        • +
        • Misc bug fixes. +
          -Changed Contest Filter to show contest names in order from A to Z (acs) +
          -Adjusted Contest Filter maxlines to default (8). This has effect when +
          QT5 widgets are used (shows more contest names at time). +
          -Fixed typo in Group edit field selector. Had "ŕ" in "operator" +
          -Fixed TRXControl's button "70cm". If no previous settings for 70cm +
          defaults were done loaded 80m band settings when pressed. +
          -Fixed double usage of query qBands. Preferences/bands/Frequencies list +
          loose it's grid contents if Wsjt-x remote is on (behind) and CQ-monitor selected. +
          -Updated help files
        • +
        • WSJT-C CQ monitor shows US states +
          CQ-monitor checbox "USt" that allows USA states to monitored wsjt-CQs +
          When you check it at first time it suggests loading from fcc.gov it should +
          suggest same after 90 days of usage to update data. +
          US callsign=state (fcc_states.tab) file is over 10Mb and ist is loaded +
          to RAM for runtime. Seeking a callsingn from there takes some time.
        • +
        • RTTY mode is now DATA +
          At preferences/Modes you will see a new "DATA" that replaces the old "RTTY". +
          Defaults for that are rig cmd:RTTY data mode:RTTY that acts like previous Cqrlogs. +
          Setting data mode affects DXSpots coloring and double clicking: You can set other +
          mode than RTTY to be used.
        • +
        • Online log upload +
          Bottom of Preferences/Online log upload has some checkboxes to affect +
          to online log upload. +
          See help/Quick start/Online log upload support for more information.
        • +
        CQRLOG 2.6.0 (2022-05-29)
        • new button "URL" to row below "Comment to callsign" (Saku, OH1KH)
        • @@ -292,6 +518,6 @@
        • QSO count with active filter was wrong after delete or update
        • Remove dupes from the log didn't work - fixed
        • QTH profile was not imported from ADIF - fixed
        • -
        +
      diff --git a/src/contest.html b/src/contest.html new file mode 100644 index 0000000..f23c3aa --- /dev/null +++ b/src/contest.html @@ -0,0 +1,245 @@ + + + + + CQRLOG - Contest + + +
      + + + + + +
      + WARNING! + Backup your data often! BACKUP your log directory at the end of EVERY session! + All that you need to backup and store in a safe place is the log database directory + located in the ~/.config/cqrlog/database folder, or you can enable the autobackup function + in Preferences. This autobackup function creates an ADIF file with a backup of your log. + /td> +
      + + + + + + +
      [Menu]
      +
      +
      CQRLOG for LINUX by OK2CQR & OK1RR
      +

      +

      Contest support

      +

      You will find contest selection from NewQSO/Window dropdown menu. Contest support of Cqrlog is very limited, but will serve you well if you just +like to take a part to contest without winning in mind. + +
      Contest window is just a "child form" for NewQSO to make qso logging faster when working in contests. +With Tru and Msg is Loc setting it is useful also in VHF, UHF, SHF Tropo, Es etc. openings for fast qso +logging. Perhaps also in some other operations like WWFF activations. +

      Note: This is NOT a contest logging add-on!!! It is a contest-notepad. +It is meant to be a tool for "Sunday contesters working in Tourist Class". Do not expect wonders! +

      When contest window is open NewQSO has contest exchange fields visible. You may have to stretch NewQSO window horizontally to see them. +You do not normally need NewQSO window during contest. +
      Only need for NewQSO is in case you have to edit an already worked qso. +Select qso normally via QSO list and press edit QSO button and you are able to edit qso, also the contest message part of it. +

      Repeat: NewQSO is not meant to be used during contest qso feeds. All new qsos are entered via contest window.

      + +

      + +

      +

      +RECOMMENDATION:
      Make new log for each contest, consider not to allow qrz/hamqth search, it may slow down qso feed. +
      It might be a good idea to have two logs the "contest" that is used during a contest and then cleared for new contest and the other as +"contest archive" where contents of "contest" are moved with adif export after Cabrillo log is sent. +
      Benefit of having "contest" log with one contest is also that you get DXCC statistic right after cursor leaves callsign column. You can place contest window just above NewQSO/DXCC statistic.(see pic above). +

      + +Contest window has a simple dupe check that turns typed duplicate callsign bold red printed. If you save a duplicate qso it is marked as "/D" in "RST sent" field. +When doing Cabrillo export it is operator's duty to decide what to do with "/D" reports +
      To get duplication check working properly you must either create a new log for every contest or set dupe start date (I.E. contest starting day) with button "from YYYY-MM-DD" +

      +

      +

      Hotkeys:

      +Hotkeys work same way as with New QSO window. +
      • 2x ESC clears all fileds
      • +
      • Note: 1x ESC returns cursor back to Call-field (if cursor is in some of the other fields like RSTr) and places cursor at the end of callsign for possible repairs.
        + It also halts CW memory output if it is just running.
      • +
      • F1..F10 send CW or VOICE messages depending on used mode.
      • +
      • TAB-key moves cursor between fields. (may also be SPACE key, if set)
      • +
      • Ctrl+Tab will set S&P mode
      • +
      • Shift+Tab will reset S&P mode
      • +
      +

      + +

      +

      Contest window has following fields and checkboxes:

      +
        +
      • Contest name Selection box has a list of predefined contest names. When selecting one and leaving Contest name combo box name will be cut from "|"(including it) that separates contest name and explanation. + You can also type contest name here if it is not in list. Be sure you do not use "|" character(s) in name because program will cut name from the first one found. +
        RECOMMENDATION:
        +Add date to contest name if you keep many contests in same log. That way QSO list/Filter/Contest filter can separate contests by name.
      • +
      • Tab in order when checked overrides all other Tab settings (see below) and Tab Order is: Call-RSTs-NRs-MSGs-RSTr-NRr-MSGr-SaveQSO-ClearAll
      • +
      • Show hint when checked shows help text of object that mouse cursor currently points
      • +
      • CQ panel is visible when S&P is not checked (CQ calling mode)
      • +
        • CQ period timer period in millisecons to send one CQ+listen (5000 - 50000, 5-50sec) +
          To adjust: Set repeats=1, press CQ start, adjust period value so that F1 has time to run + listening time
        • +
        • CQ repeats repeat period how many times CQ period is repeated (1 - 20)s
        • +
        • CQ start start/stop repeated CQ calling. Shorcut key: Shift+F1. +
          Pressing ESC stops timer and CW send. It can not stop voice keyer script. +
          Also writing anyting to Call will stop running timer and CW sending.
        • +
        +
      • Call when you leave this field callsign is moved to NewQSO. Callsign turns BOLD RED while typing if it is duplicate (and duplicate check is active).
      • +
      • SPACE is TAB when checked space bar acts like TAB-key moving to next field. Note:This prevents typing space (perhaps needed in MSG fields).
      • +
      • Dupe check Default checked. If you use same log for several contests, and/or other working, set the contest start date with from YY-MM-DD button. +
        if NoMode4Dupe is selected duplicate check allows qso with same station in same band if mode differs. +
        if Ignore dupes is selected it will ignore duplication check completely. +
        When dupe check is active and callsign is found as duplicate, but still saved, program will add /D to RST sent. + It is then operator's duty to clean or leave /D to exported Cabrillo log.
      • +
        +
      • RST s RST sent. Can be changed. +
        Note: defaults to 599 (CW) 59(phone). If rig mode is changed you get corresponding RST with 2xESC. +
        It also changes when cursol leaves call column. So do not worry when working mixed mode contest!
      • +
      • Tru means you like to exchange true reports. Makes Tab order to stop at RST (s & r) fields. Useful in some high band contests, Es and tropo openings.
      • +
        +
      • NR s serial number to send. +
        Note: you can type only numbers to NR s field.
      • +
      • Inc if checked it will auto increment serial number. You may change this number at any time. Increment goes on from typed number.
      • +
        +
      • MSG s sometimes you may need an additional message with number, or just a message with no number. + On high band contests you may type your locator here.
      • +
      • Qsp if checked makes TAB order stop at MSG s. Content of MSG s is taken from last logged MSG r. Cursor is placed at the end of message for possible edit. + For contests where you have circulating message: At 1st qso you set your own word to send, after that you send previously received word as your next own message.
      • +
      • S&P When Search & Pounce is checked operator launces all CW/Voice messages manually. +
        When S&P is not checked program launches message F2 when cursor enters one of RSTr, NRr, or MSGr columns. This way also if true reports are selected F2 is sent after your message is ready. +
        In case duplicate checking is enabled and callsign is duplicate, message F3 is launched instead of F2 and it happens always when cursor leaves callsign column. +
        When Enter or Save qso button is pressed program will send message F4. +
        Message F1 can be used for CQ that is manually launched. +
        When phone modes are used messages are lauched same way but you need very special voice script if you want to include worked station's callsign into F2 and F3 messages, but launcing F4 at QSO save may be useful. +
        RECOMMENDATION:
        Reserve memory macros F1-F5 for calling operation and F6-F9 for S&P operation. +
        See more about CW messages how to define messages with macros and save/load different setups of CW messages.
      • +
        +
      • RST r RST received. Default to 599 (CW) 59 (phone). Can be changed. +
        Default rst for CW and phone is created from rig's current mode. If you do not have cat controlled rig select "Hamlib dummy #1" as rig and set correct band and mode from TRXControl's band buttons. +
      • +
        +
      • NR r serial number you receive. +
        Note: you can type only numbers to NR r field.
      • +
      • No if thre is no serial number in contest this setting changes tab order so that it jumps over, directly to MSG r.
      • +
        +
      • MSG r message you receive
      • +
      • MSG is Grid If 'MSG is ...' is checked then message will be logged in SRX_String AND ALSO to selected NewQSO column. +

        By default Msg is Grid. It can be changed with right mouse click on the text. + If checked then input will turn red if character count is odd. Maximum of 6 characters locator can be entered. +
        If MSG is Grid but the entered locator is not valid it will NOT be copied to NewQSO/Grid column and stays only in Srx_String. +
        +
        In case of MSG is State and callsign is detected by prefix to be a Germany callsign srx_string is copied to DarcDOC column, orherwise to State column. +
        In other cases MSG is copied to correspondig NewQSO column. +
        NOTE: After selecting 'MSG is ...' remember also to check the checkbox to get it activated!
      • +
      +

      Buttons you really do not need (you should NOT use mouse when working contest!):

      +
        +
      • Save QSO Save QSO button at NewQSO, increments NR and clears all fields. +
        Note: pressing ENTER at any time after cursor is out from Call column does the same.
      • +
      • Clear QSO Clear all QSO information. +
        Note: Pressing 2x ESC key does the same.
      • +
      • Clear all Clear all fields. Usefull when starting a new contest to remove all saved settings.
      • +
      +
      +All settings, including contest name, are saved when closing contest form. When opening cqrlog and contest form again after rest period you can directly continue contest working. + +

      +

      +Typical contest qso goes like this:
      +Type callsign->press TAB->type contest rxnumber->press TAB->type contest message->press ENTER. +Or hit ENTER after rxnumber if no additional message is exchanged. When S&P is checked you maybe need to launch some Cw messages manually. +

      +

      Remember that pressing ENTER key at any column saves qso with existing values. How ever there must be +callsign of least three characters long. Sent/Received number and message(s) are not needed. +
      There is no need to use the mouse. Keep your hands on keyboard (and possible on CW key / PTT (if not foot pedal in use)). It is faster.

      +

      +Contest numbers and messages are saved in log in their own columns. Use preferences/Visible columns to show them in Qso list. +

      +CW messages can be used for sending contest messages. Look at help section CW Operation + how to use macros in messages. +
      NOTE: If you use macro that sends whole contest message (%xrs = RST, STX, STXString) message will skip empty ones. This way %xrs works for all contests. +

      +

      Status view support

      +NOTE: If you have one log called contest that you clear always before contest, to have just qsos of that contest, and after contest you move all qsos +with adif export to another log called archive you can view contest status afterwards from that log if you have used unique contest names I.E. added contest start date to name. +
      Find contest with Filter/Contest filter and copy name from selection list box and paste it to Contest window. You do not have to activate contest filter to see the status of that contest. +

      OK1WC memorial contest status is supported. +

      + +

      +

      +If contest name has "mwc" or "ok1wc" included (no case sensitive) then status counting is activated. At the start of contest (and any oher time when no qso to save) it can be seen by pressing 2xESC. +After saving a qso Status view is updated. +
      TRXControl must show that rig is on 80m or 40m band. If you do not have cat controlled rig select "Hamlib dummy #1" as rig and set correct band and mode from TRXControl's band buttons. +
      Only bands 80M and 40M and mode CW are counted (See rules of contest). +

      +

      +
      +

      Nordic Activity Contest (NAC) status is supported. +

      + +

      +

      +If contest name has "nac" included (no case sensitive) then status counting is activated. At the start of contest (and any oher time when no qso to save) it can be seen by pressing 2xESC. +After saving a qso Status view is updated. +
      +

      +

      +

      Common status is supported. +

      + +

      +

      +If contest name has any name that does not fit rules of two above status counting is activated. At the start of contest (and any oher time when no qso to save) it can be seen by pressing 2xESC. +After saving a qso Status view is updated. +
      There are several items shown in Status display. You can control them by left click below text Status (but above status display itself). +
      The DX and own continent counts (EU in picture) are defined against your callsign in preferences/station/call. +

      To see Status section you may need to stretch the bottom part of Contest window. +
      NOTE: Status counting may have errors! It is just for showing progress of contest, not to show final score. +

      + +

      +

      After contest

      +Most contests expect Cabrillo log format. Cqrlog has a limited support of Cabrillo exports. Mostly enough for a Sunday contester. +
      In case you want to use external Cabrillo program you have to make ADIF export of qsos +and then use another program.

      +
      +I found nice adif2cabrillo program for Linux from http://users.telenet.be/on4qz/ that supports ADIF importing. +

      Starting is bit complicated: +
      You need to compile it from source. Qt5 with qmake (called qmake-qt5 if your distro is Fedora) is needed to be able to compile +it.
      +Then there are no templates for different contests. You have to create them, but after that it serves you well! +It accepts nicely exported ADIF format from cqrlog and dig out STX and SRX as expected. +

      +

      +

      ADIF exports fields to right tags.
      +<RST_SENT:3>599<STX:3>001
      +<RST_RCVD:3>599<SRX:3>002
      +<RST_SENT:3>599<STX:3>003<STX_STRING:2>SA
      +<RST_RCVD:3>599<SRX:3>003<SRX_STRING:2>dd
      +<RST_SENT:3>599<STX:3>002<STX_STRING:2>SA
      +<RST_RCVD:3>599<SRX:3>003<SRX_STRING:2>kb
      +<RST_SENT:3>599<STX:3>001<STX_STRING:2>SA
      +<RST_RCVD:3>599<SRX:3>002<SRX_STRING:2>SB
      +

      +

      +HTML export will look like this:
      + +

      + +

      +
      + + + + + + +
      [Menu]
      +
      + + diff --git a/src/contest.png b/src/contest.png new file mode 100644 index 0000000..ec712e5 Binary files /dev/null and b/src/contest.png differ diff --git a/src/contest_cmn.png b/src/contest_cmn.png new file mode 100644 index 0000000..991b94c Binary files /dev/null and b/src/contest_cmn.png differ diff --git a/src/contest_html_export.png b/src/contest_html_export.png new file mode 100644 index 0000000..cd21b83 Binary files /dev/null and b/src/contest_html_export.png differ diff --git a/src/contest_mwc.png b/src/contest_mwc.png new file mode 100644 index 0000000..bb6b066 Binary files /dev/null and b/src/contest_mwc.png differ diff --git a/src/contest_nac.png b/src/contest_nac.png new file mode 100644 index 0000000..2ba3641 Binary files /dev/null and b/src/contest_nac.png differ diff --git a/src/cqrlog.lpi b/src/cqrlog.lpi index 240d6d1..26e2741 100644 --- a/src/cqrlog.lpi +++ b/src/cqrlog.lpi @@ -1,13 +1,13 @@ - + + - <Icon Value="0"/> @@ -19,7 +19,7 @@ <AutoIncrementBuild Value="True"/> <MinorVersionNr Value="3"/> <RevisionNr Value="1"/> - <BuildNr Value="2201"/> + <BuildNr Value="2202"/> <StringTable ProductVersion="0.3.1.2026"/> </VersionInfo> <MacroValues Count="1"> @@ -40,7 +40,7 @@ <RunParams> <local> <CommandLineParams Value="--debug=0"/> - <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/> + <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/> </local> <environment> <UserOverrides Count="2"> @@ -53,7 +53,7 @@ <Mode0 Name="default"> <local> <CommandLineParams Value="--debug=0"/> - <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/> + <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/> </local> <environment> <UserOverrides Count="2"> @@ -105,7 +105,7 @@ <MinVersion Major="1" Minor="2" Release="1" Valid="True"/> </Item10> </RequiredPackages> - <Units Count="122"> + <Units Count="125"> <Unit0> <Filename Value="cqrlog.lpr"/> <IsPartOfProject Value="True"/> @@ -163,6 +163,7 @@ <Filename Value="fMarkQSL.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmMarkQSL"/> + <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> </Unit8> <Unit9> @@ -896,10 +897,28 @@ <ResourceBaseClass Value="Form"/> </Unit120> <Unit121> + <Filename Value="fProgress.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="frmProgress"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + </Unit121> + <Unit122> <Filename Value="fDbError.pas"/> <IsPartOfProject Value="True"/> <HasResources Value="True"/> - </Unit121> + </Unit122> + <Unit123> + <Filename Value="fCountyStat.lfm"/> + <IsPartOfProject Value="True"/> + </Unit123> + <Unit124> + <Filename Value="fCountyStat.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="frmCountyStat"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + </Unit124> </Units> </ProjectOptions> <CompilerOptions> @@ -920,6 +939,7 @@ </CodeGeneration> <Linking> <Debugging> + <GenerateDebugInfo Value="False"/> <DebugInfoType Value="dsDwarf2Set"/> </Debugging> </Linking> @@ -928,6 +948,7 @@ <ShowNotes Value="False"/> <ShowHints Value="False"/> <ShoLineNum Value="True"/> + <ShowDebugInfo Value="True"/> </Verbosity> <CustomOptions Value="-dNO_CONTEST"/> <CreateMakefileOnBuild Value="True"/> diff --git a/src/cqrlog.lpr b/src/cqrlog.lpr index 51b690f..5c256f6 100644 --- a/src/cqrlog.lpr +++ b/src/cqrlog.lpr @@ -26,7 +26,7 @@ uses fWorkedGrids, fPropDK0WCY, fRemind, fContest, fMonWsjtx, fXfldigi, dMembership, dSatellite, uRigControl, uRotControl, azidis3, aziloc, fDOKStat, fCabrilloExport, uDbUtils, dQTHProfile, uConnectionInfo, znacmech, gline2, - fDbSqlSel, fDbError; + fDbSqlSel, fProgress, fDbError, fCountyStat; var Splash : TfrmSplash; @@ -99,6 +99,7 @@ begin Application.CreateForm(Tfrmxfldigi, frmxfldigi); Application.CreateForm(TdmMembership, dmMembership); Application.CreateForm(TdmSatellite, dmSatellite); + Application.CreateForm(TfrmProgress, frmProgress); Splash.Update; application.ProcessMessages; diff --git a/src/dDXCluster.pas b/src/dDXCluster.pas index 486bee7..990bbf1 100644 --- a/src/dDXCluster.pas +++ b/src/dDXCluster.pas @@ -91,7 +91,6 @@ type function CountryFromADIF(adif : Word) : String; function GetBandFromFreq(freq : string; kHz : Boolean=false): String; function IsAlertCall(const call,band,mode : String;RegExp :Boolean) : Boolean; - function GetfreeTextFromSpot(ua:String):String; procedure AddToMarkFile(prefix,call : String;sColor : Integer;Max,lat,long : String); procedure GetRealCoordinate(lat,long : String; var latitude, longitude: Currency); @@ -99,6 +98,7 @@ type procedure LoadDXCCRefArray; procedure LoadExceptionArray; procedure RunCallAlertCmd(call,band,mode,freq,freeText : String); + procedure GetSplitSpot(Spot:String;var call,freq,info:String); end; @@ -110,7 +110,7 @@ implementation {$R *.lfm} { TdmDXCluster } -uses dUtils, dData, znacmech, uMyini; +uses dUtils, dData, znacmech, uMyini, fTRXControl; type Tchyb1 = object(Tchyby) // podedim objekt a prepisu "hlaseni" //procedure hlaseni(vzkaz,kdo:string);virtual; @@ -129,65 +129,54 @@ begin Writeln(vzkaz); end; } -function TdmDXCluster.GetfreeTextFromSpot(ua:String):String; +Procedure TdmDXCluster.GetSplitSpot(Spot:String;var call,freq,info:String); var - a:longint; - uz:string; - p,l:integer; + i,n,r : integer; + s,t : String; + Begin - Result:=''; - if pos('DX de',ua)=1 then //normal DX spot + Spot:=trim(Spot); //to be sure + //remove extra spaces + repeat + Begin + Spot:=StringReplace(Spot,' ',' ',[rfReplaceAll],i); + end; + until i=0; + + if (pos('DX DE ',UpperCase(Spot))=1) then //normal cluster spot format + Begin + call := UpperCase(ExtractDelimited(5,Spot,[' '])); //to be sure case + freq := ExtractDelimited(4,Spot,[' ']); + s:=trim(copy(Spot,pos(call,Spot)+length(call),length(Spot))); + n:=0; + r:=0; + for i:=1 to length(s) do //find zulu time works with telnet and web Begin - ExtractWordPos(6,ua,[' '],p); //info part starts at 6th word - if p>0 then - begin - ua := copy(ua,p,length(ua)); - for l:=1 to wordCount(ua,[' ']) do - Begin - uz:= ExtractWordPos(l,ua,[' '],p); - if ((length(uz)=5) and (uz[5]='Z')) then //Z is lastchr, length is 5 - if TryStrToInt(copy(uz,1,4 ),a ) then - if ((a>=0) and (a<=2400)) then //must be zulu time - Begin // we do not take Zulu time or anything after that - if (p>1) then //something to copy - begin - ua:=trim(copy(ua,1,p-1)); - Result:=ua; - if dmData.DebugLevel >=1 then writeln ('DX spot info: ',ua); - break; - end; - end; - end; - end; - end - else - Begin // from command 'sh/dx' - if TryStrToInt( copy(ua,1,pos('.',ExtractWordPos(1,ua,[' '],p))-1),a) then //1st have number (frq) with dot + if ((n=4) and (s[i]='Z')) then Begin - ExtractWordPos(5,ua,[' '],p); //info part starts at 5th word - if p>0 then - begin - ua := copy(ua,p,length(ua)); //2nd cut from 5th word - a:=0; - for l:=length(ua) downto 1 do - Begin - if ((a=0) and (ua[l]='>')) then a:=1; - if ((a=1) and (ua[l]='<')) then //search word that starts '<' ends '>' start from end of line - begin - if l>1 then - begin - ua := trim(copy(ua,1,l-1)); //cut form start to that word pos - Result:=ua; - if dmData.DebugLevel >=1 then writeln ('sh/dx spot info: ',ua); - break; // that is info - end; - end; - end; - - end; - end; + r:= i-5; + break; + end; + if (s[i] in ['0'..'9']) then + inc(n) + else + n:=0; end; - + if (r=0) then r:=i; //r points chars before zulu time, if not found points end of s + info := trim(copy(s,1,r)); + end + else //format from sh/dx command + Begin + call := UpperCase(ExtractDelimited(2,Spot,[' '])); //to be sure case + freq := ExtractDelimited(1,Spot,[' ']); + t := ExtractDelimited(4,Spot,[' ']); //zulu time + s:=trim(copy(Spot,pos(t,Spot)+length(t),length(Spot))); + i:=Rpos('<',s); + if (i > 0) then + info:= copy(s,1,i-1) + else //should not happen + info:=s; + end; end; function TdmDXCluster.MyTryStrToInt(s : String; var i : Integer) : Boolean; @@ -209,6 +198,7 @@ function TdmDXCluster.BandModFromFreq(freq : String;var mode,band : String) : Bo var tmp : Extended; cw, ssb : Extended; + n :String; begin EnterCriticalsection(csDX); try @@ -229,6 +219,7 @@ begin trBands.RollBack; trBands.StartTransaction; qBands.Open; + //qBands.Last; //to get proper count //Writeln('qBands.RecorfdCount: ',qBands.RecordCount); if qBands.RecordCount = 0 then exit; @@ -243,8 +234,12 @@ begin if (tmp >= ssb) then mode := 'SSB' else - mode := 'RTTY'; + Begin + n:=IntToStr(frmTRXControl.cmbRig.ItemIndex); + mode := cqrini.ReadString('Band'+n, 'Datamode', 'RTTY') + end; end; + //Writeln('TdmDXCluster.BandModFromFreq:',Result,' cw ',FloatToStr(cw),' ssb ',FloatToStr(ssb)) finally LeaveCriticalsection(csDX) @@ -282,12 +277,14 @@ begin if lotw then Q.SQL.Text := 'SELECT id_cqrlog_main FROM '+dmData.DBName+'.cqrlog_main WHERE adif='+ sAdif+' AND band='+QuotedStr(band)+' AND ((qsl_r='+ - QuotedStr('Q')+') OR (lotw_qslr='+QuotedStr('L')+')) AND mode='+ + QuotedStr('Q')+') OR (lotw_qslr='+ QuotedStr('L')+ + ') OR (eqsl_qsl_rcvd='+ QuotedStr('E')+')) AND mode='+ QuotedStr(mode)+' LIMIT 1' else Q.SQL.Text := 'SELECT id_cqrlog_main FROM '+dmData.DBName+'.cqrlog_main WHERE adif='+ sAdif+' AND band='+QuotedStr(band)+' AND qsl_r='+ QuotedStr('Q')+ ' AND mode='+QuotedStr(mode)+' LIMIT 1'; + trQ.StartTransaction; Q.Open; if Q.Fields[0].AsInteger > 0 then @@ -1214,6 +1211,7 @@ begin qCallAlert.Open; if qCallAlert.RecordCount > 0 then begin + qCallAlert.Last; //to get proper count if dmData.DebugLevel>=1 then Writeln('Alert: Call hits with ', qCallAlert.RecordCount,' records'); qCallAlert.First; while ( (not qCallAlert.Eof) and (not Result) ) do diff --git a/src/dData.lfm b/src/dData.lfm index 541c146..e612998 100644 --- a/src/dData.lfm +++ b/src/dData.lfm @@ -2,68 +2,69 @@ object dmData: TdmData OnCreate = DataModuleCreate OnDestroy = DataModuleDestroy OldCreateOrder = False - Height = 606 - HorizontalOffset = 381 - VerticalOffset = 87 - Width = 822 - PPI = 96 + Height = 654 + HorizontalOffset = 153 + VerticalOffset = 39 + Width = 1050 object dsrMain: TDataSource DataSet = qCQRLOG - left = 304 - top = 24 + Left = 304 + Top = 24 end object dsrQSOBefore: TDataSource DataSet = qQSOBefore - left = 304 - top = 360 + Left = 216 + Top = 368 end object dsrImport: TDataSource - left = 728 - top = 528 + Left = 728 + Top = 528 end object dsrBands: TDataSource DataSet = qBands - left = 88 - top = 360 + Left = 112 + Top = 552 end object dsrWorkedContests: TDataSource DataSet = qWorkedContests - left = 416 - top = 424 + Left = 416 + Top = 424 end object dsrProfiles: TDataSource DataSet = qProfiles - left = 88 - top = 24 + Left = 88 + Top = 24 end object dsrDXCluster: TDataSource DataSet = qDXClusters - left = 224 - top = 24 + Left = 224 + Top = 24 end object dsrQSLMgr: TDataSource AutoEdit = False DataSet = qQSLMgr - left = 152 - top = 360 + Left = 32 + Top = 552 end object mQ: TSQLQuery FieldDefs = <> BeforeOpen = mQBeforeOpen Transaction = trmQ Params = <> + Macros = <> ParseSQL = False - left = 632 - top = 80 + Left = 632 + Top = 80 end object trmQ: TSQLTransaction Active = False Action = caNone - left = 632 - top = 144 + Left = 632 + Top = 144 end object scCommon: TSQLScript Transaction = trmQ + AutoCommit = False UseDollarString = False Directives.Strings = ( 'SET TERM' @@ -158,11 +159,12 @@ object dmData: TdmData UseSetTerm = True UseCommit = True UseDefines = True - left = 304 - top = 472 + Left = 304 + Top = 472 end object scLog: TSQLScript Transaction = trmQ + AutoCommit = False UseDollarString = False Directives.Strings = ( 'SET TERM' @@ -401,9 +403,6 @@ object dmData: TdmData 'ALTER TABLE log_changes' 'ADD INDEX id_cqrlog_main (id_cqrlog_main);' '' - 'ALTER TABLE log_changes' - 'ADD FOREIGN KEY (id_cqrlog_main) REFERENCES cqrlog_main (id_cqrlog_main) ON DELETE SET NULL ON UPDATE CASCADE;' - '' 'CREATE TABLE upload_status (' ' id int NOT NULL AUTO_INCREMENT PRIMARY KEY,' ' logname varchar(30) NOT NULL,' @@ -436,243 +435,258 @@ object dmData: TdmData UseCommit = False UseDefines = False OnException = scLogException - left = 152 - top = 472 + Left = 152 + Top = 472 end object dsrmQ: TDataSource DataSet = mQ - left = 632 - top = 24 + Left = 632 + Top = 24 end object qLogList: TSQLQuery FieldDefs = <> BeforeOpen = qLogListBeforeOpen Transaction = trLogList Params = <> + Macros = <> ParseSQL = False - left = 528 - top = 216 + Left = 528 + Top = 216 end object trLogList: TSQLTransaction Active = False Action = caNone - left = 528 - top = 288 + Left = 528 + Top = 288 end object dsrLogList: TDataSource DataSet = qLogList - left = 528 - top = 360 + Left = 368 + Top = 368 end object qSQLConsole: TSQLQuery PacketRecords = 100 FieldDefs = <> Transaction = trmQ Params = <> + Macros = <> ParseSQL = False - left = 632 - top = 216 + Left = 632 + Top = 216 end object trSQLConsole: TSQLTransaction Active = False Action = caNone - left = 632 - top = 288 + Left = 632 + Top = 288 end object dsrSQLConsole: TDataSource DataSet = qSQLConsole - left = 632 - top = 360 + Left = 632 + Top = 360 end object qQSLMgr: TSQLQuery FieldDefs = <> Transaction = trQSLMgr Params = <> + Macros = <> ParseSQL = False - left = 152 - top = 216 + Left = 152 + Top = 216 end object trQSLMgr: TSQLTransaction Active = False Action = caNone - left = 152 - top = 288 + Left = 152 + Top = 288 end object qCallBook: TSQLQuery FieldDefs = <> Transaction = trCallBook Params = <> - left = 24 - top = 80 + Macros = <> + Left = 24 + Top = 80 end object trCallBook: TSQLTransaction Active = False Action = caNone - left = 24 - top = 144 + Left = 24 + Top = 144 end object trLongNote: TSQLTransaction Active = False Action = caNone - left = 728 - top = 144 + Left = 728 + Top = 144 end object qLongNote: TSQLQuery FieldDefs = <> BeforeOpen = qLongNoteBeforeOpen Transaction = trLongNote Params = <> - left = 728 - top = 80 + Macros = <> + Left = 728 + Top = 80 end object qProfiles: TSQLQuery FieldDefs = <> Transaction = trProfiles Params = <> + Macros = <> ParseSQL = False - left = 88 - top = 80 + Left = 88 + Top = 80 end object trProfiles: TSQLTransaction Active = False Action = caNone - left = 88 - top = 144 + Left = 88 + Top = 144 end object qIOTAList: TSQLQuery FieldDefs = <> Transaction = trIOTAList Params = <> + Macros = <> ParseSQL = False - left = 24 - top = 216 + Left = 24 + Top = 216 end object trIOTAList: TSQLTransaction Active = False Action = caNone - left = 24 - top = 288 + Left = 24 + Top = 288 end object trBands: TSQLTransaction Active = False Action = caNone - left = 88 - top = 288 + Left = 88 + Top = 288 end object trWorkedContests: TSQLTransaction Active = False Action = caNone - left = 416 - top = 360 + Left = 304 + Top = 368 end object qBands: TSQLQuery FieldDefs = <> BeforeOpen = qBandsBeforeOpen Transaction = trBands Params = <> + Macros = <> ParseSQL = False - left = 88 - top = 216 + Left = 88 + Top = 216 end object qWorkedContests: TSQLQuery FieldDefs = <> Transaction = trWorkedContests Params = <> + Macros = <> ParseSQL = False - left = 122 - top = 216 + Left = 122 + Top = 216 end object trDXClusters: TSQLTransaction Active = False Action = caNone - left = 224 - top = 144 + Left = 224 + Top = 144 end object qDXClusters: TSQLQuery FieldDefs = <> Transaction = trDXClusters Params = <> + Macros = <> ParseSQL = False - left = 224 - top = 80 + Left = 224 + Top = 80 end object trComment: TSQLTransaction Active = False Action = caNone - left = 224 - top = 288 + Left = 224 + Top = 288 end object qComment: TSQLQuery FieldDefs = <> Transaction = trComment Params = <> + Macros = <> ParseSQL = False - left = 224 - top = 216 + Left = 224 + Top = 216 end object trException: TSQLTransaction Active = False Action = caNone - left = 472 - top = 288 + Left = 472 + Top = 288 end object qException: TSQLQuery FieldDefs = <> Transaction = trException Params = <> + Macros = <> ParseSQL = False - left = 472 - top = 216 + Left = 472 + Top = 216 end object trQSOBefore: TSQLTransaction Active = False Action = caNone - left = 304 - top = 288 + Left = 304 + Top = 288 end object qQSOBefore: TSQLQuery FieldDefs = <> Transaction = trQSOBefore Params = <> + Macros = <> ParseSQL = False - left = 299 - top = 216 + Left = 299 + Top = 216 end object trQ1: TSQLTransaction Active = False Action = caNone - left = 528 - top = 144 + Left = 528 + Top = 144 end object Q1: TSQLQuery FieldDefs = <> BeforeOpen = Q1BeforeOpen Transaction = trQ1 Params = <> + Macros = <> ParseSQL = False - left = 528 - top = 80 + Left = 528 + Top = 80 end object trQ: TSQLTransaction Active = False Action = caNone - left = 472 - top = 144 + Left = 472 + Top = 144 end object Q: TSQLQuery FieldDefs = <> BeforeOpen = QBeforeOpen Transaction = trQ Params = <> + Macros = <> ParseSQL = False - left = 472 - top = 80 + Left = 472 + Top = 80 end object trCQRLOG: TSQLTransaction Active = False Action = caNone - left = 304 - top = 144 + Left = 304 + Top = 144 end object qCQRLOG: TSQLQuery PacketRecords = 100 @@ -680,12 +694,14 @@ object dmData: TdmData BeforeOpen = qCQRLOGBeforeOpen Transaction = trCQRLOG Params = <> + Macros = <> ParseSQL = False - left = 304 - top = 80 + Left = 304 + Top = 80 end object scViews: TSQLScript Transaction = trmQ + AutoCommit = False UseDollarString = False Directives.Strings = ( 'SET TERM' @@ -715,16 +731,17 @@ object dmData: TdmData UseCommit = True UseDefines = True OnException = scViewsException - left = 224 - top = 472 + Left = 224 + Top = 472 end object tmrDBPing: TTimer Enabled = False OnTimer = tmrDBPingTimer - left = 16 - top = 24 + Left = 16 + Top = 24 end object scQSLExport: TSQLScript + AutoCommit = False UseDollarString = False Directives.Strings = ( 'SET TERM' @@ -781,11 +798,12 @@ object dmData: TdmData UseSetTerm = True UseCommit = True UseDefines = True - left = 528 - top = 472 + Left = 528 + Top = 472 end object scOnlineLogTriggers: TSQLScript Transaction = trmQ + AutoCommit = False UseDollarString = False Directives.Strings = ( 'SET TERM' @@ -818,10 +836,11 @@ object dmData: TdmData UseSetTerm = True UseCommit = True UseDefines = True - left = 416 - top = 472 + Left = 416 + Top = 472 end object scMySQLConfig: TSQLScript + AutoCommit = False UseDollarString = False Directives.Strings = ( 'SET TERM' @@ -907,84 +926,140 @@ object dmData: TdmData UseSetTerm = True UseCommit = True UseDefines = True - left = 40 - top = 472 + Left = 40 + Top = 472 end object qBandMapFil: TSQLQuery FieldDefs = <> Params = <> - left = 728 - top = 216 + Macros = <> + Left = 728 + Top = 216 end object trBandMapFil: TSQLTransaction Active = False - left = 728 - top = 288 + Left = 728 + Top = 288 end object qRbnMon: TSQLQuery FieldDefs = <> Params = <> - left = 152 - top = 80 + Macros = <> + Left = 152 + Top = 80 end object trRbnMon: TSQLTransaction Active = False - left = 152 - top = 144 + Left = 152 + Top = 144 end object qFreqMem: TSQLQuery FieldDefs = <> Transaction = trFreqMem Params = <> - left = 368 - top = 216 + Macros = <> + Left = 600 + Top = 544 end object trFreqMem: TSQLTransaction Active = False - left = 368 - top = 288 + Left = 528 + Top = 544 end object W: TSQLQuery FieldDefs = <> BeforeOpen = WBeforeOpen Transaction = trW Params = <> - left = 368 - top = 80 + Macros = <> + Left = 368 + Top = 80 end object trW: TSQLTransaction Active = False Action = caNone - left = 368 - top = 144 + Left = 368 + Top = 144 end object W1: TSQLQuery FieldDefs = <> BeforeOpen = W1BeforeOpen Transaction = trW1 Params = <> - left = 416 - top = 80 + Macros = <> + Left = 416 + Top = 80 end object trW1: TSQLTransaction Active = False Action = caNone - left = 416 - top = 144 + Left = 416 + Top = 144 end object Q2: TSQLQuery FieldDefs = <> BeforeOpen = Q2BeforeOpen Transaction = trQ2 Params = <> + Macros = <> ParseSQL = False - left = 576 - top = 80 + Left = 576 + Top = 80 end object trQ2: TSQLTransaction Active = False Action = caNone - left = 576 - top = 144 + Left = 576 + Top = 144 + end + object CQ: TSQLQuery + FieldDefs = <> + BeforeOpen = QBeforeOpen + Transaction = trCQ + Params = <> + Macros = <> + ParseSQL = False + Left = 680 + Top = 80 + end + object trCQ: TSQLTransaction + Active = False + Action = caNone + Left = 680 + Top = 144 + end + object dsrFreqs: TDataSource + DataSet = qFreqs + Left = 24 + Top = 368 + end + object trFreqs: TSQLTransaction + Active = False + Action = caNone + Left = 144 + Top = 368 + end + object qFreqs: TSQLQuery + FieldDefs = <> + BeforeOpen = qBandsBeforeOpen + Transaction = trFreqs + Params = <> + Macros = <> + ParseSQL = False + Left = 88 + Top = 368 + end + object qFreqMemGrid: TSQLQuery + FieldDefs = <> + Transaction = trFreqMemGrid + Params = <> + Macros = <> + Left = 352 + Top = 552 + end + object trFreqMemGrid: TSQLTransaction + Active = False + Left = 440 + Top = 552 end end diff --git a/src/dData.pas b/src/dData.pas index c3f53a1..2736784 100644 --- a/src/dData.pas +++ b/src/dData.pas @@ -24,8 +24,8 @@ uses const cDB_LIMIT = 500; - cDB_MAIN_VER = 18; - cDB_COMN_VER = 5; + cDB_MAIN_VER = 19; + cDB_COMN_VER = 6; cDB_PING_INT = 300; //ping interval for database connection in seconds //program crashed after long time of inactivity //so now after cDB_PING_INT will be run simple sql query @@ -55,11 +55,17 @@ type { TdmData } TdmData = class(TDataModule) + dsrFreqs: TDataSource; dsrSQLConsole: TDatasource; dsrLogList: TDatasource; dsrmQ: TDatasource; mQ: TSQLQuery; Q2: TSQLQuery; + CQ: TSQLQuery; + qFreqMemGrid: TSQLQuery; + qFreqs: TSQLQuery; + trFreqMemGrid: TSQLTransaction; + trFreqs: TSQLTransaction; trQ2: TSQLTransaction; qSQLConsole: TSQLQuery; scCommon: TSQLScript; @@ -86,7 +92,9 @@ type qBandMapFil: TSQLQuery; qRbnMon: TSQLQuery; qFreqMem: TSQLQuery; + trCQ: TSQLTransaction; trW: TSQLTransaction; + trWorkedContests: TSQLTransaction; W1: TSQLQuery; trW1: TSQLTransaction; W: TSQLQuery; @@ -160,12 +168,14 @@ type MySQLProcess : TProcess; csPreviousQSO : TRTLCriticalSection; fMySQLVersion : Currency; + FreqMemCount : integer; function FindLib(const Path,LibName : String) : String; function GetMysqldPath : String; function TableExists(TableName : String) : Boolean; function GetDebugLevel : Integer; function FieldExists(TableName, FieldName : String) : Boolean; + function ConstraintExists(TableName, ConstraintName : String) : Boolean; procedure CreateDBConnections; procedure CreateViews; @@ -192,6 +202,7 @@ type eQSLUsers : Array of ShortString; CallArray : Array of String[20]; + IsFilterSQL : String; //String that is created with Filter settings. Isvalid if isfilter is valid, no cleanups. IsFilter : Boolean; IsSFilter : Boolean; //Search filter //search function uses filter function but user doesn't need to know about it @@ -766,7 +777,11 @@ begin dmUtils.LoadBandsSettings; - frmTRXControl.InicializeRig; + frmTRXControl.cmbRig.ItemIndex:=cqrini.ReadInteger('TRX', 'RigInUse', 1); + frmTRXControl.cmbRigCloseUp(nil); + frmTRXControl.InitializeRig; + frmRotControl.rbRotor1.Checked:= cqrini.ReadBool('ROT','Use1',True); + frmRotControl.rbRotor2.Checked:= not(cqrini.ReadBool('ROT','Use1',True)); frmRotControl.InicializeRot; OpenFreqMemories(''); @@ -1675,10 +1690,18 @@ begin QuotedStr('10M')+',28.000,30.000,28.070,28.070,28.300)'; Q.ExecSQL; + Q.SQL.Text := 'INSERT INTO cqrlog_common.bands (band,b_begin,b_end,cw,rtty,ssb) VALUES (' + + QuotedStr('8M')+',40.0000,45.0000,40.3000,40.3000,40.6800)'; + Q.ExecSQL; + Q.SQL.Text := 'INSERT INTO cqrlog_common.bands (band,b_begin,b_end,cw,rtty,ssb) VALUES (' + QuotedStr('6M')+',50.000,52.000,50.110,50.110,50.120)'; Q.ExecSQL; + Q.SQL.Text := 'INSERT INTO cqrlog_common.bands (band,b_begin,b_end,cw,rtty,ssb) VALUES (' + + QuotedStr('5M')+',54.0000,69.9000,59.5000,59.6000,59.6000)'; + Q.ExecSQL; + Q.SQL.Text := 'INSERT INTO cqrlog_common.bands (band,b_begin,b_end,cw,rtty,ssb) VALUES (' + QuotedStr('4M')+',70.000,71.000,70.150,70.150,70.150)'; Q.ExecSQL; @@ -2583,8 +2606,8 @@ begin try Q.Open; Q.Last; - Q.First; Result := dmData.Q.RecordCount + //Q.First; finally Q.Close; trQ.RollBack @@ -2753,6 +2776,18 @@ begin Q1.ExecSQL; end; + if old_version < 6 then + begin + Q1.SQL.Text := 'INSERT INTO cqrlog_common.bands (band,b_begin,b_end,cw,rtty,ssb) VALUES (' + + QuotedStr('8M')+',40.0000,45.0000,40.3000,40.3000,40.6800)'; + if fDebugLevel>=1 then Writeln(Q1.SQL.Text); + Q1.ExecSQL; + Q1.SQL.Text := 'INSERT INTO cqrlog_common.bands (band,b_begin,b_end,cw,rtty,ssb) VALUES (' + + QuotedStr('5M')+',54.0000,69.9000,59.5000,59.6000,59.6000)'; + if fDebugLevel>=1 then Writeln(Q1.SQL.Text); + Q1.ExecSQL; + end; + Q1.SQL.Text := 'update cqrlog_common.db_version set nr='+IntToStr(cDB_COMN_VER); if fDebugLevel>=1 then Writeln(Q1.SQL.Text); Q1.ExecSQL @@ -2774,6 +2809,7 @@ end; procedure TdmData.UpgradeMainDatabase(old_version : Integer); var err : Boolean = False; + max : Integer; begin if fDebugLevel>=1 then Writeln('[UpgradeMainDatabase] Old version: ', old_version, ' cDB_MAIN_VER: ', cDB_MAIN_VER); @@ -3160,6 +3196,33 @@ begin end; end; + if (old_version < 19) then + begin + if (ConstraintExists('log_changes', 'log_changes_ibfk_1')) then + begin + trQ1.StartTransaction; + Q1.SQL.Text := 'ALTER TABLE log_changes DROP FOREIGN KEY log_changes_ibfk_1'; + if fDebugLevel>=1 then Writeln(Q1.SQL.Text); + Q1.ExecSQL; + trQ1.Commit; + end; + + // PrepareEmptyLogUploadStatusTables() would have been called + // for older versions + if (old_version >= 8) then + begin + trQ1.StartTransaction; + Q1.SQL.Text := 'select max(id) from log_changes'; + Q1.Open; + max := Q1.Fields[0].AsInteger; + Q1.Close; + Q1.SQL.Text := 'insert into upload_status (logname, id_log_changes) values ('+QuotedStr(C_UDPLOG)+','+IntToStr(max)+')'; + if fDebugLevel>=1 then Writeln(Q1.SQL.Text); + Q1.ExecSQL; + trQ1.Commit; + end; + end; + if TableExists('view_cqrlog_main_by_callsign') then begin trQ1.StartTransaction; @@ -3435,9 +3498,11 @@ begin trBands.RollBack; trBands.StartTransaction; qBands.Open; + qBands.Last; //to get proper record count if dmData.DebugLevel>=1 then Writeln('qBands.RecorfdCount: ',qBands.RecordCount); if qBands.RecordCount = 0 then exit; + qBands.First; band := qBands.Fields[1].AsString; cw := qBands.Fields[4].AsFloat; ssb := qBands.Fields[6].AsFloat; @@ -3665,6 +3730,33 @@ begin end end; +function TdmData.ConstraintExists(TableName, ConstraintName : String) : Boolean; +const + C_SEL = 'select constraint_name from information_schema.table_constraints where table_schema=%s and table_name=%s and constraint_name=%s'; +var + t : TSQLQuery; + tr : TSQLTransaction; +begin + Result := True; + t := TSQLQuery.Create(nil); + tr := TSQLTransaction.Create(nil); + try + t.Transaction := tr; + tr.DataBase := MainCon; + t.DataBase := MainCon; + + t.SQL.Text := Format(C_SEL,[QuotedStr(fDBName),QuotedStr(TableName), QuotedStr(ConstraintName)]); + if fDebugLevel>=1 then Writeln(t.SQL.Text); + t.Open; + Result := t.RecordCount>0 + finally + t.Close; + tr.Rollback; + FreeAndNil(t); + FreeAndNil(tr) + end +end; + procedure TdmData.PrepareEmptyLogUploadStatusTables(lQ : TSQLQuery;lTr : TSQLTransaction); var @@ -3691,6 +3783,10 @@ begin if fDebugLevel>=1 then Writeln(lQ.SQL.Text); lQ.ExecSQL; + lQ.SQL.Text := 'insert into upload_status (logname, id_log_changes) values ('+QuotedStr(C_UDPLOG)+',1)'; + if fDebugLevel>=1 then Writeln(lQ.SQL.Text); + lQ.ExecSQL; + if Commit then lTr.Commit end; @@ -3932,52 +4028,61 @@ var i : Integer; begin try try - dmData.trQ.StartTransaction; - dmData.Q.SQL.Text := C_DEL; - dmData.Q.ExecSQL; - dmData.Q.SQL.Text := C_INS; + dmData.qFreqMemGrid.Close; + if dmData.trFreqMemGrid.Active then dmData.trFreqMemGrid.Rollback; + dmData.trFreqMemGrid.StartTransaction; + dmData.qFreqMemGrid.SQL.Text := C_DEL; + dmData.qFreqMemGrid.ExecSQL; + dmData.trFreqMemGrid.Commit; + + dmData.trFreqMemGrid.StartTransaction; + dmData.qFreqMemGrid.SQL.Text := C_INS; for i:= 1 to grid.RowCount-1 do begin - Q.Prepare; - Q.Params[0].AsFloat := StrToFloat(grid.Cells[0,i]); - Q.Params[1].AsString := grid.Cells[1,i]; - Q.Params[2].AsInteger := StrToInt(grid.Cells[2,i]); - Q.Params[3].AsString := grid.Cells[3,i]; - Q.ExecSQL + qFreqMemGrid.Prepare; + qFreqMemGrid.Params[0].AsFloat := StrToFloat(grid.Cells[0,i]); + qFreqMemGrid.Params[1].AsString := grid.Cells[1,i]; + qFreqMemGrid.Params[2].AsInteger := StrToInt(grid.Cells[2,i]); + qFreqMemGrid.Params[3].AsUTF8String := grid.Cells[3,i]; + qFreqMemGrid.ExecSQL; end except - dmData.trQ.Rollback + dmData.trFreqMemGrid.Rollback end finally - dmData.Q.Close; - if dmData.trQ.Active then - dmData.trQ.Commit; + dmData.qFreqMemGrid.Close; + if dmData.trFreqMemGrid.Active then + dmData.trFreqMemGrid.Commit; OpenFreqMemories(frmTRXControl.GetRawMode) end end; procedure TdmData.LoadFreqMemories(grid : TStringGrid); const - C_SEL = 'select freq,mode,bandwidth,info from freqmem order by id'; + C_SEL = 'select freq,mode,bandwidth,info from freqmem order by freq'; begin try + grid.clear; grid.RowCount := 1; - dmData.trQ.StartTransaction; - dmData.Q.SQL.Text := C_SEL; - dmData.Q.Open; - while not dmData.Q.Eof do + dmData.qFreqMemGrid.Close; + if dmData.trFreqMemGrid.Active then dmData.trFreqMemGrid.Rollback; + dmData.trFreqMemGrid.StartTransaction; + dmData.qFreqMemGrid.SQL.Text := C_SEL; + dmData.qFreqMemGrid.Open; + while not dmData.qFreqMemGrid.Eof do begin grid.RowCount := grid.RowCount + 1; - grid.Cells[0,grid.RowCount-1] := FloatToStrF(Q.Fields[0].AsFloat,ffFixed,15,3); - grid.Cells[1,grid.RowCount-1] := Q.Fields[1].AsString; - grid.Cells[2,grid.RowCount-1] := IntToStr(Q.Fields[2].AsInteger); - grid.Cells[3,grid.RowCount-1] := Q.Fields[3].AsString; - Q.Next + grid.Cells[0,grid.RowCount-1] := FloatToStrF(qFreqMemGrid.Fields[0].AsFloat,ffFixed,15,3); + grid.Cells[1,grid.RowCount-1] := qFreqMemGrid.Fields[1].AsString; + grid.Cells[2,grid.RowCount-1] := IntToStr(qFreqMemGrid.Fields[2].AsInteger); + grid.Cells[3,grid.RowCount-1] := qFreqMemGrid.Fields[3].AsUTF8String; + qFreqMemGrid.Next end finally - dmData.Q.Close; - dmData.trQ.Rollback + dmData.qFreqMemGrid.Close; + dmData.trFreqMemGrid.Rollback end + end; procedure TdmData.OpenFreqMemories(mode : String); @@ -3987,8 +4092,7 @@ var c : integer; begin qFreqMem.Close; - if trFreqMem.Active then - trFreqMem.Rollback; + if trFreqMem.Active then trFreqMem.Rollback; if not cqrini.ReadBool('TRX','MemModeRelated',False) then mode:=''; //use related settings!! @@ -4007,21 +4111,24 @@ begin qFreqMem.SQL.Text := C_SEL + ' where (mode = ' + QuotedStr(mode) +') order by id' end; end; - if fDebugLevel>=1 then Writeln('FreqmemSql:',qFreqMem.SQL.Text); + if fDebugLevel>=1 then + Writeln('FreqmemSql:',qFreqMem.SQL.Text); trFreqMem.StartTransaction; qFreqMem.Open; - + qFreqMem.Last; //to get proper record count + FreqMemCount:=qFreqMem.RecordCount; + setLength(MemNR,(FreqMemCount)+1); qFreqMem.First; qFreqMem.prior; fFirstMemId := qFreqMem.Fields[0].AsInteger; - c:=-1; - setLength(MemNR,qFreqMem.RecordCount+1); + repeat begin inc(c); MemNR[c]:= qFreqMem.Fields[0].AsInteger; - if fDebugLevel>=1 then Writeln('FreqmemNR:',c,'=',MemNR[c]); + if fDebugLevel>=1 then + Writeln('FreqmemNR:',c,'=',MemNR[c]); qFreqMem.Next; end; until qFreqMem.Eof; @@ -4030,14 +4137,15 @@ begin fLastMemId := qFreqMem.Fields[0].AsInteger; - if fDebugLevel>=1 then Writeln('FreqmemFirst:',fFirstMemId,' FreqmemLast:',fLastMemId); + if fDebugLevel>=1 then + Writeln('FreqmemFirst:',fFirstMemId,' FreqmemLast:',fLastMemId); end; procedure TdmData.GetCurrentFreqFromMem(var freq : Double; var mode : String; var bandwidth : Integer; var info : String); var c: integer; begin - if qFreqMem.Active and (qFreqMem.RecordCount > 0) then + if qFreqMem.Active and (FreqMemCount > 0) then begin freq := qFreqMem.Fields[1].AsFloat; mode := qFreqMem.Fields[2].AsString; @@ -4046,9 +4154,9 @@ begin frmTRXControl.edtMemNr.Font.Color:= clDefault; // May be red if previous was "None" if info='' then begin - for c:=0 to qFreqMem.RecordCount do + for c:=0 to FreqMemCount do if MemNR[c]= qFreqMem.Fields[0].AsInteger then break; - frmTRXControl.edtMemNr.Text := IntToStr(c+1)+' of '+ IntToStr(qFreqMem.RecordCount ); + frmTRXControl.edtMemNr.Text := IntToStr(c+1)+' of '+ IntToStr(FreqMemCount); end else frmTRXControl.edtMemNr.Text := info; frmTRXControl.infosetstage :=1; diff --git a/src/dLogUpload.pas b/src/dLogUpload.pas index 06a72f9..3348f7d 100644 --- a/src/dLogUpload.pas +++ b/src/dLogUpload.pas @@ -8,16 +8,18 @@ uses Classes, SysUtils, sqldb, FileUtil, LResources, dynlibs, lcltype, ExtCtrls, sqlscript, process, mysql51dyn, ssl_openssl_lib, mysql55dyn, mysql55conn, mysql51conn, db, httpsend, blcksock, synautil, Forms, - Graphics, mysql56conn, mysql56dyn, mysql57dyn, mysql57conn; + Graphics, mysql56conn, mysql56dyn, mysql57dyn, mysql57conn, + lNet, lNetComponents, laz2_DOM, laz2_XMLWrite, md5; const C_HAMQTH = 'HamQTH'; C_CLUBLOG = 'ClubLog'; C_HRDLOG = 'HRDLog'; + C_UDPLOG = 'UDPLog'; C_ALLDONE = 'ALLDONE'; C_CLUBLOG_API = '21507885dece41ca049fec7fe02a813f2105aff2'; type - TWhereToUpload = (upHamQTH, upClubLog, upHrdLog); + TWhereToUpload = (upHamQTH, upClubLog, upHrdLog, upUDPLog); type @@ -40,22 +42,26 @@ type function RemoveSpaces(s : String) : String; function GetQSOInAdif(id_cqrlog_main : Integer) : String; function EncodeBandForClubLog(band : String) : String; + function EncodeBandForUDPLog(band : String) : String; function ParseHrdLogOutput(Output : String; var Response : String) : Integer; + procedure AddQSOKeyValue(id_cqrlog_main : Integer; data : TStringList); public csLogUpload : TRTLCriticalSection; - function UploadLogData(Url : String; data : TStringList; var Response : String; var ResultCode : Integer) : Boolean; + function UploadLogData(where : TWhereToUpload; cmd: String; data : TStringList; var Response : String; var ResultCode : Integer) : Boolean; + function UploadLogDataHTTP(Url : String; data : TStringList; var Response : String; var ResultCode : Integer) : Boolean; + function UploadLogDataUDP(cmd : String; data : TStringList; var Response : String; var ResultCode : Integer) : Boolean; function CheckUserUploadSettings(where : TWhereToUpload) : String; function GetLogUploadColor(where : TWhereToUpload) : Integer; function GetUploadUrl(where : TWhereToUpload; cmd : String) : String; - function GetResultMessage(where : TWhereToUpload; Response : String; ResultCode : Integer; var FatalError : Boolean) : String; + function GetResultMessage(where : TWhereToUpload; Response : String; ResultCode : Integer; var ErrorCode : Integer) : String; function LogUploadEnabled : Boolean; procedure MarkAsUploadedToAllOnlineLogs; procedure MarkAsUploaded(LogName : String); procedure PrepareUserInfoHeader(where : TWhereToUpload; data : TStringList); procedure PrepareInsertHeader(where : TWhereToUpload; id_log_changes,id_cqrlog_main : Integer; data : TStringList); - procedure PrepareDeleteHeader(where : TWhereToUpload; id_log_changes : Integer; data : TStringList); + procedure PrepareDeleteHeader(where : TWhereToUpload; id_log_changes,id_cqrlog_main : Integer; data : TStringList); procedure MarkAsUploaded(LogName : String; id_log_changes : Integer); procedure MarkAsUpDeleted(id_log_upload : Integer); procedure DisableOnlineLogSupport; @@ -106,8 +112,16 @@ begin if dmData.DebugLevel >=1 then Writeln(Q.SQL.Text) end; +function TdmLogUpload.UploadLogData(where : TWhereToUpload; cmd: String; data : TStringList; var Response : String; var ResultCode : Integer) : Boolean; +begin + case where of + upUDPLog : Result := UploadLogDataUDP(cmd,data,Response,ResultCode) + else + Result := UploadLogDataHTTP(dmLogUpload.GetUploadUrl(where,cmd), data, Response, ResultCode); + end; // case +end; -function TdmLogUpload.UploadLogData(Url : String; data : TStringList; var Response : String; var ResultCode : Integer) : Boolean; +function TdmLogUpload.UploadLogDataHTTP(Url : String; data : TStringList; var Response : String; var ResultCode : Integer) : Boolean; var HTTP : THTTPSend; Bound : string; @@ -159,6 +173,106 @@ begin end end; +function TdmLogUpload.UploadLogDataUDP(cmd : String; data : TStringList; var Response : String; var ResultCode : Integer) : Boolean; +var + i : Integer; + Key : String; + Value : String; + Address : String; + udp : TLUDPComponent; + n : Integer; + Doc : TXMLDocument; + RootNode,ItemNode,TextNode: TDOMNode; + msg : TStringStream; + msg_len : Integer; + sent : Integer; +begin + Result := False; + sent := 0; + Address := ''; + + try + Doc := TXMLDocument.Create; + if (cmd='DELETE') then + RootNode := Doc.CreateElement('contactdelete') + else if (cmd='UPDATE') then + RootNode := Doc.CreateElement('contactreplace') + else // INSERT + RootNode := Doc.CreateElement('contactinfo'); + Doc.Appendchild(RootNode); + RootNode := Doc.DocumentElement; + + for i:=0 to data.Count-1 do + begin + Key := copy(data.Strings[i],1,Pos('=',data.Strings[i])-1); + Value := copy(data.Strings[i],Pos('=',data.Strings[i])+1,Length(data.Strings[i])-Pos('=',data.Strings[i])+1); + case Key of + 'Address' : Address := Value; + else + ItemNode := Doc.CreateElement(Key); + TextNode := Doc.CreateTextNode(Value); + ItemNode.AppendChild(TextNode); + RootNode.AppendChild(ItemNode) + end; // case + end; + + if (Address='') then + begin + ResultCode := 500; + Response := 'Address not set; check config'; + Result := True; + exit + end; + + try + msg := TStringStream.Create('', TEncoding.UTF8); + WriteXMLFile(Doc, msg); + except + FreeAndNil(msg); + raise; + end; + finally + FreeAndNil(Doc); + end; + msg_len := Length(msg.DataString); + + try + udp := TLUDPComponent.Create(nil); + n := Pos(':', Address); + if n > 0 then + begin + udp.Host := Copy(Address, 1, n-1); + udp.Port := StrToInt(Copy(Address, n+1, Length(Address))); + end + else + begin + udp.Host := Address; + udp.Port := 5444; + end; + + if udp.Connect then sent := udp.SendMessage(msg.DataString, Address); + finally + if udp.Connected then udp.Disconnect; + FreeAndNil(udp); + FreeAndNil(msg); + end; + + if (sent = msg_len) then + begin + ResultCode := 200; + Response := 'Success'; + Result := True; + end + else + begin + ResultCode := 400; + Response := 'Failed. Only sent ' + IntToStr(sent) + ' of ' + IntToStr(msg_len) + ' bytes to ' + Address; + Result := False + end; + +end; + + procedure TdmLogUpload.MarkAsUploadedToAllOnlineLogs; var err : Boolean = False; @@ -412,6 +526,42 @@ begin end end; +function TdmLogUpload.EncodeBandForUDPLog(band : String) : String; +var + i : Integer; +begin + case band of + '160M' : Result := '1.8'; + '80M' : Result := '3.5'; + '60M' : Result := '5'; + '40M' : Result := '7'; + '30M' : Result := '10'; + '20M' : Result := '14'; + '17M' : Result := '18'; + '15M' : Result := '21'; + '12M' : Result := '24'; + '10M' : Result := '28'; + '6M' : Result := '50'; + '4M' : Result := '70'; + '2M' : Result := '144'; + '1.25M' : Result := '222'; + '70CM' : Result := '420'; + '33CM' : Result := '902'; + '23CM' : Result := '1240'; + '13CM' : Result := '2300'; + '9CM' : Result := '3300'; + '6CM' : Result := '5650'; + '3CM' : Result := '10000'; + '1.25CM' : Result := '24000'; + '6MM' : Result := '47000'; + '4MM' : Result := '76000'; + '2MM' : Result := '142000'; + '1MM' : Result := '241000'; + else + Result := ''; + end; +end; + function TdmLogUpload.ParseHrdLogOutput(Output : String; var Response : String) : Integer; var msg : String = ''; @@ -433,6 +583,54 @@ begin end end; +procedure TdmLogUpload.AddQSOKeyValue(id_cqrlog_main : Integer; data : TStringList); +begin + Q1.Close; + if trQ1.Active then trQ1.Rollback; + + trQ1.StartTransaction; + try + Q1.SQL.Text := 'select * from cqrlog_main where id_cqrlog_main = '+IntToStr(id_cqrlog_main); + Q1.Open; + + if Q1.Fields[0].IsNull then + begin //this should not happen + if dmData.DebugLevel>=1 then Writeln('AddQsoKeyValue: QSO not found in the log. ID:', id_cqrlog_main); + exit + end; + + data.Add('snt='+Q1.FieldByName('rst_s').AsString); + data.Add('rcv='+Q1.FieldByName('rst_r').AsString); + data.Add('name='+Q1.FieldByName('name').AsString); + data.Add('qth='+Q1.FieldByName('qth').AsString); + data.Add('gridsquare='+Q1.FieldByName('loc').AsString); + data.Add('continent='+Q1.FieldByName('cont').AsString); + data.Add('zone='+Q1.FieldByName('waz').AsString); + { + data.Add('zone='+Q1.FieldByName('itu').AsString); + } + data.Add('power='+Q1.FieldByName('pwr').AsString); + data.Add('contestname='+Q1.FieldByName('contestname').AsString); + data.Add('operator='+Q1.FieldByName('operator').AsString); + if cqrini.ReadBool('OnlineLog','UdIncExch',True) then + begin + data.Add('sntnr='+Q1.FieldByName('stx').AsString); + data.Add('rcvnr='+Q1.FieldByName('srx').AsString); + data.Add('exchange1='+Q1.FieldByName('stx_string').AsString+' '+Q1.FieldByName('srx_string').AsString) + end + else + begin + data.Add('sntnr='); + data.Add('rcvnr='); + data.Add('exchange1='); + end; + + finally + Q1.Close; + trQ1.Rollback + end +end; + function TdmLogUpload.CheckUserUploadSettings(where : TWhereToUpload) : String; const C_IS_NOT_SET = '%s is not set! Go to Preferences and change settings.'; @@ -458,6 +656,10 @@ begin Result := C_HRDLOG + ' ' + Format(C_IS_NOT_SET,['Callsign']) else if (cqrini.ReadString('OnlineLog','HrCode','')='') then Result := C_HRDLOG + ' ' + Format(C_IS_NOT_SET,['Code']) + end; + upUDPLog : begin + if (cqrini.ReadString('OnlineLog','UdAddress','')='') then + Result := C_UDPLOG + ' ' + Format(C_IS_NOT_SET,['Address']) end end //case end; @@ -468,7 +670,8 @@ begin case where of upHamQTH : Result := cqrini.ReadInteger('OnlineLog','HaColor',clBlue); upClubLog : Result := cqrini.ReadInteger('OnlineLog','ClColor',clRed); - upHrdLog : Result := cqrini.ReadInteger('OnlineLog','HrColor',clPurple) + upHrdLog : Result := cqrini.ReadInteger('OnlineLog','HrColor',clPurple); + upUDPLog : Result := cqrini.ReadInteger('OnlineLog','UdColor',clGreen) end end; @@ -491,6 +694,11 @@ begin data.Add('Code='+cqrini.ReadString('OnlineLog','HrCode','')); data.Add('App=CQRLOG') end; + upUDPLog : begin + data.Add('Address='+cqrini.ReadString('OnlineLog','UdAddress','')); + data.Add('mycall='+cqrini.ReadString('Station', 'Call', '')); + data.Add('app=CQRLOG') + end; end //case end; @@ -539,6 +747,25 @@ begin end; upHrdLog : begin data.Add('ADIFData='+adif) + end; + upUDPLog : begin + data.Add('IsOriginal=True'); + data.Add('timestamp='+Q2.FieldByName('qsodate').AsString+' '+Q2.FieldByName('time_on').AsString+':00'); + data.Add('call='+Q2.FieldByName('callsign').AsString); + data.Add('band='+EncodeBandForUDPLog(Q2.FieldByName('band').AsString)); + data.Add('mode='+Q2.FieldByName('mode').AsString); + data.Add('rxfreq='+IntToStr(round(Q2.FieldByName('freq').AsFloat*100000))); + data.Add('txfreq='+IntToStr(round(Q2.FieldByName('freq').AsFloat*100000))); + if (id_cqrlog_main>0) then + begin + AddQSOKeyValue(id_cqrlog_main, data); + data.Add('ID='+MD5Print(MD5String(cqrini.ReadString('Station', 'Call', '') + ':' + IntToStr(id_cqrlog_main)))); + end; + if (Q2.FieldByName('old_qsodate').AsString <> '') then + begin + data.Add('oldtimestamp='+Q2.FieldByName('old_qsodate').AsString+' '+Q2.FieldByName('old_time_on').AsString+':00'); + data.Add('oldcall='+Q2.FieldByName('old_callsign').AsString); + end end end //case finally @@ -547,7 +774,7 @@ begin end end; -procedure TdmLogUpload.PrepareDeleteHeader(where : TWhereToUpload; id_log_changes : Integer; data : TStringList); +procedure TdmLogUpload.PrepareDeleteHeader(where : TWhereToUpload; id_log_changes,id_cqrlog_main : Integer; data : TStringList); const C_SEL_LOG_CHANGES = 'select * from log_changes where id = %d'; var @@ -587,6 +814,18 @@ begin GetAdifValue('CALL',Q2.FieldByName('old_callsign').AsString); data.Add('ADIFKey='+adif); data.Add('Cmd=DELETE') + end; + upUDPLog : begin + data.Add('timestamp='+Q2.FieldByName('old_qsodate').AsString+' '+Q2.FieldByName('old_time_on').AsString+':00'); + data.Add('call='+Q2.FieldByName('old_callsign').AsString); + data.Add('band='+EncodeBandForUDPLog(Q2.FieldByName('old_band').AsString)); + data.Add('mode='+Q2.FieldByName('old_mode').AsString); + data.Add('rxfreq='+IntToStr(round(Q2.FieldByName('old_freq').AsFloat*100000))); + data.Add('txfreq='+IntToStr(round(Q2.FieldByName('old_freq').AsFloat*100000))); + if (id_cqrlog_main>0) then + begin + data.Add('ID='+MD5Print(MD5String(cqrini.ReadString('Station', 'Call', '') + ':' + IntToStr(id_cqrlog_main)))); + end end end //case finally @@ -599,21 +838,21 @@ function TdmLogUpload.GetUploadUrl(where : TWhereToUpload; cmd : String) : Strin begin Result := ''; case where of - upHamQTH : Result := 'http://www.hamqth.com/qso_realtime.php'; + upHamQTH : Result := cqrini.ReadString('OnlineLog','HaUrl','http://www.hamqth.com/qso_realtime.php'); upClubLog : begin if (cmd='DELETE') then - Result := 'https://secure.clublog.org/delete.php' + Result := cqrini.ReadString('OnlineLog','ClUrlDel','https://clublog.org/delete.php') else - Result := 'https://secure.clublog.org/realtime.php' + Result := cqrini.ReadString('OnlineLog','ClUrl','https://clublog.org/realtime.php'); end; - upHrdLog : Result := 'http://robot.hrdlog.net/NewEntry.aspx' + upHrdLog : Result := cqrini.ReadString('OnlineLog','HrUrl','http://robot.hrdlog.net/NewEntry.aspx'); end //case end; -function TdmLogUpload.GetResultMessage(where : TWhereToUpload; Response : String; ResultCode : Integer; var FatalError : Boolean) : String; +function TdmLogUpload.GetResultMessage(where : TWhereToUpload; Response : String; ResultCode : Integer; var ErrorCode : Integer) : String; begin Result := ''; - FatalError := False; + ErrorCode := 0; Response := Trim(Response); case where of @@ -622,26 +861,26 @@ begin 200 : Result := 'OK'; 500 : begin Result := Response; - FatalError := True + ErrorCode := 1; end;//something wrong with HamQTH server 400 : begin Result := Response; if (Response = 'QSO already exists in the log') then Result := 'Already exists' else if (Response = 'QSO not found in the log!') then - FatalError := False + ErrorCode := 0 else begin - FatalError := True; //QSO rejected + ErrorCode := 2; //QSO rejected; continue with next one Result := Response end end; 403 : begin Result := 'Access denied'; - FatalError := True + Errorcode := 1 end else begin Result := Response; - FatalError := True + ErrorCode := 1 end end end; @@ -651,29 +890,49 @@ begin 400 : begin Result := Response; if (Pos('skipping qso',LowerCase(Response))=0) then //consider skiping QSO as non fatal error, the app can live with it :) - FatalError := True + ErrorCode := 2 end; 403 : begin Result := 'Access denied'; - FatalError := True + ErrorCode := 1 end; 500 : begin Result := 'Internal error'; - FatalError := True + ErrorCode := 2 end; 404 : begin Result := Response; - FatalError := True + if (Response = 'QSO Details Not Matched') then + begin + ErrorCode := 2; + end + else + begin + ErrorCode := 1; + end; end end //case end; upHrdLog : begin case ParseHrdLogOutput(Response,Result) of 200 : Result := 'OK'; - 400 : FatalError := True; - 403 : FatalError := True; - 500 : FatalError := True; - 404 : FatalError := True + 400 : ErrorCode := 2; + 403 : ErrorCode := 2; + 500 : ErrorCode := 1; + 404 : ErrorCode := 2 + end //case + end; + upUDPLog : begin + case ResultCode of + 200 : Result := 'OK'; + 400 : begin + Result := Response; + ErrorCode := 2 + end; + 500 : begin + Result := Response; + ErrorCode := 1 + end end //case end end //case @@ -739,7 +998,8 @@ function TdmLogUpload.LogUploadEnabled : Boolean; begin Result := cqrini.ReadBool('OnlineLog','HaUp',False) or cqrini.ReadBool('OnlineLog','ClUp',False) or - cqrini.ReadBool('OnlineLog','HrUp',False) + cqrini.ReadBool('OnlineLog','HrUp',False) or + cqrini.ReadBool('OnlineLog','UdUp',False) end; procedure TdmLogUpload.DisableOnlineLogSupport; diff --git a/src/dUtils.pas b/src/dUtils.pas index dc3560e..bb4b17c 100644 --- a/src/dUtils.pas +++ b/src/dUtils.pas @@ -51,32 +51,34 @@ const ':', '|', '-', '=', '+', '@', '#', '*', '%', '_', '(', ')', '$', '<', '>']; empty_freq = '0.00000'; empty_azimuth = '0.0'; - cMaxModes = 48; //last added FST4 - cModes: array [0..cMaxModes] of string = - ('CW', 'SSB', 'AM', 'FM', 'RTTY', 'SSTV', 'PACTOR', 'PSK', 'ATV', 'CLOVER', 'GTOR', 'MTOR', - 'PSK31', 'HELL', 'MT63', - 'QRSS', 'CWQ', 'BPSK31', 'MFSK', 'JT44', 'FSK44', 'WSJT', 'AMTOR', - 'THROB', 'BPSK63', 'PACKET', - 'OLIVIA', 'MFSK16', 'JS8', 'JT4','JT6M', 'JT65', 'JT65A', 'JT65B', 'JT65C', - 'JT9', 'QRA64', 'ISCAT', 'MSK144', 'FT8', 'FT4', 'FST4', 'FSK441', 'PSK125', - 'PSK63', 'WSPR', 'PSK250', 'ROS', 'DIGITALVOICE'); - cMaxBandsCount = 30; //29 bands + cMaxModes = 48; //One less than count 49 modes (loops have 0..MaxModes) + cModes: array [0..cMaxModes] of string = + ('CW', 'SSB', 'AM', 'FM', 'RTTY', 'SSTV', 'PACTOR','PSK', 'ATV', 'CLOVER', + 'GTOR', 'MTOR', 'PSK31', 'HELL', 'MT63', 'QRSS', 'CWQ', 'BPSK31','MFSK', 'JT44', + 'FSK44', 'WSJT', 'AMTOR', 'THROB', 'BPSK63','PACKET','OLIVIA','MFSK16','JS8', 'JT4', + 'JT6M', 'JT65', 'JT65A', 'JT65B', 'JT65C', 'JT9', 'QRA64', 'ISCAT', 'MSK144', 'FT8', + 'FT4', 'FST4', 'FSK441','PSK125','PSK63', 'WSPR', 'PSK250','ROS', 'DIGITALVOICE'); + + cMaxBandsCount = 31; //True count of bands. (loops have 0..MaxBandsCount-1) + cBands: array[0..30] of string[10] = + ('2190M', '630M', '160M', '80M' , '60M','40M' , '30M', '20M' , '17M' , '15M' , + '12M' , '10M' , '5M' , '6M' , '8M' ,'4M' , '2M' , '1.25M', '70CM', '33CM', + '23CM' , '13CM', '9CM' , '6CM' , '3CM','1.25CM','6MM', '4MM' , '2.5MM','2MM', + '1MM'); cDefaultFreq = - '0.136|0.472|1.800|3.500|3.700|5.351|7.000|10.100|14.000|14.200|18.100|21.000|21.200|24.890|28.000|28.500|50.000|70.0875|' - + - '70.0500|144.000|145.275|430.000|902.0|1250.0|2400.0|3450.0|5670.0|10250.0|24100.0|47100.0|78000.0|122252.0|134930.0|248000.0'; - cBands: array[0..28] of string[10] = - ('2190M', '630M', '160M', '80M' , '60M', '40M' , '30M', '20M' , '17M' , '15M' , - '12M' , '10M' , '6M' , '4M' , '2M' , '1.25M', '70CM', '33CM', '23CM', '13CM', - '9CM' , '6CM' , '3CM' , '1.25CM', '6MM', '4MM', '2.5MM', '2MM', '1MM'); + '0.136|0.472|1.800|3.500|3.700|5.351|7.000|10.100|14.000|14.200|'+ + '18.100|21.000|21.200|24.890|28.000|28.500|40.000|50.000|60.0000|70.0500|'+ + '144.000|145.275|430.000|902.0|1250.0|2400.0|3450.0|5670.0|10250.0|24100.0|'+ + '47100.0|78000.0|122252.0|134930.0|248000.0'; + cMaxIgnoreFreq = 6; cIngnoreFreq: array [0..cMaxIgnoreFreq] of string = ('1800.0', '3500.0', '7000.0', '10100.0', '14000.0', '21000.0', '28000.0'); C_RBN_CONT = 'AF,AN,AS,EU,NA,SA,OC'; - C_RBN_BANDS = '630M,160M,80M,60M,40M,30M,20M,17M,15M,12M,10M,6M,2M'; + C_RBN_BANDS = '630M,160M,80M,60M,40M,30M,20M,17M,15M,12M,10M,8M,6M,5M,2M'; C_RBN_MODES = 'CW,RTTY,PSK31'; C_CONTEST_LIST_FILE_NAME = 'ContestName.tab'; @@ -109,6 +111,7 @@ type fGrayLineOffset: currency; fQRZSession: string; fHamQTHSession: string; + fQRZCQSession: string; fSysUTC: boolean; SubmodeMode: TStringList; ImportMode : TStringlist; @@ -122,11 +125,14 @@ type function nr(ch: char): integer; function GetTagValue(Data, tg: string): string; function GetQRZSession(var ErrMsg: string): boolean; + function GetQRZCQSession(var ErrMsg: string): boolean; function GetHamQTHSession(var ErrMsg: string): boolean; function GetQRZInfo(call: string; var nick, qth, address, zip, grid, state, county, qsl, iota, waz, itu, ErrMsg: string): boolean; function GetHamQTHInfo(call: string; var nick, qth, address, zip, grid, state, county, qsl, iota, waz, itu, dok, ErrMsg: string): boolean; + function GetQRZCQInfo(call: string; + var nick, qth, address, zip, grid, state, county, qsl, iota, waz, itu, dok, ErrMsg: string): boolean; public s136: string; @@ -141,7 +147,9 @@ type s15: string; s12: string; s10: string; + s8: string; s6: string; + s5: string; s4: string; s220: string; s2: string; @@ -220,6 +228,10 @@ type procedure BandFromDbase; procedure UpdateHelpBrowser; procedure ModeFromCqr(CqrMode:String;var OutMode,OutSubmode:String;dbg:Boolean); + procedure UpdateCallBookcnf; + procedure ClearStatGrid(g:TStringGrid); + procedure AddBandsToStatGrid(g:TStringGrid); + procedure ShowStatistic(ref_adif,old_stat_adif:Word; g:TStringGrid; call:String=''); function BandFromArray(tmp:Currency):string; function MyDefaultBrowser:String; @@ -275,7 +287,7 @@ type function ExtractZipCode(qth : String; Position : Integer) : String; function GetLabelBand(freq : String) : String; function GetAdifBandFromFreq(MHz : string): String; - function GetCWMessage(Key,call,rst_s,stx,stx_str,HisName,HelloMsg, text: String) : String; + function GetCWMessage(Key,call,rst_s,stx,stx_str,srx,srx_str,HisName,HelloMsg, text: String) : String; function RigGetcmd(r : String): String; function GetLastQSLUpgradeDate : TDateTime; function GetLastDOKUpgradeDate : TDateTime; @@ -323,7 +335,7 @@ implementation {$R *.lfm} { TdmUtils } -uses dData, dDXCC, fEnterFreq, fTRXControl, uMyini, fNewQSO; +uses dData, dDXCC, fEnterFreq, fTRXControl, uMyini, fNewQSO, uVersion, fContest; function TdmUtils.LetterFromMode(mode: string): string; begin @@ -551,7 +563,8 @@ begin end end finally - cqrini.SaveToDisk; + //cqrini.SaveToDisk; WHY we save when load? Is this unchecked direct copy from SaveForm source abowe? + // There is no cqrini writing done, so why need to save? l.Free end end; @@ -702,7 +715,6 @@ begin QSL_R.Items.Add('!'); end; - procedure TdmUtils.InsertFreq(cmbFreq: TcomboBox); var a: TExplodeArray; @@ -713,36 +725,6 @@ begin for i := 0 to Length(a) - 1 do if a[i] <> '' then cmbFreq.Items.Add(a[i]); - { - cmbFreq.Items.Add('1.800'); - cmbFreq.Items.Add('3.500'); - cmbFreq.Items.Add('3.700'); - cmbFreq.Items.Add('7.000'); - cmbFreq.Items.Add('10.100'); - cmbFreq.Items.Add('14.000'); - cmbFreq.Items.Add('14.200'); - cmbFreq.Items.Add('18.100'); - cmbFreq.Items.Add('21.000'); - cmbFreq.Items.Add('21.200'); - cmbFreq.Items.Add('24.890'); - cmbFreq.Items.Add('28.000'); - cmbFreq.Items.Add('28.500'); - cmbFreq.Items.Add('50.000'); - cmbFreq.Items.Add('70.0875'); - cmbFreq.Items.Add('70.0500'); - cmbFreq.Items.Add('144.000'); - cmbFreq.Items.Add('145.275'); - cmbFreq.Items.Add('430.000'); - cmbFreq.Items.Add('902.0'); - cmbFreq.Items.Add('1250.0'); - cmbFreq.Items.Add('2400.0'); - cmbFreq.Items.Add('3450.0'); - cmbFreq.Items.Add('5670.0'); - cmbFreq.Items.Add('10250.0'); - cmbFreq.Items.Add('24100.0'); - cmbFreq.Items.Add('47100.0'); - cmbFreq.Items.Add('78000.0'); - } end; procedure TdmUtils.InsertBands(cmbBand: TComboBox); @@ -758,7 +740,7 @@ procedure TdmUtils.InsertWorkedContests(cmbContest: TComboBox); var i: integer; const - C_SEL = 'SELECT DISTINCT `contestname` FROM `cqrlog_main` WHERE `contestname` IS NOT NULL and `contestname` != "" ORDER BY `contestname` DESC'; + C_SEL = 'SELECT DISTINCT `contestname` FROM `cqrlog_main` WHERE `contestname` IS NOT NULL and `contestname` != "" ORDER BY `contestname` ASC'; begin cmbContest.Clear; dmData.qWorkedContests.Close; @@ -1280,6 +1262,9 @@ end; function TdmUtils.IsDateOK(date: string): boolean; var tmp: string; + +//OH1KH: this 230-0010-20 passes as 2023-01-20 !!! We have to do something for this !! + begin if date = '' then begin @@ -1288,6 +1273,10 @@ begin end; Result := True; +//check separator places first + if (date[5]<>'-') or (date[8]<>'-') then + Result:=false; + tmp := FormatSettings.ShortDateFormat; try FormatSettings.ShortDateFormat := 'YYYY-MM-DD'; @@ -2728,7 +2717,7 @@ begin Result := LowerCase(GetBandFromFreq(freq)); end; -function TdmUtils.GetCWMessage(Key,call,rst_s,stx,stx_str,HisName,HelloMsg, text : String) : String; +function TdmUtils.GetCWMessage(Key,call,rst_s,stx,stx_str,srx,srx_str,HisName,HelloMsg, text : String) : String; { %mc - my callsign %mn - my name @@ -2741,9 +2730,12 @@ function TdmUtils.GetCWMessage(Key,call,rst_s,stx,stx_str,HisName,HelloMsg, text %c - callsign %h - greeting GM/GA/GE calculated from the %c station location time - %xn - contest exchenge serial number + %xn - contest exchange serial number + %xnr - contest exchange seral number received %xm - contest exchange message + %xmr - contest exchange message received %xns - contest exchenge serial number sends 9->N and 0->T + %xnrs- contest exchange message received sends 9->N and 0->T %xrs - full contest exchange RST+SerialNR+Message sends 9->N and 0->T. Can be used "always" as if serNR and/or Message are empty just sends plain report. @@ -2758,6 +2750,7 @@ var myqth : String = ''; rst_sh : String = ''; stx_sh : String = ''; + srx_sh : String = ''; con_ex : String = ''; begin @@ -2766,7 +2759,15 @@ begin myname := cqrini.ReadString('Station', 'Name', ''); myqth := cqrini.ReadString('Station', 'QTH', ''); if key <> '' then + Begin + if (frmContest.Showing) and ( not (cqrini.ReadBool('CW','S&P',True))) then //if contest and run mode keys are F11-F20 + Begin + if key='F10' then key:='F20' + else + key:= key[1]+'1'+key[2]; + end; Result := LowerCase(cqrini.ReadString('CW', key, '')) + end else Result := text; @@ -2776,27 +2777,38 @@ begin stx_sh := StringReplace(stx,'9','N',[rfReplaceAll, rfIgnoreCase]); stx_sh := StringReplace(stx_sh,'0','T',[rfReplaceAll, rfIgnoreCase]);//replace zeros, too + srx_sh := StringReplace(srx,'9','N',[rfReplaceAll, rfIgnoreCase]); + srx_sh := StringReplace(srx_sh,'0','T',[rfReplaceAll, rfIgnoreCase]);//replace zeros, too + con_ex := rst_sh; if stx_sh <>'' then con_ex:=con_ex+' '+stx_sh; if stx_str <>'' then con_ex:=con_ex+' '+stx_str; + Result := StringReplace(Result,'%xnrs',srx_sh,[rfReplaceAll, rfIgnoreCase]); + Result := StringReplace(Result,'%xnr',srx,[rfReplaceAll, rfIgnoreCase]); + Result := StringReplace(Result,'%xns',stx_sh,[rfReplaceAll, rfIgnoreCase]); + Result := StringReplace(Result,'%xn',stx,[rfReplaceAll, rfIgnoreCase]); + + Result := StringReplace(Result,'%xmr',srx_str,[rfReplaceAll, rfIgnoreCase]); + Result := StringReplace(Result,'%xm',stx_str,[rfReplaceAll, rfIgnoreCase]); + + Result := StringReplace(Result,'%xrs',con_ex,[rfReplaceAll, rfIgnoreCase]); + Result := StringReplace(Result,'%rs',rst_sh,[rfReplaceAll, rfIgnoreCase]); + Result := StringReplace(Result,'%r',rst_s,[rfReplaceAll, rfIgnoreCase]); + + Result := StringReplace(Result,'%n',HisName,[rfReplaceAll, rfIgnoreCase]); + Result := StringReplace(Result,'%mc',mycall,[rfReplaceAll, rfIgnoreCase]); Result := StringReplace(Result,'%ml',myloc,[rfReplaceAll, rfIgnoreCase]); Result := StringReplace(Result,'%mn',myname,[rfReplaceAll, rfIgnoreCase]); Result := StringReplace(Result,'%mq',myqth,[rfReplaceAll, rfIgnoreCase]); - Result := StringReplace(Result,'%xrs',con_ex,[rfReplaceAll, rfIgnoreCase]); - Result := StringReplace(Result,'%rs',rst_sh,[rfReplaceAll, rfIgnoreCase]); - Result := StringReplace(Result,'%r',rst_s,[rfReplaceAll, rfIgnoreCase]); - Result := StringReplace(Result,'%n',HisName,[rfReplaceAll, rfIgnoreCase]); - Result := StringReplace(Result,'%c',call,[rfReplaceAll, rfIgnoreCase]); Result := StringReplace(Result,'%h',HelloMsg,[rfReplaceAll, rfIgnoreCase]); - Result := StringReplace(Result,'%xns',stx_sh,[rfReplaceAll, rfIgnoreCase]); - Result := StringReplace(Result,'%xn',stx,[rfReplaceAll, rfIgnoreCase]); - Result := StringReplace(Result,'%xm',stx_str,[rfReplaceAll, rfIgnoreCase]); + Result := StringReplace(Result,'%c',call,[rfReplaceAll, rfIgnoreCase]); - if dmData.DebugLevel>=1 then Writeln('Sending:',Result) + if dmData.DebugLevel>=1 then + Writeln('Sending:',Result) end; function TdmUtils.RigGetcmd(r : String) : String; @@ -3246,7 +3258,93 @@ begin HTTP.Free end; end; +function TdmUtils.GetQRZCQInfo(call: string; + var nick, qth, address, zip, grid, state, county, qsl, iota, waz, itu, dok, ErrMsg: string): boolean; +var + http: THTTPSend; + req: string = ''; + m: TStringList; + tmp:String; +begin + Result := False; + nick := ''; + address := ''; + grid := ''; + state := ''; + county := ''; + qsl := ''; + ErrMsg := ''; + if fQRZCQSession = '' then + begin + if not GetQRZCQSession(ErrMsg) then + exit; + end; + http := THTTPSend.Create; + m := TStringList.Create; + try + http.ProxyHost := cqrini.ReadString('Program', 'Proxy', ''); + http.ProxyPort := cqrini.ReadString('Program', 'Port', ''); + http.UserName := cqrini.ReadString('Program', 'User', ''); + http.Password := cqrini.ReadString('Program', 'Passwd', ''); + if (call = '') then + begin + ErrMsg := 'Callsign field empty!'; + exit; + end; + req := 'https://ssl.qrzcq.com/xml?s=' + fQRZCQSession + '&callsign=' + GetIDCall(call)+'&agent=Cqrlog_'+uVersion.cVERSION; + if not HTTP.HTTPMethod('GET', req) then + ErrMsg := '(' + IntToStr(http.ResultCode) + '):' + http.ResultString + else + begin + m.LoadFromStream(http.Document); + if Pos(UpperCase('<Error>Session Timeout</Error>'), UpperCase(m.Text)) > 0 then + begin + fQRZCQSession := ''; + cqrini.WriteString('CallBook', 'CbQRZCQKey', fQRZCQSession); + Result := GetQRZCQInfo(call, nick, qth, address, zip, grid, state, + county, qsl, iota, waz, itu, dok, ErrMsg); + end + else + begin + if Pos('<Error>Not found:', m.Text) > 0 then + exit; + nick:= GetTagValue(m.Text, '<name>'); + if WordCount(nick,[' ']) >2 then //There may be nickname after true name + Begin + tmp := ExtractWord(2,nick,[' ']); + nick:= ExtractWord(1,nick,[' ']); + if ((pos('(',tmp)>0) + or (pos('"',tmp)>0) + or (pos(#$27,tmp)>0) // ' + or (pos('[',tmp)>0) + or (pos('{',tmp)>0) ) then //There may be nickname after true name + nick:= nick+' '+tmp; + end + else + nick:= ExtractWord(1,nick,[' ']); + qth := GetTagValue(m.Text, '<qth>'); + state := GetTagValue(m.Text, '<state>'); + zip := GetTagValue(m.Text, '<zip>'); + address := GetTagValue(m.Text, '<name>') + LineEnding + + GetTagValue(m.Text, '<address>') + LineEnding; + if (state <> '') then + address := address + ', ' + state; + address := address + ' ' + zip; + county := GetTagValue(m.Text, '<county>'); + grid := UpperCase(GetTagValue(m.Text, '<locator>')); + qsl := GetTagValue(m.Text, '<manager>'); + iota := GetTagValue(m.Text, '<iota>'); + waz := GetTagValue(m.Text, '<cq>'); + itu := GetTagValue(m.Text, '<itu>'); + dok := GetTagValue(m.Text, '<dok>') + end + end + finally + m.Free; + HTTP.Free + end; +end; procedure TdmUtils.SaveWindowPos(a: TForm); var section: string = ''; @@ -3788,8 +3886,10 @@ function TdmUtils.GetCallBookData(call: string; var nick, qth, address, zip, grid, state, county, qsl, iota, waz, itu, dok, ErrMsg: string): boolean; begin if cqrini.ReadBool('Callbook', 'QRZ', False) then - Result := GetQRZInfo(call, nick, qth, address, zip, grid, state, county, qsl, iota, waz, itu, ErrMsg) - else + Result := GetQRZInfo(call, nick, qth, address, zip, grid, state, county, qsl, iota, waz, itu, ErrMsg) ; + if cqrini.ReadBool('Callbook', 'QRZCQ', False) then + Result := GetQRZCQInfo(call, nick, qth, address, zip, grid, state, county, qsl, iota, waz, itu, dok, ErrMsg) ; + if cqrini.ReadBool('Callbook', 'HamQTH', False) then Result := GetHamQTHInfo(call, nick, qth, address, zip, grid, state, county, qsl, iota, waz, itu, dok, ErrMsg) end; @@ -3812,7 +3912,6 @@ begin end; end; - function TdmUtils.GetQRZSession(var ErrMsg: string): boolean; var http: THTTPSend; @@ -3822,8 +3921,8 @@ var kpos: word; begin Result := False; - if (cqrini.ReadString('CallBook', 'CBUser', '') = '') or - (cqrini.ReadString('CallBook', 'CBPass', '') = '') then + if (cqrini.ReadString('CallBook', 'CbQRZUser', '') = '') or + (cqrini.ReadString('CallBook', 'CbQRZPass', '') = '') then begin ErrMsg := 'Empty password or user name'; exit; @@ -3836,8 +3935,8 @@ begin http.UserName := cqrini.ReadString('Program', 'User', ''); http.Password := cqrini.ReadString('Program', 'Passwd', ''); req := 'https://xmldata.qrz.com/xml/1.34?username=' + cqrini.ReadString( - 'CallBook', 'CBUser', '') + ';password=' + cqrini.ReadString( - 'CallBook', 'CBPass', '') + ';agent=cqrlog'; + 'CallBook', 'CbQRZUser', '') + ';password=' + cqrini.ReadString( + 'CallBook', 'CbQRZPass', '') + ';agent=Cqrlog_'+uVersion.cVERSION; if not HTTP.HTTPMethod('GET', req) then ErrMsg := '(' + IntToStr(http.ResultCode) + '):' + http.ResultString else @@ -3867,16 +3966,23 @@ begin HTTP.Free end; end; - -function TdmUtils.GetHamQTHSession(var ErrMsg: string): boolean; +function TdmUtils.GetQRZCQSession(var ErrMsg: string): boolean; var http: THTTPSend; req: string = ''; m: TStringList; + epos: word; + kpos: word; begin + fQRZCQSession:= cqrini.ReadString('CallBook', 'CbQRZCQKey',''); + if fQRZCQSession<>'' then + Begin + Result:=true; + exit; + end; Result := False; - if (cqrini.ReadString('CallBook', 'CBUser', '') = '') or - (cqrini.ReadString('CallBook', 'CBPass', '') = '') then + if (cqrini.ReadString('CallBook', 'CbQRZCQUser', '') = '') or + (cqrini.ReadString('CallBook', 'CbQRZCQPass', '') = '') then begin ErrMsg := 'Empty password or user name'; exit; @@ -3888,8 +3994,62 @@ begin http.ProxyPort := cqrini.ReadString('Program', 'Port', ''); http.UserName := cqrini.ReadString('Program', 'User', ''); http.Password := cqrini.ReadString('Program', 'Passwd', ''); - req := 'http://www.hamqth.com/xml.php?u=' + cqrini.ReadString('CallBook', 'CBUser', '') + - '&p=' + EncodeURLData(cqrini.ReadString('CallBook', 'CBPass', '')) + '&prg=cqrlog'; + req := 'https://ssl.qrzcq.com/xml?username=' + cqrini.ReadString( + 'CallBook', 'CbQRZCQUser', '') + '&password=' + cqrini.ReadString( + 'CallBook', 'CbQRZCQPass', '') + '&agent=Cqrlog_'+uVersion.cVERSION; + if not HTTP.HTTPMethod('GET', req) then + ErrMsg := '(' + IntToStr(http.ResultCode) + '):' + http.ResultString + else + begin + m.LoadFromStream(http.Document); + if dmData.DebugLevel >= 1 then + Writeln(m.Text); + //I'd like to parse it as normal XML but it seems XML support in Freepascal + //2.4.0 is broken :-( + epos := Pos('<Error>', m.Text); + if epos > 0 then + ErrMsg := copy(m.Text, epos + 7, Pos('</Error>', m.Text) - epos - 7) + else + begin + kpos := Pos('<Key>', m.Text); + if kpos > 0 then + begin + fQRZCQSession := copy(m.Text, kpos + 5, Pos('</Key>', m.Text) - kpos - 5); + cqrini.WriteString('CallBook', 'CbQRZCQKey', fQRZCQSession); + Result := True; + end + else + ErrMsg := 'Tag "<Key>" not found!'; + end; + end + finally + m.Free; + HTTP.Free + end; +end; + +function TdmUtils.GetHamQTHSession(var ErrMsg: string): boolean; +var + http: THTTPSend; + req: string = ''; + m: TStringList; +begin + Result := False; + if (cqrini.ReadString('CallBook', 'CbHamQTHUser', '') = '') or + (cqrini.ReadString('CallBook', 'CbHamQTHPass', '') = '') then + begin + ErrMsg := 'Empty password or user name'; + exit; + end; + http := THTTPSend.Create; + m := TStringList.Create; + try + http.ProxyHost := cqrini.ReadString('Program', 'Proxy', ''); + http.ProxyPort := cqrini.ReadString('Program', 'Port', ''); + http.UserName := cqrini.ReadString('Program', 'User', ''); + http.Password := cqrini.ReadString('Program', 'Passwd', ''); + req := 'http://www.hamqth.com/xml.php?u=' + cqrini.ReadString('CallBook', 'CbHamQTHUser', '') + + '&p=' + EncodeURLData(cqrini.ReadString('CallBook', 'CbHamQTHPass', '')) + '&prg=Cqrlog_'+uVersion.cVERSION; //Writeln(req); if not HTTP.HTTPMethod('GET', req) then ErrMsg := '(' + IntToStr(http.ResultCode) + '):' + http.ResultString @@ -4013,7 +4173,6 @@ begin HTTP.Free end; end; - procedure TdmUtils.ShowHamQTHInBrowser(call: string); var AProcess: TProcess; @@ -4447,7 +4606,7 @@ begin end end; if (CmbText='') then - RigComboBox.ItemIndex := 0 + RigComboBox.ItemIndex := -1 else RigComboBox.Text := CmbText end; @@ -5038,5 +5197,198 @@ Begin if num=4 then CreaFile(dmData.HomeDir+C_MODEFILE_DIR+C_READMEMODE_FILE,R_file); end; +procedure TdmUtils.UpdateCallBookcnf; +var + c,p:string; + +Begin + c:= cqrini.ReadString('CallBook', 'CBUser', ''); +if c <> '' then + Begin //remove old definition + p:= cqrini.ReadString('CallBook', 'CBPass', ''); + if cqrini.ReadBool('Callbook', 'HamQTH', True) then + begin + cqrini.WriteString('CallBook', 'CbHamQTHUser', c); + cqrini.WriteString('CallBook', 'CbHamQTHPass', p); + end + else + begin + cqrini.WriteString('CallBook', 'CbQRZUser', c); + cqrini.WriteString('CallBook', 'CbQRZPass', p); + end; + cqrini.DeleteKey('CallBook', 'CBUser'); + cqrini.DeleteKey('CallBook', 'CBPass'); + end; +end; + +procedure TdmUtils.ClearStatGrid(g:TStringGrid); +var + i,y : Integer; +begin + for i:= 0 to g.ColCount-1 do + for y := 0 to g.RowCount-1 do + g.Cells[i,y] := ' '; + with g do + begin + Cells[0, 1] := 'SSB'; + Cells[0, 2] := 'CW'; + Cells[0, 3] := 'DIGI' + end; +end; + +procedure TdmUtils.AddBandsToStatGrid(g:TStringGrid); +var + i : Integer; +begin + g.ColCount := cMaxBandsCount; + + for i:=0 to cMaxBandsCount-1 do + begin + if dmUtils.MyBands[i][0]='' then + begin + g.ColCount := i+1; + break + end; + g.Cells[i+1,0] := dmUtils.MyBands[i][1]; + end; +end; + + +procedure TdmUtils.ShowStatistic(ref_adif,old_stat_adif:Word; g:TStringGrid; call:String=''); +var + i : Integer; + ShowLoTW : Boolean = False; + mode : String; + QSLR,LoTW,eQSL : String; + tmps,tmpq : String; + space: String; + +begin + tmpq:=''; + if call='' then + Begin + if old_stat_adif = ref_adif then + exit; + old_stat_adif := ref_adif; + end + else + begin + tmpq:=' and callsign='+QuotedStr(call); + end; + + g.ColCount := cMaxBandsCount; + + dmUtils.ClearStatGrid(g); + dmUtils.AddBandsToStatGrid(g); + + space := ' '; + if cqrini.ReadBool('Fonts','GridDotsInsteadSpaces',False) = True then + begin + space := '.'; + end; + + for i:=0 to cMaxBandsCount-1 do + begin + if dmUtils.MyBands[i][0]='' then + begin + g.ColCount := i+1; + break + end; + + g.Cells[i+1,1] := space+space+space; + g.Cells[i+1,2] := space+space+space; + g.Cells[i+1,3] := space+space+space; + end; + + if dmData.trQ.Active then + dmData.trQ.RollBack; + dmData.Q.Close; + + ShowLoTW := cqrini.ReadBool('LoTW','NewQSOLoTW',False); + if ShowLoTW then + dmData.Q.SQL.Text := 'select band,mode,qsl_r,lotw_qslr,eqsl_qsl_rcvd from cqrlog_main where adif='+ + IntToStr(ref_adif) + tmpq + ' and ((qsl_r='+QuotedStr('Q')+') or '+ + '(lotw_qslr = '+QuotedStr('L')+') or (eqsl_qsl_rcvd='+QuotedStr('E')+ + ')) group by band,mode,qsl_r,lotw_qslr,eqsl_qsl_rcvd' + else + dmData.Q.SQL.Text := 'select band,mode,qsl_r,lotw_qslr,eqsl_qsl_rcvd from cqrlog_main where adif='+ + IntToStr(ref_adif) + tmpq + ' and (qsl_r = '+QuotedStr('Q')+') '+ + 'group by band,mode,qsl_r,lotw_qslr,eqsl_qsl_rcvd'; + dmData.trQ.StartTransaction; + dmData.Q.Open; + while not dmData.Q.Eof do + begin + i := dmUtils.GetBandPos(dmData.Q.Fields[0].AsString)+1; + mode := dmData.Q.Fields[1].AsString; + QSLR := dmData.Q.Fields[2].AsString; + LoTW := dmData.Q.Fields[3].AsString; + eQSL := dmData.Q.Fields[4].AsString; + if i > 0 then + begin + if (Mode = 'SSB') or (Mode='FM') or (Mode='AM') then + begin + tmps := g.Cells[i,1] ; + if QSLR = 'Q' then + tmps[1] := 'Q'; + if (LoTW = 'L') then + tmps[2] := 'L'; + if (eQSL = 'E') then + tmps[3] := 'E'; + g.Cells[i,1] := tmps + end + else begin + if (Mode='CW') or (Mode='CWQ') then + begin + tmps := g.Cells[i,2] ; + if QSLR = 'Q' then + tmps[1] := 'Q'; + if (LoTW = 'L') then + tmps[2] := 'L'; + if (eQSL = 'E') then + tmps[3] := 'E'; + g.Cells[i,2] := tmps + end + else begin + tmps := g.Cells[i,3] ; + if QSLR = 'Q' then + tmps[1] := 'Q'; + if (LoTW = 'L') then + tmps[2] := 'L'; + if (eQSL = 'E') then + tmps[3] := 'E'; + g.Cells[i,3] := tmps + end + end; + end; + dmData.Q.Next + end; + dmData.trQ.Rollback; + + dmData.Q.Close; + if dmData.trQ.Active then + dmData.trQ.Rollback; + dmData.Q.SQL.Text := 'select band,mode from cqrlog_main where adif='+ + IntToStr(ref_adif) + tmpq +' group by band,mode'; + dmData.trQ.StartTransaction; + dmData.Q.Open; + while not dmData.Q.Eof do + begin + i := dmUtils.GetBandPos(dmData.Q.Fields[0].AsString)+1; + mode := dmData.Q.Fields[1].AsString; + if i > 0 then + begin + if ((mode = 'SSB') or (mode = 'FM') or (mode = 'AM')) then + if(g.Cells[i,1] = space+space+space) then g.Cells[i,1] := ' X '; + if ((mode = 'CW') or (mode = 'CWR')) then + if (g.Cells[i,2] = space+space+space) then g.Cells[i,2] := ' X '; + if ((mode <> 'SSB') and (mode <>'FM') and (mode <> 'AM') and (mode <> 'CW') and (mode <> 'CWR')) then + if (g.Cells[i,3] = space+space+space) then g.Cells[i,3] := ' X ' + end; + dmData.Q.Next; + end; + dmData.Q.Close; + dmData.trQ.Rollback +end; + end. diff --git a/src/fAddRadioMemory.lfm b/src/fAddRadioMemory.lfm index 3e50642..267ec40 100644 --- a/src/fAddRadioMemory.lfm +++ b/src/fAddRadioMemory.lfm @@ -8,9 +8,10 @@ object frmAddRadioMemory: TfrmAddRadioMemory ClientHeight = 222 ClientWidth = 308 OnCreate = FormCreate + OnKeyDown = FormKeyDown OnShow = FormShow Position = poOwnerFormCenter - LCLVersion = '2.0.0.4' + LCLVersion = '2.2.4.0' object lblFreq: TLabel AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner @@ -32,8 +33,9 @@ object frmAddRadioMemory: TfrmAddRadioMemory Top = 19 Width = 192 BorderSpacing.Left = 12 + OnKeyDown = FormKeyDown + OnKeyPress = edtFreqKeyPress TabOrder = 0 - Text = '0' end object lblMode: TLabel AnchorSideLeft.Control = Owner @@ -61,8 +63,8 @@ object frmAddRadioMemory: TfrmAddRadioMemory BorderSpacing.Left = 12 CharCase = ecUppercase ItemHeight = 0 + OnKeyDown = FormKeyDown TabOrder = 1 - Text = 'CMBMODE' end object lblWidth: TLabel AnchorSideLeft.Control = Owner @@ -86,8 +88,9 @@ object frmAddRadioMemory: TfrmAddRadioMemory Top = 125 Width = 112 BorderSpacing.Left = 12 + NumbersOnly = True + OnKeyDown = FormKeyDown TabOrder = 2 - Text = '0' end object Button1: TButton AnchorSideTop.Control = Owner @@ -144,6 +147,7 @@ object frmAddRadioMemory: TfrmAddRadioMemory Width = 284 BorderSpacing.Left = 12 MaxLength = 25 + OnKeyDown = FormKeyDown TabOrder = 3 end end diff --git a/src/fAddRadioMemory.pas b/src/fAddRadioMemory.pas index c53b8b2..c1d79dd 100644 --- a/src/fAddRadioMemory.pas +++ b/src/fAddRadioMemory.pas @@ -24,7 +24,9 @@ type lblWidth: TLabel; lblInfo: TLabel; procedure Button1Click(Sender: TObject); + procedure edtFreqKeyPress(Sender: TObject; var Key: char); procedure FormCreate(Sender : TObject); + procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormShow(Sender: TObject); private { private declarations } @@ -45,8 +47,7 @@ uses dUtils; procedure TfrmAddRadioMemory.FormShow(Sender: TObject); begin dmUtils.LoadFontSettings(frmAddRadioMemory); - - edtFreq.SetFocus + edtFreq.SetFocus; end; procedure TfrmAddRadioMemory.Button1Click(Sender: TObject); @@ -60,6 +61,13 @@ begin exit end; + if cmbMode.ItemIndex < 0 then + begin + Application.MessageBox('Please enter correct mode','Error...', mb_OK+mb_IconError); + cmbMode.SetFocus; + exit + end; + if not TryStrToFloat(edtWidth.Text,f) then begin Application.MessageBox('Please enter correct bandwidth','Error...', mb_OK+mb_IconError); @@ -70,6 +78,11 @@ begin ModalResult := mrOK end; +procedure TfrmAddRadioMemory.edtFreqKeyPress(Sender: TObject; var Key: char); +begin + if not (key in ['0'..'9','.']) then key:=#0; +end; + procedure TfrmAddRadioMemory.FormCreate(Sender : TObject); begin dmUtils.InsertModes(cmbMode); @@ -78,6 +91,13 @@ begin cmbMode.Items.Insert(2,'LSB') end; +procedure TfrmAddRadioMemory.FormKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); +begin + if key = VK_RETURN then Button1Click(nil); + if key = VK_ESCAPE then ModalResult:=mrCancel; +end; + initialization {$I fAddRadioMemory.lrs} diff --git a/src/fAdifImport.pas b/src/fAdifImport.pas index 4cdb3f7..4f26d50 100644 --- a/src/fAdifImport.pas +++ b/src/fAdifImport.pas @@ -904,6 +904,7 @@ begin lblCount.Caption :=''; lblErrors.Caption := ''; Do_Err_Import:=true; + lblComplete.Visible := False; end; procedure TfrmAdifImport.mnuDeleteClick(Sender: TObject); diff --git a/src/fBigSquareStat.lfm b/src/fBigSquareStat.lfm index 8d41c99..c31791f 100644 --- a/src/fBigSquareStat.lfm +++ b/src/fBigSquareStat.lfm @@ -1,87 +1,166 @@ object frmBigSquareStat: TfrmBigSquareStat - Left = 580 + Left = 283 Height = 590 - Top = 279 + Top = 53 Width = 655 Caption = 'Big square statistic' ClientHeight = 590 ClientWidth = 655 OnClose = FormClose OnShow = FormShow - LCLVersion = '1.2.2.0' + LCLVersion = '2.2.6.0' object Panel1: TPanel + AnchorSideLeft.Control = Owner + AnchorSideTop.Control = Owner + AnchorSideRight.Control = Owner Left = 0 - Height = 88 + Height = 80 Top = 0 Width = 655 Align = alTop BevelOuter = bvNone - ClientHeight = 88 + ClientHeight = 80 ClientWidth = 655 TabOrder = 0 object cmbBands: TComboBox - Left = 63 - Height = 31 - Top = 24 + AnchorSideLeft.Control = Label1 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = Panel1 + Left = 55 + Height = 33 + Top = 9 Width = 164 + BorderSpacing.Left = 6 + BorderSpacing.Top = 9 ItemHeight = 0 + OnChange = cmbBandsChange Style = csDropDownList TabOrder = 0 end object Label1: TLabel - Left = 16 + AnchorSideLeft.Control = Panel1 + AnchorSideTop.Control = cmbBands + AnchorSideTop.Side = asrCenter + Left = 12 Height = 17 - Top = 32 - Width = 38 + Top = 17 + Width = 37 + BorderSpacing.Left = 12 Caption = 'Band:' ParentColor = False end object GroupBox1: TGroupBox - Left = 240 - Height = 72 - Top = 11 - Width = 225 + AnchorSideLeft.Control = cmbBands + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = cmbBands + AnchorSideRight.Control = btnRefresh + Left = 231 + Height = 42 + Top = 9 + Width = 244 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Left = 12 + BorderSpacing.Right = 12 Caption = ' Confirmed ' - ClientHeight = 53 - ClientWidth = 221 + ClientHeight = 24 + ClientWidth = 242 TabOrder = 1 object chkQSL: TCheckBox - Left = 6 - Height = 24 - Top = 3 - Width = 53 + AnchorSideLeft.Control = GroupBox1 + AnchorSideTop.Control = GroupBox1 + AnchorSideTop.Side = asrCenter + Left = 5 + Height = 23 + Top = 1 + Width = 51 + BorderSpacing.Left = 5 Caption = 'QSL' + OnChange = cmbBandsChange TabOrder = 0 end object chkLoTW: TCheckBox - Left = 70 - Height = 24 - Top = 3 - Width = 65 + AnchorSideLeft.Control = GroupBox1 + AnchorSideLeft.Side = asrCenter + AnchorSideTop.Control = GroupBox1 + AnchorSideTop.Side = asrCenter + Left = 90 + Height = 23 + Top = 1 + Width = 62 Caption = 'LoTW' + OnChange = cmbBandsChange TabOrder = 1 end object chkeQSL: TCheckBox - Left = 149 - Height = 24 - Top = 3 - Width = 61 + AnchorSideTop.Control = GroupBox1 + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = GroupBox1 + AnchorSideRight.Side = asrBottom + Left = 177 + Height = 23 + Top = 1 + Width = 59 + Anchors = [akTop, akRight] + BorderSpacing.Right = 6 Caption = 'eQSL' + OnChange = cmbBandsChange TabOrder = 2 end end object btnRefresh: TButton - Left = 496 - Height = 25 - Top = 28 - Width = 128 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox1 + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = Panel1 + AnchorSideRight.Side = asrBottom + Left = 487 + Height = 33 + Top = 14 + Width = 156 Anchors = [akTop, akRight] + BorderSpacing.Right = 12 Caption = 'Refresh statistic' OnClick = btnRefreshClick TabOrder = 2 end + object pbTot: TProgressBar + AnchorSideLeft.Control = cmbBands + AnchorSideTop.Control = cmbBands + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = cmbBands + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Side = asrBottom + Left = 55 + Height = 10 + Top = 54 + Width = 161 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 12 + BorderSpacing.Right = 3 + TabOrder = 3 + end + object lblFIlterActive: TLabel + AnchorSideLeft.Control = GroupBox1 + AnchorSideLeft.Side = asrCenter + AnchorSideTop.Control = GroupBox1 + AnchorSideTop.Side = asrBottom + Left = 305 + Height = 17 + Top = 57 + Width = 96 + BorderSpacing.Top = 6 + Caption = 'Filter is active!' + Font.Color = clRed + ParentColor = False + ParentFont = False + Visible = False + end end object Panel2: TPanel + AnchorSideLeft.Control = Owner + AnchorSideRight.Control = Owner + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = Owner Left = 0 Height = 34 Top = 556 @@ -92,33 +171,50 @@ object frmBigSquareStat: TfrmBigSquareStat ClientWidth = 655 TabOrder = 1 object btnClose: TButton - Left = 569 - Height = 25 - Top = 6 - Width = 75 + AnchorSideTop.Control = Panel2 + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = Panel2 + AnchorSideRight.Side = asrBottom + Left = 553 + Height = 33 + Top = 1 + Width = 90 Anchors = [akTop, akRight] + BorderSpacing.Right = 12 Cancel = True Caption = 'Close' ModalResult = 2 TabOrder = 0 end object btnSaveTo: TButton - Left = 480 - Height = 25 - Top = 6 - Width = 75 + AnchorSideTop.Control = Panel2 + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = btnClose + Left = 451 + Height = 33 + Top = 1 + Width = 90 Anchors = [akTop, akRight] + BorderSpacing.Right = 12 Caption = 'Save to ...' OnClick = btnSaveToClick TabOrder = 1 end end object IpHtmlPanel1: TIpHtmlPanel + AnchorSideLeft.Control = Panel1 + AnchorSideTop.Control = Panel1 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = Panel1 + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = Panel2 Left = 0 - Height = 468 - Top = 88 + Height = 476 + Top = 80 Width = 655 Align = alClient + BorderWidth = 1 + BorderStyle = bsSingle DataProvider = IpFileDataProvider1 FixedTypeface = 'Courier New' DefaultTypeFace = 'Sans' @@ -128,17 +224,29 @@ object frmBigSquareStat: TfrmBigSquareStat PrintSettings.MarginTop = 0.5 PrintSettings.MarginRight = 0.5 PrintSettings.MarginBottom = 0.5 + PrintSettings.Preview.Left = 320 + PrintSettings.Preview.Top = 200 + PrintSettings.Preview.Width = 960 + PrintSettings.Preview.Height = 600 TabOrder = 2 VLinkColor = clBlue end object IpFileDataProvider1: TIpFileDataProvider - left = 160 - top = 512 + Left = 160 + Top = 512 end object dlgSave: TSaveDialog DefaultExt = '.html' Filter = 'HTML files|*.html' - left = 64 - top = 512 + Left = 64 + Top = 512 + end + object tmrBlink: TTimer + Enabled = False + OnTimer = tmrBlinkTimer + OnStartTimer = tmrBlinkStartTimer + OnStopTimer = tmrBlinkStopTimer + Left = 248 + Top = 512 end end diff --git a/src/fBigSquareStat.pas b/src/fBigSquareStat.pas index b96b09f..2e40458 100644 --- a/src/fBigSquareStat.pas +++ b/src/fBigSquareStat.pas @@ -5,9 +5,9 @@ unit fBigSquareStat; interface uses - Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, - Dialogs, ExtCtrls, StdCtrls, Grids, IpHtml, Ipfilebroker, db, BufDataset, - LazFileUtils; + Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, + ExtCtrls, StdCtrls, Grids, ComCtrls, IpHtml, Ipfilebroker, db, BufDataset, + LazFileUtils, dateutils; type @@ -25,13 +25,20 @@ type IpFileDataProvider1: TIpFileDataProvider; IpHtmlPanel1: TIpHtmlPanel; Label1: TLabel; + lblFIlterActive: TLabel; Panel1: TPanel; Panel2: TPanel; dlgSave: TSaveDialog; + pbTot: TProgressBar; + tmrBlink: TTimer; procedure btnRefreshClick(Sender: TObject); procedure btnSaveToClick(Sender: TObject); + procedure cmbBandsChange(Sender: TObject); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormShow(Sender: TObject); + procedure tmrBlinkStartTimer(Sender: TObject); + procedure tmrBlinkStopTimer(Sender: TObject); + procedure tmrBlinkTimer(Sender: TObject); private TmpFile : String; f : TextFile; @@ -61,60 +68,26 @@ begin DeleteFileUTF8(ExtractFileNameWithoutExt(TmpFile)+'.html') end; -{ dbfBand.FilePathFull := fHomeDir; - dbfBand.TableName := 'bandmap.dat'; - if not FileExists(fHomeDir+'bandmap.dat') then - begin - dbfBand.TableLevel := 7; - dbfBand.Exclusive := True; - dbfBand.FieldDefs.Clear; - With dbfBand.FieldDefs do begin - Add('vfo_a', ftFloat); - Add('Call', ftString, 20); - Add('vfo_b', ftFloat); - Add('split',ftBoolean); - Add('color',ftLargeint); - Add('mode',ftString,8); - Add('band',ftString,6); - Add('time',ftDateTime); - Add('age', ftString,1); - Add('pfx',ftString,10); - Add('lat',ftString,10); - Add('long',ftString,10); - Add('id', ftAutoInc) - end; - dbfBand.CreateTable; - dbfBand.Open; - dbfBand.AddIndex('id','id', [ixPrimary, ixUnique]); - dbfBand.AddIndex('vfo_a','vfo_a', []); - dbfBand.Close; - dbfBand.Exclusive := false; - dbfBand.Open -} - procedure TfrmBigSquareStat.btnRefreshClick(Sender: TObject); var tmp : String = ''; + bnd : String = ''; grb : String = ''; - wkd : Word = 0; - cfm : Word = 0; + allwkd : longint = 0; + thiswkd : longint =0; + allwkdBig : longint = 0; + TotPos : longint = 0; + wkd : integer = 0; + cfm : integer = 0; ll : String = ''; - sum_wkd : Word = 0; - sum_cfm : Word = 0; + sum_wkd : integer = 0; + sum_cfm : integer = 0; db : TBufDataset; + TableName : String; begin - //db := TBufDataset.Create(nil); + tmrBlink.Enabled:=False; + TableName:='cqrlog_main'; try - //db.Fields.Clear; - //with db.FieldDefs do - //begin - // Add('loc', ftString, 4); - // Add('cfm',ftBoolean) - //end; - //db.CreateDataset; - //db.IndexDefs.Add('loc','loc',[ixPrimary]); - //db.Open; - dmData.Q.Close; dmData.Q1.Close; if dmData.trQ.Active then dmData.trQ.Rollback; @@ -136,24 +109,68 @@ begin end; tmp := copy(tmp,1,Length(tmp)-2); //remove "or" + if cmbBands.Text='ALL' then + bnd:=' ' + else + bnd:= ' and band='+QuotedStr(cmbBands.Text); + dmData.trQ.StartTransaction; dmData.trQ1.StartTransaction; try - dmData.Q.SQL.Text := 'select upper(left(loc,2)) as ll FROM cqrlog_main where loc <> '+QuotedStr('')+ - ' and band='+QuotedStr(cmbBands.Text)+' group by ll'; + if dmData.IsFilter then + begin + try + TableName:='statistic_filter'; + dmData.Q.Close; + dmData.Q.SQL.Text:='DROP VIEW IF EXISTS '+TableName; + dmData.Q.ExecSQL; + dmData.trQ.Commit; + dmData.Q.Close; + dmData.Q.SQL.Text:='CREATE VIEW '+TableName+' AS '+dmData.IsFilterSQL; + dmData.Q.ExecSQL; + dmData.trQ.Commit; + dmData.Q.Close; + except + on E : EDatabaseError do + Begin + ShowMessage('Can not create filter view!'); + Exit; + end; + end; + end; + dmData.Q.SQL.Text := 'select left(loc,2) as ll FROM '+TableName+' where loc <> '+QuotedStr('')+' group by ll'; dmData.Q.Open; + dmData.Q.Last; + allwkdBig:=dmData.Q.RecordCount; + dmData.Q.Close; + + dmData.Q.SQL.Text := 'select left(loc,4) as ll FROM '+TableName+' where loc <> '+QuotedStr('')+' group by ll'; + dmData.Q.Open; + dmData.Q.Last; + allwkd:=dmData.Q.RecordCount; + dmData.Q.Close; + + dmData.Q.SQL.Text := 'select upper(left(loc,2)) as ll FROM '+TableName+' where loc <> '+QuotedStr('')+ + bnd+' group by ll'; + dmData.Q.Open; + dmData.Q.Last; WriteHMTLHeader; writeln(f,'<table>'); + pbTot.Max:=dmData.Q.RecordCount; + thiswkd:= dmData.Q.RecordCount; + dmData.Q.First; while not dmData.Q.Eof do begin + inc(TotPos); + pbTot.Position:=TotPos; + Application.ProcessMessages; ll := dmData.Q.Fields[0].AsString; writeln(f,'<tr>'+LineEnding+'<td valign="middle">'+LineEnding+'<font color="black"><b>'+ll+'</b></font>'+LineEnding+'</td>'); writeln(f,'<td align="left">'); writeln(f,'<font color="black">'); dmData.Q1.Close; - dmData.Q1.SQL.Text := 'select upper(left(loc,4)) as lll FROM cqrlog_main where loc like '+ - QuotedStr(ll+'%')+' and band = '+QuotedStr(cmbBands.Text)+ - ' group by lll order by loc'; + dmData.Q1.SQL.Text := 'select upper(left(loc,4)) as lll FROM '+TableName+' where loc like '+ + QuotedStr(ll+'%')+bnd+' group by lll order by loc'; dmData.Q1.Open; db := TBufDataset.Create(nil); //I was not able to clear all records from TBufDataset without this workaround @@ -179,9 +196,8 @@ begin if tmp <> '' then begin dmData.Q1.Close; - dmData.Q1.SQL.Text := 'select upper(left(loc,4)) as lll FROM cqrlog_main where loc like '+ - QuotedStr(ll+'%')+' and band = '+QuotedStr(cmbBands.Text)+ - 'and ('+tmp+') group by lll order by loc'; + dmData.Q1.SQL.Text := 'select upper(left(loc,4)) as lll FROM '+TableName+' where loc like '+ + QuotedStr(ll+'%')+bnd+'and ('+tmp+') group by lll order by loc'; dmData.Q1.Open; cfm := 0; while not dmData.Q1.Eof do @@ -237,11 +253,26 @@ begin Writeln(f,'<hr>'); Writeln(f,'<font color="black">'+LineEnding+'<b>Total:</b><br>'); Writeln(f,'Worked:',sum_wkd,'<br>'); - Writeln(f,'Confirmed:',sum_cfm); + Writeln(f,'Confirmed:',sum_cfm,'<br>'); + Writeln(f,'<b>Different squares:</b><br>'); + if cmbBands.Text<>'ALL' then Writeln(f,'On this band:',thiswkd,'<br>'); + Writeln(f,'On all bands:',allwkdBig,'/',allwkd); Writeln(f,'</font>'); Writeln(f,'</body>'); Writeln(f,'</html>'); - CloseFile(f) + CloseFile(f); + + if dmData.IsFilter then + begin + try + dmData.Q.Close; + dmData.Q.SQL.Text:='DROP VIEW IF EXISTS '+TableName; + dmData.Q.ExecSQL; + dmData.trQ.Commit; + Finally + end; + end; + finally dmData.trQ.Rollback; dmData.trQ1.Rollback @@ -263,6 +294,12 @@ begin end end; +procedure TfrmBigSquareStat.cmbBandsChange(Sender: TObject); +begin + tmrBlink.Enabled:=True; + pbTot.Position:=0; +end; + procedure TfrmBigSquareStat.WriteHMTLHeader; begin AssignFile(f,TmpFile); @@ -286,6 +323,7 @@ begin TmpFile := GetTempFileNameUTF8(dmData.HomeDir,'square'); dmUtils.LoadForm(frmBigSquareStat); dmUtils.FillBandCombo(cmbBands); + cmbBands.Items.Insert(0,'ALL'); if cqrini.ReadInteger('SquareStat','Band',0) > cmbBands.Items.Count-1 then cmbBands.ItemIndex := 0 else @@ -297,7 +335,49 @@ begin dlgSave.InitialDir := cqrini.ReadString('SquareStat','Directory',dmData.UsrHomeDir); IpHtmlPanel1.Font.Color := clBlack; - btnRefresh.Click + pbTot.Min:=0; + pbTot.Max:=1; + pbTot.Smooth:=True; + pbTot.Step:=1; + pbTot.Enabled:=True; + pbTot.Position:=0; + tmrBlink.Enabled:=False; + lblFilterActive.Visible:= dmData.IsFilter; + cmbBandsChange(nil); +end; + +procedure TfrmBigSquareStat.tmrBlinkStartTimer(Sender: TObject); +begin + btnRefresh.Caption:='Press to'; + btnRefresh.Font.Color:=clGreen; + btnRefresh.Repaint; +end; + +procedure TfrmBigSquareStat.tmrBlinkStopTimer(Sender: TObject); +begin + btnRefresh.Caption:='Refresh statistic'; + btnRefresh.Font.Color:=clDefault; + btnRefresh.Repaint; +end; + +procedure TfrmBigSquareStat.tmrBlinkTimer(Sender: TObject); +var + C :Tcolor; + t:String; +begin + case odd(SecondOf(Now)) of + True: Begin + C := clGreen; + T :='run statistic' + end; + False: Begin + C := clGreen; + T :='Press to' + end; + end; + btnRefresh.Caption:= T; + btnRefresh.Font.Color:=C; + btnRefresh.Repaint; end; end. diff --git a/src/fCWType.pas b/src/fCWType.pas index 27fa705..922727c 100644 --- a/src/fCWType.pas +++ b/src/fCWType.pas @@ -91,7 +91,7 @@ implementation {$R *.lfm} { TfrmCWType } -uses fNewQSO,dUtils,dData, uMyIni; +uses fTRXControl,fNewQSO,dUtils,dData, uMyIni, fContest; function TfrmCWType.PassedKey(key:char):boolean; Begin @@ -140,6 +140,7 @@ procedure TfrmCWType.btnF1MouseEnter(Sender: TObject); begin frmCWType.lblToShowMouseOverText.Caption:=dmUtils.GetCWMessage('F1',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''); end; @@ -154,6 +155,7 @@ begin if Assigned(frmNewQSO.CWint) and (frmNewQSO.cmbMode.Text='CW') then frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F2',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'')) else ShowMessage('Radio: Not in CW mode!'+LineEnding+'or'+LineEnding+'CW interface: No keyer defined! '); end; @@ -162,6 +164,7 @@ procedure TfrmCWType.btnF10MouseEnter(Sender: TObject); begin frmCWType.lblToShowMouseOverText.Caption:=dmUtils.GetCWMessage('F10',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''); end; @@ -171,6 +174,7 @@ begin if Assigned(frmNewQSO.CWint) and (frmNewQSO.cmbMode.Text='CW') then frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F10',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'')) else ShowMessage('Radio: Not in CW mode!'+LineEnding+'or'+LineEnding+'CW interface: No keyer defined! '); end; @@ -184,9 +188,17 @@ procedure TfrmCWType.btnF1Click(Sender: TObject); begin m.SetFocus; //after click focus back to memo if Assigned(frmNewQSO.CWint) and (frmNewQSO.cmbMode.Text='CW') then - frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F1',frmNewQSO.edtCall.Text, + begin + frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F1',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, - frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'')) + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, + frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'')); + if frmContest.Showing then //set the "lastCqFreq" @contest window + Begin + frmContest.lblCqMode.Caption:=frmTRXControl.GetRawMode; + frmContest.lblCqFreq.Caption := FormatFloat('0.00',frmTRXControl.GetFreqkHz); + end; + end else ShowMessage('Radio: Not in CW mode!'+LineEnding+'or'+LineEnding+'CW interface: No keyer defined! '); end; @@ -194,6 +206,7 @@ procedure TfrmCWType.btnF2MouseEnter(Sender: TObject); begin frmCWType.lblToShowMouseOverText.Caption:=dmUtils.GetCWMessage('F2',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''); end; @@ -208,6 +221,7 @@ begin if Assigned(frmNewQSO.CWint) and (frmNewQSO.cmbMode.Text='CW') then frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F3',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'')) else ShowMessage('Radio: Not in CW mode!'+LineEnding+'or'+LineEnding+'CW interface: No keyer defined! '); end; @@ -216,6 +230,7 @@ procedure TfrmCWType.btnF3MouseEnter(Sender: TObject); begin frmCWType.lblToShowMouseOverText.Caption:=dmUtils.GetCWMessage('F3',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''); end; @@ -230,6 +245,7 @@ begin if Assigned(frmNewQSO.CWint) and (frmNewQSO.cmbMode.Text='CW') then frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F4',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'')) else ShowMessage('Radio: Not in CW mode!'+LineEnding+'or'+LineEnding+'CW interface: No keyer defined! '); end; @@ -238,6 +254,7 @@ procedure TfrmCWType.btnF4MouseEnter(Sender: TObject); begin frmCWType.lblToShowMouseOverText.Caption:=dmUtils.GetCWMessage('F4',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''); end; @@ -252,6 +269,7 @@ begin if Assigned(frmNewQSO.CWint) and (frmNewQSO.cmbMode.Text='CW') then frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F5',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'')) else ShowMessage('Radio: Not in CW mode!'+LineEnding+'or'+LineEnding+'CW interface: No keyer defined! '); end; @@ -260,6 +278,7 @@ procedure TfrmCWType.btnF5MouseEnter(Sender: TObject); begin frmCWType.lblToShowMouseOverText.Caption:=dmUtils.GetCWMessage('F5',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''); end; @@ -274,6 +293,7 @@ begin if Assigned(frmNewQSO.CWint) and (frmNewQSO.cmbMode.Text='CW') then frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F6',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'')) else ShowMessage('Radio: Not in CW mode!'+LineEnding+'or'+LineEnding+'CW interface: No keyer defined! '); end; @@ -282,6 +302,7 @@ procedure TfrmCWType.btnF6MouseEnter(Sender: TObject); begin frmCWType.lblToShowMouseOverText.Caption:=dmUtils.GetCWMessage('F6',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''); end; @@ -296,6 +317,7 @@ begin if Assigned(frmNewQSO.CWint) and (frmNewQSO.cmbMode.Text='CW') then frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F7',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'')) else ShowMessage('Radio: Not in CW mode!'+LineEnding+'or'+LineEnding+'CW interface: No keyer defined! '); end; @@ -304,6 +326,7 @@ procedure TfrmCWType.btnF7MouseEnter(Sender: TObject); begin frmCWType.lblToShowMouseOverText.Caption:=dmUtils.GetCWMessage('F7',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''); end; @@ -318,6 +341,7 @@ begin if Assigned(frmNewQSO.CWint) and (frmNewQSO.cmbMode.Text='CW') then frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F8',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'')) else ShowMessage('Radio: Not in CW mode!'+LineEnding+'or'+LineEnding+'CW interface: No keyer defined! '); end; @@ -326,6 +350,7 @@ procedure TfrmCWType.btnF8MouseEnter(Sender: TObject); begin frmCWType.lblToShowMouseOverText.Caption:=dmUtils.GetCWMessage('F8',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''); end; @@ -340,6 +365,7 @@ begin if Assigned(frmNewQSO.CWint) and (frmNewQSO.cmbMode.Text='CW') then frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F9',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'')) else ShowMessage('Radio: Not in CW mode!'+LineEnding+'or'+LineEnding+'CW interface: No keyer defined! '); end; @@ -348,6 +374,7 @@ procedure TfrmCWType.btnF9MouseEnter(Sender: TObject); begin frmCWType.lblToShowMouseOverText.Caption:=dmUtils.GetCWMessage('F9',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''); end; @@ -392,6 +419,8 @@ begin end; procedure TfrmCWType.FormShow(Sender: TObject); +var + n:string; begin dmUtils.LoadWindowPos(frmCWType); rgMode.ItemIndex := cqrini.ReadInteger('CW','Mode',1); @@ -400,6 +429,15 @@ begin m.Clear; Switch2Word :=false; WasMemoLen := length(m.lines.text); + n:=IntToStr(frmTRXControl.cmbRig.ItemIndex); + if (cqrini.ReadInteger('CW'+n,'Type',0)=1) and cqrini.ReadBool('CW'+n,'PotSpeed',False) then + Begin + frmNewQSO.sbNewQSO.Panels[4].Text := 'Pot WPM'; + edtSpeed.Enabled:=False; + end + else + edtSpeed.Enabled:=True; + //set debug rules for this form LocalDbg := dmData.DebugLevel >= 1 ; if dmData.DebugLevel < 0 then @@ -412,9 +450,18 @@ begin end; procedure TfrmCWType.edtSpeedChange(Sender: TObject); +var + n:string; begin + if Assigned(frmNewQSO.CWint) then + begin + n:=IntToStr(frmTRXControl.cmbRig.ItemIndex); frmNewQSO.CWint.SetSpeed(edtSpeed.Value); - frmNewQSO.sbNewQSO.Panels[4].Text := IntToStr(edtSpeed.Value)+'WPM'; + if (cqrini.ReadInteger('CW'+n,'Type',0)=1) and cqrini.ReadBool('CW'+n,'PotSpeed',False) then + frmNewQSO.sbNewQSO.Panels[4].Text := 'Pot WPM' + else + frmNewQSO.sbNewQSO.Panels[4].Text := IntToStr(edtSpeed.Value)+'WPM'; + end; end; procedure TfrmCWType.fraCWKeys1Resize(Sender: TObject); var @@ -556,12 +603,17 @@ end; procedure TfrmCWType.SetSpeed(change:integer); var speed : Integer = 0; -Begin + n : string; +begin if Assigned(frmNewQSO.CWint) then begin + n:=IntToStr(frmTRXControl.cmbRig.ItemIndex); speed := frmNewQSO.CWint.GetSpeed+change; frmNewQSO.CWint.SetSpeed(speed); - frmNewQSO.sbNewQSO.Panels[4].Text := IntToStr(speed)+'WPM'; + if (cqrini.ReadInteger('CW'+n,'Type',0)=1) and cqrini.ReadBool('CW'+n,'PotSpeed',False) then + frmNewQSO.sbNewQSO.Panels[4].Text := 'Pot WPM' + else + frmNewQSO.sbNewQSO.Panels[4].Text := IntToStr(speed)+'WPM'; edtSpeed.Value := speed; end; end; diff --git a/src/fCabrilloExport.lfm b/src/fCabrilloExport.lfm index 36233f6..abd1630 100644 --- a/src/fCabrilloExport.lfm +++ b/src/fCabrilloExport.lfm @@ -11,12 +11,12 @@ object frmCabrilloExport: TfrmCabrilloExport OnClose = FormClose OnCreate = FormCreate OnShow = FormShow - LCLVersion = '2.0.12.0' + LCLVersion = '2.2.4.0' object lblCabfileName: TLabel AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner Left = 6 - Height = 15 + Height = 17 Top = 6 Width = 126 BorderSpacing.Left = 6 @@ -29,9 +29,9 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideTop.Control = lblCabfileName AnchorSideTop.Side = asrBottom Left = 6 - Height = 33 + Height = 34 Hint = 'Write export file name and path or press Browse' - Top = 33 + Top = 35 Width = 421 BorderSpacing.Top = 12 TabOrder = 0 @@ -44,7 +44,7 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideRight.Side = asrBottom Left = 435 Height = 25 - Top = 37 + Top = 40 Width = 75 Anchors = [akTop, akRight] BorderSpacing.Right = 6 @@ -66,7 +66,7 @@ object frmCabrilloExport: TfrmCabrilloExport Cancel = True Caption = 'Close' ModalResult = 2 - TabOrder = 14 + TabOrder = 15 end object btnCabExport: TButton AnchorSideTop.Control = pbCabExport @@ -80,7 +80,7 @@ object frmCabrilloExport: TfrmCabrilloExport BorderSpacing.Right = 6 Caption = 'Export' OnClick = btnCabExportClick - TabOrder = 12 + TabOrder = 13 end object pbCabExport: TProgressBar AnchorSideLeft.Control = lblCabfileName @@ -93,8 +93,7 @@ object frmCabrilloExport: TfrmCabrilloExport Anchors = [akLeft, akBottom] BorderSpacing.Bottom = 21 Step = 1 - TabOrder = 13 - TabStop = True + TabOrder = 17 end object lblCabDone: TLabel AnchorSideLeft.Control = pbCabExport @@ -102,8 +101,8 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideTop.Control = pbCabExport AnchorSideTop.Side = asrCenter Left = 282 - Height = 15 - Top = 649 + Height = 17 + Top = 648 Width = 34 BorderSpacing.Left = 12 Caption = 'Done' @@ -115,8 +114,8 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideTop.Control = cmbCabContestName AnchorSideTop.Side = asrCenter Left = 6 - Height = 15 - Top = 75 + Height = 17 + Top = 78 Width = 95 BorderSpacing.Top = 6 Caption = 'Contest name:' @@ -126,23 +125,23 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideLeft.Control = lblCabfileName AnchorSideBottom.Control = pbCabExport Left = 6 - Height = 15 - Top = 619 + Height = 17 + Top = 617 Width = 94 Anchors = [akLeft, akBottom] BorderSpacing.Bottom = 12 Caption = 'Error message' ParentColor = False - OnClick = lblCabErrorClick Visible = False + OnClick = lblCabErrorClick end object lblCabPower: TLabel AnchorSideLeft.Control = lblCabfileName AnchorSideTop.Control = cmbCabPower AnchorSideTop.Side = asrCenter Left = 6 - Height = 15 - Top = 106 + Height = 17 + Top = 109 Width = 44 Caption = 'Power:' ParentColor = False @@ -154,7 +153,7 @@ object frmCabrilloExport: TfrmCabrilloExport Left = 123 Height = 29 Hint = 'Select category-power' - Top = 99 + Top = 103 Width = 100 ItemHeight = 0 Items.Strings = ( @@ -163,15 +162,15 @@ object frmCabrilloExport: TfrmCabrilloExport 'QRP' ) Style = csDropDownList - TabOrder = 3 + TabOrder = 4 end object lblCabLocation: TLabel AnchorSideLeft.Control = lblCabfileName AnchorSideTop.Control = edtCabLocation AnchorSideTop.Side = asrCenter Left = 6 - Height = 15 - Top = 137 + Height = 17 + Top = 141 Width = 59 Caption = 'Location:' ParentColor = False @@ -181,8 +180,8 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideTop.Control = gbCabQsoTail AnchorSideTop.Side = asrBottom Left = 6 - Height = 15 - Top = 529 + Height = 17 + Top = 544 Width = 76 BorderSpacing.Top = 15 Caption = 'Statistics:' @@ -196,9 +195,9 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideRight.Control = edtCabFileName AnchorSideRight.Side = asrBottom Left = 123 - Height = 33 + Height = 34 Hint = 'Select or type contest name' - Top = 66 + Top = 69 Width = 304 Anchors = [akTop, akRight] AutoComplete = True @@ -267,14 +266,14 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideRight.Side = asrBottom Left = 6 Height = 80 - Top = 286 + Top = 292 Width = 504 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 Caption = 'info sent' ClientHeight = 62 ClientWidth = 502 - TabOrder = 7 + TabOrder = 8 object chkCabInfoSrst: TCheckBox AnchorSideLeft.Control = gbCabInfoSent AnchorSideTop.Control = gbCabInfoSent @@ -283,9 +282,8 @@ object frmCabrilloExport: TfrmCabrilloExport Height = 23 Hint = 'Include RST, normally YES' Top = 20 - Width = 78 + Width = 23 BorderSpacing.Left = 12 - Caption = 'inc. RST' Checked = True ParentShowHint = False ShowHint = True @@ -293,31 +291,31 @@ object frmCabrilloExport: TfrmCabrilloExport TabOrder = 0 end object cmbCabInfoSEx1: TComboBox - AnchorSideLeft.Control = chkCabInfoSrst + AnchorSideLeft.Control = edtCabInfoSrstWdt AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblCabSEx1Cmb AnchorSideTop.Side = asrBottom - Left = 96 - Height = 32 + Left = 100 + Height = 33 Hint = 'Exhange1 selection' - Top = 21 + Top = 23 Width = 100 - BorderSpacing.Left = 6 + BorderSpacing.Left = 21 BorderSpacing.Top = 6 ItemHeight = 0 ParentShowHint = False ShowHint = True Style = csDropDownList - TabOrder = 1 + TabOrder = 2 end object edtCabInfoSEx1Wdt: TEdit AnchorSideLeft.Control = cmbCabInfoSEx1 AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = cmbCabInfoSEx1 - Left = 202 - Height = 33 + Left = 206 + Height = 34 Hint = 'Width of stx field ' - Top = 21 + Top = 23 Width = 38 BorderSpacing.Left = 6 MaxLength = 2 @@ -325,7 +323,7 @@ object frmCabrilloExport: TfrmCabrilloExport OnExit = edtCabInfoSEx1WdtExit ParentShowHint = False ShowHint = True - TabOrder = 2 + TabOrder = 3 Text = '6' end object cmbCabInfoSEx2: TComboBox @@ -335,7 +333,7 @@ object frmCabrilloExport: TfrmCabrilloExport Left = 318 Height = 29 Hint = 'Exhange2 selection' - Top = 21 + Top = 23 Width = 100 Anchors = [akTop, akRight] BorderSpacing.Right = 6 @@ -348,16 +346,16 @@ object frmCabrilloExport: TfrmCabrilloExport ParentShowHint = False ShowHint = True Style = csDropDownList - TabOrder = 3 + TabOrder = 4 end object edtCabInfoSEx2Wdt: TEdit AnchorSideTop.Control = cmbCabInfoSEx1 AnchorSideRight.Control = gbCabInfoSent AnchorSideRight.Side = asrBottom Left = 424 - Height = 33 + Height = 34 Hint = 'Width of stx_string field ' - Top = 21 + Top = 23 Width = 38 Anchors = [akTop, akRight] BorderSpacing.Right = 40 @@ -366,14 +364,14 @@ object frmCabrilloExport: TfrmCabrilloExport OnExit = edtCabInfoSEx2WdtExit ParentShowHint = False ShowHint = True - TabOrder = 4 + TabOrder = 5 Text = '6' end object lblCabSEx1Cmb: TLabel AnchorSideLeft.Control = cmbCabInfoSEx1 AnchorSideTop.Control = gbCabInfoSent - Left = 96 - Height = 15 + Left = 100 + Height = 17 Top = 0 Width = 143 Caption = 'Exchange1 and width ' @@ -383,12 +381,40 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideLeft.Control = cmbCabInfoSEx2 AnchorSideTop.Control = gbCabInfoSent Left = 318 - Height = 15 + Height = 17 Top = 0 Width = 143 Caption = 'Exchange2 and width ' ParentColor = False end + object edtCabInfoSrstWdt: TEdit + AnchorSideLeft.Control = chkCabInfoSrst + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = cmbCabInfoSEx1 + Left = 41 + Height = 34 + Hint = 'Width of stx field ' + Top = 23 + Width = 38 + BorderSpacing.Left = 6 + MaxLength = 2 + NumbersOnly = True + OnExit = edtCabInfoSrstWdtExit + ParentShowHint = False + ShowHint = True + TabOrder = 1 + Text = '3' + end + object lblCabInfoSrst: TLabel + AnchorSideLeft.Control = chkCabInfoSrst + AnchorSideTop.Control = lblCabSEx1Cmb + Left = 12 + Height = 17 + Top = 0 + Width = 65 + Caption = 'RST width' + ParentColor = False + end end object gbCabInfoRcvd: TGroupBox AnchorSideLeft.Control = lblCabfileName @@ -398,14 +424,14 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideRight.Side = asrBottom Left = 6 Height = 80 - Top = 372 + Top = 378 Width = 504 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 Caption = 'info rcvd' ClientHeight = 62 ClientWidth = 502 - TabOrder = 8 + TabOrder = 9 object chkCabInfoRrst: TCheckBox AnchorSideLeft.Control = gbCabInfoRcvd AnchorSideTop.Control = gbCabInfoRcvd @@ -414,9 +440,8 @@ object frmCabrilloExport: TfrmCabrilloExport Height = 23 Hint = 'Include RST, normally YES' Top = 20 - Width = 78 + Width = 23 BorderSpacing.Left = 12 - Caption = 'inc. RST' Checked = True ParentShowHint = False ShowHint = True @@ -424,16 +449,16 @@ object frmCabrilloExport: TfrmCabrilloExport TabOrder = 0 end object cmbCabInfoREx1: TComboBox - AnchorSideLeft.Control = chkCabInfoRrst + AnchorSideLeft.Control = edtCabInfoRrstWdt AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblCabSrxCmb AnchorSideTop.Side = asrBottom - Left = 96 + Left = 100 Height = 29 Hint = 'Exhange1 selection' - Top = 21 + Top = 23 Width = 100 - BorderSpacing.Left = 6 + BorderSpacing.Left = 21 BorderSpacing.Top = 6 ItemHeight = 0 Items.Strings = ( @@ -444,25 +469,7 @@ object frmCabrilloExport: TfrmCabrilloExport ParentShowHint = False ShowHint = True Style = csDropDownList - TabOrder = 1 - end - object edtCabInfoREx1Wdt: TEdit - AnchorSideLeft.Control = cmbCabInfoREx1 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = cmbCabInfoREx1 - Left = 202 - Height = 33 - Hint = 'Width of stx field ' - Top = 21 - Width = 38 - BorderSpacing.Left = 6 - MaxLength = 2 - NumbersOnly = True - OnExit = edtCabInfoREx1WdtExit - ParentShowHint = False - ShowHint = True TabOrder = 2 - Text = '6' end object cmbCabInfoREx2: TComboBox AnchorSideLeft.Side = asrBottom @@ -471,7 +478,7 @@ object frmCabrilloExport: TfrmCabrilloExport Left = 318 Height = 29 Hint = 'Exhange2 selection' - Top = 21 + Top = 23 Width = 100 Anchors = [akTop, akRight] BorderSpacing.Right = 6 @@ -484,16 +491,16 @@ object frmCabrilloExport: TfrmCabrilloExport ParentShowHint = False ShowHint = True Style = csDropDownList - TabOrder = 3 + TabOrder = 4 end object edtCabInfoREx2Wdt: TEdit AnchorSideTop.Control = cmbCabInfoREx1 AnchorSideRight.Control = gbCabInfoRcvd AnchorSideRight.Side = asrBottom Left = 424 - Height = 33 + Height = 34 Hint = 'Width of stx_string field ' - Top = 21 + Top = 23 Width = 38 Anchors = [akTop, akRight] BorderSpacing.Right = 40 @@ -502,14 +509,14 @@ object frmCabrilloExport: TfrmCabrilloExport OnExit = edtCabInfoREx2WdtExit ParentShowHint = False ShowHint = True - TabOrder = 4 + TabOrder = 5 Text = '6' end object lblCabSrxCmb: TLabel AnchorSideLeft.Control = cmbCabInfoREx1 AnchorSideTop.Control = gbCabInfoRcvd - Left = 96 - Height = 15 + Left = 100 + Height = 17 Top = 0 Width = 143 Caption = 'Exchange1 and width ' @@ -519,12 +526,58 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideLeft.Control = cmbCabInfoREx2 AnchorSideTop.Control = gbCabInfoRcvd Left = 318 - Height = 15 + Height = 17 Top = 0 Width = 143 Caption = 'Exchange2 and width ' ParentColor = False end + object edtCabInfoREx1Wdt: TEdit + AnchorSideLeft.Control = cmbCabInfoREx1 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = cmbCabInfoREx1 + Left = 206 + Height = 34 + Hint = 'Width of stx field ' + Top = 23 + Width = 38 + BorderSpacing.Left = 6 + MaxLength = 2 + NumbersOnly = True + OnExit = edtCabInfoREx1WdtExit + ParentShowHint = False + ShowHint = True + TabOrder = 3 + Text = '6' + end + object edtCabInfoRrstWdt: TEdit + AnchorSideLeft.Control = chkCabInfoRrst + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = cmbCabInfoREx1 + Left = 41 + Height = 34 + Hint = 'Width of rst field ' + Top = 23 + Width = 38 + BorderSpacing.Left = 6 + MaxLength = 2 + NumbersOnly = True + OnExit = edtCabInfoRrstWdtExit + ParentShowHint = False + ShowHint = True + TabOrder = 1 + Text = '3' + end + object lblCabInfoRrst: TLabel + AnchorSideLeft.Control = chkCabInfoRrst + AnchorSideTop.Control = lblCabSrxCmb + Left = 12 + Height = 17 + Top = 0 + Width = 65 + Caption = 'RST width' + ParentColor = False + end end object gbCabQsoHeader: TGroupBox AnchorSideLeft.Control = lblCabfileName @@ -534,20 +587,20 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideRight.Side = asrBottom Left = 6 Height = 80 - Top = 200 + Top = 206 Width = 504 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 Caption = 'QSO: common header' ClientHeight = 62 ClientWidth = 502 - TabOrder = 6 + TabOrder = 7 object lblCabQsoHeader: TLabel AnchorSideLeft.Control = gbCabQsoHeader AnchorSideTop.Control = edtCabCallWdt AnchorSideTop.Side = asrCenter Left = 6 - Height = 15 + Height = 17 Top = 9 Width = 280 BorderSpacing.Left = 6 @@ -559,7 +612,7 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideRight.Control = gbCabQsoHeader AnchorSideRight.Side = asrBottom Left = 458 - Height = 33 + Height = 34 Hint = 'Width of sent and rcvd callsign field' Top = 0 Width = 38 @@ -578,7 +631,7 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideTop.Side = asrCenter AnchorSideRight.Control = edtCabCallWdt Left = 373 - Height = 15 + Height = 17 Top = 9 Width = 82 Anchors = [akTop, akRight] @@ -594,7 +647,7 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideTop.Side = asrBottom Left = 6 Height = 23 - Top = 28 + Top = 30 Width = 277 BorderSpacing.Top = 4 Caption = 'Use UpCase letters for all QSO records' @@ -610,20 +663,20 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideRight.Side = asrBottom Left = 6 Height = 65 - Top = 458 + Top = 464 Width = 194 BorderSpacing.Top = 6 Caption = 'QSO: tail' ClientHeight = 47 ClientWidth = 192 - TabOrder = 9 + TabOrder = 10 object lblCabQsoTail: TLabel AnchorSideTop.Control = gbCabQsoTail AnchorSideTop.Side = asrCenter AnchorSideRight.Control = cmbCabTailTxCount Left = 20 - Height = 15 - Top = 16 + Height = 17 + Top = 15 Width = 54 Anchors = [akTop, akRight] BorderSpacing.Right = 6 @@ -663,19 +716,19 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideRight.Control = cmbCabContestName AnchorSideRight.Side = asrBottom Left = 123 - Height = 33 - Top = 128 + Height = 34 + Top = 132 Width = 304 Anchors = [akTop, akLeft, akRight] - TabOrder = 4 + TabOrder = 5 end object lblCabSoapBox: TLabel AnchorSideLeft.Control = lblCabfileName AnchorSideTop.Control = edtCabSoapBox AnchorSideTop.Side = asrCenter Left = 6 - Height = 15 - Top = 170 + Height = 17 + Top = 175 Width = 61 Caption = 'SoapBox:' ParentColor = False @@ -687,11 +740,11 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideRight.Control = cmbCabContestName AnchorSideRight.Side = asrBottom Left = 123 - Height = 33 - Top = 161 + Height = 34 + Top = 166 Width = 304 Anchors = [akTop, akLeft, akRight] - TabOrder = 5 + TabOrder = 6 end object gbCabLayout: TGroupBox AnchorSideLeft.Side = asrBottom @@ -701,7 +754,7 @@ object frmCabrilloExport: TfrmCabrilloExport Left = 336 Height = 65 Hint = 'Save(/Load) all settings to file' - Top = 458 + Top = 464 Width = 174 Anchors = [akTop, akRight] BorderSpacing.Left = 6 @@ -710,7 +763,7 @@ object frmCabrilloExport: TfrmCabrilloExport ClientWidth = 172 ParentShowHint = False ShowHint = True - TabOrder = 11 + TabOrder = 12 object btCabSave: TButton AnchorSideLeft.Control = gbCabLayout AnchorSideTop.Control = gbCabLayout @@ -748,7 +801,7 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideRight.Control = gbCabLayout Left = 206 Height = 65 - Top = 458 + Top = 464 Width = 124 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 6 @@ -756,16 +809,16 @@ object frmCabrilloExport: TfrmCabrilloExport ClientHeight = 47 ClientWidth = 122 ParentShowHint = False - TabOrder = 10 + TabOrder = 11 object edtCabCountC: TEdit AnchorSideLeft.Control = gbCabCoCount AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = gbCabCoCount AnchorSideTop.Side = asrCenter Left = 26 - Height = 33 + Height = 34 Hint = 'Type prefix for qsos to count' - Top = 7 + Top = 6 Width = 70 CharCase = ecUppercase OnExit = edtCabCountCExit @@ -782,15 +835,16 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = lblCabError Left = 6 - Height = 63 - Top = 550 + Height = 44 + Top = 567 Width = 504 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Top = 6 BorderSpacing.Bottom = 6 ReadOnly = True ScrollBars = ssAutoBoth - TabOrder = 15 + TabOrder = 16 + TabStop = False Visible = False end object btnCabFrmFlt: TButton @@ -801,40 +855,40 @@ object frmCabrilloExport: TfrmCabrilloExport AnchorSideRight.Side = asrBottom Left = 435 Height = 25 - Top = 70 + Top = 74 Width = 75 Anchors = [akTop, akRight] BorderSpacing.Right = 6 Caption = 'Frm Flt' OnClick = btnCabFrmFltClick - TabOrder = 16 + TabOrder = 3 end object btnResultFile: TButton AnchorSideRight.Control = btnCabClose AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = mCabStatistics - Left = 364 + Left = 354 Height = 25 - Top = 528 + Top = 536 Width = 156 Anchors = [akRight, akBottom] BorderSpacing.Bottom = 2 Caption = 'Open exported file' OnClick = btnResultFileClick - TabOrder = 17 + TabOrder = 14 end object dlgCabSave: TSaveDialog Title = 'Save with file name' DefaultExt = '.cbr' Filter = 'Cabrillo file|*.cbr' - left = 448 - top = 112 + Left = 448 + Top = 112 end object dlgCabOpen: TOpenDialog Title = 'Open file' DefaultExt = '.templ' Filter = 'Cabrillo template|*.templ' - left = 448 - top = 160 + Left = 448 + Top = 160 end end diff --git a/src/fCabrilloExport.pas b/src/fCabrilloExport.pas index eb2cd64..b98b6ac 100644 --- a/src/fCabrilloExport.pas +++ b/src/fCabrilloExport.pas @@ -45,12 +45,14 @@ type dlgCabSave: TSaveDialog; edtCabCountC: TEdit; edtCabCallWdt: TEdit; + edtCabInfoREx1Wdt: TEdit; + edtCabInfoRrstWdt: TEdit; + edtCabInfoSrstWdt: TEdit; edtCabLocation: TEdit; edtCabInfoREx2Wdt: TEdit; edtCabInfoSEx1Wdt: TEdit; edtCabInfoSEx2Wdt: TEdit; edtCabFileName: TEdit; - edtCabInfoREx1Wdt: TEdit; edtCabSoapBox: TEdit; gbCabInfoRcvd: TGroupBox; gbCabInfoSent: TGroupBox; @@ -58,6 +60,8 @@ type gbCabQsoTail: TGroupBox; gbCabLayout: TGroupBox; gbCabCoCount: TGroupBox; + lblCabInfoRrst: TLabel; + lblCabInfoSrst: TLabel; lblCabQsoHeader1: TLabel; lblCabSoapBox: TLabel; lblCabQsoHeader: TLabel; @@ -88,9 +92,11 @@ type procedure edtCabCallWdtExit(Sender: TObject); procedure edtCabInfoREx2WdtExit(Sender: TObject); procedure edtCabInfoREx1WdtExit(Sender: TObject); + procedure edtCabInfoRrstWdtExit(Sender: TObject); procedure edtCabInfoSEx2WdtExit(Sender: TObject); procedure edtCabInfoSEx1WdtExit(Sender: TObject); procedure edtCabCountCExit(Sender: TObject); + procedure edtCabInfoSrstWdtExit(Sender: TObject); procedure FormClose(Sender : TObject; var CloseAction : TCloseAction); procedure FormCreate(Sender: TObject); procedure FormShow(Sender : TObject); @@ -136,12 +142,14 @@ begin edtCabCallWdt.Text:= cqrini.ReadString('CabrilloExport','CallsWidth', '13'); chkCabInfoSrst.Checked:= cqrini.ReadBool('CabrilloExport','incRSTs',True); + edtCabInfoSrstWdt.Text := cqrini.ReadString('CabrilloExport','SRSTWidth', '3'); cmbCabInfoSEx1.ItemIndex:= cqrini.ReadInteger('CabrilloExport','StxOrder',0); edtCabInfoSEx1Wdt.Text:= cqrini.ReadString('CabrilloExport','StxWidth','6'); cmbCabInfoSEx2.ItemIndex := cqrini.ReadInteger('CabrilloExport','StxStringOrder',0); edtCabInfoSEx2Wdt.Text := cqrini.ReadString('CabrilloExport','StxStringWidth', '6'); chkCabInfoRrst.Checked:= cqrini.ReadBool('CabrilloExport','incRSTr',True); + edtCabInfoRrstWdt.Text := cqrini.ReadString('CabrilloExport','RRSTWidth', '3'); cmbCabInfoREx1.ItemIndex:= cqrini.ReadInteger('CabrilloExport','SrxOrder',0); edtCabInfoREx1Wdt.Text:= cqrini.ReadString('CabrilloExport','SrxWidth','6'); cmbCabInfoREx2.ItemIndex := cqrini.ReadInteger('CabrilloExport','SrxStringOrder',0); @@ -189,12 +197,14 @@ begin cqrini.WriteString('CabrilloExport','CallsWidth', edtCabCallWdt.Text); cqrini.WriteBool('CabrilloExport','incRSTs',chkCabInfoSrst.Checked); + cqrini.WriteString('CabrilloExport','SRSTWidth', edtCabInfoSrstWdt.Text); cqrini.WriteInteger('CabrilloExport','StxOrder',cmbCabInfoSEx1.ItemIndex); cqrini.WriteString('CabrilloExport','StxWidth', edtCabInfoSEx1Wdt.Text); cqrini.WriteInteger('CabrilloExport','StxStringOrder',cmbCabInfoSEx2.ItemIndex); cqrini.WriteString('CabrilloExport','StxStringWidth', edtCabInfoSEx2Wdt.Text); cqrini.WriteBool('CabrilloExport','incRSTr',chkCabInfoRrst.Checked); + cqrini.WriteString('CabrilloExport','RRSTWidth', edtCabInfoRrstWdt.Text); cqrini.WriteInteger('CabrilloExport','SrxOrder',cmbCabInfoREx1.ItemIndex); cqrini.WriteString('CabrilloExport','SrxWidth', edtCabInfoREx1Wdt.Text); cqrini.WriteInteger('CabrilloExport','SrxStringOrder',cmbCabInfoREx2.ItemIndex); @@ -291,6 +301,7 @@ end; procedure TfrmCabrilloExport.btnCabBrowseClick(Sender : TObject); begin dlgCabSave.InitialDir:=dmData.UsrHomeDir; + dlgCabSave.DefaultExt:='.cbr'; if dlgCabSave.Execute then edtCabFileName.Text := dlgCabSave.FileName end; @@ -391,6 +402,11 @@ Begin end end; +procedure TfrmCabrilloExport.edtCabInfoSrstWdtExit(Sender: TObject); +begin + edtCabInfoSrstWdt.Text:=NonZero(edtCabInfoSrstWdt.Text); +end; + procedure TfrmCabrilloExport.edtCabInfoSEx2WdtExit(Sender: TObject); begin edtCabInfoSEx2Wdt.Text:=NonZero(edtCabInfoSEx2Wdt.Text); @@ -400,6 +416,12 @@ procedure TfrmCabrilloExport.edtCabInfoREx1WdtExit(Sender: TObject); begin edtCabInfoREx1Wdt.Text:=NonZero(edtCabInfoREx1Wdt.Text); end; + +procedure TfrmCabrilloExport.edtCabInfoRrstWdtExit(Sender: TObject); +begin + edtCabInfoRrstWdt.Text:=NonZero(edtCabInfoRrstWdt.Text); +end; + procedure TfrmCabrilloExport.edtCabInfoREx2WdtExit(Sender: TObject); begin edtCabInfoREx2Wdt.Text:=NonZero(edtCabInfoREx2Wdt.Text); @@ -520,16 +542,17 @@ begin try try AssignFile(r,'/tmp/CabrilloReject.log'); Rewrite(r); - pbCabExport.Max := dmData.qCQRLOG.RecordCount; dmData.qCQRLOG.Last; + pbCabExport.Max := dmData.qCQRLOG.RecordCount; + while not dmData.qCQRLOG.bof do begin tmp:=''; // Check for missing mandatory fields if (dmData.qCQRLOG.FieldByName('qsodate').AsString = '') then tmp:=tmp+'Missing qsodate, '; - if (dmData.qCQRLOG.FieldByName('time_on').AsString = '') then - tmp:=tmp+'Missing time_on, '; + if (dmData.qCQRLOG.FieldByName('time_off').AsString = '') then + tmp:=tmp+'Missing time_off, '; if (dmData.qCQRLOG.FieldByName('callsign').AsString = '') then tmp:=tmp+'Missing callsign, '; if (CabrilloBandToFreq(dmData.qCQRLOG.FieldByName('band').AsString) = '') then @@ -617,46 +640,46 @@ begin tmp:=tmp + CabrilloMode(dmData.qCQRLOG.FieldByName('mode').AsString)+' '+ dmData.qCQRLOG.FieldByName('qsodate').AsString+' '+ - StringReplace(dmData.qCQRLOG.FieldByName('time_on').AsString,':','',[rfReplaceAll, rfIgnoreCase])+' '+ - Format('%-'+edtCabCallWdt.Text+'.'+edtCabCallWdt.Text+'s', [mycall]); + StringReplace(dmData.qCQRLOG.FieldByName('time_off').AsString,':','',[rfReplaceAll, rfIgnoreCase])+' '+ + Format('%0:-'+edtCabCallWdt.Text+'s', [mycall]); //end of common header - if chkCabInfoSrst.Checked then tmp:=tmp+' '+ Format('%-3s', [dmData.qCQRLOG.FieldByName('rst_s').AsString]); + if chkCabInfoSrst.Checked then tmp:=tmp+' '+ Format('%0:-'+edtCabInfoSrstWdt.Text+'s', [dmData.qCQRLOG.FieldByName('rst_s').AsString]); if (cmbCabInfoSEx1.ItemIndex > 0) then Begin if (cmbCabInfoSEx1.Text = 'my_name') then - tmp:=tmp+' '+Format('%-'+edtCabInfoSEx1Wdt.Text+'.'+edtCabInfoSEx1Wdt.Text+'s', [myname]) + tmp:=tmp+' '+Format('%0:-'+edtCabInfoSEx1Wdt.Text+'s', [myname]) else - tmp:=tmp+' '+Format('%-'+edtCabInfoSEx1Wdt.Text+'.'+edtCabInfoSEx1Wdt.Text+'s',[dmData.qCQRLOG.FieldByName( + tmp:=tmp+' '+Format('%0:-'+edtCabInfoSEx1Wdt.Text+'s',[dmData.qCQRLOG.FieldByName( cmbCabInfoSEx1.Text).AsString]) ; end; if (cmbCabInfoSEx2.ItemIndex > 0) then Begin if (cmbCabInfoSEx2.Text = 'my_name') then - tmp:=tmp+' '+Format('%-'+edtCabInfoSEx2Wdt.Text+'.'+edtCabInfoSEx2Wdt.Text+'s', [myname]) + tmp:=tmp+' '+Format('%0:-'+edtCabInfoSEx2Wdt.Text+'s', [myname]) else - tmp:=tmp+' '+Format('%-'+edtCabInfoSEx2Wdt.Text+'.'+edtCabInfoSEx2Wdt.Text+'s',[dmData.qCQRLOG.FieldByName( + tmp:=tmp+' '+Format('%0:-'+edtCabInfoSEx2Wdt.Text+'s',[dmData.qCQRLOG.FieldByName( cmbCabInfoSEx2.Text).AsString]) ; end; //end of info sent tmp:=tmp+' '+ call; - if chkCabInfoRrst.Checked then tmp:=tmp+' '+ Format('%-3s', [dmData.qCQRLOG.FieldByName('rst_r').AsString]); + if chkCabInfoRrst.Checked then tmp:=tmp+' '+ Format('%0:-'+edtCabInfoRrstWdt.Text+'s', [dmData.qCQRLOG.FieldByName('rst_r').AsString]); if (cmbCabInfoREx1.ItemIndex > 0) then Begin - tmp:=tmp+' '+Format('%-'+edtCabInfoREx1Wdt.Text+'.'+edtCabInfoREx1Wdt.Text+'s',[dmData.qCQRLOG.FieldByName( + tmp:=tmp+' '+Format('%0:-'+edtCabInfoREx1Wdt.Text+'s',[dmData.qCQRLOG.FieldByName( cmbCabInfoREx1.Text).AsString]) ; end; if (cmbCabInfoREx2.ItemIndex > 0) then Begin - tmp:=tmp+' '+Format('%-'+edtCabInfoREx2Wdt.Text+'.'+edtCabInfoREx2Wdt.Text+'s',[dmData.qCQRLOG.FieldByName( + tmp:=tmp+' '+Format('%0:-'+edtCabInfoREx2Wdt.Text+'s',[dmData.qCQRLOG.FieldByName( cmbCabInfoREx2.Text).AsString]) ; end; //end of info rcvd - if (cmbCabTailTxCount.Text<>'') then tmp:=tmp+' '+Format('%1s',[ cmbCabTailTxCount.Text]); + if (cmbCabTailTxCount.Text<>'') then tmp:=tmp+' '+Format('%0:1s',[ cmbCabTailTxCount.Text]); if chkUpCase.Checked then tmp:=UpperCase(tmp); @@ -800,7 +823,11 @@ end; procedure TfrmCabrilloExport.btCabLoadClick(Sender: TObject); begin dlgCabOpen.InitialDir := dmData.HomeDir; - if dlgCabOpen.Execute then loadCabLay(dlgCabOpen.FileName); + if dlgCabOpen.Execute then + if FileExists(dlgCabOpen.FileName) then //with QT5 opendialog user can enter filename that may not exist + loadCabLay(dlgCabOpen.FileName) + else + ShowMessage('File not found!'); end; procedure TfrmCabrilloExport.saveCabLay(filename:String); var @@ -816,12 +843,14 @@ begin filini.WriteString('CabrilloExport','CallsWidth', edtCabCallWdt.Text); filini.WriteBool('CabrilloExport','incRSTs',chkCabInfoSrst.Checked); + filini.WriteString('CabrilloExport','SRSTWidth', edtCabInfoSrstWdt.Text); filini.WriteInteger('CabrilloExport','StxOrder',cmbCabInfoSEx1.ItemIndex); filini.WriteString('CabrilloExport','StxWidth', edtCabInfoSEx1Wdt.Text); filini.WriteInteger('CabrilloExport','StxStringOrder',cmbCabInfoSEx2.ItemIndex); filini.WriteString('CabrilloExport','StxStringWidth', edtCabInfoSEx2Wdt.Text); filini.WriteBool('CabrilloExport','incRSTr',chkCabInfoRrst.Checked); + filini.WriteString('CabrilloExport','RRSTWidth', edtCabInfoRrstWdt.Text); filini.WriteInteger('CabrilloExport','SrxOrder',cmbCabInfoREx1.ItemIndex); filini.WriteString('CabrilloExport','SrxWidth', edtCabInfoREx1Wdt.Text); filini.WriteInteger('CabrilloExport','SrxStringOrder',cmbCabInfoREx2.ItemIndex); @@ -854,12 +883,14 @@ var edtCabCallWdt.Text:= filini.ReadString('CabrilloExport','CallsWidth', '13'); chkCabInfoSrst.Checked:= filini.ReadBool('CabrilloExport','incRSTs',True); + edtCabInfoSrstWdt.Text := filini.ReadString('CabrilloExport','SRSTWidth', '3'); cmbCabInfoSEx1.ItemIndex:= filini.ReadInteger('CabrilloExport','StxOrder',0); edtCabInfoSEx1Wdt.Text:= filini.ReadString('CabrilloExport','StxWidth','6'); cmbCabInfoSEx2.ItemIndex := filini.ReadInteger('CabrilloExport','StxStringOrder',0); edtCabInfoSEx2Wdt.Text := filini.ReadString('CabrilloExport','StxStringWidth', '6'); chkCabInfoRrst.Checked:= filini.ReadBool('CabrilloExport','incRSTr',True); + edtCabInfoRrstWdt.Text := filini.ReadString('CabrilloExport','RRSTWidth', '3'); cmbCabInfoREx1.ItemIndex:= filini.ReadInteger('CabrilloExport','SrxOrder',0); edtCabInfoREx1Wdt.Text:= filini.ReadString('CabrilloExport','SrxWidth','6'); cmbCabInfoREx2.ItemIndex := filini.ReadInteger('CabrilloExport','SrxStringOrder',0); diff --git a/src/fChangeFreq.lfm b/src/fChangeFreq.lfm index d2332ea..8bc0930 100644 --- a/src/fChangeFreq.lfm +++ b/src/fChangeFreq.lfm @@ -42,7 +42,7 @@ object frmChangeFreq: TfrmChangeFreq Height = 17 Top = 72 Width = 32 - Caption = 'RTTY' + Caption = 'DATA' ParentColor = False end object Label5: TLabel @@ -77,7 +77,7 @@ object frmChangeFreq: TfrmChangeFreq OnKeyPress = ChkKeyPress TabOrder = 2 end - object edtRTTY: TEdit + object edtData: TEdit Left = 168 Height = 34 Top = 89 diff --git a/src/fChangeFreq.pas b/src/fChangeFreq.pas index f540d51..5ff6230 100644 --- a/src/fChangeFreq.pas +++ b/src/fChangeFreq.pas @@ -17,7 +17,7 @@ type btnCancel: TButton; edtRXOffset : TEdit; edtCW: TEdit; - edtRTTY: TEdit; + edtData: TEdit; edtEnd: TEdit; edtBegin: TEdit; edtTXOffset : TEdit; @@ -70,10 +70,10 @@ begin exit end; - if NOT TryStrToCurr(edtRTTY.Text,f) then + if NOT TryStrToCurr(edtData.Text,f) then begin Application.MessageBox('You must enter correct frequency!','Error',mb_OK+mb_IconError); - edtRTTY.SetFocus; + edtData.SetFocus; exit end; diff --git a/src/fConfigStorage.pas b/src/fConfigStorage.pas index 31846da..4c4e6c1 100644 --- a/src/fConfigStorage.pas +++ b/src/fConfigStorage.pas @@ -118,7 +118,7 @@ begin cmbStoreZipCode.ItemIndex := SectionExists('ZipCode',Sections); cmbStoreLoTW.ItemIndex := SectionExists('LoTW',Sections); - cmbStoreCWInterface.ItemIndex := SectionExists('CW',Sections); + cmbStoreCWInterface.ItemIndex := SectionExists('CW1',Sections); cmbStoreFldigiInterface.ItemIndex := SectionExists('fldigi',Sections); cmbStoreAutoBackup.ItemIndex := SectionExists('Backup',Sections); cmbStoreExtViewers.ItemIndex := SectionExists('ExtView',Sections); @@ -146,11 +146,11 @@ begin if cmbStoreVisColumns.ItemIndex>0 then Sections := Sections + 'Columns,'; if cmbStoreTRXControl.ItemIndex>0 then - Sections := Sections + 'TRX,TRX1,TRX2,'; + Sections := Sections + 'TRX,TRX1,TRX2,TRX3,TRX4,TRX5,TRX6,'; if cmbStoreRotorControl.ItemIndex>0 then Sections := Sections + 'ROT,ROT1,ROT2,'; - if cmbStoreModes.ItemIndex>=0 then - Sections := Sections + 'Band1,Band2,Modes,'; + if cmbStoreModes.ItemIndex>0 then + Sections := Sections + 'Band1,Band2,Band3,Band4,Band5,Band6,Modes,'; if cmbStoreExport.ItemIndex>0 then Sections := Sections + 'Export,'; if cmbStoreCluster.ItemIndex>0 then @@ -168,7 +168,7 @@ begin if cmbStoreLoTW.ItemIndex>0 then Sections := Sections + 'LoTW,'; if cmbStoreCWInterface.ItemIndex>0 then - Sections := Sections + 'CW,'; + Sections := Sections + 'CW,CW1,CW2,CW3,CW4,CW5,CW6'; if cmbStoreFldigiInterface.ItemIndex>0 then Sections := Sections + 'fldigi,wsjt,n1mm'; if cmbStoreAutoBackup.ItemIndex>0 then @@ -182,7 +182,7 @@ begin if cmbStoreOnlineLog.ItemIndex>0 then Sections := Sections + 'OnlineLog,'; if cmbStoreWindowSize.ItemIndex>0 then - Sections := Sections + 'WindowSize, Window,Grayline,'; + Sections := Sections + 'WindowSize,Window,Grayline,'; if cmbStoreColumnSize.ItemIndex>0 then Sections := Sections + 'ColumnSize,'; cqrini.WriteString('ConfigStorage','Items',Sections); diff --git a/src/fContest.lfm b/src/fContest.lfm index 664145c..0a56c99 100644 --- a/src/fContest.lfm +++ b/src/fContest.lfm @@ -1,26 +1,26 @@ object frmContest: TfrmContest - Left = 370 - Height = 178 - Top = 281 - Width = 706 + Left = 378 + Height = 367 + Top = 156 + Width = 685 HelpType = htKeyword HelpKeyword = 'help/contest.html' Caption = 'Contest' - ClientHeight = 178 - ClientWidth = 706 + ClientHeight = 367 + ClientWidth = 685 OnClose = FormClose OnCreate = FormCreate OnHide = FormHide OnKeyDown = FormKeyDown OnShow = FormShow - LCLVersion = '2.0.12.0' + LCLVersion = '2.2.6.0' object edtCall: TEdit AnchorSideLeft.Control = lblContestName AnchorSideTop.Control = lblCall AnchorSideTop.Side = asrBottom - Left = 17 + Left = 6 Height = 34 - Top = 59 + Top = 124 Width = 140 AutoSelect = False CharCase = ecUppercase @@ -29,28 +29,28 @@ object frmContest: TfrmContest OnExit = edtCallExit OnKeyDown = edtCallKeyDown OnKeyPress = edtCallKeyPress - TabOrder = 0 + TabOrder = 1 end object edtRSTs: TEdit AnchorSideLeft.Control = edtCall AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtCall - Left = 157 + Left = 146 Height = 34 - Top = 59 + Top = 124 Width = 50 MaxLength = 20 OnKeyDown = edtCallKeyDown - TabOrder = 7 + TabOrder = 8 end object edtSTX: TEdit AnchorSideLeft.Control = edtRSTs AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtRSTs - Left = 207 + Left = 196 Height = 34 - Hint = 'contest serial number sent, max 6 characters' - Top = 59 + Hint = 'Contest serial number sent, max 6 characters' + Top = 124 Width = 50 MaxLength = 6 OnExit = edtSTXExit @@ -58,16 +58,16 @@ object frmContest: TfrmContest OnKeyPress = edtSTXKeyPress ParentShowHint = False ShowHint = True - TabOrder = 8 + TabOrder = 15 end object edtSTXStr: TEdit AnchorSideLeft.Control = edtSTX AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtSTX - Left = 257 + Left = 246 Height = 34 - Hint = 'contest exchange message sent, max 50 characters' - Top = 59 + Hint = 'Contest exchange message sent, max 50 characters' + Top = 124 Width = 100 MaxLength = 50 OnEnter = edtSTXStrEnter @@ -75,122 +75,131 @@ object frmContest: TfrmContest OnKeyDown = edtCallKeyDown ParentShowHint = False ShowHint = True - TabOrder = 13 + TabOrder = 14 end object edtRSTr: TEdit AnchorSideLeft.Control = edtSTXStr AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtSTXStr - Left = 373 + Left = 362 Height = 34 - Top = 59 + Top = 124 Width = 50 BorderSpacing.Left = 16 MaxLength = 20 + OnEnter = edtRSTrEnter OnKeyDown = edtCallKeyDown - TabOrder = 1 + TabOrder = 2 end object edtSRX: TEdit AnchorSideLeft.Control = edtRSTr AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtRSTr - Left = 423 + Left = 412 Height = 34 - Hint = 'contest serial number received, max 6 characters' - Top = 59 + Hint = 'Contest serial number received, max 6 characters' + Top = 124 Width = 50 MaxLength = 6 + OnChange = edtSRXChange + OnEnter = edtRSTrEnter OnExit = edtSRXExit OnKeyDown = edtCallKeyDown OnKeyPress = edtSTXKeyPress ParentShowHint = False ShowHint = True - TabOrder = 2 + TabOrder = 3 end object btSave: TButton AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblMSGr AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom - Left = 609 + Left = 588 Height = 30 - Top = 42 + Top = 107 Width = 80 Anchors = [akTop, akRight] BorderSpacing.Right = 17 Caption = 'Save QSO' OnClick = btSaveClick - TabOrder = 4 + TabOrder = 5 end object edtSRXStr: TEdit AnchorSideLeft.Control = edtSRX AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtRSTr - Left = 473 + Left = 462 Height = 34 - Hint = 'contest exchange message sent, max 50 characters' - Top = 59 + Hint = 'Contest exchange message sent, max 50 characters' + Top = 124 Width = 100 MaxLength = 50 OnChange = edtSRXStrChange + OnEnter = edtRSTrEnter OnKeyDown = edtCallKeyDown ParentShowHint = False ShowHint = True - TabOrder = 3 + TabOrder = 4 end object lblCall: TLabel AnchorSideLeft.Control = lblContestName - AnchorSideTop.Control = chkTabAll + AnchorSideTop.Control = CQpanel AnchorSideTop.Side = asrBottom - Left = 17 + Left = 6 Height = 17 - Top = 42 + Top = 107 Width = 25 - BorderSpacing.Top = 1 + BorderSpacing.Top = 3 Caption = 'Call' ParentColor = False end object lblRSTs: TLabel + AnchorSideLeft.Control = edtRSTs AnchorSideTop.Control = lblCall - Left = 161 + Left = 146 Height = 17 - Top = 42 + Top = 107 Width = 36 Caption = 'RST s' ParentColor = False end object lblMSGs: TLabel + AnchorSideLeft.Control = edtSTXStr AnchorSideTop.Control = lblNRs - Left = 257 + Left = 246 Height = 17 - Top = 42 + Top = 107 Width = 41 Caption = 'MSG s' ParentColor = False end object lblRSTr: TLabel + AnchorSideLeft.Control = edtRSTr AnchorSideTop.Control = lblMSGs - Left = 377 + Left = 362 Height = 17 - Top = 42 + Top = 107 Width = 34 Caption = 'RST r' ParentColor = False end object lblNRr: TLabel + AnchorSideLeft.Control = edtSRX AnchorSideTop.Control = lblRSTr - Left = 425 + Left = 412 Height = 17 - Top = 42 + Top = 107 Width = 28 Caption = 'NR r' ParentColor = False end object lblMSGr: TLabel + AnchorSideLeft.Control = edtSRXStr AnchorSideTop.Control = lblNRr - Left = 481 + Left = 462 Height = 17 - Top = 42 + Top = 107 Width = 39 Caption = 'MSG r' ParentColor = False @@ -198,21 +207,25 @@ object frmContest: TfrmContest object chkNRInc: TCheckBox AnchorSideLeft.Control = edtSTX AnchorSideTop.Control = chkTrueRST - Left = 207 + Left = 196 Height = 23 - Top = 93 + Hint = 'When cheked STX number is created from 001.'#10'Number can be edited in case of wrong entry and counting'#10'increases from number shown when QSO is saved.' + Top = 158 Width = 45 Caption = 'Inc' OnChange = chkNRIncChange OnClick = chkNRIncClick + ParentShowHint = False + ShowHint = True TabOrder = 9 TabStop = False end object lblNRs: TLabel + AnchorSideLeft.Control = edtSTX AnchorSideTop.Control = lblRSTs - Left = 209 + Left = 196 Height = 17 - Top = 42 + Top = 107 Width = 30 Caption = 'NR s' ParentColor = False @@ -220,72 +233,85 @@ object frmContest: TfrmContest object chkLoc: TCheckBox AnchorSideLeft.Control = edtSRXStr AnchorSideTop.Control = chkNoNr - Left = 473 + Left = 462 Height = 23 - Top = 93 + Hint = 'Several options to choose with right mouse click.'#10'When one of them checked saving QSO will copy '#10'received message to that column of log'#10'.'#10'If you select option, remember also check the chkbox!'#10'.'#10'Received message is, of course, always saved to SRX_String'#10'column too.' + Top = 158 Width = 102 Caption = 'MSG is Grid' + ParentShowHint = False PopupMenu = popSetMsg - TabOrder = 14 + ShowHint = True + TabOrder = 10 TabStop = False end object chkSpace: TCheckBox AnchorSideLeft.Control = lblContestName AnchorSideTop.Control = edtCall AnchorSideTop.Side = asrBottom - Left = 17 + Left = 6 Height = 23 - Top = 93 + Hint = 'When checked spacebar works like Tab key.'#10'NOTE: prevents space(s) in MSG received' + Top = 158 Width = 113 Caption = 'SPACE is TAB' - TabOrder = 11 + ParentShowHint = False + ShowHint = True + TabOrder = 18 TabStop = False end object chkNoNr: TCheckBox AnchorSideLeft.Control = edtSRX AnchorSideTop.Control = chkNRInc - Left = 423 + Left = 412 Height = 23 - Top = 93 + Hint = 'When checked Tab skips this column (contest has no serial Nr)' + Top = 158 Width = 44 Caption = 'No' OnChange = chkNoNrChange - TabOrder = 15 + ParentShowHint = False + ShowHint = True + TabOrder = 12 TabStop = False end object chkTrueRST: TCheckBox AnchorSideLeft.Control = edtRSTs AnchorSideTop.Control = chkSpace - Left = 157 + Left = 146 Height = 23 - Top = 93 + Hint = 'When checked Tab stops to RST(s) allowing entering of true reports' + Top = 158 Width = 46 Caption = 'Tru' OnChange = chkTrueRSTChange - TabOrder = 12 + ParentShowHint = False + ShowHint = True + TabOrder = 13 TabStop = False end object btClearQso: TButton AnchorSideLeft.Control = btSave AnchorSideTop.Control = btSave AnchorSideTop.Side = asrBottom - Left = 609 + Left = 588 Height = 30 - Top = 74 + Top = 139 Width = 80 BorderSpacing.Top = 2 Caption = 'Clear QSO' OnClick = btClearQsoClick - TabOrder = 6 + TabOrder = 7 end object btnHelp: TSpeedButton - AnchorSideTop.Control = Owner + AnchorSideTop.Control = cmbContestName + AnchorSideTop.Side = asrCenter AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom - Left = 678 + Left = 657 Height = 25 Hint = 'Help' - Top = 3 + Top = 11 Width = 25 Anchors = [akTop, akRight] BorderSpacing.Top = 3 @@ -329,11 +355,11 @@ object frmContest: TfrmContest object lblContestName: TLabel AnchorSideLeft.Control = Owner AnchorSideTop.Control = cmbContestName - Left = 17 + Left = 6 Height = 17 - Top = 1 + Top = 6 Width = 91 - BorderSpacing.Left = 17 + BorderSpacing.Left = 6 Caption = 'Contest name' ParentColor = False end @@ -342,16 +368,15 @@ object frmContest: TfrmContest AnchorSideTop.Control = Owner AnchorSideRight.Control = edtSRXStr AnchorSideRight.Side = asrBottom - Left = 141 + Left = 130 Height = 34 - Hint = 'contestname, choose ADIF contest_id via combobox or type freestyle max 40 characters' - Top = 1 + Hint = 'Contestname, choose ADIF contest_id via combobox '#10'or type free text max 40 characters.'#10'Recommended to add contest year(week/month/day) if several'#10'contests are kept in same log. Helps Contest filter usage'#10'.'#10'If contest name combo box has name "Status" view is updated by '#10'CommonStatus rules. User can adjust that view.'#10'There are also predefined strings that cause contest specific '#10'Status displayed' + Top = 6 Width = 432 Anchors = [akTop, akRight] AutoComplete = True AutoCompleteText = [cbactEnabled, cbactEndOfLineComplete, cbactSearchAscending] - BorderSpacing.Left = 30 - BorderSpacing.Top = 1 + BorderSpacing.Top = 6 ItemHeight = 0 Items.Strings = ( '070-160M-SPRINT' @@ -580,33 +605,42 @@ object frmContest: TfrmContest 'YUDXC' ) MaxLength = 40 + OnExit = cmbContestNameExit ParentShowHint = False ShowHint = True - TabOrder = 10 + TabOrder = 11 TabStop = False end object chkQsp: TCheckBox AnchorSideLeft.Control = edtSTXStr AnchorSideTop.Control = chkNRInc - Left = 257 + Left = 246 Height = 23 - Top = 93 + Hint = 'When checked allows circulating STX_String.'#10'I.E. set MSG_s at start, after 1st QSO is saved your MSG_s'#10'changes to MSG_r received from last logged QSO.' + Top = 158 Width = 51 Caption = 'Qsp' OnChange = chkQspChange + ParentShowHint = False + ShowHint = True TabOrder = 16 TabStop = False end object chkTabAll: TCheckBox - AnchorSideLeft.Control = lblContestName - AnchorSideTop.Control = lblContestName + AnchorSideLeft.Control = Owner + AnchorSideTop.Control = cmbContestName AnchorSideTop.Side = asrBottom - Left = 17 + Left = 6 Height = 23 - Top = 18 + Hint = 'When checked TAB will move through all columns in order' + Top = 43 Width = 106 + BorderSpacing.Left = 6 + BorderSpacing.Top = 3 Caption = 'TAB in order' OnChange = chkTabAllChange + ParentShowHint = False + ShowHint = True TabOrder = 17 TabStop = False end @@ -616,8 +650,8 @@ object frmContest: TfrmContest AnchorSideBottom.Control = Owner Left = 0 Height = 19 - Top = 159 - Width = 706 + Top = 348 + Width = 685 Panels = < item Text = '0' @@ -646,11 +680,12 @@ object frmContest: TfrmContest AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = cmbContestName AnchorSideTop.Side = asrCenter - Left = 591 - Height = 1 - Top = 18 - Width = 1 - BorderSpacing.Left = 18 + Left = 571 + Height = 17 + Top = 15 + Width = 33 + BorderSpacing.Left = 9 + Caption = 'WPM' ParentColor = False end object rbDupeCheck: TRadioButton @@ -659,51 +694,60 @@ object frmContest: TfrmContest AnchorSideTop.Side = asrBottom Left = 17 Height = 23 - Top = 124 + Hint = 'Dupe = station already worked in this band.'#10'When selected, with date, duplicate cheking starts from set date.'#10'Date is needed if you have several contests in same log'#10'.'#10'With own log for every contest date is not needed to be set'#10'.'#10'Turns call column text to bold red. If QSO is how ever logged '#10'adds "/D" to RSTsend if "Mark dupe" is cheked.'#10' ' + Top = 189 Width = 102 BorderSpacing.Left = 17 BorderSpacing.Top = 8 Caption = 'Dupe check' Checked = True - TabOrder = 21 + ParentShowHint = False + ShowHint = True + TabOrder = 22 TabStop = True end object rbNoMode4Dupe: TRadioButton AnchorSideLeft.Control = btDupChkStart AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = rbDupeCheck - Left = 156 + Left = 144 Height = 23 - Top = 124 + Hint = 'This selection allows same station to be worked in same band'#10' if QSO mode is different.'#10#10'Otherwise like "Dupe check" selction.' + Top = 189 Width = 122 - BorderSpacing.Left = 18 + BorderSpacing.Left = 6 Caption = 'NoMode4Dupe' - TabOrder = 19 + ParentShowHint = False + ShowHint = True + TabOrder = 20 end object rbIgnoreDupes: TRadioButton AnchorSideLeft.Control = rbNoMode4Dupe AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = rbDupeCheck - Left = 296 + Left = 272 Height = 23 - Top = 124 + Hint = 'No duplicate cheking' + Top = 189 Width = 110 - BorderSpacing.Left = 18 + BorderSpacing.Left = 6 Caption = 'Ignore dupes' OnChange = rbIgnoreDupesChange - TabOrder = 20 + ParentShowHint = False + ShowHint = True + TabOrder = 21 end object btClearAll: TButton AnchorSideLeft.Control = btSave AnchorSideTop.Control = rbDupeCheck AnchorSideTop.Side = asrCenter - Left = 609 + Left = 588 Height = 30 - Top = 120 + Top = 185 Width = 80 Caption = 'Clear All' OnClick = btClearAllClick - TabOrder = 5 + TabOrder = 6 TabStop = False end object btDupChkStart: TButton @@ -713,29 +757,309 @@ object frmContest: TfrmContest AnchorSideTop.Side = asrCenter Left = 122 Height = 33 - Hint = 'When using common log, set date of dupe check begin (contest start date)' - Top = 119 + Hint = 'When using common log for all contests set date of '#10'dupe check begin (I.E. contest start date)' + Top = 184 Width = 16 AutoSize = True BorderSpacing.Left = 3 Constraints.MaxHeight = 35 Constraints.MaxWidth = 180 OnClick = btDupChkStartClick - TabOrder = 22 + ParentShowHint = False + ShowHint = True + TabOrder = 23 TabStop = False end - object Label1: TLabel - Left = 270 - Height = 1 - Top = 150 - Width = 1 + object chkSP: TCheckBox + AnchorSideLeft.Control = edtSTXStr + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = chkQsp + AnchorSideTop.Side = asrCenter + Left = 346 + Height = 23 + Hint = 'When cheked form is in Search and Pounce mode where operator'#10'needs to launch all memory contents using function keys (F1-F9)'#10'With CW Messages this means "S&P(default)" set of memories.'#10'.'#10'When NOT checked message F2 is launched when cursor enters to'#10'one of RSTr, NRr or MSGr (F2 must be defined by operator)'#10'In case of duplicate call is found message F3 is launced instead'#10'of F2 when cursor leaves CALL column (F3 must be defined by operator)'#10'When QSO is saved message F4 is lauched. (F4 must be defined by operator)'#10'With CW Messages this means "Run" set of memories.'#10'.'#10'When S&P checkbox changes state also CW message sets are switched.'#10'.'#10'CW messages can be stopped with one 1xESC key as usual.'#10#10'Suggestions for CW "Run" set message macros (NewQSO/File/CW messages):'#10'F1 = cq %mc test (%mc is station call)'#10'F2 = %c %xrs (%c call %xrs sends CALL+ RST+STX+STXStr in short form.)'#10'F3 = %c QSO'#10'F4 = tu %mc test' + Top = 158 + Width = 52 + Caption = 'S&&P' + OnClick = chkSPClick + ParentShowHint = False + ShowHint = True + TabOrder = 24 + TabStop = False + end + object gbStatus: TGroupBox + AnchorSideLeft.Control = Owner + AnchorSideTop.Control = rbDupeCheck + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = Owner + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = sbContest + Left = 6 + Height = 130 + Top = 218 + Width = 673 + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Left = 6 + BorderSpacing.Top = 6 + BorderSpacing.Right = 6 + Caption = 'Status' + ClientHeight = 112 + ClientWidth = 671 + TabOrder = 25 + OnClick = gbStatusClick + object mStatus: TMemo + AnchorSideLeft.Control = gbStatus + AnchorSideTop.Control = gbStatus + AnchorSideRight.Control = gbStatus + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = gbStatus + AnchorSideBottom.Side = asrBottom + Left = 3 + Height = 91 + Hint = 'Shows status of contest.'#10'If contest has any name common status counting is used. That'#10'includes QSO counts for all, dx and own continent with lists of'#10'DX and own continent prefixes.'#10'Also received messages are counted and listed allowing msg'#10'multiplier count.'#10'Use can control these with left click of mouse pointing between'#10'text "Status" and status display area'#10'.'#10'Currently if there are contest names that include "mwc"or "ok1wc"'#10'and "nac" those statuses are counted by MWC or NAC rules'#10'.'#10'Update is done evey time QSO is saved or 2xESC is pressed.' + Top = 18 + Width = 665 + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Left = 3 + BorderSpacing.Top = 18 + BorderSpacing.Right = 3 + BorderSpacing.Bottom = 3 + ParentShowHint = False + ReadOnly = True + ScrollBars = ssAutoBoth + ShowHint = True + TabOrder = 0 + TabStop = False + end + end + object chkMarkDupe: TCheckBox + AnchorSideLeft.Control = rbIgnoreDupes + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = rbDupeCheck + Left = 400 + Height = 23 + Hint = 'If duplicate QSO is logged adds "/D" to RSTsend when cheked.' + Top = 189 + Width = 95 + BorderSpacing.Left = 18 + Caption = 'Mark dupe' + ParentShowHint = False + ShowHint = True + TabOrder = 26 + TabStop = False + end + object chkHint: TCheckBox + AnchorSideLeft.Control = chkTabAll + AnchorSideTop.Control = chkTabAll + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 23 + Hint = 'Turn hint help texts showing ON/OFF ' + Top = 66 + Width = 90 + Caption = 'Show hint' + Checked = True + OnChange = chkHintChange + ParentShowHint = False + ShowHint = True + State = cbChecked + TabOrder = 27 + TabStop = False + end + object CQpanel: TPanel + AnchorSideLeft.Control = cmbContestName + AnchorSideTop.Control = cmbContestName + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = cmbContestName + AnchorSideRight.Side = asrBottom + Left = 130 + Height = 61 + Top = 43 + Width = 432 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 3 + ClientHeight = 61 + ClientWidth = 432 + TabOrder = 0 + object spCQperiod: TSpinEdit + AnchorSideLeft.Control = lblCQperiod + AnchorSideTop.Control = lblCQperiod + AnchorSideTop.Side = asrBottom + AnchorSideBottom.Side = asrBottom + Left = 7 + Height = 34 + Hint = 'Timer repeat period for sending F1 (CQ).'#10'Value is milliseconds 5000 -50000 (5 -50 sec)'#10'As there is no indication how long F1 sending'#10'takes value should be adjusted manually.'#10' Set repeats=1, press CQ start and check that'#10' F1 has time to complete+listening time.'#10'CW sending and timer will stop when ESC is '#10'pressed or someting is written to Call column. ' + Top = 19 + Width = 90 + BorderSpacing.Right = 6 + Increment = 250 + MaxValue = 30000 + MinValue = 5000 + OnChange = spCQperiodChange + ParentShowHint = False + ShowHint = True + TabStop = False + TabOrder = 1 + Value = 5000 + end + object spCQrepeat: TSpinEdit + AnchorSideLeft.Control = spCQperiod + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = spCQperiod + Left = 103 + Height = 34 + Hint = 'Dead operator counter.'#10'How many times CQ (F1) is repeated before repeat stops.'#10'Value 1 - 20 times.' + Top = 19 + Width = 90 + BorderSpacing.Right = 6 + MaxValue = 30 + MinValue = 1 + ParentShowHint = False + ShowHint = True + TabStop = False + TabOrder = 2 + Value = 1 + end + object lblCQperiod: TLabel + AnchorSideLeft.Control = CQpanel + AnchorSideTop.Control = CQpanel + Left = 7 + Height = 17 + Top = 2 + Width = 64 + BorderSpacing.Left = 6 + BorderSpacing.Top = 1 + Caption = 'CQ period' + ParentColor = False + end + object lblCQrepeat: TLabel + AnchorSideLeft.Control = spCQperiod + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = lblCQperiod + Left = 109 + Height = 17 + Top = 2 + Width = 72 + BorderSpacing.Left = 12 + Caption = 'CQ repeats' + ParentColor = False + end + object btnCQstart: TButton + AnchorSideLeft.Control = spCQrepeat + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = spCQrepeat + AnchorSideTop.Side = asrCenter + AnchorSideRight.Side = asrBottom + Left = 205 + Height = 30 + Hint = 'Start CQ (F1) timer.'#10'Shorcut key: Shift+F1'#10'Stop with same key, 1xESC or'#10'write to call column.' + Top = 21 + Width = 80 + BorderSpacing.Left = 12 + Caption = 'CQ start' + Font.Color = clGreen + OnClick = btnCQstartClick + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 0 + TabStop = False + end + object lblCqFreq: TLabel + AnchorSideTop.Control = btnCQstart + AnchorSideTop.Side = asrCenter + Left = 297 + Height = 1 + Hint = 'Shows Frequency last used for CQ calling (F1 memory).'#10'Double click on Frequency or Ctrl+L sets rig to that frequency and mode.' + Top = 36 + Width = 1 + BorderSpacing.Left = 12 + Color = clYellow + ParentColor = False + ParentFont = False + ParentShowHint = False + ShowHint = True + Transparent = False + OnClick = lblCqFreqClick + end + object lblCQLbl: TLabel + AnchorSideLeft.Control = lblCqFreq + AnchorSideTop.Control = lblCQrepeat + Left = 297 + Height = 17 + Top = 2 + Width = 82 + Caption = 'Last CQ Freq' + ParentColor = False + end + object lblCqMode: TLabel + AnchorSideLeft.Control = lblCqFreq + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = btnCQstart + AnchorSideTop.Side = asrCenter + Left = 304 + Height = 1 + Hint = 'Shows Mode last used for CQ calling (F1 memory).'#10'Double click on mode or Ctrl+L sets rig to that frequency and mode.' + Top = 36 + Width = 1 + BorderSpacing.Left = 6 + Color = clYellow + ParentColor = False + ParentFont = False + ParentShowHint = False + ShowHint = True + Transparent = False + OnClick = lblCqFreqClick + end + end + object lblQSOSince: TLabel + AnchorSideLeft.Control = lblSpeed + AnchorSideTop.Control = chkTabAll + Left = 571 + Height = 17 + Hint = 'Shows time (MM:SS) since last logged Qso' + Top = 43 + Width = 22 + Caption = 'QS:' ParentColor = False + ParentShowHint = False + ShowHint = True + end + object lblRate10: TLabel + AnchorSideLeft.Control = lblQSOSince + AnchorSideTop.Control = chkHint + Left = 571 + Height = 17 + Hint = 'Total QSO rate / 10 minutes' + Top = 66 + Width = 50 + AutoSize = False + Caption = 'q/10' + ParentColor = False + ParentShowHint = False + ShowHint = True + end + object lblRate60: TLabel + AnchorSideLeft.Control = lblRate10 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = lblRate10 + Left = 624 + Height = 17 + Hint = 'Total QSO rate / 1 hour' + Top = 66 + Width = 50 + AutoSize = False + BorderSpacing.Left = 3 + Caption = 'q/60' + ParentColor = False + ParentShowHint = False + ShowHint = True end object tmrESC2: TTimer Enabled = False OnTimer = tmrESC2Timer Left = 536 - Top = 120 + Top = 264 end object cdDupeDate: TCalendarDialog Title = 'Set start date' @@ -744,11 +1068,11 @@ object frmContest: TfrmContest OKCaption = 'OK' CancelCaption = 'Cancel' Left = 488 - Top = 120 + Top = 264 end object popSetMsg: TPopupMenu - Left = 440 - Top = 120 + Left = 448 + Top = 264 object mnuName: TMenuItem Caption = 'MSG is Name' OnClick = mnuNameClick @@ -782,4 +1106,72 @@ object frmContest: TfrmContest OnClick = mnuCommentClick end end + object popCommonStatus: TPopupMenu + Left = 408 + Top = 264 + object mnuQSOcount: TMenuItem + Caption = 'QSO count' + Checked = True + OnClick = mnuQSOcountClick + end + object mnuDXQSOCount: TMenuItem + Caption = 'DX QSO count' + Checked = True + OnClick = mnuDXQSOCountClick + end + object mnuCountyrCountAll: TMenuItem + Caption = 'Country count all' + Checked = True + OnClick = mnuCountyrCountAllClick + end + object mnuDXCountryCount: TMenuItem + Caption = 'DX country count' + Checked = True + OnClick = mnuDXCountryCountClick + end + object mnuDXCountryList: TMenuItem + Caption = 'DX country list' + Checked = True + OnClick = mnuDXCountryListClick + end + object mnuOwnCountryCount: TMenuItem + Caption = 'Own country count' + Checked = True + OnClick = mnuOwnCountryCountClick + end + object mnuOwnCountryList: TMenuItem + Caption = 'Own country list' + Checked = True + OnClick = mnuOwnCountryListClick + end + object mnuMsgMultipCount: TMenuItem + Caption = 'Msg multip count' + Checked = True + OnClick = mnuMsgMultipCountClick + end + object mnuMsgMultipList: TMenuItem + Caption = 'Msg multip list' + Checked = True + OnClick = mnuMsgMultipListClick + end + object mnuReSetAll: TMenuItem + Caption = 'Re/Set All' + OnClick = mnuReSetAllClick + end + object mnuExit: TMenuItem + Caption = 'Exit (Esc key)' + end + end + object tmrCQ: TTimer + Enabled = False + Interval = 3000 + OnTimer = tmrCQTimer + Left = 584 + Top = 264 + end + object tmrScore: TTimer + OnTimer = tmrScoreTimer + Left = 624 + Top = 264 + end end diff --git a/src/fContest.pas b/src/fContest.pas index 41a918a..43a0070 100644 --- a/src/fContest.pas +++ b/src/fContest.pas @@ -6,7 +6,7 @@ interface uses Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, - StdCtrls, ExtCtrls, LCLType, Buttons, ComCtrls, ExtDlgs, Menus, uMyIni; + StdCtrls, ExtCtrls, LCLType, Buttons, ComCtrls, ExtDlgs, Menus, Spin, strutils, fscp; type @@ -17,7 +17,11 @@ type btSave: TButton; btClearQso : TButton; btDupChkStart: TButton; + btnCQstart: TButton; cdDupeDate: TCalendarDialog; + chkHint: TCheckBox; + chkMarkDupe: TCheckBox; + chkSP: TCheckBox; chkTabAll: TCheckBox; chkQsp: TCheckBox; chkTrueRST: TCheckBox; @@ -33,7 +37,15 @@ type edtRSTr: TEdit; edtSRX: TEdit; edtSRXStr: TEdit; - Label1: TLabel; + gbStatus: TGroupBox; + lblQSOSince: TLabel; + lblRate10: TLabel; + lblRate60: TLabel; + lblCqFreq: TLabel; + lblCqMode: TLabel; + lblCQLbl: TLabel; + lblCQperiod: TLabel; + lblCQrepeat: TLabel; lblSpeed: TLabel; lblContestName: TLabel; lblCall: TLabel; @@ -44,6 +56,18 @@ type lblMSGr: TLabel; lblNRs: TLabel; btnHelp : TSpeedButton; + mnuReSetAll: TMenuItem; + mnuExit: TMenuItem; + mnuQSOcount: TMenuItem; + mnuDXQSOCount: TMenuItem; + mnuCountyrCountAll: TMenuItem; + mnuDXCountryCount: TMenuItem; + mnuDXCountryList: TMenuItem; + mnuOwnCountryCount: TMenuItem; + mnuOwnCountryList: TMenuItem; + mnuMsgMultipCount: TMenuItem; + mnuMsgMultipList: TMenuItem; + mStatus: TMemo; mnuGrid: TMenuItem; mnyIOTA: TMenuItem; mnuState: TMenuItem; @@ -52,26 +76,44 @@ type mnuQSLvia: TMenuItem; mnuComment: TMenuItem; mnuName: TMenuItem; + CQpanel: TPanel; popSetMsg: TPopupMenu; + popCommonStatus: TPopupMenu; rbDupeCheck: TRadioButton; rbNoMode4Dupe: TRadioButton; rbIgnoreDupes: TRadioButton; sbContest: TStatusBar; + spCQperiod: TSpinEdit; + spCQrepeat: TSpinEdit; + tmrScore: TTimer; + tmrCQ: TTimer; tmrESC2: TTimer; procedure btClearAllClick(Sender: TObject); procedure btDupChkStartClick(Sender: TObject); + procedure btnCQstartClick(Sender: TObject); procedure btSaveClick(Sender: TObject); procedure btClearQsoClick(Sender : TObject); + procedure chkHintChange(Sender: TObject); procedure chkNoNrChange(Sender: TObject); procedure chkNRIncChange(Sender: TObject); procedure chkNRIncClick(Sender : TObject); procedure chkQspChange(Sender: TObject); + procedure chkSPClick(Sender: TObject); procedure chkTrueRSTChange(Sender: TObject); procedure chkTabAllChange(Sender: TObject); + procedure cmbContestNameExit(Sender: TObject); + procedure edtRSTrEnter(Sender: TObject); + procedure lblCqFreqClick(Sender: TObject); + procedure mnuReSetAllClick(Sender: TObject); + procedure mnuCountyrCountAllClick(Sender: TObject); + procedure mnuDXCountryCountClick(Sender: TObject); + procedure mnuDXCountryListClick(Sender: TObject); + procedure mnuDXQSOCountClick(Sender: TObject); procedure edtCallChange(Sender: TObject); procedure edtCallExit(Sender: TObject); procedure edtCallKeyDown(Sender: TObject; var Key: word; Shift: TShiftState); procedure edtCallKeyPress(Sender: TObject; var Key: char); + procedure edtSRXChange(Sender: TObject); procedure edtSRXStrChange(Sender: TObject); procedure edtSRXExit(Sender: TObject); procedure edtSTXStrEnter(Sender: TObject); @@ -84,6 +126,12 @@ type procedure FormKeyDown(Sender: TObject; var Key: word; Shift: TShiftState); procedure FormShow(Sender: TObject); procedure btnHelpClick(Sender : TObject); + procedure gbStatusClick(Sender: TObject); + procedure mnuMsgMultipCountClick(Sender: TObject); + procedure mnuMsgMultipListClick(Sender: TObject); + procedure mnuOwnCountryCountClick(Sender: TObject); + procedure mnuOwnCountryListClick(Sender: TObject); + procedure mnuQSOcountClick(Sender: TObject); procedure mnuGridClick(Sender: TObject); procedure mnyIOTAClick(Sender: TObject); procedure mnuStateClick(Sender: TObject); @@ -93,9 +141,20 @@ type procedure mnuCommentClick(Sender: TObject); procedure mnuNameClick(Sender: TObject); procedure rbIgnoreDupesChange(Sender: TObject); + procedure spCQperiodChange(Sender: TObject); + procedure tmrCQTimer(Sender: TObject); procedure tmrESC2Timer(Sender: TObject); + procedure tmrScoreTimer(Sender: TObject); private { private declarations } + AllQsos, + AllDx, + AllOwnC, + AllCountries, + QsoRate10, + QsoRate60, + QsoSince : integer; + procedure SetActualReportForModeFromRadio; procedure InitInput; procedure ChkSerialNrUpd(IncNr: boolean); procedure SetTabOrders; @@ -104,7 +163,13 @@ type procedure ClearStatusBar; procedure ShowStatusBarInfo; procedure MsgIsPopChk(nr:integer); - + procedure MWCStatus; + procedure NACStatus; + procedure CommonStatus; + procedure Rates; + procedure SendFmemory(key:word); + function CheckDupe(call:string):boolean; + procedure CQstart(start:boolean); public { public declarations } procedure SaveSettings; @@ -115,15 +180,33 @@ var RSTstx: string = ''; //contest mode serial numbers store RSTstxAdd: string = ''; //contest mode additional string store //RSTsrx :string = ''; - EscFirstTime: boolean = False; + EscTimes :integer = 0; DupeFromDate :string = '1900-01-01'; MsgIs :integer = 0; + MWC40,MWC80 :integer; + UseStatus :integer; //can be used for status procedure specific operations + //-1:no status, 0:common status, 1..x specific status procedures + + MyAdif : word; //These will be filled in FormShow + Mypfx : String = ''; + Mycont : String = ''; + Mycountry: String = ''; + Mywaz : String = ''; + Myposun : String = ''; + Myitu : String = ''; + Mylat : String = ''; + Mylong : String = ''; + + FmemorySent: Boolean; //for semiAuto sending + + CQcount : integer; + implementation {$R *.lfm} -uses dData, dUtils, fNewQSO, fWorkedGrids, strutils, fscp, fTRXControl; +uses dData, dUtils, dDXCC, fNewQSO, fMain, fWorkedGrids, fTRXControl, fCWKeys, fCWType, uMyIni; procedure TfrmContest.FormKeyDown(Sender: TObject; var Key: word; Shift: TShiftState); var @@ -135,17 +218,27 @@ begin // enter anywhere if key = VK_RETURN then begin - if (length(edtCall.Text) > 2) then //must be some kind of call + if (length(edtCall.Text) > 2) and (not edtCall.Focused) then //must be some kind of call and cursor away from edtCall btSave.Click; key := 0; end; - //esc and double esc + //Ctrl+esc + if ((Shift = [ssShift]) and (key = VK_ESCAPE)) then + EscTimes:=2; //removes callsing on following "case EscTimes of" + + //esc, double and triple esc if key = VK_ESCAPE then begin - if EscFirstTime then - begin - //if edtCall.Text = '' then + case EscTimes of + + 0:Begin //1st press stops CW; + if Assigned(frmNewQSO.CWint) then + frmNewQSO.CWint.StopSending; + inc(EscTimes); + tmrESC2.Enabled := True; + end; + 1:Begin //2nd returns to callsign column frmNewQSO.old_call:=''; //this is stupid hack but only way to reproduce frmNewQSO.edtName.Text :=''; //new seek from log (important to see if wkd before, frmNewQSO.edtQth.Text :=''; //and qrz, if one wants) @@ -153,36 +246,50 @@ begin edtCall.SetFocus; edtCall.SelStart:=length(edtCall.Text); edtCall.SelLength:=0; - //else - if Assigned(frmNewQSO.CWint) then - frmNewQSO.CWint.StopSending; - EscFirstTime := False; - tmrESC2.Enabled := True; - end - else begin // esc second time - frmNewQSO.ClearAll; - if dmData.DebugLevel >= 1 then - writeln('Clear all done next focus'); - initInput; - tmrESC2Timer(nil); - end; + FmemorySent:=false; + CQstart(false); + inc(EscTimes); + end; + 2:Begin // 3rd removes callsign + frmNewQSO.ClearAll; + if dmData.DebugLevel >= 1 then + writeln('Clear all done next focus'); + initInput; + tmrESC2Timer(nil); + end; + end; //case + key := 0; end; - //cw memories + //memory keys if (Key >= VK_F1) and (Key <= VK_F10) and (Shift = []) then begin + SendFmemory(key); + if key=VK_F1 then + Begin + lblCqMode.Caption:=frmTRXControl.GetRawMode; + lblCqFreq.Caption := FormatFloat('0.00',frmTRXControl.GetFreqkHz); + end; + key := 0; if (frmNewQSO.cmbMode.Text = 'SSB') then frmNewQSO.RunVK(dmUtils.GetDescKeyFromCode(Key)) else if Assigned(frmNewQSO.CWint) then frmNewQSO.CWint.SendText(dmUtils.GetCWMessage( dmUtils.GetDescKeyFromCode(Key),edtCall.Text, - edtRSTs.Text, edtSTX.Text,edtSTXStr.Text, + edtRSTs.Text, edtSTX.Text,edtSTXStr.Text,edtSRX.Text,edtSRXStr.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'')); key := 0; end; + //CQ timer + if (Key = VK_F1) and (Shift = [ssShift]) and (CQpanel.Enabled=True)then + begin + CQstart(true); + key:=0; + end; + if (key = 33) then//pgup begin if Assigned(frmNewQSO.CWint) then @@ -195,6 +302,21 @@ begin key := 0; end; + //S&P mode + if (key = VK_Tab) then + begin + if (Shift = [ssShift]) then //off + Begin + chkSP.Checked:= False; + key:=0; + end; + if (Shift = [ssCTRL]) then //on + Begin + chkSP.Checked:= True; + key:=0; + end; + end; + if (key = 34) then//pgup begin if Assigned(frmNewQSO.CWint) then @@ -218,13 +340,19 @@ begin if key in [VK_1..VK_9] then frmNewQSO.SetSplit(chr(key)); if ((Shift = [ssCTRL]) and (key = VK_0)) then frmTRXControl.DisableSplit; -end; + //Jump to last CQ freq,mode + if ((Shift = [ssCTRL]) and (key = VK_L)) then + lblCqFreqClick(nil); +end; procedure TfrmContest.edtCallExit(Sender: TObject); var dupe : Integer; begin + //be sure report is ok for radio mode; + frmContest.SetActualReportForModeFromRadio; + // if frmNewQSO is in viewmode or editmode it overwrites old data or will not save // because saving is disabled in view mode. this if statement starts a fresh newqso form if frmNewQSO.ViewQSO or frmNewQSO.EditQSO then @@ -238,41 +366,6 @@ begin frmNewQSO.edtCall.Text := edtCall.Text; - if not (rbIgnoreDupes.Checked) then - begin - //dupe check - dupe := frmWorkedGrids.WkdCall(edtCall.Text, dmUtils.GetBandFromFreq(frmNewQSO.cmbFreq.Text) ,frmNewQSO.cmbMode.Text); - // 1= wkd this band and mode - // 2= wkd this band but NOT this mode - if ( (rbNoMode4Dupe.Checked) and (dupe = 1) ) - or ( (not rbNoMode4Dupe.Checked) and ((dupe = 1) or (dupe=2)) )then - Begin - edtCall.Font.Color:=clRed; - edtCall.Font.Style:= [fsBold]; - frmNewQSO.edtRemQSO.Caption:='Dupe'; - end - else - Begin - edtCall.Font.Color:=clDefault; - edtCall.Font.Style:= []; - frmNewQSO.edtRemQSO.Caption:=''; - end; - end; - //report in NEwQSO changes to 59 to late (after passing cmbMode) - //NOTE! if mode is not in list program dies! In that case skip next - if frmNewQSO.cmbMode.ItemIndex >=0 then - begin - case frmNewQSO.cmbMode.Items[frmNewQSO.cmbMode.ItemIndex] of - 'SSB', - 'AM', - 'FM' : - begin - edtRSTs.Text := copy(edtRSTs.Text,0,2); - edtRSTr.Text := copy(edtRSTr.Text,0,2); - end; - end; - end; - frmNewQSO.edtHisRST.Text := edtRSTs.Text; frmNewQSO.edtContestSerialSent.Text := edtSTX.Text; frmNewQSO.edtContestExchangeMessageSent.Text := edtSTXStr.Text; @@ -281,11 +374,27 @@ begin frmContest.ShowOnTop; frmContest.SetFocus; - ShowStatusBarInfo(); + if CheckDupe(edtCall.Text) then + Begin + //send macro F3 + if ((not chkSP.Checked) and (length(edtCall.Text)>2)) then + Begin + FmemorySent:=true; + SendFmemory(VK_F3); + end; + end; + + ShowStatusBarInfo; end; procedure TfrmContest.btSaveClick(Sender: TObject); begin + if frmNewQSO.AnyRemoteOn then + begin + Application.MessageBox('Log is in remote mode, please disable it.','Info ...',mb_ok + mb_IconInformation); + exit + end; + tmrScore.Enabled:=false; if chkLoc.Checked then begin case MsgIs of @@ -302,28 +411,54 @@ begin 4: frmNewQSO.edtCounty.Caption:= edtSRXStr.Text; //County 5: frmNewQSO.edtAward.Caption:= edtSRXStr.Text; //Award 6: frmNewQSO.edtQSL_VIA.Caption:= edtSRXStr.Text; //QSL via - 7: frmNewQSO.edtRemQSO.Caption:=frmNewQSO.edtRemQSO.Caption+' '+edtSRXStr.Text; //Comment. Preserves "DUPE" + 7: frmNewQSO.edtRemQSO.Caption:=edtSRXStr.Text; //Comment. end; end; + //NOTE! if mode is not in list program dies! In that case skip next + if frmNewQSO.cmbMode.ItemIndex >=0 then + begin + case frmNewQSO.cmbMode.Items[frmNewQSO.cmbMode.ItemIndex] of + 'SSB','AM','FM' : begin + edtRSTs.Text := copy(edtRSTs.Text,0,2); + edtRSTr.Text := copy(edtRSTr.Text,0,2); + end; + else + begin + edtRSTs.Text := copy(edtRSTs.Text,0,3); + edtRSTr.Text := copy(edtRSTr.Text,0,3); + end; + end; + end; + frmNewQSO.edtHisRST.Text := edtRSTs.Text; + if chkMarkDupe.Checked and CheckDupe(edtCall.Text) then + frmNewQSO.edtHisRST.Text:=frmNewQSO.edtHisRST.Text+'/D'; frmNewQSO.edtMyRST.Text := edtRSTr.Text; frmNewQSO.edtContestSerialReceived.Text := edtSRX.Text; frmNewQSO.edtContestSerialSent.Text := edtSTX.Text; frmNewQSO.edtContestExchangeMessageReceived.Text := edtSRXStr.Text; frmNewQSO.edtContestExchangeMessageSent.Text := edtSTXStr.Text; - frmNewQSO.edtContestName.Text := ExtractWord(1,cmbContestName.Text,['|']); + frmNewQSO.edtContestName.Text := cmbContestName.Text; + if (not chkSP.Checked) then + SendFmemory(VK_F4); frmNewQSO.btnSave.Click; if dmData.DebugLevel >= 1 then Writeln('input finale'); ChkSerialNrUpd(chkNRInc.Checked); initInput; - + QsoSince:=0; + tmrScore.Enabled:=true; end; procedure TfrmContest.btClearAllClick(Sender: TObject); +var + f:integer; begin + chkTabAll.Checked:=False; + chkHint.Checked:=True; + rbDupeCheck.Checked := True; rbNoMode4Dupe.Checked := False; rbIgnoreDupes.Checked := False; @@ -332,12 +467,16 @@ begin chkTrueRST.Checked := False; chkNRInc.Checked := False; chkQsp.Checked := False; + chkSP.Checked:=True; //this prevents automated release of Messages F2..F4 by accident chkNoNr.Checked := False; chkLoc.Checked := False; edtSTX.Text := ''; edtSTXStr.Text := ''; cmbContestName.Text:= ''; + + for f:=0 to 8 do + popCommonStatus.Items[f].Checked:=True; end; procedure TfrmContest.btDupChkStartClick(Sender: TObject); @@ -352,12 +491,101 @@ begin end; +procedure TfrmContest.btnCQstartClick(Sender: TObject); +begin + if btnCQstart.Font.Color = clGreen then + begin + CQstart(true); + lblCqMode.Caption:=frmTRXControl.GetRawMode; + lblCqFreq.Caption := FormatFloat('0.00',frmTRXControl.GetFreqkHz); + edtCall.SetFocus; + end + else + Cqstart(false); +end; + +procedure TfrmContest.CQstart(start:boolean); +begin + if start and (tmrCQ.Enabled=False) then + Begin + btnCQstart.Font.Color:=clRed; + btnCQstart.Repaint; + tmrCQ.Enabled:=True; + tmrCQTimer(nil); + end + else + Begin + if (tmrCQ.Enabled=True) then + begin + btnCQstart.Font.Color:=clGreen; + btnCQstart.Repaint; + tmrCQ.Enabled:=false; + CQcount:=0; + btnCQstart.Caption:='CQ start'; + if Assigned(frmNewQSO.CWint) then + frmNewQSO.CWint.StopSending; + end; + end; +end; + +procedure TfrmContest.tmrCQTimer(Sender: TObject); +begin + if (CQcount<spCQrepeat.Value) then + Begin + inc(CQcount); + btnCQstart.Caption:='CQ '+IntToStr(CQcount); + SendFmemory(VK_F1); + exit; + end; + CQstart(false); +end; + +procedure TfrmContest.spCQperiodChange(Sender: TObject); +begin + tmrCQ.Interval:=spCQperiod.Value; +end; + procedure TfrmContest.btClearQsoClick(Sender : TObject); begin frmNewQSO.ClearAll; initInput end; +procedure TfrmContest.chkHintChange(Sender: TObject); +var + i :integer; + chk,rb :TCheckBox; + b :boolean; + +begin + b:=cmbContestName.ShowHint; + try + for i := 0 to frmContest.ComponentCount - 1 do + begin + if frmContest.Components[i] is TCheckBox then + begin + chk := frmContest.Components[i] as TCheckBox; + chk.ShowHint:=not b ; + end; + end; + spCQperiod.ShowHint:=not b; + spCQrepeat.ShowHint:=not b; + btnCQStart.ShowHint:=not b; + rbDupeCheck.ShowHint:=not b; + btDupChkStart.ShowHint:=not b; + rbNoMode4Dupe.ShowHint:=not b; + rbIgnoreDupes.ShowHint:=not b;; + cmbContestName.ShowHint:=not b; + mStatus.ShowHint:=not b; + lblCqMode.ShowHint:=not b; + lblCqFreq.ShowHint:=not b; + lblQSOSince.ShowHint:=not b; + lblRate10.ShowHint:=not b; + lblRate60.ShowHint:=not b; + finally + end; +end; + procedure TfrmContest.chkNoNrChange(Sender: TObject); Begin SetTabOrders; @@ -382,6 +610,26 @@ begin SetTabOrders; end; +procedure TfrmContest.chkSPClick(Sender: TObject); +begin + if chkSP.Checked then + Begin + lblCall.Font.Color:=clRed; + lblRSTs.Font.Color:=clRed; + lblNRs.Font.Color:=clRed; + lblMSGs.Font.Color:=clRed; + end + else + Begin + lblCall.Font.Color:=clGreen; + lblRSTs.Font.Color:=clGreen; + lblNRs.Font.Color:=clGreen; + lblMSGs.Font.Color:=clGreen; + end; + cqrini.WriteBool('CW','S&P',chkSP.Checked); + frmNewQSO.UpdateFKeyLabels; +end; + procedure TfrmContest.chkTrueRSTChange(Sender: TObject); begin SetTabOrders; @@ -392,12 +640,77 @@ begin SetTabOrders; end; +procedure TfrmContest.cmbContestNameExit(Sender: TObject); +begin + cmbContestName.Text:= ExtractWord(1,cmbContestName.Text,['|']); + + if cmbContestName.Text='' then + begin + UseStatus:=-1; //no Contest name, noStatus + mStatus.Clear; + Exit; + end; + + if ((pos('MWC',uppercase(cmbContestName.Text))>0) + or (pos('OK1WC',uppercase(cmbContestName.Text))>0)) then + Begin + UseStatus:=1; //OK1WC memorial contest + MWCStatus; + Exit; + end; + + if (pos('NAC',uppercase(cmbContestName.Text))>0) then + Begin + UseStatus:=2; //Nordic V,U,SHF activity contest + NACStatus; + Exit; + end; + + { + //if you create a Status procedure you can call it here + if (pos('xxxx',uppercase(cmbContestName.Text))>0) then + Begin + UseStatus:=3; //Next ststus counting procedure + xxxxStatus; + Exit; + end; + } + + UseStatus:=0; //Common status display for contests where name does not fit to any above + CommonStatus; +end; + +procedure TfrmContest.edtRSTrEnter(Sender: TObject); //launch memory key F2 when RSTr,NRr or MSGr is entered +begin + if FmemorySent then exit; + + //send macro F2 + if ((not chkSP.Checked) and (length(edtCall.Text)>2)) then + Begin + FmemorySent:=true; + SendFmemory(VK_F2); + end; +end; + +procedure TfrmContest.lblCqFreqClick(Sender: TObject); +var + f:double; +Begin + if TryStrToFloat(lblCqFreq.Caption,f) then + frmtrxcontrol.SetModeFreq(lblCqMode.Caption,lblCqFreq.Caption); +end; + procedure TfrmContest.edtCallChange(Sender: TObject); begin + CQstart(false); if frmSCP.Showing and (Length(edtCall.Text)>2) then frmSCP.mSCP.Text := dmData.GetSCPCalls(edtCall.Text) else - frmSCP.mSCP.Clear + frmSCP.mSCP.Clear; + CheckDupe(edtCall.Text); + if not (edtCall.Text='') then //This prevents focus move to NewQSO when edtCall deleted to empty + frmNewQSO.edtCall.text:=edtCall.Text; + end; procedure TfrmContest.edtCallKeyDown(Sender: TObject; var Key: word; @@ -408,15 +721,24 @@ begin Key := 0; SelectNext(Sender as TWinControl, True, True); end; + if not (key in [VK_A..VK_Z, VK_0..VK_9, VK_NUMPAD0..VK_NUMPAD9, + VK_TAB, VK_LCL_SLASH, VK_DELETE,VK_BACK,VK_RIGHT,VK_LEFT, + VK_HOME,VK_DIVIDE, VK_END]) then + key := 0; end; procedure TfrmContest.edtCallKeyPress(Sender: TObject; var Key: char); begin - if not (key in ['a'..'z', 'A'..'Z', '0'..'9', - '/', chr(VK_DELETE), chr(VK_BACK), chr(VK_RIGHT), chr(VK_LEFT)]) then + if not (key in ['a'..'z','A'..'Z', '0'..'9', + '/',#08]) then key := #0; end; +procedure TfrmContest.edtSRXChange(Sender: TObject); +begin + frmNewQSO.edtContestSerialReceived.Text:=edtSRX.Text; +end; + procedure TfrmContest.edtSRXStrChange(Sender: TObject); begin if ((chkLoc.Checked) and (MsgIs=1 ))then @@ -430,6 +752,7 @@ begin if ( Length(edtSRXStr.Text) > 6 )then edtSRXStr.Text:=copy(edtSRXStr.Text,1,6); //accept only 6chr locator input here end; + frmNewQSO.edtContestExchangeMessageReceived.Text:=edtSRXStr.Text; end; procedure TfrmContest.edtSRXExit(Sender: TObject); begin @@ -463,15 +786,24 @@ procedure TfrmContest.FormCreate(Sender: TObject); begin frmContest.KeyPreview := True; dmUtils.InsertContests(cmbContestName); + QsoSince:=0; end; procedure TfrmContest.SaveSettings; +var + f :integer; begin dmUtils.SaveWindowPos(frmContest); + cqrini.WriteBool('frmContest', 'TabAll', chkTabAll.Checked); + cqrini.WriteBool('frmContest', 'ShowHint', chkHint.Checked); + cqrini.WriteInteger('frmContest','CQperiod',spCQperiod.Value); + cqrini.WriteInteger('frmContest','CQrepeat',spCQrepeat.Value); + cqrini.WriteBool('frmContest', 'DupeCheck', rbDupeCheck.Checked); cqrini.WriteBool('frmContest', 'NoMode4Dupe', rbNoMode4Dupe.Checked); cqrini.WriteBool('frmContest', 'IgnoreDupes', rbIgnoreDupes.Checked); cqrini.WriteString('frmContest', 'DupeFrom', DupeFromDate); + cqrini.WriteBool('frmContest', 'MarkDupe', chkMarkDupe.Checked); cqrini.WriteBool('frmContest', 'SpaceIsTab', chkSpace.Checked); cqrini.WriteBool('frmContest', 'TrueRST', chkTrueRST.Checked); @@ -485,11 +817,17 @@ begin cqrini.WriteString('frmContest', 'STX', edtSTX.Text); cqrini.WriteString('frmContest', 'STXStr', edtSTXStr.Text); cqrini.WriteString('frmContest', 'ContestName', cmbContestName.Text); + cqrini.WriteBool('frmContest', 'SP', chkSP.Checked); + + for f:=0 to 8 do + cqrini.WriteBool('frmContest', 'CommonStatus'+IntToStr(f),popCommonStatus.Items[f].Checked); end; procedure TfrmContest.FormClose(Sender: TObject; var CloseAction: TCloseAction); Begin - SaveSettings; + SaveSettings; + cqrini.WriteBool('CW','S&P',True); //set default CW memories + frmNewQSO.UpdateFKeyLabels; end; procedure TfrmContest.FormHide(Sender: TObject); @@ -500,14 +838,23 @@ begin end; procedure TfrmContest.FormShow(Sender: TObject); +var + f: integer; + begin frmNewQSO.gbContest.Visible := true; dmUtils.LoadWindowPos(frmContest); + chkTabAll.Checked := cqrini.ReadBool('frmContest', 'TabAll', False); + chkHint.Checked := cqrini.ReadBool('frmContest', 'ShowHint', True); + spCQperiod.Value:=cqrini.ReadInteger('frmContest','CQperiod',5000); + spCQrepeat.Value:=cqrini.ReadInteger('frmContest','CQrepeat',1); + rbDupeCheck.Checked := cqrini.ReadBool('frmContest', 'DupeCheck', True); rbNoMode4Dupe.Checked := cqrini.ReadBool('frmContest', 'NoMode4Dupe', False); rbIgnoreDupes.Checked := cqrini.ReadBool('frmContest', 'IgnoreDupes', False); DupeFromDate:= cqrini.ReadString('frmContest', 'DupeFrom', '1900-01-01'); + chkMarkDupe.Checked:= cqrini.ReadBool('frmContest', 'MarkDupe', True); chkSpace.Checked := cqrini.ReadBool('frmContest', 'SpaceIsTab', False); chkTrueRST.Checked := cqrini.ReadBool('frmContest', 'TrueRST', False); @@ -517,6 +864,7 @@ begin chkLoc.Checked := cqrini.ReadBool('frmContest', 'Loc', False); chkLoc.Caption:=cqrini.ReadString('frmContest','MsgIsStr','MSG is Grid'); MsgIs:=cqrini.ReadInteger('frmContest','MsgIs',1); //defaults to MSG is Grid + chkSP.Checked := cqrini.ReadBool('frmContest', 'SP', False); edtSTX.Text := cqrini.ReadString('frmContest', 'STX', ''); edtSTXStr.Text := cqrini.ReadString('frmContest', 'STXStr', ''); @@ -534,6 +882,22 @@ begin cmbContestName.Text := cqrini.ReadString('frmContest', 'ContestName',''); btDupChkStart.Caption := 'from '+DupeFromDate; btDupChkStart.Visible:=not(rbIgnoreDupes.Checked); + MWC40:=0; + MWC80:=0; + + for f:=0 to 8 do + popCommonStatus.Items[f].Checked:=cqrini.ReadBool('frmContest', 'CommonStatus'+IntToStr(f), True); + + MyAdif:= dmDXCC.id_country(cqrini.ReadString('Station', 'Call', ''), Now(), Mypfx, Mycont, Mycountry, MyWAZ, Myposun, MyITU, Mylat, Mylong); + mnuOwnCountryCount.Caption:=Mycont+' country count'; + mnuOwnCountryList.Caption:=Mycont+' country list'; + cmbContestNameExit(nil); //updates status view + FmemorySent:=False; + + tmrCQ.Enabled:=False; + tmrCQ.Interval:=spCQperiod.Value; + CQcount:=0; + chkSPClick(nil); //to set the right color to TX labels end; procedure TfrmContest.MsgIsPopChk(nr:integer); @@ -549,12 +913,83 @@ begin ShowHelp end; +procedure TfrmContest.gbStatusClick(Sender: TObject); +begin + popCommonStatus.PopUp; +end; + +procedure TfrmContest.mnuQSOcountClick(Sender: TObject); //0 +begin + popCommonStatus.Items[0].Checked:= not popCommonStatus.Items[0].Checked; + popCommonStatus.PopUp; +end; + +procedure TfrmContest.mnuDXQSOCountClick(Sender: TObject); //1 +begin + popCommonStatus.Items[1].Checked:= not popCommonStatus.Items[1].Checked; + popCommonStatus.PopUp; +end; +procedure TfrmContest.mnuCountyrCountAllClick(Sender: TObject); //2 +begin + popCommonStatus.Items[2].Checked:= not popCommonStatus.Items[2].Checked; + popCommonStatus.PopUp; +end; + +procedure TfrmContest.mnuDXCountryCountClick(Sender: TObject); //3 +begin + popCommonStatus.Items[3].Checked:= not popCommonStatus.Items[3].Checked; + popCommonStatus.PopUp; +end; + +procedure TfrmContest.mnuDXCountryListClick(Sender: TObject); //4 +begin + popCommonStatus.Items[4].Checked:= not popCommonStatus.Items[4].Checked; + popCommonStatus.PopUp; +end; + +procedure TfrmContest.mnuOwnCountryCountClick(Sender: TObject); //5 +begin + popCommonStatus.Items[5].Checked:= not popCommonStatus.Items[5].Checked; + popCommonStatus.PopUp; +end; + +procedure TfrmContest.mnuOwnCountryListClick(Sender: TObject); //6 +begin + popCommonStatus.Items[6].Checked:= not popCommonStatus.Items[6].Checked; + popCommonStatus.PopUp; +end; + +procedure TfrmContest.mnuMsgMultipCountClick(Sender: TObject); //7 +begin + popCommonStatus.Items[7].Checked:= not popCommonStatus.Items[7].Checked; + popCommonStatus.PopUp; +end; + +procedure TfrmContest.mnuMsgMultipListClick(Sender: TObject); //8 +begin + popCommonStatus.Items[8].Checked:= not popCommonStatus.Items[8].Checked; + popCommonStatus.PopUp; +end; + +procedure TfrmContest.mnuReSetAllClick(Sender: TObject); +var + f: integer; + b: boolean; +begin + b:= not popCommonStatus.Items[0].Checked; + for f:=0 to 8 do + popCommonStatus.Items[f].Checked:=b; + popCommonStatus.PopUp; +end; + procedure TfrmContest.mnuNameClick(Sender: TObject); begin MsgIs:=0; chkLoc.Caption:='MSG is Name'; MsgIsPopChk(MsgIs); end; + + procedure TfrmContest.mnuGridClick(Sender: TObject); begin MsgIs:=1; @@ -611,16 +1046,38 @@ end; procedure TfrmContest.tmrESC2Timer(Sender: TObject); begin - EscFirstTime := True; //time for double esc passed + EscTimes := 0; //time for counts passed tmrESC2.Enabled := False; end; -procedure TfrmContest.InitInput; +procedure TfrmContest.tmrScoreTimer(Sender: TObject); +begin + tmrScore.Enabled:=false; + cmbContestNameExit(nil); + tmrScore.Enabled:=true; +end; + +procedure TfrmContest.SetActualReportForModeFromRadio; + var + mode, + band: string; begin - edtRSTs.Text := trim(copy(frmNewQSO.edtHisRST.Text, 0, 3)); - //just pick '599' or '59 ' if there happens to be more - edtRSTr.Text := trim(copy(frmNewQSO.edtMyRST.Text, 0, 3)); + edtRSTs.Text := '599'; + edtRSTr.Text := '599'; + + if frmTRXControl.GetModeBand(mode, band) then + case mode of + 'SSB','AM','FM' : begin + edtRSTs.Text := '59'; + edtRSTr.Text := '59'; + end; + end; +end; +procedure TfrmContest.InitInput; +Begin + SetActualReportForModeFromRadio; + FmemorySent:=False; if not ((edtSTX.Text <> '') and (RSTstx = '')) then edtSTX.Text := RSTstx; @@ -631,13 +1088,14 @@ begin edtCall.Font.Color:=clDefault; edtCall.Font.Style:= []; edtCall.Clear; - EscFirstTime := True; + EscTimes := 0; SetTabOrders; frmContest.ShowOnTop; frmContest.SetFocus; edtCall.SetFocus; + cmbContestNameExit(nil); //updates status view ClearStatusBar; end; @@ -759,18 +1217,463 @@ var begin for i:=0 to sbContest.Panels.Count-1 do sbContest.Panels.Items[i].Text := ''; + end; procedure TfrmContest.ShowStatusBarInfo; begin - sbContest.Panels.Items[0].Text := ExtractWord(1,Trim(frmNewQSO.mCountry.Text),[#$0A]); - sbContest.Panels.Items[1].Text := 'WAZ: ' + frmNewQSO.lblWAZ.Caption; - sbContest.Panels.Items[2].Text := 'ITU: ' + frmNewQSO.lblITU.Caption; - sbContest.Panels.Items[3].Text := 'AZ: ' + frmNewQSO.lblAzi.Caption; - sbContest.Panels.Items[4].Text := frmNewQSO.lblCont.Caption; + sbContest.Panels.Items[0].Text := ExtractWord(1,Trim(frmNewQSO.mCountry.Text),[#$0A]); + sbContest.Panels.Items[1].Text := 'WAZ: ' + frmNewQSO.lblWAZ.Caption; + sbContest.Panels.Items[2].Text := 'ITU: ' + frmNewQSO.lblITU.Caption; + sbContest.Panels.Items[3].Text := 'AZ: ' + frmNewQSO.lblAzi.Caption; + sbContest.Panels.Items[4].Text := frmNewQSO.lblCont.Caption; end; -initialization +procedure TfrmContest.SendFmemory(key:word); +Begin + if (frmNewQSO.cmbMode.Text = 'CW') and Assigned(frmNewQSO.CWint) then + frmNewQSO.CWint.SendText(dmUtils.GetCWMessage(dmUtils.GetDescKeyFromCode(Key),edtCall.Text, + edtRSTs.Text, edtSTX.Text,edtSTXStr.Text, edtSRX.Text, edtSRXstr.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'')) + else + if ((frmNewQSO.cmbMode.Text = 'SSB') or (frmNewQSO.cmbMode.Text = 'FM') or (frmNewQSO.cmbMode.Text = 'AM')) then + frmNewQSO.RunVK(dmUtils.GetDescKeyFromCode(Key)); +end; +function TfrmContest.CheckDupe(call:string):boolean; +var + dupe:integer; +Begin + Result:=false; + if not (rbIgnoreDupes.Checked) then + begin + //dupe check + dupe := frmWorkedGrids.WkdCall(edtCall.Text, dmUtils.GetBandFromFreq(frmNewQSO.cmbFreq.Text) ,frmNewQSO.cmbMode.Text); + // 1= wkd this band and mode + // 2= wkd this band but NOT this mode + if ( (rbNoMode4Dupe.Checked) and (dupe = 1) ) + or ( (not rbNoMode4Dupe.Checked) and ((dupe = 1) or (dupe=2)) )then + Begin + edtCall.Font.Color:=clRed; + edtCall.Font.Style:= [fsBold]; + Result:=true; + end + else + Begin + edtCall.Font.Color:=clDefault; + edtCall.Font.Style:= []; + end; + end; +end; + +procedure TfrmContest.MWCStatus; +var + Mlist : array [1..2] of string[40]; + Band : integer; + QSOc,MULc : array [1..2] of integer; + f,p : integer; + M : char; + bands : array [1..2] of string=('80M','40M'); +Begin + mStatus.Clear; + for band:=2 downto 1 do + begin + try + MULc[band]:=0; + Mlist[band]:='....................................' ; //A-Z0-9 + dmData.CQ.Close; + if dmData.trCQ.Active then dmData.trCQ.Rollback; + dmData.CQ.SQL.Text := + 'SELECT ASCII(MID(callsign,LENGTH(callsign),1)) AS SuffixEnd FROM cqrlog_main WHERE contestname='+ + QuotedStr(cmbContestName.Text)+' AND band='+QuotedStr(bands[band])+' AND mode='+QuotedStr('CW'); + + if dmData.DebugLevel >=1 then + Writeln(dmData.CQ.SQL.Text); + dmData.CQ.Open(); + QSOc[band]:=0; + while not dmData.CQ.EOF do + Begin + f:= dmData.CQ.FieldByName('SuffixEnd').AsInteger; + if f>0 then + Begin + inc(QSOc[band]); + case f of + 65..90 : p:=0; + 48..57 : p:=43; + else + p:=-1; + end; + if p>-1 then + begin + if Mlist[band][f+p-64]='.' then + Begin + inc(MULc[band]); + Mlist[band][f+p-64]:=char(f); + end; + end; + end; + dmData.CQ.Next; + end; + finally + dmData.CQ.Close(); + dmData.trCQ.Rollback; + + mStatus.Lines.Add(bands[band]+' CW: '+Mlist[band]+' '+IntToStr(MULc[band])+ + ' QSOs:' + IntToStr(QSOc[band])); + end; + end; + mStatus.Lines.Add('----------------------------------------------------------------------------------'); + mStatus.Lines.Add(' Total Pts: ' + IntToStr(QSOc[1]+QSOc[2])+' Multipliers: '+IntToStr(MULc[1]+MULc[2])+ + ' Score: '+ IntToStr( (QSOc[1]+QSOc[2]) * (MULc[1]+MULc[2])) ); + + AllQsos:= QSOc[1]+QSOc[2]; + Rates; +end; + +procedure TfrmContest.NACStatus; +var + QSOs, + LOCs, + QRB, + MaxQRB, + Points, + QSOPoints, + LocPoints: integer; + LOCList, + distance: string; +Begin + + QSOs:=0; + LOCs:=0; + MaxQRB:=0; + Points:=0; + LocPoints:=0; + LocList:=''; + mStatus.Clear; + + //QSO count (28MHz and up) + //-------------------------------------------------------------- + dmData.CQ.Close; + if dmData.trCQ.Active then dmData.trCQ.Rollback; + dmData.CQ.SQL.Text := + 'SELECT COUNT(callsign) AS Qcount FROM cqrlog_main WHERE contestname='+ QuotedStr(cmbContestName.Text)+ + ' AND freq > 27.99999'; + if dmData.DebugLevel >=1 then + Writeln(dmData.CQ.SQL.Text); + dmData.CQ.Open(); + QSOs:= dmData.CQ.FieldByName('Qcount').AsInteger; + + //Points count (up to 47GHz) + //-------------------------------------------------------------- + dmData.CQ.Close; + if dmData.trCQ.Active then dmData.trCQ.Rollback; + dmData.CQ.SQL.Text := + 'SELECT my_loc,loc,band FROM cqrlog_main WHERE contestname='+ QuotedStr(cmbContestName.Text)+ + ' AND freq > 27.99999'; + if dmData.DebugLevel >=1 then + Writeln(dmData.CQ.SQL.Text); + dmData.CQ.Open(); + dmData.CQ.First; + while not dmData.CQ.EOF do + begin + distance:=frmMain.CalcQrb(dmData.CQ.FieldByName('my_loc').AsString,dmData.CQ.FieldByName('loc').AsString,False); + if distance<>'' then + Begin + QRB:=StrToInt(distance); + if QRB < 10 then + QSOPoints := 10 + else + QSOPoints := QRB; + + case dmData.CQ.FieldByName('band').AsString of + '13CM' : QSOPoints:=QSOPoints*2; + '9CM' : QSOPoints:=QSOPoints*3; + '6CM' : QSOPoints:=QSOPoints*4; + '3CM' : QSOPoints:=QSOPoints*5; + '1.25CM' : QSOPoints:=QSOPoints*6; + '6MM' : QSOPoints:=QSOPoints*7; + end; + + if QRB > MaxQRB then + MaxQRB := QRB; + + Points:=Points+QSOPoints; + end; + dmData.CQ.Next; + end; + + //list of different main locators (localtor multipliers) + //-------------------------------------------------------------- + dmData.CQ.Close; + if dmData.trCQ.Active then dmData.trCQ.Rollback; + dmData.CQ.SQL.Text := + 'SELECT DISTINCT(SUBSTRING(UPPER(loc),1,4)) AS MainLoc FROM cqrlog_main WHERE contestname='+ + QuotedStr(cmbContestName.Text)+' ORDER BY MainLoc ASC'; + if dmData.DebugLevel >=1 then + Writeln(dmData.CQ.SQL.Text); + dmData.CQ.Open(); + dmData.CQ.First; + while not dmData.CQ.EOF do + begin + if dmData.CQ.FieldByName('MainLoc').AsString<>'' then + Begin + LocList:= LocList+dmData.CQ.FieldByName('Mainloc').AsString+','; + LocPoints:= LocPoints + 500; + inc(LOCs); + end; + dmData.CQ.Next; + end; + dmData.CQ.Close; + + mStatus.Lines.Add('QSO count: '+IntToStr(QSOs)); + mStatus.Lines.Add('QSO points: '+IntToStr(Points)); + mStatus.Lines.Add('-----------------------------------------------------------'); + mStatus.Lines.Add('Locator count: '+IntToStr(LOCs)); + mStatus.Lines.Add('Locator points: '+IntToStr(LocPoints)); + mStatus.Lines.Add('Locator list: '+LocList); + mStatus.Lines.Add('-----------------------------------------------------------'); + mStatus.Lines.Add('Total points: '+ IntToStr(Points+LocPoints)+' Max QRB: '+IntToStr(MaxQRB)); + + AllQsos:=Qsos; + Rates; +end; + +procedure TfrmContest.CommonStatus; +var + DXList, + SRXSList, + MyCountList : string; + ContestBandPtr : array[0..10] of byte = (2,3,5,7,9,11,12,13,14,16,18); // 160M to 23cm Points to dUtils.cBands + b : byte; + MsgMpSum : integer; + + + Begin + DXList:=''; + MyCountList:=''; + + mStatus.Clear; + + if popCommonStatus.Items[0].Checked or popCommonStatus.Items[2].Checked then + Begin + //total counts of QSOs, countries and message multipliers + //-------------------------------------------------------------- + dmData.CQ.Close; + if dmData.trCQ.Active then dmData.trCQ.Rollback; + dmData.CQ.SQL.Text := + 'SELECT COUNT(callsign) AS QSOs, COUNT(DISTINCT(adif)) AS Countries,'+ + 'COUNT(DISTINCT(UPPER(srx_string))) AS Msgs FROM cqrlog_main WHERE contestname='+ + QuotedStr(cmbContestName.Text); + + if dmData.DebugLevel >=1 then + Writeln(dmData.CQ.SQL.Text); + dmData.CQ.Open(); + + AllQsos:= dmData.CQ.FieldByName('QSOs').AsInteger; + if popCommonStatus.Items[0].Checked then + mStatus.Lines.Add('QSO count: '+ dmData.CQ.FieldByName('QSOs').AsString); + + if popCommonStatus.Items[2].Checked then + mStatus.Lines.Add('Country count (all): '+dmData.CQ.FieldByName('Countries').AsString); + end; + + //DX QSO count + //-------------------------------------------------------------- + if popCommonStatus.Items[1].Checked then + Begin + dmData.CQ.Close; + if dmData.trCQ.Active then dmData.trCQ.Rollback; + dmData.CQ.SQL.Text := + 'SELECT COUNT(callsign) AS DXs FROM cqrlog_main WHERE contestname='+ + QuotedStr(cmbContestName.Text)+' AND cont<>'+QuotedStr(mycont); + if dmData.DebugLevel >=1 then + Writeln(dmData.CQ.SQL.Text); + dmData.CQ.Open(); + mStatus.Lines.Add('DX QSO count: '+ dmData.CQ.FieldByName('DXs').AsString); + end; + + //DX country count + //-------------------------------------------------------------- + if popCommonStatus.Items[3].Checked then + Begin + dmData.CQ.Close; + if dmData.trCQ.Active then dmData.trCQ.Rollback; + dmData.CQ.SQL.Text := + 'SELECT COUNT(DISTINCT(adif)) AS DXCntrs FROM cqrlog_main WHERE contestname='+ + QuotedStr(cmbContestName.Text)+' AND cont<>'+QuotedStr(mycont); + if dmData.DebugLevel >=1 then + Writeln(dmData.CQ.SQL.Text); + dmData.CQ.Open(); + mStatus.Lines.Add('DX Country count : '+dmData.CQ.FieldByName('DXCntrs').AsString); + end; + + //list of DX country prefixes + //-------------------------------------------------------------- + if popCommonStatus.Items[4].Checked then + begin + dmData.CQ.Close; + if dmData.trCQ.Active then dmData.trCQ.Rollback; + dmData.CQ.SQL.Text := + 'SELECT DISTINCT(pref) FROM cqrlog_common.dxcc_ref RIGHT JOIN cqrlog_main ON '+ + 'cqrlog_common.dxcc_ref.adif = cqrlog_main.adif WHERE contestname='+ + QuotedStr(cmbContestName.Text)+' AND cqrlog_main.cont<>'+QuotedStr(mycont) + +' ORDER BY cqrlog_common.dxcc_ref.pref ASC'; + if dmData.DebugLevel >=1 then + Writeln(dmData.CQ.SQL.Text); + dmData.CQ.Open(); + dmData.CQ.First; + while not dmData.CQ.EOF do + begin + if dmData.CQ.FieldByName('pref').AsString<>'' then + DXList:= DXList+dmData.CQ.FieldByName('pref').AsString+',' + else + DXList:= DXList+'?,'; + dmData.CQ.Next; + end; + mStatus.Lines.Add('DX Country list : '+DXList); + end; + + //Own continent country count + //-------------------------------------------------------------- + if popCommonStatus.Items[5].Checked then + begin + dmData.CQ.Close; + if dmData.trCQ.Active then dmData.trCQ.Rollback; + dmData.CQ.SQL.Text := + 'SELECT COUNT(DISTINCT(adif)) AS MYCntrs FROM cqrlog_main WHERE contestname='+ + QuotedStr(cmbContestName.Text)+' AND cont='+QuotedStr(Mycont); + if dmData.DebugLevel >=1 then + Writeln(dmData.CQ.SQL.Text); + dmData.CQ.Open(); + mStatus.Lines.Add(mycont+' Country count : '+dmData.CQ.FieldByName('MYCntrs').AsString); + end; + + //list of own continent country prefixes + //-------------------------------------------------------------- + if popCommonStatus.Items[6].Checked then + begin + dmData.CQ.Close; + if dmData.trCQ.Active then dmData.trCQ.Rollback; + dmData.CQ.SQL.Text := + 'SELECT DISTINCT(pref) FROM cqrlog_common.dxcc_ref RIGHT JOIN cqrlog_main ON '+ + 'cqrlog_common.dxcc_ref.adif = cqrlog_main.adif WHERE contestname='+ + QuotedStr(cmbContestName.Text)+' AND cqrlog_main.cont='+QuotedStr(Mycont) + +' ORDER BY cqrlog_common.dxcc_ref.pref ASC'; + if dmData.DebugLevel >=1 then + Writeln(dmData.CQ.SQL.Text); + dmData.CQ.Open(); + dmData.CQ.First; + while not dmData.CQ.EOF do + begin + if dmData.CQ.FieldByName('pref').AsString<>'' then + MyCountList:= MyCountList+dmData.CQ.FieldByName('pref').AsString+',' + else + MyCountList:= MyCountList+'?,'; + dmData.CQ.Next; + end; + mStatus.Lines.Add(mycont+' Country list : '+MyCountList); + end; + + //Msg multiplier (srx_string) count + //-------------------------------------------------------------- + if popCommonStatus.Items[7].Checked then + begin + SRXSList:=''; + MsgMpSum:=0; + for b:=0 to 10 do + begin + dmData.CQ.Close; + if dmData.trCQ.Active then dmData.trCQ.Rollback; + dmData.CQ.SQL.Text := + 'SELECT COUNT(DISTINCT(UPPER(srx_string))) AS Msgs FROM cqrlog_main WHERE contestname='+ + QuotedStr(cmbContestName.Text)+ ' AND band='+QuotedStr(dUtils.cBands[ContestBandPtr[b]])+ + ' AND srx_string<>""'; + + if dmData.DebugLevel >=1 then + Writeln(dmData.CQ.SQL.Text); + dmData.CQ.Open(); + MsgMpSum:= MsgMpSum+dmData.CQ.FieldByName('Msgs').AsInteger; + if dmData.CQ.FieldByName('Msgs').AsInteger > 0 then + SRXSList:=SRXSList+dUtils.cBands[ContestBandPtr[b]]+'='+dmData.CQ.FieldByName('Msgs').AsString+', '; + end; + mStatus.Lines.Add('Msg multipliers total='+IntToStr(MsgMpSum)); + mStatus.Lines.Add('-'+copy(SRXSList,1,length(SRXSList)-2)); + end; + + //list of different srx_strings (msg multipliers) + //-------------------------------------------------------------- + if popCommonStatus.Items[8].Checked then + begin + mStatus.Lines.Add('Msg multipliers list:'); + for b:=0 to 10 do + begin + dmData.CQ.Close; + if dmData.trCQ.Active then dmData.trCQ.Rollback; + dmData.CQ.SQL.Text := + 'SELECT DISTINCT(UPPER(srx_string)) AS srx_msg FROM cqrlog_main WHERE contestname='+ + QuotedStr(cmbContestName.Text)+ ' AND band='+QuotedStr(dUtils.cBands[ContestBandPtr[b]]) + +' ORDER BY srx_msg ASC'; + if dmData.DebugLevel >=1 then + Writeln(dmData.CQ.SQL.Text); + dmData.CQ.Open(); + dmData.CQ.First; + SRXSList:=''; + while not dmData.CQ.EOF do + begin + if dmData.CQ.FieldByName('srx_msg').AsString<>'' then + SRXSList:= SRXSList+dmData.CQ.FieldByName('srx_msg').AsString+','; + dmData.CQ.Next; + end; + if SRXSList<>'' then + mStatus.Lines.Add('-'+dUtils.cBands[ContestBandPtr[b]]+'='+copy(SRXSList,1,length(SRXSList)-1)); + end; + end; + + dmData.CQ.Close; + Rates; +end; +procedure TfrmContest.Rates; +Begin + if AllQsos>0 then + Begin + //last qso since + //-------------------------------------------------------------- + {dmData.CQ.Close; + if dmData.trCQ.Active then dmData.trCQ.Rollback; + dmData.CQ.SQL.Text := + 'select sec_to_time(timestampdiff(second,concat(qsodate," ",time_off),utc_timestamp())) as last from cqrlog_main order by id_cqrlog_main desc limit 1'; + if dmData.DebugLevel >=1 then + Writeln(dmData.CQ.SQL.Text); + dmData.CQ.Open(); + lblQsoSince.Caption:=dmData.CQ.FieldByName('last').AsString; + } + inc(QsoSince); + //print format here MM:SS + lblQsoSince.Caption:='QS: '+Format('%.2d', [QsoSince div 60])+':'+Format('%.2d', [QsoSince mod 60]); + + //qso rate 10min + //-------------------------------------------------------------- + dmData.CQ.Close; + if dmData.trCQ.Active then dmData.trCQ.Rollback; + dmData.CQ.SQL.Text := + 'select count(callsign) as rate from cqrlog_main where timestampdiff(minute,concat(qsodate," ",time_off),utc_timestamp())<10'; + if dmData.DebugLevel >=1 then + Writeln(dmData.CQ.SQL.Text); + dmData.CQ.Open(); + lblRate10.Caption:=dmData.CQ.FieldByName('rate').AsString+'/10'; + + //qso rate 1h + //-------------------------------------------------------------- + dmData.CQ.Close; + if dmData.trCQ.Active then dmData.trCQ.Rollback; + dmData.CQ.SQL.Text := + 'select count(callsign) as rate from cqrlog_main where timestampdiff(minute,concat(qsodate," ",time_off),utc_timestamp())<60'; + if dmData.DebugLevel >=1 then + Writeln(dmData.CQ.SQL.Text); + dmData.CQ.Open(); + lblRate60.Caption:=dmData.CQ.FieldByName('rate').AsString+'/60'; + + end; // AllQsos>0 + dmData.CQ.Close; +end; end. diff --git a/src/fContestFilter.lfm b/src/fContestFilter.lfm index b63935b..2160cac 100644 --- a/src/fContestFilter.lfm +++ b/src/fContestFilter.lfm @@ -120,7 +120,7 @@ object frmContestFilter: TfrmContestFilter OnKeyUp = FormKeyUp OnShow = FormShow Position = poMainFormCenter - LCLVersion = '2.0.8.0' + LCLVersion = '2.2.2.0' object btnOK: TButton AnchorSideLeft.Control = btnCancel AnchorSideLeft.Side = asrBottom @@ -183,14 +183,13 @@ object frmContestFilter: TfrmContestFilter AnchorSideLeft.Control = gbContName AnchorSideTop.Control = gbContName Left = 6 - Height = 33 + Height = 34 Hint = 'Choose contest from logged QSOs' Top = 0 Width = 506 AutoComplete = True AutoCompleteText = [cbactEnabled, cbactEndOfLineComplete, cbactSearchAscending] BorderSpacing.Left = 6 - DropDownCount = 3 ItemHeight = 0 MaxLength = 40 ParentShowHint = False diff --git a/src/fContestFilter.pas b/src/fContestFilter.pas index f4b4592..049de2b 100644 --- a/src/fContestFilter.pas +++ b/src/fContestFilter.pas @@ -47,7 +47,7 @@ implementation {$R *.lfm} { TfrmContestFilter } -uses dData, dUtils; +uses dData, dUtils, fContest; procedure TfrmContestFilter.btnOKClick(Sender: TObject); begin @@ -83,6 +83,8 @@ procedure TfrmContestFilter.FormShow(Sender: TObject); begin dmUtils.LoadFontSettings(self); + if frmContest.Showing and (frmContest.cmbContestName.Text<>'') then + cmbContestName.Text:=frmContest.cmbContestName.Text; end; procedure TfrmContestFilter.FormKeyUp(Sender: TObject; var Key: Word; diff --git a/src/fCountyStat.lfm b/src/fCountyStat.lfm new file mode 100644 index 0000000..1824c88 --- /dev/null +++ b/src/fCountyStat.lfm @@ -0,0 +1,250 @@ +object frmCountyStat: TfrmCountyStat + Left = 297 + Height = 590 + Top = 30 + Width = 653 + Caption = 'County statistic' + ClientHeight = 590 + ClientWidth = 653 + OnClose = FormClose + OnShow = FormShow + LCLVersion = '2.2.6.0' + object Panel1: TPanel + AnchorSideLeft.Control = Owner + AnchorSideTop.Control = Owner + AnchorSideRight.Control = Owner + AnchorSideRight.Side = asrBottom + Left = 0 + Height = 80 + Top = 0 + Width = 653 + Align = alTop + BevelOuter = bvNone + ClientHeight = 80 + ClientWidth = 653 + TabOrder = 0 + object cmbBands: TComboBox + AnchorSideLeft.Control = Label1 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = Panel1 + Left = 55 + Height = 33 + Top = 9 + Width = 164 + BorderSpacing.Left = 6 + BorderSpacing.Top = 9 + ItemHeight = 0 + OnChange = cmbBandsChange + Style = csDropDownList + TabOrder = 0 + end + object Label1: TLabel + AnchorSideLeft.Control = Panel1 + AnchorSideTop.Control = cmbBands + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 17 + Width = 37 + AutoSize = False + BorderSpacing.Left = 12 + Caption = 'Band:' + ParentColor = False + end + object GroupBox1: TGroupBox + AnchorSideLeft.Control = cmbBands + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = cmbBands + Left = 231 + Height = 42 + Top = 9 + Width = 244 + BorderSpacing.Left = 12 + Caption = ' Confirmed ' + ClientHeight = 24 + ClientWidth = 242 + TabOrder = 1 + object chkQSL: TCheckBox + AnchorSideLeft.Control = GroupBox1 + AnchorSideTop.Control = GroupBox1 + AnchorSideTop.Side = asrCenter + Left = 6 + Height = 23 + Top = 1 + Width = 51 + BorderSpacing.Left = 6 + Caption = 'QSL' + OnChange = cmbBandsChange + TabOrder = 0 + end + object chkLoTW: TCheckBox + AnchorSideLeft.Control = GroupBox1 + AnchorSideLeft.Side = asrCenter + AnchorSideTop.Control = GroupBox1 + AnchorSideTop.Side = asrCenter + Left = 90 + Height = 23 + Top = 1 + Width = 62 + Caption = 'LoTW' + OnChange = cmbBandsChange + TabOrder = 1 + end + object chkeQSL: TCheckBox + AnchorSideTop.Control = GroupBox1 + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = GroupBox1 + AnchorSideRight.Side = asrBottom + Left = 177 + Height = 23 + Top = 1 + Width = 59 + Anchors = [akTop, akRight] + BorderSpacing.Right = 6 + Caption = 'eQSL' + OnChange = cmbBandsChange + TabOrder = 2 + end + end + object pbTot: TProgressBar + AnchorSideLeft.Control = cmbBands + AnchorSideTop.Control = cmbBands + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = cmbBands + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Side = asrBottom + Left = 55 + Height = 10 + Top = 54 + Width = 161 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 12 + BorderSpacing.Right = 3 + TabOrder = 2 + end + object btnRefresh: TButton + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox1 + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = Panel1 + AnchorSideRight.Side = asrBottom + Left = 485 + Height = 33 + Top = 14 + Width = 156 + Anchors = [akTop, akRight] + BorderSpacing.Right = 12 + Caption = 'Refresh statistic' + OnClick = btnRefreshClick + TabOrder = 3 + end + object lblFIlterActive: TLabel + AnchorSideLeft.Control = GroupBox1 + AnchorSideLeft.Side = asrCenter + AnchorSideTop.Control = GroupBox1 + AnchorSideTop.Side = asrBottom + Left = 305 + Height = 17 + Top = 57 + Width = 96 + BorderSpacing.Top = 6 + Caption = 'Filter is active!' + Font.Color = clRed + ParentColor = False + ParentFont = False + Visible = False + end + end + object Panel2: TPanel + AnchorSideLeft.Control = Owner + AnchorSideRight.Control = Owner + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = Owner + Left = 0 + Height = 34 + Top = 556 + Width = 653 + Align = alBottom + AutoSize = True + BevelOuter = bvNone + ClientHeight = 34 + ClientWidth = 653 + TabOrder = 1 + object btnClose: TButton + AnchorSideTop.Control = Panel2 + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = Panel2 + AnchorSideRight.Side = asrBottom + Left = 551 + Height = 33 + Top = 1 + Width = 90 + Anchors = [akTop, akRight] + BorderSpacing.Right = 12 + Caption = 'Close' + ModalResult = 2 + TabOrder = 0 + end + object btnSaveTo: TButton + AnchorSideTop.Control = Panel2 + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = btnClose + Left = 449 + Height = 33 + Top = 1 + Width = 90 + Anchors = [akTop, akRight] + BorderSpacing.Right = 12 + Caption = 'Save to ...' + OnClick = btnSaveToClick + TabOrder = 1 + end + end + object IpHtmlPanel1: TIpHtmlPanel + AnchorSideLeft.Control = Panel1 + AnchorSideTop.Control = Panel1 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = Panel1 + AnchorSideBottom.Control = Panel2 + Left = 0 + Height = 476 + Top = 80 + Width = 653 + Align = alClient + BorderWidth = 1 + BorderStyle = bsSingle + DataProvider = IpFileDataProvider1 + FixedTypeface = 'Courier New' + DefaultTypeFace = 'Sans' + DefaultFontSize = 8 + FlagErrors = True + PrintSettings.MarginLeft = 0.5 + PrintSettings.MarginTop = 0.5 + PrintSettings.MarginRight = 0.5 + PrintSettings.MarginBottom = 0.5 + PrintSettings.Preview.Left = 320 + PrintSettings.Preview.Top = 200 + PrintSettings.Preview.Width = 960 + PrintSettings.Preview.Height = 600 + TabOrder = 2 + VLinkColor = clBlue + end + object IpFileDataProvider1: TIpFileDataProvider + Left = 160 + Top = 512 + end + object dlgSave: TSaveDialog + DefaultExt = '.html' + Filter = 'HTML files|*.html' + Left = 64 + Top = 512 + end + object tmrBlink: TTimer + Enabled = False + OnTimer = tmrBlinkTimer + OnStartTimer = tmrBlinkStartTimer + OnStopTimer = tmrBlinkStopTimer + Left = 248 + Top = 512 + end +end diff --git a/src/fCountyStat.pas b/src/fCountyStat.pas new file mode 100644 index 0000000..5e779bc --- /dev/null +++ b/src/fCountyStat.pas @@ -0,0 +1,324 @@ +unit fCountyStat; + +{$mode objfpc} + +interface + +uses + Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, + ExtCtrls, StdCtrls, Grids, ComCtrls, IpHtml, Ipfilebroker, db, BufDataset, + LazFileUtils,Dateutils; + +type + + { TfrmCountyStat } + + TfrmCountyStat = class(TForm) + btnClose: TButton; + btnRefresh: TButton; + btnSaveTo: TButton; + chkQSL: TCheckBox; + chkLoTW: TCheckBox; + chkeQSL: TCheckBox; + cmbBands: TComboBox; + GroupBox1: TGroupBox; + IpFileDataProvider1: TIpFileDataProvider; + IpHtmlPanel1: TIpHtmlPanel; + Label1: TLabel; + lblFIlterActive: TLabel; + Panel1: TPanel; + Panel2: TPanel; + dlgSave: TSaveDialog; + pbTot: TProgressBar; + tmrBlink: TTimer; + procedure btnRefreshClick(Sender: TObject); + procedure btnSaveToClick(Sender: TObject); + procedure cmbBandsChange(Sender: TObject); + procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); + procedure FormShow(Sender: TObject); + procedure tmrBlinkStartTimer(Sender: TObject); + procedure tmrBlinkStopTimer(Sender: TObject); + procedure tmrBlinkTimer(Sender: TObject); + private + TmpFile : String; + f : TextFile; + procedure WriteHMTLHeader; + public + + end; + +var + frmCountyStat: TfrmCountyStat; + +implementation +{$R *.lfm} + +{ TfrmCountyStat } +uses dUtils,dData, uMyIni, uVersion; + +procedure TfrmCountyStat.FormClose(Sender: TObject; + var CloseAction: TCloseAction); +begin + dmUtils.SaveForm(frmCountyStat); + cqrini.WriteInteger('CountyStat','Band',cmbBands.ItemIndex); + cqrini.WriteBool('CountyStat','QSL',chkQSL.Checked); + cqrini.WriteBool('CountyStat','LoTW',chkLoTW.Checked); + cqrini.WriteBool('CountyStat','eQSL',chkeQSL.Checked); + DeleteFileUTF8(TmpFile); + DeleteFileUTF8(ExtractFileNameWithoutExt(TmpFile)+'.html') +end; + +procedure TfrmCountyStat.btnRefreshClick(Sender: TObject); +var + tmp : String = ''; + bnd : String = ''; + grb : String = ''; + allwkd : longint = 0; + thiswkd : longint =0; + TotPos : longint = 0; + wkd : integer = 0; + cfm : integer = 0; + ll : String = ''; + sum_wkd : integer = 0; + sum_cfm : integer = 0; + TableName : String; +begin + tmrBlink.Enabled:=False; + TableName:='cqrlog_main'; + try + dmData.Q.Close; + dmData.Q1.Close; + if dmData.trQ.Active then dmData.trQ.Rollback; + if dmData.trQ1.Active then dmData.trQ1.Rollback; + if chkQSL.Checked then + begin + tmp := '(qsl_r = '+QuotedStr('Q')+') or'; + grb := ',qsl_r'; + end; + if chkLoTW.Checked then + begin + tmp := tmp + ' (lotw_qslr = '+QuotedStr('L')+') or'; + grb := grb + ',lotw_qslr' + end; + if chkeQSL.Checked then + begin + tmp := tmp + ' (eqsl_qsl_rcvd = '+QuotedStr('E')+') or'; + grb := grb + ',eqsl_qsl_rcvd' + end; + tmp := copy(tmp,1,Length(tmp)-2); //remove "or" + + if cmbBands.Text='ALL' then + bnd:=' ' + else + bnd:= ' and band='+QuotedStr(cmbBands.Text); + + dmData.trQ.StartTransaction; + dmData.trQ1.StartTransaction; + try + if dmData.IsFilter then + begin + try + TableName:='statistic_filter'; + dmData.Q.Close; + dmData.Q.SQL.Text:='DROP VIEW IF EXISTS '+TableName; + dmData.Q.ExecSQL; + dmData.trQ.Commit; + dmData.Q.Close; + dmData.Q.SQL.Text:='CREATE VIEW '+TableName+' AS '+dmData.IsFilterSQL; + dmData.Q.ExecSQL; + dmData.trQ.Commit; + dmData.Q.Close; + except + on E : EDatabaseError do + Begin + ShowMessage('Can not create filter view!'); + Exit; + end; + end; + end; + dmData.Q.SQL.Text := 'select upper(county) as ll FROM '+TableName+' where county <> '+QuotedStr('')+' group by ll'; + dmData.Q.Open; + dmData.Q.Last; //this is needed to get proper record count + allwkd:=dmData.Q.RecordCount; + dmData.Q.Close; + + dmData.Q.SQL.Text := 'select upper(county) as ll FROM '+TableName+' where county <> '+QuotedStr('')+ + bnd+' group by ll'; + dmData.Q.Open; + dmData.Q.Last; //this is needed to get proper record count + pbTot.Max:=dmData.Q.RecordCount; + thiswkd:= dmData.Q.RecordCount; + WriteHMTLHeader; + writeln(f,'<table>'); + dmData.Q.First; + while not dmData.Q.Eof do + begin + inc(TotPos); + pbTot.Position:=TotPos; + Application.ProcessMessages; + ll := dmData.Q.Fields[0].AsString; + writeln(f,'<tr>'+LineEnding+'<td valign="middle">'+LineEnding+'<font color="black"><b>'+ll+'</b></font>'+LineEnding+'</td>'); + writeln(f,'<td align="left">'); + writeln(f,'<font color="black">'); + dmData.Q1.Close; + dmData.Q1.SQL.Text := 'select count(id_cqrlog_main) FROM '+TableName+' where upper(county)='+ + QuotedStr(ll)+bnd; + dmData.Q1.Open; + + wkd := dmData.Q1.Fields[0].AsInteger; + sum_wkd := sum_wkd + wkd; + if tmp <> '' then + begin + dmData.Q1.Close; + dmData.Q1.SQL.Text := 'select count(id_cqrlog_main) FROM '+TableName+' where upper(county)='+ + QuotedStr(ll)+bnd+ + 'and ('+tmp+')'; + dmData.Q1.Open; + cfm := dmData.Q1.Fields[0].AsInteger; + sum_cfm := sum_cfm + cfm + end; + dmData.Q1.Close; + + Writeln(f,'</font>'); + Writeln(f,'</td>'); + Writeln(f,'<td valign="middle" align="left">'); + Writeln(f,'<font color="black">'); + Writeln(f,'<b>WKD: ',wkd,'</b><br>'); + if tmp<>'' then + Writeln(f,'<font color="black"><b>CFM: ',cfm,'</font></b>'); + Writeln(f,'</font>'); + Writeln(f,'</td>'); + Writeln(f,'</tr>'); + dmData.Q.Next; + end; + Writeln(f,'</table>'); + Writeln(f,'<hr>'); + Writeln(f,'<font color="black">'+LineEnding+'<b>Total:</b><br>'); + Writeln(f,'Worked:',sum_wkd,'<br>'); + Writeln(f,'Confirmed:',sum_cfm,'<br>'); + Writeln(f,'<b>Different counties:</b><br>'); + if cmbBands.Text<>'ALL' then Writeln(f,'On this band:',thiswkd,'<br>'); + Writeln(f,'On all bands:',allwkd); + Writeln(f,'</font>'); + Writeln(f,'</body>'); + Writeln(f,'</html>'); + CloseFile(f); + + if dmData.IsFilter then + begin + try + dmData.Q.Close; + dmData.Q.SQL.Text:='DROP VIEW IF EXISTS '+TableName; + dmData.Q.ExecSQL; + dmData.trQ.Commit; + Finally + end; + end; + + finally + dmData.trQ.Rollback; + dmData.trQ1.Rollback + end; + CopyFile(TmpFile,ExtractFileNameWithoutExt(TmpFile)+'.html'); + IpHtmlPanel1.OpenURL(expandLocalHtmlFileName(ExtractFileNameWithoutExt(TmpFile)+'.html')) + finally + end +end; + +procedure TfrmCountyStat.btnSaveToClick(Sender: TObject); +begin + if dlgSave.Execute then + begin + cqrini.WriteString('CountyStat','Directory',ExtractFilePath(dlgSave.FileName)); + CopyFile(TmpFile,dlgSave.FileName) + end +end; + +procedure TfrmCountyStat.cmbBandsChange(Sender: TObject); +begin + tmrBlink.Enabled:=True; + pbTot.Position:=0; +end; + +procedure TfrmCountyStat.WriteHMTLHeader; +begin + AssignFile(f,TmpFile); + Rewrite(f); + writeln(f,'<html>'); + Writeln(f,'<head>'); + writeln(f,'<meta http-equiv="content-type" content="text/html; charset=utf-8">'); + writeln(f,'<meta name="generator" content="CQRLOG '+cVERSION+', www.cqrlog.com">'); + writeln(f,'<title>County statistic ('+cqrini.ReadString('Station','Call','')+')'); + writeln(f,''); + writeln(f,''); + Writeln(f,''); + Writeln(f,'

      County statistic


      '); + Writeln(f,'Station:'+cqrini.ReadString('Station','Call','')+'; Band: '+cmbBands.Text); + Writeln(f,'
      '); + Writeln(f,'
      ') +end; + +procedure TfrmCountyStat.FormShow(Sender: TObject); +begin + TmpFile := GetTempFileNameUTF8(dmData.HomeDir,'county'); + dmUtils.LoadForm(frmCountyStat); + dmUtils.FillBandCombo(cmbBands); + cmbBands.Items.Insert(0,'ALL'); + if cqrini.ReadInteger('CountyStat','Band',0) > cmbBands.Items.Count-1 then + cmbBands.ItemIndex := 0 + else + cmbBands.ItemIndex := cqrini.ReadInteger('CountyStat','Band',0); + + chkQSL.Checked := cqrini.ReadBool('CountyStat','QSL',False); + chkLoTW.Checked := cqrini.ReadBool('CountyStat','LoTW',False); + chkeQSL.Checked := cqrini.ReadBool('CountyStat','eQSL',False); + dlgSave.InitialDir := cqrini.ReadString('CountyStat','Directory',dmData.UsrHomeDir); + + IpHtmlPanel1.Font.Color := clBlack; + pbTot.Min:=0; + pbTot.Max:=1; + pbTot.Smooth:=True; + pbTot.Step:=1; + pbTot.Enabled:=True; + pbTot.Position:=0; + tmrBlink.Enabled:=False; + lblFilterActive.Visible:= dmData.IsFilter; + cmbBandsChange(nil); +end; + +procedure TfrmCountyStat.tmrBlinkStartTimer(Sender: TObject); +begin + btnRefresh.Caption:='Press to'; + btnRefresh.Font.Color:=clGreen; + btnRefresh.Repaint; +end; + +procedure TfrmCountyStat.tmrBlinkStopTimer(Sender: TObject); +begin + btnRefresh.Caption:='Refresh statistic'; + btnRefresh.Font.Color:=clDefault; + btnRefresh.Repaint; +end; + +procedure TfrmCountyStat.tmrBlinkTimer(Sender: TObject); +var + C :Tcolor; + T:String; +begin + case odd(SecondOf(Now)) of + True: Begin + C := clGreen; + T :='run statistic' + end; + False: Begin + C := clGreen; + T :='Press to' + end; + end; + btnRefresh.Caption:= T; + btnRefresh.Font.Color:=C; + btnRefresh.Repaint; +end; + +end. + diff --git a/src/fDBConnect.pas b/src/fDBConnect.pas index 65b8c96..1844023 100644 --- a/src/fDBConnect.pas +++ b/src/fDBConnect.pas @@ -317,6 +317,10 @@ begin end; procedure TfrmDBConnect.btnNewLogClick(Sender: TObject); +var + db :string; + cnr,nr :integer; + l :TStringList; begin frmNewLog := TfrmNewLog.Create(nil); try @@ -324,15 +328,45 @@ begin frmNewLog.ShowModal; if frmNewLog.ModalResult = mrOK then begin - //if dmData.LogName <> '' then - // dmData.CloseDatabases; - dmData.CreateDatabase(StrToInt(frmNewLog.edtLogNR.Text), - frmNewLog.edtLogName.Text); - UpdateGridFields - end + dmData.CreateDatabase(StrToInt(frmNewLog.edtLogNR.Text),frmNewLog.edtLogName.Text); + UpdateGridFields; + if frmNewLog.edtLogCpyNR.Text<>'' then + Begin + cnr:=StrToInt(frmNewLog.edtLogCpyNR.Text); //this nr log exists and strtoint works: tested in "newlog" + db := dmData.GetProperDBName(cnr); + if dmData.DBName<>'' then + dmData.SaveConfigFile; + dmData.Q.Close; + if dmData.trQ.Active then dmData.trQ.Rollback; + dmData.Q.SQL.Text := 'select config_file from '+db+'.cqrlog_config'; + dmData.trQ.StartTransaction; + l := TStringList.Create; + try try + dmData.Q.Open; + l.Text := dmData.Q.Fields[0].AsString; + nr:=StrToInt(frmNewLog.edtLogNR.Text); //this nr log just created strtoint works: tested in "newlog" + db := dmData.GetProperDBName(nr); + dmData.Q.Close; + if dmData.trQ.Active then dmData.trQ.Rollback; + dmData.Q.SQL.Text := 'update '+db+'.cqrlog_config set config_file =:config_file'; + dmData.trQ.StartTransaction; + dmData.Q.Params[0].AsString := l.Text; + dmData.Q.ExecSQL + except + dmData.trQ.Rollback + end; + dmData.trQ.Commit; + ShowMessage('Config copied successfully') + finally + dmData.Q.Close; + l.Free + end; + + end; + end; finally frmNewLog.Free - end + end; end; procedure TfrmDBConnect.btnOpenLogClick(Sender: TObject); @@ -456,6 +490,7 @@ procedure TfrmDBConnect.mnuExportClick(Sender: TObject); var db : String; l : TStringList; + n : String; begin if dlgSave.Execute then begin @@ -470,8 +505,11 @@ begin try dmData.Q.Open; l.Text := dmData.Q.Fields[0].AsString; - l.SaveToFile(dlgSave.FileName); - ShowMessage('Config file saved to '+dlgSave.FileName + n:= dlgSave.FileName; + if pos('.INI',UpperCase(n))=0 then + n:=n+'.ini'; + l.SaveToFile(n); + ShowMessage('Config file saved to '+n +#10+#13+#10+#13+'Warning !'+#10+#13+'File may contain passwords'+#10+#13+'in plain text format') finally dmData.Q.Close; @@ -487,28 +525,33 @@ var l : TStringList; begin if dlgOpen.Execute then - begin - db := dmData.GetProperDBName(dmData.qLogList.Fields[0].AsInteger); - dmData.Q.Close; - if dmData.trQ.Active then dmData.trQ.Rollback; - dmData.Q.SQL.Text := 'update '+db+'.cqrlog_config set config_file =:config_file'; - dmData.trQ.StartTransaction; - l := TStringList.Create; - try try - l.LoadFromFile(dlgOpen.FileName); - dmData.Q.Params[0].AsString := l.Text; - if dmData.DebugLevel >=1 then Writeln(dmData.Q.SQL.Text); - dmData.Q.ExecSQL - except - dmData.trQ.Rollback - end; - dmData.trQ.Commit; - ShowMessage('Config file imported successfully') - finally - dmData.Q.Close; - l.Free - end - end + begin + if FileExists(dlgOpen.FileName) then //with QT5 opendialog user can enter filename that may not exist + begin + db := dmData.GetProperDBName(dmData.qLogList.Fields[0].AsInteger); + dmData.Q.Close; + if dmData.trQ.Active then dmData.trQ.Rollback; + dmData.Q.SQL.Text := 'update '+db+'.cqrlog_config set config_file =:config_file'; + dmData.trQ.StartTransaction; + l := TStringList.Create; + try try + l.LoadFromFile(dlgOpen.FileName); + dmData.Q.Params[0].AsString := l.Text; + if dmData.DebugLevel >=1 then Writeln(dmData.Q.SQL.Text); + dmData.Q.ExecSQL + except + dmData.trQ.Rollback + end; + dmData.trQ.Commit; + ShowMessage('Config file imported successfully') + finally + dmData.Q.Close; + l.Free + end + end + else + ShowMessage('File not found!'); + end end; procedure TfrmDBConnect.mnuRepairClick(Sender : TObject); diff --git a/src/fDXCluster.lfm b/src/fDXCluster.lfm index 0e0c730..0942771 100644 --- a/src/fDXCluster.lfm +++ b/src/fDXCluster.lfm @@ -1,13 +1,13 @@ object frmDXCluster: TfrmDXCluster Left = 129 - Height = 424 + Height = 425 Top = 116 Width = 709 HelpType = htKeyword HelpKeyword = 'help/h21.html#ah19' ActiveControl = pgDXCluster Caption = 'DXCluster' - ClientHeight = 424 + ClientHeight = 425 ClientWidth = 709 Icon.Data = { BE0C00000000010001002020000001001800A80C000016000000280000002000 @@ -121,10 +121,10 @@ object frmDXCluster: TfrmDXCluster OnDestroy = FormDestroy OnKeyUp = FormKeyUp OnShow = FormShow - LCLVersion = '1.6.4.0' + LCLVersion = '2.2.6.0' object pgDXCluster: TPageControl Left = 0 - Height = 424 + Height = 425 Top = 0 Width = 709 ActivePage = tabTelnet @@ -133,12 +133,12 @@ object frmDXCluster: TfrmDXCluster TabOrder = 0 object tabWeb: TTabSheet Caption = 'Web' - ClientHeight = 395 + ClientHeight = 394 ClientWidth = 699 object Panel4: TPanel Left = 0 Height = 36 - Top = 380 + Top = 358 Width = 699 Align = alBottom ClientHeight = 36 @@ -197,14 +197,13 @@ object frmDXCluster: TfrmDXCluster end object pnlWeb: TPanel Left = 0 - Height = 380 + Height = 358 Top = 0 Width = 699 Align = alClient Alignment = taLeftJustify BevelInner = bvLowered BevelOuter = bvLowered - Color = clDefault Font.CharSet = ANSI_CHARSET Font.Height = 12 Font.Name = 'DejaVu Sans Mono 12' @@ -215,12 +214,12 @@ object frmDXCluster: TfrmDXCluster end object tabTelnet: TTabSheet Caption = 'Telnet' - ClientHeight = 395 + ClientHeight = 394 ClientWidth = 699 object Panel1: TPanel Left = 0 Height = 34 - Top = 361 + Top = 360 Width = 699 Align = alBottom BevelOuter = bvNone @@ -229,7 +228,7 @@ object frmDXCluster: TfrmDXCluster TabOrder = 0 object Label1: TLabel Left = 6 - Height = 15 + Height = 17 Top = 11 Width = 71 Caption = 'Command:' @@ -239,7 +238,7 @@ object frmDXCluster: TfrmDXCluster AnchorSideLeft.Control = Label1 AnchorSideLeft.Side = asrBottom Left = 79 - Height = 32 + Height = 34 Top = 3 Width = 266 BorderSpacing.Left = 2 @@ -299,7 +298,7 @@ object frmDXCluster: TfrmDXCluster TabOrder = 1 object edtTelAddress: TEdit Left = 8 - Height = 32 + Height = 34 Top = 1 Width = 189 TabOrder = 0 @@ -336,14 +335,13 @@ object frmDXCluster: TfrmDXCluster end object pnlTelnet: TPanel Left = 0 - Height = 331 + Height = 330 Top = 30 Width = 699 Align = alClient BevelOuter = bvNone - ClientHeight = 331 + ClientHeight = 330 ClientWidth = 699 - Color = clDefault ParentColor = False TabOrder = 2 object pnlChat: TPanel @@ -353,36 +351,286 @@ object frmDXCluster: TfrmDXCluster Width = 699 Align = alTop BevelOuter = bvNone - Color = clDefault ParentColor = False TabOrder = 0 end end end + object tabFkeys: TTabSheet + Caption = 'F-keys' + ClientHeight = 394 + ClientWidth = 699 + OnShow = tabFkeysShow + object lblF1: TLabel + AnchorSideLeft.Control = tabFkeys + AnchorSideTop.Control = edtF1 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 32 + Width = 24 + BorderSpacing.Left = 12 + BorderSpacing.Top = 12 + Caption = 'F1 :' + ParentColor = False + end + object lblF2: TLabel + AnchorSideLeft.Control = lblF1 + AnchorSideTop.Control = edtF2 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 66 + Width = 24 + BorderSpacing.Top = 6 + Caption = 'F2 :' + ParentColor = False + end + object lblF3: TLabel + AnchorSideLeft.Control = lblF1 + AnchorSideTop.Control = edtF3 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 100 + Width = 24 + BorderSpacing.Top = 6 + Caption = 'F3 :' + ParentColor = False + end + object lblF4: TLabel + AnchorSideLeft.Control = lblF1 + AnchorSideTop.Control = edtF4 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 134 + Width = 24 + BorderSpacing.Top = 6 + Caption = 'F4 :' + ParentColor = False + end + object lblF5: TLabel + AnchorSideLeft.Control = lblF1 + AnchorSideTop.Control = edtF5 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 168 + Width = 24 + BorderSpacing.Top = 6 + Caption = 'F5 :' + ParentColor = False + end + object lblF6: TLabel + AnchorSideLeft.Control = lblF1 + AnchorSideTop.Control = edtF6 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 202 + Width = 24 + BorderSpacing.Top = 6 + Caption = 'F6 :' + ParentColor = False + end + object lblF7: TLabel + AnchorSideLeft.Control = lblF1 + AnchorSideTop.Control = edtF7 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 236 + Width = 24 + BorderSpacing.Top = 6 + Caption = 'F7 :' + ParentColor = False + end + object lblF8: TLabel + AnchorSideLeft.Control = lblF1 + AnchorSideTop.Control = edtF8 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 270 + Width = 24 + BorderSpacing.Top = 6 + Caption = 'F8 :' + ParentColor = False + end + object lblF9: TLabel + AnchorSideLeft.Control = lblF1 + AnchorSideTop.Control = edtF9 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 304 + Width = 24 + BorderSpacing.Top = 6 + Caption = 'F9 :' + ParentColor = False + end + object lblF10: TLabel + AnchorSideLeft.Control = lblF1 + AnchorSideTop.Control = edtF10 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 338 + Width = 32 + BorderSpacing.Top = 6 + Caption = 'F10 :' + ParentColor = False + end + object edtF1: TEdit + AnchorSideLeft.Control = lblF1 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = lblShift + AnchorSideTop.Side = asrBottom + Left = 48 + Height = 34 + Top = 23 + Width = 500 + BorderSpacing.Left = 12 + BorderSpacing.Top = 3 + OnExit = edtFExit + TabOrder = 0 + end + object edtF2: TEdit + AnchorSideLeft.Control = edtF1 + AnchorSideTop.Control = edtF1 + AnchorSideTop.Side = asrBottom + Left = 48 + Height = 34 + Top = 57 + Width = 500 + OnExit = edtFExit + TabOrder = 1 + end + object edtF3: TEdit + AnchorSideLeft.Control = edtF1 + AnchorSideTop.Control = edtF2 + AnchorSideTop.Side = asrBottom + Left = 48 + Height = 34 + Top = 91 + Width = 500 + OnExit = edtFExit + TabOrder = 2 + end + object edtF4: TEdit + AnchorSideLeft.Control = edtF1 + AnchorSideTop.Control = edtF3 + AnchorSideTop.Side = asrBottom + Left = 48 + Height = 34 + Top = 125 + Width = 500 + OnExit = edtFExit + TabOrder = 3 + end + object edtF5: TEdit + AnchorSideLeft.Control = edtF1 + AnchorSideTop.Control = edtF4 + AnchorSideTop.Side = asrBottom + Left = 48 + Height = 34 + Top = 159 + Width = 500 + OnExit = edtFExit + TabOrder = 4 + end + object edtF6: TEdit + AnchorSideLeft.Control = edtF1 + AnchorSideTop.Control = edtF5 + AnchorSideTop.Side = asrBottom + Left = 48 + Height = 34 + Top = 193 + Width = 500 + OnExit = edtFExit + TabOrder = 5 + end + object edtF7: TEdit + AnchorSideLeft.Control = edtF1 + AnchorSideTop.Control = edtF6 + AnchorSideTop.Side = asrBottom + Left = 48 + Height = 34 + Top = 227 + Width = 500 + OnExit = edtFExit + TabOrder = 6 + end + object edtF8: TEdit + AnchorSideLeft.Control = edtF1 + AnchorSideTop.Control = edtF7 + AnchorSideTop.Side = asrBottom + Left = 48 + Height = 34 + Top = 261 + Width = 500 + OnExit = edtFExit + TabOrder = 7 + end + object edtF9: TEdit + AnchorSideLeft.Control = edtF1 + AnchorSideTop.Control = edtF8 + AnchorSideTop.Side = asrBottom + Left = 48 + Height = 34 + Top = 295 + Width = 500 + OnExit = edtFExit + TabOrder = 8 + end + object edtF10: TEdit + AnchorSideLeft.Control = edtF1 + AnchorSideTop.Control = edtF9 + AnchorSideTop.Side = asrBottom + Left = 48 + Height = 34 + Top = 329 + Width = 500 + TabOrder = 9 + end + object lblShift: TLabel + AnchorSideLeft.Control = tabFkeys + AnchorSideTop.Control = tabFkeys + Left = 3 + Height = 17 + Top = 3 + Width = 41 + BorderSpacing.Left = 3 + BorderSpacing.Top = 3 + Caption = 'Shift+' + ParentColor = False + end + end end object tmrSpots: TTimer Enabled = False Interval = 20000 OnTimer = tmrSpotsTimer - left = 88 - top = 122 + Left = 440 + Top = 368 end object dlgDXfnt: TFontDialog MinFontSize = 0 MaxFontSize = 0 - left = 136 - top = 122 + Left = 488 + Top = 368 end object tmrAutoConnect: TTimer Enabled = False Interval = 3000 OnTimer = tmrAutoConnectTimer - left = 246 - top = 68 + Left = 536 + Top = 368 end object popPreferences: TPopupMenu - left = 385 - top = 112 + Left = 592 + Top = 368 object mnuCallalert: TMenuItem Caption = 'Callsign alert enabled' Checked = True @@ -428,8 +676,8 @@ object frmDXCluster: TfrmDXCluster end end object acPreferences: TActionList - left = 393 - top = 185 + Left = 640 + Top = 368 object acFont: TAction Caption = 'Font' OnExecute = acFontExecute diff --git a/src/fDXCluster.pas b/src/fDXCluster.pas index 621bf08..85c23d6 100644 --- a/src/fDXCluster.pas +++ b/src/fDXCluster.pas @@ -18,7 +18,7 @@ interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, inifiles, ExtCtrls, ComCtrls, StdCtrls, Buttons, httpsend, uColorMemo, - db, lcltype, Menus, ActnList, Spin, dynlibs, lNetComponents, lnet; + db, lcltype, Menus, ActnList, Spin, Grids, dynlibs, lNetComponents, lnet; type { TfrmDXCluster } @@ -40,8 +40,29 @@ type btnPreferences : TButton; dlgDXfnt: TFontDialog; edtCommand: TEdit; + edtF1: TEdit; + edtF10: TEdit; + edtF2: TEdit; + edtF3: TEdit; + edtF4: TEdit; + edtF5: TEdit; + edtF6: TEdit; + edtF7: TEdit; + edtF8: TEdit; + edtF9: TEdit; edtTelAddress: TEdit; Label1: TLabel; + lblShift: TLabel; + lblF1: TLabel; + lblF10: TLabel; + lblF2: TLabel; + lblF3: TLabel; + lblF4: TLabel; + lblF5: TLabel; + lblF6: TLabel; + lblF7: TLabel; + lblF8: TLabel; + lblF9: TLabel; lblInfo: TLabel; MenuItem1 : TMenuItem; mnuSkimQSLCheck: TMenuItem; @@ -62,6 +83,7 @@ type pnlTelnet: TPanel; pnlWeb: TPanel; popPreferences : TPopupMenu; + tabFkeys: TTabSheet; tabTelnet: TTabSheet; tabWeb: TTabSheet; tmrAutoConnect: TTimer; @@ -73,6 +95,8 @@ type procedure acProgPrefExecute(Sender : TObject); procedure Button2Click(Sender: TObject); procedure btnPreferencesClick(Sender : TObject); + procedure edtF2Exit(Sender: TObject); + procedure edtFExit(Sender: TObject); procedure FormActivate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure btnHelpClick(Sender: TObject); @@ -88,7 +112,8 @@ type procedure mnuCallalertClick(Sender : TObject); procedure mnuSkimAllowFreqClick(Sender: TObject); procedure mnuSkimQSLCheckClick(Sender: TObject); - procedure tmrAutoConnectTimer(Sender: TObject); + procedure tabFkeysShow(Sender: TObject); + procedure tmrAutoConnectTimer(Sender: TObject); procedure tmrSpotsTimer(Sender: TObject); procedure trChatSizeChange(Sender: TObject); procedure trChatSizeClick(Sender: TObject); @@ -124,6 +149,7 @@ type gcfgNotShow : String; gcfgCW : Boolean; gcfgSSB : Boolean; + gcfgDATA: Boolean; gcfgEU : Boolean; gcfgAS : Boolean; gcfgAF : Boolean; @@ -143,6 +169,7 @@ type procedure WebDbClick(where:longint;mb:TmouseButton;ms:TShiftState); procedure TelDbClick(where:longint;mb:TmouseButton;ms:TShiftState); + procedure SpotDbClick(Spot:String); procedure ConnectToWeb; procedure ConnectToTelnet; procedure SynWeb; @@ -154,11 +181,11 @@ type procedure ChangeCallAlertCaption; function ShowSpot(spot : String; var sColor : Integer; var Country : String; FromTelnet : Boolean = True) : Boolean; - function GetFreq(spot : String) : String; - function GetCall(spot : String; web : Boolean = False) : String; - function GetSplit(spot : String) :String; + function GetSplit(info : String) :String; procedure StoreLastCmd(LastCmd:string); function GetHistCmd:string; + function FontStylesToString(Styles: TFontStyles): string; + function StringToFontStyles(const Styles: string): TFontStyles; public ConWeb : Boolean; ConTelnet : Boolean; @@ -326,7 +353,7 @@ begin end; end; -procedure TfrmDXCluster.Button2Click(Sender: TObject); +procedure TfrmDXCluster.Button2Click(Sender: TObject); //this is debugger var TelThread : TTelThread = nil; begin @@ -363,6 +390,25 @@ begin popPreferences.PopUp(p.x, p.y) end; +procedure TfrmDXCluster.edtF2Exit(Sender: TObject); +begin + +end; + +procedure TfrmDXCluster.edtFExit(Sender: TObject); +begin + cqrini.WriteString('DXCluster','F1key',edtF1.Text); + cqrini.WriteString('DXCluster','F2key',edtF2.Text); + cqrini.WriteString('DXCluster','F3key',edtF3.Text); + cqrini.WriteString('DXCluster','F4key',edtF4.Text); + cqrini.WriteString('DXCluster','F5key',edtF5.Text); + cqrini.WriteString('DXCluster','F6key',edtF6.Text); + cqrini.WriteString('DXCluster','F7key',edtF7.Text); + cqrini.WriteString('DXCluster','F8key',edtF8.Text); + cqrini.WriteString('DXCluster','F9key',edtF9.Text); + cqrini.WriteString('DXCluster','F10key',edtF10.Text); +end; + procedure TfrmDXCluster.acProgPrefExecute(Sender : TObject); begin cqrini.WriteInteger('Pref', 'ActPageIdx', 10); //set DXCuster tab active. Number may change if preferences page change @@ -372,16 +418,43 @@ end; procedure TfrmDXCluster.acFontExecute(Sender : TObject); begin dlgDXfnt.Font.Name := cqrini.ReadString('DXCluster','Font','DejaVu Sans Mono'); + dlgDXfnt.Font.Style := StringToFontStyles(cqrini.ReadString('DXCluster','FontStyle','')); dlgDXfnt.Font.Size := cqrini.ReadInteger('DXCluster','FontSize',12); if dlgDXfnt.Execute then begin cqrini.WriteString('DXCluster','Font',dlgDXfnt.Font.Name); cqrini.WriteInteger('DXCluster','FontSize',dlgDXfnt.Font.Size); + cqrini.WriteString('DXCluster','FontStyle',FontStylesToString(dlgDXfnt.Font.Style)); WebSpots.SetFont(dlgDXfnt.Font); TelSpots.SetFont(dlgDXfnt.Font); ChatSpots.SetFont(dlgDXfnt.Font) end end; +function TfrmDXCluster.FontStylesToString(Styles: TFontStyles): string; +begin + Result := ''; + if fsBold in Styles then + Result := Result + 'B'; + if fsItalic in Styles then + Result := Result + 'I'; + if fsUnderline in Styles then + Result := Result + 'U'; + if fsStrikeOut in Styles then + Result := Result + 'S'; +end; + +function TfrmDXCluster.StringToFontStyles(const Styles: string): TFontStyles; +begin + Result := []; + if Pos('B', UpperCase(Styles)) > 0 then + Include(Result, fsBold); + if Pos('I', UpperCase(Styles)) > 0 then + Include(Result, fsItalic); + if Pos('U', UpperCase(Styles)) > 0 then + Include(Result, fsUnderline); + if Pos('S', UpperCase(Styles)) > 0 then + Include(Result, fsStrikeOut); +end; procedure TfrmDXCluster.acCallAlertExecute(Sender : TObject); begin @@ -408,6 +481,7 @@ begin FirstWebGet := True; lTelnet := TLTelnetClientComponent.Create(nil); ReloadDXCPref := True; + tabFkeys.TabVisible:=false; lTelnet.OnConnect := @lConnect; lTelnet.OnDisconnect := @lDisconnect; @@ -460,70 +534,85 @@ end; procedure TfrmDXCluster.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin - if (key= VK_ESCAPE) then - begin - frmNewQSO.ReturnToNewQSO; - key := 0 - end + if key = VK_ESCAPE then + begin + frmNewQSO.ReturnToNewQSO; + key := 0 + end; + if (Key >= VK_F1) and (Key <= VK_F10) and (ConTelnet = True) and (Shift = [ssShift]) then + begin + case key of + VK_F1 :Begin + if edtF1.Text<>'' then SendCommand(edtF1.Text); + key := 0 + end; + VK_F2 :Begin + if edtF2.Text<>'' then SendCommand(edtF2.Text); + key := 0 + end; + VK_F3 :Begin + if edtF3.Text<>'' then SendCommand(edtF3.Text); + key := 0 + end; + VK_F4 :Begin + if edtF4.Text<>'' then SendCommand(edtF4.Text); + key := 0 + end; + VK_F5 :Begin + if edtF5.Text<>'' then SendCommand(edtF5.Text); + key := 0 + end; + VK_F6 :Begin + if edtF6.Text<>'' then SendCommand(edtF6.Text); + key := 0 + end; + VK_F7 :Begin + if edtF7.Text<>'' then SendCommand(edtF7.Text); + key := 0 + end; + VK_F8 :Begin + if edtF8.Text<>'' then SendCommand(edtF8.Text); + key := 0 + end; + VK_F9 :Begin + if edtF9.Text<>'' then SendCommand(edtF9.Text); + key := 0 + end; + VK_F10 :Begin + if edtF10.Text<>'' then SendCommand(edtF10.Text); + key := 0 + end; + end; + end; end; - procedure TfrmDXCluster.WebDbClick(where:longint;mb:TmouseButton;ms:TShiftState); var spot : String = ''; tmp : Integer = 0; - freq : String = ''; - mode : String = ''; - call : String = ''; - etmp : Extended = 0; - stmp : String = ''; - i : Integer = 0; begin WebSpots.ReadLine(spot,tmp,tmp,tmp,where); - spot := copy(spot,i+6,Length(spot)-i-5); - spot := Trim(spot); - freq := GetFreq(spot); - call := GetCall(spot,True); - { - Writeln('WebDbClick*****'); - Writeln('Spot:',spot); - Writeln('Freq:',freq); - Writeln('Call:',call); - Writeln('***************'); - } - if NOT TryStrToFloat(freq,etmp) then - exit; - if (not dmData.BandModFromFreq(freq,mode,stmp)) or (mode='') then - exit; - - frmNewQSO.NewQSOFromSpot(call,freq,mode) + SpotDbClick(spot); end; procedure TfrmDXCluster.TelDbClick(where:longint;mb:TmouseButton;ms:TShiftState); var spot : String = ''; tmp : Integer = 0; + begin + TelSpots.ReadLine(spot,tmp,tmp,tmp,where); + SpotDbClick(spot); +end; +procedure TfrmDXCluster.SpotDbClick(Spot:String); +var freq : String = ''; mode : String = ''; call : String = ''; + info : String = ''; etmp : Extended = 0; stmp : String = ''; - i : Integer = 0; - f : Currency; -begin - TelSpots.ReadLine(spot,tmp,tmp,tmp,where); - if TryStrToCurr(copy(spot,1,Pos(' ',spot)-1),f) then - begin - freq := copy(spot,1,Pos(' ',spot)-1); - call := trim(copy(spot,Pos('.',spot)+2,14)) - end - else begin - spot := copy(spot,i+6,Length(spot)-i-5); - spot := Trim(spot); - freq := GetFreq(Spot); - call := GetCall(Spot, ConWeb) - end; - { - Writeln('TelDbClick*****'); +Begin + dmDXCluster.GetSplitSpot(spot,call,freq,info); + { Writeln('Spot:',spot); Writeln('Freq:',freq); Writeln('Call:',call); @@ -537,7 +626,6 @@ begin frmNewQSO.NewQSOFromSpot(call,freq,mode) end; - procedure TfrmDXCluster.FormShow(Sender: TObject); var f : TFont; @@ -546,6 +634,7 @@ begin try f.Name := cqrini.ReadString('DXCluster','Font','DejaVu Sans Mono'); f.Size := cqrini.ReadInteger('DXCluster','FontSize',12); + f.Style := StringToFontStyles(cqrini.ReadString('DXCluster','FontStyle','')); WebSpots.SetFont(f); TelSpots.SetFont(f) ; ChatSpots.SetFont(f) @@ -572,6 +661,8 @@ begin if cqrini.ReadBool('DXCluster', 'ConAfterRun', False) then tmrAutoConnect.Enabled := True; pnlChat.Height := cqrini.ReadInteger('DXCluster','ChatSize',2); //default now 2 = invisible + + tabFkeysShow(nil); end; procedure TfrmDXCluster.btnClearClick(Sender: TObject); @@ -612,12 +703,15 @@ begin begin StopAllConnections; btnTelConnect.Caption := 'Connect'; + tabFkeys.TabVisible:=false; ConWeb := False; end else begin ConnectToTelnet; btnTelConnect.Caption := 'Disconnect'; ConTelnet := True; + tabFkeys.TabVisible:=True; + pgDXCluster.ActivePage:=tabTelnet; if (Sender <> nil) then edtCommand.SetFocus end @@ -689,6 +783,20 @@ begin cqrini.WriteBool('Skimmer', 'QSLEnable', mnuSkimQSLCheck.Checked); end; +procedure TfrmDXCluster.tabFkeysShow(Sender: TObject); +begin + edtF1.Text:=cqrini.ReadString('DXCluster', 'F1key', ''); + edtF2.Text:=cqrini.ReadString('DXCluster', 'F2key', ''); + edtF3.Text:=cqrini.ReadString('DXCluster', 'F3key', ''); + edtF4.Text:=cqrini.ReadString('DXCluster', 'F4key', ''); + edtF5.Text:=cqrini.ReadString('DXCluster', 'F5key', ''); + edtF6.Text:=cqrini.ReadString('DXCluster', 'F6key', ''); + edtF7.Text:=cqrini.ReadString('DXCluster', 'F7key', ''); + edtF8.Text:=cqrini.ReadString('DXCluster', 'F8key', ''); + edtF9.Text:=cqrini.ReadString('DXCluster', 'F9key', ''); + edtF10.Text:=cqrini.ReadString('DXCluster', 'F10key', ''); +end; + procedure TfrmDXCluster.tmrAutoConnectTimer(Sender: TObject); begin tmrAutoConnect.Enabled := False; @@ -707,13 +815,13 @@ end; procedure TfrmDXCluster.lConnect(aSocket: TLSocket); begin btnTelConnect.Caption := 'Disconnect'; - ConTelnet := True + ConTelnet := True; end; procedure TfrmDXCluster.lDisconnect(aSocket: TLSocket); begin btnTelConnect.Caption := 'Connect'; - ConTelnet := False + ConTelnet := False; end; procedure TfrmDXCluster.lReceive(aSocket: TLSocket); @@ -804,7 +912,21 @@ begin end; end; itmp := Pos('DX DE',UpperCase(tmp)); - if (itmp > 0) or TryStrToFloat(copy(tmp,1,Pos(' ',tmp)-1),f) then + if (itmp > 0) or (TryStrToFloat(copy(tmp,1,Pos(' ',tmp)-1),f) and (UpperCase(tmp[1])<>'E')) then + { + Chk of tmp[1]<>'E' needed: + sh/he E6 + E6 Niue-E6: 16 degs - dist: 9440 mi, 15192 km Reciprocal heading: 352 degs + OH1KH de OH1RCF 1-Apr-2023 1000Z dxspider > + + E[number] at beginning of line passes tryStrToFLoat as scientific number expression + and we want to catch only numbers of frequencies in 12345.6 format. + They appear if "sh/dx" command is issued + + sh/dx 1 + 28074.0 JA6GXP 1-Apr-2023 1033Z FT8 -22dB from PM52 814Hz + OH1KH de OH1RCF 1-Apr-2023 1033Z dxspider > + } begin EnterCriticalsection(frmDXCluster.csTelnet); if dmData.DebugLevel>=1 then Writeln('Enter critical section On Receive'); @@ -910,41 +1032,33 @@ begin if dmData.DebugLevel >=1 then Writeln('Chat sizing Click'); end; -function TfrmDXCluster.GetFreq(spot : String) : String; +function TfrmDXCluster.GetSplit(info : String) : String; var - tmp : String; -begin - tmp := copy(spot,Pos(' ',spot),Pos('.',spot)+2 - Pos(' ',spot)); - Result := trim(tmp) -end; - -function TfrmDXCluster.GetSplit(spot : String) : String; -var - tmp : String; spl : String; spn : String; l : Integer; begin - tmp := copy(spot,34,Length(spot)-34); - //Writeln('tmp: ',tmp); - if Pos('UP',tmp)>0 then begin - spl:= copy(tmp,Pos('UP',tmp),13); + if Pos('UP',info)>0 then + begin + spl:= copy(info,Pos('UP',info),13); spn:='UP'; for l:=3 to Length(spl) do if Pos(spl[l],' 0123456789.,-+')>0 then spn:=spn+spl[l] else break; end; - if Pos('DOWN',tmp)>0 then begin - spl:= copy(tmp,Pos('DOWN',tmp),13); + if Pos('DOWN',info)>0 then + begin + spl:= copy(info,Pos('DOWN',info),13); spn:='DOWN'; for l:=5 to Length(spl) do if Pos(spl[l],' 0123456789.,-+')>0 then spn:=spn+spl[l] else break; end; - if Pos('QSX',tmp)>0 then begin - spl:= copy(tmp,Pos('QSX',tmp),13); + if Pos('QSX',info)>0 then + begin + spl:= copy(info,Pos('QSX',info),13); spn:='QSX'; for l:=4 to Length(spl) do if Pos(spl[l],' 0123456789.,-+')>0 then @@ -954,29 +1068,6 @@ begin Result := trim(spn) end; -function TfrmDXCluster.GetCall(spot : String; web : Boolean = False) : String; -var - tmp : String=''; -begin - if web then - begin - //Writeln('spot:',spot); - tmp := trim(copy(spot,Pos(' ',spot)+1, Length(spot) -(Pos(' ',spot)))); - //Writeln('tmp: ',tmp); - tmp := copy(tmp,Pos(' ',tmp)+1, Length(tmp) -(Pos(' ',tmp))); - //Writeln('tmp: ',tmp); - if Pos(' ',tmp) > 0 then - tmp := trim(copy(tmp,1,Pos(' ',tmp))); - //Writeln('tmp: ',tmp); - end - else begin - tmp := copy(spot,Pos('.',spot)+3,Length(spot)-Pos('.',spot)-1); - tmp := trim(tmp); - tmp := trim(copy(tmp,1,Pos(' ',tmp))) - end; - Result := tmp -end; - procedure TfrmDXCluster.StopAllConnections; begin if ConWeb then @@ -995,10 +1086,10 @@ var kmitocet : Extended = 0.0; call : String = ''; freq : String = ''; + info : String = ''; tmp : Integer = 0; band : String = ''; mode : String = ''; - freeText : String = ''; seznam : TStringList; i : Integer = 0; prefix : String = ''; @@ -1043,6 +1134,7 @@ var cfgCW : Boolean; cfgSSB : Boolean; + cfgDATA: Boolean; cfgEU : Boolean; cfgAS : Boolean; cfgAF : Boolean; @@ -1067,6 +1159,7 @@ begin iITU := giITU; cfgCW := gcfgCW; cfgSSB := gcfgSSB; + cfgDATA:= gcfgDATA; cfgEU := gcfgEU; cfgAS := gcfgAS; cfgNA := gcfgNA; @@ -1089,26 +1182,9 @@ begin finally LeaveCriticalSection(csDXCPref) end; - - spot := UpperCase(spot); - i := Pos('DX DE ',spot); - if i > 0 then - spot := copy(spot,i+6,Length(spot)-i-5); - - if TryStrToCurr(copy(spot,1,Pos(' ',spot)-1),f) then - begin - freq := copy(spot,1,Pos(' ',spot)-1); - call := trim(copy(spot,Pos('.',spot)+2,14)) - end - else begin - freq := GetFreq(Spot); - call := GetCall(Spot, ConWeb) - end; - - splitstr := GetSplit(Spot); - + dmDXCluster.GetSplitSpot(Spot,call,freq,info); + splitstr := GetSplit(info); kHz := Freq; - tmp := Pos('.',freq); if tmp > 0 then freq[tmp] := FormatSettings.DecimalSeparator; @@ -1180,7 +1256,7 @@ begin begin Result := false; if dmData.DebugLevel >=1 then - Writeln('Cannot show this sport because of settings ...'); + Writeln('Cannot show this spot because of Show only spots (band) settings ...'); exit end; @@ -1196,9 +1272,18 @@ begin Result := false end; - if (result = False) then - exit; + if not cfgDATA then + begin + if (mode=cqrini.ReadString('Band'+IntToStr(frmTRXControl.cmbRig.ItemIndex), 'Datamode', 'RTTY')) then + Result := false + end; + if (result = False) then + Begin + if dmData.DebugLevel >=1 then + Writeln('Cannot show this spot because of Show only spots (mode) settings ...'); + exit; + end; if wDXCC = '*' then begin if Pos(prefix+';',iDXCC) = 0 then @@ -1345,10 +1430,9 @@ begin // and connected to telnet cluster if (dmDXCluster.IsAlertCall(call,band,mode,cqrini.ReadBool('DxCluster', 'AlertRegExp', False))) then Begin - freeText:= dmDXCluster.GetfreeTextFromSpot('DX de '+spot); if dmData.DebugLevel >=1 then - Writeln('Spot is:',spot,#$0A,'----Call alerting is: ',call,',',band,',',mode,',',freq,',',freeText,'-----------'); - dmDXCluster.RunCallAlertCmd(call,band,mode,freq,freeText); + Writeln('Spot is:',spot,#$0A,'----Call alerting is: ',call,',',band,',',mode,',',freq,',',info,'-----------'); + dmDXCluster.RunCallAlertCmd(call,band,mode,freq,info); call :=''; end; if dmData.DebugLevel >=1 then @@ -1642,6 +1726,7 @@ begin giITU := cqrini.ReadString('BandMap','iITU',''); gcfgCW := cqrini.ReadBool('DXCluster','CW',true); gcfgSSB := cqrini.ReadBool('DXCluster','SSB',True); + gcfgDATA:= cqrini.ReadBool('DXCluster','DATA',True); gcfgEU := cqrini.ReadBool('BandMap','wEU',True); gcfgAS := cqrini.ReadBool('BandMap','wAS',True); gcfgNA := cqrini.ReadBool('BandMap','wNA',True); diff --git a/src/fDbSqlSel.lfm b/src/fDbSqlSel.lfm index 0e045a5..ab72174 100644 --- a/src/fDbSqlSel.lfm +++ b/src/fDbSqlSel.lfm @@ -9,7 +9,7 @@ object frmDbSqlSel: TfrmDbSqlSel Color = clWhite OnClose = FormClose OnCreate = FormCreate - LCLVersion = '2.2.0.4' + LCLVersion = '2.2.6.0' object gbLocalUser: TGroupBox AnchorSideLeft.Control = Owner AnchorSideTop.Control = rbExternal @@ -18,7 +18,7 @@ object frmDbSqlSel: TfrmDbSqlSel AnchorSideRight.Side = asrBottom Left = 6 Height = 89 - Top = 176 + Top = 177 Width = 429 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 6 @@ -65,9 +65,10 @@ object frmDbSqlSel: TfrmDbSqlSel Left = 331 Height = 17 Top = 1 - Width = 66 + Width = 62 Anchors = [akLeft, akBottom] Caption = 'Password' + ParentColor = False end object lblUsername: TLabel AnchorSideLeft.Control = edtUserName @@ -75,9 +76,10 @@ object frmDbSqlSel: TfrmDbSqlSel Left = 229 Height = 17 Top = 1 - Width = 68 + Width = 67 Anchors = [akLeft, akBottom] Caption = 'Username' + ParentColor = False end object lblIp: TLabel AnchorSideLeft.Control = edtIP @@ -85,9 +87,10 @@ object frmDbSqlSel: TfrmDbSqlSel Left = 6 Height = 17 Top = 1 - Width = 63 + Width = 60 Anchors = [akLeft, akBottom] Caption = 'IP addres' + ParentColor = False end object lblPort: TLabel AnchorSideLeft.Control = edtPort @@ -95,9 +98,10 @@ object frmDbSqlSel: TfrmDbSqlSel Left = 108 Height = 17 Top = 1 - Width = 30 + Width = 26 Anchors = [akLeft, akBottom] Caption = 'Port' + ParentColor = False end object edtPort: TEdit AnchorSideLeft.Control = edtIP @@ -134,13 +138,14 @@ object frmDbSqlSel: TfrmDbSqlSel AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = pnlWelcome AnchorSideTop.Side = asrBottom - Left = 34 + Left = 21 Height = 34 - Top = 43 - Width = 372 + Top = 44 + Width = 398 BorderSpacing.Top = 6 Caption = 'It seems you are trying to run this program for '#10'the first time. Do you want to save your Log data to:' Font.Style = [fsBold] + ParentColor = False ParentFont = False end object rbFolder: TRadioButton @@ -149,14 +154,16 @@ object frmDbSqlSel: TfrmDbSqlSel AnchorSideTop.Side = asrBottom Left = 24 Height = 23 - Top = 89 - Width = 288 + Hint = 'Log data is saved to ~/.config/cqrlog/database folder. '#10'Access to that data is done by starting a new SQL server thread for that.'#10'Unfortunately using this way to save logs causes most of database '#10'connection problems with CQRLOG.'#10'_______________________________________________'#10'For further information press "Please read"-button' + Top = 90 + Width = 284 BorderSpacing.Left = 24 BorderSpacing.Top = 12 Caption = 'your linux user folder (CQRLOG default)' Checked = True OnClick = rbFolderClick ParentShowHint = False + ShowHint = True TabOrder = 1 TabStop = True end @@ -166,12 +173,14 @@ object frmDbSqlSel: TfrmDbSqlSel AnchorSideTop.Side = asrBottom Left = 24 Height = 23 - Top = 115 - Width = 203 + Hint = 'Use SQL server already installed to your machine. Both Mysql or MariDB should work.'#10'CQRLOG tries first create SQL user with proper privileges to use the SQL server'#10'and then set proper values to "Database connection" window.'#10'This is done by ~/create_cqr_user.sh scipt that is tried to run with most common'#10'terminals xterm, gnome-terminal or lxterminal.'#10'If that fails you have to run script manually from your command-line console.'#10'_______________________________________________'#10'For further information press "Please read"-button' + Top = 116 + Width = 202 BorderSpacing.Top = 3 Caption = 'local machine''s SQL server' OnChange = rbLocalChange ParentShowHint = False + ShowHint = True TabOrder = 2 TabStop = True end @@ -181,12 +190,14 @@ object frmDbSqlSel: TfrmDbSqlSel AnchorSideTop.Side = asrBottom Left = 24 Height = 23 - Top = 141 - Width = 231 + Hint = 'Use SQL server anywhere. Both Mysql or MariDB should work.'#10'You have to define values to connect SQL server by yourself:'#10'Address, port, user and password required to connect to external SQL server.'#10'SQL user and privileges have to be created by SQL server administrator.'#10'Server can exist in your home network or Internet.'#10'With external networks VPN or SSH tunnel is recommended for security reasons.'#10'_______________________________________________'#10'For further information press "Please read"-button' + Top = 142 + Width = 226 BorderSpacing.Top = 3 Caption = 'external networked SQL server' OnChange = rbExternalChange ParentShowHint = False + ShowHint = True TabOrder = 3 TabStop = True end @@ -198,7 +209,7 @@ object frmDbSqlSel: TfrmDbSqlSel AnchorSideBottom.Side = asrBottom Left = 354 Height = 25 - Hint = 'Confirm your selection' + Hint = 'Confirm your selection and continue.'#10'______________________________________________________________'#10'If you made wrong selection remove ~/.config/cqrlog folder'#10'(before saving any qsos, all will be deleted if 1st option was used)'#10'and then start Cqrlog again to get back to this screen.' Top = 269 Width = 75 Anchors = [akRight, akBottom] @@ -206,6 +217,8 @@ object frmDbSqlSel: TfrmDbSqlSel BorderSpacing.Bottom = 12 Caption = 'OK' OnClick = btnOKClick + ParentShowHint = False + ShowHint = True TabOrder = 5 end object pnlWelcome: TPanel @@ -214,7 +227,7 @@ object frmDbSqlSel: TfrmDbSqlSel AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 30 - Height = 31 + Height = 32 Top = 6 Width = 381 Anchors = [akTop, akLeft, akRight] @@ -222,7 +235,7 @@ object frmDbSqlSel: TfrmDbSqlSel BorderSpacing.Left = 30 BorderSpacing.Top = 6 BorderSpacing.Right = 30 - ClientHeight = 31 + ClientHeight = 32 ClientWidth = 381 Color = clWhite ParentColor = False @@ -232,14 +245,15 @@ object frmDbSqlSel: TfrmDbSqlSel AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = pnlWelcome AnchorSideTop.Side = asrCenter - Left = 71 - Height = 29 + Left = 46 + Height = 30 Top = 1 - Width = 238 + Width = 289 Caption = 'Welcome to CQRLOG' Font.Color = clOlive Font.Height = 25 Font.Style = [fsBold, fsItalic] + ParentColor = False ParentFont = False end end @@ -249,7 +263,7 @@ object frmDbSqlSel: TfrmDbSqlSel AnchorSideRight.Side = asrBottom Left = 354 Height = 64 - Top = 89 + Top = 90 Width = 64 Picture.Data = { 1754506F727461626C654E6574776F726B47726170686963E423000089504E47 @@ -551,7 +565,7 @@ object frmDbSqlSel: TfrmDbSqlSel AnchorSideBottom.Side = asrBottom Left = 30 Height = 89 - Top = 176 + Top = 177 Width = 381 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 30 @@ -570,9 +584,10 @@ object frmDbSqlSel: TfrmDbSqlSel Left = 1 Height = 34 Top = 1 - Width = 370 + Width = 366 Caption = 'Cqrlog is creatng your first log, it might take some time.'#10'Please be patient!' Font.Color = clMaroon + ParentColor = False ParentFont = False ShowAccelChar = False WordWrap = True @@ -589,6 +604,7 @@ object frmDbSqlSel: TfrmDbSqlSel Anchors = [akLeft, akBottom] BorderSpacing.Left = 6 Font.Color = clRed + ParentColor = False ParentFont = False end object btnHelp: TSpeedButton @@ -596,6 +612,7 @@ object frmDbSqlSel: TfrmDbSqlSel AnchorSideRight.Control = btnOK Left = 232 Height = 25 + Hint = 'Did you read help of first start ?'#10'___________________'#10'PLEASE DO IT NOW !' Top = 269 Width = 116 Anchors = [akTop, akRight] diff --git a/src/fDefaultFreq.lfm b/src/fDefaultFreq.lfm index 58f1287..b812484 100644 --- a/src/fDefaultFreq.lfm +++ b/src/fDefaultFreq.lfm @@ -43,7 +43,7 @@ object frmDefaultFreq: TfrmDefaultFreq Height = 17 Top = 16 Width = 30 - Caption = 'RTTY' + Caption = 'DATA' ParentColor = False end object Label7: TLabel @@ -611,4 +611,4 @@ object frmDefaultFreq: TfrmDefaultFreq TabOrder = 66 Text = '70cm' end -end \ No newline at end of file +end diff --git a/src/fEDIExport.pas b/src/fEDIExport.pas index 0e6cbca..bb1e85b 100644 --- a/src/fEDIExport.pas +++ b/src/fEDIExport.pas @@ -199,6 +199,7 @@ var message : String; Operators : TStringList; OpString : String; + DBRecordCount : integer =0; //holds max record count; begin SaveSettings; date := dmUtils.GetDateTime(0); @@ -269,7 +270,10 @@ begin try try dmData.trQ.StartTransaction; dmData.Q.Open; + dmData.Q.Last; //to get proper count pbExport.Max := dmData.Q.RecordCount; + DBRecordCount := dmData.Q.RecordCount; + dmData.Q.First; while not dmData.Q.Eof do begin inc(QsoMax); @@ -312,7 +316,7 @@ begin if (i = 1) then startdate := StringReplace(dmData.Q.FieldByName('qsodate').AsString,'-','',[rfReplaceAll, rfIgnoreCase]); - if (i = dmData.Q.RecordCount) + if (i = DBRecordCount) then enddate := StringReplace(dmData.Q.FieldByName('qsodate').AsString,'-','',[rfReplaceAll, rfIgnoreCase]); if length(loc) = 4 then loc := loc +'LL'; diff --git a/src/fExLabelPrint.pas b/src/fExLabelPrint.pas index 7383b10..0bf6a71 100644 --- a/src/fExLabelPrint.pas +++ b/src/fExLabelPrint.pas @@ -63,7 +63,7 @@ var implementation {$R *.lfm} -uses dUtils, dData, uMyIni, fQSLExpPref, dDXCC,fMain; +uses dUtils, dData, uMyIni, fQSLExpPref, dDXCC,fMain, dLOgUpload; { TfrmExLabelPrint } procedure TfrmExLabelPrint.edtQSOsToLabelExit(Sender: TObject); @@ -559,6 +559,9 @@ begin exit end; + if cqrini.ReadBool('OnlineLog','IgnoreQSL',False) then + dmLogUpload.DisableOnlineLogSupport; + FieldCount := GetExpFieldCount; if dmData.DebugLevel >= 1 then Writeln('Field count: ', FieldCount); dmData.CreateQSLTmpTable; @@ -643,7 +646,10 @@ begin dmData.DropQSLTmpTable; lblProgress.Caption := 'Complete!'; CloseFile(f); - dmData.RefreshMainDatabase() + dmData.RefreshMainDatabase(); + + if cqrini.ReadBool('OnlineLog','IgnoreQSL',False) then + dmLogUpload.EnableOnlineLogSupport; end end; diff --git a/src/fFilter.pas b/src/fFilter.pas index 048b655..6590826 100644 --- a/src/fFilter.pas +++ b/src/fFilter.pas @@ -445,7 +445,7 @@ begin if chkNot.Checked then tmp:= 'NOT( '+tmp+' )'; tmp := 'SELECT * FROM view_cqrlog_main_by_qsodate WHERE ' + tmp + ' ' + grb_by +' ' + OrderBy; - + dmData.IsFilterSQL:=tmp; dmData.qCQRLOG.Close; dmData.qCQRLOG.SQL.Text := tmp; if dmData.DebugLevel >=1 then @@ -744,10 +744,15 @@ procedure TfrmFilter.btnLoadClick(Sender: TObject); begin dlgOpen.InitialDir := dmData.HomeDir; if dlgOpen.Execute then + begin + if FileExists(dlgOpen.FileName) then //with QT5 opendialog user can enter filename that may not exist Begin loadFilter(dlgOpen.FileName); if DirectLoad then btnOkClick(nil); - end; + end + else + ShowMessage('File not found!'); + end; end; procedure TfrmFilter.btnSaveClick(Sender: TObject); diff --git a/src/fFreq.lfm b/src/fFreq.lfm index 98dfa06..d221c72 100644 --- a/src/fFreq.lfm +++ b/src/fFreq.lfm @@ -111,7 +111,7 @@ object frmFreq: TfrmFreq Top = 18 Width = 180 BorderSpacing.Left = 230 - Caption = 'RTTY: (f>RTTY and f<=SSB)' + Caption = 'DATA: (f>DATA and f<=SSB)' ParentColor = False end object lblFreqNote4: TLabel @@ -126,7 +126,7 @@ object frmFreq: TfrmFreq end end object dsrFreq: TDataSource - DataSet = dmData.qBands + DataSet = dmData.qFreqs left = 130 top = 57 end diff --git a/src/fFreq.pas b/src/fFreq.pas index e8f5cb2..0ee9148 100644 --- a/src/fFreq.pas +++ b/src/fFreq.pas @@ -51,8 +51,8 @@ end; procedure TfrmFreq.FormClose(Sender : TObject; var CloseAction : TCloseAction); begin dmUtils.SaveWindowPos(frmFreq); - if dmData.trBands.Active then - dmData.trBands.Rollback + if dmData.trFreqs.Active then + dmData.trFreqs.Rollback end; procedure TfrmFreq.dbgrdFreqColumnSized(Sender : TObject); @@ -71,14 +71,14 @@ var begin with TfrmChangeFreq.Create(frmFreq) do try - band := dmData.qBands.Fields[1].AsString; - edtBegin.Text := FloatToStr(dmData.qBands.Fields[2].AsFloat); - edtEnd.Text := FloatToStr(dmData.qBands.Fields[3].AsFloat); - edtCW.Text := FloatToStr(dmData.qBands.Fields[4].AsFloat); - edtRTTY.Text := FloatToStr(dmData.qBands.Fields[5].AsFloat); - edtSSB.Text := FloatToStr(dmData.qBands.Fields[6].AsFloat); - edtRXOffset.Text := FloatToStr(dmData.qBands.Fields[7].AsFloat); - edtTXOffset.Text := FloatToStr(dmData.qBands.Fields[8].AsFloat); + band := dmData.qFreqs.Fields[1].AsString; + edtBegin.Text := FloatToStr(dmData.qFreqs.Fields[2].AsFloat); + edtEnd.Text := FloatToStr(dmData.qFreqs.Fields[3].AsFloat); + edtCW.Text := FloatToStr(dmData.qFreqs.Fields[4].AsFloat); + edtData.Text := FloatToStr(dmData.qFreqs.Fields[5].AsFloat); + edtSSB.Text := FloatToStr(dmData.qFreqs.Fields[6].AsFloat); + edtRXOffset.Text := FloatToStr(dmData.qFreqs.Fields[7].AsFloat); + edtTXOffset.Text := FloatToStr(dmData.qFreqs.Fields[8].AsFloat); ShowModal; if ModalResult = mrOK then @@ -88,7 +88,7 @@ begin StrToFloat(edtBegin.Text), StrToFloat(edtEnd.Text), StrToFloat(edtCW.Text), - StrToFloat(edtRTTY.Text), + StrToFloat(edtData.Text), StrToFloat(edtSSB.Text), StrToFloat(edtRXOffset.Text), StrToFloat(edtTXOffset.Text) @@ -106,29 +106,29 @@ const var i : Integer; begin - if dmData.trBands.Active then - dmData.trBands.Rollback; + if dmData.trFreqs.Active then + dmData.trFreqs.Rollback; - dmData.qBands.SQL.Text := C_SEL; - dmData.trBands.StartTransaction; - dmData.qBands.Open; + dmData.qFreqs.SQL.Text := C_SEL; + dmData.trFreqs.StartTransaction; + dmData.qFreqs.Open; dbgrdFreq.Columns[0].Visible := False; if (band<>'') then begin - dmData.qBands.DisableControls; + dmData.qFreqs.DisableControls; try - dmData.qBands.First; - while not dmData.qBands.Eof do + dmData.qFreqs.First; + while not dmData.qFreqs.Eof do begin - if (dmData.qBands.Fields[1].AsString=band) then + if (dmData.qFreqs.Fields[1].AsString=band) then break else - dmData.qBands.Next + dmData.qFreqs.Next end finally - dmData.qBands.EnableControls + dmData.qFreqs.EnableControls end end; @@ -137,7 +137,7 @@ begin dbgrdFreq.Columns[2].Title.Caption := 'Begin'; dbgrdFreq.Columns[3].Title.Caption := 'End'; dbgrdFreq.Columns[4].Title.Caption := 'CW'; - dbgrdFreq.Columns[5].Title.Caption := 'RTTY'; + dbgrdFreq.Columns[5].Title.Caption := 'Data'; dbgrdFreq.Columns[6].Title.Caption := 'SSB'; dbgrdFreq.Columns[7].Title.Caption := 'RX offset'; dbgrdFreq.Columns[8].Title.Caption := 'TX offset'; diff --git a/src/fGrayline.lfm b/src/fGrayline.lfm index 22a98ad..dbf484b 100644 --- a/src/fGrayline.lfm +++ b/src/fGrayline.lfm @@ -1,7 +1,7 @@ object frmGrayline: TfrmGrayline - Left = 755 + Left = 547 Height = 248 - Top = 304 + Top = 125 Width = 419 Caption = 'Grayline' ClientHeight = 248 @@ -121,7 +121,7 @@ object frmGrayline: TfrmGrayline OnPaint = FormPaint OnShow = FormShow ShowHint = True - LCLVersion = '2.0.12.0' + LCLVersion = '2.2.6.0' object sbtnGrayLine: TSpeedButton Left = 400 Height = 16 @@ -204,6 +204,10 @@ object frmGrayline: TfrmGrayline Caption = 'Show LongPath' OnClick = pumShowLongPathClick end + object pumShowBeamPath: TMenuItem + Caption = 'Show BeamPath' + OnClick = pumShowBeamPathClick + end object pumMnuLine2: TMenuItem Caption = '-' end diff --git a/src/fGrayline.pas b/src/fGrayline.pas index a5de912..d0fdbfc 100644 --- a/src/fGrayline.pas +++ b/src/fGrayline.pas @@ -32,6 +32,7 @@ type acConnect : TAction; acShowStatusBar : TAction; acLinkToRbnMonitor: TAction; + pumShowBeamPath: TMenuItem; pumShowLongPath: TMenuItem; pumShowShortPath: TMenuItem; pumMnuLine2: TMenuItem; @@ -60,6 +61,7 @@ type procedure FormShow(Sender: TObject); procedure popGrayLinePopup(Sender: TObject); procedure pumClearAllSpotsClick(Sender: TObject); + procedure pumShowBeamPathClick(Sender: TObject); procedure pumShowLongPathClick(Sender: TObject); procedure pumShowShortPathClick(Sender: TObject); procedure pumWatchForClick(Sender: TObject); @@ -74,6 +76,7 @@ type delAfter : integer; watchFor : String; LocalDbg : boolean; + GC_lock : boolean; procedure lConnect(aSocket: TLSocket); procedure lDisconnect(aSocket: TLSocket); @@ -89,7 +92,8 @@ type pfx : String; rbn_status : String; procedure kresli; - procedure PlotGreatCircleArcLine(longitude1,latitude1,longitude2,latitude2:extended; LongP:boolean); + procedure PlotGreatCircleArcLine(longitude1,latitude1,longitude2,latitude2:extended; LongP:integer); + procedure CalculateLatLonOfNewPoint(BaseLon,BaseLat:extended;dist,bearing:integer;var lon2,lat2:extended); procedure SavePosition; procedure SynRBN; function GetEmptyPos : Word; @@ -105,7 +109,7 @@ implementation { TfrmGrayline } -uses dUtils, dData, uMyIni, dDXCluster, fNewQSO; +uses dUtils, dData, uMyIni, dDXCluster, fNewQSO, fRotControl; procedure TfrmGrayline.lConnect(aSocket: TLSocket); begin @@ -290,6 +294,7 @@ begin RBNSpotList[i].lat := 0; RBNSpotList[i].long := 0; end; + GC_lock:=false; ImageFile := dmData.HomeDir+'images'+PathDelim+'grayline.bmp'; if not FileExists(ImageFile) then ImageFile := ExpandFileNameUTF8('..'+PathDelim+'share'+PathDelim+'cqrlog'+ @@ -310,6 +315,7 @@ begin sbGrayLine.Visible := cqrini.ReadBool('Grayline','Statusbar',True); pumShowShortPath.Checked := cqrini.ReadBool('Grayline','ShortPath',False); pumShowLongPath.Checked := cqrini.ReadBool('Grayline','LongPath',False); + pumShowBeamPath.Checked := cqrini.ReadBool('Grayline','BeamPath',False); acShowStatusBar.Checked := sbGrayLine.Visible; rbn_status :='Disconnected'; sbGrayLine.SimpleText := rbn_status; @@ -319,6 +325,7 @@ begin delAfter := cqrini.ReadInteger('RBN','deleteAfter',60); tmrSpotDots.Interval :=1000; //remove Spots(DOts) timer will always run 1 sec period. tmrSpotDots.Enabled :=true; + ob^.GC_line_clear; end; procedure TfrmGrayline.FormCloseQuery(Sender: TObject; var CanClose: boolean); @@ -393,6 +400,16 @@ begin tmrSpotDots.Enabled:=true; end; +procedure TfrmGrayline.pumShowBeamPathClick(Sender: TObject); +begin + pumShowBeamPath.Checked:= not pumShowBeamPath.Checked; + cqrini.WriteBool('Grayline','BeamPath',pumShowBeamPath.Checked); + if pumShowBeamPath.Checked then + frmRotControl.BeamDir:=-1 + else + ob^.GC_line_clear(2); +end; + procedure TfrmGrayline.pumShowLongPathClick(Sender: TObject); begin pumShowLongPath.Checked:= not pumShowLongPath.Checked; @@ -506,12 +523,12 @@ begin s := ''; d := ''; dmUtils.CoordinateFromLocator(dmUtils.CompleteLoc(my_loc),lat,long); - if pumShowShortPath.Checked or pumShowLongPath.Checked then + if pumShowShortPath.Checked or pumShowLongPath.Checked then Begin if pumShowShortPath.Checked then - PlotGreatCircleArcLine(long,lat,long1,lat1,false); + PlotGreatCircleArcLine(long,lat,long1,lat1,0); if pumShowLongPath.Checked then - PlotGreatCircleArcLine(long,lat,long1,lat1,true); + PlotGreatCircleArcLine(long,lat,long1,lat1,1); end else ob^.jachcucaru(true,long,lat*-1,long1,lat1*-1); @@ -528,7 +545,59 @@ procedure TfrmGrayline.CalculateBearing(lat0, long0, lat1, long1: extended; var bearing := ArcTan2(y, x); end; -procedure TfrmGrayline.PlotGreatCircleArcLine(longitude1,latitude1,longitude2,latitude2:extended; LongP:boolean); +procedure TfrmGrayline.CalculateLatLonOfNewPoint(BaseLon,BaseLat:extended;dist,bearing:integer;var lon2,lat2:extended); +var R,B, + lon1, + lat1 :extended; + distCount, + stp,f:integer; + +Begin + + R:=6378.15; (* Radius of the earth *) + if LocalDbg then + begin + write('Lat:',FormatFloat('0.00;;',BaseLat)); + write(' Lon:',FormatFloat('0.00;;',BaseLon)); + write(' ',FormatFloat('0.00;;',bearing),' '); + end; +stp:=10; +lon1 := degToRad(BaseLon); +lat1 := degToRad(BaseLat); +B := degToRad(Bearing); +dist := dist+stp; //div results always at least 1 +distcount:=dist div stp; //we need to calculate in small steps. Otherwise precision errors become too visible + +for f:=1 to distcount do + Begin + lat2 := arcsin(sin(lat1) * cos(stp/R) + cos(lat1) * sin(stp/R) * cos(B)); + lon2 := lon1 +arctan2( sin(B) * sin(stp/R) * cos(lat1), + cos(stp/R) - sin(lat1) * sin(lat2) + ); + + if (lat2>87*pi/180) then break; //calculation fails on polar crossing with big beam lengths + if (lat2<-87*pi/180) then break; + + lat1:=lat2; + lon1:=lon2; + if LocalDbg then + begin + write('Lat>',FormatFloat('0.00;;',RadToDeg(lat1))); + writeln(' Lon>',FormatFloat('0.00;;',RadToDeg(lon1))); + end; + end; + + lat2:=RadToDeg(lat2); + lon2:=RadToDeg(lon2); + + if LocalDbg then + begin + write('Lat:',FormatFloat('0.00;;',lat2)); + writeln(' Lon:',FormatFloat('0.00;;',lon2)); + end; +end; + +procedure TfrmGrayline.PlotGreatCircleArcLine(longitude1,latitude1,longitude2,latitude2:extended; LongP:integer); { Ref: http://www.movable-type.co.uk/scripts/latlong.html } Const @@ -544,11 +613,16 @@ var LP : integer; //LongPath instead of ShortPath Begin +while GC_lock do + sleep(1); +GC_lock:=true; BaseStep := cqrini.ReadFloat('Program', 'GraylineGCstep',15E-001) * pi/180; PolarStep := Basestep/cqrini.ReadInteger('Program', 'GraylineGCstep',10); ob^.GC_LWidth := cqrini.ReadInteger('Program', 'GraylineGCLineWidth',2); +ob^.GB_LWidth := cqrini.ReadInteger('Program', 'GraylineGBeamLineWidth',2); ob^.GC_SP_Color:=StringToColor(cqrini.ReadString('Program', 'GraylineGCLineSPColor', 'clYellow' )); ob^.GC_LP_Color:=StringToColor(cqrini.ReadString('Program', 'GraylineGCLineLPColor', 'clFuchsia' )); +ob^.GC_BE_Color:=StringToColor(cqrini.ReadString('Program', 'GraylineGCLineBEColor', 'clRed' )); if LocalDbg then begin @@ -558,11 +632,12 @@ if LocalDbg then step := BaseStep; -if LongP then - LP:=1 - else - LP:=0; -ob^.GC_line_clear(LP); +case LongP of + 2 : LP:=0; //beam + 1 : LP:=1; //long path + 0 : LP:=0; //short path +end; +ob^.GC_line_clear(LongP); longitude1 := degToRad(longitude1); latitude1 := degToRad(latitude1); longitude2 := degToRad(longitude2); @@ -595,21 +670,21 @@ while (CountLimit > 0) do if abs(oldbearing -bearing) > (pi/2) then Begin if LocalDbg then - Begin - writeln('Obe:',round(radtodeg(oldbearing))); - writeln('Nbe:',round(radtodeg(bearing))); - end; + Begin + writeln('Obe:',round(radtodeg(oldbearing))); + writeln('Nbe:',round(radtodeg(bearing))); + end; if LP = 1 then begin if LocalDbg then - writeln ('Release LP value in count round ',CountLimit); + writeln ('Release LP value in count round ',CountLimit); LP:=0; //we are on globe's opposite side of target. Release LP and now on calculate rest via ShortPath CalculateBearing(latFrom, lonFrom, latitude2, longitude2, bearing); end else begin if LocalDbg then - writeln ('Stop counting in round ',CountLimit); + writeln ('Stop counting in round ',CountLimit); CountLimit:=0; end; end; @@ -634,14 +709,17 @@ while (CountLimit > 0) do or ((lonFrom < -MEC) and (longitude1 > MEC)) //left crossing ) then begin - if not LongP then - ob^.GC_line_part(RadToDeg(lonFrom),RadToDeg(latFrom)*-1,RadToDeg(longitude1),RadToDeg(latitude1)*-1) - else - ob^.GC_Lline_part(RadToDeg(lonFrom),RadToDeg(latFrom)*-1,RadToDeg(longitude1),RadToDeg(latitude1)*-1) + if LongP=0 then + ob^.GC_line_part(RadToDeg(lonFrom),RadToDeg(latFrom)*-1,RadToDeg(longitude1),RadToDeg(latitude1)*-1); + if LongP=1 then + ob^.GC_Lline_part(RadToDeg(lonFrom),RadToDeg(latFrom)*-1,RadToDeg(longitude1),RadToDeg(latitude1)*-1); + if (LongP=2) and (LP=0) then + ob^.GC_Bline_part(RadToDeg(lonFrom),RadToDeg(latFrom)*-1,RadToDeg(longitude1),RadToDeg(latitude1)*-1); end; oldbearing:=bearing; end; + GC_lock:=false; end; procedure TfrmGrayline.SavePosition; @@ -834,6 +912,5 @@ begin end; end; - end. diff --git a/src/fGroupEdit.lfm b/src/fGroupEdit.lfm index 2cf6871..24edf85 100644 --- a/src/fGroupEdit.lfm +++ b/src/fGroupEdit.lfm @@ -148,7 +148,7 @@ object frmGroupEdit: TfrmGroupEdit } OnShow = FormShow Position = poMainFormCenter - LCLVersion = '2.0.8.0' + LCLVersion = '2.2.6.0' object GroupBox1: TGroupBox AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner @@ -166,20 +166,19 @@ object frmGroupEdit: TfrmGroupEdit AnchorSideTop.Control = cmbField AnchorSideTop.Side = asrCenter Left = 12 - Height = 15 - Top = 10 + Height = 17 + Top = 9 Width = 34 BorderSpacing.Left = 12 Caption = 'Field:' ParentColor = False - OnClick = lblFieldClick end object lblValue: TLabel AnchorSideLeft.Control = lblField AnchorSideTop.Control = cmbValue AnchorSideTop.Side = asrCenter Left = 12 - Height = 15 + Height = 17 Top = 44 Width = 41 Caption = 'Value:' @@ -233,7 +232,7 @@ object frmGroupEdit: TfrmGroupEdit 'Contest name' 'Propagation mode' 'Satellite name' - 'Operator̈́' + 'Operator' 'DOK' ) OnChange = cmbFieldChange @@ -245,7 +244,7 @@ object frmGroupEdit: TfrmGroupEdit AnchorSideTop.Control = cmbField AnchorSideTop.Side = asrBottom Left = 96 - Height = 33 + Height = 34 Top = 35 Width = 312 BorderSpacing.Top = 3 @@ -260,7 +259,7 @@ object frmGroupEdit: TfrmGroupEdit AnchorSideTop.Side = asrBottom Left = 6 Height = 32 - Top = 72 + Top = 73 Width = 422 BorderSpacing.Top = 4 BorderWidth = 1 diff --git a/src/fGroupEdit.pas b/src/fGroupEdit.pas index 9381090..91fb963 100644 --- a/src/fGroupEdit.pas +++ b/src/fGroupEdit.pas @@ -38,7 +38,6 @@ type procedure cmbFieldChange(Sender: TObject); procedure cmbValueChange(Sender: TObject); procedure FormShow(Sender: TObject); - procedure lblFieldClick(Sender: TObject); private { private declarations } WhereTo: String; @@ -111,7 +110,7 @@ begin cmbValue.Style:=csDropDown; end; end; - pnlGrpEdt.Color:=clRed; + pnlGrpEdt.Color:=$005C5CFF; lblInfo.Caption := 'Backup your log! Operations can not be undone!'; btnCancel.Caption:='Cancel'; pnlGrpEdt.Repaint; @@ -120,7 +119,7 @@ end; procedure TfrmGroupEdit.cmbValueChange(Sender: TObject); begin - pnlGrpEdt.Color:=clRed; + pnlGrpEdt.Color:=$005C5CFF; lblInfo.Caption := 'Backup your log! Operations can not be undone!'; btnCancel.Caption:='Cancel'; pnlGrpEdt.Repaint; @@ -149,11 +148,6 @@ begin lblInfo.Repaint; end; -procedure TfrmGroupEdit.lblFieldClick(Sender: TObject); -begin - -end; - procedure TfrmGroupEdit.btnApplyClick(Sender: TObject); var sql : String = ''; @@ -162,7 +156,9 @@ var nr : Integer = 0; i : Integer = 0; aid : Array of LongInt; - + + +//------------------------------------------------------------------------------------------------------ procedure ChangeQSO(idx : LongInt); begin if update_dxcc then @@ -198,20 +194,36 @@ var dmData.trQ.Commit end; - inc(nr); pnlGrpEdt.Color:=clYellow; lblInfo.Caption := 'Working .... QSO nr. ' + IntToStr(nr); pnlGrpEdt.Repaint; lblInfo.Repaint end; - + +//------------------------------------------------------------------------------------------------------ + procedure DateErrSplash; + Begin + Application.MessageBox('Please enter correct date'+LineEnding+'as YYYY-MM-DD !','Error ...', mb_OK+mb_IconError); + end; + +//------------------------------------------------------------------------------------------------------ + function ClearDate:Boolean; + Begin + Result:=False; + if Application.MessageBox('Do you really want to clear DATE?', + 'Question ...',mb_YesNo+mb_IconQuestion+mb_DefButton2) = idYes then + Result:=True; + end; +//------------------------------------------------------------------------------------------------------ + + begin case cmbField.ItemIndex of 0 : begin if not dmUtils.IsDateOK(cmbValue.Text) then begin - Application.MessageBox('Please enter correct date!','Error ...', mb_OK+mb_IconError); + DateErrSplash; cmbValue.SetFocus; exit end; @@ -431,13 +443,17 @@ begin sql := 'qsl_s="",qsls_date=null' end; 23 : begin - if (not dmUtils.IsDateOK(cmbValue.Text))then + if (cmbValue.Text<>'') and (not dmUtils.IsDateOK(cmbValue.Text))then begin - Application.MessageBox('Please enter correct date!','Error ...', mb_OK+mb_IconError); + DateErrSplash; cmbValue.SetFocus; exit end; + if (cmbValue.Text<>'') then sql := 'qsls_date='+QuotedStr(cmbValue.Text) + else + if ClearDate then + sql := 'qsls_date=null'; end; 24 : begin if (cmbValue.ItemIndex=0) and (Application.MessageBox('Do you really want to clear QSL_R field?' @@ -458,13 +474,17 @@ begin sql := 'qsl_r="",qslr_date=null' end; 25 : begin - if (not dmUtils.IsDateOK(cmbValue.Text))then + if (cmbValue.Text<>'') and (not dmUtils.IsDateOK(cmbValue.Text))then begin - Application.MessageBox('Please enter correct date!','Error ...', mb_OK+mb_IconError); + DateErrSplash; cmbValue.SetFocus; exit end; + if (cmbValue.Text<>'') then sql := 'qslr_date='+QuotedStr(cmbValue.Text) + else + if ClearDate then + sql := 'qslr_date=null' end; 26 : begin if cmbValue.Text = 'Y' then @@ -476,7 +496,7 @@ begin 27 : begin if (not dmUtils.IsDateOK(cmbValue.Text))then begin - Application.MessageBox('Please enter correct date!','Error ...', mb_OK+mb_IconError); + DateErrSplash; cmbValue.SetFocus; exit end @@ -495,12 +515,12 @@ begin 29 : begin if (not dmUtils.IsDateOK(cmbValue.Text))then begin - Application.MessageBox('Please enter correct date!','Error ...', mb_OK+mb_IconError); + DateErrSplash; cmbValue.SetFocus; exit end else - sql := 'lotw_qslr='+QuotedStr('E')+',lotw_qslrdate='+ + sql := 'lotw_qslr='+QuotedStr('L')+',lotw_qslrdate='+ QuotedStr(cmbValue.Text) end; 30 : begin @@ -513,7 +533,7 @@ begin 31 : begin if (not dmUtils.IsDateOK(cmbValue.Text))then begin - Application.MessageBox('Please enter correct date!','Error ...', mb_OK+mb_IconError); + DateErrSplash; cmbValue.SetFocus; exit end @@ -531,7 +551,7 @@ begin 33 : begin if (not dmUtils.IsDateOK(cmbValue.Text))then begin - Application.MessageBox('Please enter correct date!','Error ...', mb_OK+mb_IconError); + DateErrSplash; cmbValue.SetFocus; exit end @@ -600,6 +620,7 @@ begin end; lblInfo.Caption := 'Group edit done '+WhereTo; btnCancel.Caption:= 'Close'; + btnApply.Enabled:=False; pnlGrpEdt.Color:= clLime; pnlGrpEdt.Repaint; lblInfo.Repaint; diff --git a/src/fImportLoTWWeb.lfm b/src/fImportLoTWWeb.lfm index 74f09b6..1941687 100644 --- a/src/fImportLoTWWeb.lfm +++ b/src/fImportLoTWWeb.lfm @@ -1,11 +1,11 @@ object frmImportLoTWWeb: TfrmImportLoTWWeb - Left = 632 - Height = 583 - Top = 98 + Left = 567 + Height = 600 + Top = 97 Width = 572 ActiveControl = pnlSettings Caption = 'Import from LoTW web site' - ClientHeight = 583 + ClientHeight = 600 ClientWidth = 572 Icon.Data = { BE0C00000000010001002020000001001800A80C000016000000280000002000 @@ -115,22 +115,26 @@ object frmImportLoTWWeb: TfrmImportLoTWWeb OnCloseQuery = FormCloseQuery OnShow = FormShow Position = poMainFormCenter - LCLVersion = '2.0.12.0' + LCLVersion = '2.2.6.0' object gbProgress: TGroupBox AnchorSideLeft.Control = pnlSettings - AnchorSideTop.Control = pnlSettings + AnchorSideTop.Side = asrBottom AnchorSideRight.Control = pnlSettings AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = pnlButtons AnchorSideBottom.Side = asrBottom - Left = 0 - Height = 377 - Top = 153 - Width = 572 + Left = 1 + Height = 364 + Top = 184 + Width = 570 Align = alClient + Anchors = [akLeft, akRight, akBottom] + BorderSpacing.Left = 1 + BorderSpacing.Right = 1 + BorderSpacing.Bottom = 1 Caption = 'Progress' - ClientHeight = 359 - ClientWidth = 570 + ClientHeight = 346 + ClientWidth = 568 TabOrder = 0 object mStat: TMemo AnchorSideLeft.Control = gbProgress @@ -139,11 +143,15 @@ object frmImportLoTWWeb: TfrmImportLoTWWeb AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = gbProgress AnchorSideBottom.Side = asrBottom - Left = 0 - Height = 359 - Top = 0 - Width = 570 + Left = 1 + Height = 344 + Top = 1 + Width = 566 Align = alClient + BorderSpacing.Left = 1 + BorderSpacing.Top = 1 + BorderSpacing.Right = 1 + BorderSpacing.Bottom = 1 OnChange = mStatChange ScrollBars = ssAutoBoth TabOrder = 0 @@ -153,48 +161,38 @@ object frmImportLoTWWeb: TfrmImportLoTWWeb AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner - Left = 3 - Height = 150 - Top = 3 - Width = 566 + Left = 1 + Height = 183 + Top = 1 + Width = 570 Align = alTop - BorderSpacing.Left = 3 - BorderSpacing.Top = 3 - BorderSpacing.Right = 3 + BorderSpacing.Left = 1 + BorderSpacing.Top = 1 + BorderSpacing.Right = 1 BevelOuter = bvNone - ClientHeight = 150 - ClientWidth = 566 + ClientHeight = 183 + ClientWidth = 570 TabOrder = 1 - object btnDownload: TButton - AnchorSideLeft.Control = gbSettings - AnchorSideTop.Control = gbSettings - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = gbSettings - AnchorSideRight.Side = asrBottom - Left = 0 - Height = 25 - Top = 116 - Width = 566 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 6 - Caption = 'Download data from ARRL website' - OnClick = btnDownloadClick - TabOrder = 0 - end object gbSettings: TGroupBox AnchorSideLeft.Control = pnlSettings AnchorSideTop.Control = pnlSettings AnchorSideRight.Control = pnlSettings AnchorSideRight.Side = asrBottom - Left = 0 - Height = 110 - Top = 0 - Width = 566 - Anchors = [akTop, akLeft, akRight] + AnchorSideBottom.Control = pnlSettings + AnchorSideBottom.Side = asrBottom + Left = 1 + Height = 181 + Top = 1 + Width = 568 + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Left = 1 + BorderSpacing.Top = 1 + BorderSpacing.Right = 1 + BorderSpacing.Bottom = 1 Caption = 'Settings' - ClientHeight = 92 - ClientWidth = 564 - TabOrder = 1 + ClientHeight = 163 + ClientWidth = 566 + TabOrder = 0 object lblReturnQsl: TLabel AnchorSideLeft.Control = gbSettings AnchorSideTop.Control = gbSettings @@ -215,43 +213,45 @@ object frmImportLoTWWeb: TfrmImportLoTWWeb Left = 269 Height = 34 Top = 3 - Width = 123 + Width = 190 BorderSpacing.Left = 3 TabOrder = 0 end object chkShowNew: TCheckBox AnchorSideLeft.Control = lblReturnQsl - AnchorSideTop.Control = edtCall + AnchorSideTop.Control = chkChangeDate AnchorSideTop.Side = asrBottom Left = 6 Height = 23 - Top = 40 + Top = 103 Width = 383 BorderSpacing.Top = 3 Caption = 'Show new comfirmed QSOs after download and import' TabOrder = 1 end object lblForCall: TLabel - AnchorSideLeft.Control = edtDateFrom AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = lblReturnQsl - Left = 395 + AnchorSideTop.Control = edtCall + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = edtDateFrom + Left = 221 Height = 17 - Top = 12 + Top = 46 Width = 45 - BorderSpacing.Left = 3 + Anchors = [akTop, akRight] + BorderSpacing.Right = 3 Caption = 'for call' ParentColor = False end object edtCall: TEdit AnchorSideLeft.Control = lblForCall AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = lblForCall - AnchorSideTop.Side = asrCenter - Left = 443 + AnchorSideTop.Control = edtDateFrom + AnchorSideTop.Side = asrBottom + Left = 269 Height = 34 - Top = 3 - Width = 109 + Top = 37 + Width = 190 BorderSpacing.Left = 3 TabOrder = 2 end @@ -261,36 +261,52 @@ object frmImportLoTWWeb: TfrmImportLoTWWeb AnchorSideTop.Side = asrBottom Left = 6 Height = 23 - Top = 63 + Top = 129 Width = 439 + BorderSpacing.Top = 3 Caption = 'Import station information from LoTW if it is not set during qso.' Checked = True OnChange = cbImportsChange State = cbChecked TabOrder = 3 end + object chkChangeDate: TCheckBox + AnchorSideLeft.Control = lblReturnQsl + AnchorSideTop.Control = edtCall + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 23 + Top = 77 + Width = 424 + BorderSpacing.Top = 6 + Caption = 'Set Rcvd date to be current date -1 after succesfull download' + OnChange = chkChangeDateChange + TabOrder = 4 + end end end object pnlButtons: TPanel AnchorSideLeft.Control = pnlSettings AnchorSideRight.Control = pnlSettings AnchorSideBottom.Control = Owner - Left = 0 + Left = 1 Height = 50 - Top = 530 - Width = 572 + Top = 549 + Width = 570 Align = alBottom - BorderSpacing.Bottom = 3 + BorderSpacing.Left = 1 + BorderSpacing.Right = 1 + BorderSpacing.Bottom = 1 BevelOuter = bvNone ClientHeight = 50 - ClientWidth = 572 + ClientWidth = 570 TabOrder = 2 object btnClose: TButton AnchorSideTop.Control = pnlButtons AnchorSideTop.Side = asrCenter AnchorSideRight.Control = pnlButtons AnchorSideRight.Side = asrBottom - Left = 494 + Left = 492 Height = 25 Top = 13 Width = 72 @@ -314,5 +330,19 @@ object frmImportLoTWWeb: TfrmImportLoTWWeb OnClick = btnPreferencesClick TabOrder = 1 end + object btnDownload: TButton + AnchorSideLeft.Control = pnlButtons + AnchorSideLeft.Side = asrCenter + AnchorSideTop.Control = pnlButtons + AnchorSideTop.Side = asrCenter + AnchorSideRight.Side = asrBottom + Left = 135 + Height = 25 + Top = 13 + Width = 300 + Caption = 'Download data from ARRL website' + OnClick = btnDownloadClick + TabOrder = 2 + end end end diff --git a/src/fImportLoTWWeb.pas b/src/fImportLoTWWeb.pas index 5f0af7b..36fcbf0 100644 --- a/src/fImportLoTWWeb.pas +++ b/src/fImportLoTWWeb.pas @@ -7,17 +7,18 @@ interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, httpsend, blcksock, StdCtrls, ExtCtrls, inifiles, ssl_openssl, ssl_openssl_lib, - synacode; + synacode, DateUtils; type { TfrmImportLoTWWeb } TfrmImportLoTWWeb = class(TForm) - btnDownload: TButton; btnClose: TButton; + btnDownload: TButton; btnPreferences: TButton; cbImports: TCheckBox; + chkChangeDate: TCheckBox; chkShowNew: TCheckBox; edtCall: TEdit; edtDateFrom: TEdit; @@ -30,6 +31,7 @@ type pnlSettings: TPanel; pnlButtons: TPanel; procedure cbImportsChange(Sender: TObject); + procedure chkChangeDateChange(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: boolean); procedure FormShow(Sender: TObject); procedure btnDownloadClick(Sender: TObject); @@ -169,6 +171,11 @@ begin Free end; mStat.Lines.Add('Import complete ...'); + if chkChangeDate.Checked then + Begin + edtDateFrom.Caption:= FormatDateTime('YYYY-MM-DD', IncDay(Today, -1)); + cqrini.WriteString('LoTWImp','DateFrom',FormatDateTime('YYYY-MM-DD', IncDay(Today, -1))); + end; if chkShowNew.Checked then begin mStat.Lines.Add(''); @@ -206,6 +213,7 @@ procedure TfrmImportLoTWWeb.FormShow(Sender: TObject); begin dmUtils.LoadWindowPos(self); chkShowNew.Checked := cqrini.ReadBool('LoTWImp','ShowNewQSOs',True); + chkChangeDate.Checked:=cqrini.ReadBool('LoTWImp','ChangeDate',False); edtDateFrom.Text := cqrini.ReadString('LoTWImp','DateFrom','1990-01-01'); edtCall.Text := cqrini.ReadString('LoTWImp','Call', cqrini.ReadString('Station','Call','')); @@ -224,6 +232,11 @@ begin cqrini.WriteBool('LoTWImp','Import',cbImports.Checked); end; +procedure TfrmImportLoTWWeb.chkChangeDateChange(Sender: TObject); +begin + cqrini.WriteBool('LoTWImp','ChangeDate',chkChangeDate.Checked); +end; + procedure TfrmImportLoTWWeb.SockCallBack (Sender: TObject; Reason: THookSocketReason; const Value: string); begin case Reason of diff --git a/src/fImportProgress.pas b/src/fImportProgress.pas index eb717d3..87fa2f7 100644 --- a/src/fImportProgress.pas +++ b/src/fImportProgress.pas @@ -645,7 +645,7 @@ mode := ''; //be sure there is no mode at this point 'QSLRDATE' : qslrdate:= data; end; //case end; //repeat - until pos('',uppercase(Buf))=1; + until (pos('',uppercase(Buf))=1) or (prik='EOR'); //store original modes modeorig:=uppercase(mode); submodeorig:=uppercase(submode); @@ -1013,6 +1013,7 @@ var qsl_via : String = ''; i : Integer = 0; begin + dmData.qCQRLOG.Last; //to get proper count lblComment.Caption := 'Inserting QSL managers ...'; pBarProg.Max := dmData.qCQRLOG.RecordCount; Application.ProcessMessages; diff --git a/src/fKeyTexts.lfm b/src/fKeyTexts.lfm index 0d75d72..c1406f3 100644 --- a/src/fKeyTexts.lfm +++ b/src/fKeyTexts.lfm @@ -1,15 +1,15 @@ object frmKeyTexts: TfrmKeyTexts Left = 371 - Height = 625 + Height = 651 Top = 27 - Width = 594 + Width = 616 HelpType = htKeyword HelpKeyword = 'help/h26.html' BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'CW Messages' - ClientHeight = 625 - ClientWidth = 594 + ClientHeight = 651 + ClientWidth = 616 Icon.Data = { BE0C00000000010001002020000001001800A80C000016000000280000002000 0000400000000100180000000000000C00006400000064000000000000000000 @@ -118,24 +118,24 @@ object frmKeyTexts: TfrmKeyTexts OnClose = FormClose OnShow = FormShow Position = poMainFormCenter - LCLVersion = '2.0.6.0' + LCLVersion = '2.2.6.0' object pnlControl: TPanel AnchorSideLeft.Control = Owner AnchorSideBottom.Control = Owner Left = 0 Height = 34 - Top = 591 - Width = 594 + Top = 617 + Width = 616 Align = alBottom BevelOuter = bvNone ClientHeight = 34 - ClientWidth = 594 + ClientWidth = 616 TabOrder = 0 object btnOK: TButton AnchorSideTop.Control = pnlControl AnchorSideTop.Side = asrCenter AnchorSideRight.Control = btnHelp - Left = 149 + Left = 160 Height = 25 Top = 5 Width = 75 @@ -150,7 +150,7 @@ object frmKeyTexts: TfrmKeyTexts AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = pnlControl AnchorSideTop.Side = asrCenter - Left = 260 + Left = 271 Height = 25 Top = 5 Width = 75 @@ -163,7 +163,7 @@ object frmKeyTexts: TfrmKeyTexts AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = pnlControl AnchorSideTop.Side = asrCenter - Left = 371 + Left = 382 Height = 25 Top = 5 Width = 75 @@ -180,691 +180,1341 @@ object frmKeyTexts: TfrmKeyTexts AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = pnlControl Left = 0 - Height = 591 + Height = 617 Top = 0 - Width = 594 + Width = 616 Anchors = [akTop, akLeft, akRight, akBottom] - ClientHeight = 591 - ClientWidth = 594 + ClientHeight = 617 + ClientWidth = 616 TabOrder = 1 - object GroupBox1: TGroupBox + object pgMemories: TPageControl AnchorSideLeft.Control = pnlMain AnchorSideTop.Control = pnlMain - Left = 7 - Height = 88 - Top = 7 - Width = 273 - BorderSpacing.Left = 6 - BorderSpacing.Top = 6 - Caption = ' F1 ' - ClientHeight = 62 - ClientWidth = 267 + AnchorSideRight.Control = pnlMain + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = pnlActions + Left = 1 + Height = 509 + Top = 1 + Width = 614 + Anchors = [akTop, akLeft, akRight, akBottom] TabOrder = 0 - object Label1: TLabel - AnchorSideLeft.Control = GroupBox1 - AnchorSideTop.Control = edtCapF1 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 4 - Width = 61 - BorderSpacing.Left = 12 - Caption = 'Caption: ' - ParentColor = False + object tabSeP: TTabSheet + AnchorSideLeft.Control = pgMemories + AnchorSideTop.Control = pgMemories + AnchorSideRight.Control = pgMemories + AnchorSideBottom.Control = pgMemories + Hint = 'Default memories when Contest window is closed.'#10'S&P memories when COntest window is open.' + Caption = 'S&&P (default)' + ClientHeight = 478 + ClientWidth = 604 + ParentShowHint = False + ShowHint = True + object GroupBox1: TGroupBox + AnchorSideLeft.Control = tabSeP + AnchorSideTop.Control = tabSeP + Left = 6 + Height = 88 + Top = 6 + Width = 290 + BorderSpacing.Left = 6 + BorderSpacing.Top = 6 + Caption = ' F1 ' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 0 + object Label1: TLabel + AnchorSideLeft.Control = GroupBox1 + AnchorSideTop.Control = edtCapF1 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 9 + Width = 58 + BorderSpacing.Left = 12 + Caption = 'Caption: ' + ParentColor = False + end + object Label2: TLabel + AnchorSideLeft.Control = Label1 + AnchorSideTop.Control = edtF1 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 43 + Width = 44 + Caption = 'Macro:' + ParentColor = False + end + object edtF1: TEdit + AnchorSideLeft.Control = edtCapF1 + AnchorSideTop.Control = edtCapF1 + AnchorSideTop.Side = asrBottom + Left = 82 + Height = 34 + Top = 34 + Width = 176 + TabOrder = 1 + end + object edtCapF1: TEdit + AnchorSideLeft.Control = Label1 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox1 + Left = 82 + Height = 34 + Top = 0 + Width = 88 + BorderSpacing.Left = 12 + TabOrder = 0 + end + end + object GroupBox10: TGroupBox + AnchorSideLeft.Control = GroupBox9 + AnchorSideTop.Control = GroupBox9 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = GroupBox9 + AnchorSideRight.Side = asrBottom + Left = 308 + Height = 88 + Top = 382 + Width = 290 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 6 + Caption = ' F10 ' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 9 + object Label35: TLabel + AnchorSideLeft.Control = GroupBox10 + AnchorSideTop.Control = edtCapF10 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 9 + Width = 58 + BorderSpacing.Left = 12 + Caption = 'Caption: ' + ParentColor = False + end + object Label36: TLabel + AnchorSideLeft.Control = Label35 + AnchorSideTop.Control = edtF10 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 43 + Width = 44 + Caption = 'Macro:' + ParentColor = False + end + object edtF10: TEdit + AnchorSideLeft.Control = edtCapF10 + AnchorSideTop.Control = edtCapF10 + AnchorSideTop.Side = asrBottom + Left = 82 + Height = 34 + Top = 34 + Width = 176 + TabOrder = 1 + end + object edtCapF10: TEdit + AnchorSideLeft.Control = Label35 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox10 + Left = 82 + Height = 34 + Top = 0 + Width = 88 + BorderSpacing.Left = 12 + TabOrder = 0 + end + end + object GroupBox9: TGroupBox + AnchorSideLeft.Control = GroupBox8 + AnchorSideTop.Control = GroupBox8 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = GroupBox8 + AnchorSideRight.Side = asrBottom + Left = 308 + Height = 88 + Top = 288 + Width = 290 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 6 + Caption = ' F9 ' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 8 + object Label33: TLabel + AnchorSideLeft.Control = GroupBox9 + AnchorSideTop.Control = edtCapF9 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 9 + Width = 58 + BorderSpacing.Left = 12 + Caption = 'Caption: ' + ParentColor = False + end + object Label34: TLabel + AnchorSideLeft.Control = Label33 + AnchorSideTop.Control = edtF9 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 43 + Width = 44 + Caption = 'Macro:' + ParentColor = False + end + object edtF9: TEdit + AnchorSideLeft.Control = edtCapF9 + AnchorSideTop.Control = edtCapF9 + AnchorSideTop.Side = asrBottom + Left = 82 + Height = 34 + Top = 34 + Width = 176 + TabOrder = 1 + end + object edtCapF9: TEdit + AnchorSideLeft.Control = Label33 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox9 + Left = 82 + Height = 34 + Top = 0 + Width = 88 + BorderSpacing.Left = 12 + TabOrder = 0 + end + end + object GroupBox8: TGroupBox + AnchorSideLeft.Control = GroupBox7 + AnchorSideTop.Control = GroupBox7 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = GroupBox7 + AnchorSideRight.Side = asrBottom + Left = 308 + Height = 88 + Top = 194 + Width = 290 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 6 + Caption = ' F8 ' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 7 + object Label15: TLabel + AnchorSideLeft.Control = GroupBox8 + AnchorSideTop.Control = edtCapF8 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 9 + Width = 58 + BorderSpacing.Left = 12 + Caption = 'Caption: ' + ParentColor = False + end + object Label16: TLabel + AnchorSideLeft.Control = Label15 + AnchorSideTop.Control = edtF8 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 43 + Width = 44 + Caption = 'Macro:' + ParentColor = False + end + object edtF8: TEdit + AnchorSideLeft.Control = edtCapF8 + AnchorSideTop.Control = edtCapF8 + AnchorSideTop.Side = asrBottom + Left = 82 + Height = 34 + Top = 34 + Width = 176 + TabOrder = 1 + end + object edtCapF8: TEdit + AnchorSideLeft.Control = Label15 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox8 + Left = 82 + Height = 34 + Top = 0 + Width = 88 + BorderSpacing.Left = 12 + TabOrder = 0 + end + end + object GroupBox7: TGroupBox + AnchorSideLeft.Control = GroupBox6 + AnchorSideTop.Control = GroupBox6 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = GroupBox6 + AnchorSideRight.Side = asrBottom + Left = 308 + Height = 88 + Top = 100 + Width = 290 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 6 + Caption = ' F7 ' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 6 + object Label13: TLabel + AnchorSideLeft.Control = GroupBox7 + AnchorSideTop.Control = edtCapF7 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 9 + Width = 58 + BorderSpacing.Left = 12 + Caption = 'Caption: ' + ParentColor = False + end + object Label14: TLabel + AnchorSideLeft.Control = Label13 + AnchorSideTop.Control = edtF7 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 43 + Width = 44 + Caption = 'Macro:' + ParentColor = False + end + object edtF7: TEdit + AnchorSideLeft.Control = edtCapF7 + AnchorSideTop.Control = edtCapF7 + AnchorSideTop.Side = asrBottom + Left = 82 + Height = 34 + Top = 34 + Width = 176 + TabOrder = 1 + end + object edtCapF7: TEdit + AnchorSideLeft.Control = Label13 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox7 + Left = 82 + Height = 34 + Top = 0 + Width = 88 + BorderSpacing.Left = 12 + TabOrder = 0 + end + end + object GroupBox6: TGroupBox + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = tabSeP + AnchorSideRight.Control = tabSeP + AnchorSideRight.Side = asrBottom + Left = 308 + Height = 88 + Top = 6 + Width = 290 + Anchors = [akTop, akRight] + BorderSpacing.Top = 6 + BorderSpacing.Right = 6 + Caption = ' F6 ' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 5 + object Label11: TLabel + AnchorSideLeft.Control = GroupBox6 + AnchorSideTop.Control = edtCapF6 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 9 + Width = 58 + BorderSpacing.Left = 12 + Caption = 'Caption: ' + ParentColor = False + end + object Label12: TLabel + AnchorSideLeft.Control = Label11 + AnchorSideTop.Control = edtF6 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 43 + Width = 44 + Caption = 'Macro:' + ParentColor = False + end + object edtF6: TEdit + AnchorSideLeft.Control = edtCapF6 + AnchorSideTop.Control = edtCapF6 + AnchorSideTop.Side = asrBottom + Left = 82 + Height = 34 + Top = 34 + Width = 176 + TabOrder = 1 + end + object edtCapF6: TEdit + AnchorSideLeft.Control = Label11 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox6 + Left = 82 + Height = 34 + Top = 0 + Width = 88 + BorderSpacing.Left = 12 + TabOrder = 0 + end + end + object GroupBox5: TGroupBox + AnchorSideLeft.Control = GroupBox4 + AnchorSideTop.Control = GroupBox4 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = GroupBox4 + AnchorSideRight.Side = asrBottom + Left = 6 + Height = 88 + Top = 382 + Width = 290 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 6 + Caption = ' F5 ' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 4 + object Label9: TLabel + AnchorSideLeft.Control = GroupBox5 + AnchorSideTop.Control = edtCapF5 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 9 + Width = 58 + BorderSpacing.Left = 12 + Caption = 'Caption: ' + ParentColor = False + end + object Label10: TLabel + AnchorSideLeft.Control = Label9 + AnchorSideTop.Control = edtF5 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 43 + Width = 44 + Caption = 'Macro:' + ParentColor = False + end + object edtF5: TEdit + AnchorSideLeft.Control = edtCapF5 + AnchorSideTop.Control = edtCapF5 + AnchorSideTop.Side = asrBottom + Left = 82 + Height = 34 + Top = 34 + Width = 176 + TabOrder = 1 + end + object edtCapF5: TEdit + AnchorSideLeft.Control = Label9 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox5 + Left = 82 + Height = 34 + Top = 0 + Width = 88 + BorderSpacing.Left = 12 + TabOrder = 0 + end + end + object GroupBox4: TGroupBox + AnchorSideLeft.Control = GroupBox3 + AnchorSideTop.Control = GroupBox3 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = GroupBox3 + AnchorSideRight.Side = asrBottom + Left = 6 + Height = 88 + Top = 288 + Width = 290 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 6 + Caption = ' F4 ' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 3 + object Label7: TLabel + AnchorSideLeft.Control = GroupBox4 + AnchorSideTop.Control = edtCapF4 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 9 + Width = 58 + BorderSpacing.Left = 12 + Caption = 'Caption: ' + ParentColor = False + end + object Label8: TLabel + AnchorSideLeft.Control = Label7 + AnchorSideTop.Control = edtF4 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 43 + Width = 44 + Caption = 'Macro:' + ParentColor = False + end + object edtF4: TEdit + AnchorSideLeft.Control = edtCapF4 + AnchorSideTop.Control = edtCapF4 + AnchorSideTop.Side = asrBottom + Left = 82 + Height = 34 + Top = 34 + Width = 176 + TabOrder = 1 + end + object edtCapF4: TEdit + AnchorSideLeft.Control = Label7 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox4 + Left = 82 + Height = 34 + Top = 0 + Width = 88 + BorderSpacing.Left = 12 + TabOrder = 0 + end + end + object GroupBox3: TGroupBox + AnchorSideLeft.Control = GroupBox2 + AnchorSideTop.Control = GroupBox2 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = GroupBox2 + AnchorSideRight.Side = asrBottom + Left = 6 + Height = 88 + Top = 194 + Width = 290 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 6 + Caption = ' F3 ' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 2 + object Label5: TLabel + AnchorSideLeft.Control = GroupBox3 + AnchorSideTop.Control = edtCapF3 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 9 + Width = 58 + BorderSpacing.Left = 12 + Caption = 'Caption: ' + ParentColor = False + end + object Label6: TLabel + AnchorSideLeft.Control = Label5 + AnchorSideTop.Control = edtF3 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 43 + Width = 44 + Caption = 'Macro:' + ParentColor = False + end + object edtF3: TEdit + AnchorSideLeft.Control = edtCapF3 + AnchorSideTop.Control = edtCapF3 + AnchorSideTop.Side = asrBottom + Left = 82 + Height = 34 + Top = 34 + Width = 176 + TabOrder = 1 + end + object edtCapF3: TEdit + AnchorSideLeft.Control = Label5 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox3 + Left = 82 + Height = 34 + Top = 0 + Width = 88 + BorderSpacing.Left = 12 + TabOrder = 0 + end + end + object GroupBox2: TGroupBox + AnchorSideLeft.Control = GroupBox1 + AnchorSideTop.Control = GroupBox1 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = GroupBox1 + AnchorSideRight.Side = asrBottom + Left = 6 + Height = 88 + Top = 100 + Width = 290 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 6 + Caption = ' F2 ' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 1 + object Label3: TLabel + AnchorSideLeft.Control = GroupBox2 + AnchorSideTop.Control = edtCapF2 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 9 + Width = 58 + BorderSpacing.Left = 12 + Caption = 'Caption: ' + ParentColor = False + end + object Label4: TLabel + AnchorSideLeft.Control = Label3 + AnchorSideTop.Control = edtF2 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 43 + Width = 44 + Caption = 'Macro:' + ParentColor = False + end + object edtF2: TEdit + AnchorSideLeft.Control = edtCapF2 + AnchorSideTop.Control = edtCapF2 + AnchorSideTop.Side = asrBottom + Left = 82 + Height = 34 + Top = 34 + Width = 176 + TabOrder = 1 + end + object edtCapF2: TEdit + AnchorSideLeft.Control = Label3 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox2 + Left = 82 + Height = 34 + Top = 0 + Width = 88 + BorderSpacing.Left = 12 + TabOrder = 0 + end + end end - object Label2: TLabel - AnchorSideLeft.Control = Label1 - AnchorSideTop.Control = edtF1 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 29 - Width = 47 - Caption = 'Macro:' - ParentColor = False - end - object edtF1: TEdit - AnchorSideLeft.Control = edtCapF1 - AnchorSideTop.Control = edtCapF1 - AnchorSideTop.Side = asrBottom - Left = 85 - Height = 25 - Top = 25 - Width = 176 - TabOrder = 0 - end - object edtCapF1: TEdit - AnchorSideLeft.Control = Label1 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = GroupBox1 - Left = 85 - Height = 25 - Top = 0 - Width = 88 - BorderSpacing.Left = 12 - TabOrder = 1 + object tabRUN: TTabSheet + AnchorSideLeft.Control = pgMemories + AnchorSideTop.Control = pgMemories + AnchorSideRight.Control = pgMemories + AnchorSideBottom.Control = pgMemories + Hint = 'CW memories when COntest window is open and S6P is unchecked (Run mode)' + Caption = 'Run' + ClientHeight = 478 + ClientWidth = 604 + ParentShowHint = False + ShowHint = True + object GroupBox11: TGroupBox + AnchorSideLeft.Control = tabRUN + AnchorSideTop.Control = tabRUN + Left = 6 + Height = 88 + Top = 6 + Width = 290 + BorderSpacing.Left = 6 + BorderSpacing.Top = 6 + Caption = ' F1 ' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 0 + object Label17: TLabel + AnchorSideLeft.Control = GroupBox11 + AnchorSideTop.Control = edtCapF11 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 9 + Width = 58 + BorderSpacing.Left = 12 + Caption = 'Caption: ' + ParentColor = False + end + object Label18: TLabel + AnchorSideLeft.Control = Label17 + AnchorSideTop.Control = edtF11 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 43 + Width = 44 + Caption = 'Macro:' + ParentColor = False + end + object edtF11: TEdit + AnchorSideLeft.Control = edtCapF11 + AnchorSideTop.Control = edtCapF11 + AnchorSideTop.Side = asrBottom + Left = 82 + Height = 34 + Top = 34 + Width = 176 + TabOrder = 1 + end + object edtCapF11: TEdit + AnchorSideLeft.Control = Label17 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox11 + Left = 82 + Height = 34 + Top = 0 + Width = 88 + BorderSpacing.Left = 12 + TabOrder = 0 + end + end + object GroupBox12: TGroupBox + AnchorSideLeft.Control = GroupBox11 + AnchorSideTop.Control = GroupBox11 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Side = asrBottom + Left = 6 + Height = 88 + Top = 100 + Width = 290 + BorderSpacing.Top = 6 + Caption = ' F2' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 1 + object Label37: TLabel + AnchorSideLeft.Control = GroupBox12 + AnchorSideTop.Control = edtCapF12 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 9 + Width = 58 + BorderSpacing.Left = 12 + Caption = 'Caption: ' + ParentColor = False + end + object Label38: TLabel + AnchorSideLeft.Control = Label37 + AnchorSideTop.Control = edtF12 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 43 + Width = 44 + Caption = 'Macro:' + ParentColor = False + end + object edtF12: TEdit + AnchorSideLeft.Control = edtCapF12 + AnchorSideTop.Control = edtCapF12 + AnchorSideTop.Side = asrBottom + Left = 82 + Height = 34 + Top = 34 + Width = 176 + TabOrder = 1 + end + object edtCapF12: TEdit + AnchorSideLeft.Control = Label37 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox12 + Left = 82 + Height = 34 + Top = 0 + Width = 88 + BorderSpacing.Left = 12 + TabOrder = 0 + end + end + object GroupBox13: TGroupBox + AnchorSideLeft.Control = GroupBox11 + AnchorSideTop.Control = GroupBox12 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Side = asrBottom + Left = 6 + Height = 88 + Top = 194 + Width = 290 + BorderSpacing.Top = 6 + Caption = ' F3' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 2 + object Label39: TLabel + AnchorSideLeft.Control = GroupBox13 + AnchorSideTop.Control = edtCapF13 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 9 + Width = 58 + BorderSpacing.Left = 12 + Caption = 'Caption: ' + ParentColor = False + end + object Label40: TLabel + AnchorSideLeft.Control = Label39 + AnchorSideTop.Control = edtF13 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 43 + Width = 44 + Caption = 'Macro:' + ParentColor = False + end + object edtF13: TEdit + AnchorSideLeft.Control = edtCapF13 + AnchorSideTop.Control = edtCapF13 + AnchorSideTop.Side = asrBottom + Left = 82 + Height = 34 + Top = 34 + Width = 176 + TabOrder = 1 + end + object edtCapF13: TEdit + AnchorSideLeft.Control = Label39 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox13 + Left = 82 + Height = 34 + Top = 0 + Width = 88 + BorderSpacing.Left = 12 + TabOrder = 0 + end + end + object GroupBox14: TGroupBox + AnchorSideLeft.Control = GroupBox11 + AnchorSideTop.Control = GroupBox13 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Side = asrBottom + Left = 6 + Height = 88 + Top = 288 + Width = 290 + BorderSpacing.Top = 6 + Caption = ' F4' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 3 + object Label19: TLabel + AnchorSideLeft.Control = GroupBox14 + AnchorSideTop.Control = edtCapF14 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 9 + Width = 58 + BorderSpacing.Left = 12 + Caption = 'Caption: ' + ParentColor = False + end + object Label20: TLabel + AnchorSideLeft.Control = Label19 + AnchorSideTop.Control = edtF14 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 43 + Width = 44 + Caption = 'Macro:' + ParentColor = False + end + object edtF14: TEdit + AnchorSideLeft.Control = edtCapF14 + AnchorSideTop.Control = edtCapF14 + AnchorSideTop.Side = asrBottom + Left = 82 + Height = 34 + Top = 34 + Width = 176 + TabOrder = 1 + end + object edtCapF14: TEdit + AnchorSideLeft.Control = Label19 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox14 + Left = 82 + Height = 34 + Top = 0 + Width = 88 + BorderSpacing.Left = 12 + TabOrder = 0 + end + end + object GroupBox15: TGroupBox + AnchorSideLeft.Control = GroupBox11 + AnchorSideTop.Control = GroupBox14 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Side = asrBottom + Left = 6 + Height = 88 + Top = 382 + Width = 290 + BorderSpacing.Top = 6 + Caption = ' F5' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 4 + object Label21: TLabel + AnchorSideLeft.Control = GroupBox15 + AnchorSideTop.Control = edtCapF15 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 9 + Width = 58 + BorderSpacing.Left = 12 + Caption = 'Caption: ' + ParentColor = False + end + object Label22: TLabel + AnchorSideLeft.Control = Label21 + AnchorSideTop.Control = edtF15 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 43 + Width = 44 + Caption = 'Macro:' + ParentColor = False + end + object edtF15: TEdit + AnchorSideLeft.Control = edtCapF15 + AnchorSideTop.Control = edtCapF15 + AnchorSideTop.Side = asrBottom + Left = 82 + Height = 34 + Top = 34 + Width = 176 + TabOrder = 1 + end + object edtCapF15: TEdit + AnchorSideLeft.Control = Label21 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox15 + Left = 82 + Height = 34 + Top = 0 + Width = 88 + BorderSpacing.Left = 12 + TabOrder = 0 + end + end + object GroupBox16: TGroupBox + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = tabRUN + AnchorSideRight.Control = tabRUN + AnchorSideRight.Side = asrBottom + Left = 308 + Height = 88 + Top = 6 + Width = 290 + Anchors = [akTop, akRight] + BorderSpacing.Top = 6 + BorderSpacing.Right = 6 + Caption = ' F6 ' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 5 + object Label23: TLabel + AnchorSideLeft.Control = GroupBox16 + AnchorSideTop.Control = edtCapF16 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 9 + Width = 58 + BorderSpacing.Left = 12 + Caption = 'Caption: ' + ParentColor = False + end + object Label24: TLabel + AnchorSideLeft.Control = Label23 + AnchorSideTop.Control = edtF16 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 43 + Width = 44 + Caption = 'Macro:' + ParentColor = False + end + object edtF16: TEdit + AnchorSideLeft.Control = edtCapF16 + AnchorSideTop.Control = edtCapF16 + AnchorSideTop.Side = asrBottom + Left = 82 + Height = 34 + Top = 34 + Width = 176 + TabOrder = 1 + end + object edtCapF16: TEdit + AnchorSideLeft.Control = Label23 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox16 + Left = 82 + Height = 34 + Top = 0 + Width = 88 + BorderSpacing.Left = 12 + TabOrder = 0 + end + end + object GroupBox17: TGroupBox + AnchorSideTop.Control = GroupBox16 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = GroupBox16 + AnchorSideRight.Side = asrBottom + Left = 308 + Height = 88 + Top = 100 + Width = 290 + Anchors = [akTop, akRight] + BorderSpacing.Top = 6 + Caption = ' F7' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 6 + object Label25: TLabel + AnchorSideLeft.Control = GroupBox17 + AnchorSideTop.Control = edtCapF17 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 9 + Width = 58 + BorderSpacing.Left = 12 + Caption = 'Caption: ' + ParentColor = False + end + object Label26: TLabel + AnchorSideLeft.Control = Label25 + AnchorSideTop.Control = edtF17 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 43 + Width = 44 + Caption = 'Macro:' + ParentColor = False + end + object edtF17: TEdit + AnchorSideLeft.Control = edtCapF17 + AnchorSideTop.Control = edtCapF17 + AnchorSideTop.Side = asrBottom + Left = 82 + Height = 34 + Top = 34 + Width = 176 + TabOrder = 1 + end + object edtCapF17: TEdit + AnchorSideLeft.Control = Label25 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox17 + Left = 82 + Height = 34 + Top = 0 + Width = 88 + BorderSpacing.Left = 12 + TabOrder = 0 + end + end + object GroupBox18: TGroupBox + AnchorSideTop.Control = GroupBox17 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = GroupBox16 + AnchorSideRight.Side = asrBottom + Left = 308 + Height = 88 + Top = 194 + Width = 290 + Anchors = [akTop, akRight] + BorderSpacing.Top = 6 + Caption = ' F8' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 7 + object Label27: TLabel + AnchorSideLeft.Control = GroupBox18 + AnchorSideTop.Control = edtCapF18 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 9 + Width = 58 + BorderSpacing.Left = 12 + Caption = 'Caption: ' + ParentColor = False + end + object Label28: TLabel + AnchorSideLeft.Control = Label27 + AnchorSideTop.Control = edtF18 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 43 + Width = 44 + Caption = 'Macro:' + ParentColor = False + end + object edtF18: TEdit + AnchorSideLeft.Control = edtCapF18 + AnchorSideTop.Control = edtCapF18 + AnchorSideTop.Side = asrBottom + Left = 82 + Height = 34 + Top = 34 + Width = 176 + TabOrder = 1 + end + object edtCapF18: TEdit + AnchorSideLeft.Control = Label27 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox18 + Left = 82 + Height = 34 + Top = 0 + Width = 88 + BorderSpacing.Left = 12 + TabOrder = 0 + end + end + object GroupBox19: TGroupBox + AnchorSideTop.Control = GroupBox18 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = GroupBox16 + AnchorSideRight.Side = asrBottom + Left = 308 + Height = 88 + Top = 288 + Width = 290 + Anchors = [akTop, akRight] + BorderSpacing.Top = 6 + Caption = ' F9' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 8 + object Label29: TLabel + AnchorSideLeft.Control = GroupBox19 + AnchorSideTop.Control = edtCapF19 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 9 + Width = 58 + BorderSpacing.Left = 12 + Caption = 'Caption: ' + ParentColor = False + end + object Label30: TLabel + AnchorSideLeft.Control = Label29 + AnchorSideTop.Control = edtF19 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 43 + Width = 44 + Caption = 'Macro:' + ParentColor = False + end + object edtF19: TEdit + AnchorSideLeft.Control = edtCapF19 + AnchorSideTop.Control = edtCapF19 + AnchorSideTop.Side = asrBottom + Left = 82 + Height = 34 + Top = 34 + Width = 176 + TabOrder = 1 + end + object edtCapF19: TEdit + AnchorSideLeft.Control = Label29 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox19 + Left = 82 + Height = 34 + Top = 0 + Width = 88 + BorderSpacing.Left = 12 + TabOrder = 0 + end + end + object GroupBox20: TGroupBox + AnchorSideTop.Control = GroupBox19 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = GroupBox16 + AnchorSideRight.Side = asrBottom + Left = 308 + Height = 88 + Top = 382 + Width = 290 + Anchors = [akTop, akRight] + BorderSpacing.Top = 6 + Caption = ' F10' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 9 + object Label31: TLabel + AnchorSideLeft.Control = GroupBox20 + AnchorSideTop.Control = edtCapF20 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 9 + Width = 58 + BorderSpacing.Left = 12 + Caption = 'Caption: ' + ParentColor = False + end + object Label32: TLabel + AnchorSideLeft.Control = Label31 + AnchorSideTop.Control = edtF20 + AnchorSideTop.Side = asrCenter + Left = 12 + Height = 17 + Top = 43 + Width = 44 + Caption = 'Macro:' + ParentColor = False + end + object edtF20: TEdit + AnchorSideLeft.Control = edtCapF20 + AnchorSideTop.Control = edtCapF20 + AnchorSideTop.Side = asrBottom + Left = 82 + Height = 34 + Top = 34 + Width = 176 + TabOrder = 1 + end + object edtCapF20: TEdit + AnchorSideLeft.Control = Label31 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox20 + Left = 82 + Height = 34 + Top = 0 + Width = 88 + BorderSpacing.Left = 12 + TabOrder = 0 + end + end end end - object GroupBox10: TGroupBox - AnchorSideLeft.Control = GroupBox9 - AnchorSideTop.Control = GroupBox9 + object pnlActions: TPanel + AnchorSideLeft.Control = pnlMain AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = GroupBox9 - AnchorSideRight.Side = asrBottom - Left = 301 - Height = 88 - Top = 383 - Width = 269 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 6 - Caption = ' F10 ' - ClientHeight = 62 - ClientWidth = 263 - TabOrder = 1 - object Label35: TLabel - AnchorSideLeft.Control = GroupBox10 - AnchorSideTop.Control = edtCapF10 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 4 - Width = 61 - BorderSpacing.Left = 12 - Caption = 'Caption: ' - ParentColor = False - end - object Label36: TLabel - AnchorSideLeft.Control = Label35 - AnchorSideTop.Control = edtF10 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 29 - Width = 47 - Caption = 'Macro:' - ParentColor = False - end - object edtF10: TEdit - AnchorSideLeft.Control = edtCapF10 - AnchorSideTop.Control = edtCapF10 - AnchorSideTop.Side = asrBottom - Left = 85 - Height = 25 - Top = 25 - Width = 176 - TabOrder = 0 - end - object edtCapF10: TEdit - AnchorSideLeft.Control = Label35 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = GroupBox10 - Left = 85 - Height = 25 - Top = 0 - Width = 88 - BorderSpacing.Left = 12 - TabOrder = 1 - end - end - object GroupBox9: TGroupBox - AnchorSideLeft.Control = GroupBox8 - AnchorSideTop.Control = GroupBox8 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = GroupBox8 - AnchorSideRight.Side = asrBottom - Left = 301 - Height = 88 - Top = 289 - Width = 269 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 6 - Caption = ' F9 ' - ClientHeight = 62 - ClientWidth = 263 - TabOrder = 2 - object Label33: TLabel - AnchorSideLeft.Control = GroupBox9 - AnchorSideTop.Control = edtCapF9 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 4 - Width = 61 - BorderSpacing.Left = 12 - Caption = 'Caption: ' - ParentColor = False - end - object Label34: TLabel - AnchorSideLeft.Control = Label33 - AnchorSideTop.Control = edtF9 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 29 - Width = 47 - Caption = 'Macro:' - ParentColor = False - end - object edtF9: TEdit - AnchorSideLeft.Control = edtCapF9 - AnchorSideTop.Control = edtCapF9 - AnchorSideTop.Side = asrBottom - Left = 85 - Height = 25 - Top = 25 - Width = 176 - TabOrder = 0 - end - object edtCapF9: TEdit - AnchorSideLeft.Control = Label33 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = GroupBox9 - Left = 85 - Height = 25 - Top = 0 - Width = 88 - BorderSpacing.Left = 12 - TabOrder = 1 - end - end - object GroupBox8: TGroupBox - AnchorSideLeft.Control = GroupBox7 - AnchorSideTop.Control = GroupBox7 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = GroupBox7 - AnchorSideRight.Side = asrBottom - Left = 301 - Height = 88 - Top = 195 - Width = 269 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 6 - Caption = ' F8 ' - ClientHeight = 62 - ClientWidth = 263 - TabOrder = 3 - object Label15: TLabel - AnchorSideLeft.Control = GroupBox8 - AnchorSideTop.Control = edtCapF8 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 4 - Width = 61 - BorderSpacing.Left = 12 - Caption = 'Caption: ' - ParentColor = False - end - object Label16: TLabel - AnchorSideLeft.Control = Label15 - AnchorSideTop.Control = edtF8 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 29 - Width = 47 - Caption = 'Macro:' - ParentColor = False - end - object edtF8: TEdit - AnchorSideLeft.Control = edtCapF8 - AnchorSideTop.Control = edtCapF8 - AnchorSideTop.Side = asrBottom - Left = 85 - Height = 25 - Top = 25 - Width = 176 - TabOrder = 0 - end - object edtCapF8: TEdit - AnchorSideLeft.Control = Label15 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = GroupBox8 - Left = 85 - Height = 25 - Top = 0 - Width = 88 - BorderSpacing.Left = 12 - TabOrder = 1 - end - end - object GroupBox7: TGroupBox - AnchorSideLeft.Control = GroupBox6 - AnchorSideTop.Control = GroupBox6 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = GroupBox6 - AnchorSideRight.Side = asrBottom - Left = 301 - Height = 88 - Top = 101 - Width = 269 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 6 - Caption = ' F7 ' - ClientHeight = 62 - ClientWidth = 263 - TabOrder = 4 - object Label13: TLabel - AnchorSideLeft.Control = GroupBox7 - AnchorSideTop.Control = edtCapF7 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 4 - Width = 61 - BorderSpacing.Left = 12 - Caption = 'Caption: ' - ParentColor = False - end - object Label14: TLabel - AnchorSideLeft.Control = Label13 - AnchorSideTop.Control = edtF7 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 29 - Width = 47 - Caption = 'Macro:' - ParentColor = False - end - object edtF7: TEdit - AnchorSideLeft.Control = edtCapF7 - AnchorSideTop.Control = edtCapF7 - AnchorSideTop.Side = asrBottom - Left = 85 - Height = 25 - Top = 25 - Width = 176 - TabOrder = 0 - end - object edtCapF7: TEdit - AnchorSideLeft.Control = Label13 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = GroupBox7 - Left = 85 - Height = 25 - Top = 0 - Width = 88 - BorderSpacing.Left = 12 - TabOrder = 1 - end - end - object GroupBox6: TGroupBox - AnchorSideLeft.Control = GroupBox1 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = GroupBox1 - Left = 301 - Height = 88 - Top = 7 - Width = 269 - BorderSpacing.Left = 21 - Caption = ' F6 ' - ClientHeight = 62 - ClientWidth = 263 - TabOrder = 5 - object Label11: TLabel - AnchorSideLeft.Control = GroupBox6 - AnchorSideTop.Control = edtCapF6 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 4 - Width = 61 - BorderSpacing.Left = 12 - Caption = 'Caption: ' - ParentColor = False - end - object Label12: TLabel - AnchorSideLeft.Control = Label11 - AnchorSideTop.Control = edtF6 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 29 - Width = 47 - Caption = 'Macro:' - ParentColor = False - end - object edtF6: TEdit - AnchorSideLeft.Control = edtCapF6 - AnchorSideTop.Control = edtCapF6 - AnchorSideTop.Side = asrBottom - Left = 85 - Height = 25 - Top = 25 - Width = 176 - TabOrder = 0 - end - object edtCapF6: TEdit - AnchorSideLeft.Control = Label11 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = GroupBox6 - Left = 85 - Height = 25 - Top = 0 - Width = 88 - BorderSpacing.Left = 12 - TabOrder = 1 - end - end - object GroupBox5: TGroupBox - AnchorSideLeft.Control = GroupBox4 - AnchorSideTop.Control = GroupBox4 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = GroupBox4 - AnchorSideRight.Side = asrBottom - Left = 7 - Height = 88 - Top = 383 - Width = 273 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 6 - Caption = ' F5 ' - ClientHeight = 62 - ClientWidth = 267 - TabOrder = 6 - object Label9: TLabel - AnchorSideLeft.Control = GroupBox5 - AnchorSideTop.Control = edtCapF5 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 4 - Width = 61 - BorderSpacing.Left = 12 - Caption = 'Caption: ' - ParentColor = False - end - object Label10: TLabel - AnchorSideLeft.Control = Label9 - AnchorSideTop.Control = edtF5 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 29 - Width = 47 - Caption = 'Macro:' - ParentColor = False - end - object edtF5: TEdit - AnchorSideLeft.Control = edtCapF5 - AnchorSideTop.Control = edtCapF5 - AnchorSideTop.Side = asrBottom - Left = 85 - Height = 25 - Top = 25 - Width = 176 - TabOrder = 0 - end - object edtCapF5: TEdit - AnchorSideLeft.Control = Label9 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = GroupBox5 - Left = 85 - Height = 25 - Top = 0 - Width = 88 - BorderSpacing.Left = 12 - TabOrder = 1 - end - end - object GroupBox4: TGroupBox - AnchorSideLeft.Control = GroupBox3 - AnchorSideTop.Control = GroupBox3 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = GroupBox3 - AnchorSideRight.Side = asrBottom - Left = 7 - Height = 88 - Top = 289 - Width = 273 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 6 - Caption = ' F4 ' - ClientHeight = 62 - ClientWidth = 267 - TabOrder = 7 - object Label7: TLabel - AnchorSideLeft.Control = GroupBox4 - AnchorSideTop.Control = edtCapF4 - Left = 12 - Height = 17 - Top = 0 - Width = 61 - BorderSpacing.Left = 12 - Caption = 'Caption: ' - ParentColor = False - end - object Label8: TLabel - AnchorSideLeft.Control = Label7 - AnchorSideTop.Control = edtF4 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 29 - Width = 47 - Caption = 'Macro:' - ParentColor = False - end - object edtF4: TEdit - AnchorSideLeft.Control = edtCapF4 - AnchorSideTop.Control = edtCapF4 - AnchorSideTop.Side = asrBottom - Left = 85 - Height = 25 - Top = 25 - Width = 176 - TabOrder = 0 - end - object edtCapF4: TEdit - AnchorSideLeft.Control = Label7 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = GroupBox4 - Left = 85 - Height = 25 - Top = 0 - Width = 88 - BorderSpacing.Left = 12 - TabOrder = 1 - end - end - object GroupBox3: TGroupBox - AnchorSideLeft.Control = GroupBox2 - AnchorSideTop.Control = GroupBox2 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = GroupBox2 - AnchorSideRight.Side = asrBottom - Left = 7 - Height = 88 - Top = 195 - Width = 273 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 6 - Caption = ' F3 ' - ClientHeight = 62 - ClientWidth = 267 - TabOrder = 8 - object Label5: TLabel - AnchorSideLeft.Control = GroupBox3 - AnchorSideTop.Control = edtCapF3 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 4 - Width = 61 - BorderSpacing.Left = 12 - Caption = 'Caption: ' - ParentColor = False - end - object Label6: TLabel - AnchorSideLeft.Control = Label5 - AnchorSideTop.Control = edtF3 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 29 - Width = 47 - Caption = 'Macro:' - ParentColor = False - end - object edtF3: TEdit - AnchorSideLeft.Control = edtCapF3 - AnchorSideTop.Control = edtCapF3 - AnchorSideTop.Side = asrBottom - Left = 85 - Height = 25 - Top = 25 - Width = 176 - TabOrder = 0 - end - object edtCapF3: TEdit - AnchorSideLeft.Control = Label5 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = GroupBox3 - Left = 85 - Height = 25 - Top = 0 - Width = 88 - BorderSpacing.Left = 12 - TabOrder = 1 - end - end - object GroupBox2: TGroupBox - AnchorSideLeft.Control = GroupBox1 - AnchorSideTop.Control = GroupBox1 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = GroupBox1 - AnchorSideRight.Side = asrBottom - Left = 7 - Height = 88 - Top = 101 - Width = 273 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 6 - Caption = ' F2 ' - ClientHeight = 62 - ClientWidth = 267 - TabOrder = 9 - object Label3: TLabel - AnchorSideLeft.Control = GroupBox2 - AnchorSideTop.Control = edtCapF2 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 4 - Width = 61 - BorderSpacing.Left = 12 - Caption = 'Caption: ' - ParentColor = False - end - object Label4: TLabel - AnchorSideLeft.Control = Label3 - AnchorSideTop.Control = edtF2 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 29 - Width = 47 - Caption = 'Macro:' - ParentColor = False - end - object edtF2: TEdit - AnchorSideLeft.Control = edtCapF2 - AnchorSideTop.Control = edtCapF2 - AnchorSideTop.Side = asrBottom - Left = 85 - Height = 25 - Top = 25 - Width = 176 - TabOrder = 0 - end - object edtCapF2: TEdit - AnchorSideLeft.Control = Label3 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = GroupBox2 - Left = 85 - Height = 25 - Top = 0 - Width = 88 - BorderSpacing.Left = 12 - TabOrder = 1 - end - end - object rgEnter: TRadioGroup - AnchorSideLeft.Control = GroupBox5 - AnchorSideTop.Control = GroupBox5 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = GroupBox5 + AnchorSideRight.Control = pnlMain AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = pnlMain AnchorSideBottom.Side = asrBottom - Left = 7 - Height = 88 - Top = 477 - Width = 273 - Anchors = [akTop, akLeft, akRight] - AutoFill = True - BorderSpacing.Top = 6 - Caption = 'When "Memory keys" is active ENTER' - ChildSizing.LeftRightSpacing = 6 - ChildSizing.EnlargeHorizontal = crsHomogenousChildResize - ChildSizing.EnlargeVertical = crsHomogenousChildResize - ChildSizing.ShrinkHorizontal = crsScaleChilds - ChildSizing.ShrinkVertical = crsScaleChilds - ChildSizing.Layout = cclLeftToRightThenTopToBottom - ChildSizing.ControlsPerLine = 1 - ClientHeight = 62 - ClientWidth = 267 - Items.Strings = ( - 'repeats last clicked (focused) memory ' - 'is ignored' - 'saves qso' - ) - TabOrder = 10 - end - object GroupBox11: TGroupBox - AnchorSideLeft.Control = GroupBox10 - AnchorSideTop.Control = GroupBox10 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = GroupBox10 - AnchorSideRight.Side = asrBottom - Left = 301 - Height = 88 - Top = 477 - Width = 269 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 6 - Caption = 'CW Messages' - ClientHeight = 62 - ClientWidth = 263 - TabOrder = 11 - object SaveMsg: TButton - AnchorSideLeft.Control = GroupBox11 - AnchorSideLeft.Side = asrCenter - AnchorSideTop.Control = GroupBox11 + Left = 1 + Height = 106 + Top = 510 + Width = 614 + Anchors = [akLeft, akRight, akBottom] + ClientHeight = 106 + ClientWidth = 614 + TabOrder = 1 + object gbSaveLoad: TGroupBox + AnchorSideTop.Control = pnlActions + AnchorSideRight.Control = pnlActions AnchorSideRight.Side = asrBottom - Left = 87 - Height = 26 - Top = 6 - Width = 88 - BorderSpacing.Top = 6 - Caption = 'Save' - OnClick = SaveMsgClick - TabOrder = 0 + Left = 317 + Height = 88 + Top = 4 + Width = 290 + Anchors = [akTop, akRight] + BorderSpacing.Top = 3 + BorderSpacing.Right = 6 + Caption = 'CW Messages' + ClientHeight = 70 + ClientWidth = 288 + TabOrder = 1 + object SaveMsg: TButton + AnchorSideLeft.Control = gbSaveLoad + AnchorSideLeft.Side = asrCenter + AnchorSideTop.Control = gbSaveLoad + AnchorSideRight.Side = asrBottom + Left = 100 + Height = 26 + Top = 6 + Width = 88 + BorderSpacing.Top = 6 + Caption = 'Save' + OnClick = SaveMsgClick + TabOrder = 0 + end + object LoadMsg: TButton + AnchorSideLeft.Control = gbSaveLoad + AnchorSideLeft.Side = asrCenter + AnchorSideTop.Control = SaveMsg + AnchorSideTop.Side = asrBottom + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Side = asrBottom + Left = 100 + Height = 26 + Top = 35 + Width = 88 + BorderSpacing.Top = 3 + Caption = 'Load' + OnClick = LoadMsgClick + TabOrder = 1 + end end - object LoadMsg: TButton - AnchorSideLeft.Control = SaveMsg - AnchorSideTop.Control = SaveMsg - AnchorSideTop.Side = asrBottom + object rgEnter: TRadioGroup + AnchorSideLeft.Control = pnlActions + AnchorSideTop.Control = pnlActions AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom - Left = 87 - Height = 26 - Top = 35 - Width = 88 + Left = 7 + Height = 88 + Top = 4 + Width = 293 + AutoFill = True + BorderSpacing.Left = 6 BorderSpacing.Top = 3 - Caption = 'Load' - OnClick = LoadMsgClick - TabOrder = 1 + Caption = 'When "Memory keys" is active ENTER' + ChildSizing.LeftRightSpacing = 6 + ChildSizing.EnlargeHorizontal = crsHomogenousChildResize + ChildSizing.EnlargeVertical = crsHomogenousChildResize + ChildSizing.ShrinkHorizontal = crsScaleChilds + ChildSizing.ShrinkVertical = crsScaleChilds + ChildSizing.Layout = cclLeftToRightThenTopToBottom + ChildSizing.ControlsPerLine = 1 + ClientHeight = 70 + ClientWidth = 291 + Items.Strings = ( + 'repeats last (focused) memory ' + 'is ignored' + 'saves qso' + ) + TabOrder = 0 end end end @@ -873,15 +1523,15 @@ object frmKeyTexts: TfrmKeyTexts DefaultExt = '.cwm' Filter = 'CW memory|*.cwm;*.CWM|All files|*.*' Options = [ofPathMustExist, ofFileMustExist, ofEnableSizing, ofForceShowHidden, ofViewDetail] - left = 472 - top = 576 + Left = 504 + Top = 624 end object SaveDialog1: TSaveDialog Title = 'Save CW messages' DefaultExt = '.cwm' Filter = 'CW memory|*.cwm;*.CWM|All files|*.*' Options = [ofOverwritePrompt, ofEnableSizing, ofViewDetail] - left = 544 - top = 576 + Left = 568 + Top = 624 end end diff --git a/src/fKeyTexts.pas b/src/fKeyTexts.pas index d152c77..1e4bad3 100644 --- a/src/fKeyTexts.pas +++ b/src/fKeyTexts.pas @@ -21,7 +21,17 @@ type btnOK: TButton; edtCapF1: TEdit; edtCapF10: TEdit; + edtCapF11: TEdit; + edtCapF12: TEdit; + edtCapF13: TEdit; + edtCapF14: TEdit; + edtCapF15: TEdit; + edtCapF16: TEdit; + edtCapF17: TEdit; + edtCapF18: TEdit; + edtCapF19: TEdit; edtCapF2: TEdit; + edtCapF20: TEdit; edtCapF3: TEdit; edtCapF4: TEdit; edtCapF5: TEdit; @@ -31,7 +41,17 @@ type edtCapF9: TEdit; edtF1: TEdit; edtF10: TEdit; + edtF11: TEdit; + edtF12: TEdit; + edtF13: TEdit; + edtF14: TEdit; + edtF15: TEdit; + edtF16: TEdit; + edtF17: TEdit; + edtF18: TEdit; + edtF19: TEdit; edtF2: TEdit; + edtF20: TEdit; edtF3: TEdit; edtF4: TEdit; edtF5: TEdit; @@ -41,8 +61,18 @@ type edtF9: TEdit; GroupBox1: TGroupBox; GroupBox10: TGroupBox; + gbSaveLoad: TGroupBox; GroupBox11: TGroupBox; + GroupBox12: TGroupBox; + GroupBox13: TGroupBox; + GroupBox14: TGroupBox; + GroupBox15: TGroupBox; + GroupBox16: TGroupBox; + GroupBox17: TGroupBox; + GroupBox18: TGroupBox; + GroupBox19: TGroupBox; GroupBox2: TGroupBox; + GroupBox20: TGroupBox; GroupBox3: TGroupBox; GroupBox4: TGroupBox; GroupBox5: TGroupBox; @@ -58,13 +88,33 @@ type Label14: TLabel; Label15: TLabel; Label16: TLabel; + Label17: TLabel; + Label18: TLabel; + Label19: TLabel; Label2: TLabel; + Label20: TLabel; + Label21: TLabel; + Label22: TLabel; + Label23: TLabel; + Label24: TLabel; + Label25: TLabel; + Label26: TLabel; + Label27: TLabel; + Label28: TLabel; + Label29: TLabel; Label3: TLabel; + Label30: TLabel; + Label31: TLabel; + Label32: TLabel; Label33: TLabel; Label34: TLabel; Label35: TLabel; Label36: TLabel; + Label37: TLabel; + Label38: TLabel; + Label39: TLabel; Label4: TLabel; + Label40: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; @@ -72,18 +122,23 @@ type Label9: TLabel; LoadMsg: TButton; OpenDialog1: TOpenDialog; + pnlActions: TPanel; + pgMemories: TPageControl; pnlMain: TPanel; - rgEnter: TRadioGroup; pnlControl: TPanel; + rgEnter: TRadioGroup; SaveDialog1: TSaveDialog; SaveMsg: TButton; + tabRUN: TTabSheet; + tabSeP: TTabSheet; procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormShow(Sender: TObject); procedure btnHelpClick(Sender: TObject); procedure btnOKClick(Sender: TObject); - procedure LoadMsgClick(Sender: TObject); procedure SaveMsgClick(Sender: TObject); + procedure LoadMsgClick(Sender: TObject); private + SP : boolean; { private declarations } public { public declarations } @@ -121,7 +176,33 @@ begin edtCapF8.text := cqrini.ReadString(C_INI_FILE_SECTION,'CapF8','F8'); edtCapF9.text := cqrini.ReadString(C_INI_FILE_SECTION,'CapF9','F9'); edtCapF10.text := cqrini.ReadString(C_INI_FILE_SECTION,'CapF10','F10'); + + edtF11.text := cqrini.ReadString(C_INI_FILE_SECTION,'F11','cq cq de %mc %mc pse K'); + edtF12.text := cqrini.ReadString(C_INI_FILE_SECTION,'F12',''); + edtF13.text := cqrini.ReadString(C_INI_FILE_SECTION,'F13',''); + edtF14.text := cqrini.ReadString(C_INI_FILE_SECTION,'F14',''); + edtF15.text := cqrini.ReadString(C_INI_FILE_SECTION,'F15',''); + edtF16.text := cqrini.ReadString(C_INI_FILE_SECTION,'F16',''); + edtF17.text := cqrini.ReadString(C_INI_FILE_SECTION,'F17',''); + edtF18.text := cqrini.ReadString(C_INI_FILE_SECTION,'F18',''); + edtF19.text := cqrini.ReadString(C_INI_FILE_SECTION,'F19',''); + edtF20.text := cqrini.ReadString(C_INI_FILE_SECTION,'F20',''); + edtCapF11.text := cqrini.ReadString(C_INI_FILE_SECTION,'CapF11','F1 - CQ'); + edtCapF12.text := cqrini.ReadString(C_INI_FILE_SECTION,'CapF12','F2'); + edtCapF13.text := cqrini.ReadString(C_INI_FILE_SECTION,'CapF13','F3'); + edtCapF14.text := cqrini.ReadString(C_INI_FILE_SECTION,'CapF14','F4'); + edtCapF15.text := cqrini.ReadString(C_INI_FILE_SECTION,'CapF15','F5'); + edtCapF16.text := cqrini.ReadString(C_INI_FILE_SECTION,'CapF16','F6'); + edtCapF17.text := cqrini.ReadString(C_INI_FILE_SECTION,'CapF17','F7'); + edtCapF18.text := cqrini.ReadString(C_INI_FILE_SECTION,'CapF18','F8'); + edtCapF19.text := cqrini.ReadString(C_INI_FILE_SECTION,'CapF19','F9'); + edtCapF20.text := cqrini.ReadString(C_INI_FILE_SECTION,'CapF20','F10'); + + SP := cqrini.ReadBool('CW','S&P',True); rgEnter.ItemIndex := cqrini.ReadInteger(C_INI_FILE_SECTION,'EnterFunction',1); + if SP then pgMemories.ActivePageIndex:=0 + else + pgMemories.ActivePageIndex:=1; end; procedure TfrmKeyTexts.FormClose(Sender: TObject; var CloseAction: TCloseAction); @@ -136,6 +217,7 @@ end; procedure TfrmKeyTexts.btnOKClick(Sender: TObject); begin + cqrini.SectionErase(C_INI_FILE_SECTION); //this cleans section to keep only memory keys, other settings in CWnr sections cqrini.WriteString(C_INI_FILE_SECTION,'F1',edtF1.Text); cqrini.WriteString(C_INI_FILE_SECTION,'F2',edtF2.Text); cqrini.WriteString(C_INI_FILE_SECTION,'F3',edtF3.Text); @@ -156,10 +238,35 @@ begin cqrini.WriteString(C_INI_FILE_SECTION,'CapF8',edtCapF8.Text); cqrini.WriteString(C_INI_FILE_SECTION,'CapF9',edtCapF9.Text); cqrini.WriteString(C_INI_FILE_SECTION,'CapF10',edtCapF10.Text); + + cqrini.WriteString(C_INI_FILE_SECTION,'F11',edtF11.Text); + cqrini.WriteString(C_INI_FILE_SECTION,'F12',edtF12.Text); + cqrini.WriteString(C_INI_FILE_SECTION,'F13',edtF13.Text); + cqrini.WriteString(C_INI_FILE_SECTION,'F14',edtF14.Text); + cqrini.WriteString(C_INI_FILE_SECTION,'F15',edtF15.Text); + cqrini.WriteString(C_INI_FILE_SECTION,'F16',edtF16.Text); + cqrini.WriteString(C_INI_FILE_SECTION,'F17',edtF17.Text); + cqrini.WriteString(C_INI_FILE_SECTION,'F18',edtF18.Text); + cqrini.WriteString(C_INI_FILE_SECTION,'F19',edtF19.Text); + cqrini.WriteString(C_INI_FILE_SECTION,'F20',edtF20.Text); + cqrini.WriteString(C_INI_FILE_SECTION,'CapF11',edtCapF11.Text); + cqrini.WriteString(C_INI_FILE_SECTION,'CapF12',edtCapF12.Text); + cqrini.WriteString(C_INI_FILE_SECTION,'CapF13',edtCapF13.Text); + cqrini.WriteString(C_INI_FILE_SECTION,'CapF14',edtCapF14.Text); + cqrini.WriteString(C_INI_FILE_SECTION,'CapF15',edtCapF15.Text); + cqrini.WriteString(C_INI_FILE_SECTION,'CapF16',edtCapF16.Text); + cqrini.WriteString(C_INI_FILE_SECTION,'CapF17',edtCapF17.Text); + cqrini.WriteString(C_INI_FILE_SECTION,'CapF18',edtCapF18.Text); + cqrini.WriteString(C_INI_FILE_SECTION,'CapF19',edtCapF19.Text); + cqrini.WriteString(C_INI_FILE_SECTION,'CapF20',edtCapF20.Text); + + cqrini.WriteBool('CW','S&P',SP); cqrini.WriteInteger(C_INI_FILE_SECTION,'EnterFunction',rgEnter.ItemIndex); cqrini.SaveToDisk; ModalResult := mrOK end; + + procedure TfrmKeyTexts.LoadMsgClick(Sender: TObject); var CwM : TIniFile; @@ -189,6 +296,28 @@ begin edtCapF8.text := CWM.ReadString(C_INI_FILE_SECTION,'CapF8','F8'); edtCapF9.text := CWM.ReadString(C_INI_FILE_SECTION,'CapF9','F9'); edtCapF10.text := CWM.ReadString(C_INI_FILE_SECTION,'CapF10','F10'); + + edtF11.text := CWM.ReadString(C_INI_FILE_SECTION,'F11','cq cq de %mc %mc pse K'); + edtF12.text := CWM.ReadString(C_INI_FILE_SECTION,'F12',''); + edtF13.text := CWM.ReadString(C_INI_FILE_SECTION,'F13',''); + edtF14.text := CWM.ReadString(C_INI_FILE_SECTION,'F14',''); + edtF15.text := CWM.ReadString(C_INI_FILE_SECTION,'F15',''); + edtF16.text := CWM.ReadString(C_INI_FILE_SECTION,'F16',''); + edtF17.text := CWM.ReadString(C_INI_FILE_SECTION,'F17',''); + edtF18.text := CWM.ReadString(C_INI_FILE_SECTION,'F18',''); + edtF19.text := CWM.ReadString(C_INI_FILE_SECTION,'F19',''); + edtF20.text := CWM.ReadString(C_INI_FILE_SECTION,'F20',''); + edtCapF11.text := CWM.ReadString(C_INI_FILE_SECTION,'CapF11','F1 - CQ'); + edtCapF12.text := CWM.ReadString(C_INI_FILE_SECTION,'CapF12','F2'); + edtCapF13.text := CWM.ReadString(C_INI_FILE_SECTION,'CapF13','F3'); + edtCapF14.text := CWM.ReadString(C_INI_FILE_SECTION,'CapF14','F4'); + edtCapF15.text := CWM.ReadString(C_INI_FILE_SECTION,'CapF15','F5'); + edtCapF16.text := CWM.ReadString(C_INI_FILE_SECTION,'CapF16','F6'); + edtCapF17.text := CWM.ReadString(C_INI_FILE_SECTION,'CapF17','F7'); + edtCapF18.text := CWM.ReadString(C_INI_FILE_SECTION,'CapF18','F8'); + edtCapF19.text := CWM.ReadString(C_INI_FILE_SECTION,'CapF19','F9'); + edtCapF20.text := CWM.ReadString(C_INI_FILE_SECTION,'CapF20','F10'); + rgEnter.ItemIndex := CWM.ReadInteger(C_INI_FILE_SECTION,'EnterFunction',1); finally FreeAndNil(CWM); @@ -225,6 +354,28 @@ begin CWM.WriteString(C_INI_FILE_SECTION,'CapF8',edtCapF8.Text); CWM.WriteString(C_INI_FILE_SECTION,'CapF9',edtCapF9.Text); CWM.WriteString(C_INI_FILE_SECTION,'CapF10',edtCapF10.Text); + + CWM.WriteString(C_INI_FILE_SECTION,'F11',edtF11.Text); + CWM.WriteString(C_INI_FILE_SECTION,'F12',edtF12.Text); + CWM.WriteString(C_INI_FILE_SECTION,'F13',edtF13.Text); + CWM.WriteString(C_INI_FILE_SECTION,'F14',edtF14.Text); + CWM.WriteString(C_INI_FILE_SECTION,'F15',edtF15.Text); + CWM.WriteString(C_INI_FILE_SECTION,'F16',edtF16.Text); + CWM.WriteString(C_INI_FILE_SECTION,'F17',edtF17.Text); + CWM.WriteString(C_INI_FILE_SECTION,'F18',edtF18.Text); + CWM.WriteString(C_INI_FILE_SECTION,'F19',edtF19.Text); + CWM.WriteString(C_INI_FILE_SECTION,'F20',edtF20.Text); + CWM.WriteString(C_INI_FILE_SECTION,'CapF11',edtCapF11.Text); + CWM.WriteString(C_INI_FILE_SECTION,'CapF12',edtCapF12.Text); + CWM.WriteString(C_INI_FILE_SECTION,'CapF13',edtCapF13.Text); + CWM.WriteString(C_INI_FILE_SECTION,'CapF14',edtCapF14.Text); + CWM.WriteString(C_INI_FILE_SECTION,'CapF15',edtCapF15.Text); + CWM.WriteString(C_INI_FILE_SECTION,'CapF16',edtCapF16.Text); + CWM.WriteString(C_INI_FILE_SECTION,'CapF17',edtCapF17.Text); + CWM.WriteString(C_INI_FILE_SECTION,'CapF18',edtCapF18.Text); + CWM.WriteString(C_INI_FILE_SECTION,'CapF19',edtCapF19.Text); + CWM.WriteString(C_INI_FILE_SECTION,'CapF20',edtCapF20.Text); + CWM.WriteInteger(C_INI_FILE_SECTION,'EnterFunction',rgEnter.ItemIndex); CWM.UpdateFile; finally diff --git a/src/fLogUploadStatus.pas b/src/fLogUploadStatus.pas index 9cf99c9..4437968 100644 --- a/src/fLogUploadStatus.pas +++ b/src/fLogUploadStatus.pas @@ -44,6 +44,7 @@ type procedure UploadDataToHamQTH(ToAll : Boolean = False); procedure UploadDataToClubLog(ToAll : Boolean = False); procedure UploadDataToHrdLog(ToAll : Boolean = False); + procedure UploadDataToUDPLog(ToAll : Boolean = False); procedure UploadDataToAll; procedure SyncUploadInformation; end; @@ -110,6 +111,17 @@ begin end; Result := False end + end; + upUDPLog : begin + if not cqrini.ReadBool('OnlineLog','UdUP',False) then + begin + if (not ToAll) then + begin + frmLogUploadStatus.SyncMsg := Format(C_IS_NOT_ENABLED,['UDPLog']); + Synchronize(@frmLogUploadStatus.SyncUploadInformation) + end; + Result := False + end end end //case end; @@ -126,7 +138,7 @@ var ResultCode : Integer; Command : String; UpSuccess : Boolean = False; - FatalError : Boolean = False; + ErrorCode : Integer = 0; AlreadyDel : Boolean = False; begin data := TStringList.Create; @@ -181,17 +193,22 @@ begin begin ToMainThread('Uploading '+dmLogUpload.Q.FieldByName('callsign').AsString,''); dmLogUpload.PrepareInsertHeader(WhereToUpload,dmLogUpload.Q.Fields[0].AsInteger,dmLogUpload.Q.FieldByName('id_cqrlog_main').AsInteger,data); - UpSuccess := dmLogUpload.UploadLogData(dmLogUpload.GetUploadUrl(WhereToUpload,Command),data,Response,ResultCode) + UpSuccess := dmLogUpload.UploadLogData(WhereToUpload,Command,data,Response,ResultCode) end else if (Command = 'UPDATE') then begin - ToMainThread('Deleting original '+dmLogUpload.Q.FieldByName('old_callsign').AsString,''); - - if dmLogUpload.Q.FieldByName('upddeleted').asInteger = 1 then + if (WhereToUpload=upUDPLog) then begin - dmLogUpload.PrepareDeleteHeader(WhereToUpload,dmLogUpload.Q.Fields[0].AsInteger,data); + UpSuccess := True; + Response := ''; + ResultCode := 200 + end + else if dmLogUpload.Q.FieldByName('upddeleted').asInteger = 1 then + begin + ToMainThread('Deleting original '+dmLogUpload.Q.FieldByName('old_callsign').AsString,''); + dmLogUpload.PrepareDeleteHeader(WhereToUpload,dmLogUpload.Q.Fields[0].AsInteger,dmLogUpload.Q.FieldByName('id_cqrlog_main').AsInteger,data); if dmData.DebugLevel >= 1 then begin @@ -199,12 +216,12 @@ begin Writeln(data.Text) end; - UpSuccess := dmLogUpload.UploadLogData(dmLogUpload.GetUploadUrl(WhereToUpload,'DELETE'),data,Response,ResultCode); + UpSuccess := dmLogUpload.UploadLogData(WhereToUpload,'DELETE',data,Response,ResultCode); if dmData.DebugLevel >= 1 then begin - Writeln('Response :',Response); - Writeln('ResultCode:',ResultCode) + Writeln('Response : ',Response); + Writeln('ResultCode: ',ResultCode) end end else begin @@ -216,20 +233,24 @@ begin if UpSuccess then begin - Response := dmLogUpload.GetResultMessage(WhereToUpload,Response,ResultCode,FatalError); - if FatalError then + Response := dmLogUpload.GetResultMessage(WhereToUpload,Response,ResultCode,ErrorCode); + if (ErrorCode = 1) then begin ToMainThread('Could not delete original QSO data!',''); Break end - else + else if (ErrorCode = 2) then + begin + ToMainThread('Could not delete original QSO data. Reason: ' + Response,''); + end + else if (WhereToUpload<>upUDPLog) then ToMainThread('','OK'); AlreadyDel := True; data.Clear; dmLogUpload.PrepareUserInfoHeader(WhereToUpload,data); ToMainThread('Uploading updated '+dmLogUpload.Q.FieldByName('callsign').AsString,''); dmLogUpload.PrepareInsertHeader(WhereToUpload,dmLogUpload.Q.Fields[0].AsInteger,dmLogUpload.Q.FieldByName('id_cqrlog_main').AsInteger,data); - UpSuccess := dmLogUpload.UploadLogData(dmLogUpload.GetUploadUrl(WhereToUpload,Command),data,Response,ResultCode) + UpSuccess := dmLogUpload.UploadLogData(WhereToUpload,Command,data,Response,ResultCode) end else ToMainThread('Update failed! Check Internet connection','') @@ -237,8 +258,8 @@ begin else if (Command = 'DELETE') then begin ToMainThread('Deleting '+dmLogUpload.Q.FieldByName('old_callsign').AsString,''); - dmLogUpload.PrepareDeleteHeader(WhereToUpload,dmLogUpload.Q.Fields[0].AsInteger,data); - UpSuccess := dmLogUpload.UploadLogData(dmLogUpload.GetUploadUrl(WhereToUpload,Command),data,Response,ResultCode) + dmLogUpload.PrepareDeleteHeader(WhereToUpload,dmLogUpload.Q.Fields[0].AsInteger,dmLogUpload.Q.FieldByName('id_cqrlog_main').AsInteger,data); + UpSuccess := dmLogUpload.UploadLogData(WhereToUpload,Command,data,Response,ResultCode) end; if dmData.DebugLevel >= 1 then @@ -246,20 +267,20 @@ begin Writeln('data.Text:'); Writeln(data.Text); Writeln('-----------'); - Writeln('Response :',Response); - Writeln('ResultCode:',ResultCode); + Writeln('Response : ',Response); + Writeln('ResultCode: ',ResultCode); Writeln('-----------') end; if UpSuccess then begin - Response := dmLogUpload.GetResultMessage(WhereToUpload,Response,ResultCode,FatalError); + Response := dmLogUpload.GetResultMessage(WhereToUpload,Response,ResultCode,ErrorCode); if (Response='OK') then ToMainThread('','OK') else ToMainThread(Response,''); - if FatalError then + if (ErrorCode = 1) then begin if AlreadyDel then //if cmd was update, delete was successful but new insert was not begin @@ -276,14 +297,14 @@ begin dmLogUpload.MarkAsUpDeleted(dmLogUpload.Q.Fields[0].AsInteger) end; ToMainThread('Upload failed! Check Internet connection',''); - FatalError := True; + ErrorCode := 1; Break end; Sleep(2000); //we don't want to make small DDOS attack to server dmLogUpload.Q.Next end; //while not dmLogUpload.Q.Eof do - if not FatalError then + if not (ErrorCode = 1) then ToMainThread('Done ...','') finally dmLogUpload.Q.Close; @@ -306,7 +327,8 @@ begin case WhereToUpload of upHamQTH : Result := C_HAMQTH; upClubLog : Result := C_CLUBLOG; - upHrdlog : Result := C_HRDLOG + upHrdlog : Result := C_HRDLOG; + upUDPLog : Result := C_UDPLOG end //case end; @@ -443,11 +465,17 @@ begin UploadDataToOnlineLogs(upHrdLog, ToAll) end; +procedure TfrmLogUploadStatus.UploadDataToUDPLog(ToAll : Boolean = False); +begin + UploadDataToOnlineLogs(upUDPLog, ToAll) +end; + procedure TfrmLogUploadStatus.UploadDataToAll; begin UploadDataToOnlineLogs(upHamQTH, True); UploadDataToOnlineLogs(upClubLog, True); - UploadDataToOnlineLogs(upHrdLog, True) + UploadDataToOnlineLogs(upHrdLog, True); + UploadDataToOnlineLogs(upUDPLog, True) end; end. diff --git a/src/fMain.lfm b/src/fMain.lfm index 68660dd..5993af1 100644 --- a/src/fMain.lfm +++ b/src/fMain.lfm @@ -1,16 +1,16 @@ object frmMain: TfrmMain - Left = 683 + Left = 208 Height = 669 - Top = 272 + Top = 41 Width = 986 HelpType = htKeyword HelpKeyword = 'help/index.html' HorzScrollBar.Page = 672 - VertScrollBar.Page = 275 + VertScrollBar.Page = 272 ActiveControl = Panel2 AutoScroll = True Caption = 'CQRLOG for Linux' - ClientHeight = 647 + ClientHeight = 644 ClientWidth = 986 Constraints.MinHeight = 148 Constraints.MinWidth = 536 @@ -160,12 +160,12 @@ object frmMain: TfrmMain OnKeyDown = FormKeyDown OnKeyUp = FormKeyUp OnShow = FormShow - LCLVersion = '2.0.12.0' + LCLVersion = '2.2.6.0' object sbMain: TStatusBar AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 0 - Height = 22 + Height = 19 Top = 625 Width = 986 Panels = < @@ -206,7 +206,7 @@ object frmMain: TfrmMain AnchorSideLeft.Control = pnlButtons AnchorSideTop.Control = pnlButtons Left = 10 - Height = 28 + Height = 33 Top = 5 Width = 130 Action = acNewQSO @@ -214,6 +214,8 @@ object frmMain: TfrmMain BorderSpacing.Left = 9 BorderSpacing.Top = 4 Constraints.MinWidth = 130 + Images = imgMain1 + ImageIndex = 0 TabOrder = 0 end object btnViewQSO: TBitBtn @@ -222,13 +224,15 @@ object frmMain: TfrmMain AnchorSideTop.Control = btnNewQSO AnchorSideTop.Side = asrCenter Left = 150 - Height = 28 + Height = 33 Top = 5 Width = 130 Action = acView AutoSize = True BorderSpacing.Left = 10 Constraints.MinWidth = 130 + Images = imgMain1 + ImageIndex = 1 TabOrder = 1 end object btnClose: TBitBtn @@ -236,7 +240,7 @@ object frmMain: TfrmMain AnchorSideRight.Control = pnlButtons AnchorSideRight.Side = asrBottom Left = 846 - Height = 28 + Height = 33 Top = 5 Width = 130 Action = acClose @@ -244,6 +248,8 @@ object frmMain: TfrmMain AutoSize = True BorderSpacing.Right = 9 Constraints.MinWidth = 130 + Images = imgMain1 + ImageIndex = 4 TabOrder = 2 end object btnDeleteQSO: TBitBtn @@ -251,7 +257,7 @@ object frmMain: TfrmMain AnchorSideTop.Side = asrCenter AnchorSideRight.Control = btnClose Left = 706 - Height = 28 + Height = 33 Top = 5 Width = 130 Action = acDeleteQSO @@ -259,6 +265,8 @@ object frmMain: TfrmMain AutoSize = True BorderSpacing.Right = 10 Constraints.MinWidth = 130 + Images = imgMain1 + ImageIndex = 2 TabOrder = 3 end object btnSort: TBitBtn @@ -266,7 +274,7 @@ object frmMain: TfrmMain AnchorSideTop.Side = asrCenter AnchorSideRight.Control = btnDeleteQSO Left = 566 - Height = 28 + Height = 33 Top = 5 Width = 130 Action = acSort @@ -274,6 +282,8 @@ object frmMain: TfrmMain AutoSize = True BorderSpacing.Right = 10 Constraints.MinWidth = 130 + Images = imgMain1 + ImageIndex = 6 TabOrder = 4 end object BitBtn5: TBitBtn @@ -282,13 +292,15 @@ object frmMain: TfrmMain AnchorSideTop.Control = btnNewQSO AnchorSideTop.Side = asrCenter Left = 290 - Height = 28 + Height = 33 Top = 5 Width = 130 Action = acEditQSO AutoSize = True BorderSpacing.Left = 10 Constraints.MinWidth = 130 + Images = imgMain1 + ImageIndex = 7 TabOrder = 5 end end @@ -312,7 +324,7 @@ object frmMain: TfrmMain Left = 10 Height = 17 Top = 11 - Width = 76 + Width = 72 Alignment = taRightJustify BorderSpacing.Left = 10 Caption = 'QSO in log:' @@ -325,10 +337,10 @@ object frmMain: TfrmMain AnchorSideLeft.Side = asrBottom AnchorSideBottom.Control = lblQSOInLog AnchorSideBottom.Side = asrBottom - Left = 96 + Left = 92 Height = 17 Top = 11 - Width = 43 + Width = 45 Anchors = [akLeft, akBottom] BorderSpacing.Left = 10 Caption = '10000' @@ -343,10 +355,10 @@ object frmMain: TfrmMain AnchorSideLeft.Control = Panel2 AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = lblQSOInLog - Left = 472 + Left = 473 Height = 17 Top = 11 - Width = 42 + Width = 41 Caption = 'DXCC:' Layout = tlBottom ParentColor = False @@ -360,7 +372,7 @@ object frmMain: TfrmMain Left = 524 Height = 17 Top = 11 - Width = 26 + Width = 27 Anchors = [akLeft, akBottom] BorderSpacing.Left = 10 Caption = '238' @@ -372,10 +384,10 @@ object frmMain: TfrmMain object lblDXCCConfirmed: TLabel AnchorSideTop.Control = lblQSOInLog AnchorSideRight.Control = lblDXCCCmf - Left = 837 + Left = 839 Height = 17 Top = 11 - Width = 76 + Width = 74 Alignment = taRightJustify Anchors = [akTop, akRight] BorderSpacing.Right = 10 @@ -727,7 +739,7 @@ object frmMain: TfrmMain Left = 10 Height = 17 Top = 10 - Width = 129 + Width = 122 BorderSpacing.Left = 10 BorderSpacing.Top = 10 Caption = 'Comment for QSO:' @@ -742,7 +754,7 @@ object frmMain: TfrmMain Left = 10 Height = 17 Top = 37 - Width = 48 + Width = 45 BorderSpacing.Top = 10 Caption = 'Award:' Layout = tlBottom @@ -754,10 +766,10 @@ object frmMain: TfrmMain AnchorSideLeft.Side = asrBottom AnchorSideBottom.Control = lblCommentForQSO AnchorSideBottom.Side = asrBottom - Left = 145 + Left = 138 Height = 17 Top = 10 - Width = 91 + Width = 85 Anchors = [akLeft, akBottom] BorderSpacing.Left = 6 Layout = tlBottom @@ -768,10 +780,10 @@ object frmMain: TfrmMain AnchorSideLeft.Side = asrBottom AnchorSideBottom.Control = lblAward AnchorSideBottom.Side = asrBottom - Left = 68 + Left = 65 Height = 17 Top = 37 - Width = 68 + Width = 62 Anchors = [akLeft, akBottom] BorderSpacing.Left = 10 Layout = tlBottom @@ -793,7 +805,7 @@ object frmMain: TfrmMain Left = 0 Height = 17 Top = 10 - Width = 73 + Width = 70 BorderSpacing.Top = 10 Caption = 'QS_S date:' Layout = tlBottom @@ -805,10 +817,10 @@ object frmMain: TfrmMain AnchorSideLeft.Side = asrBottom AnchorSideBottom.Control = lblQSLSDate AnchorSideBottom.Side = asrBottom - Left = 79 + Left = 76 Height = 17 Top = 10 - Width = 92 + Width = 85 Anchors = [akLeft, akBottom] BorderSpacing.Left = 6 Layout = tlBottom @@ -819,10 +831,10 @@ object frmMain: TfrmMain AnchorSideLeft.Side = asrBottom AnchorSideBottom.Control = lblQSLRDate AnchorSideBottom.Side = asrBottom - Left = 81 + Left = 77 Height = 17 Top = 37 - Width = 93 + Width = 86 Anchors = [akLeft, akBottom] BorderSpacing.Left = 6 Layout = tlBottom @@ -835,7 +847,7 @@ object frmMain: TfrmMain Left = 0 Height = 17 Top = 37 - Width = 75 + Width = 71 BorderSpacing.Top = 10 Caption = 'QS_R date:' Layout = tlBottom @@ -859,7 +871,7 @@ object frmMain: TfrmMain Left = 0 Height = 17 Top = 10 - Width = 116 + Width = 110 BorderSpacing.Top = 10 Caption = 'LoTW QS_S date:' Layout = tlBottom @@ -871,10 +883,10 @@ object frmMain: TfrmMain AnchorSideLeft.Side = asrBottom AnchorSideBottom.Control = lblLoTWQSLSDate AnchorSideBottom.Side = asrBottom - Left = 122 + Left = 116 Height = 17 Top = 10 - Width = 98 + Width = 90 Anchors = [akLeft, akBottom] BorderSpacing.Left = 6 Layout = tlBottom @@ -886,10 +898,10 @@ object frmMain: TfrmMain AnchorSideTop.Side = asrCenter AnchorSideBottom.Control = lblLoTWQSLRDate AnchorSideBottom.Side = asrBottom - Left = 123 + Left = 117 Height = 17 Top = 37 - Width = 101 + Width = 91 Anchors = [akLeft, akBottom] BorderSpacing.Left = 6 BorderSpacing.Top = 10 @@ -903,7 +915,7 @@ object frmMain: TfrmMain Left = 0 Height = 17 Top = 37 - Width = 117 + Width = 111 BorderSpacing.Top = 10 Caption = 'LoTW QS_R date:' Layout = tlBottom @@ -928,7 +940,7 @@ object frmMain: TfrmMain Left = 11 Height = 17 Top = 5 - Width = 63 + Width = 61 BorderSpacing.Left = 10 Caption = 'Distance:' ParentColor = False @@ -940,10 +952,10 @@ object frmMain: TfrmMain AnchorSideTop.Control = lblDistance AnchorSideTop.Side = asrCenter AnchorSideBottom.Side = asrBottom - Left = 80 + Left = 78 Height = 17 Top = 5 - Width = 45 + Width = 42 BorderSpacing.Left = 6 Caption = 'lblDist' ParentColor = False @@ -955,10 +967,10 @@ object frmMain: TfrmMain AnchorSideRight.Control = pnlDistance AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom - Left = 903 + Left = 908 Height = 17 Top = 5 - Width = 72 + Width = 67 Anchors = [akTop, akRight] BorderSpacing.Right = 10 Caption = 'lblLongest' @@ -968,10 +980,10 @@ object frmMain: TfrmMain AnchorSideTop.Control = lblDistance AnchorSideTop.Side = asrCenter AnchorSideRight.Control = lblLongest - Left = 803 + Left = 815 Height = 17 Top = 5 - Width = 94 + Width = 87 Anchors = [akTop, akRight] BorderSpacing.Right = 6 Caption = 'Longest QSO:' @@ -982,10 +994,10 @@ object frmMain: TfrmMain AnchorSideTop.Control = lblDistance AnchorSideTop.Side = asrCenter AnchorSideRight.Control = lblSumDist - Left = 348 + Left = 354 Height = 17 Top = 5 - Width = 99 + Width = 94 Anchors = [akTop, akRight] BorderSpacing.Right = 6 Caption = 'Total distance:' @@ -997,10 +1009,10 @@ object frmMain: TfrmMain AnchorSideTop.Control = lblDistance AnchorSideTop.Side = asrCenter AnchorSideBottom.Side = asrBottom - Left = 453 + Left = 454 Height = 17 Top = 5 - Width = 81 + Width = 79 Caption = 'lblSumDist ' ParentColor = False end @@ -1008,8 +1020,8 @@ object frmMain: TfrmMain end object mnuMain: TMainMenu Images = imgMain1 - left = 64 - top = 272 + Left = 64 + Top = 272 object mnuFile: TMenuItem Caption = 'File' object MenuItem7: TMenuItem @@ -1134,7 +1146,7 @@ object frmMain: TfrmMain Action = acButtons OnClick = acButtonsExecute end - object MenuItem78: TMenuItem + object mnuShowDetails: TMenuItem Action = acPnlDetails OnClick = acPnlDetailsExecute end @@ -1205,6 +1217,10 @@ object frmMain: TfrmMain Caption = 'Confirmed by email (CE)' OnClick = mnuCEClick end + object mnuOR: TMenuItem + Caption = 'Online request (OR)' + OnClick = mnuORClick + end object mnuOQRS: TMenuItem Caption = 'Online QSL request system (OQRS)' OnClick = mnuOQRSClick @@ -1468,6 +1484,10 @@ object frmMain: TfrmMain object MenuItem87: TMenuItem Action = acBigSquares end + object MenuItem2: TMenuItem + Action = acCounty + Caption = 'County' + end object MenuItem86: TMenuItem Caption = '-' end @@ -1619,6 +1639,15 @@ object frmMain: TfrmMain Action = acMarkAllHrdLog end end + object MenuItem108: TMenuItem + Caption = 'UDP Log' + object MenuItem109: TMenuItem + Action = acUploadToUDPLog + end + object MenuItem110: TMenuItem + Action = acMarkAllUDPLog + end + end object MenuItem94: TMenuItem Caption = '-' end @@ -1631,6 +1660,10 @@ object frmMain: TfrmMain object MenuItem96: TMenuItem Action = acUploadToAll end + object MenuItem107: TMenuItem + Caption = 'Remove all upload triggers' + OnClick = MenuItem107Click + end end object mnuHelp: TMenuItem Caption = 'Help' @@ -1651,8 +1684,8 @@ object frmMain: TfrmMain end object ActionList1: TActionList Images = imgMain1 - left = 168 - top = 384 + Left = 168 + Top = 384 object acView: TAction Caption = 'View QSO' Hint = 'View QSO' @@ -1994,6 +2027,16 @@ object frmMain: TfrmMain Caption = 'Mark all QSO as uploaded' OnExecute = acMarkAllHrdLogExecute end + object acUploadToUDPLog: TAction + Category = 'OnlineLog' + Caption = 'Upload all changes' + OnExecute = acUploadToUDPLogExecute + end + object acMarkAllUDPLog: TAction + Category = 'OnlineLog' + Caption = 'Mark all QSO as uploaded' + OnExecute = acMarkAllUDPLogExecute + end object acUploadToAll: TAction Category = 'OnlineLog' Caption = 'Upload changes to all logs' @@ -2023,522 +2066,301 @@ object frmMain: TfrmMain Caption = 'CreateLoadFilter' OnExecute = acCreateLoadFilterExecute end + object acCounty: TAction + Caption = 'County Statistics' + OnExecute = acCountyExecute + end end object tmrTime: TTimer OnTimer = tmrTimeTimer - left = 88 - top = 385 + Left = 88 + Top = 385 end object dlgOpen: TOpenDialog DefaultExt = '.adi' Filter = 'ADIF|*.adi|ADIF|*.ADI' FilterIndex = 0 - left = 117 - top = 110 + Left = 117 + Top = 110 end object imgMain: TImageList - left = 176 - top = 168 + Left = 176 + Top = 168 Bitmap = { - 4C690F00000010000000100000006363630063636300C78A4CFFC78B4EFFC78B - 4EFFC78B4EFFC78B4EFFC78C4EFFC88B4EFFC68A4EFFC4884AFFC3753AFF01FF - C4001F000000050101000101010000000000C38448FFF6F1EBFFF7F3EDFFF7F3 - ECFFF7F2ECFFF7F2ECFFF7F2ECFFF7F1EBFFF6F1EBFFF1E5D6FFE1B17CFFDA93 - 64FF516107007114320091A1080042B1C100C4874AFFF9F5F1FFF9DFC6FFFAE0 - C8FFFAE1C8FFFADFC7FFF8DEC4FFF7DAC0FFF3D5B7FFFEFAF7FFF5D7B3FFE0AF - 7CFFDA9163FF737475007778790083848500C5884BFFF8F4F0FFFBE2CCFFFAE2 - CDFFFAE2CCFFFAE1CAFFF8DFC7FFF7DBC1FFF4D5B9FFFCFAF7FFFBE5CCFFF9E4 - C8FFE1B583FFBE7841FFE8E9EA00F2F3F400C5884AFFF8F4F0FFFBE2CEFFFAE3 - CFFFFBE3CEFFFBE2CCFFF9E0C9FFF8DCC3FFF5D8BBFFF3E8DEFFF6F1EBFFFAF6 - F2FFF4EEE8FFC17D44FF0102770001020300C5884AFFF8F3EFFFFBE5D2FFFBE5 - D3FFFCE6D2FFFBE3D0FFFAE2CCFFF9DFC7FFF7DBC1FFF4D5BAFFF2D3B4FFF0D1 - B2FFF7F3EFFFC38145FF464748004A535400C58749FFF8F3EEFFFDE6D6FFFCE6 - D5FFFCE6D4FFFCE5D3FFFBE5D1FFFAE0CBFFF9DEC6FFF7DBC1FFF5D9BCFFF5D7 - BAFFF9F3EEFFC58245FFBAC2C300C5C6C700C58748FFF8F3ECFFFDE7D7FFFDE7 - D7FFFDE7D6FFFDE6D5FFFCE4D2FFFBE3D0FFFAE0CBFFF9DFC6FFF8DCC2FFF7DB - C1FFF9F3ECFFC58144FFFFD95A00BE015400C58346FFF8F2EBFFFDE7D5FFFDE7 - D6FFFCE6D5FFFCE6D5FFFCE6D4FFFCE4D2FFFAE3CFFFFAE2CBFFF9DEC6FFF9DE - C5FFF9F1E9FFC57F41FFEF007700E3006B00C48144FFF7F1EAFFFDE6D5FFFCE6 - D5FFFCE6D5FFFCE6D5FFFCE5D4FFFCE4D2FFFBE3D0FFFBE1CCFFFAE0CAFFFAE0 - C8FFFAF6F1FFC47B3EFF008CB50017B88B00C47F41FFF7F0E7FFFDE4D4FFFCE4 - D2FFFCE4D2FFFBE4D2FFFBE4D2FFFBE3D0FFFBE1CDFFFBE1CBFFFADFC8FFFAE0 - C7FFFCF9F6FFC0753AFF0065B300008AB400C37B3FFFF6EFE5FFF7B354FFF6B3 - 55FFF6B453FFF7B352FFF7B152FFF6B251FFF6B251FFF6B150FFF6B14EFFF6B1 - 4EFFFBF8F4FFBE6E35FF0044CE000000E000C0773BFFF6ECE2FFFCC16DFFFED7 - 9FFFFED69DFFFED59AFFFED697FFFED595FFFED594FFFED493FFFED392FFFABD - 64FFFAF6F3FFBA6630FFFF000000FFFFFF00BE7037FFF4EADEFFFCBE67FFFBBC - 66FFFABD64FFFBBD63FFFBBD63FFFBBC61FFFABC62FFFABB60FFFBBD5FFFFBBB - 61FFFCFAF7FFB8632CFF00FF00000000FC00BB6832FFF7F0E9FFF6EBDEFFF5EA - DDFFF5E9DDFFF5E9DBFFF5E9DBFFF9F2EAFFF9F2EAFFF9F1E9FFFBF6F2FFFBF7 - F3FFFDFDFCFFB65F29FF00FF00000000FF0000FF0000B9642FFFBA6530FFB965 - 2FFFB9652FFFB9652FFFB9642FFFB9642EFFB8642DFFB8642DFFB8632DFFB863 - 2DFFB6612BFF00E424000025FF00636363006363630063636300636363006363 - 630063636300636363006363FF00001108000C000C00012200001101030001FF - C4001F0000000501010001010100000000000000000002030400F9DBBEFFF8D8 - BAFFF5D5B7FFF3D2B3FFF0CEAEFFEDCAAAFF00017D0002030000110512003141 - 0600516107007114320091A1080042B1C10052D1F000F9DABDFFF8E1CCFFF9EB - DDFFF8EDE1FFF8ECE1FFF7E8D9FFEFD4BCFFE6BF9EFF53545500575859006364 - 650067686900737475007778790083848500F9DABCFFF7E1CBFFF9EDE2FFF6E6 - D5FFF5E1CDFFF5E0CAFFF5E2CFFFF8E9DCFFEBCEB4FFDEB592FFD2D3D400D6D7 - D800DAE1E200E4E5E600E8E9EA00F2F3F400F6D6B8FFF8EADDFFF6E6D5FFF5E0 - CBFFF4DFC9FFF4DDC7FFF4DCC4FFF5E0CAFFF4E1CFFFDAAF8BFF00B511000201 - 020004030400050404000102770001020300F3D2B3FFF8ECE0FFF5E0CBFFF4DE - C8FFF4DDC6FFF3DBC3FFF3DAC1FFF3D9BFFFF7E6D5FFD6A985FF191A26002829 - 2A00363738003A434400464748004A535400EFCDADFFF8EBDEFFF4DEC7FFF4DC - C5FFF3DBC2FFF3D9C0FFF2D8BDFFF2D6BCFFF7E5D2FFD2A47EFFA3A4A500A7A8 - A900B2B3B400B6B7B800BAC2C300C5C6C700EBC7A7FFF6E6D6FFF5E0CBFFF3DA - C1FFF3D9BFFFF2D7BCFFF2D6BAFFF3DAC1FFF2DDC8FFCC9E7AFF003F0000A47D - A200B4BF350031AA6C00754B6300FFD97200E7C2A1FFECCFB6FFF7E7D8FFF4DD - C7FFF2D7BCFFF2D5BAFFF3DAC1FFF6E3D1FFDEBA9CFF9C9391FF4189CE004189 - CE004189CE004189CE004189CE004189CE004189CE00E0B795FFE7C8ADFFF4E0 - CCFFF6E4D2FFF6E4D0FFF2DCC7FFDEB99BFFC6A790FF85ADD4FF407CB4FF438A - CF00438ACF00438ACF00438ACF00438ACF00438ACF00438ACF00D8AD89FFD5A8 - 84FFD2A47EFFCF9F7AFFCC9B75FFA19289FF74A1CBFFAACAE7FF75A3CDFF2F6F - A7FF438ACF00438ACF00438ACF00438ACF00438ACF00458BD100458BD100458B - D100458BD100458BD100458BD100458BD1003B78B0FF6396C4FF9CC0E3FF6598 - C6FF1E649CFF458BD100458BD100458BD100458BD100458BD100458BD100458B - D100458BD100458BD100458BD100458BD100458BD1002A6CA4FF548CBBFF88B4 - DCFF175E96FF458BD100458BD100468DD200468DD200468DD200468DD200468D - D200468DD200468DD200468DD200468DD200468DD200468DD2001A6199FF2166 - 9CFF105A92FF468DD200468DD200468DD200468DD200468DD200468DD200468D - D200468DD200468DD200468DD200468DD200468DD200468DD200468DD200468D - D200468DD200488ED300488ED300488ED300488ED300488ED300488ED300488E - D300488ED300488ED300488ED300488ED300488ED300488ED300488ED300488E - D300488ED300488ED300488ED300636363006363630063636300636363006363 - 630063636300757576FF6363FF00001108000C000C00012200001101030001FF - C4001F0000000501010001010100000000000000000002030400060708004747 - 47FFC3C3C3FFFBFBFBFFC4C4C4FF7A7A7AFFBCBCBCFF8B8B8BFF110512003141 - 0600516107007114320091A1080042B1C10052D1F00033627200CECECEFFFAFA - FAFFFEFEFEFFEBEBEBFFAEAFAFFFC5C6C6FFFAFAFAFFFEFEFEFFBFC3C8FFB4B7 - BBFF67686900737475007778790083848500878889007D7973FFBFC8D4FFEAE9 - E8FFE1E0E1FFBDBDBDFFC3C4C4FFE6E6E6FFEDEDEDFFF4F4F4FFEFF0F1FFB8BA - BEFF79756FFFE4E5E600E8E9EA00F2F3F400F6F7F800BEBDBBFF6A88B2FFA6B1 - BEFFACAFB3FFA3A8AEFFBFC3C9FFC6CBD1FFCACFD6FFCED4DBFFC1C6CEFFAFB8 - C3FFBABAB7FF05040400010277000102030004052100D7D8DAFFE0E0E0FFE0E0 - E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0 - E0FFD3D4D6FF3A434400464748004A53540056575800ACBACDFFA3B8D6FFA4B7 - D2FFA3B7D2FFA4B8D2FFA5B8D2FFA4B7D2FFA6B8D2FFA7B8D1FFA6B8D1FFA6B9 - D5FFACBACCFFB6B7B800BAC2C300C5C6C700C9CAD200144E9AFF3083F2FF2E7C - E9FF2B7BE9FF2D7CE9FF4188EAFF4288EAFF2F7DEAFF2C7BE9FF2476E9FF1372 - F3FF06479BFF256355008E6BC600DDCF7200563FFF00265696FF60A5FEFF5A9C - F8FF5398F8FFB7D4FCFFD3E5FEFFE4EFFEFFA7CAFCFF4992F7FF3C8AF7FF2784 - FEFF104A96FFAF7CFA003CDA7100E9826A0067FFD9001C477FFF529DFEFF5196 - F6FF72AAF8FFDFEBFDFF94BEF9FFA7CAFAFFB6D2FBFF2A7FF4FF0F6FF3FF046F - FEFF073C81FFF60177000602790000007000AF00B000153A69FF4C9AFEFF4891 - F5FFE7F0FDFFA2C7FAFF005EF1FF1371F3FFE3EEFDFF7AAFF8FF005FF1FF016D - FEFF06326BFF00FFFF0000000000000000000000FF0010315BFF2683FEFF0B6A - F2FFAACCFAFF85B6F8FF3786F4FF3B89F5FFAFCEFAFF60A1F6FF0668F2FF036E - FEFF062D5FFFFFFF400000003E00D900000000FFFF0000000000006BFCFF0065 - F2FF217DF4FFE1EDFDFFD9EAFCFFEEF5FDFFC2DEFCFF3294F5FF3699F5FF0F78 - FDFF030000000000CF000D00000000000000FFFFD500052ED200046DFCFF046C - F7FF066FF6FF2C88F7FF4196F9FF63ACFAFF439DF9FF349AF8FF43A6FAFF1D85 - FEFF094BDD00FF0000000000E7006608000000007100C03F0C000862D9FF076A - ECFF0A6BEAFF086BEAFF0B6EEAFF0D71EAFF1476EBFF1C7CEBFF2081EDFF146E - DCFFFAFFFA00000000007CFFFF00FFFF8500FF00000000009700FFFFFF000000 - 0400FFFFFF00FFFFFF00FFFF0D00F6EFAC000000000000FFFF00000000000000 - 0000FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF00E39344FFE29243FFE599 - 51FFE18D42FFDE8330FF0A7ED700EFC873000000000000FFFF00000000000000 - 0000E1ECF700F8D7790000000000000A7E00E5974DFFE18D3FFFAAFD5200DE84 - 34FFE59E5FFFDC7A29FFFFFFFF00FFFFFF000011CE00FFFFFF00FFD217000000 - 0000CEFFFF00FFFFFF001700000000FFFF00E18C3BFF00000000FFFFF600DE7D - 2DFFE39758FFDA7322FFFFFFFF00D217000015EAE9000000000016EBEA000000 - 000000FFFF000000000000AAFF003F091100DE8434FFE08B40FFDC7A29FFE6A2 - 6BFFDD8039FF00FFFF000000000000000000FFFF00000A8DFF0000000000AAFF - D00009115100FFBD01000055FF00E08D41FFDE7D2DFF0000000000FFFF0091A9 - 5CFF84A050FF0000000014E7FF0000003700E612000000001400FF48000000FF - FF000000000000000000FFFF0000E39454FFDA7624FFFFE612008BA352FF87CA - 8FFF82C58AFF609E51FFFFAA0000409048FFE5AB77FFE4A976FFE6A875FFE5A8 - 73FFE4A570FFE1A16FFF76000000DA7322FFD86F1DFFD76A1AFF839F51FF7FC4 - 87FFAFDBB5FF74B77BFF409048FF38843EFFE4A875FFE4A773FFE9BA91FFE8B9 - 92FFE6B388FFDF9D6BFF00FFFF0000000000D2FF2E0000000000002EFF0050A6 - 59FF70B579FFA5D7ACFF9DD2A4FF307936FF00000000E4A56FFFE2A16EFFEDBB - 94FFE9A874FFFF2E0000000000002EFFD70000000000FFACAD00550000000000 - 0000409048FF9AD1A1FF94CF9CFF296F2EFFE6A56FFFE1A06CFFE19E69FFECB3 - 86FFE8A571FF00FFFF000000000000000000FFFFFF00FFFF9200000000004090 - 48FF38843EFF307936FF296F2EFF858549FFE3A97BFFDE9B68FF00FFFF00E9A9 - 78FFE8A775FF000000000003FF000000FC000200000000000000FFFB000000FF - FF000000000000000000FFFFFF00E4A371FFDE9A67FFFF02000000000000E8A5 - 72FFE7A471FF2BFFFF00000000000000000000FFFF0000000000EFFF11000000 - 00000012FF000000EF00E5A068FFE2A97FFFDB9463FF00FFFF0000000000E496 - 5CFFE8A575FFEDBB94FF93000000FF1100000000000012FFEE0000000000ABFF - FF0000000000E6A067FFE0A478FFDB9361FFDA9060FFD98F5DFFD78C5AFFDE99 - 6BFFE8A678FFECB386FFFFCF000000FFFF000000000000000000FFFF00000000 - 2D00E3000000E4A474FFDC9767FF3BFFCF0000000000FFAAAB0055000000E28F - 56FFE8A679FFE18C53FF92FF8E0000000000008AFF00000092008E0000000000 - 0000E7A472FFDA905EFFDB8F5CFF00000000FFFF000000000500FB000000E499 - 67FFE9AC82FFE3935DFF00001500EA151500EA1500000000000000FFFF00E599 - 60FFE4965DFFE1935AFFE29259FF00003600F4220000E28E53FFE18C52FFE18B - 50FFE1894FFFE1894FFFE1894FFF636363006363630063636300636363006363 - 630063636300636363006363FF00001108000C000C00012200001101030001FF - C4006C9BD3FF6999D1FF6596CEFF000000000000000002030400060708000A0B - FF0000B5100002010300020403000504040000017D00020300006F9DD5FF6C9B - D3FF84B0D9FF5990B8FF5F92CAFF42B1C10052D1F0007F7F7FFF7D7D7DFF7B7B - 7BFF797979FF767676FF747474FF717171FF709DD3FF6E9DD5FF86B1DBFFAAD2 - E7FFA8CFE5FF578FB7FF588DC5FF83848500878889007C7C7CFF989898FF9898 - 98FF999999FF999999FF9A9A9AFF9A9A9AFF6E9CD2FFA9D0E6FFAAD0E6FF97C6 - E0FF90C1DDFF558EB6FF5188C0FFF2F3F400F6F7F800797979FF989898FF5190 - 58FF989998FF9A9A9AFF9B9B9BFF9B9B9BFF6B99CFFFA6CDE4FF8EC0DEFF88BC - DBFF8ABCDBFF528CB5FF4A83BBFF0102030004052100767676FF999999FF3C89 - 44FF48894EFF9B9B9BFF9C9C9CFF9C9C9CFF6595CBFFA1CAE2FF88BCDBFF82B8 - D9FF83B8D9FF508AB4FF427DB5FF43934CFF41904AFF3E8C47FF3C8844FF5CA3 - 64FF599F60FF44824AFF9D9D9DFF9D9D9DFF5F91C8FF9DC6E1FF82B7D9FF7CB3 - D6FF7DB2D6FF4E88B3FF3A78B0FF408F49FF93D19EFF90CF99FF8CCC95FF88CA - 91FF83C78CFF509757FF407B45FF9E9E9EFF598DC3FF97C2DFFF7BB2D6FF73AE - D5FF5DC3ECFF4A87B2FF3372AAFF3D8A45FF8ECD98FF7CC586FF77C280FF72BF - 7BFF73BF7BFF78C180FF488F4EFF537E56FF5388BEFF93BEDCFF74ACD3FF62B7 - E0FF4AD3FEFF418AB7FF2B6DA5FF3A8641FF88CA91FF83C78CFF7FC587FF7AC2 - 82FF76C07EFF468E4CFF3A733EFFA0A0A0FF4B83B9FF8CBADAFF6DA7D0FF65A5 - D0FF5EB3DEFF4684B0FF2468A0FF36813DFF337D3AFF307836FF2D7433FF4890 - 4FFF458E4BFF38723CFFA0A0A0FFA1A1A1FF447DB3FF87B6D8FF66A2CEFF609D - CBFF629ECBFF4482B0FF1E639BFF000000000000FF005F5F5FFF9F9F9FFF3C75 - 40FF357038FFA1A1A1FFA1A1A1FFA2A2A2FF3C78AFFF81B2D6FF619ECBFF5999 - C8FF5D9AC9FF4280AEFF185F97FFD900000000FFFF005B5B5BFFA0A0A0FF3B72 - 3FFF9FA0A0FFA2A2A2FFA2A2A2FFA3A3A3FF3573A9FF7CAED3FF5A99C8FF5394 - C6FF5795C7FF407FADFF125B93FF00000000FFFFD500575757FFA1A1A1FFA1A1 - A1FFA2A2A2FFA3A3A3FFA3A3A3FFA4A4A4FF2E6EA4FF77AAD1FF77AAD2FF72A6 - D0FF689FCCFF3F7EADFF0E5890FF989898FF707070FF535353FF505050FF4E4E - 4EFF4B4B4BFF494949FF464646FF444444FF24669CFF3173A7FF3C7BAEFF4683 - B4FF4D89B9FF3D7DACFF0B568EFFFFFF8500FF00000000009700FFFFFF000000 - 0400FFFFFF00FFFFFF00FFFF0D00F6EFAC000000000000FFFF00000000000F59 - 91FF0C578FFF125B91FF0B568EFF636363006363630063636300636363006363 - 630063636300636363006363FF000011080024000400012200001101030001FF - C4001F00000005010100010101000000000000000000BDBFBEFFC7C9C8FFC7C9 - C8FFC7C9C8FFC7C9C8FFC7C9C8FFC7C9C8FFC7C9C8FFC7C9C8FFC7C9C8FFC7C9 - C8FFBDBFBEFF7114320091A1080042B1C100848987FFE5E6E6FFE4E4E4FFE5E5 - E5FFE2E2E2FFE2E2E2FFE3E3E3FFE4E4E4FFE4E4E4FFE4E4E4FFE6E6E6FFE8E8 - E8FFE6E7E6FF848987FF7778790083848500848987FFE5E6E5FFDFDFDFFFE1E1 - E1FFC8C8C8FFC7C7C7FFC7C7C7FFC6C6C6FFC7C7C7FFC7C7C7FFD3D3D3FFE6E6 - E6FFE6E6E6FF848987FFE8E9EA00F2F3F400848987FFE5E6E6FFE1E1E1FFE2E2 - E2FFC8C8C8FFC6C6C6FFC6C6C6FFC6C6C6FFC7C7C7FFC7C7C7FFD2D2D2FFE7E7 - E7FFE6E7E6FF848987FF0102770001020300848987FFE4E5E5FFDCDCDCFFE4E4 - E4FFD8D8D8FFD9D9D9FFDBDBDBFFC8C8C8FFC8C8C8FFD5D5D5FFE0E0E0FFE9E9 - E9FFE6E7E6FF848987FF464748004A535400848987FFE3E4E3FFD4D5D5FFE9E9 - E9FFCECECEFFCCCCCCFFCCCCCCFF7C7C7CFF5A5A5AFF868686FFDADADAFFECEC - ECFFE6E7E7FF848987FFBAC2C300C5C6C700848987FFE5E6E6FFE7E7E7FFE9E9 - E9FFCECECEFFA8A8A8FFAAAAAAFFB8B8B8FF767676FF656565FFD9D9D9FFEEEE - EEFFE6E7E7FF848987FF828A000041451400848987FFE6E6E6FFE6E6E6FFE8E8 - E8FFE9E9E9FFAEAEAEFF686868FF9F9F9FFF696969FF717171FFCACACAFFEDED - EDFFE7E7E7FF848987FF0000000000000000848987FFE3E4E3FFD2D3D3FFE8E8 - E8FFD6D6D6FFB4B4B4FF6B6B6BFF5F5F5FFF5F5F5FFF5F5F5FFF7D7D7DFFD0D0 - D0FFE6E7E6FF848987FF0003FF000000FC00848987FFE5E6E5FFE6E6E6FFEFEF - EFFFDFDFDFFFDDDDDDFFD1D1D1FFCECECEFFC5C5C5FF838383FF838383FFA1A1 - A1FFE0E1E1FF848987FF0000000000000000848987FFE6E7E6FFE8E8E8FFEAEA - EAFFD3D3D3FFD2D2D2FFD2D2D2FFD2D2D2FFD2D2D2FFC6C6C6FFA0A0A0FFADAD - ADFFE1E2E1FF848987FF93000000FF110000848987FFE6E7E6FFE8E8E8FFEAEA - EAFFD3D3D3FFD2D2D2FFD2D2D2FFD2D2D2FFD2D2D2FFEDEDEDFFE8E8E8FFE0E0 - E0FFE5E6E6FF848987FFFFCF000000FFFF00848987FFE6E7E7FFECECECFFEEEE - EEFFECECECFFEDEDEDFFEFEFEFFFF0F0F0FFF2F2F2FFF7F7F7FFF9F9F9FFF7F7 - F7FFE7E8E8FF848987FF92FF8E0000000000008AFF00BDBFBEFFC7C9C8FFC7C9 - C8FFC7C9C8FFC7C9C8FFC7C9C8FFC7C9C8FFC7C9C8FFC7C9C8FFC7C9C8FFC7C9 - C8FFBCBFBEFF8AFF970000001500EA151500EA1500000000000000FFFF000000 - 000036FFF4000000000024F4FF0000003600F422000000002400FF3C000000FF - FF000000000000000000FFFF00006363630063636300C78A4C00C78B4E00C78B - 4E00C78B4E00C78B4E00C78C4E00C88B4E00C68A4E00C4884A00C3753A0001FF - C4001F000000050101000101010000000000C38448001862ACFF1862ACFF1862 - ACFFF7F2EC00F7F2EC00F7F2EC00F7F1EB00F6F1EB00F1E5D600E1B17C00DA93 - 6400516107007114320091A1080042B1C100C4874A001862ACFFAAF3FEFF1862 - ACFFFAE1C800FADFC700F8DEC40014821FFF14821FFF14821FFF14821FFF1482 - 1FFF14821FFF14821FFF14821FFF83848500C5884B001862ACFFAAF3FEFF1862 - ACFFFAE2CC00FAE1CA00F8DFC70014821FFFAFE0B3FFA1D7A5FF92CF98FF84C6 - 8AFF76BE7CFF68B56FFF5AAD62FFF2F3F400C5884A001862ACFFA8F2FEFF1862 - ACFFFBE3CE00FBE2CC00F9E0C900F8DCC300F5D8BB00F3E8DE00F6F1EB00FAF6 - F200F4EEE800C17D44000102770001020300C5884A001862ACFF9EE9FEFF1862 - ACFFFCE6D200FBE3D000FAE2CC0014821FFF14821FFF14821FFF14821FFF1482 - 1FFF14821FFFC3814500464748004A535400C58749001862ACFF90DFFEFF1862 - ACFFFCE6D400FCE5D300FBE5D10014821FFFA6DCABFF93CF98FF80C485FF6CB7 - 72FF58AC60FFC5824500BAC2C300C5C6C700C58748001862ACFF7FD3FEFF1862 - ACFFFDE7D600FDE6D500FCE4D200FBE3D000FAE0CB00F9DFC600F8DCC200F7DB - C100F9F3EC00C5814400FFD95A00BE015400C58346001862ACFF6FC5FEFF1862 - ACFFFCE6D500FCE6D500FCE6D40014821FFF14821FFF14821FFF14821FFFF9DE - C500F9F1E900C57F4100EF007700E3006B00C48144001862ACFF5EB8FEFF1862 - ACFFFCE6D500FCE6D500FCE5D40014821FFFAEDFB1FF9DD6A2FF8DCC92FFFAE0 - C800FAF6F100C47B3E00008CB50017B88B00C47F41001862ACFF4DACFEFF1862 - ACFFFCE4D200FBE4D200FBE4D200FBE3D000FBE1CD00FBE1CB00FADFC800FAE0 - C700FCF9F600C0753A000065B3001862ACFF1862ACFF1862ACFF3FA1FEFF1862 - ACFF1862ACFF1862ACFFF7B1520014821FFF14821FFFF6B15000F6B14E00F6B1 - 4E00FBF8F400BE6E35000044CE000000E0001862ACFF379BFEFF3599FEFF3398 - FEFF1862ACFFFED59A00FED6970014821FFFA4DAA8FFFED49300FED39200FABD - 6400FAF6F300BA663000FF000000FFFFFF00BE7037001862ACFF3398FEFF1862 - ACFFFABD6400FBBD6300FBBD6300FBBC6100FABC6200FABB6000FBBD5F00FBBB - 6100FCFAF700B8632C0000FF00000000FC00BB683200F7F0E9001862ACFFF5EA - DD00F5E9DD00F5E9DB00F5E9DB00F9F2EA00F9F2EA00F9F1E900FBF6F200FBF7 - F300FDFDFC00B65F290000FF00000000FF0000FF0000B9642F00BA653000B965 - 2F00B9652F00B9652F00B9642F00B9642E00B8642D00B8642D00B8632D00B863 - 2D00B6612B0000E424000025FF0063636300717171FF9D9D9DFFA7A7A7FFAAAA - AAFFABABABFFACACACFFABABABFFAAAAAAFFA7A7A7FFA3A3A3FF9A9A9AFF7D7D - 7DFF1F000000050101000101010000000000969696FFFEFEFEFFFEFEFEFFFEFE - FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF9898 - 98FF516107007114320091A1080042B1C100A1A1A1FFFEFEFEFFA6714CFFA671 - 4CFFA6714CFFA6714CFFA6714CFFA6714CFFA6714CFFA6714CFFFEFEFEFF9D9D - 9DFF67686900737475007778790083848500A3A3A3FFFEFEFEFFAF7A55FFC08A - 63FFC28C65FFC48E66FFC58F68FFC7916AFFC9936BFFAF7A55FFFEFEFEFF9F9F - 9FFFDAE1E200E4E5E600E8E9EA00F2F3F400A2A2A2FFFEFEFEFFAF7A55FFC28C - 66FFC48E67FFC58F68FFC7916AFFC9936BFFC9946DFFAF7A55FFFEFEFEFFA09F - 9EFF04030400050404000102770001020300A2A2A2FFFBFBFBFFD9D9D9FFD6D6 - D6FFD1D1D1FFCDCDCDFFC8C8C8FFC4C4C4FFC1C1C1FFBEBEBEFFBBE4F3FF57A4 - D7FF84B0DAFF459CCFFF464748004A5354009F9F9FFFFEFEFEFFACACACFF8D8D - 8DFFD7D7D7FFA4A4A4FF898989FFCDCDCDFF7273E7FF4079DDFF76BDE6FFB3D1 - EFFFE4F2FEFFABD1EEFF478BC6FFC5C6C7009D9C9CFFFEFEFEFFE2E2E2FFE0E0 - E0FFDBDBDBFFDADADAFFD6D6D6FFD2D2D2FF97C8D7FF7FD4ECFFB1E2F8FF8ABF - E6FFADD2F5FFC3DFFBFF659ED2FFFFD97200999998FFFEFEFEFFB0B0B0FF9090 - 90FFE1E1E1FFACACACFF8E8E8EFFA7D1DDFF7BD3ECFFC3F5FCFF6BDCF5FF6CC9 - ECFF62A2D6FF5C9AD1FF4189CE004189CE00949494FFFEFEFEFFE7E7E7FFE6E6 - E6FFE4E4E4FFE2E2E2FFAAD2DFFF78D2EDFFC6F6FCFF5EDBF4FF5AE1F6FF79D5 - F1FF3F98DEFF438ACF00438ACF00438ACF00919090FFFEFEFEFFB3B3B3FF9393 - 93FFE6E6E6FF7DA1B3FF76CAE6FFC6F6FCFF5DDBF4FF59E0F6FF7AD3F0FF4594 - D7FF438ACF00438ACF00438ACF00438ACF008B8B8AFFFEFEFEFFEAEAEAFFEAEA - EAFFA4C7D7FF75B8D5FFC1F5FCFF62DEF6FF5CE1F7FF78D2EFFF4998DBFF828C - 95FF1E649C00458BD100458BD100458BD100858585FFC1C1C0FFBBBBBBFF7D9B - AFFF79B5D4FF8FB6D0FF54C8E3FF5ADEF4FF77CFECFF4B96D6FFAFBAC3FF8686 - 85FF175E9600458BD100458BD100468DD200797979FF838282FF868585FF4288 - A9FFDFF1FEFF5399D7FF1979BDFF4897C4FF3C82BAFF788592FF838281FF7979 - 79FF105A9200468DD200468DD200468DD200468DD200468DD200468DD2002A64 - 82FF93C6F8FF90C8F8FF4084C8FF1B63A9FF468DD200468DD200468DD200468D - D200468DD200488ED300488ED300488ED300488ED300488ED300488ED300103C - 54FF275E86FF4887BCFF418CBBFF488ED300488ED300488ED300488ED300488E - D300488ED300488ED300488ED300000000FF6363630063636300636363006363 - 630063636300757576006363FF00001108000C000C00012200001101030001FF - C4001F0000000501010001010100000000FF0000000002030400060708004747 - 4700C3C3C300FBFBFB00C4C4C4007A7A7A00BCBCBC008B8B8B00110512003141 - 0600516107007114320091A10800000000FF52D1F00033627200CECECE00FAFA - FA00FEFEFE00EBEBEB00AEAFAF00C5C6C600FAFAFA00FEFEFE00BFC3C800B4B7 - BB00676869007374750077787900000000FF878889007D797300BFC8D400EAE9 - E800E1E0E100BDBDBD00C3C4C400E6E6E600EDEDED00F4F4F400EFF0F100B8BA - BE0079756F00E4E5E600E8E9EA00000000FFF6F7F800BEBDBB006A88B200A6B1 - BE00ACAFB300FE00FEFFFE00FEFFC6CBD100CACFD600CED4DB00C1C6CE00AFB8 - C300BABAB700050404000102770000003FFF0000FEFFD7D8DA00E0E0E000E0E0 - E000E0E0E000FE00FEFFFE00FEFFE0E0E000E0E0E000E0E0E000E0E0E000E0E0 - E000D3D4D6003A43440046474800000054FF0000FEFF0000FEFFA3B8D600A4B7 - D200A3B7D200FE00FEFFFE00FEFFA4B7D200A6B8D200A7B8D10000FEFEFF00FE - FEFFACBACC00B6B7B800BAC2C300000054FF0000FEFF0000FEFF3083F2002E7C - E9002B7BE900FE00FEFFFE00FEFF4288EA002F7DEA002C7BE90000FEFEFF00FE - FEFF06479B00256355008E6BC600000054FF0000FEFF0000FEFF60A5FE005A9C - F8005398F800FE00FEFFFE00FEFFE4EFFE00A7CAFC004992F70000FEFEFF00FE - FEFF104A9600AF7CFA003CDA7100000054FF0000FEFF0000FEFF00FE00FF00FE - 00FF72AAF800FE00FEFFFE00FEFFA7CAFA00B6D2FB002A7FF40000FEFEFF00FE - FEFF073C8100F601770006027900000054FF0000FEFF0000FEFF00FE00FF00FE - 00FFE7F0FD00FE00FEFFFE00FEFF1371F300E3EEFD007AAFF80000FEFEFF00FE - FEFF06326B0000FFFF0000000000000054FF0000FEFF0000FEFF00FE00FF00FE - 00FFAACCFA00FE00FEFFFE00FEFF3B89F500FE0000FF60A1F60000FEFEFF00FE - FEFF062D5F00FFFF400000003E00000054FF0000FEFF0000FEFF00FE00FF00FE - 00FF217DF400FE00FEFFFE00FEFFEEF5FD00FE0000FFFE0000FF00FEFEFF00FE - FEFF030000000000CF000D000000000054FF0000FEFF0000FEFF00FE00FF00FE - 00FF066FF600FE00FEFFFE00FEFF63ACFA00FE0000FFFE0000FF00FEFEFF00FE - FEFF094BDD00FF0000000000E700000054FF0000FEFF0000FEFF00FE00FF00FE - 00FF0A6BEA00FE00FEFFFE00FEFF0D71EA00FE0000FFFE0000FF00FEFEFF00FE - FEFFFAFFFA00000000007CFFFF0000001BFF000054FF00003FFF003F00FF0054 - 00FF002300FF540054FF540054FF230000FF540000FF3F0000FF003F3FFF0054 - 54FF002323FF000000FF000000FFFFFFFF00FFFFFF00E3934400E2924300E599 - 5100E18D4200DE833000000000FF000000FF0000000000FFFF00000000000000 - 0000E1ECF700F8D7790000000000000A7E00E5974D00E18D3F00AAFD52000000 - FEFFE59E5F00DC7A2900000000FF000000FF0011CE00FFFFFF00FFD217000000 - 0000CEFFFF00FFFFFF001700000000FFFF00E18C3B0000000000FFFFF6000000 - FEFF0000FEFFDA732200000000FF000000FF15EAE9000000000016EBEA000000 - 000000FFFF000000000000AAFF000000FEFF0000FEFF0000FEFF0000FEFF0000 - FEFF0000FEFF0000FEFF000000FF000000FFFFFF00000A8DFF0000000000AAFF - D00009115100FFBD01000055FF000000FEFF0000FEFF0000FEFF0000FEFF0000 - FEFF0000FEFF0000FEFF000000FF000000FFE612000000001400FF48000000FF - FF000000000000000000FFFF0000E3945400DA762400FFE612008BA352000000 - FEFF0000FEFF609E5100000000FF000000FFE5AB7700E4A97600E6A87500E5A8 - 7300FE0000FFE1A16F0076000000DA732200D86F1D00D76A1A00839F51000000 - FEFFAFDBB50074B77B00000000FF000000FFE4A87500E4A77300E9BA9100E8B9 - 9200FE0000FFFE0000FF00FFFF00FE0000FFFE0000FFFE0000FFFE0000FFFE00 - 00FFFE0000FFFE0000FFFE0000FFFE0000FFFE0000FFFE0000FFFE0000FFFE00 - 00FFFE0000FFFE0000FFFE0000FFFE0000FFFE0000FFFE0000FFFE0000FFFE00 - 00FFFE0000FFFE0000FFFE0000FFFE0000FFFE0000FFFE0000FFFE0000FFFE00 - 00FFFE0000FFFE0000FFFE0000FF00000000FFFFFF00FFFF9200000000004090 - 480038843E0030793600000000FF000000FFE3A97B00DE9B680000FFFF00E9A9 - 7800FE0000FFFE0000FF0003FF000000FC000200000000000000FFFB000000C3 - 00FF0000000000000000000000FF000000FFDE9A6700FF02000000000000E8A5 - 7200FE0000FF2BFFFF00000000000000000000FFFF0000000000EFFF110000C3 - 00FF00C300FF0000EF00000000FF000000FFDB94630000FFFF0000000000E496 - 5C00E8A57500EDBB94009300000000C300FF00C300FF00C300FF00C300FF00C3 - 00FF00C300FF00C300FF000000FF000000FFDA906000D98F5D00D78C5A00DE99 - 6B00E8A67800ECB38600FFCF000000C300FF00C300FF00C300FF00C300FF00C3 - 00FF00C300FF00C300FF000000FF000000FF00000000FFAAAB0055000000E28F - 5600E8A67900E18C530092FF8E0000000000008AFF00000092008E00000000C3 - 00FF00C300FFDA905E00000000FF000000FFFFFF000000000500FB000000E499 - 6700E9AC8200E3935D0000001500EA151500EA1500000000000000FFFF0000C3 - 00FFE4965D00E1935A00000000FF000000FFF4220000E28E5300E18C5200E18B - 5000E1894F00E1894F00E1894F00636363006363630063636300636363006363 - 630063636300636363006363FF00001108000C000C00012200001101030001FF - C4006C9BD3006999D1006596CE00000000000000000002030400060708000A0B - FF0000B5100002010300020403000504040000017D00020300006F9DD5006C9B - D30084B0D9005990B8005F92CA0042B1C10052D1F0007F7F7F007D7D7D007B7B - 7B0014D1EEFF06D0EDFF01D2ECFF02D2ECFF06D0EEFF09CFECFF86B1DB00AAD2 - E700A8CFE500578FB700588DC50083848500878889007C7C7C009898980005D0 - EDFF77E8F5FFD3F8FCFFD4F7FCFFD1F7FDFFC6F6FBFF75E7F5FF09D1EDFF97C6 - E00090C1DD00558EB6005188C000F2F3F400F6F7F8007979790006D0ECFFA2EF - F9FFB0F2FBFF90ECF7FF86EAF6FF8CEBF6FF99EDF7FFC6F5FBFF9BEFF9FF06D0 - EDFF8ABCDB00528CB5004A83BB0001020300040521000CD1ECFF71E7F5FFA3F1 - FAFF8EECF7FF94EDF8FF8DECF7FF92EDF7FF95EDF8FF8CECF7FFAFF2FAFF6BE7 - F4FF19D3EEFF508AB400427DB50043934C0041904A0004CFEDFFB2F3FBFF93EC - F8FF92EDF7FF95EEF8FF96EEF8FF97EEF8FF93EDF8FF93EDF8FF95EDF8FFAFF2 - FAFF07D0EEFF4E88B3003A78B000408F490093D19E0001D2ECFFC1F6FCFF8CEB - F7FF94EDF8FF9AEFF9FF9EEFF9FF9FF0F9FF9DEFF9FF8FEDF8FF73E8F6FFAEF3 - FCFF01D2ECFF4A87B2003372AA003D8A45008ECD980001D2ECFFBCF5FBFF98EE - F8FF93EEF9FF9CEFF9FF9FF0FAFFA0F1FAFF90EEF9FF77EAF8FF66E7F6FFA4F1 - FCFF01D2ECFF418AB7002B6DA5003A86410088CA910004CFEDFFA8F2FBFF9BEF - F9FF7AEBF8FF5BE6F7FF4CE5F7FF47E5F9FF3CE3F8FF37E2F6FF4AE4F7FF87EE - FAFF07D0EEFF4684B0002468A00036813D00337D3A0006D0EDFF6AE7F5FF8EEE - FBFF40E2F6FF3BE3F7FF43E5F9FF48E6FAFF43E5F9FF3EE3F7FF6FEBFAFF4FE3 - F4FF0ED0EEFF4482B0001E639B00000000000000FF005F5F5F0007D1EDFF6EE9 - F8FF73EBFAFF4DE6F8FF46E6F9FF4CE7FBFF4EE6F9FF60E9FAFF5EE7F7FF08D1 - EDFF5D9AC9004280AE00185F9700D900000000FFFF005B5B5B00A0A0A00004D0 - EDFF45E1F4FF68E9F9FF63E9FBFF57E9FAFF53E7F9FF3AE0F4FF05D0EDFF5394 - C6005795C700407FAD00125B930000000000FFFFD50057575700A1A1A100A1A1 - A10013D1EEFF06D0EEFF00D2ECFF00D2ECFF07D0EDFF0FD0EDFF77AAD20072A6 - D000689FCC003F7EAD000E589000989898007070700053535300505050004E4E - 4E004B4B4B0049494900464646004444440024669C003173A7003C7BAE004683 - B4004D89B9003D7DAC000B568E00FFFF8500FF00000000009700FFFFFF000000 - 0400FFFFFF00FFFFFF00FFFF0D00F6EFAC000000000000FFFF00000000000F59 - 91000C578F00125B91000B568E00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFA6BFF2FF3359B7FF0D4080FF0D2690FF3359BBFFA6BFF2FFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C66 - BBFF000D88FF000D88FF001A8CFF001A8CFF001A90FF001A90FF4C66BBFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4059AEFF000D - 84FF002695FF0D0D6AFF22223CFF262640FF080866FF002695FF002695FF4059 - AEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C73BFFF000D84FF0033 - 99FF0D2688FF2F2F2FFF333333FF333333FF333333FF001A88FF003399FF0026 - 95FF5973C8FFFFFFFFFFFFFFFFFFFFFFFFFFCCD9F2FF001A90FF000D80FF0D1A - 77FF0D3395FF333333FF333333FF333333FF333333FF002695FF0D1A77FF000D - 80FF001A90FFCCD9F2FFFFFFFFFFFFFFFFFF668CCCFF001A73FF22223CFF3333 - 33FF111E7BFF263362FF333333FF333333FF1A2662FF111E7BFF333333FF2222 - 3CFF001A8CFF668CCCFFFFFFFFFFFFFFFFFF264CAEFF000080FF333333FF3333 - 33FF222240FF0D2690FF333333FF333333FF001A90FF222240FF333333FF3333 - 33FF001A88FF2659B2FFFFFFFFFFFFFFFFFF0D2690FF001A90FF333333FF3333 - 33FF333333FF222244FF22487BFF1E4484FF222244FF333333FF333333FF3333 - 33FF001A90FF0D2690FFFFFFFFFFFFFFFFFF001A90FF003399FF001A90FF0D33 - 84FF334C66FF152F77FF003399FF003399FF152F77FF334C66FF0D3384FF001A - 90FF003399FF001A90FFFFFFFFFFFFFFFFFF0D2690FF002695FF001A7BFF001A - 88FF002695FF0033B2FF0073FFFF0059FFFF001AAAFF003399FF001A88FF001A - 7BFF002695FF0D2690FFFFFFFFFFFFFFFFFF1A3390FF001A90FF001A90FF0026 - 88FF003399FF3D63D6FF60A0E0FF6093E0FF3D63D6FF001A90FF002688FF001A - 90FF003399FF1A3390FFFFFFFFFFA6BFD9FF1A4095FF000D8CFF001A90FF001A - 90FF003399FF33408CFF777777FF777777FF33408CFF002695FF001A90FF001A - 90FF002695FF1A4C8CFFA6BFD9FF3366B2FF1A4C99FF0D3388FF002695FF0033 - 99FF003399FF002695FF001A90FF001A90FF002695FF003399FF003399FF0033 - 99FF0D3395FF1A4C99FF3366B2FF1A4C8CFF1A4C8CFF1A4C80FF001A90FF3737 - 59FF111133FF003399FF373759FF111133FF003399FF373759FF111133FF0033 - 99FF1A339DFF1A4C8CFF1A4C80FF003380000033800000338000001A90FF1111 - 2FFF151533FF003399FF11112FFF151533FF003399FF11112FFF151533FF0033 - 99FF003380000033800000338000003380000033800000338000001A90FF0026 - 95FF001A8CFF003399FF002695FF001A8CFF003399FF002695FF001A8CFF0033 - 99FF0033800000338000003380006363630063636300C78A4C00848987FF8489 - 87FF848987FF848987FF848987FF848987FF848987FF848987FF848987FF01FF - C4001F000000050101000101010000000000C3844800848987FFFDFDFDFFFDFD - FDFFFDFDFDFFFDFDFDFFFDFDFDFFFAFAFAFFFAFAFAFFF5F5F5FFFAFAFAFF8489 - 87FF516107007114320091A1080042B1C100C4874A00848987FFFDFDFDFFEBEB - EBFFEAEAEAFFEAE9EAFFE9E9E9FFE8E9E8FFC5C5C6FFAAAFADFFE3E4E3FFFAFA - FAFF848987FF14821F0014821F0083848500C5884B00848987FFFDFDFDFFEAEA - EAFFE9E9E9FFE9E9E8FFE8E8E7FFE7E7E7FFE6E7E7FF999E9CFFEEEEEEFFE3E4 - E3FFE3E4E3FF848987FF5AAD6200F2F3F400C5884A00848987FFFDFDFDFFE9E8 - E9FF888888FF35332DFF35332DFF888888FFE5E5E5FFA7A9A8FF999E9CFF8F94 - 92FF848987FF848987FF0102770001020300C5884A00848987FFFDFDFDFF8787 - 87FF6B6B6BFFFEFEFEFFFEFEFEFF6B6B6BFF878787FFD9DAD9FFBABCBBFFC0C2 - C1FFCFCFCFFF848987FF464748004A535400C5874900848987FFFDFDFDFF3533 - 2DFFFEFEFEFFE6E6E6FFE6E6E6FFFEFEFEFF35332DFFD1D1D1FFCFD1D0FFC7C9 - C8FFDFDFDFFF848987FFBAC2C300C5C6C700C5874800848987FFFDFDFDFF3533 - 2DFFFEFEFEFFE6E6E6FFE6E6E6FFFEFEFEFF35332DFFD1D1D1FFE2E2E2FFE2E2 - E2FFFDFDFDFF848987FFFFD95A00BE015400C5834600848987FFFDFDFDFF8282 - 82FF656565FFFEFEFEFFFEFEFEFF6A6A6AFF6E6E6EFFCECECEFFE2E2E2FFE2E2 - E2FFFDFDFDFF848987FFEF007700E3006B00C4814400848987FFFDFDFDFFE2E2 - E2FF838383FF35332DFF35332DFF5A5A5AFF858480FF35332DFFCCCCCCFFE2E2 - E2FFFDFDFDFF848987FF008CB50017B88B00C47F4100848987FFFDFDFDFFE2E2 - E2FFE2E2E2FFE2E2E2FFE2E2E2FFCCCCCCFF35332DFF858480FF35332DFFC4C4 - C4FFFDFDFDFF848987FF0065B3001862AC001862AC00848987FFFDFDFDFFE2E2 - E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFCACACAFF35332DFF858480FF3533 - 2DFFFDFDFDFF848987FF0044CE000000E0001862AC00848987FFFDFDFDFFE2E2 - E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFC9C9C9FF35332DFF8B8A - 87FFFDFDFDFF848987FFFF000000FFFFFF00BE703700848987FFFDFDFDFFE2E2 - E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2 - E2FFFDFDFDFF848987FF00FF00000000FC00BB683200848987FFFDFDFDFFFDFD - FDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFD - FDFFFDFDFDFF848987FF00FF00000000FF0000FF0000848987FF848987FF8489 - 87FF848987FF848987FF848987FF848987FF848987FF848987FF848987FF8489 - 87FF848987FF848987FF0025FF00FFFFFF00685A4000685A4000685A4000685A - 4000685A4000685A400067593F0061543A005D51380250452E7C4D432CAC4D42 - 2BAF50452D7152472F04FFFFFF00FFFFFF00685A4000685A4000685A4000685A - 4000685A4000685A4000685A400063563C0062563C905F523986554A3109584C - 330361543BA863563C67FFFFFF00FFFFFF00695C4100695C4100695C4100695C - 4100695C4100695B415F695C41316A5C42456A5C42B2675940005A4F35006658 - 3E006B5C425C6A5C4292FFFFFF00FFFFFF006F6146006F6146006F6146006F61 - 46006F61460B6E6046C66E6046186E6046B66D60451F7063480074654C006F61 - 46006E6046806E604676FFFFFF00FFFFFF0073654B0073654B0073654B007365 - 4B0073654B7F73654B5873654B6973654B8873654B0075674D0575674E0A7466 - 4B1073654BB973654B29FFFFFF00FFFFFF00786A5000786A5000786A5000796A - 502078694FC4786A4F10786A50B678694F07786A4F00786A4F7978694F4D786A - 4F7E77694F7177694F00FFFFFF00FFFFFF007D6F54007D6F54007E6F54007D6F - 549B7D6E543E7D6F54917D6E53607D6E53007D6F54197D6E54C27D6E542A7D6F - 54B17D6E54007D6E5400FFFFFF00FFFFFF0082745900827459008274593E8173 - 59B18274591F817359B48172580082745900827459978173593F817359A98173 - 58468173580081735800FFFFFF00FFFFFF00897A6000897A6000887A5FAC8879 - 5F25887A5FA088795F3B897A5F00897A5F3E887A5FAE897A5F42887A5F9D8779 - 5E0087795E0087795E00FFFFFF00FFFFFF00918369009183695B908268939182 - 6817918268B39183690092836900918268B39182682C918268C49082681D9082 - 68009082680090826800FFFFFF00FFFFFF009A8C721D9A8B71B9998A701A9A8B - 712B9A8B72B69E8F76009C8C7383998A717F9A8B7264998A7073998A7000998A - 7000998A7000998A7000FFFFFF00FFFFFF00A3947B6AA3947B8FA3947B009E8F - 7600A2937A79A3947CB2A2937A85A2937B20A3947CC5A2937B03A2937B00A293 - 7B00A2937B00A2937B00FFFFFF00FFFFFF00AD9E8695AD9E8676AC9E8600A697 - 7F00A2927A00A6977E0AAA9C8400AD9F879DAC9D864FAC9D8600AC9D8600AC9D - 8600AC9D8600AC9D8600FFFFFF00FFFFFF00B7A99366B7A9939CB9AB9500C6B9 - A500BFB29D00BAAD9700B8AA9454B7A993ADB6A89100B6A89100B6A89100B6A8 - 9100B6A89100B6A89100FFFFFF00FFFFFF00C1B49F0BC2B5A1A3C6B9A576CBBE - AB05CDC0AD01C8BBA74DC3B6A1BDC1B39F17C0B39E00C0B39E00C0B39E00C0B3 - 9E00C0B39E00C0B39E00FFFFFF00FFFFFF00C6B9A500C8BBA809CDC0AE86CFC2 - B0ABCFC2B0A7CEC1AF9CC9BCA91EC5B8A500C5B9A500C5B9A500C5B9A500C5B9 - A500C5B9A500C5B9A500FFFFFF00F7F4EFFFF7F4EEFFF7F4EEFFF7F4EEFFF7F4 - EFFFF7F4EEFFF7F4EEFFF7F4EEFFF7F4EEFFF7F4EEFFF7F4EEFFF7F4EFFFF7F4 - EFFFF7F4EEFFF7F4EEFFF6F3EEFFF7F4EEFFF6F3EEFFF7F4EFFFF5EEDCFFF5ED - D9FFF4E6C2FFF6F1E8FFF5EFDFFFF6F0E3FFF6F1E6FFF4E8C5FFF5EFDEFFF4EA - D1FFF6F4F0FFF6F3EEFFF6F3EEFFF7F4EEFFF6F3EFFFF7F5F3FFEFCF75FFF1DA - 97FFE9B52BFFF0D382FFEBBE47FFEECB6BFFEECA68FFEBBE46FFF0D381FFEFCF - 76FFF6F3ECFFF6F3EFFFF6F3EEFFF7F4EEFFF6F2E8FFEBBC3DFFF4E9C9FFF1DB - 9BFFF4E8C7FFF4E7C5FFF3E6C1FFF4E9CCFFF4E5BEFFF5EBD0FFF1DB9DFFF5EB - D2FFEBBB3AFFF5EDDAFFF6F3EEFFF7F5F3FFEECC6FFFE8AF0EFFF2DDA2FFE6A9 - 00FFF2DB9CFFE9B522FFEBC046FFEECC6BFFE8AF0BFFF1DDA1FFE6A800FFF0D8 - 92FFE9B521FFECC24EFFF6F4F3FFF7F3EAFFF3E4BAFFF3E1B0FFF3E4BAFFEFD1 - 7BFFF3E7C5FFEECA65FFF0D48AFFF2DCA0FFEDC861FFF3E7C1FFEFD179FFF3E0 - ADFFF3E3B9FFF3E3B6FFF5F0E3FFF3E4B8FFE7AC03FFEECD6CFFEEC968FFEBBF - 46FFF3E5BDFFECC454FFEFD282FFF0DA9AFFECC354FFF3E5BAFFEBC149FFECC4 - 56FFF0D584FFE7AC04FFF1D997FFF1D891FFE9B41FFFF0D687FFEABD3EFFE8B3 - 20FFF3E3B5FFE8B31FFFEDC65AFFEFD17BFFE8B31FFFF3E0ADFFE9B623FFEAB8 - 29FFF2DC9FFFE8B41FFFEECD71FFF5EACDFFF2DFA9FFF5EACEFFF3E2B4FFF2DF - AAFFF6EEDCFFF2DFAAFFF3E5BEFFF4E8C9FFF2DFA9FFF5EDD9FFF3E0ADFFF3E0 - ADFFF4ECD6FFF2DFAAFFF3E5C1FFF1DA96FFE6AB00FFEECD6BFFEAB934FFE6A8 - 01FFF2DEA4FFE6A901FFEBBE45FFEDCB69FFE6A801FFF2DDA1FFE7AD04FFE8AF - 0DFFF0D891FFE6AA00FFEDCD72FFF5EACDFFECC250FFF1DCA2FFF3E2B6FFF2DE - A5FFF5EED9FFF2E1B0FFF4E6C1FFF4E9CCFFF3E1AFFFF5EEDAFFF2DFA7FFF2DD - A5FFF3E2B5FFECC558FFF2E1B4FFF7F5F4FFF0D58BFFEDC555FFF0D78CFFE7AD - 08FFF2DEA7FFE8B317FFEBC149FFEECD6DFFE7AD05FFF2DEA5FFE7AE08FFEDCB - 67FFEECD73FFEFCF77FFF6F4F2FFF7F4F0FFF2E0ACFFE7AB02FFF2E0AEFFE8B1 - 1AFFF1DA97FFEDC75EFFEECD73FFF0D68FFFECC148FFF2E0ADFFE8B019FFF1DE - A5FFE7AF0FFFF0D68AFFF6F4F1FFF7F4EEFFF7F5F2FFF1DCA3FFF3E7C5FFF4E7 - C4FFF1DA9BFFF2DFA8FFF0D389FFF1DC9FFFF0D791FFF2E0ADFFF3E2B4FFF5EB - D4FFF1DB9DFFF7F4EFFFF6F3EEFFF7F4EEFFF6F3EEFFF6F4F1FFEFCE72FFF3E3 - B6FFEABB3BFFF2E1AEFFEECE77FFF0D891FFF1D997FFECC254FFF2DFA9FFEECC - 6DFFF6F3EDFFF6F3EEFFF6F3EEFFF8F6F200F6F3EEFFF6F3EEFFF6F4F2FFF7F3 - ECFFF7F5F4FFF7F4F1FFF7F5F4FFF7F5F3FFF7F4F2FFF7F5F3FFF6F3EEFFF6F4 - F1FFF6F3EEFFF6F3EEFFF6F3EEFF + 4C7A0F0000001000000010000000DE1F00000000000078DAC59B09585547B6EF + 97438C49DAEED89DBC747B6F27DD76DAFB326A9A9BE1AA51348A63888A8943A2 + A838933880A888440507445426071C704241045171404014194504190401450E + F33C1E38CCFFBBAA0EFB70444C4C7FEFFBDE49FEA9DA55F5AB5A55BB6A57EDB5 + 8999991999B1621C27236697F1D37232462C87D18EC68874988808ABA1E88148 + 7A87885EEAD1837AB0C42F62EB7834D494415357C12A87A6564F9C2EF26A0AD2 + A0BAB811996E0B3175FECBB4FA8D7F91CB89BE34FA623845EE9888A6FA1A343D + 8946734E2C9A55AC273168CC8E8426F316EA1E5C437BB306F5E981C809E03A5C + CC60B9C68AD6ADB726FBADDB28CA61121AD5D568C98D4773EE3D1687AA383472 + 1D9AAC70A81F5C472BF32D05F168CA8F85EA8A3DC2D68F42714929D5D6A9999F + D8C127A0392F112D7909B2AEA69C3B687C1481FA8721A82BCE96FD686EA885BA + B218E1B663D0A3E73AEAD1B39796AFABE2FA935929682DE430EFBEB4A3496743 + 306A532EA33AE9128F511522B68C85D1B8F134D1643A45ED98C07C25DA0AD398 + 7DC04A452BD7D35290C4E371174DD9D1B28EFA8C501E83603471D928BBB108BE + 1D4151D131CC8F67BE1C6D45E91D4AE3BAB89EFC0E3B441D3CB68D8F6ECB7A9A + B86CD4963140C66C0AEBC1EDDB1BA1B1B68CB90792D5DAD06107D721C6A43957 + 6B475376149A6A4A10B56914AA681DE5913945725D9A9A526D9BFA2A48D5D9D0 + A2E27B9213A7BDBF0D3588B4190172BA426F05EDA248AE4B535D84B67C6D79C9 + 2892EC3DD65D9E13CCE6C4A0B5A901B7782ED2A24022C7CB146133120D5505D0 + 044E4743E0B768B86CC2F169D05C9C86864B53B5BA3885652CD5D2A846D88A4F + 41631278F6E6D0AD75C3D0509E8BD6F09FD09E7E0CED6947D1FEE010870738DC + C772477BAA1BDA535CD17C6321DB5F87E0C54300A6C1FF0D5BF539D4A5D9680D + 5B8296D0C5B24CCB0D33AD42E7A33974019A43E6F1B5295A42E6CBB91864F621 + 485440AD14B2F45FDCFF12349465A3BEF431EA4B84B2A49A6A4BB5E2316FE1B9 + D7A2A9435B5B2BAE9ABED7C143FE7B7DE160042F1A82EB8B06776AA1D0C7085A + F89156665A5D9DFF0128FF5DA27F42AEFDE78B2BEEDF977EC7FFF418C8D11EBD + A8BBF52F7E3D7BF5A6A6AC30343E0C463DAFD7BAE44054279C47459C2FA8872D + E733FFD21FE993517DA8EBFA9F96544D4D9937D0C873A4A9EC311A2B54682C57 + 41539C81AAD45014DEF484C9F46F69C6CC5964B670112D59BA8CF4D77F536628 + 343C3F9A2A72D1C0F3AE9EE74B3DCFB5FADC4434963C4259C265645F7145724A + 2AA5A53FA44C552EE5171492B2FE1BD282D0C8E32E595E2BEA2777A07E1C03F5 + A348598F5A9588CC805DA02BFDA9678F9ED49BFBFA52EFDEA4AC7FD1D7C6F21C + 2D9B1DCB6C34EAB2225097198EBA8C9BD070BD6967B7E12F0306D1FF7DEF7DFA + ECF32F68E857634859FF55F7FCD1C8F75E9D2DDA8C62F63673B750FBF0066AD3 + B86FFC5C49F6FA19A7BC4E93B7CF59BA147899AE5E0B2265FD97C578B3ED69B2 + 7DA5CDDAF4506683E575EDE358C47B6E008D24F2B23D49976F7E4A9FF8FE4856 + 93CC0819165474FB04CA13AF4253F450F65BB20FB46C435E12B2838FE0889B0B + 46ED4CA0E729E7DA3E14C5FA439D138F065EB70DF9F751FB2806D9D70F23DADB + 19DBFC5361B8F132BE724CA4E7E9A1FF4E3CF0D92AFB9A786C03E20F5BE184EB + 4EAC397117BE7145B03A750F83577A775BC7D85D49CFD5B0F51760B63F12476E + E561D1C168BCBDF0087EA97C777AFF472F4C770A81C3E547786BEE7E1D6FB43B + F9853560BE07FEBEF8085E9FED8ADFC275A7F17B52FE9FE8796BDFCA6A2D7EEB + FAEFF3725F1A376E1C222222D0D2D282C8C8486CD8B001A1A1A1D8B56B177E69 + FD1B2CB0A08404DE7F9B9BD1DEDE8EB2B2329C0F08405474B42EED66442C2E5F + 0B41D7F5BFC36127D95A5BE2666C2A4A4B8AA1CA51E1C68D1B88E0F60B0B0B51 + 515101B55A8DAAEA1A040587C1DA6A259E5AFF9A460ABB1182E50E9770E66218 + FC020271CAE73CB77707D177931097988684D42C84472720202802C1C1D7A0BF + FE7BBFF4774A7F98899C9C9C17524A6A1AF4D7FF773366925FF03D9C0A4A83D7 + B5649C62790525E3344B5C9FE1D03B288943D6F507F00B8E87FEFABF13974C6F + 181FC210FB5A7CBCB1041FD894E0230E47399462346BB06D293EE4B477D796E0 + 4F1675E833EE30FE69F62DED318FA6C78916F4DD48D0A0EFF663DEE976CC3ED2 + 0893838DB896DA8A948276E457B5C33BAE15135C3518EEA8C17F6D6DC7EB13F7 + 236063330DCF5C4D2576CB690932E83FC76DC2B4A3ED98BABF0116BE8D7852D6 + 06F7B026669B7135B905EF6F52E30F2BEBD07B653B5E1EBE050D3DD6519F9ED6 + 3C735651005DA037872EC3E443ED18EF528FA2EA369C8C6906CDADC19F56D721 + AFB20D1B021A41A635E8F1533BFAFCCB9CF73E50E70FF4FA27DF63907D3B5E5B + 5E0BDFF8666CBBDA88CFB7AB316C673D02129A31EF4403FA2CAD45AF15CC7F64 + CADBB62173232843E21D7599B7F299A2167FB7554355D1868CD25654D6B7E176 + 762BFEE55E8FCF3CEAF187F56DE8250B27523FA5753CA0973E4EA6DE3FB5A2F7 + 8F1AF459D9800F1D3418B5BF09667ECDF8EA6813FEFB5023BE3AD38CBF6E6BC7 + 2B931E6BB76E2AA2C57D45B89A6E8DFC1DF55D9081979797E355F352F465BDB6 + A214FD5697E28DB565F8CF8D65F8DB960ABCB1E2119AD12CE98D10C3B0ADA3AE + 03F22C42D45B865AF5A3862A3FC5C8CED1EAC8D78FE7B98D41AEEB5728F0980A + D5EED1C8B61F82577F4EA7AA58CB677855B9861AD3ADB517AFFE4C0507BE6666 + 247CDBA651F6D6FF4681A7291E6D780FBA76FA2768DB497E4B22091DE96F75D4 + AB721AA63DC9A081B26D3F42DE8199C8B41C287981BC595A22B9FF5356FAB42D + 7CB418F94A7FD966CE2E43D966E149733CDEFC3F78BABF6CE66E7420F7E995FE + 530937F8D9F52D2867F728883695822E677FC0D6E353E4F51B4522F89C0AFF28 + AF08E3BB8E23519EFB7464AE7D17E042BB4E4DC38EB8BDB08B72C43CCFA9802F + 91A1F378149C5B87FCB36B51E86385021F4BE49F5E05D5899558CB75887E3E5C + F957A42F1F00FB6353B129720702B2AE60CD351B08F68BAD2390CF5CBEB7254A + 825D507CDD1585810E7872B4730D24E363AD411F83A69C99855557AC713ADD0F + 4793BD30C4FA335928FFF44AE49E58818A107794F8AC412792AEED8B9F3F7DDB + D12FD1EEA1A413704F3C82F7567E8C426655C77F84CA7319CA03B7A3F8F46A3C + 3B9F5C75ACB059B42BD86DDB2620EFAC0DB20F2F954CC9D9F528F6B6D2C2BD20 + CFBF3D957A5A9E9DA7F9A75623FBD012A0A350F1690B1479ADC607FAEBBF235E + 85FEDAEB3F8AEB2A2A38BE14B9673721CBDD4C676FFEFE1FD87E2B390E6E02D5 + 2195323CD751AEF0F812E478AD4796DB7C643ACF43C6DE3948779A8D6C0F7314 + 9F592FC70189CFCE07A28FF89D88DBF15A8347079660982CC479BEE7E4F8E6EE + FD8E796BA89C4CE08A3D5AD05180AED47145455E16DCE65C64EDFD019DF5BE44 + 6278F23D96A0C4CF0E796E7338F54D2A7D53A8D380028F79C8DF3F072AB7D9BC + 9E677199CF48CD7B77EE1E136E731A54BBA640B5F31B9DFE9DF3FF8F8753B0CC + 23098BF627A0EBFEFFEA6B9C74E5753E27F7A29EBD7BC973B272FE5F79F40104 + BBF54206663907C1D4350ECAFEBF69D326D8DADAC2C6C606D6D6D658BB762DD6 + AC5983D5AB5763D5D114AC6076FBC52CF82617C127B10033F65EC3CCDD5150F6 + FF8D1B37E2E0C183521E1E1E52870E1D925A71241967EF17C29775203A07CEE1 + 8FF1ED9EAB98EAC067EC8EFD5FB429D8A9CE3371D0E3A0E40E1F3E2C65EE9188 + 33F7F2B1E756361C42B3E0C89AE6740513ED43A0ECFFC25ED1E6F09D63307EA7 + B1E48E1C3922B568DF5D9C88CB95AC5D5006EC59531C2F63B4ED157CE53619A3 + 9C276284D3380C7718831F4E2DC4AC63F330C66E228E1E3D2A65EA128BA3D12A + D85DCBC0C6C034D85E4A83B1432086F2B9D670EF04B82579C239D1034EF1FBE0 + 10E702FB18274C393003863663E1E9E98959BB2370E0F613D8306779FE01E644 + 9463E28E4B30B0F0C5978E63B1E7DE416C8CDA8E75B737C3E2A60D2C59EBC337 + 63FC5E6398FCFC1D4C1CC2E016F6086BFC52B0E05A0E26A6B46394E3357CF0D3 + 690CDD3E4AD7E6A6A81DD870DB0E6B6FFD0CA33D9331D472048E1F3F8E49F6D7 + E1149C899FBCEF63D1E9FB981B980DA3AD17F0EED2E3F86CCB9730B01D8A21EB + 3FC3476B0C30DEF91B8CDD33095F580C97EC89132730C636103BAE3EC4E29309 + 9877F42E1678DEE5F1B980B7CD0E43D9FF4D4D4D71ECD8310CB732C4A7ABBE90 + 9CD0C99327317C7D00B670DFE73337CB2316730EDDC1E8CDE7F167D30350F6FF + EFBFFF5EB637CC62248E712838A153A74EE153CBB3D8783E05B39935718FC68C + 7D3130DCE48F3F7EEF0665FF9F3163C6536D0A4EC8CBCB0B1FAFF0C23ADF2456 + 322CCEDCC7D263F118F9B33F7E3FD359CEB955AB56C1C4C40453A64C81B1B131 + 264D9A84091326C0C8C80863C68CC1BBFCCEF089A53786DB9C8791FD657CBDF3 + 3ABEB4F5C36BDFEDC16FDDFFFF30CB05BF9BB1976D7791FC8BACFF77B9CE5F3B + FFDFB81986983BB12F245156FFFCBF75E70E14F0393D3F3F1F050505C8CDCD95 + CACBCB93698AC459BEB8B818854585108C72FED7F20578F2E409542A156263B9 + 9D9818A9687E7F50E2292929B20E21C128E77FA57DC18A76052F38450A9F9C9C + 8CA2A2225DFBCAF95FC4F3D9EE478F1E493B1F3E7C888C8C0C646565C9BA841E + 3C7820CFFE2525253A5E39FF8B785E7E1E52B98CC817EF41F1F1F152E2B9367B + F66C6CDFBE1D999999282F2F67BE48F2CAF95FB15FD8A6F03E3E3EF0F5F54550 + 50907C962E5AB448DA545959A9E3ED1C89468D7D43F2CAB888F115759C3F7F1E + 4B972E956B6AD9B265F2391C171727DFA58A3A78E5DE2BF627F3F80A3E2D2D0D + 972F5F86B9B939C4BA54249EEFF7EFDFD7F55FD9FF95FB27DAAFAAAA92F7F1F1 + E3C7484A4A927D898AE2E7BCBDBD94585F397C9FBAB62FEA146D979696CAFB2C + EE95BEC47D14EBDBDFDF1FAA5C2DAFECFF2FC28B7E8B7C710F0B3AE68FB2FF6B + F922796FC4F88A5094177DA9AEAE466D6D2D341A0D9A9A9A6458C4F508467FFF + FF2DEB2794CB3AE20075B7FF8BDF6750CBF05DB5B8D6EEFF7C4518FEEC79C5AC + D3FF4F31BB8C9F969331C57218ED684C910E1329C26A283DC7FF4F7F5EE00745 + 9ADA72D2A9A68C1A58350569A4BAB89132DD165237FE7FC9FBD6B54BBE59154B + CD4F62A8313B92DEB07B07BFA40EFFFFD37C6E3C35ABE2A891EB106502720271 + 22FD345C130F626BB423D6866DC4D22B2B31DB7F013AFCFF92F7A9D5F22D7909 + D4C27534E5DCA1C6471154FF3084EA8AB3653F9A1B6A495D594CE1B66348CFFF + 2F79CF122DDF5A984C2D79F749D8F13CBB23B68C253DFFBFE49D9F287C2AB516 + A4504B4192E4CF3C3A0737B67D73E436FC78CD0233FDE609FF3FE9F9FF25BF29 + 45CBB715A5515BE1036ACDEFB023E72E353D89E6BEDC264D563835D59553D496 + 31A4E7FF97FCCA28A57D66A5529FB1BF293B8A9A6A4A286AD328D2F3FF4B7E6E + 5017BE40CB9F7F721147D34E6277BCABF0FFF318D650A4CD08D2F3FF4BFE6BBF + 0E5ED8AD88ED6F51DD63DDE539C16C4E0CB53635D02D9E8BC2FFAF3FEF469E68 + C753F3F0E2349DFD0D17A750C34563A996463585ADF89414FFBF28FBF9E1767C + EAD10E8383DA3ADA1F1CA2F6B40392F7CAF411FE7F6A4F71A5E61B0BD9FE3A0A + 5E3C84F4FCFFB20E8515655A6E9869153A9F9A43175073C83CBE36A59690F9D4 + DAACA120B30F49CFFF4F9AEA1259477DE963AA2F11CA926AAA2DD58AC7BC85E7 + 5E8BA68EDADA5AE9AAE97BD4C5FF4FC18B86D0F545833BB550E8630A5AF89156 + 665A5D9DFF01E9FBFFC5B35D9C33BDBDBDE59E71EEDC39F8F9F9C9505C8B7471 + 96116762F10CEFBAFEF7EFDF2FFD732F2279C6EEB2FEC5335DE49D593DF91725 + CA083BBBFAFF846D222F60C3B7B8E56886DB4E8B10B96731A2F62E458CCB72DC + 71339779A28CD8CFBAFAFFC5794DE16F3B2D6676C953EC1DF79F74FCF1639EE8 + EAFF17BCF0778AFD55EC7D62DFBA77EF9EDCF7850F343C3C1C61616108C9AFC3 + 0CAF747EFFC9C4D82389BAFD5FD824EA1663BE7BF76EA4A7A7CB73E3CE9D3B65 + 3D16964530B47E8CB5370A119854857C7E4E9D4BAAC4B85DD110EBFF28BF6308 + 5E9C5DC4FE24CE1DE2AC206C117BD781D8746C4A2DC7C5DC4638DE2C847F723D + 229EB46091673284FFDF83DF77047FE1C205383B3BCB7390B065CF9E3DF04E7A + 0C9B947244D4B7C2FC513D7EBC538E0527D3F0C3A124DDF700777777C9CBB351 + C7394ED8E29BFC04EB932B10DDD08AB9596ACC5635C0FA410D461ECC7ECA87EF + C26D0A3E3030106E6E6EB20EDB1381581B5728D939CCCECA69C086946A8C754F + 7FC6FFBF6B97A3E4C5DE2DE415930EABA00708679B176437E0079586EDA8C284 + 83FCFEE5B44FF8FF9FF2ED6FDBB68DEFD12D848484C0F67000ACAFA462EFD5FB + 981E9B87D9D96AAC4B2CC7A4FD6908088EE073D836E1FF277DFFBF7877B4B7B3 + C376AE67B4C3593CA9698789473AFE627D03E30F4462B85D30D66F73E5325BE4 + BBEDEBB35D9FEBD77F7FA11DDCA21BE11CDB08C3ADB1F80FB3B3F82DFEFFD787 + 4FC77FCDDD8EF13B4231CA2904BFE6FF170F90E7F8FF5FF4FB1FBAF8FF292222 + 82783D10CF7DDAB06103858686F23DDAD5EDF73FC1EBF9FFA9B9B999F85E5259 + 59199D0F08E0FD2D5A97763322962E5F0B79EAFB9FE03BFCFF743336954A4B8A + 4995A3A21B376E5004B7CF7389F82C466AB59AAAAA6B2828388CACAD56EAD6BF + E03BFCFFB4DCE1129DB918467E0181D44EFCBC6245DF4DA2B8C4344A48CDA2F0 + E8040A088AA0E0E06BBAF54F3492FBDF8EF48799C46B4F2785D74F5394929AA6 + FBFE47345DF242A782D2C8EB5A329D6229BCB83E13944CDE41495C84CB89E744 + 70BCEEFB9F3E3FC4BE963EDE58421FD894E8F8D10EA534D8B6943EE43485EF33 + EE3029FE7F7D7EDEE9769A7DA4914C0E36EAF8FCAA76F28E6BA509AE1A1DFFFA + C4FDA4F8FFF57986A42C7C3B79EFB866BA9ADC42EF6F52EBF897876FA14EFFFF + B37C51759B8EFFD3EA3ACAAB6CA30D018D9DF6FFCB5CEF1CFB2CEF1BDFACE387 + EDACE73809FF7F27FF912929FEFFEEF8BFDBAA757C657D9BE48514FE69FFFFB3 + 7C9F950D3ADECCAFF9195EDFFFDF1DFFAA79A98EEFB7BAF4195EDFFF4FF41FD0 + D631527CDF054D67FD83309DD384FE41224E1829F8915C663A97FDC73FD0B16E + A1E7FFA75CD7AFA8C0632AA9768FA66CFB21CADAC60BF8FF991949C2FF2FFA51 + E0694A8F36BCD7C9FFBAFF9F14FFBF321699960375FC2FF9FF7563D7AD7447B4 + E7FAFF5F84FF15FF3F65AE7D973AFCFFBAFAE6794ED5D95F706E1DE59F5D4B85 + 3E5654E06329EFA7EAC44AEAF0FFD3C3957FA5F4E503C8FED854C907645DA135 + D76C747C3E73F9DE965412EC42C5D75D3BE703A08BFFFF5237FE7FFA62EB081A + 62FD99CEFEBCB336947D782975F8FF3BEDEFCEFF1F414F7FD863651F5A427AFE + 7FC93FD7FF2F785947958ECF7237233DFF3FD761451521EEE446D459BE3B75F0 + 99CEF32863EF1C4A779A4DD91EE6547C663D95076E27F9FEFF027C17FF3FF3D6 + 3CE74DA85BFF7F079BE93C97F4E7AF9EFF9F4AFCEC78BDCEE9FEFD9FD9FCFD73 + 48E5365BC777F8FFB9CD69A4DA3585543BBFD1E9DFF4FFD3328F245AB43F817E + A3FF5FB25B2F64D02CE72032758D233DFF3FF1BB05D9D8D8D01B7CB6ED73BF02 + 3D92CBD193D5E77E255EE133D8F68B59E49B5C443E89053463EF359AB93B8AF4 + FCFFC4EF16F41273EB8AEB91D2D88A544D2B92346D7C866C8155513D5E49AA10 + FE7F720E7F4CDFEEB94A531D6E919EFF9FFADC2FC7C9AA265CA86D8173B906DB + 4B1BE054D6008F0A0DA2EB5B7098F3845D8EA159348DDF5D27DA87E8BEFFFF2E + A91CABB98D5335CDD8C3AC7B45237673E8CAEC3E8E3B713CA0B619E6456AFC25 + A552F8FF69B4ED15FACA6D328D729E48BD132B70A9AE056EE58D5AA6B211FB59 + 07586E155A897A441D2FF378183B04D2D0F517C870EF04724BF2243156E17C56 + 762AD3B67D886DF5641DAB6EC2510EF7729A657103CED7B5CA719DB8E3121958 + F8D2978E6369CFBD83920FE53E1E14ED5536E188649B719CFBE3CCD7EB4A1BB1 + B8A8015E355A7E94E335FAE0A7D33474FB2872887391F6FBD46AC768435923BE + 2FD460728106E30A9A303CAF119FE7366062BE063B2AB5F61B6DBD40EF2E3D4E + 9F6DF9920C6C879218D7E53C7E7B2A5B60C86587E569F015B3E30B9B653882AF + 579635E39B3C357ECFFC18BB0BF4B6D961D2F3FFD3CB7C7F5794703FB9DCD785 + 8D302A6CC2E4A216187338AFA419738B34E8CB65E61CBA43A3379FA73F9B1E20 + 3DFF3F1D3F7E9C7AB31D63556A2C2D698259490B66306752D484A1396A88B965 + E21E4D33F6C590E1267FFAE3F76EA4E7FF17EFB1527F92F3B712C4E324F43273 + 7F10F3D237992CCEDCA7A5C7E269E4CFFEF4FB99CE72CEAE5AB58A4C4C4C68CA + 9429646C6C4C93264DA2091326909191118D193386DE5D7C843EB1F4A6E136E7 + C9C8FE327DBDF33A7D69EB47AF7DB787FE0DFF3FFD6EC65EB6DDA5837FF677E6 + 662D0C665D433FC3CDE837C899E32132ED457E93178780FA396835C0A943CE52 + 22EF977E86B3CE33B71534681FFAF55B8E81038763D02043F4EDBB58A6098932 + DDB66B7953CB1A78B0CD0E183C78300C0C0C74A2010E324FD431CB32F629363E + A3566B633FEEEF8075E867B0EF2956F2C226CE13654459C128BFC54EF19C6629 + ED1565FBBF6D8341060B74EC80410B649A888B32624C04A3FC064DE67ED3665D + F981030DB5E3AEB3DD59A6E9F765D0AC4B3A5E941565F4ED1D38700C068EB7C1 + DB63B6CAF8D363E12C19E527FB2EC646A41B6C85C1E4C57873F03A6D1A4BC445 + 9AC8D32FFB54FBE2FE0CB0D18EB3881B5C025972DDB344FDBE1D8C83B68C184B + BDF6071838EBE6080DD2DEA72FCDD230EF780EE6B9E5C8B82EAFA37DC168E76A + 060618727BFD3AE799C8373074C2BA75EBA4445C6B9FD2C63E0C98EC245983C5 + 9738CE73C640B1DB43374FF4CBEBD2C5FC32D827192DEBD421EDBCF8FCF359E8 + DFDF40967B5E7C80C1D14EC66033E9C47CFFFE83F1E69BDA72CF8B3FC574E1B5 + 763BE9F5A19BB81EA3EFFF17DF247E4DCFF3FF8BBCB6B6B66724FE764FA8BEBE + 5E86A25C77FE7F85177FF727FD3825A5F23B54714931A2A2A2E11BE02FBF3129 + 75BC61F78EF0CD2A7FFFAFE3052BB812E68A8B8B3ABED715C1C3F388FC3623EA + 1012E567FB2F50FEFE5FC7971497C0C1C1019F1A7C2425E2E29BA4F7591F59C7 + 5E77D7CEB1D0F3FF2BFC8E1D3BE4772FC5DF29E2222D233303C1A121B8753B1C + 8989894F7DFF13FE7F85176D0A4EF91E27E2224DF8141393EECBEF3FE2FB98FE + F73FE1FF7F115EF9AE2ACAC9EF577AFE7F85B7B3B393DF0A15FB972F5F8E152B + 56C8EF705D797DFFBFC28B7CF19D4E193FF1ED72DBD6CD322EBE67EAF3FAFE7F + 7D5E5F8211AC5287F0A7EA78ADFF5FEA79BC90F86EA95F878EEFF4FFFF222F74 + E7CE1DC9EE72DCD1397E7AFEFF5FE3F5A56B5FCFFFFFBCF5F33C75F25AFFFF8B + ACDDAE12FE7F61FFD2D986DD6AC9AC91347FFA509A33F58B9E53C67EBCF1EBAF + 3EF4FB7AF4070153C67EB47ADAB8C1BD9573C6F37821B3EF86D382EF863B9B4E + FB9FEDDF4EFCE49599930D7ACD9F3ECC87D39728FCB21F463DABEF479972F8C9 + F21F468F655D5A32CB90667FF3292D9E3982CC7F18FD03A7B92AFCCAF9465DF5 + DA8A7946D1AC3FB3AEFE346FEC3BABCCC6D39A4593653EA76D66AD5578CB4593 + BA6A136B266B19CB41A4592DF9FA25AB25C6AFAE593CE975BEBECE7A4FE1D72F + 9FA293F5F2297F5BBFEC9BC8F5CBBF799DAFAF72FC658E73DE37D61CFF9AC39F + D72DFB66354B774EB35D395DEA676D78D876C5F4111CBAD8AE3099C712697FE1 + B4DBACF7397E9143125278BB35B3148DD86239EB2287EF7078798BC54C25FD00 + 5F8F649DDD6239D38845420ABF73C33C29870DA67E0ED6A6FFE4F03887C3766E + 30E574D3117C7D9EC3D11C1EDD613D971429BC8BFD32A1EF9DED96BAB9D82D7D + 8B1528D25C45BA88DB2DFD9015C9F97F659122853FE464F1D743BB565FF7705C + 3580C30F0EEDB2B8EAB9772D1D71B2B4F7705CBD89AF17729E258BF4A5F0A7DC + 6D96B3F6B2487027DD36589F72DF7889C36D27DD6CFEC6F1280E7BB1485F0AEF + EFB97D1F6BAD9FE7763A7360139D74DDC0E1CFAFFA1ED94AFEC7761CF53BBAFD + 1B167595C25F3BEBB69875E4FAB97D147DFD34DDBC749482FD0F5090AFFB744E + F7BFEAE342DD49E1C32F1F7BEDF69513A7985D7B37ECDC4BF76EF9F7880DF1FE + 3AE2EA891BE181C7DEBA15E849DD49E1459BB1213EAFDCBB757E7BE2ED0BE758 + DE09E10147EE849E7D3B2AE834455DEF5E82D5A8ABA05157EAA9EB75D7BCCEFC + 863AFDB00AF5958F505F910175E16D34D414A3BEEA091AAAF3385E087571145F + 67435D9A840675B5643A79AEB3BE0E558956A8C93C80922B1FA03AC50E6561E3 + 5079D71C95714B396EC4695BB8CC5A2E5F2E191D5F5B8CB2D02FA12EB9839AAC + C3DC560CD44551A82B0CE7B478A80BC2505F769FF38E72988CB290A16C67A696 + E7762BE357A238E0F7A87D7C12856709B55947D8868128BB65C479E69CF71A6A + 1E9F40A10FA1FAA12BE7FD1DE5B78DB91F75D0D495A22E3F1875AA0B32AC4AB2 + 411DB75D19B708D5A98EA87D741C15B1F3392D9CF3AC5197E38FBABCEBACABA8 + E7B1A9CB0F42915F2F54DEFB119577B89F378D50577003E591D351956C87EACC + 43288F98CE69C1280B9FC0E9DFA1FAC156667AA326E3006A1EBAA0E4F23BA84E + DB81D21B23501CF837AEFB0A87EFA0227AB6B447C445BB2557FF81D2A0F7D8A6 + 632866A6F2DE6AD497DE43ED93B31C26A02EF732C77DD1C0F75184753C6EEAE2 + 3BDA7CBEAFD27696BA3CAD233F9CEFD77E149E23AECB1CA5D7FF9BC7A8076AB3 + BD781C7BF03D1B8B8ABBCBB4693C7E45FEBD792CFBF118BAA0D0975071CF42B6 + 5F7E7B0A6A1E9DE4F6AF327B9AE751066A793CD51DF7AF4E15C06999DCA637D7 + 739ACB5D4179D44C2E7399EF9F9AC763172AA2BE4575BA13B7D197EBF0E63EBF + 25C7ABF2DE4F9CF692ACB7E87C5FB66709A759F23C5AC7F7AF96E74F356A73FC + 5074AE2787E7517C71809C8315317365B9EAB4BD280F1FCF79FE28BEF017D488 + 7A02FEC0E98ECCD768D7427D2DDB7F4ADE77755124F387D9561F9EAF3B39FD18 + DBE5227931BEF565A9721E8AF5A2BF7E445D550916725E94860CE3BE9D4765C2 + 3A3956E23E97DF9E2EEF4365FC4F5CBE42B77E1A1B6A4989CBFE88FFFF96C744 + 236C1321CF6F8D48E7506947579EF5BF88CBCF9E } end object Timer1: TTimer OnTimer = Timer1Timer - left = 225 - top = 116 + Left = 225 + Top = 116 end object dlgSave: TSaveDialog FilterIndex = 0 Options = [ofOverwritePrompt, ofNoReadOnlyReturn, ofEnableSizing, ofViewDetail] - left = 117 - top = 64 + Left = 117 + Top = 64 end object popWebSearch: TPopupMenu Images = frmNewQSO.imgMain1 OnPopup = popWebSearchPopup - left = 314 - top = 216 + Left = 314 + Top = 216 object mnuHamQth: TMenuItem Action = acHamQTH ImageIndex = 19 @@ -2564,1137 +2386,517 @@ object frmMain: TfrmMain end end object imgMain1: TImageList - left = 176 - top = 232 + Left = 176 + Top = 232 Bitmap = { - 4C69230000001000000010000000C803EA00C803EA00009B0000009B00000000 - 000000000000000000000000000000000000000000003939E7FF000000000000 - 0000000000000000000000000000472F2200D3A98700DCA77B00DCA67A00DAA4 - 7A00D8A27900D5A07600D49E7500D29D7300CF9A72009A9A9AFFCB966F00C994 - 6C00BC937500472F220000000000DBAB8400E8B99200E8B99200D6D6D6FFD3D3 - D3FFCFCFCFFFCCCCCCFFC8C8C8FFC4C4C4FFAFAFAFFF747474FF8E8E8EFFB1B1 - B1FFE8B99200BF8F6E0000000000DCA77B00DCA77B00DCA77B00D1D1D1FFF3F3 - F3FFF3F3F3FFF2F2F2FFF2F2F2FFF2F2F2FFF1F1F1FFF1F1F1FFF0F0F0FFA9A9 - A9FFDCA77B00C08B660000000000DBA47A00FFFFFF00FFFFFF00CDCDCDFFF3F3 - F3FFF5CCB2FFF5CCB2FFF5CBAFFFF5C9ACFFF3C8AAFFF3C5A7FFEFEFEFFFA2A2 - A2FFFFFFFF00BD87630000000000D9A37900FFFFFF00FCFBF900C7C7C7FFF2F2 - F2FFE4E4E4FFE3E3E3FFE2E2E2FFE1E1E1FFE0E0E0FFDFDFDFFFEFEFEFFF9B9B - 9BFFFFFFFF00BA85600000000000D8A27900FFFFFF00FDFDFA00C1C1C1FFF1F1 - F1FFF5C8ACFFF3C7AAFFF3C5A6FFF3C3A3FFF3C09FFFF2BE9DFFEEEEEEFF9393 - 93FFFFFFFF00B7815E0000000000D5A07600FFFFFF00FDFDFC00BBBBBBFFF1F1 - F1FFE1E1E1FFE0E0E0FFDFDFDFFFDEDEDEFFDDDDDDFFDCDCDCFFEDEDEDFF8C8C - 8CFFFFFFFF00B57E5C0000000000D49E7500FFFFFF00FEFEFC00B4B4B4FFF0F0 - F0FFF3C1A2FFF2C09FFFF2BE9BFFF2BB99FFF2BA96FFF1B895FFECECECFF8484 - 84FFFFFFFF00B27C5A0000000000D19C7300FFFFFF00FEFEFC00A4B1A5FFEFEF - EFFFDEDEDEFFDDDDDDFFDCDCDCFFDBDBDBFFDADADAFF9BB7A5FF5F9874FF4F8E - 66FF4A8A61FF7079500000000000CC976F00FFFFFF00ECF8EB0070C17AFFEEEE - EEFFDCDCDCFF818181FF838383FF848484FF6B8B77FF61AB81FF95D4B4FFBAE6 - D0FF6ABB8FFF2D8F57FF0E3B1EFFCA946E00FFFFFF00D8F0DB0073C67CFFC1DF - C5FFDBDBDBFF858585FFB5B5B5FFB7B7B7FF46875EFF90D3B1FF92D6B1FFFFFF - FFFF65BC8CFF67BC8FFF186835FFC8926C00F7FCF70067C272FF87CB8FFF78C3 - 80FFD9D9D9FF898989FFB9B9B9FFB9B9B9FF317B4CFF9CD4B6FFFFFFFFFFFFFF - FFFFFFFFFFFF95D2B2FF196B37FF704B360096A66A0062BC6BFF60B66AFF6EB0 - 75FF8FA792FF878E87FFBCBCBCFFBDBDBDFF1F6D3CFF62BA8BFF60BA87FFFFFF - FFFF60B987FF67BC8FFF186835FF000000006B6B6BFF6B6B6BFF6B6B6BFF6B6B - 6BFF6B6B6BFF6B6B6BFF6B6B6BFF6B6B6BFF416B50FF288C53FF64BA8DFF95D2 - B2FF64BA8DFF288C53FF0E3B1EFF000000000000000000000000000000000000 - 000000000000000000000000000000000000000000001F6531FF1A6A36FF196B - 37FF186634FF0D391DFF000000004804EA004804EA005055D9005055D9000000 - 0000000000004F4F4F0095959500939393004A4A4A003939E7FF000000000000 - 0000000000000000000000000000000000000000000000000000222222000B0B - 0B0002020200B7B7B700E5E5E500E4E4E4009E9E9E009A9A9AFF0A0A0A001C1C - 1C0000000000000000000000000000000000000000007F7F7F00D6D6D6FFD3D3 - D3FFCFCFCFFFCCCCCCFFC8C8C8FFC4C4C4FFAFAFAFFF747474FF8E8E8EFFB1B1 - B1FF6363630000000000000000000000000064646400DCDCDC00D1D1D1FFF3F3 - F3FFF3F3F3FFF2F2F2FFF2F2F2FFF2F2F2FFF1F1F1FFF1F1F1FFF0F0F0FFA9A9 - A9FFB7B7B70043434300000000000000000063636300C3C3C300CDCDCDFFF3F3 - F3FFF5CCB2FFF5CCB2FFF5CBAFFFF5C9ACFFF3C8AAFFF3C5A7FFEFEFEFFFA2A2 - A2FF797979003737370000000000000000000000000067676700C7C7C7FFF2F2 - F2FFE4E4E4FFE3E3E3FFE2E2E2FFE1E1E1FFE0E0E0FFDFDFDFFFEFEFEFFF9B9B - 9BFF474747000000000000000000A1A1A100AEAEAE00B3B3B300C1C1C1FFF1F1 - F1FFF5C8ACFFF3C7AAFFF3C5A6FFF3C3A3FFF3C09FFFF2BE9DFFEEEEEEFF9393 - 93FF838383007878780069696900C2C2C200E9E9E900D6D6D600BBBBBBFFF1F1 - F1FFE1E1E1FFE0E0E0FFDFDFDFFFDEDEDEFFDDDDDDFFDCDCDCFFEDEDEDFF8C8C - 8CFFC6C6C600DDDDDD006A6A6A00BDBDBD00E2E2E200D2D2D200B4B4B4FFF0F0 - F0FFF3C1A2FFF2C09FFFF2BE9BFFF2BB99FFF2BA96FFF1B895FFECECECFF8484 - 84FFC0C0C000D2D2D20060606000838383007F7F7F0095959500A4B1A5FFEFEF - EFFFDEDEDEFFDDDDDDFFDCDCDCFFDBDBDBFFDADADAFFD9D9D9FFEBEBEBFF7783 - 78FF188E45004E4E4E004343430000000000000000005C685E0070C17AFFEEEE - EEFFDCDCDCFF818181FF838383FF848484FF868686FFD7D7D7FFDBE4DCFF549C - 5AFF46A568000785340000010000000000005454540095AD980073C67CFFC1DF - C5FFDBDBDBFF858585FFB5B5B5FFB7B7B7FF8A8A8AFFD5D5D5FFCADBCBFF5AA7 - 60FF70B57F003CA05C00007C2400000000005156510067C272FF87CB8FFF78C3 - 80FFD9D9D9FF898989FFB9B9B9FFB9B9B9FF8B8B8BFFCBD1CCFF4E9E54FF79BB - 7FFF44944CFF1074280000040100000000002E5A330061BB6BFF60B66AFF6EB0 - 75FF8FA792FF878E87FFBCBCBCFFBDBDBDFF8D8D8DFF829A83FF549658FF65AD - 6DFF3E8D43FF2C612EFF00000000000000006B6B6BFF6B6B6BFF6B6B6BFF6B6B - 6BFF6B6B6BFF6B6B6BFF6B6B6BFF6B6B6BFF6B6B6BFF6B6B6BFF6A6C6AFF5979 - 5AFF5F7360FF676D67FF00000000000000000000000000000000000000000000 - 0000000000002A2A2A00424242003D3D3D002020200000731E00037B1E000002 - 0000000000000000000000000000F003EA00F003EA0038A2390038A239000000 - 0000000000004F4F4F0095959500939393004A4A4A003939E7FF000000000000 - 0000000000000000000000000000000000000000000000000000222222000B0B - 0B0002020200B7B7B700E5E5E500E4E4E4009E9E9E009A9A9AFF0A0A0A001C1C - 1C0000000000000000000000000000000000000000007F7F7F00D6D6D6FFD3D3 - D3FFCFCFCFFFCCCCCCFFC8C8C8FFC4C4C4FFAFAFAFFF747474FF8E8E8EFFB1B1 - B1FF6363630000000000000000000000000064646400DCDCDC00D1D1D1FFF3F3 - F3FFF3F3F3FFF2F2F2FFF2F2F2FFF2F2F2FFF1F1F1FFF1F1F1FFF0F0F0FFA9A9 - A9FFB7B7B70043434300000000000000000063636300C3C3C300CDCDCDFFF3F3 - F3FFF5CCB2FFF5CCB2FFF5CBAFFFF5C9ACFFF3C8AAFFF3C5A7FFEFEFEFFFA2A2 - A2FF797979003737370000000000000000000000000067676700C7C7C7FFF2F2 - F2FFE4E4E4FFE3E3E3FFE2E2E2FFE1E1E1FFE0E0E0FFDFDFDFFFEFEFEFFF9B9B - 9BFF474747000000000000000000A1A1A100AEAEAE00B3B3B300C1C1C1FFF1F1 - F1FFF5C8ACFFF3C7AAFFF3C5A6FFF3C3A3FFF3C09FFFF2BE9DFFEEEEEEFF9393 - 93FF838383007878780069696900C2C2C200E9E9E900D6D6D600BBBBBBFFF1F1 - F1FFE1E1E1FFE0E0E0FFDFDFDFFFDEDEDEFFDDDDDDFFDCDCDCFFEDEDEDFF8C8C - 8CFFC6C6C600DDDDDD006A6A6A00BDBDBD00E2E2E200D2D2D200B4B4B4FFF0F0 - F0FFF3C1A2FFF2C09FFFF2BE9BFFF2BB99FFF2BA96FFF1B895FFECECECFF8484 - 84FFC0C0C000D2D2D20060606000838383007F7F7F0095959500A4B1A5FFEFEF - EFFFDEDEDEFFDDDDDDFFDCDCDCFFDBDBDBFFDADADAFF819CCFFF2860C5FF0442 - BCFF064DACFF2A4980004343430000000000000000005C685E0070C17AFFEEEE - EEFFDCDCDCFF818181FF838383FF848484FF5570A3FF3C75D1FF8DB5F7FFB8D6 - FEFF72A8F5FF2C6CCAFF021E5000000000005454540095AD980073C67CFFC1DF - C5FFDBDBDBFF858585FFB5B5B5FFB7B7B7FF154DB3FF8DB5F6FF4D92FFFF1177 - FFFF2186FFFF408AEBFF034BA6FF000000005156510067C272FF87CB8FFF78C3 - 80FFD9D9D9FF898989FFB9B9B9FFB9B9B9FF0542BCFFAECDFEFFFFFFFFFFFFFF - FFFFFFFFFFFF187FEFFF0442BBFF000000002E5A330061BB6BFF60B66AFF6EB0 - 75FF8FA792FF878E87FFBCBCBCFFBDBDBDFF124DB4FF639DF4FF187FFFFF0076 - F8FF0076EEFF0368E1FF033EA5FF000000006B6B6BFF6B6B6BFF6B6B6BFF6B6B - 6BFF6B6B6BFF6B6B6BFF6B6B6BFF6B6B6BFF426197FF2664C8FF2177E6FF0579 - EAFF0164DDFF054DBCFF01215800000000000000000000000000000000000000 - 0000000000002A2A2A00424242003D3D3D00202020000E666C00034BA6FF0442 - BBFF033DA5FF0121580000000000FFFFFF00FFFFFF00E39344FFE29243FFE599 - 51FFE18D42FFDE8330FF0A7ED700EFC873000000000000FFFF00000000000000 - 0000E1ECF700F8D7790000000000000A7E00E5974DFFE18D3FFFAAFD5200DE84 - 34FFE59E5FFFDC7A29FFFFFFFF00FFFFFF000011CE00FFFFFF00FFD217000000 - 0000CEFFFF00FFFFFF001700000000FFFF00E18C3BFF00000000FFFFF600DE7D - 2DFFE39758FFDA7322FFFFFFFF00D217000015EAE9000000000016EBEA000000 - 000000FFFF000000000000AAFF003F091100DE8434FFE08B40FFDC7A29FFE6A2 - 6BFFDD8039FF00FFFF000000000000000000FFFF00000A8DFF0000000000AAFF - D00009115100FFBD01000055FF00E08D41FFDE7D2DFF0000000000FFFF0091A9 - 5CFF84A050FF0000000014E7FF0000003700E612000000001400FF48000000FF - FF000000000000000000FFFF0000E39454FFDA7624FFFFE612008BA352FF87CA - 8FFF82C58AFF609E51FFFFAA0000409048FFE5AB77FFE4A976FFE6A875FFE5A8 - 73FFE4A570FFE1A16FFF76000000DA7322FFD86F1DFFD76A1AFF839F51FF7FC4 - 87FFAFDBB5FF74B77BFF409048FF38843EFFE4A875FFE4A773FFE9BA91FFE8B9 - 92FFE6B388FFDF9D6BFF00FFFF0000000000D2FF2E0000000000002EFF0050A6 - 59FF70B579FFA5D7ACFF9DD2A4FF307936FF00000000E4A56FFFE2A16EFFEDBB - 94FFE9A874FFFF2E0000000000002EFFD70000000000FFACAD00550000000000 - 0000409048FF9AD1A1FF94CF9CFF296F2EFFE6A56FFFE1A06CFFE19E69FFECB3 - 86FFE8A571FF00FFFF000000000000000000FFFFFF00FFFF9200000000004090 - 48FF38843EFF307936FF296F2EFF858549FFE3A97BFFDE9B68FF00FFFF00E9A9 - 78FFE8A775FF000000000003FF000000FC000200000000000000FFFB000000FF - FF000000000000000000FFFFFF00E4A371FFDE9A67FFFF02000000000000E8A5 - 72FFE7A471FF2BFFFF00000000000000000000FFFF0000000000EFFF11000000 - 00000012FF000000EF00E5A068FFE2A97FFFDB9463FF00FFFF0000000000E496 - 5CFFE8A575FFEDBB94FF93000000FF1100000000000012FFEE0000000000ABFF - FF0000000000E6A067FFE0A478FFDB9361FFDA9060FFD98F5DFFD78C5AFFDE99 - 6BFFE8A678FFECB386FFFFCF000000FFFF000000000000000000FFFF00000000 - 2D00E3000000E4A474FFDC9767FF3BFFCF0000000000FFAAAB0055000000E28F - 56FFE8A679FFE18C53FF92FF8E0000000000008AFF00000092008E0000000000 - 0000E7A472FFDA905EFFDB8F5CFF00000000FFFF000000000500FB000000E499 - 67FFE9AC82FFE3935DFF00001500EA151500EA1500000000000000FFFF00E599 - 60FFE4965DFFE1935AFFE29259FF00003600F4220000E28E53FFE18C52FFE18B - 50FFE1894FFFE1894FFFE1894FFF636363006363630063636300636363006363 - 630063636300636363006363FF00001108000C000C00012200001101030001FF - C4006C9BD3FF6999D1FF6596CEFF000000000000000002030400060708000A0B - FF0000B5100002010300020403000504040000017D00020300006F9DD5FF6C9B - D3FF84B0D9FF5990B8FF5F92CAFF42B1C10052D1F0007F7F7FFF7D7D7DFF7B7B - 7BFF797979FF767676FF747474FF717171FF709DD3FF6E9DD5FF86B1DBFFAAD2 - E7FFA8CFE5FF578FB7FF588DC5FF83848500878889007C7C7CFF989898FF9898 - 98FF999999FF999999FF9A9A9AFF9A9A9AFF6E9CD2FFA9D0E6FFAAD0E6FF97C6 - E0FF90C1DDFF558EB6FF5188C0FFF2F3F400F6F7F800797979FF989898FF5190 - 58FF989998FF9A9A9AFF9B9B9BFF9B9B9BFF6B99CFFFA6CDE4FF8EC0DEFF88BC - DBFF8ABCDBFF528CB5FF4A83BBFF0102030004052100767676FF999999FF3C89 - 44FF48894EFF9B9B9BFF9C9C9CFF9C9C9CFF6595CBFFA1CAE2FF88BCDBFF82B8 - D9FF83B8D9FF508AB4FF427DB5FF43934CFF41904AFF3E8C47FF3C8844FF5CA3 - 64FF599F60FF44824AFF9D9D9DFF9D9D9DFF5F91C8FF9DC6E1FF82B7D9FF7CB3 - D6FF7DB2D6FF4E88B3FF3A78B0FF408F49FF93D19EFF90CF99FF8CCC95FF88CA - 91FF83C78CFF509757FF407B45FF9E9E9EFF598DC3FF97C2DFFF7BB2D6FF73AE - D5FF5DC3ECFF4A87B2FF3372AAFF3D8A45FF8ECD98FF7CC586FF77C280FF72BF - 7BFF73BF7BFF78C180FF488F4EFF537E56FF5388BEFF93BEDCFF74ACD3FF62B7 - E0FF4AD3FEFF418AB7FF2B6DA5FF3A8641FF88CA91FF83C78CFF7FC587FF7AC2 - 82FF76C07EFF468E4CFF3A733EFFA0A0A0FF4B83B9FF8CBADAFF6DA7D0FF65A5 - D0FF5EB3DEFF4684B0FF2468A0FF36813DFF337D3AFF307836FF2D7433FF4890 - 4FFF458E4BFF38723CFFA0A0A0FFA1A1A1FF447DB3FF87B6D8FF66A2CEFF609D - CBFF629ECBFF4482B0FF1E639BFF000000000000FF005F5F5FFF9F9F9FFF3C75 - 40FF357038FFA1A1A1FFA1A1A1FFA2A2A2FF3C78AFFF81B2D6FF619ECBFF5999 - C8FF5D9AC9FF4280AEFF185F97FFD900000000FFFF005B5B5BFFA0A0A0FF3B72 - 3FFF9FA0A0FFA2A2A2FFA2A2A2FFA3A3A3FF3573A9FF7CAED3FF5A99C8FF5394 - C6FF5795C7FF407FADFF125B93FF00000000FFFFD500575757FFA1A1A1FFA1A1 - A1FFA2A2A2FFA3A3A3FFA3A3A3FFA4A4A4FF2E6EA4FF77AAD1FF77AAD2FF72A6 - D0FF689FCCFF3F7EADFF0E5890FF989898FF707070FF535353FF505050FF4E4E - 4EFF4B4B4BFF494949FF464646FF444444FF24669CFF3173A7FF3C7BAEFF4683 - B4FF4D89B9FF3D7DACFF0B568EFFFFFF8500FF00000000009700FFFFFF000000 - 0400FFFFFF00FFFFFF00FFFF0D00F6EFAC000000000000FFFF00000000000F59 - 91FF0C578FFF125B91FF0B568EFFE003EA00E003EA0018950000189500000000 - 0000000000000000000000000000000000006C6C6C009A9A9EFF9B9B9BFF9999 - 99FF000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000006C6C6C009B9B9BFFE4E4E4FFEEEEEEFF9696 - 96FF000000000000000000000000000000000000000000000000D6D6D600D3D3 - D300CFCFCF00CCCCCC00C8C8C8009C9C9CFFE2E2E2FFE7E7E7FFB9B9B9FF9393 - 93FF000000000000000000000000000000000000000000000000D1D1D100F3F3 - F300F3F3F300F2F2F200F2F2F200989898FFE4E4E4FFCFCFCFFF979797FFA9A9 - A9008E8E8EFF8C8C8CFF8A8A8AFF000000000000000000000000CDCDCD00F3F3 - F300F5CCB200F5CCB200F5CBAF00969696FFDDDDDDFFC5C5C5FF949494FF8E8E - 8EFFACACACFFD7D7D7FF878787FF000000000000000000000000C7C7C700F2F2 - F200E4E4E400E3E3E300BCBCBC00939393FFD4D4D4FFC8C8C8FFBCBCBCFFBABA - BAFFC2C2C2FFC4C4C4FF828282FF000000000000000000000000C1C1C100F1F1 - F100E6B292FFDBA989FF929292FFC7C7C7FFCCCCCCFFC7C7C7FFC6C6C6FFC3C3 - C3FFC0C0C0FF848484FF59595900000000000000000000000000BBBBBB00E4B6 - 9BFFE7B99CFFE6B698FFD8A98CFFD2D2D2FFB5B5B5FF898989FF878787FF8585 - 85FF808080FF5959590000000000000000000000000000000000D9AB8FFFE6B7 - 9CFFEFCFBCFFEECEBAFFE2AE8CFFD29B7BFF888888FFD5AB9100ECECEC008484 - 84000000000000000000000000000000000000000000B8896CFFE6B799FFEECE - BBFFE9C0A7FFE8BDA3FFECC8B3FFDFA481FFD38D62FF819CCF002860C5000442 - BC00033DA400012057000000000000000000B7866BFFE6B498FFEECDBAFFE9BF - A5FFE5B496FFE7B99DFFEBC6AEFFDE9F79FFC7805AFF3C75D1008DB5F700B8D6 - FE0072A8F5002C6AC900021D5000B78668FFE6B394FFEECCB8FFE9BEA5FFE5B3 - 94FFE6B79BFFEAC4ADFFDE9E78FFD0875AFF154DB3008DB5F6004D92FF001177 - FF002186FF00408AEB00033BA100DD9F79FFEDCCB7FFE8BDA3FFE4B192FFE6B6 - 9AFFEAC3ACFFDE9C74FFD08658FFB9B9B9000542BC00AECDFE00FFFFFF00FFFF - FF00FFFFFF00187FEF000442BB00DB976FFFEDC8B3FFE7B89BFFE6B498FFEAC3 - ABFFDE9C73FFC97F4FFFBCBCBC00BDBDBD00124DB400639DF400187FFF000076 - F8000076EE000368E100033EA500D18B61FFDFA481FFEAC2ABFFEAC0A8FFDC99 - 71FFC7794BFF6B6B6B006B6B6B006B6B6B00426197002664C8002177E6000579 - EA000164DD00054DBC000121580000000000CF8455FFD58351FFD17D4BFFBC6D - 3EFF00000000000000000000000000000000000000000E295C00033CA2000442 - BB00033DA50001215800000000002804EA002804EA008034570080345700E083 - 2300EFD8AE0000000000A800000000355700B434570000000000000000000000 - 0000C834570000000000000000004C2F2200D3A987FFDCA77BFFDCA67AFFDAA4 - 7AFFD8A279FFD5A076FFD49E75FFD29D73FFCF9A72FFCE9970FFCB966FFFC994 - 6CFFBC9375FF472F220000000000DBAB84FFE8B992FFE8B992FFE8B992FFE8B9 - 92FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B9 - 92FFE8B992FFBF8F6EFF00000000DCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA7 - 7BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA7 - 7BFFDCA77BFFC08B66FF00000000DBA47AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFBD8763FF4F0F0000D9A379FFFFFFFFFFFCFBF9FFFCFBF8FFFBF9 - F7FFFBF7F4FFFAF7F2FFF9F5F0FFF7F3EDFFF6EFEAFFF5EBE7FFF3EAE4FFF2E7 - DEFFFFFFFFFFBA8560FF00000000D8A279FFFFFFFFFFFDFDFAFFFCFCFAFFFCFB - F9FFFBFAF6FFFBF8F5FFFBF7F4FFFBF6F1FFF8F4EEFFF7F2EBFFF7F0EAFFF6EC - E8FFFFFFFFFFB7815EFF00000000D5A076FFFFFFFFFFFDFDFCFFFDFDFBFFFDFD - FAFFFCFCF9FFFCFBF7FFFBF9F5FFFBF8F4FFFBF7F3FFFBF5F2FFFAF3EFFFF8F2 - ECFFFFFFFFFFB57E5CFF00000000D49E75FFFFFFFFFFFEFEFCFFFDFDFBFFFDFD - FCFFFDFDFBFFFDFDF9FFFCFCF8FFFBF9F7FFFBF9F5FFFBF8F4FFFBF7F2FFFBF5 - F2FFFFFFFFFFB27C5AFF00000000D19C73FFFFFFFFFFFEFEFCFFFEFEFCFFFEFE - FCFFFDFDFBFFFDFDFBFFFDFDFAFFFDFDF8FF60BC6CFF5CB667FF57B061FF52A8 - 5CFFFFFFFFFFB07A58FFC9DBA300CC976FFFFFFFFFFFFFFFFCFFFFFFFDFFFEFE - FCFFFEFEFCFFFEFEFBFFFDFDFAFFFDFDFAFF5BB465FF9DD6A6FF99D3A2FF4B9E - 53FFFFFFFFFFAC7554FFFFFFBF00CA946EFFFFFFFFFFFFFFFFFFFFFFFEFFFFFF - FDFFFEFEFDFFFEFEFCFFFEFEFCFFFEFEFCFF54AB5EFF96D29FFF91CF99FF539F - 5BFFD4E6D6FFAA7353FF00000000C8926CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFF84C58BFF57AB61FF6AB473FF90CE97FF8ACB91FF6AB0 - 70FF3B8442FF52773DFF000F4F008A5036FFC38E68FFC08B66FFBE8864FFBB85 - 61FFB9835FFFB47E5CFFB07D5AFF599954FF63AC6BFF88C990FF82C68AFF529A - 58FF407537FF6E4E41FF09000000D78833007BBEE9000D1F43002B100700E0A3 - 5D0047A3E4000F021100E2A244002A7DD200327239FF559E5CFF509856FF4C76 - 31FF3E99DE0000000D00000000004F0F0000BFEFBF00000F4F000F010000D591 - 3E003B8DD30000010E004F0F0000BFEFBF00000F4F00265F2AFF215725FF0000 - 000000000000000000005D170100C803EA00C803EA0098722100987221000000 - 0000000000004F4F4F0095959500939393004A4A4A003939E7FF000000000000 - 0000000000000000000000000000000000000000000000000000222222000B0B - 0B0002020200B7B7B700E5E5E500E4E4E4009E9E9E009A9A9AFF0A0A0A001C1C - 1C0000000000000000000000000000000000000000007F7F7F00D6D6D6FFD3D3 - D3FFCFCFCFFFCCCCCCFFC8C8C8FFC4C4C4FFAFAFAFFF747474FF8E8E8EFFB1B1 - B1FF6363630000000000000000000000000064646400DCDCDC00D1D1D1FFF3F3 - F3FFF3F3F3FFF2F2F2FFF2F2F2FFF2F2F2FFF1F1F1FFF1F1F1FFF0F0F0FFA9A9 - A9FFB7B7B70043434300000000000000000063636300C3C3C300CDCDCDFFF3F3 - F3FFF5CCB2FFF5CCB2FFF5CBAFFFF5C9ACFFF3C8AAFFF3C5A7FFEFEFEFFFA2A2 - A2FF797979003737370000000000000000000000000067676700C7C7C7FFF2F2 - F2FFE4E4E4FFE3E3E3FFE2E2E2FFE1E1E1FFE0E0E0FFDFDFDFFFB1DAE9FF58A5 - D8FF85B1DBFF469DD0FF10374D00A1A1A100AEAEAE00B3B3B300C1C1C1FFF1F1 - F1FFF5C8ACFFF3C7AAFFF3C5A6FFF3C3A3FFF3C09FFFA8BCB6FF77BEE7FFB4D2 - F0FFE5F3FFFFACD2EFFF4B88BEFFC2C2C200E9E9E900D6D6D600BBBBBBFFF1F1 - F1FFE1E1E1FFE0E0E0FFDFDFDFFFDEDEDEFF9FD0DFFF80D5EEFFB2E3F9FF8BC0 - E7FFAED3F6FFC4E0FCFF669DCFFFBDBDBD00E2E2E200D2D2D200B4B4B4FFF0F0 - F0FFF3C1A2FFF2C09FFFF2BE9BFFB8BAAEFF7DD4EDFFC4F6FDFF6CDDF6FF6DCA - EDFF63A3D7FF669FD2FF5E687000838383007F7F7F0095959500A4B1A5FFEFEF - EFFFDEDEDEFFDDDDDDFFA6CFDCFF79D3EEFFC7F7FDFF5FDCF5FF5BE2F7FF7AD6 - F2FF3C98D1FF4C5A66004343430000000000000000005C685E0070C17AFFEEEE - EEFFDCDCDCFF5E8293FF77CBE7FFC7F7FDFF5EDCF5FF5AE1F7FF7BD4F1FF4395 - D5FF43A07F000785340000010000000000005454540095AD980073C67CFFC1DF - C5FF9CBECFFF73B7D4FFC2F6FDFF63DFF7FF5DE2F8FF79D3F0FF4897DAFF56A4 - 6FFF70B57F003CA05C00007C2400000000005156510067C272FF87CB8FFF55A0 - 8BFF7AB6D5FF90B7D1FF55C9E4FF5BDFF5FF78D0EDFF4D99D9FF4B9C66FF79BB - 7FFF44944CFF1074280000040100000000002E5A330061BB6BFF60B66AFF4389 - AAFFE0F2FFFF549AD8FF1A7ABEFF4998C5FF3D83BCFF759791FF549658FF65AD - 6DFF3E8D43FF2C612EFF00000000000000006B6B6BFF6B6B6BFF6B6B6BFF2C65 - 83FF94C7F9FF91C9F9FF4185C9FF2064A7FF606E79FF6B6B6BFF6A6C6AFF5979 - 5AFF5F7360FF676D67FF0000000000000000000000000000000000000000103B - 52FF275E85FF4987BBFF427B9EFF3B454D002020200000731E00037B1E000002 - 000000000000000000000000000038FDF200C803EA0038FDF20038FDF2000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000EAA677FFE8A474FFE8A06EFFE69D6BFFE49965FFE2955EFF000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000E8A070FFF2C8ACFFF0C6A8FFF0C5A6FFEFC2A2FFE18E53FF000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000E69B67FFF0C5A6FFECB691FFEBB38CFFEEBC9BFFDF8547FF000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000E2925CFFEEC1A0FFEAB189FFE9AE85FFEDB794FFDB7C3AFF000000000000 - 00000000000000000000000000007478FEFF7478FEFF7276FEFF6E71FDFF6A6C - FCFFE18D52FFEDBB99FFE9AC81FFE7A87CFFEAB38DFFD8742CFF000000000000 - 00000000000000000000000000007478FEFFB8BBFEFFB6B9FEFFB3B6FEFFB0B3 - FEFFDF8445FFECB792FFE6A578FFE6A273FFE9AD85FFD66B1EFF000000000000 - 00000000000000000000000000007073FDFFB4B7FEFF8185FEFF7C81FEFFACAF - FEFFD97B39FFEAB28AFFE49F6EFFE39C6AFFE7A87DFFD1621AFF000000000000 - 00000000000000000000000000006A6CFCFFB0B3FEFF797EFEFF7579FEFFA8AA - FEFFD8742AFFE8AD83FFE29865FFE19560FFE5A376FFCF5718FF60BC6CFF5CB6 - 67FF57B061FF52A85CFF4DA155FF6364FAFFACAFFEFF7276FEFF6D71FEFFA2A4 - FEFFD6691EFFE7A77BFFE0925CFFDF8F56FFE49E6EFFCD4E16FFBAD9B5FFB7D6 - B1FFB3D3AEFFAED1A9FF45964DFF5B5BF8FFA8AAFEFF6B6FFEFF6569FEFF9EA0 - FEFFD1601AFFE5A274FFDE8C53FFDD894DFFE29966FFC94515FFB5D5B0FF8ABD - 83FF83B87DFFA7CDA3FF3D8B44FF5351F6FFA2A4FEFF6266FEFF5D61FEFF999B - FEFFCF5518FFE39C6CFFDC864AFFDB8344FFE0945EFFC63C13FFAFD1ABFF80B7 - 7AFF79B273FFA0C89CFF35803CFF4A47F5FF9EA0FEFF5B5EFEFF5659FEFF9597 - FEFFCD4C16FFE19763FFDA8041FFD97D3BFFDF8F58FFC63512FFA8CDA4FF77B0 - 71FF70AB6AFF9AC496FF2E7633FF413DF3FF999BFEFF9698FEFF9395FEFF9193 - FEFFC94315FFE0935DFFDF8F59FFDF8D55FFDE8A51FFC02E11FFA2C99EFF9DC6 - 99FF98C395FF94C091FF276D2CFF874480FF833F7EFF7F387DFF7C337CFF792E - 7BFFC63A13FFC63712FFC43112FFC02E11FFC02A10FFBF270FFF7C4F25FF7A4A - 21FF77461EFF75421BFF733F19FF000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000F003EA00F003EA00C0EA5300C0EA53000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000885A4100DCB18DFFDCA77BFFDCA67AFFDAA4 - 7AFFD8A279FFD5A076FFD49E75FFD29D73FFCF9A72FFCE9970FFCB966FFFC994 - 6CFFC49A7AFF885A410000000000DDAC85FFE8B992FFE8B992FFE8B992FFE8B9 - 92FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B9 - 92FFE8B992FFC1906FFF00000000DCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA7 - 7BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA7 - 7BFFDCA77BFFC08B66FF00000000DBA47AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFBD8763FF00000000D9A379FFFFFFFFFFFFC381FFFFC381FFFFC3 - 81FFFFFFFFFF66B16FFF66B16FFF66B16FFFFFFFFFFFFFCF98FFFFCF98FFFFCF - 98FFFFFFFFFFBA8560FF00000000D8A279FFFFFFFFFFFFC381FFFFD29FFFFFC3 - 81FFFFFFFFFF66B16FFF90CF99FF66B16FFFFEFEFEFFFFCF98FFFFD9ADFFFFCF - 98FFFFFFFFFFB7815EFF00000000D5A076FFFFFFFFFFFFC381FFFFC381FFFFC3 - 81FFFFFFFFFF66B16FFF66B16FFF66B16FFFFDFDFDFFFFCF98FFFFCF98FFFFCF - 98FFFFFFFFFFB57E5CFF00000000D49E75FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFEFEFEFFFEFEFEFFFEFEFEFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFCFC - FCFFFFFFFFFFB27C5AFF00000000D19C73FFFFFFFFFF66B16FFF66B16FFF66B1 - 6FFFFEFEFEFF5497FFFF5497FFFF5497FFFFFDFDFDFF67D5F0FF67D5F0FF67D5 - F0FFFFFFFFFFB07A58FF00000000CC976FFFFFFFFFFF66B16FFF97D29FFF66B1 - 6FFFFDFDFDFF5497FFFF73AAFFFF5497FFFFFCFCFCFF67D5F0FF9BEBFFFF67D5 - F0FFFFFFFFFFAC7554FF00000000CA946EFFFFFFFFFF66B16FFF66B16FFF66B1 - 6FFFFCFCFCFF5497FFFF5497FFFF5497FFFFFBFBFBFF67D5F0FF67D5F0FF67D5 - F0FFFFFFFFFFAA7353FF00000000C8926CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFA97251FF00000000A36D4EFFC38E68FFC08B66FFBE8864FFBB85 - 61FFB9835FFFB47E5CFFB27C5AFFB17B58FFAE7957FFAD7656FFAB7554FFA973 - 53FFA97151FFA36D4EFF00000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000636363006363630063636300636363006363 - 630063636300636363006363FF00001108000C000C00012200001101030001FF - C4006C9BD3006999D1006596CE00000000000000000002030400060708000A0B - FF0000B5100002010300020403000504040000017D00020300006F9DD5006C9B - D30084B0D9005990B8005F92CA0042B1C10052D1F0007F7F7F007D7D7D007B7B - 7B0014D1EEFF06D0EDFF01D2ECFF02D2ECFF06D0EEFF09CFECFF86B1DB00AAD2 - E700A8CFE500578FB700588DC50083848500878889007C7C7C009898980005D0 - EDFF77E8F5FFD3F8FCFFD4F7FCFFD1F7FDFFC6F6FBFF75E7F5FF09D1EDFF97C6 - E00090C1DD00558EB6005188C000F2F3F400F6F7F8007979790006D0ECFFA2EF - F9FFB0F2FBFF90ECF7FF86EAF6FF8CEBF6FF99EDF7FFC6F5FBFF9BEFF9FF06D0 - EDFF8ABCDB00528CB5004A83BB0001020300040521000CD1ECFF71E7F5FFA3F1 - FAFF8EECF7FF94EDF8FF8DECF7FF92EDF7FF95EDF8FF8CECF7FFAFF2FAFF6BE7 - F4FF19D3EEFF508AB400427DB50043934C0041904A0004CFEDFFB2F3FBFF93EC - F8FF92EDF7FF95EEF8FF96EEF8FF97EEF8FF93EDF8FF93EDF8FF95EDF8FFAFF2 - FAFF07D0EEFF4E88B3003A78B000408F490093D19E0001D2ECFFC1F6FCFF8CEB - F7FF94EDF8FF9AEFF9FF9EEFF9FF9FF0F9FF9DEFF9FF8FEDF8FF73E8F6FFAEF3 - FCFF01D2ECFF4A87B2003372AA003D8A45008ECD980001D2ECFFBCF5FBFF98EE - F8FF93EEF9FF9CEFF9FF9FF0FAFFA0F1FAFF90EEF9FF77EAF8FF66E7F6FFA4F1 - FCFF01D2ECFF418AB7002B6DA5003A86410088CA910004CFEDFFA8F2FBFF9BEF - F9FF7AEBF8FF5BE6F7FF4CE5F7FF47E5F9FF3CE3F8FF37E2F6FF4AE4F7FF87EE - FAFF07D0EEFF4684B0002468A00036813D00337D3A0006D0EDFF6AE7F5FF8EEE - FBFF40E2F6FF3BE3F7FF43E5F9FF48E6FAFF43E5F9FF3EE3F7FF6FEBFAFF4FE3 - F4FF0ED0EEFF4482B0001E639B00000000000000FF005F5F5F0007D1EDFF6EE9 - F8FF73EBFAFF4DE6F8FF46E6F9FF4CE7FBFF4EE6F9FF60E9FAFF5EE7F7FF08D1 - EDFF5D9AC9004280AE00185F9700D900000000FFFF005B5B5B00A0A0A00004D0 - EDFF45E1F4FF68E9F9FF63E9FBFF57E9FAFF53E7F9FF3AE0F4FF05D0EDFF5394 - C6005795C700407FAD00125B930000000000FFFFD50057575700A1A1A100A1A1 - A10013D1EEFF06D0EEFF00D2ECFF00D2ECFF07D0EDFF0FD0EDFF77AAD20072A6 - D000689FCC003F7EAD000E589000989898007070700053535300505050004E4E - 4E004B4B4B0049494900464646004444440024669C003173A7003C7BAE004683 - B4004D89B9003D7DAC000B568E00FFFF8500FF00000000009700FFFFFF000000 - 0400FFFFFF00FFFFFF00FFFF0D00F6EFAC000000000000FFFF00000000000F59 - 91000C578F00125B91000B568E00C803EA00C803EA0080A53D0080A53D000000 - 0000000000007F7F7F00BABABAFFB8B8B8FF7777770000000000000000000000 - 00000000000000000000000000000000000000000000000000003F3F3F001515 - 150004040400C6C6C6FFE5E5E5FFE4E4E4FFABABABFF02020200131313003333 - 33000000000000000000000000000000000000000000B1B1B1FFCECECEFFC8C8 - C8FF24242400C1C1C1FFDEDEDEFFDDDDDDFFB0B0B0FF20202000ABABABFFA7A7 - A7FF8A8A8AFF00000000000000000000000098989800DCDCDCFFEDEDEDFFDBDB - DBFFC2C2C2FFBEBEBEFFD6D6D6FFD4D4D4FFB0B0B0FFACACACFFCBCBCBFFE7E7 - E7FFB7B7B7FF66666600000000000000000095959500C4C4C4FFDCDCDCFFD4D4 - D4FFD9D9D9FFDBDBDBFFD6D6D6FFD4D4D4FFD9D9D9FFD2D2D2FFCBCBCBFFC8C8 - C8FF797979FF53535300000000000000000000000000989898FFD4D4D4FFCCCC - CCFFC9C9C9FFBABABAFF9C9C9CFFA1A1A1FFC2C2C2FFC6C6C6FFC1C1C1FFB7B7 - B7FF696969FF0000000000000000C1C1C1FFC1C1C1FFBFBFBFFFD8D8D8FFCDCD - CDFFBCBCBCFF7C7C7CFF373737003B3B3B00888888FFC3C3C3FFC2C2C2FFCDCD - CDFF8C8C8CFF858585FF7E7E7EFFC4C4C4FFE9E9E9FFD6D6D6FFC9C9C9FFCECE - CEFFA5A5A5FF3D3D3D0000000000000000004747470040A470FF319F65FFBABA - BAFFC6C6C6FFDDDDDDFF6B6B6BFFBFBFBFFFE2E2E2FFD2D2D2FFC6C6C6FFCDCD - CDFFB1B1B1FF444444000000000000000000454545003AA068FF5AB381FF2898 - 57FFC0C0C0FFD2D2D2FF616161FF9D9D9DFF8D8D8DFF9F9F9FFFCFCFCFFFC6C6 - C6FFCCCCCCFF3DA56FFF37A36DFF33A167FF309D62FF55AF7CFF91CBAAFF4FAB - 74FF188E45FF575757FF505050FF0000000000000000858585FFC5C5C5FFC1C1 - C1FFC5C5C5FF37A36BFF96CEB0FF94CDADFF91CBAAFF90CBA8FF74BC90FF8AC7 - A1FF46A568FF078735FF00020000000000007F7F7F00A6A6A6FFD5D5D5FFC5C5 - C5FFCBCBCBFF319F63FF94CDADFF6FBA8EFF6BB889FF66B685FF61B380FF67B5 - 82FF83C298FF3CA05CFF007F25FF0000000078787800BCBCBCFFDEDEDEFFA6A6 - A6FF828282FF299B5BFF90CAA9FF8DC8A5FF8AC6A1FF88C59EFF6AB685FF82C2 - 97FF48A566FF067825FF0008020000000000000000006D6D6DFF6F6F6FFF6464 - 64FF17171700229751FF1C914AFF168F44FF108B3BFF3A9F5EFF80C196FF46A3 - 62FF097723FF0006020000000000000000000000000000000000212121000C0C - 0C0002020200808080FFBDBDBDFFB2B2B2FF5B5B5BFF01822BFF43A15FFF0276 - 20FF000602000000000000000000000000000000000000000000000000000000 - 00000000000044444400535353FF4C4C4CFF34343400007C20FF037B1EFF0004 - 0000000000000000000000000000D003EA00D003EA00D8923900D89239000000 - 0000000000004F4F4F0095959500939393004A4A4A0000000000000000000000 - 0000000000000000000000000000000000000000000000000000222222000B0B - 0B0002020200B7B7B700E5E5E500E4E4E4009E9E9E00010101000A0A0A001C1C - 1C0000000000000000000000000000000000000000007F7F7F00CCCCCC009F94 - 89FFBCB0A4FF9D9185FFDEDEDE00AEA093FF9D9185FF58524BFF9C9C9C00A6A6 - A6006363630000000000000000000000000064646400DCDCDC00EDEDED00978D - 83FFC3B8AEFF655D55FFD6D6D6007C7268FFA89B8EFF9C9186FFCBCBCB00E7E7 - E700B7B7B70043434300000000000000000063636300746B62FFA4978AFF9589 - 7DFF9F9286FF3E3934FFD6D6D6004C4640FF7E746AFF857A70FF3E3934FF726E - 6BFF75757500373737000000000006050500262320009B8E82FF9D9185FF867B - 71FF564F48FF504A44FF80766CFF6E665DFF826C58FFA6917DFF948474FF564F - 48FF2B2A2A000000000000000000A1A0A000AEA297FFBAAEA2FF82776DFF8277 - 6DFFAA917BFFBAA794FFB4A28CFFB09781FF9F8D7DFF836D5BFF716357FF9589 - 7DFF141413FF7777770069696900C1C1C1009D9185FFB1A396FF7F756BFF7C72 - 68FF776D64FF6C635BFF2E2A26FF564F48FF80766CFF7C7268FF776D64FF7067 - 5EFF010101FFD9D9D9006A6A6A00BBBBBB005F5851FF423D38FF58514AFF3D38 - 33FF332F2BFF23211EFF04040400151412FF1A1816FF252220FF191715FF0F0E - 0DFF0E0E0EFFD0D0D0006060600083838300635D58FF9F9286FFCCC3BAFFC0B4 - AAFFA6988BFF3E5E48FF36A16C002E513BFF908479FFC2B8ADFFC0B4AAFFA89B - 8EFF132C1BFF4E4E4E004343430000000000524B45FF83786FFFCCC3BAFF7970 - 66FF71685FFF374638FF96CEB000373E37FF857A70FFC2B8ADFF786F65FF7B71 - 67FF0B0B09FF0785340000010000000000004D4741FF83786FFFCCC3BAFF786F - 65FF7B7167FF2F2E29FF93CCAC0022251FFF95897DFFC2B8ADFF786F65FF7C72 - 68FF060505FF3CA05C00007C24000000000046413BFF857A70FFC3B8AEFF7C72 - 68FF7F756BFF36322DFF8AC0A000394138FF95897DFFBAAEA2FF7C7268FF7F75 - 6BFF010101FF066F220000040100000000003E3934FF393430FF332F2BFF2C29 - 25FF272421FF201D1BFF1B844400122116FF0B0A09FF070706FF040403FF0000 - 00FF000000FF0003010000000000000000000000000000000000121212000606 - 06000101010076767600BDBDBD00B2B2B200545454000179280043A15F000265 - 1B00000301000000000000000000000000000000000000000000000000000000 - 0000000000002A2A2A00424242003D3D3D002020200000731E00037B1E000002 - 0000000000000000000000000000C803EA00C803EA00B8B3E000B8B3E000172F - 1A00418349FF55AB60FF5DBC69FF5EBF6BFF59B365FF44894DFF1B371F000000 - 0000000000000000000000000000472F2200D3A98700DBA77B008DB973FF64C4 - 6EFFA5E1BBFFBAEACCFFC5E0BEFFC5DAB4FFBDD7B0FFA6D7ACFF5FBD69FF7AAF - 68FFB7957400472F220000000000DBAB8400E5B9910081C277FF8CD8A2FFCDF5 - E8FFD4EDDAFFCEEDD3FFCFDFAFFFD6DEB5FFD4D4A2FFCED0A1FFC4D0AAFF87C9 - 91FF6EB066FFB9916D0000000000DCA77B008DBA72FF87D7A0FFC0F2DEFFC7F2 - D6FFD5EFD5FFD0E9CFFFD5DBA6FFDCDEABFFDBCD90FFD7C88BFFC9C18EFFBDD5 - AFFF7AC791FF6C9C58FF00000000BEAB770064C571FFC0F3E2FFB5EFB4FFB5F0 - ACFFC1EDB7FFD4E3B7FFD9D89CFFDAD395FFCDB56DFFC7B36DFFB5CB84FF94DF - 9AFFAFE7CDFF479B4DFF142E170088B972FF98DEB5FFB5EBCCFFB1EFA7FFC9EE - A9FFD1EAC9FFD5CF8DFFD9CB8BFFCDB466FFBCBC67FF9AD671FF82DE73FF7ADC - 71FF91D0A3FF88C8A4FF2C6831FF6FC06FFFB3ECD2FF9BE2A2FF9DEA8DFFD4ED - B7FFD0EAC7FFCFB96EFFCCB166FFCBC975FF76DB67FF66D94DFF65D74DFF6CD3 - 5DFF73BB7EFFA5DBC2FF337B38FF65C26FFFBEF0DCFF81D883FF77DB6DFFBFE5 - 9AFFCCDFA7FFCAA85DFFC2BD6CFFB8DA8BFFA6D860FF77D13FFF6AD046FF59BC - 50FF63AB6CFFB2E4CEFF337D37FF64C26DFFBEEFDDFF73D17DFF90D16CFFBCE0 - 9EFFC7A75EFFD3B05EFFC69953FFC6BC6EFFAFD17AFFB4C46DFFAFA95FFF7BA9 - 57FF5AA367FFB1E3CEFF2F7A33FF6ABC6BFFB0E9CFFF83D490FFBFDC8AFFC3CB - 82FFCCA256FFDAAF5CFFDCAF5BFFC99A4BFFBF8643FFB78443FFB99A52FF96A5 - 62FF65A676FFA2D8BDFF2B6F2DFF7DB069FF92D7AFFFA0DEB4FF84C670FFA8D0 - 80FFC5A55CFFD0A757FFE0AA56FFDAA651FFC7984AFFB98C47FFB69B57FF819F - 65FF79BF90FF81BE9CFF235B25FFAB9C6B0056B060FFB5EAD3FF69BC74FF6EBD - 71FFBEB66DFFC9A35BFFDFAB5BFFDDA858FFC1924EFF9DA958FF78B166FF5A96 - 67FFA6DCC0FF307A32FF112B1200C8926C0084C38AFF76C08DFF99D7B3FF79C0 - 80FFBCC27EFFC6A96AFFD7B169FFD6AD65FFBC9B5EFF60AD6AFF599768FF81C1 - 99FF67A97BFF387934FF00000000704B3600BD8F67005C9851FF70B786FFAEE8 - C7FFC0D2A0FFC5B381FFCAB47DFFCCAF78FFB9A778FF80CC95FFA0DABCFF66A8 - 7AFF317933FF68503600000000000000000000000000030804002C6630FF3988 - 3EFF9BC59DFFB3C29DFFBDC19CFFBEC39DFFB0D2B1FF7EC09AFF2F7B32FF2C73 - 2FFF040B0500000000000000000000000000000000000000000000000000112A - 1200255C27FF2C702EFF2D7530FF2D7530FF2A6E2DFF2D7330FF26642A000000 - 0000000000000000000000000000F803EA0060F03E0000000000000000001D02 - 00001F0000000000000040972500640020000000000000000000000000000300 - 0000C9010000E8AD4500C898390009000000E8EE43000C0000001847F3003E1E - 1B00D06C5F00DCDCAEFFECCDC0FFE9CBB3FFE5B6A3FFA367CE003421DE005601 - E4001806E5005501E5001906E6005401E6001A06E8005301E800624A7300DDC1 - C3FFF9E9DCFFF6E8DDFFF3E5DAFFF3E5DAFFF5E7DCFFF5E4D6FFDAB49BFFF741 - 39003B04F10054030F0087051000520310008905110086474800EEC9B1FFF7EA - DFFFEEDED0FFE3C1A7FFD8AE89FFD7AC86FFDDBB9CFFEBD6C7FFF3E6D9FFE4B6 - 9AFFAC405600FC02340094043600FB023600A11FB400E6B9AAFFF6E9DDFFECD8 - C6FFD7AC81FFDCBB9AFFF6ECE3FFF5ECE2FFE4C8AEFFD2A77BFFE6CEBAFFF1E2 - D5FFCBA19BFFFA18E6003904F4000002F4009065D100F4E3D4FFEFDCCDFFD5A8 - 7EFFD0A077FFFBF8F5FFFCF8F5FFFCF8F5FFFBF8F5FFD1A881FFCFA47BFFEAD5 - C3FFEAD4C2FFE8549D009304B700FE02B700DBA7A6FFF3E5D9FFDFBB9EFFCFA0 - 75FFCD9E72FFF5EBE3FFE4CBB4FFE7D3BFFFFBF8F6FFE5D3BFFFC4986BFFD6B4 - 91FFEEE0D2FFBB8872FF1906510056015100D9B297FFF2E5DAFFD1A67EFFCC9D - 71FFC79A6CFFC5986BFFE2CCB6FFF8F3EEFFF6EEE8FFD9BDA1FFC29468FFC59B - 71FFF0E2D6FFBE9068FF380000001049F300D5AE92FFF2E4D9FFD1A57AFFC599 - 6BFFC4976AFFC49669FFFAF6F2FFF3EAE1FFC2956DFFBE8F65FFBE8F64FFC095 - 6DFFEFE3D5FFC08D60FF4849F30009000000D6B17AFFEFE1D3FFD9B595FFC798 - 6CFFC39569FFC19367FFBF9066FFBF9066FFBB8B63FFB98A63FFB88A62FFCBA7 - 86FFEADCCCFFA9714DFF8A05120050031200AB514500E4CCB9FFEAD6C5FFC799 - 71FFBF9066FFBF9066FFF7F1ECFFF6F0EAFFB7895FFFB7895FFFB58963FFE2CE - BBFFD9BDA6FFA23E530027035900920159003D175D00BE8368FFEAD8C9FFE3CD - BAFFC0946BFFBA8C62FFCFB094FFCFB094FFB7895FFFB28761FFDAC0AAFFE4D1 - C0FFA0694FFF1712330090043200FE02320092043300E92E4100B98159FFE7D5 - C4FFE5D2BFFFC9A685FFB88E67FFB68A65FFC5A180FFE0CCBAFFE3D0BEFFAF6B - 45FF992790000003B8009004B9000202FE003604FF000002FF00612C1A00BA70 - 46FFD7BBA3FFE9DACAFFECE0D1FFECE0D1FFE8D8C8FFD3B59CFF9D614CFFE224 - B6003904F4000002F4003804F5000202F5003604F6005801E3001606E4006211 - CE00603B95009E6056FFA16844FFA36642FF925B50FF7A3490002D134A005401 - 4E001A0650005501500019065100560151001806520058015200160653004A02 - E600290000008888F500B001EA004C02E900D103EA004E02EA00CF03EB00C000 - 48001314150000040000380000001804EA001804EA00B0493D00B0493D00E083 - 2300E075B10000000000A4000000304A3D00E4493D0000000000000000000000 - 0000F8493D0000000000000000000800000001001E0089061C0090061E008A06 - 1E00FFFFFF000000000000000000000000000000000000000000000000000000 - 0000000000004F0F0000FFFFBF0089DFFF000009320066C472FF64C270FF62BF - 6EFF60BC6BFF5DB868FF5BB565FF57B062FF4E9E57FF3B7941FF234827000912 - 0A00000000000000000000000000000000000000000064C170FFA6DBB0FFA6DA - AFFFA3D9ADFFA2D8ABFF9FD7A8FF9CD5A5FF94D09DFF83C58CFF6CB474FF316A - 37FF0F2111000000000000000000000000000000000062BE6DFFA5DAAEFFA2D8 - ACFFA1D8AAFF9ED6A7FF9CD5A5FF99D4A2FF97D29FFF8CCD95FF91CF99FF73B8 - 7BFF2D6331FFA3591B00CCE3E800BFF5E900000F4F005FBA6AFF5CB667FF59B3 - 64FF56AE60FF53AA5DFF50A659FF4DA156FF68B170FF88C890FF8DCC95FF8BCB - 92FF5DA564FF193A1C0000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000027552CFF3A8142FF81C388FF7DC4 - 85FF6EB375FF265B2AFF000000004F0F0000C1EFBF00B567670074CDE8000005 - 25000000000028060000E9D078006766B500BFEFC10023564AFF64AB6BFF7FC4 - 86FF79BE81FF428444FFF4FFFF0076AFD90002113A0000000000060201006E79 - 3900F4DFBD00FFFFFF00CDECFF00346CA20000020F00234C24FF61A867FF7BC2 - 82FF76BC7CFF3A7E43FF346CA20000020F000200000052260C0085AC6AFF6BAF - 6FFFFBFFFF008EC2E500041B4F0000000000445224FF468D4BFF75BB7BFF70BD - 77FF63AB69FF1E5021FF9F430F0090DEE400501A37007DC283FF67B16FFF64AD - 6BFF43944BFF408F47FF3C8A43FF398540FF549D5AFF74BA7AFF79C17FFF77BF - 7DFF4A914FFF27606C000607110041210F006A9B61FF66B06EFF8ACA92FF89CA - 90FF86C88DFF83C68AFF80C587FF7EC384FF7BC281FF6DBB74FF76BE7CFF59A0 - 5DFF1B4C23FF25180800D592500054B3E800265235FF62AC6AFF85C88DFF85C7 - 8BFF82C688FF7FC486FF7CC282FF79C180FF71B978FF5FA865FF49914EFF1A4E - 35FF341F0900D3DF9700062A7D000000000000000000525F2AFF5AA462FF58A1 - 5EFF37833EFF347E3AFF317A36FF2E7533FF27682BFF1D4E20FF102E12003916 - 0400E7E59D004C74AF000E1E3200000004000000000000000000235328FF2D6B - 32FF0000000000000000000000005D170100A6E3C300000C41004F0F0000BFEF - BF00000F4F0047110100D7E4A40095648E00A4E6DD00011046004F1101007DBA - 8000000F4F004D0F0000FFFDBC00FFFFFF00FFFFFF00FFFFFF00FFFFFF00BEFE - FF00000F4F00030000006D3A13007804EA007804EA00F855EB00F855EB00E083 - 2300FE75B10000000000C00000007856EB002C56EB0000000000000000000000 - 00004056EB00000000000000000008000000F7E1D200F1C8ACFFEDC09FFFEBBE - 9DFFEBBC9AFFE9BA96FFE7B793FFE6B590FFE4B28CFFE2AF88FFE0AC84FFDDA9 - 80FFDCA57DFFBD8461FFBFEFBF00000F4F00DBB294FFFBF7F4FFFBF7F4FFFBF7 - F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7 - F4FFFBF7F4FFD19C71FF0000000000000000ECBF9EFFFBF7F4FF9CD5A5FF98D3 - A1FF94D09DFF90CE98FF8BCB93FF87C98EFF82C689FF7EC384FF7AC180FF76BE - 7CFFFBF7F4FFD49B6FFF0000000000000000EBBD9BFFFBF7F4FFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFBF7F4FFD1976AFFBFEFBF00000F4F00E9BA98FFFBF7F4FFE9C3A6FFE9C3 - A6FFE9C3A6FFE9C3A6FFE9C3A6FFE9C3A6FFE9C3A6FFE9C3A6FFE9C3A6FFE9C3 - A6FFFBF7F4FFCE9364FF0000000000000000E7B794FFFBF7F4FFE9C3A6FFFFFF - FFFFE8C4A9FFFFFFFFFFFFFFFFFFFFFFFFFFE8C7ACFFFFFFFFFFFFFFFFFFFFFF - FFFFF7F1EBFFCB8F5FFF0000000000000000E5B48FFFFAF6F2FFE9C6AAFFE9C6 - ACFFEAC7ACFFE9C7ADFFE9C9AEFFE9C9B0FFE8C7ACFFE9C9B0FFE8C8B0FFE8CC - B5FFF2E7DEFFC88A59FFBFEFBF00000F4F00E3B18CFFFAF6F1FFEAC9AEFFFFFF - FFFFEAC9B0FFFFFFFFFFFFFFFFFFFFFFFFFFE8C7ACFFFFFFFFFFFFFFFFFFFFFF - FFFFF1E5DBFFC68655FF52260C00DFBB8900E1AE87FFFAF4F0FFEACBB2FFEACC - B3FFEACCB3FFEACCB3FFEACCB3FFEACEB7FFE8C7ACFFE8C7ACFFE8C8B0FFE8C8 - AEFFF0E2D8FFC48654FF20070000BE8E5300DFAA82FFF9F3EFFFEACEB7FFFFFF - FFFFEBD0BBFFFFFFFFFFFFFFFFFFFFFFFFFFEACFBAFFFBF6F2FFFFFFFFFFFFFF - FFFFF0E2D8FFC88D5FFFBFEFBF00000F4F00DDA87EFFF9F3EFFFEBD0BAFFEBD0 - BBFFEBD0BBFFEBD0BBFFEBD0BBFFEBD1BDFFEACDB5FFEACDB5FFEACDB5FFEACD - B5FFF0E2D8FFC68A5CFFAED0AF0027467500D9A47AFFF9F3EEFFEBD2BEFFFFFF - FFFFEBD3BFFFFFFFFFFFFFFFFFFFFFFFFFFFEAC7ADFFFFFFFFFFFFFFFFFFFFFF - FFFFF0E2D8FFC68C5FFFD78833007BBEE900D7A175FFF8F2EDFFF7F0EAFFF6ED - E6FFF4EAE2FFF3E7DEFFF1E4DBFFF0E2D8FFF0E2D8FFF0E2D8FFF0E2D8FFF0E2 - D8FFF0E2D8FFC4895CFFBFEFBF00000F4F00B67C58FFD39C71FFD19668FFCE92 - 63FFCB8E5EFFC98A5BFFC78756FFC38452FFC38452FFC38452FFC38452FFC384 - 52FFC38452FF81522EFF000000000000000000000000000000005D170100A6E3 - C300000C41003C0B0000D4E29D00062A7E0000000000000000007E2A0600BFF5 - DA00000F4F00390A0000D3DF9700C803EA00C803EA00A81CC900A81CC900A3A9 - A600A2A8A600A2A8A500A2A8A5009EA4A200767A78002B2D2C00000000000000 - 0000000000000000000000000000472F2200D9B08EFFDCA77BFFDCA67AFFDAA4 - 7AFFD8A279FFD5A076FFD49E75FFD29D73FFCF9A72FFCE9970FFCB966FFFC994 - 6CFFBC9375FF472F220000000000DBAB84FFE8B992FFE8B992FFE8B992FFE8B9 - 92FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B9 - 92FFE8B992FFBF8F6EFF00000000DCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA7 - 7BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA7 - 7BFFDCA77BFFC08B66FF00000000DBA47AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFDCA77BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFBD8763FF00000000D9A379FFFFFFFFFFFFBF68FFBDBDBDFFB7B7 - B7FFFFFFFFFFDCA77BFFFFFFFFFFF7F3EDFFF6EFEAFFF5EBE7FFF3EAE4FFF2E7 - DEFFFFFFFFFFBA8560FF00000000D8A279FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFDCA77BFFFFFFFFFFFBF6F1FFF8F4EEFFF7F2EBFFF7F0EAFFF6EC - E8FFFFFFFFFFB7815EFF00000000D5A076FFFFFFFFFFFFBF68FFAFAFAFFFAAAA - AAFFFFFFFFFFDCA77BFFFFFFFFFFFBF8F4FFFBF7F3FFFBF5F2FFFAF3EFFFF8F2 - ECFFFFFFFFFFB57E5CFF00000000D49E75FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFDCA77BFFFFFFFFFFFBF9F7FFFBF9F5FFFBF8F4FFFBF7F2FFFBF5 - F2FFFFFFFFFFB27C5AFF00000000D19C73FFFFFFFFFFFF9E3AFF9F9F9FFF9999 - 99FFFFFFFFFFDCA77BFFFFFFFFFFFDFDF8FFFBFBF9FFFBFAF7FFFBFAF6FFFBF8 - F4FFFFFFFFFFB07A58FF00000000CC976FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFDCA77BFFFFFFFFFFFDFDFAFFFDFDFAFFFDFDFAFFFCFCF7FFFBFB - F6FFFFFFFFFFAC7554FF00000000CA946EFFFFFFFFFFFF8E2BFF959595FF8787 - 87FFFFFFFFFFDCA77BFFFFFFFFFFFEFEFCFFFEFEFCFFFEFEFAFFFEFEFAFFFCFC - F9FFFFFFFFFFAA7353FF00000000C8926CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFDCA77BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFA97251FF00000000704B36FFC38E68FFC08B66FFBE8864FFBB85 - 61FFB9835FFFB47E5CFFB27C5AFFB17B58FFAE7957FFAD7656FFAB7554FFA973 - 53FFA97151FF714D37FF000000000000000083888600EBEDEC00FEFFFE00FEFF - FF00FEFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EEEF - EF0080868400010101000000000000000000282A2900818583008B908E008B90 - 8E008B908E008A8F8D008A8F8D00898F8D00898E8C00898E8C00888E8C007E82 - 8000292A290000000000000000003804EA00E073F500E073F500E073F500383A - 3D00E7EBEF00E7EBEF00E7EBEF00C7CFD800383A3D00E7EBEF00E7EBEF00E7EB - EF00C7CFD800383A3D00E7EBEF00CDB7AD00DDB391FFDCA77BFFDCA67AFFDAA4 - 7AFFD8A279FFD5A076FFD49E75FFD29D73FFCF9A72FFCE9970FFCB966FFFC994 - 6CFFBE9678FFCDB7AD00E7EBEF00DDAD86FFE8B992FFE8B992FFE8B992FFE8B9 - 92FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B9 - 92FFE8B992FFC19170FFE7EBEF00DCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA7 - 7BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA7 - 7BFFDCA77BFFC08B66FFC7CFD800DBA47AFFF6F6F6FFF6F6F6FFF6F6F6FFF6F6 - F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6 - F6FFF6F6F6FFBD8763FF383A3D00D9A379FFF5F5F5FFF5F5F4FFF4F5F4FFF4F4 - F4FFF5F5F4FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3 - C3FFF4F4F5FFBA8560FFE7EBEF00D8A279FFF2F2F2FFD28358FFD28358FFD283 - 58FFF2F2F3FFC3C3C3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFF3F3F3FFB7815EFFE7EBEF00D5A076FFF1F1F0FFF1F0F1FFF0F1F1FFF1F0 - F1FFF1F1F1FFC3C3C3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFF1F1F1FFB57E5CFFE7EBEF00D49E75FFEFEEEEFFEFEFEFFFEFEEEEFFEFEE - EEFFEEEFEEFFEEEEEEFFEEEFEFFFEEEEEEFFEEEEEEFFEEEEEEFFEFEEEEFFEEEE - EEFFEEEEEFFFB27C5AFFC7CFD800D19C73FFECECECFFECECEBFFECECEBFFECEC - ECFFECEBECFFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FF8FAC9AFF5D9672FF4F8E - 66FF498960FF717951FF383A3D00CC976FFFE9E9E9FFD28358FFD28358FFD283 - 58FFE9E9E9FFC3C3C3FFFFFFFFFFFFFFFFFFA8C7B3FF61AB81FF95D4B4FFBAE6 - D0FF6ABB8FFF2D8F57FF76A58AFFCA946EFFE7E7E7FFE8E7E7FFE7E7E7FFE7E7 - E7FFE7E7E7FFC3C3C3FFFFFFFFFFFFFFFFFF4A8B62FF90D3B1FF92D6B1FFFFFF - FFFF65BC8CFF67BC8FFF1F6F3CFFC8926CFFE6E5E5FFE5E5E5FFE5E5E6FFE5E5 - E5FFE5E5E5FFE6E5E5FFE5E5E5FFE6E5E5FF317B4CFF9CD4B6FFFFFFFFFFFFFF - FFFFFFFFFFFF95D2B2FF196B37FFB3917FFFC38E68FFC08B66FFBE8864FFBB85 - 61FFB9835FFFB47E5CFFB27C5AFFB17B58FF206C3AFF62BA8BFF60BA87FFFFFF - FFFF60B987FF67BC8FFF1E6E3CFF383A3D00E7EBEF00E7EBEF00E7EBEF00C7CF - D800383A3D00E7EBEF00E7EBEF00E7EBEF006D9B84FF288C53FF64BA8DFF95D2 - B2FF64BA8DFF288C53FF27553AFFE7EBEF00E7EBEF00E7EBEF00C7CFD800383A - 3D00E7EBEF00E7EBEF00E7EBEF00C7CFD800383A3D0079A78DFF247240FF196B - 37FF22713FFF275439FFE7EBEF004011B400C631AC00A46B68FFBF8456FFC187 - 4CFFC2884DFFC48A4FFFC78E52FFC88D52FFC3894FFFA4723EFF6F4322FF0402 - 010000000000000000000000000000000000966638FFE5E0DAFFF5F1EBFFF8F4 - EDFFF8F3EDFFF8F3EDFFF8F3EDFFF8F2ECFFF7F2ECFFF2E6D7FFE2B27DFFD38F - 62FF05030200000000000000000000000000B57D45FFF8F4F0FFFAE0C7FFFBE1 - C9FFFBE2C9FFFBE0C8FFF9DFC5FFF8DBC1FFF4D6B8FFFFFBF8FFF6D8B4FFE1B0 - 7DFFD69063FF050302000000000000000000C3884DFFF9F5F1FFFCE3CDFFFBE3 - CEFFFBE3CDFFFBE2CBFFF9E0C8FFF8DCC2FFF5D6BAFFFDFBF8FFFCE6CDFFFAE5 - C9FFE2B684FF936642FF0000000000000000C3884CFFF9F5F1FFFCE3CFFFFBE4 - D0FFFCE4CFFFFCE3CDFFFAE1CAFFF9DDC4FFF6D9BCFFF4E9DFFFF7F2ECFFFBF7 - F3FFF5EFE9FFC07D45FF0000000000000000C08549FFF9F4F0FFFCE6D3FFFCE6 - D4FFFDE7D3FFFCE4D1FFFBE3CDFFFAE0C8FFF8DCC2FFF5D6BBFFF3D4B5FFF1D2 - B3FFF8F4F0FFBE7E44FF00000000A1A1A100C5894DFFF9F4EFFFFEE7D7FFFDE7 - D6FFFDE7D5FFFDE6D4FFFCE6D2FFFBE1CCFFFADFC7FFF8DCC2FFF6DABDFFF6D8 - BBFFFAF4EFFFC48348FF69696900C2C2C200C78B4EFFF9F4EDFFFEE8D8FFFEE8 - D8FFFEE8D7FFFEE7D6FFFDE5D3FFFCE4D1FFFBE1CCFFFAE0C7FFF9DDC3FFF8DC - C2FFFAF4EDFFC7854AFF6A6A6A00BDBDBD00C7874CFFF9F3ECFFFEE8D6FFFEE8 - D7FFFDE7D6FFFDE7D6FFFDE7D5FFFDE5D3FFFBE4D0FFFBE3CCFFFADFC7FFFADF - C6FFFAF2EAFFC78347FF6060600083838300C38247FFF8F2EBFFFEE7D6FFFDE7 - D6FFFDE7D6FFFDE7D6FFFDE6D5FFFDE5D3FFFCE4D1FFFCE2CDFFFBE1CBFFFBE1 - C9FFFBF7F2FFC17A3FFF4343430000000000BF7C40FFF8F1E8FFFEE5D5FFFDE5 - D3FFFDE5D3FFFCE5D3FFFCE5D3FFFCE4D1FFFCE2CEFFFCE2CCFFFBE0C9FFFBE1 - C8FFFDFAF7FFBB763BFF0001000000000000C17B41FFF7F0E6FF4BA56CFF4BA5 - 6CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA5 - 6CFFFCF9F5FFBB7137FF007C240000000000BD763CFFF7EDE3FF4BA56CFF62C0 - 88FF62C088FF62C088FF62C088FF62C088FF62C088FF62C088FF62C088FF4BA5 - 6CFFFBF7F4FFB56730FF0004010000000000B86D36FFF4EADEFF4BA56CFF4BA5 - 6CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA5 - 6CFFFBFAF6FFB05F2BFF0000000000000000A45B2CFFEBE5DEFFF5EADDFFF6EB - DEFFF6EADEFFF6EADCFFF6EADCFFFAF3EBFFFAF3EBFFFAF2EAFFFCF7F3FFFAF7 - F2FFEFEFEEFF995023FF00000000000000004E2C1600894A23FFAE5F2EFFB463 - 2EFFB4632EFFB5642FFFB66430FFB66430FFB4632EFFB3662EFFB3652EFFAD5E - 2BFF884921FF4726120000000000D803EA00D031AC00939746FFBB8F4EFFC187 - 50FFC28850FFC48850FFC78950FFC38850FFC18750FFAF7350FFAD4650FF0402 - 690004026C0043056B0090066C0000006C00976652FFEAE0E2FFF7F1ECFFF8F4 - EDFFF8F3EDFFF8F3EDFFF8F3EDFFF8F2ECFFF7F2ECFFF2E6D7FFE2B27DFFD58E - 66FF910983000000850003008600F0008500B57D50FFF8F3F1FFFAE0C7FFFBE1 - C9FFFBE2C9FFFBE0C8FFF9DFC5FFF8DBC1FFF4D6B8FFFFFBF8FFF6D8B4FFE1B0 - 7DFFD38D65FF4808850090068900F3008900C8844EFFF9F5F1FFFCE3CDFFFBE3 - CEFFFBE3CDFFFBE2CBFFF9E0C8FFF8DCC2FFF5D6BAFFFDFBF8FFFCE6CDFFFAE5 - C9FFE2B684FF9E515CFF90068E0061068E00C5854AFFF9F5F1FFFCE3CFFFFBE4 - D0FFFCE4CFFFFCE3CDFFFAE1CAFFF9DDC4FFF6D9BCFFF4E9DFFFF7F2ECFFFBF7 - F3FFF5EFE9FFC17C45FF90064600F3004600C8854BFFF9F4F0FFFCE6D3FFFCE6 - D4FFFDE7D3FFFCE4D1FFFBE3CDFFFAE0C8FFF8DCC2FFF5D6BBFFF3D4B5FFF1D2 - B3FFF8F4F0FFC17E46FF90064B00F3004B00C8844AFFF9F4EFFFFEE7D7FFFDE7 - D6FFFDE7D5FFFDE6D4FFFCE6D2FFFBE1CCFFFADFC7FFF8DCC2FFF6DABDFFF6D8 - BBFFFAF4EFFFC37F4AFF9006BF000000BF00C0844DFFF9F4EDFFFEE8D8FFFEE8 - D8FFFEE8D7FFFEE7D6FFFDE5D3FFFCE4D1FFFBE1CCFFFAE0C7FFF9DDC3FFF8DC - C2FFFAF4EDFFC77E49FFF800C2005C06C100C5804BFFF9F3ECFFFEE8D6FFFEE8 - D7FFFDE7D6FFFDE7D6FFFDE7D5FFFDE5D3FFFBE4D0FFFBE3CCFFFADFC7FFFADF - C6FFFAF2EAFFC07C46FF0500C200EE00C100C77E49FFF8F2EBFFFEE7D6FFFDE7 - D6FFFDE7D6FFFDE7D6FFFDE6D5FFFDE5D3FFFCE4D1FFFCE2CDFFFBE1CBFFFBE1 - C9FFFBF7F2FFBF793EFF07131E0007121D00BF7D41FFF8F1E8FFFEE5D5FFFDE5 - D3FFFDE5D3FFFCE5D3FFFCE5D3FFFCE4D1FFFCE2CEFFFCE2CCFFFBE0C9FFFBE1 - C8FFFDFAF7FFBB733AFF07121D0006121D00BE793FFFF7F0E6FFF8B455FFF7B4 - 56FFF7B554FFF8B453FFF8B253FFF7B352FFF7B352FFF7B251FFF7B24FFFF7B2 - 4FFFFCF9F5FFB96D35FF06121D0006121D00BB753BFFF7EDE3FFFDC26EFFFFD8 - A0FFFFD79EFFFFD69BFFFFD798FFFFD696FFFFD695FFFFD594FFFFD493FFFBBE - 65FFFBF7F4FFB56530FF06111D0005111C00B86E37FFF4EADEFFFDBF68FFFCBD - 67FFFBBE65FFFCBE64FFFCBE64FFFCBD62FFFBBD63FFFBBC61FFFCBE60FFFCBC - 62FFFBF9F6FFB0602CFF05111C0005111C00A55D30FFEBE6DFFFF5EADDFFF6EB - DEFFF6EADEFFF6EADCFFF6EADCFFFAF3EBFFFAF3EBFFFAF2EAFFFCF7F3FFFAF6 - F2FFEFF0F0FF9A5328FF04101C0004101C00503526008A4E2AFFAE6030FFB464 - 2FFFB4642FFFB4642FFFB4632FFFB4632FFFB3632EFFB3632EFFB3622EFFAD5F - 2DFF894D28FF4930230004101C00D803EA00D031AC00C67971FFC88858FFC78D - 52FFC78D52FFC78D52FFC78E52FFC88D52FFC58B51FFAB7A45FF6F4322FF0402 - 010000000000000000000000000000000000B98A5CFFF7F2ECFFF8F4EEFFF8F4 - EDFFF8F3EDFFF8F3EDFFF8F3EDFFF8F2ECFFF7F2ECFFF2E6D7FFE2B27DFFD28E - 61FF05030200000000000000000000000000C28B53FFFAF6F2FFFAE0C7FFFBE1 - C9FFFBE2C9FFFBE0C8FFF9DFC5FFF8DBC1FFF4D6B8FFFFFBF8FFF6D8B4FFE1B0 - 7DFFD38D60FF050302000000000000000000C58A4FFFF9F5F1FF4BA56CFF4BA5 - 6CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA5 - 6CFFE2B684FF7C4F2BFF0000000000000000C58A4EFFF9F5F1FF4BA56CFF62C0 - 88FF62C088FF62C088FF62C088FF62C088FF62C088FF62C088FF62C088FF4BA5 - 6CFFF5EFE9FFBF7C44FF0000000000000000C58A4EFFF9F4F0FF4BA56CFF4BA5 - 6CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA5 - 6CFFF8F4F0FFBE7E44FF0000000000000000C5894DFFF9F4EFFFFEE7D7FFFDE7 - D6FFFDE7D5FFFDE6D4FFFCE6D2FFFBE1CCFFFADFC7FFF8DCC2FFF6DABDFFF6D8 - BBFFFAF4EFFFC07F44FF0000000000000000C5894CFFF9F4EDFF4BA56CFF4BA5 - 6CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA5 - 6CFFFAF4EDFFC07E43FF0000000000000000C5854AFFF9F3ECFF4BA56CFF62C0 - 88FF62C088FF62C088FF62C088FF62C088FF62C088FF62C088FF62C088FF4BA5 - 6CFFFAF2EAFFC07C40FF0000000000000000C48348FFF8F2EBFF4BA56CFF4BA5 - 6CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA5 - 6CFFFBF7F2FFBF783DFF0000000000000000C48145FFF8F1E8FFFEE5D5FFFDE5 - D3FFFDE5D3FFFCE5D3FFFCE5D3FFFCE4D1FFFCE2CEFFFCE2CCFFFBE0C9FFFBE1 - C8FFFDFAF7FFBB7239FF0000000000000000C37D43FFF7F0E6FF4BA56CFF4BA5 - 6CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA5 - 6CFFFCF9F5FFB96C34FF0000000000000000C0793FFFF7EDE3FF4BA56CFF62C0 - 88FF62C088FF62C088FF62C088FF62C088FF62C088FF62C088FF62C088FF4BA5 - 6CFFFBF7F4FFB5642FFF0000000000000000BE733CFFF5EBDFFF4BA56CFF4BA5 - 6CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA56CFF4BA5 - 6CFFFCFAF7FFB05F2BFF0000000000000000B56D3DFFF7F1EAFFF7ECDFFFF6EB - DEFFF6EADEFFF6EADCFFF6EADCFFFAF3EBFFFAF3EBFFFAF2EAFFFCF7F3FFFCF8 - F4FFF7F7F6FF995023FF000000000000000065442E00AB6D45FFB86938FFB868 - 32FFB86832FFB86732FFB86632FFB86632FFB76631FFB76631FFB76531FFB566 - 33FF93542CFF47261200000000002804EA00B2452A00B5837AFFC6854CFFC88C - 4FFFC88C50FFC88C50FFC88D50FFC98C50FFC78B50FFC1874AFF9F6031FF0804 - 020000000000000000000000000000000000C2864EFFF7F2ECFFF8F4EEFFF8F4 - EDFFF8F3EDFFF8F3EDFFF8F3EDFFF8F2ECFFF7F2ECFFF2E6D7FFE2B27DFFDA94 - 65FF0A060400000000000000000000000000C5884CFFFAF6F2FFFAE0C7FFFBE1 - C9FFFBE2C9FFFBE0C8FFF9DFC5FFF8DBC1FFF4D6B8FFFFFBF8FFF6D8B4FFE1B0 - 7DFFDA9263FF0A0604000000000000000000C6894CFFF9F5F1FFF8B455FFF7B4 - 56FFF7B554FFF8B453FFF8B253FFF7B352FFF7B352FFF7B251FFF7B24FFFF7B2 - 4FFFE2B684FFA76B3AFF0000000000000000C6894BFFF9F5F1FFFDC26EFFFFD8 - A0FFFFD79EFFFFD69BFFFFD798FFFFD696FFFFD695FFFFD594FFFFD493FFFBBE - 65FFF5EFE9FFC27E45FF0000000000000000C6894BFFF9F4F0FFFDBF68FFFCBD - 67FFFBBE65FFFCBE64FFFCBE64FFFCBD62FFFBBD63FFFBBC61FFFCBE60FFFCBC - 62FFF8F4F0FFC48246FF0000000000000000C6884AFFF9F4EFFFFEE7D7FFFDE7 - D6FFFDE7D5FFFDE6D4FFFCE6D2FFFBE1CCFFFADFC7FFF8DCC2FFF6DABDFFF6D8 - BBFFFAF4EFFFC68346FF0000000000000000C68849FFF9F4EDFFF8B455FFF7B4 - 56FFF7B554FFF8B453FFF8B253FFF7B352FFF7B352FFF7B251FFF7B24FFFF7B2 - 4FFFFAF4EDFFC68245FF0000000000000000C68447FFF9F3ECFFFDC26EFFFFD8 - A0FFFFD79EFFFFD69BFFFFD798FFFFD696FFFFD695FFFFD594FFFFD493FFFBBE - 65FFFAF2EAFFC68042FF0000000000000000C58245FFF8F2EBFFFDBF68FFFCBD - 67FFFBBE65FFFCBE64FFFCBE64FFFCBD62FFFBBD63FFFBBC61FFFCBE60FFFCBC - 62FFFBF7F2FFC57C3FFF0000000000000000C58042FFF8F1E8FFFEE5D5FFFDE5 - D3FFFDE5D3FFFCE5D3FFFCE5D3FFFCE4D1FFFCE2CEFFFCE2CCFFFBE0C9FFFBE1 - C8FFFDFAF7FFC1763BFF0000000000000000C47C40FFF7F0E6FFF8B455FFF7B4 - 56FFF7B554FFF8B453FFF8B253FFF7B352FFF7B352FFF7B251FFF7B24FFFF7B2 - 4FFFFCF9F5FFBF6F36FF0000000000000000C1783CFFF7EDE3FFFDC26EFFFFD8 - A0FFFFD79EFFFFD69BFFFFD798FFFFD696FFFFD695FFFFD594FFFFD493FFFBBE - 65FFFBF7F4FFBB6730FF0000000000000000BF7238FFF5EBDFFFFDBF68FFFCBD - 67FFFBBE65FFFCBE64FFFCBE64FFFCBD62FFFBBD63FFFBBC61FFFCBE60FFFCBC - 62FFFDFBF8FFB8632DFF0000000000000000BB6934FFF8F1EAFFF7ECDFFFF6EB - DEFFF6EADEFFF6EADCFFF6EADCFFFAF3EBFFFAF3EBFFFAF2EAFFFCF7F3FFFCF8 - F4FFFEFEFCFFB25D29FF000000000000000089533100B66735FFBB6632FFBA66 - 30FFBA6630FFBA6630FFBA6530FFBA6530FFB9652FFFB9652FFFB9642FFFB864 - 2EFFAE5F2CFF723D1D0000000000D803EA00D031AC00C86D74FFC88559FFC98C - 4DFFC28955FFC2884DFFC6894DFFC58954FFC98854FFA4723EFF6F4322FF0402 - 0100101DE200000000000000000008000000966638FFE5E0DAFFF5F1EBFFF8F4 - EDFFF8F3EDFFF8F3EDFFF8F3EDFFF8F2ECFFF7F2ECFFF2E6D7FFE2B27DFFD28E - 61FF050302000A0100007E4F2500E7CBA800CA925AFFFAF6F2FFFAE0C7FFFBE1 - C9FFFBE2C9FFFBE0C8FFF9DFC5FFF8DBC1FFF4D6B8FFFFFBF8FFF6D8B4FFE1B0 - 7DFFD38D60FF050302000000000000000000BF8449FFF9F5F1FFFCE3CDFFFBE3 - CEFFFBE3CDFFFBE2CBFFF9E0C8FFF8DCC2FFF5D6BAFFFDFBF8FFFCE6CDFFFAE5 - C9FFE2B684FF7F5537FF1F0D0600C57F4300C48C50FFF9F5F1FFFCE3CFFFFBE4 - D0FFFCE4CFFFFCE3CDFFFAE1CAFFF9DDC4FFF6D9BCFFF4E9DFFFF7F2ECFFFBF7 - F3FFF5EFE9FFBF7C44FF0000000000000000C08549FFF9F4F0FFFCE6D3FFFCE6 - D4FFFDE7D3FFFCE4D1FFFBE3CDFFFAE0C8FFF8DCC2FFF5D6BBFFF3D4B5FFF1D2 - B3FFF8F4F0FFC4854AFF000F4B0025050000C78B4CFFF9F4EFFFFEE7D7FFFDE7 - D6FFFDE7D5FFFDE6D4FFFCE6D2FFFBE1CCFFFADFC7FFF8DCC2FFF6DABDFFF6D8 - BBFFFAF4EFFFC18148FF9D663300F9E5C800C88C4FFFF9F4EDFFFEE8D8FFFEE8 - D8FFFEE8D7FFFEE7D6FFFDE5D3FFFCE4D1FFFBE1CCFF46A872FF319F65FFF8DC - C2FFFAF4EDFFC68548FF021B630000000000C08045FFF9F3ECFFFEE8D6FFFEE8 - D7FFFDE7D6FFFDE7D6FFFDE7D5FFFDE5D3FFFBE4D0FF41A46BFF5AB381FF2898 - 57FFFAF2EAFFC17C40FFC67A3C0078D1EE00BF7E44FFF8F2EBFFFEE7D6FFFDE7 - D6FFFDE7D6FF3DA56FFF3AA46FFF36A269FF329E63FF55AF7CFF91CBAAFF4FAB - 74FF1B9148FFBE783DFF52110000BDEEC000BF7C42FFF8F1E8FFFEE5D5FFFDE5 - D3FFFDE5D3FF37A36BFF96CEB0FF94CDADFF91CBAAFF90CBA8FF74BC90FF8AC7 - A1FF46A568FF0A8735FF0001000000000000BE783EFFF7F0E6FFF8B455FFF7B4 - 56FFF7B554FF319F63FF94CDADFF6FBA8EFF6BB889FF66B685FF61B380FF67B5 - 82FF83C298FF3CA05CFF027C24FFBFEFBF00BB743CFFF7EDE3FFFDC26EFFFFD8 - A0FFFFD79EFF299B5BFF90CAA9FF8DC8A5FF8AC6A1FF88C59EFF6AB685FF82C2 - 97FF48A566FF1D7A23FF0004010000000000BC6E36FFF5EBDFFFFDBF68FFFCBD - 67FFFBBE65FF239751FF1D9149FF178F43FF118B3BFF3A9F5EFF80C196FF46A3 - 62FF2E9446FFAC612EFF0000000000000000AE5D2CFFF5F1E8FFF5EADEFFF6EB - DEFFF6EADEFFF6EADCFFF6EADCFFFAF3EBFFFAF3EBFF158C3AFF43A15FFF3294 - 4AFFECEEEAFFBC6832FF72CAEE0000052500512C1600BD672CFFB86E3FFFB464 - 30FFB6642EFFBB6932FFB56534FFB4622EFFB5622DFF0F7C23FF037B1EFFAB5E - 2BFF884921FF772F1200BFEFBF00DF31AC00B38C7AFFBB834AFFC88C4FFFC88C - 50FFC88D50FFC98C50FFC78B50FFC48A4DFFB57747FF312F2C00000000000000 - 0000000000000000000000000000B97E45FFF7F2EBFFF8F4EEFFF8F3EDFFF8F3 - EDFFF8F3EDFFF8F2ECFFF7F2ECFFF2E6D7FFE2B27DFFDB9465FF54524F000000 - 0000000000000000000000000000C4874BFFFAF6F2FFFAE0C7FFFBE2C9FFFBE0 - C8FFF9DFC5FFF8DBC1FFF4D6B8FFFFFBF8FFF6D8B4FFE1B07DFFDB9264FF5150 - 4D00000000000000000000000000C6894CFFF9F5F1FFFCE3CDFFFBE3CDFFFBE2 - CBFFF9E0C8FFF8DCC2FFF5D6BAFFFDFBF8FFFCE6CDFFFAE5C9FFE2B684FFBB7F - 4EFF272827000000000000000000C6894BFFF9F5F1FFFCE3CFFFFCE4CFFFFCE3 - CDFFFAE1CAFFF9DDC4FFF6D9BCFFF4E9DFFFF7F2ECFFFBF7F3FFF5EFE9FFC27E - 45FF6E7371000000000000000000C6894BFFF9F4F0FFFCE6D3FFFDE7D3FFFCE4 - D1FFFBE3CDFFFAE0C8FFF8DCC2FFF5D6BBFFF3D4B5FFF1D2B3FFF8F4F0FFC482 - 46FF959B99000202020000000000C6884AFFF9F4EFFFFEE7D7FFFDE7D5FFFDE6 - D4FFFCE6D2FFD4976EFFD49E7BFFD09871FFD6A482FFCD8E68FFCD9069FFD09A - 75FFD19973FFC88B62FF42220D00C68849FFF9F4EDFFFEE8D8FFFEE8D7FFFEE7 - D6FFFDE5D3FFCC8D65FFF3CDB0FFFFFFFFFFE3C7B3FFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFEABFA1FFC98960FFC68447FFF9F3ECFFFEE8D6FFFDE7D6FFFDE7 - D6FFFDE7D5FFC7865BFFEFC09EFFFFFFFFFFCC936EFFFFFFFFFFFFFFFFFFFFFB - F7FFFFF8F1FFE4AF8CFFC78A61FFC58245FFF8F2EBFFFEE7D6FFFDE7D6FFFDE7 - D6FFFDE6D5FFC8885DFFEFBFA1FFFDFCFAFFFEFCFBFFFEFDFDFFFEFDFCFFFDFB - FAFFFDFCFBFFDDA885FFC17F53FFC47C40FFF7F0E6FFF8B455FFF7B554FFF8B4 - 53FFF8B253FFCA8D65FFEAB899FFDDA57EFFDDA680FFDBA37CFFD9A07AFFD9A0 - 79FFD89F78FFD89E78FFBF845DFFC1783CFFF7EDE3FFFDC26EFFFFD79EFFFFD6 - 9BFFFFD798FFC98B61FFE6B592FFE2A781FFE1A781FFDEA37DFFDCA17BFFDB9F - 79FFD99E77FFD49A73FFBB7E57FFBF7138FFF5EBDFFFFDBF68FFFBBE65FFFCBE - 64FFFCBE64FFC48154FFEAB697FFF3F3EAFFEDF1E6FFEFF1E6FFEFF0E6FFEDF1 - E5FFF3F5EDFFD59C79FFB07044FFB96732FFF7F1EAFFF7ECDFFFF6EADEFFF6EA - DCFFF6EADCFFC37F51FFEFB69AFFEAF3E8FF51BF84FF6FC998FF71C999FF54BF - 84FFE4F4E9FFDD9C7BFFAA693AFF7B462300B66735FFBB6732FFBA6630FFBA66 - 30FFBA6530FFC68355FFEFCEBAFFDDFFFFFF87EEC7FFA2F4D7FFA2F6D7FF8CEE - C7FFE0FFFFFFDDA285FFAB6A3EFF00000000282A2900818583008B908E008B90 - 8E008B908E00B86A37FFC38458FFD38B68FFE18F70FFDC8D6CFFDA8B6DFFD78A - 6EFFCD8B6CFFAB6D44FFA65F2EFFFFFFFF00685A4000685A4000685A4000685A - 4000685A4000685A400067593F0061543A005D51380250452E7C4D432CAC4D42 - 2BAF50452D7152472F04FFFFFF00FFFFFF00685A4000685A4000685A4000685A - 4000685A4000685A4000685A400063563C0062563C905F523986554A3109584C - 330361543BA863563C67FFFFFF00FFFFFF00695C4100695C4100695C4100695C - 4100695C4100695B415F695C41316A5C42456A5C42B2675940005A4F35006658 - 3E006B5C425C6A5C4292FFFFFF00FFFFFF006F6146006F6146006F6146006F61 - 46006F61460B6E6046C66E6046186E6046B66D60451F7063480074654C006F61 - 46006E6046806E604676FFFFFF00FFFFFF0073654B0073654B0073654B007365 - 4B0073654B7F73654B5873654B6973654B8873654B0075674D0575674E0A7466 - 4B1073654BB973654B29FFFFFF00FFFFFF00786A5000786A5000786A5000796A - 502078694FC4786A4F10786A50B678694F07786A4F00786A4F7978694F4D786A - 4F7E77694F7177694F00FFFFFF00FFFFFF007D6F54007D6F54007E6F54007D6F - 549B7D6E543E7D6F54917D6E53607D6E53007D6F54197D6E54C27D6E542A7D6F - 54B17D6E54007D6E5400FFFFFF00FFFFFF0082745900827459008274593E8173 - 59B18274591F817359B48172580082745900827459978173593F817359A98173 - 58468173580081735800FFFFFF00FFFFFF00897A6000897A6000887A5FAC8879 - 5F25887A5FA088795F3B897A5F00897A5F3E887A5FAE897A5F42887A5F9D8779 - 5E0087795E0087795E00FFFFFF00FFFFFF00918369009183695B908268939182 - 6817918268B39183690092836900918268B39182682C918268C49082681D9082 - 68009082680090826800FFFFFF00FFFFFF009A8C721D9A8B71B9998A701A9A8B - 712B9A8B72B69E8F76009C8C7383998A717F9A8B7264998A7073998A7000998A - 7000998A7000998A7000FFFFFF00FFFFFF00A3947B6AA3947B8FA3947B009E8F - 7600A2937A79A3947CB2A2937A85A2937B20A3947CC5A2937B03A2937B00A293 - 7B00A2937B00A2937B00FFFFFF00FFFFFF00AD9E8695AD9E8676AC9E8600A697 - 7F00A2927A00A6977E0AAA9C8400AD9F879DAC9D864FAC9D8600AC9D8600AC9D - 8600AC9D8600AC9D8600FFFFFF00FFFFFF00B7A99366B7A9939CB9AB9500C6B9 - A500BFB29D00BAAD9700B8AA9454B7A993ADB6A89100B6A89100B6A89100B6A8 - 9100B6A89100B6A89100FFFFFF00FFFFFF00C1B49F0BC2B5A1A3C6B9A576CBBE - AB05CDC0AD01C8BBA74DC3B6A1BDC1B39F17C0B39E00C0B39E00C0B39E00C0B3 - 9E00C0B39E00C0B39E00FFFFFF00FFFFFF00C6B9A500C8BBA809CDC0AE86CFC2 - B0ABCFC2B0A7CEC1AF9CC9BCA91EC5B8A500C5B9A500C5B9A500C5B9A500C5B9 - A500C5B9A500C5B9A500FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A9CAB7FF86BE9CFF65AB - 89FF69AE93FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00353568FF192050FF249850FF21A857FF09A8 - 5FFF0AAF70FF78C4AAFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF002C2C63FF161F50FF229E52FF23A454FF0CA7 - 5EFF0DB674FF4FBD90FFA8D3BEFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF003B3B70FF263161FF23985BFF219C59FF0FA7 - 61FF11B677FF0DB170FF1C9657FFFFFFFF00A3A4A2FF6C6E6BFF717371FF6F71 - 70FF707271FF707271FFBABBB9FF444478FF313C6AFF21A15FFF1AA35AFF0CAF - 62FF0DB773FF1DBC7CFF1D9C58FFFFFFFF00646462FFC1C2C1FFB2B2B1FFB2B3 - B2FFB2B3B2FFB0B1AFFFBABBB9FF575787FF4C527FFF6CBB91FF6DAC86FF7BAF - 89FF55A776FF1B9C58FF199C61FFFFFFFF00727272FFAAABAEFF7B7B7AFF8282 - 82FF828281FF828281FFBABBB9FF61618FFF5D5F8DFFBABBB9FFC1C2C1FFC1C2 - C1FF99C5A6FF2D9E56FF27A76CFFFFFFFF006D6E6CFFB4B4B8FF939393FF8585 - 85FF878989FF86888AFFBABBB9FF7878A0FF7777A0FFBABBB9FF565857FF575A - 58FFFBFDFC00669C79FF509C77FFFFFFFF00757775FFA3A3A1FF9D9D9CFF8786 - 86FF8B8A87FF928D86FFBABBB9FF8383A8FF8383A8FFBABBB9FF9E9892FF9D98 - 90FFBABBB9FFDEEAE2FFCDDFD4FFFFFFFF008B8B89FF8C8C8BFF989998FF7E80 - 7FFF6A7B90FF436999FF41689BFF416799FF416799FF416799FF406798FF3F66 - 99FF416798FF4A6C98FF385D8CFFFFFFFF00999999FF7D7E7DFFB6B5B2FF6E76 - 80FF728DAFFFACC7E5FFA0BBDCFFA2BEDEFFA2BEDEFFA2BEDEFFA2BEDEFFA2BE - DEFFA3BEDEFFA4BEDCFFA6C1E1FFFFFFFF00A9A9A8FF747676FFA2A09CFF5D69 - 7AFF7694BBFFB4CDE7FF8DB0D6FF94B6DAFF94B6DAFF94B6DAFF94B6DAFF94B6 - DAFF94B6DAFF94B6DAFF94B5DAFFFFFFFF00C5C5C5FF696B69FFB9B6B2FF6875 - 85FF7493BBFFA7C4E1FF7EA6D1FF86ACD5FF86ACD5FF86ACD5FF86ACD5FF86AC - D5FF86ACD5FF86ACD5FF86ACD5FFFFFFFF00FFFFFF00656665FF909294FF6173 - 86FFA5BCD7FF9EBCDDFF83AAD3FF89ADD5FF89ADD6FF89ADD5FF89ADD6FF89AE - D6FF89AED5FF89ADD6FF89ADD6FFFFFFFF00FFFFFF006A6A67FF898E92FF7387 - 9EFFAEC6DEFF8EB1D7FF83AAD3FF85ABD4FF85A9D4FF85ABD3FF84AAD4FF85AA - D4FF85ABD4FF84ABD4FF85AAD5FF000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000C1C0C2FF927777FF927777FF9277 - 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277 - 77FF927777FF927777FF927777FF00000000927777FFAEFFFFFFAEFFFFFFAEFF - FFFFAEFFFFFFAEFFFFFFAEFFFFFFAEFFFFFFAEFFFFFFAEFFFFFFAEFFFFFFAEFF - FFFFAEFFFFFFAEFFFFFFAEFFFFFF00000000927777FFAEFFFFFFB5AA95FFB4AC - 98FFB4AF9AFFB0967CFFAC7D5EFFAB7C5DFFAA7C5CFFA77858FFA47554FFA472 - 50FFA4704CFF92B8A6FFAEFFFFFF00000000927777FFAEFFFFFFCBD5CBFFCCDC - D2FFCDE2DAFFC2B9A9FFB89078FFB89179FFB8927AFFB69077FFB48E74FFA885 - 6DFF9C7C66FF8EBEB2FFAEFFFFFF00000000927777FFAEFFFFFFCABEAFFFC9C0 - B0FFC8C1B2FFCCB8A7FFCFAF9CFFCEAF9CFFCEAF9CFFB69C8CFF9F8A7DFF8A7A - 70FF746A63FF7AB4B1FFAEFFFFFF00000000927777FFAEFFFFFFB69E92FFB69E - 91FFB69E90FFB39C8EFFB09A8DFFAA9488FFA48F82FF85786FFF66605CFF6C64 - 5EFF716761FF78B3B0FFAEFFFFFF00000000927777FFAEFFFFFF6A4B39FF6848 - 36FF654634FF61402EFF5D3B27FF5C3A26FF5A3926FF563929FF52392CFF5038 - 2AFF4E3628FF679A94FFAEFFFFFF00000000927777FFAEFFFFFF87614FFF8660 - 4EFF85604DFF86604EFF86614EFF86624EFF87624EFF85604CFF835E4BFF7F5E - 4DFF7B5E4FFF7EAEA7FFAEFFFFFF00000000927777FFAEFFFFFFAEFFFFFFAEFF - FFFFAEFFFFFFAEFFFFFFAEFFFFFFAEFFFFFFAEFFFFFFAEFFFFFFAEFFFFFFAEFF - FFFFAEFFFFFFAEFFFFFFAEFFFFFF00000000927777FFAEFFFFFF5C5C5CFF5C5C - 5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFFAEFF - FFFF5C5C5CFF5C5C5CFF5C5C5CFF00000000927777FFAEFFFFFFAEFFFFFFAEFF - FFFFAEFFFFFFAEFFFFFFAEFFFFFFAEFFFFFFAEFFFFFFAEFFFFFFAEFFFFFFAEFF - FFFFAEFFFFFFAEFFFFFFAEFFFFFF00000000927777FFAEFFFFFF5C5C5CFF5C5C - 5CFF5C5C5CFF5C5C5CFFAEFFFFFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C - 5CFF5C5C5CFF5C5C5CFF5C5C5CFF00000000927777FFAEFFFFFFAEFFFFFFAEFF - FFFFAEFFFFFFAEFFFFFFAEFFFFFFAEFFFFFFAEFFFFFFAEFFFFFFAEFFFFFFAEFF - FFFFAEFFFFFFAEFFFFFFAEFFFFFFF7F4EFFFF7F4EEFFF7F4EEFFF7F4EEFFF7F4 - EFFFF7F4EEFFF7F4EEFFF7F4EEFFF7F4EEFFF7F4EEFFF7F4EEFFF7F4EFFFF7F4 - EFFFF7F4EEFFF7F4EEFFF6F3EEFFF7F4EEFFF6F3EEFFF7F4EFFFF5EEDCFFF5ED - D9FFF4E6C2FFF6F1E8FFF5EFDFFFF6F0E3FFF6F1E6FFF4E8C5FFF5EFDEFFF4EA - D1FFF6F4F0FFF6F3EEFFF6F3EEFFF7F4EEFFF6F3EFFFF7F5F3FFEFCF75FFF1DA - 97FFE9B52BFFF0D382FFEBBE47FFEECB6BFFEECA68FFEBBE46FFF0D381FFEFCF - 76FFF6F3ECFFF6F3EFFFF6F3EEFFF7F4EEFFF6F2E8FFEBBC3DFFF4E9C9FFF1DB - 9BFFF4E8C7FFF4E7C5FFF3E6C1FFF4E9CCFFF4E5BEFFF5EBD0FFF1DB9DFFF5EB - D2FFEBBB3AFFF5EDDAFFF6F3EEFFF7F5F3FFEECC6FFFE8AF0EFFF2DDA2FFE6A9 - 00FFF2DB9CFFE9B522FFEBC046FFEECC6BFFE8AF0BFFF1DDA1FFE6A800FFF0D8 - 92FFE9B521FFECC24EFFF6F4F3FFF7F3EAFFF3E4BAFFF3E1B0FFF3E4BAFFEFD1 - 7BFFF3E7C5FFEECA65FFF0D48AFFF2DCA0FFEDC861FFF3E7C1FFEFD179FFF3E0 - ADFFF3E3B9FFF3E3B6FFF5F0E3FFF3E4B8FFE7AC03FFEECD6CFFEEC968FFEBBF - 46FFF3E5BDFFECC454FFEFD282FFF0DA9AFFECC354FFF3E5BAFFEBC149FFECC4 - 56FFF0D584FFE7AC04FFF1D997FFF1D891FFE9B41FFFF0D687FFEABD3EFFE8B3 - 20FFF3E3B5FFE8B31FFFEDC65AFFEFD17BFFE8B31FFFF3E0ADFFE9B623FFEAB8 - 29FFF2DC9FFFE8B41FFFEECD71FFF5EACDFFF2DFA9FFF5EACEFFF3E2B4FFF2DF - AAFFF6EEDCFFF2DFAAFFF3E5BEFFF4E8C9FFF2DFA9FFF5EDD9FFF3E0ADFFF3E0 - ADFFF4ECD6FFF2DFAAFFF3E5C1FFF1DA96FFE6AB00FFEECD6BFFEAB934FFE6A8 - 01FFF2DEA4FFE6A901FFEBBE45FFEDCB69FFE6A801FFF2DDA1FFE7AD04FFE8AF - 0DFFF0D891FFE6AA00FFEDCD72FFF5EACDFFECC250FFF1DCA2FFF3E2B6FFF2DE - A5FFF5EED9FFF2E1B0FFF4E6C1FFF4E9CCFFF3E1AFFFF5EEDAFFF2DFA7FFF2DD - A5FFF3E2B5FFECC558FFF2E1B4FFF7F5F4FFF0D58BFFEDC555FFF0D78CFFE7AD - 08FFF2DEA7FFE8B317FFEBC149FFEECD6DFFE7AD05FFF2DEA5FFE7AE08FFEDCB - 67FFEECD73FFEFCF77FFF6F4F2FFF7F4F0FFF2E0ACFFE7AB02FFF2E0AEFFE8B1 - 1AFFF1DA97FFEDC75EFFEECD73FFF0D68FFFECC148FFF2E0ADFFE8B019FFF1DE - A5FFE7AF0FFFF0D68AFFF6F4F1FFF7F4EEFFF7F5F2FFF1DCA3FFF3E7C5FFF4E7 - C4FFF1DA9BFFF2DFA8FFF0D389FFF1DC9FFFF0D791FFF2E0ADFFF3E2B4FFF5EB - D4FFF1DB9DFFF7F4EFFFF6F3EEFFF7F4EEFFF6F3EEFFF6F4F1FFEFCE72FFF3E3 - B6FFEABB3BFFF2E1AEFFEECE77FFF0D891FFF1D997FFECC254FFF2DFA9FFEECC - 6DFFF6F3EDFFF6F3EEFFF6F3EEFFF8F6F200F6F3EEFFF6F3EEFFF6F4F2FFF7F3 - ECFFF7F5F4FFF7F4F1FFF7F5F4FFF7F5F3FFF7F4F2FFF7F5F3FFF6F3EEFFF6F4 - F1FFF6F3EEFFF6F3EEFFF6F3EEFFF7F4EEFFF7F4EEFFF7F4EEFFF7F4EEFFF7F4 - EEFFF7F4EEFFF7F4EEFFF7F4EEFFF7F4EEFFF7F4EEFFF7F4EEFFF7F4EEFFF7F4 - EEFFF7F4EEFFF7F4EEFFF7F4F1FFF6F3EEFFF6F3EEFFF6F3EEFFF6F3EEFFF6F3 - EEFFF6F3EEFFF6F3EEFFF6F3F0FFF6F3F0FFF6F3EEFFF6F3EEFFF6F3EEFFF6F3 - EEFFF6F3EEFFF6F3EEFFF6F3EEFFF6F3F0FFF7F7FAFFF7F7F8FFF6F3EEFFF7F7 - F8FFF7F8FEFFF6F5F3FFF6F1E7FFF6F5F6FFF6F5F3FFF6F3EDFFF6F3EEFFF6F3 - EEFFF6F3EEFFF6F3EEFFF6F3EEFFF6F1E7FFF3E3BAFFF3E5C1FFF6F3F0FFF2DD - A2FFEFD17CFFF6F1E7FFF2E3B5FFEECB6DFFF6F3EDFFF6F5F6FFF6F3EDFFF6F3 - EEFFF6F3EEFFF6F3EEFFF6F3EEFFF4EAD0FFE8AD06FFE7B00DFFF6F0E2FFEECB - 66FFE5A100FFEDC550FFF6F3F0FFEBBF44FFEABB36FFF5EDDAFFF7F5F5FFF6F3 - EEFFF6F3EEFFF6F3EEFFF6F3EEFFF4EBCFFFE6AA04FFE5A602FFF3E0AFFFF2E0 - AEFFE6AA04FFE8B00BFFF3E3B8FFF5EDD7FFF0D587FFF5F0E6FFF6F7FBFFF6F3 - F0FFF6F3EEFFF6F3EEFFF6F3EEFFF6F0E4FFF1DCA3FFF1DCA3FFF5ECD4FFF6F0 - E4FFF3E8C6FFF6F1E1FFF6F2E8FFF7F8FEFFF5EFE2FFEFD179FFEECB6AFFF6F3 - F0FFF7F4F1FFF6F3EEFFF6F3EEFFF6F1E8FFF3E5C1FFF4E5BFFFF3E5C1FFF7F4 - F1FFF2DEA5FFEECB66FFEABD43FFF2E2B2FFF3E1B3FFE6A802FFE6A802FFF0D6 - 88FFF7F7FCFFF6F3EEFFF6F3EEFFF4EAD0FFE6AC05FFE6A901FFE9B620FFF6F3 - EEFFEBC34AFFE5A700FFE5A700FFECC657FFF6F5F6FFEAB824FFE6AA00FFE8B0 - 0BFFF4E9CEFFF7F6F7FFF6F3EEFFF4EAD0FFE7AE04FFE7AC00FFE7B10AFFF5EF - DDFFEECE6CFFE6A800FFE6AA00FFE8B419FFF5EFE2FFEDC85EFFE5A700FFE5A5 - 01FFEDC85BFFF7F7F8FFF6F3F0FFF4EAD0FFE8AD06FFE6AB02FFE6AA04FFF3E5 - BCFFEFD585FFE7AE0DFFE8B414FFE8B215FFF3E4BBFFF3E3B6FFEBC04CFFEFD2 - 7AFFF3E5C1FFF7F7F8FFF6F3EEFFF6F1E8FFF4E5BFFFF4E5BFFFF4E5BFFFF5F0 - E3FFF5EFE0FFF6EED9FFF6F2EAFFF7F4EEFFF7F4F3FFF6F4F2FFF6F3EDFFF5EF - E2FFF3E3B8FFF2E2B2FFF7F5F5FFF5F0E6FFF1E0ADFFF1E0ADFFF1DCA0FFF4E8 - C8FFF5EFE0FFF0DA97FFEFD585FFEFCF76FFF1DCA0FFF5F0E1FFEBBB31FFE8B0 - 0BFFE6A802FFEDC550FFF7F7FCFFF4EAD0FFE6AC05FFE6A901FFE6A500FFEFD2 - 7AFFF3E8C6FFE6AA04FFE6A901FFE5A700FFEBBE3FFFF6F2E5FFE8B419FFE7AC - 00FFE6AA00FFEABA2BFFF6F1E7FFF4EAD0FFE6AB02FFE6AA00FFE5A700FFEFCE - 70FFF5ECD4FFE6AD03FFE6AA00FFE6AA00FFE8B51DFFF6F0E4FFEBBE3DFFE5A7 - 00FFE6AA00FFE7AC03FFF4E6C4FFF5EDD7FFEBBF42FFEBBE3EFFEABC3CFFF0D6 - 8BFFF6F0E2FFEBC34AFFEBBE3EFFEBBE3DFFECC249FFF5F1E5FFEFCE75FFEABD - 3CFFEBBF3EFFEBBE3EFFF3E4BEFFFDF4EDFFEF9342FFF19C53FFF19B52FFF197 - 4AFFFADDC4FFFEFEFEFFFEFDFDFFF8D1AFFFF0994CFFF19B52FFF19C53FFEF93 - 42FFFDF4EDFF0000000000000000FCEADAFFED801FFFEB7006FFEC7B19FFEE82 - 23FFFBE5D3FFFFFFFFFFFEFDFDFFF8CCA6FFEE8428FFEC7B19FFEB7006FFED80 - 1FFFFCEADAFF0000000000000000FFFFFFFFFDF2E9FFEB7006FFF5BC8AFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5BC8AFFEB7006FFFDF2 - E9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B782FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B782FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B782FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B782FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B782FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B782FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEB7106FFF5BB88FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5BB88FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEB7106FFEB7207FFEC75 - 0DFFEC740CFFEC740CFFEC740CFFEC740CFFEC750DFFEB7207FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF08F3AFFF3AD - 6FFFF2A968FFF2A968FFF2A968FFF2A968FFF3AD6FFFF08F3AFFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B985FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B985FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B782FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B782FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B782FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B782FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B782FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B782FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFDF1E7FFEC7106FFF6BC89FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6BC89FFEC7106FFFDF2 - E8FFFFFFFFFF0000000000000000F2A35FFFEF8A34FFEB7005FFEC7E20FFEF8D - 38FFFCEADAFFFFFFFFFFFEFDFDFFF8CEAAFFEF8D37FFEC7E20FFEB7005FFEF89 - 32FFF5B680FF0000000000000000F3AA6AFFF19A50FFF19B51FFF19B51FFF196 - 48FFF9DBC0FFFEFEFEFFFEFDFDFFF8CFACFFF0974AFFF19B51FFF19B51FFF19A - 4FFFF4B279FF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF1E9FFEE9A59FFE7771DFFE87419FFEC8F - 46FFFBE5D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFEF8F4FFE8771FFFEFA970FFFDF6F2FFFEFBF9FFF5C1 - 99FFE66C0DFFFAE8DAFFFFFFFFFFFFFFFFFFFDF3EBFFEFA064FFE97D29FFF0A3 - 68FFFBE5D5FFFFFFFFFFF1B584FFE66F12FFFFFEFDFFFFFFFFFFFFFFFFFFFFFF - FFFFEC8C41FFEE9754FFFFFFFFFFFFFEFDFFEA8333FFF0AF7AFFFCEFE4FFF6D1 - B3FFE8771EFFFFFDFBFFEC944EFFED9A58FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFF2BA8DFFE8771EFFFFFFFFFFF8DEC8FFE66F12FFFBE8DBFFFBECDFFFFBEC - DFFFEB9149FFF8D4B8FFEA8639FFF1B584FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFF8D5BBFFE66D0EFFFFFFFFFFF6CCAAFFE66F12FFED9A57FFED9A57FFED9A - 57FFED9A57FFF6CDADFFED9A58FFEC8F46FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFF0AF7AFFEB8E44FFFFFFFFFFF9E0CBFFE56806FFFDF3EBFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFF6C8A4FFE56907FFFEF8F4FFFFFFFFFFFFFFFFFFFFFF - FFFFE9802EFFF1B482FFFFFFFFFFFFFFFFFFED914AFFEC8F48FFF6D1B3FFFAE1 - CEFFF4BD94FFFAE2D0FFFFFEFEFFEC924CFFEA8639FFF7CFB1FFF8D5BBFFEE9A - 59FFEC944DFFFDFAF7FFFFFFFFFFFFFFFFFFFEFBF9FFF2BA8DFFED9551FFED94 - 4FFFF2AF7CFFFDF1E8FFFFFFFFFFFFFEFEFFF4C6A0FFED9D5DFFE9802EFFE771 - 14FFFEF8F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFFEC94 - 4EFFEE9754FFFFFEFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFFF5C39BFFE87B - 26FFF5C39BFFFFFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE1CEFFEA8638FFE56500FFE565 - 00FFE56500FFEA8638FFFAE1CEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCEDE3FFFBECDFFFE56500FFE565 - 00FFE56500FFFBECDFFFFCEDE3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE56500FFE565 - 00FFE56500FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE56500FFE565 - 00FFE56500FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF1E9FFEE9A59FFE7771DFFE87419FFEC8F - 46FFFBE5D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFEF8F4FFE8771FFFEFA970FFFDF6F2FFFEFBF9FFF5C1 - 99FFE66C0DFFFAE8DAFFFFFFFFFFFFFFFFFFFDF3EBFFEFA064FFE97D29FFF0A3 - 68FFFBE5D5FFFFFFFFFFF1B584FFE66F12FFFFFEFDFFFFFFFFFFFFFFFFFFFFFF - FFFFEC8C41FFEE9754FFFFFFFFFFFFFEFDFFEA8333FFF0AF7AFFFCEFE4FFF6D1 - B3FFE8771EFFFFFDFBFFEC944EFFED9A58FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFF2BA8DFFE8771EFFFFFFFFFFF8DEC8FFE66F12FFFBE8DBFFFBECDFFFFBEC - DFFFEB9149FFF8D4B8FFEA8639FFF1B584FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFF8D5BBFFE66D0EFFFFFFFFFFF6CCAAFFE66F12FFED9A57FFED9A57FFED9A - 57FFED9A57FFF6CDADFFED9A58FFEC8F46FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFF0AF7AFFEB8E44FFFFFFFFFFF9E0CBFFE56806FFFDF3EBFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFF6C8A4FFE56907FFFEF8F4FFFFFFFFFFFFFFFFFFFFFF - FFFFE9802EFFF1B482FFFFFFFFFFFFFFFFFFED914AFFEC8F48FFF6D1B3FFFAE1 - CEFFF4BD94FFFAE2D0FFFFFEFEFFEC924CFFEA8639FFF7CFB1FFF8D5BBFFEE9A - 59FFEC944DFFFDFAF7FFFFFFFFFFFFFFFFFFFEFBF9FFF2BA8DFFED9551FFED94 - 4FFFF2AF7CFFFDF1E8FFFFFFFFFFFFFEFEFFF4C6A0FFED9D5DFFE9802EFFE771 - 14FFFEF8F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFFEC94 - 4EFFEE9754FFFFFEFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD - FBFFFDF0E7FFFFFDFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE56500FFE56500FFE565 - 00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE56500FFE56500FFE565 - 00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFCEDE3FFFBECDFFFE56500FFE56500FFE565 - 00FFFBECDFFFFCEDE3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE1CEFFEA8638FFE56500FFE56500FFE565 - 00FFEA8638FFFAE1CEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFFF5C39BFFE87B26FFF5C3 - 9BFFFFFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F7DBD5F4F3CAC0F4FFFFFFF4FFFF - FFF4FFFFFFF4FFFFFFF4FFFFFFF4FFFFFFF4FFFFFFF4FFFFFFF4FFFFFFF4FFFF - FFF4F1C0B3F4F8E2DDF4FFFFFFF4FFFFFFFFF0B9ACFFF4CBC2FFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFBFAFFF9E7E4FFFCF4F2FFFFFFFFFFFFFF - FFFFF1C1B5FFF2C2B6FFFFFFFFFFFFFEFEFFEB9981FFF3CBC1FFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C3B8FFE5660EFFF0B9ABFFFFFFFFFFFFFF - FFFFF2C2B6FFECA28DFFFFFFFEFFFDF8F7FFE77543FFF3CAC0FFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFBEDEAFFE6733EFFE56500FFEA967CFFFFFEFEFFFFFF - FFFFF2C2B7FFE77A4CFFFEF9F9FFF8E3DFFFE5660DFFF3C9BFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFEFDFFEEAB99FFECA28DFFE56500FFE6733FFFFDF8F6FFFFFF - FFFFF2C3B8FFE56713FFF9E5E1FFF3C7BCFFE56500FFF3C8BEFFFFFFFFFFFFFF - FFFFFFFFFFFFF7DAD4FFF1BDB1FFF7DBD5FFE56502FFE56711FFF9E5E1FFFFFF - FFFFF2C4B9FFE56500FFF3C9BFFFEDAA97FFE56500FFF3C7BDFFFFFFFFFFFFFF - FFFFFDF8F7FFEC9E88FFFDF7F5FFFBF0EEFFE66B28FFE56500FFF4CCC3FFFFFF - FFFFF2C5BAFFE56500FFEEAA97FFE77C51FFE56500FFF3C7BCFFFFFFFFFFFFFF - FFFFF1C0B4FFF0BCAFFFF9E7E4FFF9E4E0FFE7794BFFE56500FFEEAD9BFFFFFF - FFFFF2C6BBFFE56500FFE77542FFE66B26FFE56500FFF2C6BBFFFFFFFFFFFAEC - E9FFEB9B82FFF1C0B4FFF1C0B4FFF1C0B4FFEA8E70FFE56500FFE98867FFFEFD - FCFFF3C6BCFFE56500FFE66C28FFECA08AFFE56500FFF2C5BAFFFFFDFDFFEDA8 - 96FFFAEAE7FFFFFFFFFFFFFFFFFFFFFFFFFFF3C6BCFFE56500FFE66D2CFFFCF2 - F0FFF3C7BDFFE56500FFECA089FFF3C6BCFFE56500FFF0B6A8FFF0B6A8FFE989 - 69FFF7DBD4FFFFFFFFFFFFFFFFFFFBF0EEFFEEAA98FFE56500FFE56503FFEFB2 - A2FFF0BBAEFFE56500FFF2C6BBFFF9E5E1FFE56712FFF0BBAEFFF9E5E1FFF9E5 - E1FFFBF0EEFFFFFFFFFFFFFFFFFFFDF7F5FFF9E5E1FFF9E5E1FFF9E5E1FFF9E6 - E1FFF2C4BAFFE56504FFF8E1DDFFFEF9F8FFE77747FFF2C2B7FFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE - FEFFF3C9BFFFE66F34FFFCF4F2FFFFFEFEFFEB9A81FFE98C6DFFEEAC9AFFEEAA - 98FFEDA997FFEDA895FFEDA794FFEDA793FFEDA794FFEDA794FFEDA794FFEDA8 - 95FFE98D6FFFEA9377FFFFFDFDFFFFFFFFFFF2C1B6FFF1BCAFFFFDF8F7FFFDF9 - F8FFFEF9F8FFFEFAF9FFFEFAFAFFFEFBFAFFFEFBFAFFFEFBFAFFFEFBFAFFFEFB - FAFFF3C8BEFFF0B9ACFFFFFFFFFFFFFFFFFFF8E1DCFFF2C1B5FFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFF4CCC2FFF6DAD3FFFFFFFFFFFFFFFFF4F7DBD5F4F3CAC0F4FFFFFFF4FFFF - FFF4FAFAFFF4E0E0FEF4DFDFFEF4DFDFFEF4E6E6FFF4FDFDFFF4FFFFFFF4FFFF - FFF4F1C0B3F4F8E2DDF4FFFFFFF4FFFFFFFFF0B9ACFFF4CBC2FFF7F7FFFFBCBC - FEFF5656FDFF3333FDFF3A3AFDFF3832FCFF2E1FFBFF6E6EFDFFCFCFFEFFFDFD - FFFFF1C1B5FFF2C2B6FFFFFFFFFFFFFEFEFFEB9981FFD9A9C2FF6B6BFDFF6B6B - FDFFCECEFEFFF4F4FFFFFAFAFFFFEDBDB9FFD65E6AFFAD70CCFF4D4DFDFF8E8E - FEFFE7B4B6FFECA28DFFFFFFFEFFFDF8F7FFDD716BFF4E22F2FFA6A6FEFFF7F7 - FFFFFFFFFFFFFFFFFFFFFBEDEAFFE6733EFFE56500FFEA967CFFD3D2FDFF1B1B - FDFF7F3CDEFFE57955FFFEF9F9FFF8E3DFFF9441CEFF7D7DFDFFFCFCFFFFFFFF - FFFFFFFFFFFFFFFEFDFFEEAB99FFECA28DFFE56500FFCF6384FF514BFBFF9797 - FEFF4D4DFDFFBA53A5FFF9E5E1FFE5C4D2FF3211F9FFD8C2E3FFFFFFFFFFFFFF - FFFFFFFFFFFFF7DAD4FFF1BDB1FFF6DBD5FFB950A5FF4519F5FFA7A3FBFFFDFD - FFFFB9B0F5FF6227EBFFF1C9C3FFBD9EDFFF5F26ECFFF1C7C0FFFFFFFFFFFFFF - FFFFFDF8F7FFEC9E88FFFDF6F5FFCBC6F9FF3113F9FFA848BAFFF2CBC6FFFFFF - FFFFE4C2D1FF2C0EF9FFD9A5BCFFAB67C7FF7A33DFFFF3C7BCFFFFFFFFFFFFFF - FFFFF1C0B4FFF0BCAFFFCBC6F9FF3429FBFFB851A7FFE56506FFEEAD9BFFFFFF - FFFFEEC5C2FF3311F8FFCB6A95FFA951BDFF7A33DFFFF2C6BBFFFFFFFFFFFAEC - E9FFEB9A82FFBD80C3FF342AFBFFC5AEE4FFE98E71FFE56500FFE98867FFFEFD - FCFFEFC6C3FF3311F8FFCA608DFFB492DFFF6E2DE6FFF1C5BCFFFFFDFDFFECA7 - 96FFC6AFE6FF3737FDFFCDCDFEFFFFFFFFFFF3C6BCFFE56500FFE66D2CFFFCF2 - F0FFEAC5CBFF2D0FF9FFD399BAFFDEC2DBFF2C0EFAFFE0B3C3FFEEB6ABFF9846 - CDFF302FFDFFCDCDFEFFFFFFFFFFFBF0EEFFEEAA98FFE56500FFE56503FFEFB2 - A2FFC7AFE5FF4C1DF2FFEFC5C1FFF8E5E2FF7D38DEFF968AF4FF9E7FE6FF5252 - FDFFDEDEFEFFFFFFFFFFFFFFFFFFFDF7F5FFF9E5E1FFF9E5E1FFF9E5E1FFF0DC - E1FF6861FAFFA849BAFFF8E1DDFFFEF9F8FFD16F8DFF2A0DFAFF4747FDFFE5E5 - FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFBFFFFA6A6 - FEFF5F27ECFFDE6C5CFFFCF4F2FFFFFEFEFFEB9A82FFB858ABFF3731FCFF9682 - EFFFDC9EAEFFECA696FFEDA794FFEDA793FFEAA394FFD097BBFF796AF5FF523D - F7FFD06A8AFFEA9377FFFFFDFDFFFFFFFFFFF2C1B6FFF0BCB0FFE6E4FDFF8C8C - FEFF2E1FFBFF786EF8FF867FF8FF877FF9FF685DF9FF3732FCFFA5A5FEFFF4F3 - FDFFF3C8BEFFF0B9ACFFFFFFFFFFFFFFFFFFF8E1DCFFF2C1B5FFFFFFFFFFFEFE - FFFFE6E6FFFFBDBDFEFFBCBCFEFFBCBCFEFFC6C6FEFFEEEEFFFFFFFFFFFFFFFF - FFFFF4CCC2FFF6DAD3FFFFFFFFFF + 4C7A230000001000000010000000773E00000000000078DAEDBD075855C7D63E + 3ED6F4A2B9B96937BD1B636234B11B7B2FD8BB60A14851101B208A745090A674 + 44918E80D28B08284D44C4DE15A4F70E4A79FF6BE6708E600BE6DEEFF9BEFFEF + B93BCF9BD97BF6BC336BD6CC9A59337B38A6F72A65E904E6CA2478CE35624411 + 9E153FF597AFD8257F3376DB578FDDF6D165378FEAB2EB4774D815CF6DECB2C7 + 5676D15D9B65BB6C662E2E2EC83CB8896538A8B378FBAD82C7AF5B81C6AC38C6 + 4EE0EAD5ABB874E912B2B3B371EEDC39A4A7A7E3CC9933080909C1962D5B606D + 6D8DE3C78F83A73DB57FA3E08B723B90939383BABA3A81DADA5A196A6A6A04AA + ABABE1EFEF0F9E3671AF92A47C92178040565696E0369C3B214166081A328250 + 971E80BA145F545555E1C89123E0694F9AAD13FC1B5E3A82DBDAF290A5A5A589 + F2F2F3F3F1E0C103E4E5E521373717F7EFDFC7BD7BF704DFD5D555F0634D1404 + 9FEB8A3FB7B53D6249494942CE86742A338D97E983BAD35EA84B3C84DA047754 + 5656C2DEDE5EF0A3F6AC167CAE6709BF95C5C5C5097EE732EFDEBD8B3B77EEE0 + F6EDDBA8A8A8C0BE7DFB043F62D74AC1E76DC49FDBDB5B597878B8D0515DD211 + D48A325D511BE78CDAD883A8893E80F2F272181B1B0BFE899DCB053FC74D5BC6 + 3F7ADC5BD4B17399B76EDDC2CD9B37E11AE50D79A72D986BAD8419966BA0A923 + 27F8E71C37097E797319D34CD21575E4BC3D7BF6C0C8C84894A7B6773BD604EE + C181CBE1882DBC00D5B8FDF879FF12BC3DEA339C75D828F8D7AB6F31EDD49D48 + BA9722CA34313141444404A2A2A230C56C356C2E1D87DDD5E35C7628C6EF8372 + FC7E7CA8F23BD2EDD459536B13534EDE0CB3CCFDD871DA00376EDC8085850562 + 62620406EBCD82DBE54874BE0E5C3C818FD4864173E61FECA08F2A5B1BAF0685 + 48556C0CDD8AFDBE7630B336437C7C3C4E9E3C89CF3546636DEC5E28C49A09AE + 428C99AC7CAE03353535BC08E3D5E4F0C3BE05581F6B25CAE5217FE6F567DDBC + 3E571C8C8F55FF10327FA834146F8DF85470A7F52E15905B7443407ACD9D3B97 + 1D387080517F633366CC78AEFD77BEBEFAEA2BF6C61B6FB09E3D7B32D23B2B28 + 2860640BCCC3C343D8FFEBAFBFCEFEF5AF7F3D93BB7BF7EE6EDBFFBA75EBBA70 + D7AF5FCFA8CF74DBFEB96C13274E94F1797EA74F9FEEB6FDEBE8E8B061C38675 + 91415959B9DBF63F75EA5419EFF0E1C32C38389885858575DBFEC92ED88E1D3B + D8860D1B587272322B2929E1BAEBB6FDA7A6A6328A63AAAAAA8CFA272339D9C5 + 8B17BB6DFF89898922BD828202E3B2F0B6E37DE545F6CF6DAAACAC0CDB8D76E0 + 43EBC96CCE9C395DDA60A5CAEAE7DABFA9A929AE5DBB865BF9B7B1D06D39A678 + ABB0574C8632D643C25DB870213B70CCE9B9F66F6969892B57AEE0ECAD4C2CF7 + 558066C46E36DA93C6BF9DDF08FEBCC5F35E68FF7BF7EE4566CE39CCF158089D + B8DD98E4300BEF6EF981B1DE1201062D1FC2D6C43DDFFEADACAC60E862848507 + 9742F19806C65A4DC4C0358364F6F457F62F85AABA2A96E92C87BCB602943594 + 5F688F03060C6013264C6063C68C615F7CF10563DA9FB15E7A9F31D6B36BBA6A + 9AFB39861F1921F05FFBFFAFFDFF4FD8FF1EB76CFCA09082DE13E2D177761006 + 4C37E8B6FD2FD2F4C2E8AD39B08A6842F4D5766CF66BC040F5B3E8F9995CB7EC + FFFDD961C46DC46C3BA0DF76E04B53609C65197ACDF44177ECBF0FC91C9CD5DE + 65FEFF707715D5250EDDB1FFFEB3C3B1CEBD9E38E4A86C6B2654A2974A2E7A8D + F5EED6FC3F618D23BE5B9F8E2FB717A28F4E297AACBF833EB3E3D1E3CBA5DDB6 + FFB795D419AF2F97B9D7186F1957EAFB3EB09F843CBB8928709E875CAB09B86B + F42B5EDF758D55A56BB38E84B2BC73CB9B58F3351DC9C3EBBB5881E36CE2FC89 + 80B6F9ECAEF1501478C8E3B6EE8F90E6CDFA9D979473F1034139DF11FF4147BE + B9FB464172DBC8EEEAFF8C078E4B7153FB2BC1E794F74B4B04EF9F65A55D6509 + 00FBF3B57EA2CCFB7BC789320B8FA8E18EC108749697DFBE6E850ECA05F65ABF + 790C2769EC5E0476DF6A3C7899D284B6FE2B61EC29279EFF2186BC61ACB0BF78 + 6298D6550FFCF681C342DCDCF60D4089F67ACD87D9D9FD304CB18482C73C2080 + B17136D35010B81DF9FEDB50E8B715057EDAC8F7D644EEE14DD84679F07A5EDF + F429AEA97E0CA343F3B0FB8C19426E45604B941E3877B8F158E4132FDF571B25 + B1B67CED83C23073DC735793D5F122064904A22945CE6719CD6F3AF0BE1604F7 + 8B47F1ABCE1F2251BEF726E41DDE888A380794F86DC163CA35495D828EB1451D + F5E2E5BAE41C8643B61B7EDC340885C4CDF55447AEC706948799A2D85BEB09FD + F2473B1997CBCCCBE55C1393E978E0AF87BBAE2A8253E2BF03C5BE5B25E45E3C + 68954D49687952BF60F95E5AB8EBA20C74242AF6DE8CA2A35AF8A9533A29A70A + FD24CFFDF973152BF054419EFF6EDC7258279337FFE04A927FABD0833DA7CA28 + 95220CEC4857E8A98CFB4777E096FD1ADCB451C08DFDAB706DDF72DC755643B1 + CF0EA107643FDD1F18FB993DE0E51CDD82DB8ECA182512D1BB8040A1DFBCFD8B + 89AF835CF2DFED602D215A72A21DEB78624547375399AB716BFF4A3CCEB70FE3 + EAC97756464990211ED8AFA2D8F759E9FB1C8F0528705640FEC155C8B55F4EF6 + BC8CD2FCC1EA69A99D67BD80CA9C8FDCBD72C8B5982B039FFB9E0F6EBBAFB237 + E9BF1E9447BF1EBD580F9C61EAAE97B0C139078A07CFCB2ADFB3576FD6F79557 + D9EB6F5054C4BBAC27A5EDD9BB17EBD3BB37F969FAF49EB14DEE57C0B9C6A137 + B0CC261AF2766731E178129B9F53CDE710E8EBEB434F4F8FCFAFD8B66D9B98F3 + B5B4B4A0E97E091B896B7AFC16022E16C12FBB004BF64761A9550A8C8C4D9899 + B905DBB973279C9C9C049C9D9D05B8CFC1B1D1ED22FC2F142280E0987A1F3649 + 77B0C83A12F3CC13515B57CF1A9B9A192F9373E7D92C8593B393E0F1B99A43CD + 391B3E59F9B04EBC0BF3F85BB024CCDF1781194671E84115EBDDE74BC6E5E565 + 8EB6988469167304CFCDCD4D40F140260E9FCD135CC3E81B3022C8598663827E + 0426DACFC2789B1918BB6F2A469B4FC24AAFF558764801930C67C0DDDD5D40DE + 361DEEA9B9308CBA819D6157A17FE22AE6988761E48E508CDB3F1DF6391EB0C9 + 76C6BE7307607ED6164669FB20E7B804E3F426837C2F2CB33A0DC7E47BD0239E + 76F015AC3A5D8E19662730647300C6584E8675961376A698627BB201369FD283 + 3661479201A6ED9F8305BB1663817902EC136E634BD025AC8DBA8F1997DA31DE + 320A3F697863A4E9785999BB53CCA09B6C886D89BB30C57A16466A8F85A7A727 + 661AC5605FEC4D68F85E80A2F705AC0EBB8B29C6A1F846C5137FEC198321FA23 + F1EB8E3FF0F396219866331793AD6762F8E6D1824BFE1126E987C12CF23A948E + 9C87827B26D67A64927E42F1D93AD78EFE07262F2F8F43870E919F300EBF6B0E + 173C0EEEAF8DDE11823D54F735C45BE69C8E552E199860108C0FE51D71A3C36E + 56AC5821CA1BB5F94F1CA290F338BCBCBCF0BBB63F76065FC272E22E7048C592 + 036918B7FB18FAAFB0EFB0CF2B6CC992255DCAE43C8EA3478F62D0C6A3D81E90 + 43B888CD3E17A072E81CFEDC750C6F2FB5117D4E5353130B162C809C9C1C685D + 8499336762FAF4E99832650A264D9A846F94DC3058DB17A3F58231C5281CB32D + 6230463F086F2CB6A621D2844994E028996B596FD99C0EBCC51AAB82BA8C91EF + 2CB3C59B4BF693ECB6827F9F7C7F8E0F0F3081675DEAEAEAE4BF7B883ECDFB38 + 7B898B73398FFBC4DCB73B78F0E073F9DC8725FF9F91FFCFC8FF67E4FF336E3F + DC8F2E2A2A12BE18F77F9FC727FF9F91FF2E407EB800D72F2F9BAF291C1D1DB9 + FFCFF83A82FBC17C5DD8994FFEBFE092EF2F416608E3F2725F362525050E0E0E + 620D12141424D6A36666665DF8E4FF8B32F99A87FC7F46FE1F5F3FE1F2E5CB62 + 2DC3FDC1D8D85890CF2ED6358686865DF8E4FF33F2DF59E1093BDCF2B7809D9D + 1DF89A82AF8578487E3B689DC2FD6FE1172F5BB6AC4BFDC9FF67F991AE288A71 + 4361A413AEFBEF03F9E9C20FE6FE2C9797FBC50606064F71C55E66E07E1446B9 + A12A3B1E95E76391174C7C573D989B9BE34AA02D23FF9F51B9CFD47DB4853A71 + 9D89178792445F149FF442797A18EE1DDD834B566BB9FFCFC8FF67E4FFB35E63 + 8EB21E5F2C9171A34CD55018EE84CAAC58949CF24641F841AA833BCA528371F7 + 900ED20C9673FF9F91FFCFC8FF67E4FFB381AA19ACE7A772C455217FC80195E7 + A25192405CBA2F8C7245E99963B8EBB10317CC9673FF9FB88D8CFC7F46FE3F23 + FF9F91FFCF7A8D3ACCEE50FE15E7A284BCF9C7C9B78A7441E9E920DC75DB820B + A64B799F63E4FF33F2FF3BD91518F9FF54973876CB71132AA89E45D1AEA20EA5 + A70389AB8D8CDD73797B8BF515F9FF8CFC7FE250736F6B265432F2FF19F9FF2C + 67EF1AA1A3D2E4409426FAE1B6B316D2746672BF9F4941FE3F23FF9F91FFCFC8 + FF67E4FF33F2FF99D487CF365E842B46F390A33F13F11A639F691F6FFFB892F5 + 1A7D44C84CFEBF8CFB43EF520183A14B04EE1B7DCDAAAE078B777EFC7FBF2F61 + E1439774C92BBDD3F32CC9FE3FDF53C76D1F5DDC3CAA8BEB477470C5731B2E7B + 6CC545776D64BB6CC679674DBEFF8F0C0775C4DB6F45A7FD7FE1D3BE2C4EEDDF + 888EFD7FFC1D24EE5542C7FE3FFECE75D26C1DE6BE23F6FFC5736BCB4342335A + 1E36A1A5A91E8F9A6AF1B0A11A4D751568AC2A45435911EA4AF3515B7457A48F + 355140C7FEBF786E6B7B84D6D647229F96478D68696E10F9B434D6A0B9BE124D + B56568AA2E456379B1481FB567353AF6FF3BF8AD84968E7CB82C24C743CAA399 + F268AA434B432D1ED555A1B9B65CA48FD825F12D791BF1ABBD5DCA978694476B + 477D64F9D48A7CF87562E77274ECFFCBF85248F81259DADA9AA110AF8E9591CA + 5812BA06F3FD568AF4A1BA4B9171CB8BEFFF7768B495D7A2533E52FE23AC0857 + 84FB551F385F3A82991E0B44EAA0AD0BE9FFA7D859878D9D5AA5BD238FB62EF2 + 2C0C5C8D83170FC1967CA4058756E072E15504682F10F2A7DBA93FB78D8D53F6 + 6249E01AA8866BC3E6BC232C336DA11AAA8951C613307FFB18B077E6324BB93F + 70DA5A45F4A704F3F58833598318237984937E43F59793BFB110EB82D4609E61 + 03C3544BCC77598A715B8761E39CF1788DCABF663E84E92594B0B73E9FC87E7A + F71576DF6B159BEA95CFDEE9D98FE51D99C406E85F64BF6D1E81451E2B21E7B4 + 18B3B60DC658E7BBC47C4BB24F477DF054D529C665798796B4576CC7B2515697 + C8E77EBBCBBBEFE407E0CB25DF76191B567DD0437CFBE370DAFCA5C07FF7FFFE + E7F6FF8EDF2CC152EFEB30A175CC14F70B7877D8EC6EEFFFF9C547627B4211C2 + 2F56A3A08EFAFFC52ACC24BFBC3BFB7F872EDC83C1954A9C78F0107B138B107C + A91167EEB742C93D1B7FB5FF171D1B0CFDCB1538D3D806F53B8DD0385B81755E + D7A074E82256AB68BE70FFCF27FB36742E5522ADA90DF2B71BB022AF09BA576B + 31DA2907B3962BBD70FF6FB5A13DB6671609EE6AE22ECF6D82DEE51A4C3C7005 + 133D77BF70FFDF2D211BDA5197914C32AFBBD7845579CD244735A639DEC4E2A3 + 9B5EB8FFBFC8732F7423AFC0262A078B32F2B1E25E03765CA8C06CE71B98E9A6 + F497FBFF132D02709F86C8852ED7F1B16E02A63BA5608C513CB63ADA766BFF7F + A0A2111CD21EC236E321C69B64E08BF5BE50D8A8D3EDFDFF7747CDC7F7AB4D30 + DD2C0E13F43C306AF2EC17EEFF0F6FAB15F6CF438EFFC455EAB31DC547B7A0D8 + 73230ADDD590EFAC88BC03ABBBBD6E28F6D4442DD94075AA1FAAC906AA928F20 + D77A41B7F985AECA82571E698BB2B07DA88C77C53D93A9DDE6E7D9AD44659227 + 4A8F5BA024D80415510EB8B573E433F95B76B48363F3B6766CD46AA3366A45AE + D57C54C439A324680F8AFC76A234CC0AD7B70C7C2E3F3AAE1D9131ED088B6C47 + 68583BEE194F467914F9A2DE3B5078441B25C74C7055EDD9DF7A35B5DB101ED5 + 8E3D26EDD8B9A71D4121EDB8A13702A5272C917F68231EB8A9920CFAC859FBF1 + 33F95C5E5EA6CEAE766CD569875F403BC93A00C5C78C90E7A488DC030A28F0DA + 86EC251F3E358FCF3EBC08EBD63F1265F2FA6B68B5E3C8D1765CDDF0198AC8C7 + BA4F7ABCB77F31F23D36226BCE3F117B230251578F23EC52308273FC31F9E06C + AC58D12CCA54DBD40EC50DEDF0F06C478EC2C72838B20577F72DC01D8BD9C873 + 5642C6E4F71171251496278D6014AD0FDF2C2F8CD93B090BE6358A32D72AB563 + D59A7638BBB6237BD187546F75DC369D815B469370DF61355247BF87909C4018 + 44E942E784363CD3DDF0BBC168CC98DA20CA5CB1BA1D8B97B5E380633BB266FD + 13B98EEB70D3603C6EE88FA23A2C45EAEFFDE19745EBF8502D6806AAC2E5CC41 + 0CDA3604E3C7D489320F3AB5C3FE403B6CEDDB9131F17DDCB75F45BC65B867B5 + 08772DE72171503F1CC9F0807BAA339C4E1F8043A22DBED71808B3490630FA73 + 17760FD7C7CE213BA133480FA923DF43EAB0FE3833B8BFE0250E7817A7BE7F07 + 3BE77E0BDD195F62FB94CFB075C227D0FEF323FCBBB62AFDFE9758BA40E0652F + F3E5E3D9EDE3562FE5FF9F71D105E7F1EB4E90C9DFF2FF936C36FDAFFBFF1DE7 + 7F2411A7F73C065D4AC737C920AE6CA7C77886FF2F78E4A376E6F33D3D1EB6B7 + B74B78378EC9F84FFAFF2F2ABFADADEDA9F29FF4FF3B5FBC3C2938B7335A5B5B + 9FE9FF772E8FF3163A4206CE53BE522D83D4FFEF38FF23E33B52FDA5F2729E76 + 8084CFCBE43CD732C8F8DCFFE77CA9FFDFB97C9EBE73F92D2D2D4F95DF1DFFFF + 4597FFE67982EFA531E7B9FE3FD7D171BDA508D6598263DB16239064F6A772FD + B5E681F3D8FF81EB6FEEFFB30DCE394CF1E079F692FBFF826B1C7A832DB38966 + F2766759A7FD7FA6AFAFCFF4F4F4D83F722AD1977CAE1E17CBD193D0F742255E + CB2EE7FBFF2CE06211F3CB2E604BF647B1A55629ACD3FE3FDFEB637D88B7BDB8 + 01979A5B71B9A91539E43FA636B6606B51035ECBA9E0FBFFCC26E90E5B641DC9 + E69927B24EFBFFACEF85721CA97A88D0DA16D89437C1B4B411FBCA1AE15CD184 + D48616B8D23B2E9765FC2D367F5F049B6114C7A4FBFF6FE694438BCAF0AA7904 + 6BE23A5434C38A423BE21EA0FB7D741F52FB086A45F5F8887C6239CB7036413F + 824DB49FC5C6DBCC60BDB32B70A2AE05F6E5CD124E65330E121C09F61512F07C + 781EAF903EE69887B1913B42D9B8FDD3997D8E07E3BA4A6A6C25792565BB90AC + 1E8443D50FE14EE17E8AD32E6E44705DABD0EB0CB3136CC8E60036C67232B3CE + 7212FC78AAA3132FAFF221DC04F7113CA93E36F4BCBDB4194A458D385A23E18F + B78C623F6978B391A6E399F9595B21BF5FAD4447BA65CD5851D88459054D985A + F010A31F3463585E2366E437C1AC5222FF14E350F68D8A27FB63CF1836447F24 + E37A5525FD5957B6601CA51DF5A00913893BADF09108C7D2F3A6B24798FBA01E + 6F137F926128FB6C9DF4C0AAD8FF67AF50FB6E2CA17A52BAD985CD9852F810B3 + 8A5A308742859247585DD4845729CD2A970C36C120987D28EFC83AEDFF334F4F + 4FD69BE4989C5B0F9592875857D28225C45B50F41023EFD783F7AD050EA96CC9 + 8134366EF731D67F853DEBB4FF2FD6721CEF89FE5B09467AE2788578EFF07E19 + 70916DF6B9C0540E9D637FEE3AC6DE5E6A23FAACA6A6265BB0600193939313E7 + A266CE9CC9A64F9FCEA64C99C2264D9AC4BE51726383B57DD968BD6036C5289C + CDB6886163F483D81B8BADD9DFD8FF676F2ED94FB2DB0ABE74FD6FE03D46A0F3 + 7A9CEF5547474763FBF6EDDD1A4BFEFCF34FF6FEFBEFB3DE64F37CAF9AD6FF62 + 2D1C181808BE27F0DE7BEFB12143863C93CBD7F5E7CF9F176BFE6FBEF946AC85 + A5EBC8D0D050F0350CCFC7D7D7F7A97D7BAE43E9F9167EF683EFAF27242480EF + 27F0BD77CEE77BF6999999E23B023F13A2A4A424E3F3B52BDF67E079F0F4FCFC + 07CF47CAE7CF7C1F9DF3B97CFC5B216FAF27641069F9BE45464686D8E7E7DF2E + F8F7202E0FD707AF132F7BC3860DE8B4E72FE24F9D3A85EBD7AF83EF41F0EF04 + FC7B26DF6318356A14E3FBEF7CDF9FE7C3DFF36F177C1F7FD7AE5D627F84D6FF + 42565E2ED7A1B7B737F8B90FD919EDA953D9B8A39A187C4851C8C565E17AE56B + 4A5E2EDFA7E0F5E3F13C7FDE16BCDF49AFC99327B3919E2A581EB6073F382D11 + DF1F78FA356BD688EF93FC7C1BFFF6C6F76D781E5C0763BC3761989706861C56 + C6AFEE6BB12864276C33033037700B3FFF07FEBD8C7FEF9296C1EBC3BFB1705D + F07098971A0E9E0F8543D631C1B3C9F4C396781B58A61DE6E7FFF08AD9EF90AE + 65795FF5F1F11167FC3897B7D3E043EB047753AC35D4A22DA014698235610650 + 8E308451B21368FD0FB65BB21FC6CF52719DF3FEC6F3E1DF657E745D019BB3FE + B04AF78665EA6198A7784095F2304C76C4346F25F4DD41DC571F2FA6353434B0 + 69D326AC5FBF1E1F7CF001FBCA711EFE653B03FFDC3F09EFEE1D85918756C320 + E920A678ADC56BDBBF06EBDBF3291BF8F24B9A47DE7C53EC9FF16F34FCECD089 + 1327C0BF4DF630FC09130FCBA3E7B62F9EC97DF2E2EDC7BF29CE9A350B43870E + 656CE717A0F53F6878E8725D20DBE7B86E3742E079FB7FDDB95EB4FFD7A3470F + F657FB7FFC9BDF21070BC4871E85BBAD096F0F16EC692FEE97CE9FC9ED89B733 + 7BDEFE1FD93F73B432C2E9E86028AE5AC46D82EDDCAC023F576BB8D99AF27EC1 + C8FED9B3F6FFB6A8ADC551474B1CB0D0C7213B538C1D3154F0674D19875D5B54 + 61A2AB29E2366F54C3D6AD5B65FB7F7DFBF461DF7DFD0573B53614729AEA6961 + F1DC69909B310906DBD4B15169150CD597C2C7561F0EC65BC4BB9F060C787CFE + 8FE69CE0238E880D3E02C3ED1A0201B67A88F57540F8917D0875DC834356FA30 + D25801AD754B847CFFF8C77B624CE6E7FFF837435EEE71AF83D8BD550DBCBEDB + 35D6437DDD0A0C1AF09D288FCB218DD7545E0D6A0B3EA689F37FFC9BA1FCD279 + 9830663896CE9B8131C38760C82F3FE1EB2F3F031FC7DFFF477F7CFCE13FF1ED + 575FE0A30FDEC73B6FBF85B7DF7E1B172E5C909DFF5BB76AA9D0D9B9D3B1480C + 0F808FD35E8C5D3D0D7F1C566783E68D828DB10E92A38F8977BC2DDE1BF8093A + 9FFF9D3F73328C766C127C1D4D2568A9C863D894E1DCFED9B0B1C384EE397FC7 + 2645E86929E38D375E43E7FDBFD953C7CBF8D234BF0CFA11F6E782D857DF7E2E + 7426E5733D509BA1F3FEDF94F1A34419BCDFF0F75C8F7FFCF6332C133DD988F1 + C3059FB78FF41DD75FDF4D5FC9F6FF78BF1831F457A1B7813F7E8BEFBFF9125F + 7CFA093E319EC4FA7FF94FBCF13AC9FB4A5FD2A738F02441AF1E4FD940FFFEFD + 59DFBE7D85AD6CDBB64D7C3B24FB17FB9B3D747E6064FFACA7E227EC59DCBF7B + FE573AFF4787DD17F8E0978FD978A3E95814A88055F11BB0FA941A9685296292 + C56C7C32ECF3E7FEFDCF2D5F3D6615A38DF56736C23B370EB1A5E790723F0129 + 37C371F25A287CAE0541FEE406E886A820EAC0962E7FFF531063CBF6246FC7BE + EB4790D5508CCB153771BEE212B2EF85E0EADD089A578FE0FC85C33873210066 + 19B6D818AA84185B0DD9DFFF58C56E86D9354F24D6DE455AED555CA9BA820B25 + D9B872CB07B7EF06E256960DAEA5EF454692354E5E09816E9A2DD4DD24EBCF84 + C0ED6C7D8A1612EBF21051158E88EA20245544E1F28328DCB8EE869B970E202B + 420369611A88C83486C33D1784146561AAEB6CFC63D007CC3C66339C48C688B2 + 73385EE58B8C4A7FE49466E04AB6156E64EE4556B812CDE7CA70B9AA05C3BBDA + D0BDAD05DB0B5E304F3F8A812A83B1297113C2CA2FC235EF08DC4BADA8EE51B8 + 509A86EC988D38775C0999195BB1ED9632946ECC86E2B5D950BFB40ADA71BBE0 + 7D2B1943F4864331791312AA6F63CF75236CBFA58153052E3877CF1767FD5621 + F9A43AA26FEE85CF75056CCFF913AA17A66059BC1CD605AAE344FE790CD11F86 + F5C91A48A8BA03ED1C7DD8E4A823FEBE07D27C57E352E86AA43A2F406AFC4684 + E4E822FC8C0642FCE5A1E7BF04CBBD9471FCC179FCA23B04AAF16A08255D1B5D + B6C1A9DB96389D6988734716E366C84ADC0E59810C979938653A1151C61311E3 + 321F07BDD742D1671B8E5C3F899F36FD0CFDD00DB0BB1602CFBBE1304ED584DF + 0503A478AFC405DF25B81F40F9F8CC439AD30CC4EC9B8A48D725D8433E8CCE29 + 1BEC4970C3D72BBE45A09B1A5B1CAA8088D24BD810BF051B4F6A21215203195E + 2B702F7005EEF82D4592DD1CB8FB2FC50ED2E7F283CAF0B99D885F757F43BF9F + FAF3F53F333E6D896D895670BE16069D4403C427EF42AABF2AAE1DDF80ABC714 + 11EFBA1A0AC754B1CC51057B929CA1ECAF87E13A4345FFE17FFF7372BF325BE9 + 340F9A51A6082E4E43E2454FA490AF74365C1FE7427620C677070CCE1D80E7CD + 7828F9E962B0CE10A8C8FDD1C58E7ABDDA9B0D54FA1523CCC7C235C51D61C9EE + 3899E48684D3EE08BD781CBB125DF08BDE6F18A8FD0B7ABFD1E7B976DF6F407F + F6EDCAEF315073107EDEFAABC0808D3FE367ED5FF1DDFA014FA56F26DB57A81E + 2B7BFE94C607A9958F73FC96AD675F7495939041C34FF1B1C92CDD6904E3DF30 + 8B2B27B23729FC706A1D1BFBD927EC82BA3CCDC7C128CF4A444966180A22BDE0 + A57C9E0DFDF22E5BDC239F7DD8B7802DEA51C03EEA5BC816F628641FF72D660B + 7A14B3B533B4D99DA4D37858721B8DC57750577053A0A1E8361AF2AFE266B82B + 9AC68F60A37AD7B085BDDE61667DDE65F37BBDCB2CFAF463A653A7B1CA8CE368 + 2ABD87CABB17F020C917D7832D702DC81477E2DC5076350D758537901FE982A0 + 718B596BCFA1CCA1F71FACA5E71FECF0E7E1AC3026008D2577507E3D95387B70 + 3BCE058DE50FD0509E87FCF4605CF4D543E1F958D4E45D41E661573CFAB0908D + E85D4FE3693DB351CC61F50F2EA3EA7616AEF8EDC205CFEDE2FB7D6B07F87D8E + DF1E641FD543E995D328BD9C8CE285EECCBE77146BEF194563A70FD5F306EEC5 + 7920DB732BB23C36A3A1EC01F233C35174E914F11B5140E11927355C0DB745E5 + FD8B8833DF8C8FFACE237DCE63374E38A296F494E3B30BE7DCB590E6A28E144A + 9B772E12CD759568AC2CC68D93B40E7150418AAB16AAF3AE22C14605C3F9F7A2 + E975EC4AB01D6AF36F20C75B1729CE6A38E3A88A330737E051632DEA4A73917C + 80C688FD8A84F548A4FBAA07579068A58069C4E5ED7FF5B82EAA722FE146C401 + B255759C3EB00149F6CA3865A32410B7771D622CD721DA722D327D4D517AFB1C + FCB566C3B24F7F26D7AB3F0B9C3799E59F8B41E9D514A4396BC9784D35E568AC + 2E459485BC4084C53AE49D8FA3BAF8E0C8D805ECFB5ECB985D8F656CCC07AB58 + 82910A4AAF67E04116F9200E6A88DDB716D9A10E029C7BC26C0D6E2606203F27 + 119E1BE6E283FE43984DEFDF48FFBF31BBDE4358C9A0F12C66CF32145D398382 + 8BA790E16382686B65445A2A22E5B001EE9F8BC5830B0908519B0CE7EF6DC810 + A2891F43BE6E3BFBA3370D053DC1D60CFC98C56A4EC1B5382F94DC3C8BF2FB39 + 02C5D7D37129C20DEE6B6621EF9B4859BF19DEBB81F80DC46F644B7B3C60FFEC + 9BCFD6F63BCF14461D601E0A8B71586512BC9426C06E851C7487DAB09FDF9B41 + F63287EC458EEC478E49DBFFC3BEF3893F9FF80BD88C9E85EC47BE2F6FDEC042 + 7B94B2593D4B580ED9F89C9EA52CBB57194B64D3D87BFF789F6F1330DEFE1FF6 + 2E15089D3E46809FFFB9BFF5B8B0F5A3845F678C61F9D3C7741D333A3DBFCAB8 + 1BF619B3E8FB2F66D3F733664900FE7A6B939F4DE0E7372CEE51DAD77E634A67 + 36D35CA489B5A7364281E69455D12A5811A18825A16B31C7630946E98CC7D7D3 + BE67AFF57FFD99F9AD4FD284CF2DF2336E86C0EBC6319A5F0271E89A1FDCAE78 + C3E1823B8C52F6413D7C0B06AB0EC33B5FF67B8ABF364103DE3783891784C3D7 + 03E071D557709DC9F7E0FBD2FBB20E88F323DAD17AF879DD60782DFB849D7B50 + CC4E359488F315F2B1AAE2DBD8B2B0F5581CAC800501ABC0CFE2CF3EBC182AC7 + 3569BEB78115CD017B33EDB0CA7B3D3E1AF9AF6EEFD17EBF682046EE99803DA7 + CDA17FC6041BC3B6E2BB150320D56352D52916A1ACCCB6641533D6E75BC9B9AE + BE8C955CD8C1949522D8A9AA24F6F5E219581FA886DD674CA193B007138C27A1 + 9EFF394AC80DD6B3DF48C95AA6670FB6516704ABBF7752F2F7D0E56043D58F50 + 5F7D877D3DEB1BACF153861E3FDF1BBF1323774D84F41D7729E77FF726330952 + 855AC826B410D73AB980F5FE64AE642D3AFF1B4CB19A89AD717AD03CB99DFC8F + 0DF84CEE4B1C9AF80EB3B99BCFE43E1EC6F4938DA07C9CD6CFC7D430D16126C6 + ED9F8AD1961331C2641C16BA2FC796585DE824EDC6F653FA98613B17DF2BA8B3 + BEAFF463E3BF7C87A9BAAE8152E846589EB583C5591B98A65BC128D512062966 + D875DA9864DE038DB82DD896B013CB3C57E193595FE3DB0F5F6557ECE4D8C2B0 + 62F6DDFCDFB1966437219E49DA5E18A69A0B3DEDA4BAEA2419402B6607E4FD14 + 31DD760E3E9EF33B867EFE1ABB74CF91F51DA02F6BA3F9F203B0FCE85A2C3DBC + 1AC38CC662E8AE9118ACFB07066D1D82EF557EC2A773BEC0BB83FAB311FFECCD + 8A0ADCD9AC2D21ECEDCF7E13FB75D2EBEB053FE067B5DF9E3AA3E3F3E034636F + 8EEF729E676ABF1EEC5AFE517660BD353B5A7887F578770A9B4B71FAB106E2FD + 6C6E5F6DF15DCE2C7224B443BCE7F3B8C6C8F7D80EB27D8EE6456502DCFEDB3B + EC3F91EF8D2C2E6303099DAF719D9EB9FD37E55E6435E941A8483C84B2047794 + C5BBA024F6208AA2EC51186183FC13FB9017628EFB41C6B8E36F80DBDEFA3869 + BC06D2BADC3AE12039EBF612C871D392E9A9FC948788E3F6EA74E9B0B0779BF3 + 4E646BF6B45EB0A6F6B410FD4097DA92F7019EF6B2EB2619BFECA4AB88EBEE25 + CAA739522A7F49AC93882B39EDD32DF0B4E7EDD7CBCA2F8A7290F1F9557CC6BF + 4B79C569415D9E9B6ACA90B95F5EC62F08DF2FE6EA92D40042104A297D49DA31 + 9464041342055F84E9847311E20C62BAE53299FC0F8EEF237E0D4A293DBF4A29 + ED8BCAAF29B88554D345E0367F2FCE82E5069BE1517D354A334FA0F45C58579C + 8F127C015E3EF952D579D771C67421BE7885D65FD60BD8BD00433CACAB1269F9 + 557621AE4B79A5D9B16869AC953D737EBA95BC4CFE3BE473717ED98558C1ED82 + 9C9328CD8AE802CE4FB55C89E00B21ECFB295BD98DA3BAC4AF44D9C50449F9E4 + 6B75299F74D9F912FC7DF2909EDDBB76782B9A6B2B24E7332B0A515F9A873AD2 + 714DFE2D91F6593863B152267FE4CEA5B844FD39E7A00ACEDBAD43A6F56A6458 + AE409AD9629C369EFF4CEC993FE8A949B6F35831FA0DC62EE7B9D318B54BF67E + D780BE345FDD14658EA069948F61D2F5BFDFBF3204BCFC7DD8113F0E6F018FA3 + 47D836DD1DECA79F07B2E7FDFEC78D50EBFFE7CEFFF2342FF5FDFF948AD8AFE5 + FBFB9DF9DD3DFFFBBCF2BB7BFE9797CFCF4906040474E577F3FCEF73CBEFE6F9 + 5F788C14DF00F8DF8774E6F3F3BF2DE24C7353C7B9E6FA677EFF7F5EF9D233C0 + 9273CD94474BE333BFFFC3FA271C387040FC8D4367FEE373C08F04F8D9E8EE7C + FFFFABF6977EFFA7F5FFDFFAFEAF357B98CC7E8DCC4D595945396B473B010278 + 0E2AABAA9881A9B1D823945E3F0CF891ED3131627B6DAC65B0DC6F2560C161BD + 4FC09CB0CBD080FD38E0C7C7E7FF68EEBFAFDD20C3F09163585159950C69D9D7 + 5F189715758CDD09B37D29FB4F38B8039CC7F9778E99FEBDF33FB69AE0FC7FC7 + FE793DB8FD373636BE34B8FD731D70FB6F686820D4A39EA3BE5EDCF3EF75CF43 + 7D7D83B07F2E3FD7153F337CD168A90CB5B57522DDF32E7E4699DB3FE7733DD7 + D454A3A6BA06D5FC9C73B5E4ACF38BF8FC3DB77FCEE76D54555929CEED8A9050 + 595529CEE1525F93841DA892DD5789BECDF5C7ED9FFF2E4079795907E8BEACFC + A93AEF0F72C1AA839BC5EFFF4CB7508096CE3CA13F6EFFFCFB65E7FAF3E7CEF2 + FBA5853DF3F77FB6795BF2DFFF11DF748B09459DD0993F63EFDA67FEFECFE79B + 46F3DFFF41614181F8565D5050D81116C8E278F8A2DFFF09B3DDFD97F6FF85FA + C867FEFECF671B47A33BF6A6E16AFCCCDFFFF97ED14874D756757CADF0CDE671 + 42E6AFB4FEC4F70B4708EEB87EE12C7570103BAAA68253C68B9164360BC9E6B3 + 71C6722ED2ACE7939F45FE86C55C1CDD3C169B267E85DE3D9FFEF6705069380A + EEDF4403F9A5CDF51568AEEB049A6F9A08B585D79077421F97F6AF459F5E5D3F + 4244E84F265E351EDD4F434B6E065AF208F7D3F1F05E0A9A6F25A1FE6A349FC8 + D0783D1CB9A1FAB86AB3AE4B1EA749DE870D35687D90859607E70914E665E221 + E5D17C3B190D5763D146FCD6C22C3C2AC8405EA431EC9526E0317F56073F1B2D + F917D09A9F2DF27A947B160FEF9C41E38D78D497DC13F5E07369435509124966 + 293FD1643A1E92FCAD85970897D15644617E8E90E3914C8638D45D8E40CDC530 + 51D7845D9320FDFD8F140B92BFBE0AED45D7887B9570056D944F6BE145D2C739 + 3CBA9726F268BC7992741047BE7615CE184D83F4F73FD2F6CE217E05DA8BAF77 + E01AE545F91474C8C1F320DD3EBC735AE4F388D2A699CC80F4F73FD2A8CD1FD6 + 9513EFAAE04A64E89083F2E03A69792091E3D1BD543CAA2D459AD15448BFFF9D + 369C4AED5C2629B3330AAFC86468CDA336C9CD94B42FF91149BA7F42FAFDEFD4 + CE7168AE29467B8124BDE04821B8E709E7A84F1037371D6DE44BC46D1B05E9F7 + BF24BDF1E41B1562A6B77AB7D04AFE4C9C16CDBF1DDFFF4E6E1B8DA68A07E2DD + DA44F31782A7E16BB508E55F21FDFE17ADF107F9FC77BB5D3EF78342E57F92F5 + 9FA32B06A2ACE02E1A4AEFA0B1EC2E1A4B396E0B3CAA2B938074DE4A7D8FFF5D + 59158DCFCE725FCBF87306FE9359CCF81AC1F28310BE4E8288F5BF2072FDAF02 + FC394C89A03808C756FF04F3E95F62EA77FD25BF3FC7BFFF93FDDB3B4E41DCFE + 3964FF7264FF72384348B390C3690A795C88B61C8E4D9123FBDFC07AF7546713 + FBA8319BBEEAFC2F7C99A3D27C94DECF13FBB57F65FF5768FCB77DCD889FF860 + BD9829ABA630425F8ED2D674DBFE2F592962DAAB2654BE05AB63162CDD78CE4B + DBBFC7BC95B0E96BCDD61052C8165ED6FE93764E26FE142A7F0A4B3799F9D2F6 + 9FB46B0AF167127F26C93FE3A5EDFFF4EE19C43FC5AD87251ACF7E79FBDF351D + CD2C99ADEC9BC4520C66BEB4FD27EE9C823EC4AF64494CE4F592F67F4A672C5E + 79EF33F64AFF4FD929FDF12F6FFFDA23C1B97D09093A7F0AFB6F0E5F84A6F0C5 + 688A5848F70BD07C62019AC2E64B70621E61AE00B7FF188DDFD1B7831FB77594 + B0FFB6645A4B5CF704AE7900575D2974A2F020E10070C501B86C8F96044589FD + 2BFE8ABEFD3E657DFAFD8B456F1C26ECBF8DD660AD2795459AD684F5129C5C8B + 9693EBD012BF869E15D01A4FCF0FC9FE1506827339BC57FD8AB2C27BDDB3FF46 + B2FFEA6AB82CF801BDDFFD17E390FBFD3B663967008215C8D6C9EE6558274118 + B77F8EB564FFF23FC362F60F98FEEBD7822BB5FF541D2DA49B2F451ACDF73274 + CCFF297BE7215077F273E7FF18CB95C236F83AF5AFECFFA2F59AA7E6FFE4BD0B + 44BDBA6FFF0A5DF248215F85DB6F77C75F6EFF3BE73E1E7F532CE7C8F8DD19FF + B9FD9FDA39A92B9F6CBABBE5779EFF05FF6FCCFF89BB3BF36709FBEF6EF9DCFE + 13774D7CCCE7E31FD97F77EB2FB1FF71323EF745B8FD777BFEE3F6BF63CC63FE + 9EC92F6FFF9B473CF6DFF427BEF4FC1FA33EF4B1FFC6C78F979DFFC9BEA4FC04 + EDD16828BBD7FDF249FECEF37F84C6189A3B4BD1547EEF2FEDBFB5B91E4D4D8D + 5DE67FC5498358A0C664446F188E6895DF245026284910A5345802C5C188501A + 02FB850365F33FFFDBFF139307B008235DA49ACC42FABEB9043909ACE4904161 + DA5EEE03CCC02185C178B5F7D3670F934DE774DBFE6F3A28E2F5BE5D0F21A690 + FFFD32F67FD36E5D973C522D24FE7B77C77F6EFFBE6A8FFF9E2FD562A6E07777 + FCE7F69FBC6B72573ED97477C77F6EFF670CA73CE69BBFFCFC9F6AD4993F5DD8 + 7F77EBCFED3FD5B093FCC65385FD77B7FEBC2FA61A3C5E3FA5505EDCFEBB3DFF + 91FDA7ECFCF3319FF27A59FB4FDA36EAF1F84163D1CBCEFFA736FDF1F80CF68E + D12F3DFFC771FFBFE33AB579B8B0FFEED69FFBA2D1EB7E96F1E3360CA5FA77DF + FEF97EE689553FCAF8160B06B348E5DF1147B61EABF4EB63284A10A3F88B0434 + 6645AF1F44EB8481D83CE653C1356006E040E2E38FF6D2B827F1A2349DDF3D2F + 8FBFE2777E7E52B6EEF2A5EF3AE7D799FFACB2FE2ACDB3D23FAF7E7F75FFA23A + BFA87C69BD3AD7EF7FE84FC2FE9D7C91C812F137F3105C295E328F2EDCBF9907 + 7B82FBD2D7FF36FFEF5CFFB5FFFFDAFFFF03FDFF3F61FFFFD6D8F11F18FFFE13 + E3EFCB1746DD4865F9B8674279D99F6CCDC2916CD5BCE13DE5260FDA397BE2C0 + A0D9137E0A919BFCB3D6FCA9BFF4967E937C1E9F63DDE2D16CEDE2D136F2F347 + 982E9A31F8B5A5B386F45AB370941FC52B4BF91B568E7F1A2BC6CB53385875E5 + 84C98413CACBC6B1E5737F674A4BC732B5951356529C9D94BF69CD9427F1C646 + 8529A9840F09911A0A933FD75C378D6D519C25DE539C01619B94AFAD38F349EC + 262C256C2098F3B8ADCAB3FB6C559EF3FA16A599EFD2730CE147297F87AA9C0C + 3AAA725FECD830F7CC0ED5B9EFD27324DDBF42F7F46EAE0EDDCFA670D7F60D73 + B508B26FBAFA9B160AEC9284AEFA1B178EA5D0567FE30205028FFB88E2920903 + E8FE38858C43CA37DCB24C8AB17BB4971DA7F0730AC3F76C5E2A8D77A4E73F09 + FE7BB4974E21300E29DF425741C05C573EC85C47FE5B0A3D291C65A12B4FF1F2 + 63E93998C20914BA9BE9AC665248F9B6461B3856D818AAD8DB1AAA7C4008E371 + 763C9EDF1BAA0C249CA1F79F12981452BECBBECD9FBAECD58A71B6D4FC98C29F + 5CF66E8EF4D8BF8DB9EDD33672B6D4DA4DCFEBE99D3681758694EFE5A0A74AD8 + 4F609C77C45E57C7CB61E7090A4D8ED8EB7D41F72914F622B0CE90F28F79981E + 206C0BF230653E8EBBD9113B5D0A77BD1EE066CC8E1D32730F72379D4B604F42 + CA8FF2B75722B8C5041E60A931DEECD40977167BCC914507382CA4F863917EB6 + EC5990F293C20FBD911C71D88BB8DB321302FB64251EEB911EE73BFB74E4E193 + 4961873E480CF360CF8294CFCB4C8FF37B2D2B31D8343B393490E07B3E29C42D + 23DEFFB394686F9612F36CE005E70CFED3F03F1B05D3043728065A6043B03DBA + CBFBFD77157CF4851CBE7192C3977E4BF09A9F3C5E0FD1C48E3301DDCA63E0C0 + 75F8E7E772F8CA633EBE3EBA106FFAAEC65B915B30F7A40DFC2E25FC651EA346 + 69E2BBC16BF0B5D30A7CE9B60CEFF8AE41BFC8ED78EBB826FE757089E07B1D3D + 02F58D6AD0D2D6C2262D4D686ED612888D8BC1A4493B3078B42ABE3C2C8F8FBD + 96E3CD90B5782B4A1B9FC6EFC4A76E4B057FFDFAB5484A4EC28913C77122EC84 + 40E8F110C15FB2C40CB3E6EF867A9C2D34824CA117628145BEDBF009713F725B + 23F89B376F46406030F4F474C5DFAE1A1AEE11E0FC356BF66395BC95B8E76570 + 38A7F8E0678FC5F8DE579C7D611A1BD5111E1E2D7E5B95FF1DAE9985054CCD2D + 0567C70E4F6CDFEE29EE172F5D8225CB97A2A5AD9529B9E940CE6DBBE06FDDBE + 155E5E87E1EEEE06335353ECB534839D95A9E01819F909F07B0F273BB83BD988 + FBBBA579C8BA7759F0F7EEB5C0BE7D7BC5EF2EEF32D80D553D1B4CDCE08CF12A + AE18AFEC2CC3386527FCA9C4EF9D3043DD09C35749FE2D237EE6487F973E2223 + 4E60E336036CB60A41505A013CE36EE348C2DDA7E045389A701B3E49B982EFEF + EF872DDBB6E188A71B566DD0C5368738846715C12AF42A1C226F3E1F1137059F + FFCDF106B50D88893C0195AD26D8621F07DF33B9D8E59303D3A02B2F84B49F29 + 2A29C2C6CE016BB44DE11D7F0D1EF1776014700916C7AE10AE3E0E8339A47157 + 657C5555655858DB41DBCC03C1A977617DFC9AE09B045E86893F21F0128C0328 + E4A038631E1F70E5FFC46F90FCBB57526232ECB66FFF5BE07C1EF293AF7F079D + F9110107101EE484F01017841EDC8920FDD508DCB90A013B57C277C7521CDDBA + 104737CBE1A8E62CD845FB3CC5CFBC928973B72F222BEF269263FC116DB303D1 + B63A88B6D345A4CD76845B6F819F8906DC762AC13AE1C453FCB30921C8480C45 + 7AD2099C8BF64576881BCE7720D26D1F0E59EAC35257135B54D74137FCF853FC + 480F3B822DC106616ED60875B1428083398EEE3784C98E4D50525809F5F5ABA1 + A5BC063BC2429FE2ABCE1C0195697F4071CA50AC193708AB467D8F9523BFC3F2 + 11DF61F1881F317FC440C80D1F80397FFC00651787A7F8666BE6C254610E4C14 + 668BD0740D61ED1C98ADE571B360B47A2676AF9E0DBDD573B12BD8F729FEBFDB + 7E2B57AEFC4B3C99EE7FB2FCEEC8F4EF96DF545F45A8EC84279F9F7CF7F87D63 + 5DE7B00A0D95B7D1507103F585C968AC294643D53D34563FA0FB42D417A7D0F3 + 5DD497E6A0B1BE5A701EF329CF863A54656F45CD4D479444FC84EA4B86284B98 + 8ACA4C35549E55A1FB2914B787D26CA3F4E58223E3D716A32C7E0CEA4B325073 + CB95CA4A437D510AEA0A9328EE1CEA0B12D0507681DEB953781165712349CE9B + 123E955B796E138A43DE46ED9D2328F467A8BDE546327C85B2C429F44E8DDEBD + 819A3B8751E8C7507DDD8EDE7D89F2E439548F3A34D595A22E3F1675B9A122AC + CAD1431D955D795611D5972D517BDB1315E96B282E89DEE9A0EEFE31D43D8821 + 44A2817453971F8DA2A05EA8CC52476506D5F3D414D4159C44F99985A8BA6888 + EA9B2E283FBD90E2625196349DE217A3FA8A31717AA3E686236AAEDBA224FC73 + 545F3543E9C9B1280EFB82F28EA0F07354A42E17F2F07B5E6E49E4D7288DFE91 + 643A8462E2546669A1A1340BB5F7FC293C8FBABC70BA0F4023B5230FEB486FF5 + C51992F7D4AE4276427DF9D58EF749D45E075118C8282F3594C60C251DF540ED + DDA3A4C71ED466935191B9411247FA2B3AD69B74F916E9D01685010C15599B45 + F9E5C972A8B97D84CA8F24AE37F5A31BA8257DD677B45F5D6E08C5DDA4327D29 + 1F6F4A1781F294A594269CDAAF9EF4B11715298B507D6D1F95F12AE5E14B75FE + 40E8AB324B83E2FA887C8B825F257994294E9BFAD1766ABF5AEA3FD5A8BD1F84 + A2C09E1406A3F8F8C7A20F56A4AD16E9AAAFEE4779D2347A770CC5A11FA186E7 + 13F20EC55B12BF46620B0DB524BF9768F7FAA233C4772559FDA8BF5A50FC2192 + CB56F0B97E1BCA2E8B7EC8EDA5B3FDF0BCAACE6F16FDA2346E14D52D1895E7B7 + 0B5DF1762E4F5E28DAA1F29C06A5AF90D94F73632D93DE8BFA906D709D3471D9 + 7848FDBB89C753282D4796BEAEF205B6DE1D74CDEB695477E0C5699A9A1E119A + 25F250D8D4DC8E462E6F4D11858D92FB4E75EE024A53F72056F4459E17B7E1AA + 9C9D22BE96ECA032B3435F3C9F67E4515F7A01C5C7FAA228F42D1AABF228BD12 + 0A0E53DF4C9113F9959D9A44EDF187182F9A1A1A9EE69765535FEE8D029F9E64 + 1B21A20FF1E7E2D03748AE68E25DA3FE6946B65E88C6A696A7F5519D2FFA0E47 + 43F965F15C579C4AF2E78A718DEBA2A12A4F8C1D9599AA127D75D63B8DB3BCEE + F505A744C8DFF1BECEEB517A72226AF34E90FD84910DF614A8BE6A4E3A6EED52 + FFC2A03EC25E4B22BF107165A767A0C0970994A72E11BA2B8DFE46D82CAF577D + C979343536C9F845C1BD693C62283AFE3AC97A87FAADBA182B45FAF08F84FC15 + E9AB25797AF7A0FB151DED5D2DD37F21D91FD75B5D413CAAAE98509E6F11F71F + 283EF13E8D9171C22ECA1267D198A82BA967477FE1F5E77597828FA90D55F769 + 0CBB41FA2BEDE8A775C23678FB735978BB70BDF0F6E4ED5243B6294063757D71 + BAE057D318C0E5E0F30D8F6FA8CEA57963B0A83FD723EF1F5C8F9DF557484B6A + 211FB51FAF0B8FE3752E4BF893642910BAE07AE27A298DFD49F451C1177597E8 + BBEABCA6E80785C77A8938A1C3884F45BF284B1823D2F0383E67D4179E11FDAB + ECD4047A3716A5F1A3A97DF78A7ECCDB90C7714E79F27434D41450DE5BA94F8C + A6F463C5BBBAFC04E13F54D94F408DDB02D4B8CE478DE30C3CBA7346B62E68CE + 0941B5F32CC93B4AC3D3B6D55774593754187C8E32CDBE28D7FB0895865FA3A5 + E0D263FE391F541AFF20DEF1343C6D6BE9CDA7D61DFC5D43BCE50BD7233C4D5B + 6DC933D3946B113FCAF0857C9EA6B5E4C6FF497E19E7C799FF5BFCB2CDAFA07C + EB5B28DFF26657509C78F717F257EF1F89BA639B50EBAFD2053C8EBFFBCBFAC7 + 98FCFF56FFFF097E63BCC55FF2DB684CEF1C57EB258F2ACBA1641B7D50BEEB0B + 54590D7FCA3EAAAC8689773C4D95C56F68883490BDAF0B50458D0BF94FAEF324 + 38380D0F6F75FD7E524D362D7BEF3217F527745E6ADD5FE9B20C45DB3F45F196 + 8F50BE7F0AD977F7F70D8AB77F8E2A7F4D59FA86246714AABF8547C54FD4D173 + 3D4AF47F44B5978A2CFF9A0863146EEAFF5459E5FBC6A3D271A12CBED46808AA + 4374C573634E188AB74B7E2BBBDC610E2A5C963EC5AF8DB592A569BE9BFE5419 + 65B6D3D17C391AA5A623C06578EA3753AEC4A150E36D4979E70204BFC2654917 + 34661D1365737D3DF59BCB246B99B5E4FCDEC3FB992850E9FB4C7D36A61F45C1 + 86579E7A5762300835E18FFB6A85ED0C2A679A787E947B1EF5271D1EFF6DB4DD + 2C518FA6ECE3E072F3B62C7798FD4C9D541C98870A87B9A80DD9D9E57D7D2AAD + 61DC5781975BA4F58FBF6AFB17DB00B549E7B67B92DBD1167FEBDB1BE74AF1B2 + DFFE3A73FF661EEC09EE4B5FFFDBFCFFDAFF7FEDFFDFB1FFEEF4BF17D9FFFF62 + FFFF4FD8FFBF3576FC07C6BFBF757E00407DD3AD2BF5756713F91F66770B3589 + 61F5CD7977A4CFA88E09427D66F233FFD6B4BDE5111E16E5A3B5FEF1EF37D424 + 45A0363952FA63F32873DE83BACCA467F26B4F47A340E96D2A23F0711C71CB8F + 58897FEFA9ADB909455B2782E47FFA773A2A4A51A83D16058AB4DE3AB8539425 + E147A1487716DA1F3E44F3837B94FF5BA8CB38F584E06DA80C7416E5707EA1F6 + 9F5456E3639994DFC3C3825CD4A5C58BF775E9095D7FA3E3E665D49C3C0ED22D + BDEF49E9FB89F4827F2646C2A1322B021C25F76927655C5EA7720F73B43535A0 + A5BA12856A3F8834F5E7247FD35A9B122B9E2B895BB4735E073FFEB17E13C351 + 1D1F22F4FE30FF3E8A74664AD21F7395F053E3C473D1D60994F777E29EC7F1EB + 517909CA5C0D451E52945A6B8A3425E6CAA49656D4A54AEA5CA84EEB3A4F4B09 + 9F64425B1B2AFC0EE2516951D7BF5796A6D71888D6DA6A5157FE5CEE69217B57 + 1DE9275062B1817476F9711B52FD2B039C449A02C55EA83A7104D571C13299B9 + 4E0B94FB8B387ECFC139325D920EA5F10285B9A47FAEBFDE68CEBD437DA099E6 + B6A9A24F74EBA23EC4DBAD70D350499FE6FDD7650F4AF669A032C845C85AE1EF + 487A38800A5F07827D47D8018A2FB1DA8452FBED425FA23D92225143EDC5DBBD + 8DE4E132B53F7A487824ECE749F0BEC66D4E7A35E7DEA63C22BAFDFB35F5E7F8 + 59F24BB2C727ED9F8AADBF7FBFBDFEDE3D090A0B514FA2FEA5FD373501F1F1ED + 58BCB80D4386B461E4C8360CFFAD15833E6FC1C68D6DC8CE6E17557E96FDDFF0 + 4F869A5A9BC0F9F3EDA8A79C490E549C8CC1D5D5AA38A6790EB367B7C1DABA1D + 45E15DEDFF8E961AE67C550B1F9F7621C3F3ECFFD2C5367CF2491B768FBE8B02 + 9D4532FB77187F1EFAFAFCDFB678BEFD67AF33C6BC992D70746C1772C42EF096 + F4BD3317F15BBF87B89EFCE099F6DF48F61F23E78DC91F35C0D7AB45D43F26B4 + 016BBF2F434DC6699CF4B807F9EFCA519396F8B4FD37362033F52106BFF7107E + D362519B992ADEE727E760E0DB0F71C33B1E81CA69D01D72EF99F6CFB9437F6C + 41F43C5FAA435F99FD57A6246348BF6664AA1E80FFBC9382DFC5FE5D0C71D2E0 + 34860E68414A703E4AACB5BAD87F55EA69C13FAB608570BB7BD8F873216A52E2 + 457F2EF73D88D490420C1BD686ACACF667DA7F694A267E7EE7212E39C7E26EF2 + 2DAACB23DC0F3B8DCAC840384DC9C2AFBF3CE63ECBFED3420A30EBD35A54A524 + A1B9200FFAC3EFE2A0653D3C761762FEFC36DCBDDBFE5CFBAFBE9D0B95358FE0 + 373D5666FF399BAC30E0AD47983AB50D0505EDCFB59BD616883E26FF7D39EEAA + AFEC64FF86885E1A8861835B71D0B00AB73D8251EE735066FFA55E0EB8E01807 + 1DD506CC1FD3840BAA964FD97F757C280AF3DBB06F5FBBB0971D1B9B61BABB19 + 66BB1F4265D5430C233BF2F626BBA86B7BA1FDF3298EEC15274FB60B5BE4484D + 6D4765E5B3EDFFFF03D35D6D33 } end object tmrUploadAll: TTimer Enabled = False Interval = 2000 OnTimer = tmrUploadAllTimer - left = 480 - top = 116 + Left = 480 + Top = 116 end end diff --git a/src/fMain.pas b/src/fMain.pas index f3fbacf..ecfd567 100644 --- a/src/fMain.pas +++ b/src/fMain.pas @@ -81,13 +81,16 @@ type acRemoveDupes: TAction; acMarkAllClubLog: TAction; acMarkAllHrdLog: TAction; + acMarkAllUDPLog: TAction; acMarkAll: TAction; acMarkAlleQSL: TAction; acAutoSizeColumns: TAction; acCreateLoadFilter: TAction; + acCounty: TAction; acUploadAllToLoTW: TAction; acUploadToAll: TAction; acUploadToHrdLog: TAction; + acUploadToUDPLog: TAction; acUploadToClubLog: TAction; acUploadToHamQTH: TAction; acMarkAllHamQTH: TAction; @@ -136,6 +139,8 @@ type lblSumDist: TLabel; lblSumDistances: TLabel; MenuItem1: TMenuItem; + MenuItem2: TMenuItem; + mnuOR: TMenuItem; MenuItemStats: TMenuItem; MenuItem100: TMenuItem; MenuItem101: TMenuItem; @@ -144,6 +149,7 @@ type MenuItem104: TMenuItem; MenuItem105: TMenuItem; MenuItem106: TMenuItem; + MenuItem107: TMenuItem; mnuLoadFilter: TMenuItem; MenuItem89: TMenuItem; mnueQSLView: TMenuItem; @@ -220,7 +226,7 @@ type MenuItem72: TMenuItem; MenuItem76: TMenuItem; MenuItem77: TMenuItem; - MenuItem78: TMenuItem; + mnuShowDetails: TMenuItem; MenuItem79: TMenuItem; mnuSQLConsole: TMenuItem; MenuItem81: TMenuItem; @@ -342,6 +348,7 @@ type procedure acMarkAllExecute(Sender: TObject); procedure acMarkAllHamQTHExecute(Sender: TObject); procedure acMarkAllHrdLogExecute(Sender: TObject); + procedure acMarkAllUDPLogExecute(Sender: TObject); procedure acPnlDetailsExecute(Sender: TObject); procedure acQRZExecute(Sender: TObject); procedure acQSLImageExecute(Sender: TObject); @@ -352,11 +359,13 @@ type procedure acCabrilloExportExecute(Sender : TObject); procedure acSQLExecute(Sender: TObject); procedure acAutoSizeColumnsExecute(Sender: TObject); + procedure acCountyExecute(Sender: TObject); procedure acUploadAllToLoTWExecute(Sender: TObject); procedure acUploadToAllExecute(Sender: TObject); procedure acUploadToClubLogExecute(Sender: TObject); procedure acUploadToHamQTHExecute(Sender: TObject); procedure acUploadToHrdLogExecute(Sender: TObject); + procedure acUploadToUDPLogExecute(Sender: TObject); procedure dbgrdMainColumnMoved(Sender: TObject; FromIndex, ToIndex: Integer ); procedure dbgrdMainColumnSized(Sender: TObject); @@ -392,6 +401,7 @@ type procedure acDOKCfmExecute(Sender: TObject); procedure acWAZCfmExecute(Sender: TObject); procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); + procedure MenuItem107Click(Sender: TObject); procedure mnueQSLViewClick(Sender: TObject); procedure mnuIK3AQRClick(Sender: TObject); procedure mnuHelpIndexClick(Sender: TObject); @@ -403,6 +413,7 @@ type procedure FormActivate(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: word; Shift: TShiftState); procedure mnuOQRSClick(Sender : TObject); + procedure mnuORClick(Sender: TObject); procedure popWebSearchPopup(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure acAboutExecute(Sender: TObject); @@ -482,7 +493,7 @@ uses fNewQSO, fPreferences, dUtils, dData, dDXCC, dDXCluster, fMarkQSL, fDXCCSta fImportLoTWWeb, fLoTWExport, fGroupEdit, fCustomStat, fSQLConsole, fCallAttachment, fEditDetails, fQSLViewer, uMyIni, fRebuildMembStat, fAbout, fBigSquareStat, feQSLUpload, feQSLDownload, fSOTAExport, fEDIExport, fCabrilloExport, fRotControl, - fLogUploadStatus, fExportPref,uVersion; + fLogUploadStatus, fExportPref,uVersion, fCountyStat; procedure TfrmMain.ReloadGrid; begin @@ -565,17 +576,23 @@ begin dlgOpen.DefaultExt := '.tbl'; if dlgOpen.Execute then begin - with TfrmImportProgress.Create(self) do - try - lblComment.Caption := 'Importing DXCC data ...'; - Directory := ExtractFilePath(dlgOpen.FileName); - ImportType := imptImportDXCCTables; - ShowModal - finally - Free - end; - dmDXCC.ReloadDXCCTables; - dmDXCluster.ReloadDXCCTables + if FileExists(dlgOpen.FileName) then //with QT5 opendialog user can enter filename that may not exist + begin + + with TfrmImportProgress.Create(self) do + try + lblComment.Caption := 'Importing DXCC data ...'; + Directory := ExtractFilePath(dlgOpen.FileName); + ImportType := imptImportDXCCTables; + ShowModal + finally + Free + end; + dmDXCC.ReloadDXCCTables; + dmDXCluster.ReloadDXCCTables + end + else + ShowMessage('File not found!'); end else BringToFront @@ -677,6 +694,10 @@ begin end; upHrdLog : begin frmLogUploadStatus.UploadDataToHrdLog; + WhatUpNext := upUDPLog + end; + upUDPLog : begin + frmLogUploadStatus.UploadDataToUDPLog; tmrUploadAll.Enabled := False end; end //case @@ -831,6 +852,11 @@ begin MarkQSLSend('OQRS') end; +procedure TfrmMain.mnuORClick(Sender: TObject); +begin + MarkQSLSend('OR'); +end; + procedure TfrmMain.popWebSearchPopup(Sender: TObject); begin mnueQSLView.Visible := ((pos('E',dmData.qCQRLOG.FieldByName('eqsl_qsl_rcvd').AsString)>0) @@ -935,7 +961,7 @@ begin dmData.RefreshMainDatabase(idx); RefreshQSODXCCCount finally - InRefresh := False + InRefresh := False; end end; @@ -1096,16 +1122,21 @@ begin dlgOpen.DefaultExt := '.csv'; if dlgOpen.Execute then begin - with TfrmImportProgress.Create(self) do - try - lblComment.Caption := 'Importing QSL mangers ...'; - Directory := ExtractFilePath(dlgOpen.FileName); - FileName := dlgOpen.FileName; - ImportType := imptImportQSLMgrs; - ShowModal - finally - Free - end + if FileExists(dlgOpen.FileName) then //with QT5 opendialog user can enter filename that may not exist + begin + with TfrmImportProgress.Create(self) do + try + lblComment.Caption := 'Importing QSL mangers ...'; + Directory := ExtractFilePath(dlgOpen.FileName); + FileName := dlgOpen.FileName; + ImportType := imptImportQSLMgrs; + ShowModal + finally + Free + end + end + else + ShowMessage('File not found!'); end else BringToFront @@ -1115,15 +1146,20 @@ procedure TfrmMain.acImportLoTWADIFExecute(Sender: TObject); begin if dlgOpen.Execute then begin - with TfrmImportProgress.Create(self) do - try - FileName := dlgOpen.FileName; - ImportType := imptImportLoTWAdif; - ShowModal - finally - Free; - acRefreshExecute(nil) - end + if FileExists(dlgOpen.FileName) then //with QT5 opendialog user can enter filename that may not exist + begin + with TfrmImportProgress.Create(self) do + try + FileName := dlgOpen.FileName; + ImportType := imptImportLoTWAdif; + ShowModal + finally + Free; + acRefreshExecute(nil) + end + end + else + ShowMessage('File not found!'); end end; @@ -1283,6 +1319,51 @@ begin end end; +procedure TfrmMain.MenuItem107Click(Sender: TObject); +var + s: PChar; + + Procedure RemoveTriggers; + Begin + dmLogUpload.DisableOnlineLogSupport; + dmLogUpload.EnableOnlineLogSupport; + Application.MessageBox('Triggers removed','Info ...',mb_ok + mb_IconInformation); + end; + +begin + if not (cqrini.ReadBool('OnlineLog','HaUP',False) + or cqrini.ReadBool('OnlineLog','ClUP',False) + or cqrini.ReadBool('OnlineLog','HrUP',False) ) then + Begin + //warn: none of uploads selected + Application.MessageBox('You do not have any log uploads enabled!','Info ...',mb_ok + mb_IconInformation); + exit + end + else + Begin + if not (cqrini.ReadBool('OnlineLog','HaUpOnline',False) + or cqrini.ReadBool('OnlineLog','ClUpOnline',False) + or cqrini.ReadBool('OnlineLog','HrUpOnline',False) ) then + Begin + //Warn: none of online uploads + s:= 'You do not have any immediately uploads active'+LineEnding+LineEnding+ + 'Removing ALL upload triggers MAY GIVE UNEXPECTED RESULTS'+LineEnding+ + 'if you use MORE THAN ONE ONLINE LOG'+LineEnding+LineEnding+ + 'Are you SURE you want to remove ALL upload triggers?'; + if Application.MessageBox(s,'Question ...', mb_YesNo + mb_IconQuestion) = idYes then + RemoveTriggers; + exit; + end; + s:= 'Removing ALL upload triggers MAY GIVE UNEXPECTED RESULTS'+LineEnding+ + 'if you use MORE THAN ONE ONLINE LOG'+LineEnding+LineEnding+ + 'Are you sure you want to remove ALL upload triggers?'; + if Application.MessageBox(s,'Question ...', mb_YesNo + mb_IconQuestion) = idYes then + RemoveTriggers; + exit; + end; +end; + + procedure TfrmMain.mnueQSLViewClick(Sender: TObject); var QSOmode:String; @@ -1399,12 +1480,12 @@ begin if pnlDetails.Visible then begin pnlDetails.Visible := False; - acPnlDetails.Checked := False; + mnuShowDetails.Checked := False; end else begin pnlDetails.Visible := True; - acPnlDetails.Checked := True; + mnuShowDetails.Checked := True; end; end; @@ -1580,6 +1661,11 @@ begin dmLogUpload.MarkAsUploaded(C_HRDLOG) end; +procedure TfrmMain.acMarkAllUDPLogExecute(Sender: TObject); +begin + dmLogUpload.MarkAsUploaded(C_UDPLOG) +end; + procedure TfrmMain.acSQLExecute(Sender: TObject); begin frmSQLConsole := TfrmSQLConsole.Create(self); @@ -1610,6 +1696,16 @@ begin end; end; +procedure TfrmMain.acCountyExecute(Sender: TObject); +begin + frmCountyStat := TfrmCountyStat.Create(frmNewQSO); + try + frmCountyStat.ShowModal + finally + FreeAndNil(frmCountyStat) + end +end; + procedure TfrmMain.acUploadAllToLoTWExecute(Sender: TObject); begin if Application.MessageBox('Do you really want to mark all QSO as uploaded to LoTW?','Question ...',mb_YesNo + mb_IconQuestion) = idYes then @@ -1639,6 +1735,11 @@ begin frmLogUploadStatus.UploadDataToHrdLog end; +procedure TfrmMain.acUploadToUDPLogExecute(Sender: TObject); +begin + frmLogUploadStatus.UploadDataToUDPLog +end; + procedure TfrmMain.dbgrdMainColumnMoved(Sender: TObject; FromIndex, ToIndex: Integer); begin @@ -2030,21 +2131,26 @@ begin dlgOpen.DefaultExt := '.adi'; if dlgOpen.Execute then begin - with TfrmAdifImport.Create(self) do - try - Caption := 'Importing ADIF file ...'; - lblFileName.Caption := dlgOpen.FileName; - lblErrors.Caption := '0'; - lblCount.Caption := '0'; - lblFilteredOutCount.Caption := '0'; - ShowModal - finally - Free - end; - acRefreshExecute(nil) - end - else - BringToFront + if FileExists(dlgOpen.FileName) then //with QT5 opendialog user can enter filename that may not exist + begin + with TfrmAdifImport.Create(self) do + try + Caption := 'Importing ADIF file ...'; + lblFileName.Caption := dlgOpen.FileName; + lblErrors.Caption := '0'; + lblCount.Caption := '0'; + lblFilteredOutCount.Caption := '0'; + ShowModal + finally + Free + end; + acRefreshExecute(nil); + end + else + ShowMessage('File not found!'); + end + else + BringToFront end; procedure TfrmMain.acQSL_RExecute(Sender: TObject); @@ -2066,6 +2172,9 @@ var begin dmData.Q.Close; dmData.trQ.StartTransaction; + if cqrini.ReadBool('OnlineLog','IgnoreQSL',False) then + dmLogUpload.DisableOnlineLogSupport; + if dbgrdMain.SelectedRows.Count < 2 then begin MarkRec @@ -2083,7 +2192,10 @@ begin dmData.qCQRLOG.Close; dmData.RefreshMainDatabase(idx); dbgrdMain.SelectedRows.Clear; - RefreshQSODXCCCount + RefreshQSODXCCCount; + + if cqrini.ReadBool('OnlineLog','IgnoreQSL',False) then + dmLogUpload.EnableOnlineLogSupport; end; procedure TfrmMain.acQSL_SExecute(Sender: TObject); @@ -2206,6 +2318,7 @@ begin CheckAttachment; mnuShowButtons.Checked := pnlButtons.Visible; mnuShowToolBar.Checked := toolMain.Visible; + mnuShowDetails.Checked := pnlDetails.Visible; //Sets AutoSizeColumns to saved value acAutoSizeColumnsExecute(nil); end; @@ -2448,6 +2561,9 @@ begin if dmData.trQ.Active then dmData.trQ.Rollback; dmData.trQ.StartTransaction; + if cqrini.ReadBool('OnlineLog','IgnoreQSL',False) then + dmLogUpload.DisableOnlineLogSupport; + if dbgrdMain.SelectedRows.Count = 0 then begin MarkRec @@ -2464,7 +2580,10 @@ begin dmData.qCQRLOG.Close; dbgrdMain.SelectedRows.Clear; - dmData.RefreshMainDatabase(idx) + dmData.RefreshMainDatabase(idx); + + if cqrini.ReadBool('OnlineLog','IgnoreQSL',False) then + dmLogUpload.EnableOnlineLogSupport; end; procedure TfrmMain.ChechkSelRecords; diff --git a/src/fMarkQSL.pas b/src/fMarkQSL.pas index 7331d43..db30606 100644 --- a/src/fMarkQSL.pas +++ b/src/fMarkQSL.pas @@ -46,7 +46,7 @@ var implementation {$R *.lfm} -uses dUtils, dData, dDXCC; +uses dUtils, dData, dDXCC, UMyIni, dLogUpload; procedure TfrmMarkQSL.FormShow(Sender: TObject); begin @@ -76,6 +76,10 @@ begin Application.MessageBox('First, you must filter QSO which you want to mark!','Info...',mb_ok+mb_IconInformation); exit end; + + if cqrini.ReadBool('OnlineLog','IgnoreQSL',False) then + dmLogUpload.DisableOnlineLogSupport; + if Pos('WHERE',tmp) = 0 then exit; tmp := copy(tmp,Pos('WHERE',tmp)+5,Length(tmp) - Pos('WHERE',tmp)); if pos('ORDER',tmp) > 0 then @@ -245,7 +249,10 @@ begin end; dmData.qCQRLOG.Next end; - lblProg.Caption := 'Complete!' + lblProg.Caption := 'Complete!'; + + if cqrini.ReadBool('OnlineLog','IgnoreQSL',False) then + dmLogUpload.EnableOnlineLogSupport; end; procedure TfrmMarkQSL.cmbTypeChange(Sender: TObject); diff --git a/src/fMonWsjtx.lfm b/src/fMonWsjtx.lfm index 78dd8a4..470ca91 100644 --- a/src/fMonWsjtx.lfm +++ b/src/fMonWsjtx.lfm @@ -1,7 +1,7 @@ object frmMonWsjtx: TfrmMonWsjtx - Left = 183 + Left = 12 Height = 362 - Top = 70 + Top = 58 Width = 582 AllowDropFiles = True Caption = 'Wsjt-x CQ-monitor' @@ -227,7 +227,7 @@ object frmMonWsjtx: TfrmMonWsjtx AnchorSideTop.Side = asrBottom Left = 52 Height = 15 - Top = 32 + Top = 34 Width = 479 BorderSpacing.Top = 5 Caption = 'Yoy may now minimize this window. Printing back to Wsjt-x Band Activity' @@ -392,14 +392,14 @@ object frmMonWsjtx: TfrmMonWsjtx AnchorSideLeft.Control = Owner AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = Owner - Left = 86 + Left = 60 Height = 31 Top = 0 - Width = 411 + Width = 462 AutoSize = True BorderWidth = 3 ClientHeight = 31 - ClientWidth = 411 + ClientWidth = 462 TabOrder = 5 Visible = False OnClick = pnlSelectsClick @@ -480,14 +480,28 @@ object frmMonWsjtx: TfrmMonWsjtx OnChange = chkStopTxChange TabOrder = 4 end - object chkDx: TCheckBox + object chkUState: TCheckBox AnchorSideLeft.Control = chkStopTx AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = pnlSelects - AnchorSideTop.Side = asrCenter + AnchorSideBottom.Side = asrCenter Left = 315 Height = 23 Top = 4 + Width = 49 + BorderSpacing.Right = 2 + Caption = 'USt' + OnChange = chkUStateChange + TabOrder = 6 + end + object chkDx: TCheckBox + AnchorSideLeft.Control = chkUState + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = pnlSelects + AnchorSideTop.Side = asrCenter + Left = 366 + Height = 23 + Top = 4 Width = 44 Caption = 'Dx' TabOrder = 5 @@ -499,7 +513,7 @@ object frmMonWsjtx: TfrmMonWsjtx AnchorSideTop.Side = asrCenter AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom - Left = 371 + Left = 422 Height = 15 Top = 8 Width = 36 @@ -617,4 +631,10 @@ object frmMonWsjtx: TfrmMonWsjtx Left = 224 Top = 144 end + object tmrFCC: TTimer + Enabled = False + OnTimer = tmrFCCTimer + Left = 104 + Top = 144 + end end diff --git a/src/fMonWsjtx.pas b/src/fMonWsjtx.pas index 19cff55..c0942b9 100644 --- a/src/fMonWsjtx.pas +++ b/src/fMonWsjtx.pas @@ -7,7 +7,7 @@ interface uses Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, maskedit, ColorBox, Menus, ExtCtrls, Grids, StrUtils, - process, Types; + process, Types, iniFiles, LCLType, ComCtrls, dateutils, BaseUnix; type @@ -23,6 +23,7 @@ type chknoHistory: TCheckBox; chknoTxt: TCheckBox; chkStopTx: TCheckBox; + chkUState: TCheckBox; EditAlert: TEdit; edtFollow: TEdit; edtFollowCall: TEdit; @@ -31,6 +32,7 @@ type lblMode: TLabel; pnlTrigPop: TPanel; pnlSelects: TPanel; + pnlChecks: TPanel; pnlFollow: TPanel; pnlAlert: TPanel; sgMonitor: TStringGrid; @@ -50,6 +52,7 @@ type tbmyAlrt: TToggleBox; tbFollow: TToggleBox; tbTCAlert: TToggleBox; + tmrFCC: TTimer; tmrFollow: TTimer; tmrCqPeriod: TTimer; procedure btFtxtNameClick(Sender: TObject); @@ -59,6 +62,7 @@ type procedure chknoHistoryChange(Sender: TObject); procedure chkMapChange(Sender: TObject); procedure chkStopTxChange(Sender: TObject); + procedure chkUStateChange(Sender: TObject); procedure cmAnyClick(Sender: TObject); procedure cmBandClick(Sender: TObject); procedure cmCqDxClick(Sender: TObject); @@ -90,8 +94,13 @@ type procedure tbmyAlrtChange(Sender: TObject); procedure tbTCAlertChange(Sender: TObject); procedure tmrCqPeriodTimer(Sender: TObject); + procedure tmrFCCTimer(Sender: TObject); procedure tmrFollowTimer(Sender: TObject); private + DPstarted : integer; //fcc states download process status + DProcess: TProcess; + tfIn,tfOUT,dupOut: TextFile; + FccEn :TStringList; procedure AddColorStr(s: string; const col: TColor = clBlack; c:integer =0;r:integer =-1); procedure RunVA(Afile: string); procedure scrollSgMonitor; @@ -99,7 +108,7 @@ type procedure PrintCall(Pcall: string;PCB:Boolean=false); // prints colored call procedure PrintLoc(PLoc, tTa, mT: string;PCB:Boolean=false); // prints colored loc function isItACall(Call: string): boolean; - procedure SendReply(reply: string); + procedure SendQsoInit(reply: string); procedure TryCallAlert(S: string); procedure TryAlerts; procedure SaveFormPos(FormMode: string); @@ -109,15 +118,19 @@ type procedure Setbitmap(bm:TBitmap;col:Tcolor); procedure SetAllbitmaps; procedure setDefaultColorSgMonitorAttributes; - procedure setMonitorColumnHW; + procedure SetsgMonitorColumnHW; procedure scrollSgMonitorToLastLine; function LineFilter(L: string):string; procedure PrintDecodedMessage; function getCurMode(sMode: String): String; procedure extcqprint; + procedure BuildFccState; + procedure downLoadInit; + function UsCallState(call:string;var StatClr:TColor):string; { private declarations } public - DblClickCall :string; //callsign that is called by doubleclick + CanCloseFCCProcess :boolean; + DblClickCall :string; //callsign that is called by doubleclick procedure clearSgMonitor; procedure AddCqCallMessage(Time,mode,WsjtxBand,Message,Reply:string; Df,Sr:integer); procedure AddMyCallMessage(Time,mode,WsjtxBand,Message,Reply:string; Df,Sr:integer); @@ -125,10 +138,12 @@ type procedure AddOtherMessage(Time,Message, Reply: string;Df,Sr:integer); procedure NewBandMode(Band, Mode: string); procedure SendFreeText(MyText: string); + procedure SendConfigure(Mode,Submode,DXCall,DXGrid:string;FreqTol,TRPeriod,RxDF:Dword;Fmode,GMsg:boolean); procedure ColorBack(Myitem:string;Mycolor:Tcolor;bkg:Boolean=false); procedure BufDebug(MyHeader,MyBuf:string); function HexStrToStr(const HexStr: string): string; function StrToHexStr(const S: string): string; + procedure CloseFCCProcess; { public declarations } end; @@ -142,6 +157,13 @@ const bmW = 10; bmH = 10; + C_STATEFILE = 'ctyfiles/fcc_states.tab'; + C_STATE_SOURCE = 'ctyfiles/EN.dat'; + C_URL = 'ftp://wirelessftp.fcc.gov/pub/uls/complete/l_amat.zip'; + //C_URL ='http://localhost/l_amat.zip'; //for testing; + C_MYZIP = 'ctyfiles/l_amat.zip'; + C_MY_SCRIPT = 'ctyfiles/fcc_get.sh'; + //DL7OAP: define type for grid coloring type TsgMonitorAttributes = Record // saves the attributes textcolor, backgroundcolor for stringgrid @@ -192,19 +214,25 @@ var sgMonitorAttributes : array [0..7,0..MaxLinesSgMonitor+2] of TsgMonitorAttributes; LocalDbg : boolean; + FCC_Address :String; + UState : TStringList; + URState : TStringList; // runtime found calls=states expecting them occur many times. faster to find. + //crit : TRTLCriticalSection; + + implementation {$R *.lfm} { TfrmMonWsjtx } -uses fNewQSO, dData, dUtils, dDXCC, fWorkedGrids, uMyIni, dDXCluster; +uses fNewQSO, dData, dUtils, dDXCC, fWorkedGrids, uMyIni, dDXCluster,fProgress; procedure TfrmMonWsjtx.RunVA(Afile: string); const cAlert = 'voice_keyer/voice_alert.sh'; var - AProcess: TProcess; + AProcess: TProcess; begin if not FileExists(dmData.HomeDir + cAlert) then exit; @@ -218,7 +246,7 @@ begin if LocalDbg then Writeln('AProcess.Executable: ',AProcess.Executable,' Parameters: ',AProcess.Parameters.Text); AProcess.Execute finally - AProcess.Free + FreeAndNil(Aprocess); end; end; @@ -282,6 +310,7 @@ var begin for l:= sgMonitor.rowcount - 1 downto 0 do sgMonitor.DeleteRow(l); + SetsgMonitorColumnHW; setDefaultColorSgMonitorAttributes; if LocalDbg then Writeln('sgMonitor clear finished'); @@ -332,7 +361,7 @@ begin end; end; -procedure TfrmMonWsjtx.setMonitorColumnHW; +procedure TfrmMonWsjtx.SetsgMonitorColumnHW; Var FSz : integer; i : integer; @@ -346,7 +375,7 @@ Begin end; end; -procedure TfrmMonWsjtx.SendReply(reply: string); +procedure TfrmMonWsjtx.SendQsoInit(reply: string); var i: byte; begin @@ -373,7 +402,7 @@ begin BufDebug('Array gives '+INtToStr(length(sgMonitor.Cells[8,sgMonitor.row]))+' :', HexStrToStr(sgMonitor.Cells[8,sgMonitor.row])); end; - SendReply(HexStrToStr(sgMonitor.Cells[8,sgMonitor.row])); + SendQsoInit(HexStrToStr(sgMonitor.Cells[8,sgMonitor.row])); frmNewQSO.GetCallInfo(DblClickCall,CurMode,sgMonitor.Cells[1,sgMonitor.row]); frmNewQSO.SendToBack; end; @@ -387,6 +416,9 @@ begin SaveFormPos('Cq'); //to be same as intial save dmUtils.SaveWindowPos(frmMonWsjtx); + FreeAndNil(UState); + FreeAndNil(URState); + //DoneCriticalsection(crit) end; procedure TfrmMonWsjtx.Setbitmap(bm: TBitmap; col: Tcolor); @@ -525,11 +557,73 @@ begin end; end; +procedure TfrmMonWsjtx.SendConfigure(Mode,Submode,DXCall,DXGrid:string;FreqTol,TRPeriod,RxDF:Dword;Fmode,GMsg:boolean); +var + i: byte; + +procedure AddCint(c:Dword); +begin + RepBuf := RepBuf + chr(hi(hi(c))) + chr(lo(hi(c))) + chr(hi(lo(c))) + chr(lo(lo(c))); +end; +procedure AddString(s:string); //strings here can not be over 256 length here +var l: integer; +Begin + l:= length(s); + if l=0 then + RepBuf := RepBuf +#$FF+#$FF+#$FF+#$FF + else + RepBuf := RepBuf +#0 + #0 +#0 + chr(l) + Uppercase(s); +end; +procedure AddBool(b:boolean); +Begin + if b then + RepBuf := RepBuf +#1 + else + RepBuf := RepBuf +#0; +end; + + +begin + if frmNewQSO.RepHead <> '' then + begin + RepBuf := frmNewQSO.RepHead; + RepBuf[12] := #15; //Send config 15 + + AddString(Mode); + AddCint(Freqtol); + AddString(Submode); + AddBool(Fmode); + AddCint(TRPeriod); + AddCint(RxDF); + AddString(DXCall); + AddString(DXGrid); + AddBool(GMsg); + + frmNewQSO.Wsjtxsock.SendString(RepBuf); + //BufDebug('UDP#15',RepBuf); + end; + { + * Mode utf8 + * Frequency Tolerance quint32 + * Submode utf8 + * Fast Mode bool + * T/R Period quint32 + * Rx DF quint32 + * DX Call utf8 + * DX Grid utf8 + * Generate Messages bool + * For utf8 string + * fields an empty value implies no change, for the quint32 Rx DF + * and Frequency Tolerance fields the maximum quint32 value + * implies no change. + } +end; + procedure TfrmMonWsjtx.edtFollowDblClick(Sender: TObject); begin if LocalDbg then Writeln('Clicked follow line gives: ', RepFlw); - SendReply(RepFlw); + SendQsoInit(RepFlw); end; @@ -553,7 +647,6 @@ begin Columns.Items[1].maxSize := 1; Columns.Items[1].minSize := 1; end; - setMonitorColumnHW; clearSgMonitor; end; end; @@ -590,8 +683,6 @@ begin end; procedure TfrmMonWsjtx.chkMapChange(Sender: TObject); -var - i: integer; begin sgMonitor.Visible:= not(chknoTxt.Checked and not chkMap.Checked); lblInfo.Visible := not sgMonitor.Visible; @@ -605,8 +696,7 @@ begin if chkMap.Checked then begin //Map //write width/height CQ read width Map - if Sender <> frmMonWsjtx then - SaveFormPos('Cq'); //no save from init + if Sender <> frmMonWsjtx then SaveFormPos('Cq'); //no save from init LoadFormPos('Map'); LockFlw := True; cbflw.Checked := False; @@ -624,14 +714,15 @@ begin //map mode allows text printing. Printing stays on when return to monitor mode. chknoHistory.Visible := False; sgMonitor.Columns.Items[0].Visible:= false; - sgMonitor.Columns.Items[1].Visible:= false; - sgMonitor.Columns.Items[7].Visible:= false; + sgMonitor.Columns.Items[1].Visible:= chkdB.Checked; + sgMonitor.Columns.Items[7].Visible:= true; + sgMonitor.Columns.Items[6].MinSize:=2; //map mode -> US state + sgMonitor.Columns.Items[6].MaxSize:=2; end else begin //Cq //write width/height Map read width CQ - if Sender <> frmMonWsjtx then - SaveFormPos('Map'); //no save from init + if Sender <> frmMonWsjtx then SaveFormPos('Map'); //no save from init LoadFormPos('Cq'); cbflw.Checked := cqrini.ReadBool('MonWsjtx', 'FollowShow', False); tbFollow.Checked := cqrini.ReadBool('MonWsjtx', 'Follow', False); @@ -643,6 +734,8 @@ begin sgMonitor.Columns.Items[0].Visible:= true; sgMonitor.Columns.Items[1].Visible:= true; sgMonitor.Columns.Items[7].Visible:= true; + sgMonitor.Columns.Items[6].MinSize:=15; + sgMonitor.Columns.Items[6].MaxSize:=15; end; clearSgMonitor; end; @@ -658,6 +751,94 @@ begin end; end; +procedure TfrmMonWsjtx.chkUStateChange(Sender: TObject); + +var + StateFile, + SourceFile, + msg , + call, + HasState : String; + StateSourceIn : Textfile; + BuildFile : TIniFile; + i,c :integer; +begin + cqrini.WriteBool('MonWsjtx', 'UStates', chkUState.Checked); + if chkUState.Checked then + Begin + if LocalDbg then Writeln('State check activated'); + if UState.Count = 0 then //load file + Begin + StateFile := dmData.HomeDir+C_STATEFILE; + SourceFile := dmData.HomeDir+C_STATE_SOURCE; + if FileExists(StateFile) then + Begin + if (DaysBetween(now,FileDateTodateTime(FileAge(StateFile)))) > 90 then + Begin //over 3 month old + msg := 'Source file '+StateFile+' is over 90 days old.'+#13+#13+'Should it be updated?'; + if Application.MessageBox(PChar(msg),'Question ...',MB_ICONQUESTION + MB_YESNO) = IDYES Then + Begin + DeleteFile(StateFile); + if FileExists(SourceFile) then DeleteFile(SourceFile); + chkUStateChange(nil); //recall + if not FileExists(StateFile) then //when back here should have new StateFile + begin + chkUState.Checked := false; + exit; + end; + end; + end; + if LocalDbg then Writeln('loading...'); + UState.LoadFromFile(StateFile); + if LocalDbg then writeln(UState.Count); + end + else // no file: inform and ask if load it.uncheck USStete and return + begin + chkUState.Checked := false; + if FileExists(SourceFile) then + Begin + msg := 'Source file '+SourceFile+' found!'+#13+#13+'Should the '+StateFile+#13+'to be built from source file ?'; + if Application.MessageBox(PChar(msg),'Question ...',MB_ICONQUESTION + MB_YESNO) = IDYES Then + Begin + if LocalDbg then Writeln('Build from source EN.dat'); + Application.ProcessMessages; + BuildFccState; + chkUState.Checked := True; //causes recall + exit; + end + else + Begin + if LocalDbg then Writeln('Build from source denied!'); + exit; + end; + end + else + Begin + msg := 'Neither '+StateFile+#13+ + 'nor '+SourceFile+' found!'+#13+#13+ + 'Try to load zipped source of USCalls from fcc ?'+#13+#13+ + 'Command line tools "wget" and "unzip" must be available.'; + if Application.MessageBox(PChar(msg),'Question ...',MB_ICONQUESTION + MB_YESNO) = IDYES Then + Begin + if LocalDbg then Writeln('Load and unzip from fcc'); + msg:='If you have overseas connection to fcc.gov' +#13+ + 'loading may take over 5 minutes!'; + if MessageDlg('Info',PChar(msg), mtConfirmation,[mbCancel,mbOk ],0) = mrCancel then exit; + downLoadInit; + exit; + end + else + Begin + if LocalDbg then Writeln('load from fcc denied!'); + exit; + end; + end; + end; + end + else if LocalDbg then Writeln('Already loaded:',UState.Count); + end; +end; + procedure TfrmMonWsjtx.cbflwChange(Sender: TObject); begin if not LockFlw then @@ -858,6 +1039,58 @@ begin sgMonitor.Repaint; end; +procedure TfrmMonWsjtx.tmrFCCTimer(Sender: TObject); +Var + sz : integer; +begin + tmrFcc.Enabled:=False; + + if DProcess <> nil then + if LocalDbg then Writeln('Dprocess 1 running'); + + if DPstarted = 1 then + begin + if (FileExists(dmData.HomeDir+C_MYZIP)) and not (FileExists(dmData.HomeDir+C_STATE_SOURCE)) then + Begin + sz:=FileSize(dmData.HomeDir+C_MYZIP) div 1000000; + frmProgress.lblInfo.Caption:= 'Loading from fcc.gov '+IntToStr(sz)+'M'; + frmProgress.DoPos(sz); + if LocalDbg then Writeln('Loading from fcc'); + end + else + begin + if LocalDbg then Writeln('unzip ... '); + frmProgress.lblInfo.Caption:= 'Unzip ...'; + frmProgress.DoJump(1); + inc(DPStarted); + end; + tmrFcc.Enabled:=True; + end + + else + + Begin + if LocalDbg then Writeln('inc DPstarted'); + inc(DPstarted); + if DPstarted > 3 then + begin + if LocalDbg then Writeln('DPstarted > 3'); + tmrFcc.Enabled:=False; + frmProgress.lblInfo.Caption:= 'Done!'; + for sz:=0 to 100 do + Begin + frmProgress.ShowOnTop; + sleep(10); + Application.ProcessMessages; + end; + frmProgress.Hide; + DPstarted:=0; + chkUState.Checked:=True; //causes recall + end + else tmrFcc.Enabled:=True; + end; + +end; procedure TfrmMonWsjtx.tmrFollowTimer(Sender: TObject); begin tmrFollow.Enabled := False; @@ -893,7 +1126,6 @@ begin edtFollow.Font.Size := popFontDlg.Font.Size; sgMonitor.Font.Name := popFontDlg.Font.Name; sgMonitor.Font.Size := popFontDlg.Font.Size; - setMonitorColumnHW; clearSgMonitor; edtFollow.Text := ''; end; @@ -907,15 +1139,21 @@ begin LastWsjtLineTime := ''; DblClickCall :=''; + //InitCriticalSection(crit); + UState := TStringList.Create; + URState := TStringList.Create; + cmHere.Bitmap := TBitmap.Create; cmBand.Bitmap := TBitmap.Create; cmAny.Bitmap := TBitmap.Create; cmNever.Bitmap := TBitmap.Create; cmCqDX.Bitmap := TBitmap.Create; + CanCloseFCCProcess := True; //there is no process yet //DL7OAP setDefaultColorSgMonitorAttributes; sgMonitor.DefaultDrawing:= True; // setting to true to use DrawCell-Event for coloring + DPstarted :=0; end; procedure TfrmMonWsjtx.FormDropFiles(Sender: TObject; @@ -965,6 +1203,7 @@ begin wkdany := StringToColor(cqrini.ReadString('MonWsjtx', 'wkdany', '$00000080')); wkdnever := StringToColor(cqrini.ReadString('MonWsjtx', 'wkdnever', '$00008000')); extCqCall := StringToColor(cqrini.ReadString('MonWsjtx', 'extCqCall', '$00FF6B00')); + chkUState.Checked:= cqrini.ReadBool('MonWsjtx', 'UStates', False); SetAllbitmaps; edtFollow.Font.Name := sgMonitor.Font.Name; edtFollow.Font.Size := sgMonitor.Font.Size; @@ -979,7 +1218,7 @@ begin chkMapChange(frmMonWsjtx); btFtxtName.Visible := False; //DL7OAP - setMonitorColumnHW; + SetsgMonitorColumnHW; sgMonitor.FocusRectVisible:=false; // no red dot line in stringgrid chknoHistoryChange(nil); // sure to get history settings right pnlTrigPopMouseEnter(nil); //starts with panel visible, @@ -989,6 +1228,7 @@ begin LocalDbg := dmData.DebugLevel >= 1 ; if dmData.DebugLevel < 0 then LocalDbg := LocalDbg or ((abs(dmData.DebugLevel) and 4) = 4 ); + end; procedure TfrmMonWsjtx.NewBandMode(Band, Mode: string); @@ -1078,6 +1318,10 @@ var msgList: TStringList; index: integer; ClLine : char; + adif:integer; + pfx:string = ''; + msgRes:string = ''; + StatClr: Tcolor; begin Message := LineFilter(Message); @@ -1106,10 +1350,10 @@ begin if chkMap.Checked then begin CqPeriodTimerStart; - if LocalDbg then + //if LocalDbg then Writeln('Other line:', Message); if (pos('RR73',Message)= length(Message)-3) - or (pos('73',Message)= length(Message)-1) then + or (pos(' 73',Message)= length(Message)-2) then ClLine:='*' else ClLine:=')'; @@ -1157,13 +1401,15 @@ begin Begin if LocalDbg then Writeln('---O msgtime is:', msgTime,' LastWsjtlinetime is:',LastWsjtLineTime); + if chkdB.Checked then sgMonitor.Columns.Items[1].Visible:= true + else sgMonitor.Columns.Items[1].Visible:= false; clearSgMonitor; end; LastWsjtLineTime := msgTime; sgMonitor.InsertRowWithValues(sgMonitor.rowcount , [msgtime]); //Snr - if chkdB.Checked then sgMonitor.Columns.Items[1].Visible:= true - else sgMonitor.Columns.Items[1].Visible:= false; + //X if chkdB.Checked then sgMonitor.Columns.Items[1].Visible:= true + // else sgMonitor.Columns.Items[1].Visible:= false; sgMonitor.Cells[1, sgMonitor.rowCount-1]:= IntToStr(Snr); //PadLeft(IntToStr(Snr),3); @@ -1183,6 +1429,18 @@ begin //PCallColor closes parenthesis(not-CQ ind) with same color as it was opened with callsign AddColorStr(ClLine, clBlack,6, sgMonitor.rowCount-1);//make in-qso indicator stop + //here + if (chkUState.Checked) then + adif:= dmDXCC.id_country(msgCall, Now(), pfx, msgRes); + case adif of + 6,9,103,110,166,202,285,291: + Begin + StatClr :=clBlack; + msgRes := UsCallState(msgCall,StatClr); + if (StatClr<>clBlack) then //there is US state to print to Map + AddColorStr(msgRes, StatClr,7,sgMonitor.rowCount-1); + end; + end; if LocalDbg then Begin Writeln('All written in Addother. Next alerts'); @@ -1344,10 +1602,9 @@ procedure TfrmMonWsjtx.PrintLoc(PLoc, tTa, mT: string;PCB:Boolean=false); var L1,L2:String; //locator main p :integer = 0; //locator sub Mycolor :Tcolor = clBlack; //color main. color sub sub is same, or else wkdnever +MyMcolor :Tcolor = clBlack; //color main. color sub sub is same, or else wkdnever Begin - L1:= UpperCase(copy(PLoc, 1, 2)); - L2:= copy(PLoc, 3, 2); if (PLoc = '----') then begin p:=1; @@ -1361,6 +1618,8 @@ Begin end else Begin + L1:= UpperCase(copy(PLoc, 1, 2)); + L2:= copy(PLoc, 3, 2); case frmWorkedGrids.WkdGrid(PLoc, CurBand, CurMode) of //returns 0=not wkd // 1=full grid this band and mode @@ -1424,7 +1683,37 @@ Begin end else begin - AddColorStr(L1, Mycolor,4,sgMonitor.rowCount-1); + case frmWorkedGrids.WkdMainGrid(PLoc, CurBand, CurMode) of + //returns 0=not wkd + // 1=main grid this band and mode + // 2=main grid this band but NOT this mode + // 3=main grid any other band/mode + 0:Begin + //not wkd + MyMcolor := wkdnever; + end; + 1:Begin + //grid wkd PrintLoc + L1:= lowerCase(L1); + MyMcolor := wkdhere; + end; + 2:Begin + //grid wkd band + MyMcolor := wkdband; + end; + 3:Begin + //grid wkd any + MyMcolor := wkdany; + end; + else + Begin + L1:= lowerCase(L1);//should not happen + p:=1; + MyMcolor := clBlack; + end; + end; //case + AddColorStr(L1, MyMcolor,4,sgMonitor.rowCount-1); + if p=1 then AddColorStr(L2, Mycolor,5,sgMonitor.rowCount-1) else AddColorStr(L2, wkdnever,5,sgMonitor.rowCount-1); end; @@ -1775,8 +2064,10 @@ begin end; procedure TfrmMonWsjtx.PrintDecodedMessage; Var - i : integer; - freq :string; + i : integer; + freq,le : string; +StatClr : Tcolor; + begin cont := ''; country := ''; @@ -1819,6 +2110,14 @@ begin end else PrintCall(msgCall,chkCbCQ.Checked); + + le:=''; + if cqrini.ReadBool('wsjt', 'chkLoTWeQSL', False) then + Begin + le:=' '; + if dmData.UsesLotw(msgCall) then le[1]:='L'; + if dmData.UseseQSL(msgCall) then le[2]:='E'; + end; PrintLoc(msgLocator, timeToAlert, msgTime,chkCbCQ.Checked); @@ -1829,7 +2128,16 @@ begin if (pos(',', msgRes)) > 0 then msgRes := copy(msgRes, 1, pos(',', msgRes) - 1); //case of USA print it only. Forget state. It is not shown full and may be bogus - if pos('USA',upcase(msgRes))=1 then msgRes := 'USA'; + StatClr :=clBlack; + if pos('USA',upcase(msgRes))=1 then + begin + msgRes := 'USA'; + if chkUState.Checked then + msgRes := 'USA '+UsCallState(msgCall,StatClr); + end; + + if (chkMap.Checked and (StatClr<>clBlack)) then //there is US state to print to Map + AddColorStr(copy(msgRes,5,2), StatClr,6,sgMonitor.rowCount-1); if LocalDbg then Writeln('My continent is:', mycont, ' His continent is:', cont); @@ -1837,7 +2145,7 @@ begin if CqDir <> '' then if ((mycont <> '') and (cont <> '')) then //we can do some comparisons of continents - begin + begin if not dmUtils.IsHeDx(msgCall,CqDir) then //I'm not DX for caller: color to warn directed call //CQ NOT directed to my continent: color to warn directed call @@ -1845,6 +2153,10 @@ begin end else // should be ok to answer this directed cq if ((not chkMap.Checked) and (not chkCbCQ.Checked)) then + //AddColorStr(' ' + copy(PadRight(msgRes, CountryLen), 1, CountryLen) + ' ', StatClr,6, sgMonitor.rowCount-1); + //space prefix is for what? forgot that + //AddColorStr(copy(PadRight(msgRes, CountryLen), 1, CountryLen) + ' ', StatClr,6, sgMonitor.rowCount-1); + AddColorStr(' ' + copy(PadRight(msgRes, CountryLen), 1, CountryLen) + ' ', clBlack,6, sgMonitor.rowCount-1) else begin @@ -1855,26 +2167,29 @@ begin // should be ok to answer this is not directed cq if ((not chkMap.Checked) and (not chkCbCQ.Checked)) then Begin - AddColorStr(copy(PadRight(msgRes, CountryLen), 1, CountryLen)+' ', clBlack,6, sgMonitor.rowCount-1); + AddColorStr(copy(PadRight(msgRes, CountryLen), 1, CountryLen)+' ', StatClr,6, sgMonitor.rowCount-1); end; + + + if (not chkMap.Checked) then begin freq := dmUtils.FreqFromBand(CurBand, CurMode); - msgRes := dmDXCC.DXCCInfo(dxcc_number_adif, freq, CurMode, i); //wkd info + msgRes := StringReplace(dmDXCC.DXCCInfo(dxcc_number_adif, freq, CurMode, i),'!','',[rfReplaceAll]); //wkd info if LocalDbg then Writeln('Looking this>', msgRes[1], '< from:', msgRes); case msgRes[1] of - 'U': AddColorStr(cont + ':' + msgRes, wkdhere,7 ,sgMonitor.rowCount-1); //Unknown - 'C': AddColorStr(cont + ':' + msgRes, wkdAny,7 ,sgMonitor.rowCount-1); //Confirmed - 'Q': AddColorStr(cont + ':' + msgRes, clTeal,7 ,sgMonitor.rowCount-1); //Qsl needed - 'N': AddColorStr(cont + ':' + msgRes, wkdnever,7 ,sgMonitor.rowCount-1); //New something + 'U': AddColorStr(le+cont + ':' + msgRes, wkdhere,7 ,sgMonitor.rowCount-1); //Unknown + 'C': AddColorStr(le+cont + ':' + msgRes, wkdAny,7 ,sgMonitor.rowCount-1); //Confirmed + 'Q': AddColorStr(le+cont + ':' + msgRes, clTeal,7 ,sgMonitor.rowCount-1); //Qsl needed + 'N': AddColorStr(le+cont + ':' + msgRes, wkdnever,7 ,sgMonitor.rowCount-1); //New something else AddColorStr(msgRes, clBlack,7 ,sgMonitor.rowCount-1); //something else...can't be end; - end; //Map mode + end; //not Map mode if not (chkCbCQ.Checked or chknoTxt.Checked) then Begin @@ -1884,8 +2199,65 @@ begin end; end;//printing out line -procedure TfrmMonWsjtx.extcqprint; +function TfrmMonWsjtx.UsCallState(call:string;var StatClr:TColor):string; +var + us:integer; + Stat:string; +begin + Result:=''; + //EnterCriticalsection(crit); + try + us:= URState.IndexOfName(msgCall); //seek runtime list first + if us >= 0 then + Begin + Stat := URState.ValueFromIndex[us]; + if LocalDbg then Writeln('State found from runtime stringlist'); + end + else + Begin + us:= UState.IndexOfName(msgCall); // seek from fcc data + if us >= 0 then + begin + Stat := UState.ValueFromIndex[us]; + URState.Add(msgCall+'='+Stat); //put to runtime list + if LocalDbg then Writeln('State found from fcc stringlist, added to runtime'); + end + else Stat:=''; + end; + if Stat <>'' then + begin + us := frmWorkedGrids.WkdState(Stat,Curband, Curmode); + case us of + 0: Begin + StatClr :=wkdnever; + end; + 1: Begin + Stat := LowerCase(Stat); + StatClr :=wkdhere; + end; + 2: Begin + StatClr :=wkdband; + end; + 3: Begin + StatClr :=wkdany; + end; + else + Begin + StatClr :=clBlack; + end; + //should not happen + end; + + if LocalDbg then Writeln(' State WB4 status is: ',us); + Result:=Stat; + end + finally + //LeaveCriticalsection(crit) + end; + +end; +procedure TfrmMonWsjtx.extcqprint; begin if (chknoTxt.Checked or chkCbCQ.Checked) then ColorBack('CQ '+CqDir, extCqCall) else @@ -1895,7 +2267,7 @@ procedure TfrmMonWsjtx.extcqprint; AddColorStr(copy(PadRight(msgRes, CountryLen), 1, CountryLen - 6)+' CQ:'+CqDir, extCqCall,6,sgMonitor.rowCount-1); end else - AddColorStr(' '+CqDir, extCqCall,6,sgMonitor.rowCount-1); + AddColorStr('>'+CqDir, extCqCall,7,sgMonitor.rowCount-1) end; end; @@ -1922,6 +2294,190 @@ function TfrmMonWsjtx.getCurMode(sMode: String): String; chr(96) : getCurMode := 'FST4'; // ` end; end; +procedure TfrmMonWsjtx.BuildFccState; +var + s,t: string; + call,state,ids,Ocall,Ostate :string; + id,Oid,r,p,d,i,x : longint; + +begin + Ocall:='call'; + Ostate:='state'; + Oid:=0; + r:=0; + p:=0; + d:=0; + x:=0; + frmProgress.Show; + frmProgress.DoInit(40,10); + frmProgress.DoStep('Reading file...'); + sleep(100); + Application.ProcessMessages; + AssignFile(dupOut,dmData.HomeDir+'ctyfiles/fcc_rejects.txt'); + AssignFile(tfIn,dmData.HomeDir+C_STATE_SOURCE); + try + reset(tfIn); + rewrite(dupOut); + FccEn := TStringList.Create; + FccEn.Sorted:=False; + FccEn.Duplicates:=dupAccept; + if LocalDbg then Writeln('Reading ',dmData.HomeDir+C_STATE_SOURCE,' ...'); + + while not eof(tfIn) do + begin + readln(tfIn, s); + inc(r); + call := ExtractDelimited(5,s,['|']); + ids := ExtractDelimited(2,s,['|']); + state := ExtractDelimited(18,s,['|']); + if ( (call<>'') and (state<>'') and (ids <>'')) then FccEn.Add(call+'-'+ids+'='+state) + else + begin + writeln(dupOut, call+'-'+ids+'='+state); + inc(x); + end; + end; + except + on E: EInOutError do + writeln('File handling error occurred. Details: ', E.Message); + end; + CloseFile(tfIn); + CloseFile(dupOut); + if LocalDbg then Writeln('Sorting...'); + frmProgress.DoStep('Sorting...(May take some time!)'); + FccEn.Sort; + frmProgress.DoStep('Writing file...'); + if LocalDbg then Writeln('Writing '+dmData.HomeDir+C_STATEFILE ); + + AssignFile(tfOut, dmData.HomeDir+C_STATEFILE ); + AssignFile(dupOut,dmData.HomeDir+'ctyfiles/fcc_dupes.txt'); + try + reset(tfIn); + rewrite(tfOut); + rewrite(dupOut); + for i:=0 to FccEn.Count-1 do + begin + s:= FccEn.Strings[i]; + t := ExtractWord(1,s,['=']); + call := ExtractWord(1,t,['-']); + id := StrToIntDef(ExtractWord(2,t,['-']),-1); + state := ExtractWord(2,s,['=']); + + if ( (call<>'') and (state<>'') and (id >=0)) then + begin + if call<> Ocall then + Begin + writeln(tfOut,Ocall,'=',Ostate);//write old call=state if next call is different + Ocall:=call; + Oid := id; + Ostate := state; + inc(p); + end + else + Begin //if they are same calls + writeln(dupOut,Ocall,'=',Ostate);//write old call=state to dupe list + inc(d); + if id > Oid then //if id is bigger than old id save call and state as old + //should remain finally the higest id call to print + //needs one extra line to end of file to get all printed + begin + Ocall:=call; + Oid := id; + Ostate := state; + end; + + end; + end; + end; + frmProgress.DoStep('Done !'); + writeln(tfOut,Ocall,'=',Ostate); //last remaining + FreeAndNil(FccEn); + CloseFile(tfin); + CloseFile(tfOut); + CloseFile(dupOut); + except + on E: EInOutError do + writeln('File handling error occurred. Details: ', E.Message); + end; + if LocalDbg then Writeln('Read: ',r,' lines.'); + if LocalDbg then Writeln('Rejected: ',x,' lines.'); + if LocalDbg then Writeln('Written: ',p,' lines.'); + if LocalDbg then Writeln('Duplicates: ',d,' lines.'); + frmProgress.Hide; + CanCloseFCCProcess:=true; +end; + +procedure TfrmMonWsjtx.downLoadInit; +var + f :textfile; + + begin + CanCloseFCCProcess:=false; + FCC_Address:=cqrini.ReadString('MonWsjtx', 'FCC_Addr', C_URL); + if InputQuery('FCC Address check','Using Address (change if needed):', FCC_Address) then + begin + cqrini.WriteString('MonWsjtx', 'FCC_Addr',FCC_Address); + if LocalDbg then Writeln('Saved FCC Address:',FCC_Address); + end; + if LocalDbg then Writeln('downloadinit start'); + frmProgress.Show; + frmProgress.DoInit(155,1); + frmProgress.DoStep('Loading from fcc.gov'); + + if FileExists(dmData.HomeDir+C_MYZIP) then DeleteFile(dmData.HomeDir+C_MYZIP); + + if FileExists(dmData.HomeDir+C_MY_SCRIPT) then DeleteFile( dmData.HomeDir+C_MY_SCRIPT); + + if LocalDbg then Writeln('Next create script wget + unzip'); + AssignFile(f,dmData.HomeDir+C_MY_SCRIPT); + ReWrite(f); + Writeln(f,'#!/bin/bash'); + Writeln(f,'wget -q -nd -O'+dmData.HomeDir+C_MYZIP+' '+trim(FCC_Address)); + Writeln(f,'unzip -q -o -d'+dmData.HomeDir+'ctyfiles/ '+dmData.HomeDir+C_MYZIP+' EN.dat'); + Writeln(f,'exit'); + CloseFile(f); + if LocalDbg then Writeln('Next chmod script'); + fpChmod (dmData.HomeDir+C_MY_SCRIPT,&777); + + + if LocalDbg then Writeln('Next run script'); + + DProcess := TProcess.Create(nil); + tmrFCC.Enabled:=True; + DPstarted:=1; + + try + try + if LocalDbg then Writeln('Next DProcess run script'); + DProcess.Executable := '/bin/bash'; + DProcess.Parameters.Add(dmData.HomeDir+C_MY_SCRIPT); + if LocalDbg then Writeln('DProcess.Executable: ',DProcess.Executable,' Parameters: ',DProcess.Parameters.Text); + DProcess.Execute; + finally + FreeAndNil(Dprocess); + end; + except + on E :EExternal do + writeln('Error Details: ', E.Message); + end; + +end; +Procedure TfrmMonWsjtx.CloseFCCProcess; +begin + //here force close threads and others + if DProcess<>nil then FreeAndNil(DProcess); + if FccEn<>nil then + Begin + FreeAndNil(FccEn); + try + CloseFile(tfin); + CloseFile(tfOut); + CloseFile(dupOut); + finally + end; + end; + frmProgress.Hide; +end; initialization diff --git a/src/fNewLog.lfm b/src/fNewLog.lfm index 5ab323d..e531575 100644 --- a/src/fNewLog.lfm +++ b/src/fNewLog.lfm @@ -1,66 +1,124 @@ object frmNewLog: TfrmNewLog Left = 390 - Height = 118 + Height = 138 Top = 273 - Width = 303 + Width = 308 BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'frmNewLog' - ClientHeight = 118 - ClientWidth = 303 + ClientHeight = 138 + ClientWidth = 308 OnClose = FormClose OnShow = FormShow Position = poMainFormCenter - LCLVersion = '1.6.0.4' - object Label1: TLabel - Left = 16 + LCLVersion = '2.2.6.0' + object lblLogNr: TLabel + AnchorSideLeft.Control = Owner + AnchorSideTop.Control = Owner + Left = 12 Height = 17 - Top = 9 - Width = 87 + Top = 6 + Width = 81 + Alignment = taRightJustify + BorderSpacing.Left = 12 + BorderSpacing.Top = 6 Caption = 'Log number:' ParentColor = False end object edtLogNR: TEdit - Left = 16 - Height = 27 - Top = 33 + AnchorSideLeft.Control = lblLogNr + AnchorSideTop.Control = lblLogNr + AnchorSideTop.Side = asrBottom + Left = 12 + Height = 34 + Hint = 'GIve unused log number, or use suggested.' + Top = 23 Width = 46 MaxLength = 3 + NumbersOnly = True + ParentShowHint = False + ShowHint = True TabOrder = 0 end - object Label2: TLabel - Left = 16 + object lblLogName: TLabel + AnchorSideLeft.Control = edtLogNR + AnchorSideTop.Control = edtLogNR + AnchorSideTop.Side = asrBottom + Left = 12 Height = 17 - Top = 65 - Width = 71 + Top = 63 + Width = 68 + BorderSpacing.Top = 6 Caption = 'Log name:' ParentColor = False end object edtLogName: TEdit - Left = 16 - Height = 27 - Top = 86 + AnchorSideLeft.Control = lblLogName + AnchorSideTop.Control = lblLogName + AnchorSideTop.Side = asrBottom + Left = 12 + Height = 34 + Hint = 'Give name for new log.' + Top = 80 Width = 184 MaxLength = 50 + ParentShowHint = False + ShowHint = True TabOrder = 1 end object btnOK: TButton + AnchorSideTop.Control = Owner + AnchorSideRight.Control = Owner Left = 224 Height = 25 - Top = 9 + Top = 6 Width = 75 + Anchors = [akTop] + BorderSpacing.Top = 6 + BorderSpacing.Right = 12 Caption = 'OK' OnClick = btnOKClick TabOrder = 2 end - object Button2: TButton + object btnCancel: TButton + AnchorSideLeft.Control = btnOK + AnchorSideTop.Control = btnOK + AnchorSideTop.Side = asrBottom Left = 224 Height = 25 - Top = 42 + Top = 37 Width = 75 + BorderSpacing.Top = 6 Cancel = True Caption = 'Cancel' ModalResult = 2 TabOrder = 3 end + object lblLogCpyNR: TLabel + AnchorSideLeft.Control = lblLogNr + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = lblLogNr + Left = 111 + Height = 17 + Top = 6 + Width = 98 + BorderSpacing.Left = 18 + Caption = 'Copy Cfg from:' + ParentColor = False + end + object edtLogCpyNR: TEdit + AnchorSideLeft.Control = lblLogCpyNR + AnchorSideTop.Control = lblLogCpyNR + AnchorSideTop.Side = asrBottom + Left = 111 + Height = 34 + Hint = 'GIve existing log number to copy new log configuration from.'#10'(Configurations are log based)' + Top = 23 + Width = 46 + MaxLength = 3 + NumbersOnly = True + ParentShowHint = False + ShowHint = True + TabOrder = 4 + end end diff --git a/src/fNewLog.pas b/src/fNewLog.pas index d655997..abaf8ec 100644 --- a/src/fNewLog.pas +++ b/src/fNewLog.pas @@ -14,11 +14,13 @@ type TfrmNewLog = class(TForm) btnOK: TButton; - Button2: TButton; + btnCancel: TButton; edtLogName: TEdit; edtLogNR: TEdit; - Label1: TLabel; - Label2: TLabel; + edtLogCpyNR: TEdit; + lblLogCpyNR: TLabel; + lblLogNr: TLabel; + lblLogName: TLabel; procedure btnOKClick(Sender: TObject); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormShow(Sender: TObject); @@ -54,7 +56,7 @@ end; procedure TfrmNewLog.btnOKClick(Sender: TObject); var - nr : Integer; + nr,cnr : integer; begin if edtLogNR.Enabled then begin @@ -63,11 +65,25 @@ begin Application.MessageBox('Please enter correct log number!','Info ...', mb_ok + mb_IconInformation); exit end; + if edtLogCpyNR.Text<>'' then + Begin + if not TryStrToInt(edtLogCpyNR.Text,cnr) then + begin + Application.MessageBox('Please enter correct log number to copy from!','Info ...', mb_ok + mb_IconInformation); + exit + end; + end; if dmData.LogExists(nr) then begin - Application.MessageBox('Log with this number already exists!','Info ...', mb_ok + mb_IconInformation); + Application.MessageBox(PChar(Ansistring('Log number '+ inttostr(nr)+' already exists!')),'Info ...', mb_ok + mb_IconInformation); exit - end + end; + if (edtLogCpyNR.Text<>'') then + if not dmData.LogExists(cnr) then + begin + Application.MessageBox(PChar(Ansistring('Log '+inttostr(cnr)+' does not exist for copy config from!')),'Info ...', mb_ok + mb_IconInformation); + exit + end end; ModalResult := mrOK end; diff --git a/src/fNewQSO.lfm b/src/fNewQSO.lfm index 62cde40..4514a53 100644 --- a/src/fNewQSO.lfm +++ b/src/fNewQSO.lfm @@ -1,7 +1,7 @@ object frmNewQSO: TfrmNewQSO - Left = 244 + Left = 0 Height = 709 - Top = 66 + Top = 0 Width = 1032 HelpType = htKeyword HelpKeyword = 'help/index.html' @@ -2138,7 +2138,7 @@ object frmNewQSO: TfrmNewQSO OnKeyUp = FormKeyUp OnShow = FormShow OnWindowStateChange = FormWindowStateChange - LCLVersion = '2.0.12.0' + LCLVersion = '2.2.6.0' object pnlAll: TPanel AnchorSideTop.Control = dbgrdQSOBefore AnchorSideTop.Side = asrBottom @@ -2157,26 +2157,26 @@ object frmNewQSO: TfrmNewQSO AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 1 - Height = 532 + Height = 531 Top = 35 Width = 759 Align = alClient BorderSpacing.Bottom = 2 BevelOuter = bvNone - ClientHeight = 532 + ClientHeight = 531 ClientWidth = 759 TabOrder = 0 object pnlQSOinput: TPanel AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 0 - Height = 532 + Height = 531 Top = 0 Width = 759 Align = alClient BorderSpacing.InnerBorder = 2 BevelOuter = bvNone - ClientHeight = 532 + ClientHeight = 531 ClientWidth = 759 ParentShowHint = False TabOrder = 0 @@ -2185,8 +2185,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblDate AnchorSideBottom.Side = asrBottom Left = 259 - Height = 15 - Top = 215 + Height = 17 + Top = 227 Width = 135 Caption = 'Comment to callsign' Layout = tlBottom @@ -2198,8 +2198,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblName AnchorSideTop.Side = asrCenter Left = 109 - Height = 15 - Top = 56 + Height = 17 + Top = 59 Width = 28 Caption = 'QTH' ParentColor = False @@ -2210,8 +2210,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = edtCall AnchorSideTop.Side = asrBottom Left = 12 - Height = 15 - Top = 56 + Height = 17 + Top = 59 Width = 39 BorderSpacing.Top = 3 Caption = 'Name' @@ -2223,7 +2223,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblCall AnchorSideTop.Side = asrCenter Left = 445 - Height = 15 + Height = 17 Top = 3 Width = 57 Caption = 'RST rcvd' @@ -2235,7 +2235,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblCall AnchorSideTop.Side = asrCenter Left = 353 - Height = 15 + Height = 17 Top = 3 Width = 57 Caption = 'RST sent' @@ -2246,7 +2246,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideLeft.Control = pnlQSOinput AnchorSideTop.Control = pnlQSOinput Left = 12 - Height = 15 + Height = 17 Top = 3 Width = 25 BorderSpacing.Left = 12 @@ -2260,7 +2260,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblCall AnchorSideTop.Side = asrCenter Left = 132 - Height = 15 + Height = 17 Top = 3 Width = 67 Caption = 'Frequency' @@ -2272,7 +2272,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblCall AnchorSideTop.Side = asrCenter Left = 237 - Height = 15 + Height = 17 Top = 3 Width = 36 Caption = 'Mode' @@ -2283,8 +2283,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideLeft.Control = edtEndTime AnchorSideTop.Control = lblDate Left = 179 - Height = 15 - Top = 215 + Height = 17 + Top = 227 Width = 24 Caption = '&End' FocusControl = edtEndTime @@ -2295,8 +2295,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideLeft.Control = edtStartTime AnchorSideTop.Control = lblDate Left = 118 - Height = 15 - Top = 215 + Height = 17 + Top = 227 Width = 31 Caption = '&Start' FocusControl = edtStartTime @@ -2308,8 +2308,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = edtDXCCRef AnchorSideTop.Side = asrBottom Left = 12 - Height = 15 - Top = 215 + Height = 17 + Top = 227 Width = 31 BorderSpacing.Top = 3 Caption = 'Date' @@ -2321,8 +2321,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblName AnchorSideTop.Side = asrCenter Left = 250 - Height = 15 - Top = 56 + Height = 17 + Top = 59 Width = 33 Caption = 'GRID' ParentColor = False @@ -2333,8 +2333,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblName AnchorSideTop.Side = asrCenter Left = 327 - Height = 15 - Top = 56 + Height = 17 + Top = 59 Width = 30 Caption = 'PWR' ParentColor = False @@ -2345,8 +2345,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblName AnchorSideTop.Side = asrCenter Left = 387 - Height = 15 - Top = 56 + Height = 17 + Top = 59 Width = 40 Caption = 'QSL_S' ParentColor = False @@ -2357,8 +2357,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblName AnchorSideTop.Side = asrCenter Left = 461 - Height = 15 - Top = 56 + Height = 17 + Top = 59 Width = 41 Caption = 'QSL_R' ParentColor = False @@ -2369,8 +2369,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = edtName AnchorSideTop.Side = asrBottom Left = 12 - Height = 15 - Top = 109 + Height = 17 + Top = 115 Width = 22 BorderSpacing.Top = 3 Caption = 'ITU' @@ -2382,8 +2382,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblItuEdit AnchorSideTop.Side = asrCenter Left = 392 - Height = 15 - Top = 109 + Height = 17 + Top = 115 Width = 41 Caption = 'Award' ParentColor = False @@ -2394,8 +2394,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = edtITU AnchorSideTop.Side = asrBottom Left = 12 - Height = 15 - Top = 162 + Height = 17 + Top = 171 Width = 62 BorderSpacing.Top = 3 Caption = 'DXCC ref.' @@ -2407,8 +2407,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblItuEdit AnchorSideTop.Side = asrCenter Left = 59 - Height = 15 - Top = 109 + Height = 17 + Top = 115 Width = 31 Caption = 'WAZ' ParentColor = False @@ -2419,8 +2419,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblItuEdit AnchorSideTop.Side = asrCenter Left = 106 - Height = 15 - Top = 109 + Height = 17 + Top = 115 Width = 31 Caption = 'IOTA' ParentColor = False @@ -2431,8 +2431,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblItuEdit AnchorSideTop.Side = asrCenter Left = 259 - Height = 15 - Top = 109 + Height = 17 + Top = 115 Width = 46 Caption = 'County' ParentColor = False @@ -2443,8 +2443,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblDXCCRef AnchorSideTop.Side = asrCenter Left = 107 - Height = 15 - Top = 162 + Height = 17 + Top = 171 Width = 113 Caption = 'Comment to QSO' ParentColor = False @@ -2455,8 +2455,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblDXCCRef AnchorSideTop.Side = asrCenter Left = 402 - Height = 15 - Top = 162 + Height = 17 + Top = 171 Width = 51 Caption = 'QSL VIA' ParentColor = False @@ -2468,8 +2468,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideBottom.Control = mComment AnchorSideBottom.Side = asrBottom Left = 12 - Height = 15 - Top = 309 + Height = 17 + Top = 321 Width = 71 Anchors = [akLeft, akBottom] Caption = 'QSO takes ' @@ -2482,8 +2482,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideLeft.Control = edtQSL_VIA AnchorSideTop.Control = lblDate Left = 402 - Height = 15 - Top = 215 + Height = 17 + Top = 227 Width = 133 Caption = 'QSL manager found!' Font.Color = clGreen @@ -2498,8 +2498,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblItuEdit AnchorSideTop.Side = asrCenter Left = 211 - Height = 15 - Top = 109 + Height = 17 + Top = 115 Width = 34 BorderSpacing.Left = 5 Caption = 'State' @@ -2512,8 +2512,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblDXCCRef AnchorSideTop.Side = asrBottom Left = 12 - Height = 33 - Top = 179 + Height = 34 + Top = 190 Width = 64 BorderSpacing.Top = 2 CharCase = ecUppercase @@ -2531,7 +2531,7 @@ object frmNewQSO: TfrmNewQSO Left = 259 Height = 92 Hint = 'Comment/Remark to the callsign, max length 256' - Top = 232 + Top = 246 Width = 276 BorderSpacing.Top = 2 BorderSpacing.Right = 6 @@ -2552,9 +2552,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = edtName AnchorSideTop.Side = asrCenter Left = 109 - Height = 33 + Height = 34 Hint = 'QTH, max length 60' - Top = 73 + Top = 78 Width = 136 BorderSpacing.Left = 5 BorderSpacing.Top = 2 @@ -2571,9 +2571,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblName AnchorSideTop.Side = asrBottom Left = 12 - Height = 33 + Height = 34 Hint = 'Name, max length 40' - Top = 73 + Top = 78 Width = 92 BorderSpacing.Top = 2 MaxLength = 40 @@ -2590,9 +2590,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = edtCall AnchorSideTop.Side = asrCenter Left = 445 - Height = 33 + Height = 34 Hint = 'RST received, max length 20' - Top = 20 + Top = 22 Width = 86 BorderSpacing.Left = 6 BorderSpacing.Top = 2 @@ -2611,9 +2611,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = edtCall AnchorSideTop.Side = asrCenter Left = 353 - Height = 33 + Height = 34 Hint = 'RST sent, max length 20' - Top = 20 + Top = 22 Width = 86 BorderSpacing.Left = 5 BorderSpacing.Top = 2 @@ -2631,9 +2631,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblCall AnchorSideTop.Side = asrBottom Left = 12 - Height = 33 + Height = 34 Hint = 'callsign, max length 20' - Top = 20 + Top = 22 Width = 115 BorderSpacing.Top = 2 CharCase = ecUppercase @@ -2653,9 +2653,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = edtCall AnchorSideTop.Side = asrCenter Left = 237 - Height = 33 + Height = 34 Hint = 'mode, max length 12' - Top = 20 + Top = 22 Width = 111 AutoComplete = True AutoCompleteText = [cbactEnabled, cbactEndOfLineComplete, cbactSearchAscending] @@ -2705,9 +2705,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = edtName AnchorSideTop.Side = asrCenter Left = 250 - Height = 33 + Height = 34 Hint = 'Grid/Locator, max length 10' - Top = 73 + Top = 78 Width = 72 BorderSpacing.Left = 5 BorderSpacing.Top = 2 @@ -2727,9 +2727,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = edtName AnchorSideTop.Side = asrCenter Left = 327 - Height = 33 + Height = 34 Hint = 'Output power, max length 10' - Top = 73 + Top = 78 Width = 55 BorderSpacing.Left = 5 BorderSpacing.Top = 2 @@ -2747,8 +2747,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = edtName AnchorSideTop.Side = asrCenter Left = 387 - Height = 33 - Top = 73 + Height = 34 + Top = 78 Width = 69 AutoComplete = True AutoCompleteText = [cbactEnabled, cbactEndOfLineComplete, cbactSearchAscending] @@ -2781,8 +2781,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = edtName AnchorSideTop.Side = asrCenter Left = 461 - Height = 33 - Top = 73 + Height = 34 + Top = 78 Width = 69 AutoComplete = True AutoCompleteText = [cbactEnabled, cbactEndOfLineComplete, cbactSearchAscending] @@ -2807,9 +2807,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblItuEdit AnchorSideTop.Side = asrBottom Left = 12 - Height = 33 + Height = 34 Hint = 'ITU, must be a number (integer)' - Top = 126 + Top = 134 Width = 42 BorderSpacing.Top = 2 CharCase = ecUppercase @@ -2826,9 +2826,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblAward AnchorSideTop.Side = asrBottom Left = 392 - Height = 33 + Height = 34 Hint = 'Award, max length 50' - Top = 126 + Top = 134 Width = 140 BorderSpacing.Left = 5 BorderSpacing.Top = 2 @@ -2846,9 +2846,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblWazEdit AnchorSideTop.Side = asrBottom Left = 59 - Height = 33 + Height = 34 Hint = 'ITU, must be a number (integer)' - Top = 126 + Top = 134 Width = 42 HelpType = htKeyword BorderSpacing.Left = 5 @@ -2867,9 +2867,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblCounty AnchorSideTop.Side = asrBottom Left = 259 - Height = 33 + Height = 34 Hint = 'County, max length 30' - Top = 126 + Top = 134 Width = 128 BorderSpacing.Left = 53 BorderSpacing.Top = 2 @@ -2887,8 +2887,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = edtCall AnchorSideTop.Side = asrCenter Left = 132 - Height = 33 - Top = 20 + Height = 34 + Top = 22 Width = 100 AutoComplete = True AutoCompleteText = [cbactEnabled, cbactEndOfLineComplete, cbactSearchAscending] @@ -2907,9 +2907,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblQSLVia AnchorSideTop.Side = asrBottom Left = 402 - Height = 33 + Height = 34 Hint = 'QSl via/QSL Manager, max length 30' - Top = 179 + Top = 190 Width = 96 BorderSpacing.Left = 5 BorderSpacing.Top = 2 @@ -2928,7 +2928,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Side = asrBottom Left = 78 Height = 27 - Top = 179 + Top = 190 Width = 24 BorderSpacing.Left = 2 BorderSpacing.Top = 2 @@ -2944,7 +2944,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Side = asrBottom Left = 500 Height = 27 - Top = 179 + Top = 190 Width = 24 BorderSpacing.Left = 2 BorderSpacing.Top = 2 @@ -2959,11 +2959,12 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 12 - Height = 33 - Top = 232 + Height = 34 + Top = 246 Width = 100 BorderSpacing.Top = 2 MaxLength = 10 + OnChange = edtDateChange OnEnter = edtDateEnter OnExit = edtDateExit OnKeyDown = edtDateKeyDown @@ -2977,12 +2978,13 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 118 - Height = 33 - Top = 232 + Height = 34 + Top = 246 Width = 55 BorderSpacing.Left = 6 BorderSpacing.Top = 2 MaxLength = 5 + OnChange = edtStartTimeChange OnEnter = edtStartTimeEnter OnExit = edtStartTimeExit OnKeyDown = edtStartTimeKeyDown @@ -2996,12 +2998,13 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 179 - Height = 33 - Top = 232 + Height = 34 + Top = 246 Width = 55 BorderSpacing.Left = 6 BorderSpacing.Top = 2 MaxLength = 5 + OnChange = edtEndTimeChange OnEnter = edtEndTimeEnter OnExit = edtEndTimeExit OnKeyDown = edtEndTimeKeyDown @@ -3014,9 +3017,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblIOTA AnchorSideTop.Side = asrBottom Left = 106 - Height = 33 + Height = 34 Hint = 'IOTA, max length 6' - Top = 126 + Top = 134 Width = 100 BorderSpacing.Left = 5 BorderSpacing.Top = 2 @@ -3037,9 +3040,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblCommentToQSO AnchorSideTop.Side = asrBottom Left = 107 - Height = 33 + Height = 34 Hint = 'Comment/Remarks, max length 200' - Top = 179 + Top = 190 Width = 290 BorderSpacing.Left = 5 BorderSpacing.Top = 2 @@ -3055,9 +3058,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = cmbIOTA Left = 211 - Height = 33 + Height = 34 Hint = 'State, max length 4' - Top = 126 + Top = 134 Width = 42 BorderSpacing.Left = 5 CharCase = ecUppercase @@ -3075,13 +3078,13 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Side = asrCenter AnchorSideRight.Control = cmbMode AnchorSideRight.Side = asrBottom - Left = 285 + Left = 292 Height = 23 - Top = -1 - Width = 63 + Top = 0 + Width = 56 Anchors = [akTop, akRight] BorderSpacing.Left = 4 - Caption = 'AUTO' + Caption = 'Auto' Checked = True OnChange = chkAutoModeChange State = cbChecked @@ -3094,11 +3097,13 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Side = asrCenter Left = 237 Height = 20 - Top = 238 + Top = 253 Width = 20 Action = acRefreshTime AutoSize = True BorderSpacing.Left = 3 + Images = imgMain + ImageIndex = 15 ShowHint = True ParentShowHint = False end @@ -3108,26 +3113,56 @@ object frmNewQSO: TfrmNewQSO AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 0 - Height = 178 - Top = 354 + Height = 163 + Top = 368 Width = 759 - ActivePage = tabDXCCStat + ActivePage = tabCallStat Align = alBottom Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Top = 3 TabIndex = 1 TabOrder = 27 + OnChange = pgDetailsChange object tabDXCCStat: TTabSheet AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Caption = 'DXCC statistic' - ClientHeight = 147 + ClientHeight = 132 ClientWidth = 749 object sgrdStatistic: TStringGrid AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 0 - Height = 147 + Height = 132 + Top = 0 + Width = 749 + Align = alClient + AutoFillColumns = True + ColCount = 2 + DefaultColWidth = 35 + FixedCols = 0 + FixedRows = 0 + ParentFont = False + RowCount = 4 + TabOrder = 0 + TitleFont.Color = clBlue + TitleFont.Height = 8 + TitleStyle = tsNative + ColWidths = ( + 373 + 374 + ) + end + end + object tabCallStat: TTabSheet + Caption = 'Call statistic' + ClientHeight = 132 + ClientWidth = 749 + object sgrdCallStatistic: TStringGrid + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Side = asrBottom + Left = 0 + Height = 132 Top = 0 Width = 749 Align = alClient @@ -3151,15 +3186,15 @@ object frmNewQSO: TfrmNewQSO object tabSatellite: TTabSheet AnchorSideBottom.Side = asrBottom Caption = 'Satellite' - ClientHeight = 147 + ClientHeight = 132 ClientWidth = 749 object cmbPropagation: TComboBox AnchorSideLeft.Control = lblStatellite AnchorSideTop.Control = lblPropagation AnchorSideTop.Side = asrBottom Left = 6 - Height = 32 - Top = 80 + Height = 33 + Top = 85 Width = 272 BorderSpacing.Top = 3 ItemHeight = 0 @@ -3174,8 +3209,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = cmbSatellite AnchorSideTop.Side = asrBottom Left = 6 - Height = 15 - Top = 62 + Height = 17 + Top = 65 Width = 78 BorderSpacing.Top = 6 Caption = 'Propagation' @@ -3186,7 +3221,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideLeft.Control = tabSatellite AnchorSideTop.Control = tabSatellite Left = 6 - Height = 15 + Height = 17 Top = 6 Width = 54 BorderSpacing.Left = 6 @@ -3200,8 +3235,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblStatellite AnchorSideTop.Side = asrBottom Left = 6 - Height = 32 - Top = 24 + Height = 33 + Top = 26 Width = 272 BorderSpacing.Top = 3 ItemHeight = 0 @@ -3216,7 +3251,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblStatellite AnchorSideTop.Side = asrCenter Left = 290 - Height = 15 + Height = 17 Top = 6 Width = 87 Caption = 'RX frequency' @@ -3228,8 +3263,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = cmbSatellite Left = 290 - Height = 33 - Top = 24 + Height = 34 + Top = 26 Width = 128 BorderSpacing.Left = 12 OnChange = edtRXFreqChange @@ -3243,7 +3278,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Side = asrBottom Left = 290 Height = 33 - Top = 81 + Top = 85 Width = 70 AutoSize = True BorderSpacing.Right = 10 @@ -3257,8 +3292,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = edtRXFreq AnchorSideTop.Side = asrCenter Left = 424 - Height = 15 - Top = 33 + Height = 17 + Top = 35 Width = 29 BorderSpacing.Left = 6 Caption = 'MHz' @@ -3271,7 +3306,7 @@ object frmNewQSO: TfrmNewQSO Left = 290 Height = 23 Hint = 'Use RX frequency from the Satellite tab instead of Frequency for DX spots' - Top = 58 + Top = 62 Width = 226 Caption = 'Use RX frequency for DX spots' Color = clNone @@ -3285,7 +3320,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Caption = 'LO Config' - ClientHeight = 147 + ClientHeight = 132 ClientWidth = 749 object cbTxLo: TCheckBox Left = 8 @@ -3313,8 +3348,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = cbTxLo AnchorSideTop.Side = asrCenter Left = 110 - Height = 33 - Top = 11 + Height = 34 + Top = 10 Width = 80 BorderSpacing.Left = 5 OnExit = edtTXLOExit @@ -3326,8 +3361,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = cbRxLo AnchorSideTop.Side = asrCenter Left = 111 - Height = 33 - Top = 43 + Height = 34 + Top = 42 Width = 80 BorderSpacing.Left = 5 OnExit = edtRXLOExit @@ -3339,8 +3374,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = edtTXLO AnchorSideTop.Side = asrCenter Left = 196 - Height = 15 - Top = 20 + Height = 17 + Top = 19 Width = 29 BorderSpacing.Left = 6 Caption = 'MHz' @@ -3352,8 +3387,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = edtRXLO AnchorSideTop.Side = asrCenter Left = 197 - Height = 15 - Top = 52 + Height = 17 + Top = 51 Width = 29 BorderSpacing.Left = 6 Caption = 'MHz' @@ -3368,13 +3403,13 @@ object frmNewQSO: TfrmNewQSO AnchorSideRight.Control = pnlQSOinput AnchorSideRight.Side = asrBottom Left = 555 - Height = 205 + Height = 204 Top = 0 Width = 204 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 20 Caption = 'Contest' - ClientHeight = 170 + ClientHeight = 186 ClientWidth = 202 TabOrder = 28 Visible = False @@ -3382,7 +3417,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideLeft.Control = gbContest AnchorSideTop.Control = gbContest Left = 3 - Height = 15 + Height = 17 Top = 3 Width = 87 BorderSpacing.Left = 3 @@ -3395,8 +3430,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = edtContestName AnchorSideTop.Side = asrBottom Left = 3 - Height = 15 - Top = 60 + Height = 17 + Top = 63 Width = 69 BorderSpacing.Top = 6 Caption = 'Serial sent' @@ -3407,8 +3442,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = edtContestSerialSent AnchorSideTop.Side = asrBottom Left = 3 - Height = 15 - Top = 117 + Height = 17 + Top = 123 Width = 69 BorderSpacing.Top = 6 Caption = 'Serial rcvd' @@ -3419,8 +3454,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblContestSerialSent Left = 81 - Height = 15 - Top = 60 + Height = 17 + Top = 63 Width = 59 BorderSpacing.Left = 9 Caption = 'Msg sent' @@ -3430,8 +3465,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideLeft.Control = lblContestExchangeMessageSent AnchorSideTop.Control = lblContestSerialReceived Left = 81 - Height = 15 - Top = 117 + Height = 17 + Top = 123 Width = 59 Caption = 'Msg rcvd' ParentColor = False @@ -3443,9 +3478,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideRight.Control = gbContest AnchorSideRight.Side = asrBottom Left = 3 - Height = 33 + Height = 34 Hint = 'name of contest, max 40 characters allowed' - Top = 21 + Top = 23 Width = 196 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 3 @@ -3461,9 +3496,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblContestSerialSent AnchorSideTop.Side = asrBottom Left = 3 - Height = 33 + Height = 34 Hint = 'serial number sent of contest, max 6 characters' - Top = 78 + Top = 83 Width = 64 BorderSpacing.Top = 3 MaxLength = 6 @@ -3476,9 +3511,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblContestSerialReceived AnchorSideTop.Side = asrBottom Left = 3 - Height = 33 + Height = 34 Hint = 'rserial number received of contest, max 6 characters' - Top = 138 + Top = 146 Width = 64 BorderSpacing.Top = 6 MaxLength = 6 @@ -3493,9 +3528,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideRight.Control = gbContest AnchorSideRight.Side = asrBottom Left = 81 - Height = 33 + Height = 34 Hint = 'contest exchange message sent, max 50 characters' - Top = 78 + Top = 83 Width = 118 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 @@ -3513,9 +3548,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideRight.Control = gbContest AnchorSideRight.Side = asrBottom Left = 81 - Height = 33 + Height = 34 Hint = 'contest exchange message received, max 50 characters' - Top = 138 + Top = 146 Width = 118 Anchors = [akTop, akLeft, akRight] BorderSpacing.Right = 3 @@ -3532,8 +3567,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblItuEdit AnchorSideTop.Side = asrCenter Left = 211 - Height = 15 - Top = 109 + Height = 17 + Top = 115 Width = 29 BorderSpacing.Left = 5 Caption = 'DOK' @@ -3547,9 +3582,9 @@ object frmNewQSO: TfrmNewQSO AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = cmbIOTA Left = 211 - Height = 33 + Height = 34 Hint = 'DOK, max length 12' - Top = 126 + Top = 134 Width = 42 BorderSpacing.Left = 5 CharCase = ecUppercase @@ -3568,7 +3603,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Side = asrBottom Left = 12 Height = 25 - Top = 271 + Top = 286 Width = 91 BorderSpacing.Top = 6 BevelOuter = bvNone @@ -3598,7 +3633,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideRight.Control = pnlSbtn1 Left = 335 Height = 25 - Top = 326 + Top = 340 Width = 25 Anchors = [akTop, akRight] BevelOuter = bvNone @@ -3663,7 +3698,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideRight.Control = pnlSbtn2 Left = 360 Height = 25 - Top = 326 + Top = 340 Width = 25 Anchors = [akTop, akRight] BevelOuter = bvNone @@ -3728,7 +3763,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideRight.Control = pnlSbtn3 Left = 385 Height = 25 - Top = 326 + Top = 340 Width = 25 Anchors = [akTop, akRight] BevelOuter = bvNone @@ -3833,7 +3868,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideRight.Control = pnlSbtn4 Left = 410 Height = 25 - Top = 326 + Top = 340 Width = 25 Anchors = [akTop, akRight] BevelOuter = bvNone @@ -3897,7 +3932,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideRight.Control = pnlSbtn5 Left = 435 Height = 25 - Top = 326 + Top = 340 Width = 25 Anchors = [akTop, akRight] BevelOuter = bvNone @@ -3961,7 +3996,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideRight.Control = pnlSbtn6 Left = 460 Height = 25 - Top = 326 + Top = 340 Width = 25 Anchors = [akTop, akRight] BevelOuter = bvNone @@ -4027,7 +4062,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideRight.Control = pnlSbtn7 Left = 485 Height = 25 - Top = 326 + Top = 340 Width = 25 Anchors = [akTop, akRight] BorderSpacing.Top = 2 @@ -4094,7 +4129,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideRight.Side = asrBottom Left = 510 Height = 25 - Top = 326 + Top = 340 Width = 25 Anchors = [akTop, akRight] BevelOuter = bvNone @@ -4153,13 +4188,13 @@ object frmNewQSO: TfrmNewQSO AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 760 - Height = 534 + Height = 533 Top = 35 Width = 271 Align = alRight BevelOuter = bvNone ChildSizing.LeftRightSpacing = 484 - ClientHeight = 534 + ClientHeight = 533 ClientWidth = 271 TabOrder = 1 object gbDXCCdata: TGroupBox @@ -4182,8 +4217,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblContCaption AnchorSideTop.Side = asrBottom Left = 131 - Height = 15 - Top = 113 + Height = 17 + Top = 115 Width = 41 BorderSpacing.Top = 5 Caption = 'DXCC:' @@ -4195,7 +4230,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = pnlDXCCCountry AnchorSideTop.Side = asrBottom Left = 7 - Height = 15 + Height = 17 Top = 93 Width = 35 BorderSpacing.Left = 7 @@ -4210,8 +4245,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblWAZCaption AnchorSideTop.Side = asrBottom Left = 7 - Height = 15 - Top = 113 + Height = 17 + Top = 115 Width = 26 BorderSpacing.Top = 5 Caption = 'ITU:' @@ -4225,7 +4260,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = pnlDXCCCountry AnchorSideTop.Side = asrBottom Left = 131 - Height = 15 + Height = 17 Top = 93 Width = 34 BorderSpacing.Left = 57 @@ -4241,7 +4276,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideBottom.Control = lblWAZCaption AnchorSideBottom.Side = asrBottom Left = 47 - Height = 15 + Height = 17 Top = 93 Width = 27 Anchors = [akLeft, akBottom] @@ -4258,8 +4293,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideBottom.Control = lblITUCaption AnchorSideBottom.Side = asrBottom Left = 47 - Height = 15 - Top = 113 + Height = 17 + Top = 115 Width = 27 Anchors = [akLeft, akBottom] BorderSpacing.Top = 5 @@ -4274,8 +4309,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideBottom.Control = lblDXCCCaption AnchorSideBottom.Side = asrBottom Left = 174 - Height = 15 - Top = 113 + Height = 17 + Top = 115 Width = 27 Anchors = [akLeft, akBottom] BorderSpacing.Top = 5 @@ -4291,7 +4326,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideBottom.Control = lblContCaption AnchorSideBottom.Side = asrBottom Left = 174 - Height = 15 + Height = 17 Top = 93 Width = 27 Anchors = [akLeft, akBottom] @@ -4306,8 +4341,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblITUCaption AnchorSideTop.Side = asrBottom Left = 7 - Height = 15 - Top = 133 + Height = 17 + Top = 137 Width = 28 BorderSpacing.Top = 5 Caption = 'LAT:' @@ -4320,8 +4355,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblDXCCCaption AnchorSideTop.Side = asrBottom Left = 131 - Height = 15 - Top = 133 + Height = 17 + Top = 137 Width = 41 BorderSpacing.Top = 5 Caption = 'LONG:' @@ -4334,8 +4369,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideBottom.Control = lblLatCaption AnchorSideBottom.Side = asrBottom Left = 47 - Height = 15 - Top = 133 + Height = 17 + Top = 137 Width = 27 Anchors = [akLeft, akBottom] Caption = 'AAA' @@ -4349,8 +4384,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideBottom.Control = lblLongCaption AnchorSideBottom.Side = asrBottom Left = 174 - Height = 15 - Top = 133 + Height = 17 + Top = 137 Width = 27 Anchors = [akLeft, akBottom] Caption = 'AAA' @@ -4363,8 +4398,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblLatCaption AnchorSideTop.Side = asrBottom Left = 7 - Height = 15 - Top = 153 + Height = 17 + Top = 159 Width = 33 BorderSpacing.Top = 5 Caption = 'DIST:' @@ -4378,8 +4413,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideBottom.Control = lblDistCaption AnchorSideBottom.Side = asrBottom Left = 47 - Height = 15 - Top = 153 + Height = 17 + Top = 159 Width = 27 Anchors = [akLeft, akBottom] Caption = 'AAA' @@ -4393,8 +4428,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblLongCaption AnchorSideTop.Side = asrBottom Left = 131 - Height = 15 - Top = 153 + Height = 17 + Top = 159 Width = 38 BorderSpacing.Top = 5 Caption = 'AZIM:' @@ -4407,8 +4442,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideBottom.Control = lblAzim AnchorSideBottom.Side = asrBottom Left = 174 - Height = 15 - Top = 153 + Height = 17 + Top = 159 Width = 27 Anchors = [akLeft, akBottom] Caption = 'AAA' @@ -4423,7 +4458,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Side = asrBottom Left = 7 Height = 20 - Top = 212 + Top = 220 Width = 162 AutoSize = False BorderSpacing.Top = 6 @@ -4439,8 +4474,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideBottom.Control = lblHisTime AnchorSideBottom.Side = asrBottom Left = 181 - Height = 15 - Top = 217 + Height = 17 + Top = 223 Width = 44 Anchors = [akLeft, akBottom] BorderSpacing.Left = 12 @@ -4456,7 +4491,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Side = asrBottom Left = 7 Height = 22 - Top = 184 + Top = 192 Width = 23 BorderSpacing.Top = 16 Flat = True @@ -4503,7 +4538,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideBottom.Side = asrBottom Left = 132 Height = 22 - Top = 258 + Top = 268 Width = 23 Anchors = [akLeft, akBottom] BorderSpacing.Left = 1 @@ -4543,7 +4578,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Side = asrBottom Left = 7 Height = 22 - Top = 258 + Top = 268 Width = 23 BorderSpacing.Top = 5 Flat = True @@ -4590,7 +4625,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideBottom.Side = asrBottom Left = 131 Height = 22 - Top = 184 + Top = 192 Width = 23 Anchors = [akLeft, akBottom] Flat = True @@ -4630,8 +4665,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideBottom.Control = SpeedButton3 AnchorSideBottom.Side = asrBottom Left = 30 - Height = 15 - Top = 265 + Height = 17 + Top = 273 Width = 90 Anchors = [akLeft, akBottom] Caption = 'lblLocSunRise' @@ -4646,8 +4681,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideBottom.Control = SpeedButton3 AnchorSideBottom.Side = asrBottom Left = 160 - Height = 15 - Top = 265 + Height = 17 + Top = 273 Width = 83 Anchors = [akLeft, akBottom] BorderSpacing.Left = 5 @@ -4663,8 +4698,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideBottom.Control = btnSunRise AnchorSideBottom.Side = asrBottom Left = 30 - Height = 15 - Top = 191 + Height = 17 + Top = 197 Width = 87 Anchors = [akLeft, akBottom] BorderSpacing.Top = 5 @@ -4680,8 +4715,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideBottom.Control = btnSunRise AnchorSideBottom.Side = asrBottom Left = 159 - Height = 15 - Top = 191 + Height = 17 + Top = 197 Width = 80 Anchors = [akLeft, akBottom] BorderSpacing.Left = 5 @@ -4695,8 +4730,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = lblHisTime AnchorSideTop.Side = asrBottom Left = 7 - Height = 15 - Top = 238 + Height = 17 + Top = 246 Width = 38 BorderSpacing.Top = 6 Caption = 'Local:' @@ -4736,8 +4771,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 0 - Height = 157 - Top = 309 + Height = 145 + Top = 321 Width = 256 Align = alBottom Anchors = [akTop, akLeft, akRight] @@ -4750,8 +4785,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = SpeedButton3 AnchorSideTop.Side = asrBottom Left = 3 - Height = 15 - Top = 292 + Height = 17 + Top = 302 Width = 61 BorderSpacing.Left = 3 BorderSpacing.Top = 12 @@ -4766,7 +4801,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideBottom.Side = asrBottom Left = 6 Height = 35 - Top = 493 + Top = 492 Width = 130 Anchors = [akLeft, akBottom] AutoSize = True @@ -4783,7 +4818,7 @@ object frmNewQSO: TfrmNewQSO AnchorSideBottom.Side = asrBottom Left = 151 Height = 35 - Top = 493 + Top = 492 Width = 113 Anchors = [akRight, akBottom] AutoSize = True @@ -4814,8 +4849,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideBottom.Control = lblQSONrDesc AnchorSideBottom.Side = asrBottom Left = 67 - Height = 15 - Top = 10 + Height = 17 + Top = 9 Width = 8 Anchors = [akLeft, akBottom] BorderSpacing.Left = 6 @@ -4829,8 +4864,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = pnlProfiles AnchorSideTop.Side = asrCenter Left = 12 - Height = 15 - Top = 10 + Height = 17 + Top = 9 Width = 49 BorderSpacing.Left = 12 Caption = 'QSO nr.' @@ -4845,8 +4880,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Side = asrCenter AnchorSideBottom.Side = asrBottom Left = 477 - Height = 15 - Top = 10 + Height = 17 + Top = 9 Width = 123 Alignment = taRightJustify BorderSpacing.Left = 10 @@ -4863,8 +4898,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Side = asrCenter AnchorSideBottom.Side = asrBottom Left = 610 - Height = 15 - Top = 10 + Height = 17 + Top = 9 Width = 115 BorderSpacing.Left = 10 Caption = 'Ambiguous prefix' @@ -4881,8 +4916,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Side = asrCenter AnchorSideBottom.Side = asrBottom Left = 95 - Height = 15 - Top = 10 + Height = 17 + Top = 9 Width = 86 BorderSpacing.Left = 20 Caption = 'QTH profile: ' @@ -4896,8 +4931,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideTop.Control = pnlProfiles AnchorSideTop.Side = asrCenter Left = 186 - Height = 33 - Top = 1 + Height = 34 + Top = 0 Width = 281 BorderSpacing.Left = 5 ItemHeight = 0 @@ -4911,8 +4946,8 @@ object frmNewQSO: TfrmNewQSO AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 1 - Height = 18 - Top = 569 + Height = 19 + Top = 568 Width = 1030 Panels = < item @@ -5041,6 +5076,10 @@ object frmNewQSO: TfrmNewQSO object MenuItem39: TMenuItem Action = acReloadCW end + object MenuItem45: TMenuItem + Caption = 'Send hex bytes to keyer (W or K)' + OnClick = MenuItem45Click + end object MenuItem51: TMenuItem Caption = '-' end @@ -5203,6 +5242,13 @@ object frmNewQSO: TfrmNewQSO object MenuItem83: TMenuItem Action = acBigSquare end + object MenuItem84: TMenuItem + Action = acCounty + end + object MenuItem46: TMenuItem + Caption = 'CreateLoadFilter' + Visible = False + end object MenuItem21: TMenuItem Caption = 'Graphical statistics' Visible = False @@ -5232,6 +5278,12 @@ object frmNewQSO: TfrmNewQSO Action = acUploadToHrdLog end end + object MenuItem95: TMenuItem + Caption = 'UDP Log' + object MenuItem96: TMenuItem + Action = acUploadToUDPLog + end + end object MenuItem88: TMenuItem Caption = '-' end @@ -5708,6 +5760,11 @@ object frmNewQSO: TfrmNewQSO Caption = 'Upload all changes' OnExecute = acUploadToHrdLogExecute end + object acUploadToUDPLog: TAction + Category = 'OnlineLog' + Caption = 'Upload all changes' + OnExecute = acUploadToUDPLogExecute + end object acUploadToAll: TAction Category = 'OnlineLog' Caption = 'Upload changes to all logs' @@ -5773,524 +5830,249 @@ object frmNewQSO: TfrmNewQSO Caption = 'ADIF' OnExecute = acRemoteModeADIFExecute end + object acCounty: TAction + Category = 'Statistics' + Caption = 'County' + OnExecute = acCountyExecute + end end object imgMain: TImageList Left = 264 Top = 32 Bitmap = { - 4C6910000000100000001000000010C4E70010C4E700C88B4DFFC88C4FFFC88C - 4FFFC88C4FFFC88C4FFFC88D4FFFC98C4FFFC78B4FFFC5894BFFC4763BFF4104 - 1A0090061B0000001B0001001D0042041B00C48549FFF7F2ECFFF8F4EEFFF8F4 - EDFFF8F3EDFFF8F3EDFFF8F3EDFFF8F2ECFFF7F2ECFFF2E6D7FFE2B27DFFDB94 - 65FF02008800190587009006880000008800C5884BFFFAF6F2FFFAE0C7FFFBE1 - C9FFFBE2C9FFFBE0C8FFF9DFC5FFF8DBC1FFF4D6B8FFFFFBF8FFF6D8B4FFE1B0 - 7DFFDB9264FF8B060A0090060B008D060B00C6894CFFF9F5F1FFFCE3CDFFFBE3 - CEFFFBE3CDFFFBE2CBFFF9E0C8FFF8DCC2FFF5D6BAFFFDFBF8FFFCE6CDFFFAE5 - C9FFE2B684FFBF7942FF900692001D059200C6894BFFF9F5F1FFFCE3CFFFFBE4 - D0FFFCE4CFFFFCE3CDFFFAE1CAFFF9DDC4FFF6D9BCFFF4E9DFFFF7F2ECFFFBF7 - F3FFF5EFE9FFC27E45FF90069A0010049A00C6894BFFF9F4F0FFFCE6D3FFFCE6 - D4FFFDE7D3FFFCE4D1FFFBE3CDFFFAE0C8FFF8DCC2FFF5D6BBFFF3D4B5FFF1D2 - B3FFF8F4F0FFC48246FFF10001000D040000C6884AFFF9F4EFFFFEE7D7FFFDE7 - D6FFFDE7D5FFFDE6D4FFFCE6D2FFFBE1CCFFFADFC7FFF8DCC2FFF6DABDFFF6D8 - BBFFFAF4EFFFC68346FF1705CF00F500CF00C68849FFF9F4EDFFFEE8D8FFFEE8 - D8FFFEE8D7FFFEE7D6FFFDE5D3FFFCE4D1FFFBE1CCFFFAE0C7FFF9DDC3FFF8DC - C2FFFAF4EDFFC68245FF17050900F5000900C68447FFF9F3ECFFFEE8D6FFFEE8 - D7FFFDE7D6FFFDE7D6FFFDE7D5FFFDE5D3FFFBE4D0FFFBE3CCFFFADFC7FFFADF - C6FFFAF2EAFFC68042FF1705E500F500E500C58245FFF8F2EBFFFEE7D6FFFDE7 - D6FFFDE7D6FFFDE7D6FFFDE6D5FFFDE5D3FFFCE4D1FFFCE2CDFFFBE1CBFFFBE1 - C9FFFBF7F2FFC57C3FFF1705EA00F500EA00C58042FFF8F1E8FFFEE5D5FFFDE5 - D3FFFDE5D3FFFCE5D3FFFCE5D3FFFCE4D1FFFCE2CEFFFCE2CCFFFBE0C9FFFBE1 - C8FFFDFAF7FFC1763BFF17053100F5003100C47C40FFF7F0E6FFF8B455FFF7B4 - 56FFF7B554FFF8B453FFF8B253FFF7B352FFF7B352FFF7B251FFF7B24FFFF7B2 - 4FFFFCF9F5FFBF6F36FF03000100ED000000C1783CFFF7EDE3FFFDC26EFFFFD8 - A0FFFFD79EFFFFD69BFFFFD798FFFFD696FFFFD695FFFFD594FFFFD493FFFBBE - 65FFFBF7F4FFBB6731FFD8C2E700F3009F00BF7138FFF5EBDFFFFDBF68FFFCBD - 67FFFBBE65FFFCBE64FFFCBE64FFFCBD62FFFBBD63FFFBBC61FFFCBE60FFFCBC - 62FFFDFBF8FFB9642DFF9B01CF00F904CD00BC6933FFF8F1EAFFF7ECDFFFF6EB - DEFFF6EADEFFF6EADCFFF6EADCFFFAF3EBFFFAF3EBFFFAF2EAFFFCF7F3FFFCF8 - F4FFFEFEFDFFB7602AFF84010900FA04080019050900BA6530FFBB6631FFBA66 - 30FFBA6630FFBA6630FFBA6530FFBA652FFFB9652EFFB9652EFFB9642EFFB964 - 2EFFB7622CFFF3001B008001E50010C4E70010C4E700B8286800B8286800C88C - 4F00C88C4F00C88C4F00C88D4F00C98C4F00C78B4F00C5894B00C4763B004104 - 1A0090061B0000001B0001001D0042041B00C4854900F7F2EC00FADCBFFFF9D9 - BBFFF6D6B8FFF4D3B4FFF1CFAFFFEECBABFFF7F2EC00F2E6D700E2B27D00DB94 - 650002008800190587009006880000008800C5884B00FADBBEFFF9E2CDFFFAEC - DEFFF9EEE2FFF9EDE2FFF8E9DAFFF0D5BDFFE7C09FFFFFFBF800F6D8B400E1B0 - 7D00DB9264008B060A0090060B008D060B00FADBBDFFF8E2CCFFFAEEE3FFF7E7 - D6FFF6E2CEFFF6E1CBFFF6E3D0FFF9EADDFFECCFB5FFDFB693FFFCE6CD00FAE5 - C900E2B68400BF794200900692001D059200F7D7B9FFF9EBDEFFF7E7D6FFF6E1 - CCFFF5E0CAFFF5DEC8FFF5DDC5FFF6E1CBFFF5E2D0FFDBB08CFFF7F2EC00FBF7 - F300F5EFE900C27E450090069A0010049A00F4D3B4FFF9EDE1FFF6E1CCFFF5DF - C9FFF5DEC7FFF4DCC4FFF4DBC2FFF4DAC0FFF8E7D6FFD7AA86FFF3D4B500F1D2 - B300F8F4F000C4824600F10001000D040000F0CEAEFFF9ECDFFFF5DFC8FFF5DD - C6FFF4DCC3FFF4DAC1FFF3D9BEFFF3D7BDFFF8E6D3FFD3A57FFFF6DABD00F6D8 - BB00FAF4EF00C68346001705CF00F500CF00ECC8A8FFF7E7D7FFF6E1CCFFF4DB - C2FFF4DAC0FFF3D8BDFFF3D7BBFFF4DBC2FFF3DEC9FFCD9F7BFFF9DDC300F8DC - C200FAF4ED00C682450017050900F5000900E8C3A2FFEDD0B7FFF8E8D9FFF5DE - C8FFF3D8BDFFF3D6BBFFF4DBC2FFF7E4D2FFDFBB9DFF9D9492FFFADFC700FADF - C600FAF2EA00C68042001705E500F500E500C5824500E1B896FFE8C9AEFFF5E1 - CDFFF7E5D3FFF7E5D1FFF3DDC8FFDFBA9CFFC7A891FF86AED5FF417DB5FFFBE1 - C900FBF7F200C57C3F001705EA00F500EA00C5804200F8F1E800D9AE8AFFD6A9 - 85FFD3A57FFFD0A07BFFCD9C76FFA2938AFF75A2CCFFABCBE8FF76A4CEFF3070 - A8FFFDFAF700C1763B0017053100F5003100C47C4000F7F0E600F8B45500F7B4 - 5600F7B55400F8B45300F8B25300F7B352003C79B1FF6497C5FF9DC1E4FF6699 - C7FF1F659DFFBF6F360003000100ED000000C1783C00F7EDE300FDC26E00FFD8 - A000FFD79E00FFD69B00FFD79800FFD69600FFD695002B6DA5FF558DBCFF89B5 - DDFF185F97FFBB673100D8C2E700F3009F00BF713800F5EBDF00FDBF6800FCBD - 6700FBBE6500FCBE6400FCBE6400FCBD6200FBBD6300FBBC61001B629AFF2267 - 9DFF115B93FFB9642D009B01CF00F904CD00BC693300F8F1EA00F7ECDF00F6EB - DE00F6EADE00F6EADC00F6EADC00FAF3EB00FAF3EB00FAF2EA00FCF7F300FCF8 - F400FEFEFD00B7602A0084010900FA04080019050900BA653000BB663100BA66 - 3000BA663000BA663000BA653000BA652F00B9652E00B9652E00B9642E00B964 - 2E00B7622C00F3001B008001E50010C4E70010C4E700B8286800B8286800C88C - 4F00C88C4F00767677FFC88D4F00C98C4F00C78B4F00C5894B00C4763B004104 - 1A0090061B0000001B0001001D0042041B00C4854900F7F2EC00FADCBF004848 - 48FFC4C4C4FFFCFCFCFFC5C5C5FF7B7B7BFFBDBDBDFF8C8C8CFFE2B27D00DB94 - 650002008800190587009006880000008800C5884B00FADBBE00CFCFCFFFFBFB - FBFFFFFFFFFFECECECFFAFB0B0FFC6C7C7FFFBFBFBFFFFFFFFFFC0C4C9FFB5B8 - BCFFDB9264008B060A0090060B008D060B00FADBBD007E7A74FFC0C9D5FFEBEA - E9FFE2E1E2FFBEBEBEFFC4C5C5FFE7E7E7FFEEEEEEFFF5F5F5FFF0F1F2FFB9BB - BFFF7A7670FFBF794200900692001D059200F7D7B900BFBEBCFF6B89B3FFA7B2 - BFFFADB0B4FFA4A9AFFFC0C4CAFFC7CCD2FFCBD0D7FFCFD5DCFFC2C7CFFFB0B9 - C4FFBBBBB8FFC27E450090069A0010049A00F4D3B400D8D9DBFFE1E1E1FFE1E1 - E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1 - E1FFD4D5D7FFC4824600F10001000D040000F0CEAE00ADBBCEFFA4B9D7FFA5B8 - D3FFA4B8D3FFA5B9D3FFA6B9D3FFA5B8D3FFA7B9D3FFA8B9D2FFA7B9D2FFA7BA - D6FFADBBCDFFC68346001705CF00F500CF00ECC8A800154F9BFF3184F3FF2F7D - EAFF2C7CEAFF2E7DEAFF4289EBFF4389EBFF307EEBFF2D7CEAFF2577EAFF1473 - F4FF07489CFFC682450017050900F5000900E8C3A200275797FF61A6FFFF5B9D - F9FF5499F9FFB8D5FDFFD4E6FFFFE5F0FFFFA8CBFDFF4A93F8FF3D8BF8FF2885 - FFFF114B97FFC68042001705E500F500E500C58245001D4880FF539EFFFF5297 - F7FF73ABF9FFE0ECFEFF95BFFAFFA8CBFBFFB7D3FCFF2B80F5FF1070F4FF0570 - FFFF083D82FFC57C3F001705EA00F500EA00C5804200163B6AFF4D9BFFFF4992 - F6FFE8F1FEFFA3C8FBFF005FF2FF1472F4FFE4EFFEFF7BB0F9FF0060F2FF026E - FFFF07336CFFC1763B0017053100F5003100C47C400011325CFF2784FFFF0C6B - F3FFABCDFBFF86B7F9FF3887F5FF3C8AF6FFB0CFFBFF61A2F7FF0769F3FF046F - FFFF072E60FFBF6F360003000100ED000000C1783C00F7EDE300016CFDFF0066 - F3FF227EF5FFE2EEFEFFDAEBFDFFEFF6FEFFC3DFFDFF3395F6FF379AF6FF1079 - FEFF185F9700BB673100D8C2E700F3009F00BF713800F5EBDF00056EFDFF056D - F8FF0770F7FF2D89F8FF4297FAFF64ADFBFF449EFAFF359BF9FF44A7FBFF1E86 - FFFF115B9300B9642D009B01CF00F904CD00BC693300F8F1EA000963DAFF086B - EDFF0B6CEBFF096CEBFF0C6FEBFF0E72EBFF1577ECFF1D7DECFF2182EEFF156F - DDFFFEFEFD00B7602A0084010900FA04080019050900BA653000BB663100BA66 - 3000BA663000BA663000BA653000BA652F00B9652E00B9652E00B9642E00B964 - 2E00B7622C00F3001B008001E50010C4E70010C4E700E49445FFE39344FFE69A - 52FFE28E43FFDF8431FFC88D4F00C98C4F00C78B4F00C5894B00C4763B004104 - 1A0090061B0000001B0001001D0042041B00E6984EFFE28E40FFFADCBF00DF85 - 35FFE69F60FFDD7B2AFFC5C5C5007B7B7B00BDBDBD008C8C8C00E2B27D00DB94 - 650002008800190587009006880000008800E28D3CFFFADBBE00CFCFCF00DF7E - 2EFFE49859FFDB7423FFAFB0B000C6C7C700FBFBFB00FFFFFF00C0C4C900B5B8 - BC00DB9264008B060A0090060B008D060B00DF8535FFE18C41FFDD7B2AFFE7A3 - 6CFFDE813AFFBEBEBE00C4C5C500E7E7E700EEEEEE00F5F5F500F0F1F200B9BB - BF007A767000BF79420090069200E18E42FFDF7E2EFFBFBEBC006B89B30092AA - 5DFF85A151FFA4A9AF00C0C4CA00C7CCD200CBD0D700CFD5DC00C2C7CF00B0B9 - C400BBBBB800C27E450090069A00E49555FFDB7725FFD8D9DB008CA453FF88CB - 90FF83C68BFF619F52FFE1E1E100419149FFE6AC78FFE5AA77FFE7A976FFE6A9 - 74FFE5A671FFE2A270FFF1000100DB7423FFD9701EFFD86B1BFF84A052FF80C5 - 88FFB0DCB6FF75B87CFF419149FF39853FFFE5A976FFE5A874FFEABB92FFE9BA - 93FFE7B489FFE09E6CFF1705CF00F500CF00ECC8A800154F9B003184F30051A7 - 5AFF71B67AFFA6D8ADFF9ED3A5FF317A37FF307EEB00E5A670FFE3A26FFFEEBC - 95FFEAA975FFC682450017050900F5000900E8C3A2002757970061A6FF005B9D - F900419149FF9BD2A2FF95D09DFF2A702FFFE7A670FFE2A16DFFE29F6AFFEDB4 - 87FFE9A672FFC68042001705E500F500E500C58245001D488000539EFF004191 - 49FF39853FFF317A37FF2A702FFF86864AFFE4AA7CFFDF9C69FF1070F400EAAA - 79FFE9A876FFC57C3F001705EA00F500EA00C5804200163B6A004D9BFF004992 - F600E8F1FE00A3C8FB00005FF200E5A472FFDF9B68FF7BB0F9000060F200E9A6 - 73FFE8A572FFC1763B0017053100F5003100C47C400011325C002784FF000C6B - F300ABCDFB0086B7F900E6A169FFE3AA80FFDC9564FF61A2F7000769F300E597 - 5DFFE9A676FFEEBC95FF03000100ED000000C1783C00F7EDE300016CFD000066 - F300227EF500E7A168FFE1A579FFDC9462FFDB9161FFDA905EFFD88D5BFFDF9A - 6CFFE9A779FFEDB487FFD8C2E700F3009F00BF713800F5EBDF00056EFD00056D - F8000770F700E5A575FFDD9868FF64ADFB00449EFA00359BF90044A7FB00E390 - 57FFE9A77AFFE28D54FF9B01CF00F904CD00BC693300F8F1EA000963DA00086B - ED00E8A573FFDB915FFFDC905DFF0E72EB001577EC001D7DEC002182EE00E59A - 68FFEAAD83FFE4945EFF84010900FA04080019050900BA653000BB663100E69A - 61FFE5975EFFE2945BFFE3935AFFBA652F00B9652E00E38F54FFE28D53FFE28C - 51FFE28A50FFE28A50FFE28A50FF10C4E70010C4E700B8286800B8286800E69A - 5200E28E4300DF843100C88D4F00C98C4F00C78B4F00C5894B00C4763B004104 - 1A006D9CD4FF6A9AD2FF6697CFFF42041B00E6984E00E28E4000FADCBF00DF85 - 3500E69F6000DD7B2A00C5C5C5007B7B7B00BDBDBD008C8C8C00709ED6FF6D9C - D4FF85B1DAFF5A91B9FF6093CBFF00008800E28D3C00808080FF7E7E7EFF7C7C - 7CFF7A7A7AFF777777FF757575FF727272FF719ED4FF6F9ED6FF87B2DCFFABD3 - E8FFA9D0E6FF5890B8FF598EC6FF8D060B00DF8535007D7D7DFF999999FF9999 - 99FF9A9A9AFF9A9A9AFF9B9B9BFF9B9B9BFF6F9DD3FFAAD1E7FFABD1E7FF98C7 - E1FF91C2DEFF568FB7FF5289C1FFE18E4200DF7E2E007A7A7AFF999999FF5291 - 59FF999A99FF9B9B9BFF9C9C9CFF9C9C9CFF6C9AD0FFA7CEE5FF8FC1DFFF89BD - DCFF8BBDDCFF538DB6FF4B84BCFFE4955500DB772500777777FF9A9A9AFF3D8A - 45FF498A4FFF9C9C9CFF9D9D9DFF9D9D9DFF6696CCFFA2CBE3FF89BDDCFF83B9 - DAFF84B9DAFF518BB5FF437EB6FF44944DFF42914BFF3F8D48FF3D8945FF5DA4 - 65FF5AA061FF45834BFF9E9E9EFF9E9E9EFF6092C9FF9EC7E2FF83B8DAFF7DB4 - D7FF7EB3D7FF4F89B4FF3B79B1FF41904AFF94D29FFF91D09AFF8DCD96FF89CB - 92FF84C88DFF519858FF417C46FF9F9F9FFF5A8EC4FF98C3E0FF7CB3D7FF74AF - D6FF5EC4EDFF4B88B3FF3473ABFF3E8B46FF8FCE99FF7DC687FF78C381FF73C0 - 7CFF74C07CFF79C281FF49904FFF547F57FF5489BFFF94BFDDFF75ADD4FF63B8 - E1FF4BD4FFFF428BB8FF2C6EA6FF3B8742FF89CB92FF84C88DFF80C688FF7BC3 - 83FF77C17FFF478F4DFF3B743FFFA1A1A1FF4C84BAFF8DBBDBFF6EA8D1FF66A6 - D1FF5FB4DFFF4785B1FF2569A1FF37823EFF347E3BFF317937FF2E7534FF4991 - 50FF468F4CFF39733DFFA1A1A1FFA2A2A2FF457EB4FF88B7D9FF67A3CFFF619E - CCFF639FCCFF4583B1FF1F649CFFF5003100C47C4000606060FFA0A0A0FF3D76 - 41FF367139FFA2A2A2FFA2A2A2FFA3A3A3FF3D79B0FF82B3D7FF629FCCFF5A9A - C9FF5E9BCAFF4381AFFF196098FFED000000C1783C005C5C5CFFA1A1A1FF3C73 - 40FFA0A1A1FFA3A3A3FFA3A3A3FFA4A4A4FF3674AAFF7DAFD4FF5B9AC9FF5495 - C7FF5896C8FF4180AEFF135C94FFF3009F00BF713800585858FFA2A2A2FFA2A2 - A2FFA3A3A3FFA4A4A4FFA4A4A4FFA5A5A5FF2F6FA5FF78ABD2FF78ABD3FF73A7 - D1FF69A0CDFF407FAEFF0F5991FF999999FF717171FF545454FF515151FF4F4F - 4FFF4C4C4CFF4A4A4AFF474747FF454545FF25679DFF3274A8FF3D7CAFFF4784 - B5FF4E8ABAFF3E7EADFF0C578FFFFA04080019050900BA653000BB663100E69A - 6100E5975E00E2945B00E3935A00BA652F00B9652E00E38F5400E28D5300105A - 92FF0D5890FF135C92FF0C578FFF10C4E70010C4E700B8286800B8286800E69A - 5200E28E4300DF843100C88D4F00C98C4F00C78B4F00C5894B00C4763B004104 - 1A006D9CD4006A9AD2006697CF0042041B00E6984E00BEC0BFFFC8CAC9FFC8CA - C9FFC8CAC9FFC8CAC9FFC8CAC9FFC8CAC9FFC8CAC9FFC8CAC9FFC8CAC9FFC8CA - C9FFBEC0BFFF5A91B9006093CB0000008800858A88FFE6E7E7FFE5E5E5FFE6E6 - E6FFE3E3E3FFE3E3E3FFE4E4E4FFE5E5E5FFE5E5E5FFE5E5E5FFE7E7E7FFE9E9 - E9FFE7E8E7FF858A88FF598EC6008D060B00858A88FFE6E7E6FFE0E0E0FFE2E2 - E2FFC9C9C9FFC8C8C8FFC8C8C8FFC7C7C7FFC8C8C8FFC8C8C8FFD4D4D4FFE7E7 - E7FFE7E7E7FF858A88FF5289C100E18E4200858A88FFE6E7E7FFE2E2E2FFE3E3 - E3FFC9C9C9FFC7C7C7FFC7C7C7FFC7C7C7FFC8C8C8FFC8C8C8FFD3D3D3FFE8E8 - E8FFE7E8E7FF858A88FF4B84BC00E4955500858A88FFE5E6E6FFDDDDDDFFE5E5 - E5FFD9D9D9FFDADADAFFDCDCDCFFC9C9C9FFC9C9C9FFD6D6D6FFE1E1E1FFEAEA - EAFFE7E8E7FF858A88FF437EB60044944D00858A88FFE4E5E4FFD5D6D6FFEAEA - EAFFCFCFCFFFCDCDCDFFCDCDCDFF7D7D7DFF5B5B5BFF878787FFDBDBDBFFEDED - EDFFE7E8E8FF858A88FF3B79B10041904A00858A88FFE6E7E7FFE8E8E8FFEAEA - EAFFCFCFCFFFA9A9A9FFABABABFFB9B9B9FF777777FF666666FFDADADAFFEFEF - EFFFE7E8E8FF858A88FF3473AB003E8B4600858A88FFE7E7E7FFE7E7E7FFE9E9 - E9FFEAEAEAFFAFAFAFFF696969FFA0A0A0FF6A6A6AFF727272FFCBCBCBFFEEEE - EEFFE8E8E8FF858A88FF2C6EA6003B874200858A88FFE4E5E4FFD3D4D4FFE9E9 - E9FFD7D7D7FFB5B5B5FF6C6C6CFF606060FF606060FF606060FF7E7E7EFFD1D1 - D1FFE7E8E7FF858A88FF2569A10037823E00858A88FFE6E7E6FFE7E7E7FFF0F0 - F0FFE0E0E0FFDEDEDEFFD2D2D2FFCFCFCFFFC6C6C6FF848484FF848484FFA2A2 - A2FFE1E2E2FF858A88FF1F649C00F5003100858A88FFE7E8E7FFE9E9E9FFEBEB - EBFFD4D4D4FFD3D3D3FFD3D3D3FFD3D3D3FFD3D3D3FFC7C7C7FFA1A1A1FFAEAE - AEFFE2E3E2FF858A88FF19609800ED000000858A88FFE7E8E7FFE9E9E9FFEBEB - EBFFD4D4D4FFD3D3D3FFD3D3D3FFD3D3D3FFD3D3D3FFEEEEEEFFE9E9E9FFE1E1 - E1FFE6E7E7FF858A88FF135C9400F3009F00858A88FFE7E8E8FFEDEDEDFFEFEF - EFFFEDEDEDFFEEEEEEFFF0F0F0FFF1F1F1FFF3F3F3FFF8F8F8FFFAFAFAFFF8F8 - F8FFE8E9E9FF858A88FF0F5991009999990071717100BEC0BFFFC8CAC9FFC8CA - C9FFC8CAC9FFC8CAC9FFC8CAC9FFC8CAC9FFC8CAC9FFC8CAC9FFC8CAC9FFC8CA - C9FFBDC0BFFF3E7EAD000C578F00FA04080019050900BA653000BB663100E69A - 6100E5975E00E2945B00E3935A00BA652F00B9652E00E38F5400E28D5300105A - 92000D589000135C92000C578F0010C4E70010C4E700B8286800B8286800E69A - 5200E28E4300DF843100C88D4F00C98C4F00C78B4F00C5894B00C4763B004104 - 1A006D9CD4006A9AD2006697CF0042041B00E6984E001963ADFF1963ADFF1963 - ADFFC8CAC900C8CAC900C8CAC900C8CAC900C8CAC900C8CAC900C8CAC900C8CA - C900BEC0BF005A91B9006093CB0000008800858A88001963ADFFABF4FFFF1963 - ADFFE3E3E300E3E3E300E4E4E400158320FF158320FF158320FF158320FF1583 - 20FF158320FF158320FF158320FF8D060B00858A88001963ADFFABF4FFFF1963 - ADFFC9C9C900C8C8C800C8C8C800158320FFB0E1B4FFA2D8A6FF93D099FF85C7 - 8BFF77BF7DFF69B670FF5BAE63FFE18E4200858A88001963ADFFA9F3FFFF1963 - ADFFC9C9C900C7C7C700C7C7C700C7C7C700C8C8C800C8C8C800D3D3D300E8E8 - E800E7E8E700858A88004B84BC00E4955500858A88001963ADFF9FEAFFFF1963 - ADFFD9D9D900DADADA00DCDCDC00158320FF158320FF158320FF158320FF1583 - 20FF158320FF858A8800437EB60044944D00858A88001963ADFF91E0FFFF1963 - ADFFCFCFCF00CDCDCD00CDCDCD00158320FFA7DDACFF94D099FF81C586FF6DB8 - 73FF59AD61FF858A88003B79B10041904A00858A88001963ADFF80D4FFFF1963 - ADFFCFCFCF00A9A9A900ABABAB00B9B9B9007777770066666600DADADA00EFEF - EF00E7E8E800858A88003473AB003E8B4600858A88001963ADFF70C6FFFF1963 - ADFFEAEAEA00AFAFAF0069696900158320FF158320FF158320FF158320FFEEEE - EE00E8E8E800858A88002C6EA6003B874200858A88001963ADFF5FB9FFFF1963 - ADFFD7D7D700B5B5B5006C6C6C00158320FFAFE0B2FF9ED7A3FF8ECD93FFD1D1 - D100E7E8E700858A88002569A10037823E00858A88001963ADFF4EADFFFF1963 - ADFFE0E0E000DEDEDE00D2D2D200CFCFCF00C6C6C6008484840084848400A2A2 - A200E1E2E200858A88001F649C001963ADFF1963ADFF1963ADFF40A2FFFF1963 - ADFF1963ADFF1963ADFFD3D3D300158320FF158320FFC7C7C700A1A1A100AEAE - AE00E2E3E200858A880019609800ED0000001963ADFF389CFFFF369AFFFF3499 - FFFF1963ADFFD3D3D300D3D3D300158320FFA5DBA9FFEEEEEE00E9E9E900E1E1 - E100E6E7E700858A8800135C9400F3009F00858A88001963ADFF3499FFFF1963 - ADFFEDEDED00EEEEEE00F0F0F000F1F1F100F3F3F300F8F8F800FAFAFA00F8F8 - F800E8E9E900858A88000F5991009999990071717100BEC0BF001963ADFFC8CA - C900C8CAC900C8CAC900C8CAC900C8CAC900C8CAC900C8CAC900C8CAC900C8CA - C900BDC0BF003E7EAD000C578F00FA04080019050900BA653000BB663100E69A - 6100E5975E00E2945B00E3935A00BA652F00B9652E00E38F5400E28D5300105A - 92000D589000135C92000C578F0010C4E700727272FF9E9E9EFFA8A8A8FFABAB - ABFFACACACFFADADADFFACACACFFABABABFFA8A8A8FFA4A4A4FF9B9B9BFF7E7E - 7EFF6D9CD4006A9AD2006697CF0042041B00979797FFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9999 - 99FFBEC0BF005A91B9006093CB0000008800A2A2A2FFFFFFFFFFA7724DFFA772 - 4DFFA7724DFFA7724DFFA7724DFFA7724DFFA7724DFFA7724DFFFFFFFFFF9E9E - 9EFF1583200015832000158320008D060B00A4A4A4FFFFFFFFFFB07B56FFC18B - 64FFC38D66FFC58F67FFC69069FFC8926BFFCA946CFFB07B56FFFFFFFFFFA0A0 - A0FF77BF7D0069B670005BAE6300E18E4200A3A3A3FFFFFFFFFFB07B56FFC38D - 67FFC58F68FFC69069FFC8926BFFCA946CFFCA956EFFB07B56FFFFFFFFFFA1A0 - 9FFFE7E8E700858A88004B84BC00E4955500A3A3A3FFFCFCFCFFDADADAFFD7D7 - D7FFD2D2D2FFCECECEFFC9C9C9FFC5C5C5FFC2C2C2FFBFBFBFFFBCE5F4FF58A5 - D8FF85B1DBFF469DD0FF437EB60044944D00A0A0A0FFFFFFFFFFADADADFF8E8E - 8EFFD8D8D8FFA5A5A5FF8A8A8AFFCECECEFF7374E8FF417ADEFF77BEE7FFB4D2 - F0FFE5F3FFFFACD2EFFF488CC7FF41904A009E9D9DFFFFFFFFFFE3E3E3FFE1E1 - E1FFDCDCDCFFDBDBDBFFD7D7D7FFD3D3D3FF98C9D8FF80D5EDFFB2E3F9FF8BC0 - E7FFAED3F6FFC4E0FCFF669FD3FF3E8B46009A9A99FFFFFFFFFFB1B1B1FF9191 - 91FFE2E2E2FFADADADFF8F8F8FFFA8D2DEFF7CD4EDFFC4F6FDFF6CDDF6FF6DCA - EDFF63A3D7FF5D9BD2FF2C6EA6003B874200959595FFFFFFFFFFE8E8E8FFE7E7 - E7FFE5E5E5FFE3E3E3FFABD3E0FF79D3EEFFC7F7FDFF5FDCF5FF5BE2F7FF7AD6 - F2FF4099DFFF858A88002569A10037823E00929191FFFFFFFFFFB4B4B4FF9494 - 94FFE7E7E7FF7EA2B4FF77CBE7FFC7F7FDFF5EDCF5FF5AE1F7FF7BD4F1FF4695 - D8FFE1E2E200858A88001F649C001963AD008C8C8BFFFFFFFFFFEBEBEBFFEBEB - EBFFA5C8D8FF76B9D6FFC2F6FDFF63DFF7FF5DE2F8FF79D3F0FF4A99DCFF838D - 96FFE2E3E200858A880019609800ED000000868686FFC2C2C1FFBCBCBCFF7E9C - B0FF7AB6D5FF90B7D1FF55C9E4FF5BDFF5FF78D0EDFF4C97D7FFB0BBC4FF8787 - 86FFE6E7E700858A8800135C9400F3009F007A7A7AFF848383FF878686FF4389 - AAFFE0F2FFFF549AD8FF1A7ABEFF4998C5FF3D83BBFF798693FF848382FF7A7A - 7AFFE8E9E900858A88000F5991009999990071717100BEC0BF001963AD002B65 - 83FF94C7F9FF91C9F9FF4185C9FF1C64AAFFC8CAC900C8CAC900C8CAC900C8CA - C900BDC0BF003E7EAD000C578F00FA04080019050900BA653000BB663100113D - 55FF285F87FF4988BDFF428DBCFFBA652F00B9652E00E38F5400E28D5300105A - 92000D589000135C92000C578F00000000FF10C4E700B8286800B8286800ABAB - AB00ACACAC00ADADAD00ACACAC00ABABAB00A8A8A800A4A4A4009B9B9B007E7E - 7E006D9CD4006A9AD2006697CF00000000FF97979700FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009999 - 9900BEC0BF005A91B9006093CB00000000FFA2A2A200FFFFFF00A7724D00A772 - 4D00A7724D00A7724D00A7724D00A7724D00A7724D00A7724D00FFFFFF009E9E - 9E00158320001583200015832000000000FFA4A4A400FFFFFF00B07B5600C18B - 6400C38D6600C58F6700C6906900C8926B00CA946C00B07B5600FFFFFF00A0A0 - A00077BF7D0069B670005BAE6300000000FFA3A3A300FFFFFF00B07B5600C38D - 6700C58F6800FF00FFFFFF00FFFFCA946C00CA956E00B07B5600FFFFFF00A1A0 - 9F00E7E8E700858A88004B84BC00000040FF0000FFFFFCFCFC00DADADA00D7D7 - D700D2D2D200FF00FFFFFF00FFFFC5C5C500C2C2C200BFBFBF00BCE5F40058A5 - D80085B1DB00469DD000437EB600000055FF0000FFFF0000FFFFADADAD008E8E - 8E00D8D8D800FF00FFFFFF00FFFFCECECE007374E800417ADE0000FFFFFF00FF - FFFFE5F3FF00ACD2EF00488CC700000055FF0000FFFF0000FFFFE3E3E300E1E1 - E100DCDCDC00FF00FFFFFF00FFFFD3D3D30098C9D80080D5ED0000FFFFFF00FF - FFFFAED3F600C4E0FC00669FD300000055FF0000FFFF0000FFFFB1B1B1009191 - 9100E2E2E200FF00FFFFFF00FFFFA8D2DE007CD4ED00C4F6FD0000FFFFFF00FF - FFFF63A3D7005D9BD2002C6EA600000055FF0000FFFF0000FFFF00FF00FF00FF - 00FFE5E5E500FF00FFFFFF00FFFF79D3EE00C7F7FD005FDCF50000FFFFFF00FF - FFFF4099DF00858A88002569A100000055FF0000FFFF0000FFFF00FF00FF00FF - 00FFE7E7E700FF00FFFFFF00FFFFC7F7FD005EDCF5005AE1F70000FFFFFF00FF - FFFFE1E2E200858A88001F649C00000055FF0000FFFF0000FFFF00FF00FF00FF - 00FFA5C8D800FF00FFFFFF00FFFF63DFF700FF0000FF79D3F00000FFFFFF00FF - FFFFE2E3E200858A880019609800000055FF0000FFFF0000FFFF00FF00FF00FF - 00FF7AB6D500FF00FFFFFF00FFFF5BDFF500FF0000FFFF0000FF00FFFFFF00FF - FFFFE6E7E700858A8800135C9400000055FF0000FFFF0000FFFF00FF00FF00FF - 00FFE0F2FF00FF00FFFFFF00FFFF4998C500FF0000FFFF0000FF00FFFFFF00FF - FFFFE8E9E900858A88000F599100000055FF0000FFFF0000FFFF00FF00FF00FF - 00FF94C7F900FF00FFFFFF00FFFF1C64AA00FF0000FFFF0000FF00FFFFFF00FF - FFFFBDC0BF003E7EAD000C578F0000001CFF000055FF000040FF004000FF0055 - 00FF002400FF550055FF550055FF240000FF550000FF400000FF004040FF0055 - 55FF002424FF000000FF000000FF10C4E70010C4E700B8286800B8286800ABAB - AB00ACACAC00ADADAD00000000FF000000FFA8A8A800A4A4A4009B9B9B007E7E - 7E006D9CD4006A9AD2006697CF000000000097979700FFFFFF00FFFFFF000000 - FFFFFFFFFF00FFFFFF00000000FF000000FFFFFFFF00FFFFFF00FFFFFF009999 - 9900BEC0BF005A91B9006093CB0000000000A2A2A200FFFFFF00A7724D000000 - FFFF0000FFFFA7724D00000000FF000000FFA7724D00A7724D00FFFFFF009E9E - 9E001583200015832000158320000000FFFF0000FFFF0000FFFF0000FFFF0000 - FFFF0000FFFF0000FFFF000000FF000000FFCA946C00B07B5600FFFFFF00A0A0 - A00077BF7D0069B670005BAE63000000FFFF0000FFFF0000FFFF0000FFFF0000 - FFFF0000FFFF0000FFFF000000FF000000FFCA956E00B07B5600FFFFFF00A1A0 - 9F00E7E8E700858A88004B84BC00000040000000FF00FCFCFC00DADADA000000 - FFFF0000FFFFFF00FF00000000FF000000FFC2C2C200BFBFBF00BCE5F40058A5 - D800FF0000FF469DD000437EB600000055000000FF000000FF00ADADAD000000 - FFFFD8D8D800FF00FF00000000FF000000FF7374E800417ADE0000FFFF0000FF - FF00FF0000FFFF0000FF488CC700FF0000FFFF0000FFFF0000FFFF0000FFFF00 - 00FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00 - 00FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00 - 00FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00 - 00FFFF0000FFFF0000FFFF0000FF000055000000FF000000FF0000FF000000FF - 0000E5E5E500FF00FF00000000FF000000FFC7F7FD005FDCF50000FFFF0000FF - FF00FF0000FFFF0000FF2569A100000055000000FF000000FF0000FF000000C4 - 00FFE7E7E700FF00FF00000000FF000000FF5EDCF5005AE1F70000FFFF0000FF - FF00FF0000FF858A88001F649C00000055000000FF000000FF0000FF000000C4 - 00FF00C400FFFF00FF00000000FF000000FFFF00000079D3F00000FFFF0000FF - FF00E2E3E200858A88001960980000C400FF00C400FF00C400FF00C400FF00C4 - 00FF00C400FF00C400FF000000FF000000FFFF000000FF00000000FFFF0000FF - FF00E6E7E700858A8800135C940000C400FF00C400FF00C400FF00C400FF00C4 - 00FF00C400FF00C400FF000000FF000000FFFF000000FF00000000FFFF0000FF - FF00E8E9E900858A88000F599100000055000000FF000000FF0000FF000000C4 - 00FF00C400FFFF00FF00000000FF000000FFFF000000FF00000000FFFF0000FF - FF00BDC0BF003E7EAD000C578F0000001C0000005500000040000040000000C4 - 00FF0024000055005500000000FF000000FF5500000040000000004040000055 - 550000242400000000000000000010C4E70010C4E700B8286800B8286800ABAB - AB00ACACAC00ADADAD000000000000000000A8A8A800A4A4A4009B9B9B007E7E - 7E006D9CD4006A9AD2006697CF000000000097979700FFFFFF00FFFFFF000000 - FF00FFFFFF00FFFFFF000000000000000000FFFFFF00FFFFFF00FFFFFF009999 - 9900BEC0BF005A91B9006093CB0000000000A2A2A200FFFFFF00A7724D000000 - FF0015D2EFFF07D1EEFF02D3EDFF03D3EDFF07D1EFFF0AD0EDFFFFFFFF009E9E - 9E001583200015832000158320000000FF000000FF000000FF000000FF0006D1 - EEFF78E9F6FFD4F9FDFFD5F8FDFFD2F8FEFFC7F7FCFF76E8F6FF0AD2EEFFA0A0 - A00077BF7D0069B670005BAE63000000FF000000FF000000FF0007D1EDFFA3F0 - FAFFB1F3FCFF91EDF8FF87EBF7FF8DECF7FF9AEEF8FFC7F6FCFF9CF0FAFF07D1 - EEFFE7E8E700858A88004B84BC00000040000000FF000DD2EDFF72E8F6FFA4F2 - FBFF8FEDF8FF95EEF9FF8EEDF8FF93EEF8FF96EEF9FF8DEDF8FFB0F3FBFF6CE8 - F5FF1AD4EFFF469DD000437EB600000055000000FF0005D0EEFFB3F4FCFF94ED - F9FF93EEF8FF96EFF9FF97EFF9FF98EFF9FF94EEF9FF94EEF9FF96EEF9FFB0F3 - FBFF08D1EFFFFF000000488CC700FF000000FF00000002D3EDFFC2F7FDFF8DEC - F8FF95EEF9FF9BF0FAFF9FF0FAFFA0F1FAFF9EF0FAFF90EEF9FF74E9F7FFAFF4 - FDFF02D3EDFFFF000000FF000000FF000000FF00000002D3EDFFBDF6FCFF99EF - F9FF94EFFAFF9DF0FAFFA0F1FBFFA1F2FBFF91EFFAFF78EBF9FF67E8F7FFA5F2 - FDFF02D3EDFFFF000000FF000000000055000000FF0005D0EEFFA9F3FCFF9CF0 - FAFF7BECF9FF5CE7F8FF4DE6F8FF48E6FAFF3DE4F9FF38E3F7FF4BE5F8FF88EF - FBFF08D1EFFFFF0000002569A100000055000000FF0007D1EEFF6BE8F6FF8FEF - FCFF41E3F7FF3CE4F8FF44E6FAFF49E7FBFF44E6FAFF3FE4F8FF70ECFBFF50E4 - F5FF0FD1EFFF858A88001F649C00000055000000FF000000FF0008D2EEFF6FEA - F9FF74ECFBFF4EE7F9FF47E7FAFF4DE8FCFF4FE7FAFF61EAFBFF5FE8F8FF09D2 - EEFFE2E3E200858A88001960980000C4000000C4000000C4000000C4000005D1 - EEFF46E2F5FF69EAFAFF64EAFCFF58EAFBFF54E8FAFF3BE1F5FF06D1EEFF00FF - FF00E6E7E700858A8800135C940000C4000000C4000000C4000000C4000000C4 - 000014D2EFFF07D1EFFF01D3EDFF01D3EDFF08D1EEFF10D1EEFF00FFFF0000FF - FF00E8E9E900858A88000F599100000055000000FF000000FF0000FF000000C4 - 000000C40000FF00FF000000000000000000FF000000FF00000000FFFF0000FF - FF00BDC0BF003E7EAD000C578F0000001C0000005500000040000040000000C4 - 0000002400005500550000000000000000005500000040000000004040000055 - 5500002424000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFA6BFF2FF3359B7FF0D4080FF0D2690FF3359BBFFA6BFF2FFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C66 - BBFF000D88FF000D88FF001A8CFF001A8CFF001A90FF001A90FF4C66BBFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4059AEFF000D - 84FF002695FF0D0D6AFF22223CFF262640FF080866FF002695FF002695FF4059 - AEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C73BFFF000D84FF0033 - 99FF0D2688FF2F2F2FFF333333FF333333FF333333FF001A88FF003399FF0026 - 95FF5973C8FFFFFFFFFFFFFFFFFFFFFFFFFFCCD9F2FF001A90FF000D80FF0D1A - 77FF0D3395FF333333FF333333FF333333FF333333FF002695FF0D1A77FF000D - 80FF001A90FFCCD9F2FFFFFFFFFFFFFFFFFF668CCCFF001A73FF22223CFF3333 - 33FF111E7BFF263362FF333333FF333333FF1A2662FF111E7BFF333333FF2222 - 3CFF001A8CFF668CCCFFFFFFFFFFFFFFFFFF264CAEFF000080FF333333FF3333 - 33FF222240FF0D2690FF333333FF333333FF001A90FF222240FF333333FF3333 - 33FF001A88FF2659B2FFFFFFFFFFFFFFFFFF0D2690FF001A90FF333333FF3333 - 33FF333333FF222244FF22487BFF1E4484FF222244FF333333FF333333FF3333 - 33FF001A90FF0D2690FFFFFFFFFFFFFFFFFF001A90FF003399FF001A90FF0D33 - 84FF334C66FF152F77FF003399FF003399FF152F77FF334C66FF0D3384FF001A - 90FF003399FF001A90FFFFFFFFFFFFFFFFFF0D2690FF002695FF001A7BFF001A - 88FF002695FF0033B2FF0073FFFF0059FFFF001AAAFF003399FF001A88FF001A - 7BFF002695FF0D2690FFFFFFFFFFFFFFFFFF1A3390FF001A90FF001A90FF0026 - 88FF003399FF3D63D6FF60A0E0FF6093E0FF3D63D6FF001A90FF002688FF001A - 90FF003399FF1A3390FFFFFFFFFFA6BFD9FF1A4095FF000D8CFF001A90FF001A - 90FF003399FF33408CFF777777FF777777FF33408CFF002695FF001A90FF001A - 90FF002695FF1A4C8CFFA6BFD9FF3366B2FF1A4C99FF0D3388FF002695FF0033 - 99FF003399FF002695FF001A90FF001A90FF002695FF003399FF003399FF0033 - 99FF0D3395FF1A4C99FF3366B2FF1A4C8CFF1A4C8CFF1A4C80FF001A90FF3737 - 59FF111133FF003399FF373759FF111133FF003399FF373759FF111133FF0033 - 99FF1A339DFF1A4C8CFF1A4C80FF003380000033800000338000001A90FF1111 - 2FFF151533FF003399FF11112FFF151533FF003399FF11112FFF151533FF0033 - 99FF003380000033800000338000003380000033800000338000001A90FF0026 - 95FF001A8CFF003399FF002695FF001A8CFF003399FF002695FF001A8CFF0033 - 99FF00338000003380000033800010C4E70010C4E700B8286800858A88FF858A - 88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FFFFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00858A88FFFEFEFEFFFEFE - FEFFFEFEFEFFFEFEFEFFFEFEFEFFFBFBFBFFFBFBFBFFF6F6F6FFFBFBFBFF858A - 88FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00858A88FFFEFEFEFFECEC - ECFFEBEBEBFFEBEAEBFFEAEAEAFFE9EAE9FFC6C6C7FFABB0AEFFE4E5E4FFFBFB - FBFF858A88FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00858A88FFFEFEFEFFEBEB - EBFFEAEAEAFFEAEAE9FFE9E9E8FFE8E8E8FFE7E8E8FF9A9F9DFFEFEFEFFFE4E5 - E4FFE4E5E4FF858A88FFFFFFFF00FFFFFF00CCD9F200858A88FFFEFEFEFFEAE9 - EAFF898989FF36342EFF36342EFF898989FFE6E6E6FFA8AAA9FF9A9F9DFF9095 - 93FF858A88FF858A88FFFFFFFF00FFFFFF00668CCC00858A88FFFEFEFEFF8888 - 88FF6C6C6CFFFFFFFFFFFFFFFFFF6C6C6CFF888888FFDADBDAFFBBBDBCFFC1C3 - C2FFD0D0D0FF858A88FFFFFFFF00FFFFFF00264CAE00858A88FFFEFEFEFF3634 - 2EFFFFFFFFFFE7E7E7FFE7E7E7FFFFFFFFFF36342EFFD2D2D2FFD0D2D1FFC8CA - C9FFE0E0E0FF858A88FFFFFFFF00FFFFFF000D269000858A88FFFEFEFEFF3634 - 2EFFFFFFFFFFE7E7E7FFE7E7E7FFFFFFFFFF36342EFFD2D2D2FFE3E3E3FFE3E3 - E3FFFEFEFEFF858A88FFFFFFFF00FFFFFF00001A9000858A88FFFEFEFEFF8383 - 83FF666666FFFFFFFFFFFFFFFFFF6B6B6BFF6F6F6FFFCFCFCFFFE3E3E3FFE3E3 - E3FFFEFEFEFF858A88FFFFFFFF00FFFFFF000D269000858A88FFFEFEFEFFE3E3 - E3FF848484FF36342EFF36342EFF5B5B5BFF868581FF36342EFFCDCDCDFFE3E3 - E3FFFEFEFEFF858A88FFFFFFFF00FFFFFF001A339000858A88FFFEFEFEFFE3E3 - E3FFE3E3E3FFE3E3E3FFE3E3E3FFCDCDCDFF36342EFF868581FF36342EFFC5C5 - C5FFFEFEFEFF858A88FFFFFFFF00A6BFD9001A409500858A88FFFEFEFEFFE3E3 - E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFCBCBCBFF36342EFF868581FF3634 - 2EFFFEFEFEFF858A88FFA6BFD9003366B2001A4C9900858A88FFFEFEFEFFE3E3 - E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFCACACAFF36342EFF8C8B - 88FFFEFEFEFF858A88FF3366B2001A4C8C001A4C8C00858A88FFFEFEFEFFE3E3 - E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3 - E3FFFEFEFEFF858A88FF1A4C80000033800000338000858A88FFFEFEFEFFFEFE - FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE - FEFFFEFEFEFF858A88FF003380000033800000338000858A88FF858A88FF858A - 88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A - 88FF858A88FF858A88FF00338000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00A9CAB7FF86BE9CFF65AB89FF69AE93FFFFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003535 - 68FF192050FF249850FF21A857FF09A85FFF0AAF70FF78C4AAFFFFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002C2C63FF161F50FF229E - 52FF23A454FF0CA75EFF0DB674FF4FBD90FFA8D3BEFFB6DAC6FF9FDDBFFFADDA - CAFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF003B3B70FF263161FF23985BFF219C59FF0FA7 - 61FF11B677FF0DB170FF1C9657FF17A764FF04BB71FF75D2B6FFFFFFFF00FFFF - FF00FFFFFF00FFFFFF00A3A4A2FF6C6E6BFF717371FF6F7170FF707271FF7072 - 71FFBABBB9FF444478FF313C6AFF21A15FFF1AA35AFF0CAF62FF0DB773FF1DBC - 7CFF1D9C58FF17B476FF06C67FFF72D7B6FFFFFFFF00FFFFFF00FFFFFF00FFFF - FF00646462FFC1C2C1FFB2B2B1FFB2B3B2FFB2B3B2FFB0B1AFFFBABBB9FF5757 - 87FF4C527FFF6CBB91FF6DAC86FF7BAF89FF55A776FF1B9C58FF199C61FF17C2 - 86FF05D88CFF5EDFB9FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00727272FFAAAB - AEFF7B7B7AFF828282FF828281FF828281FFBABBB9FF61618FFF5D5F8DFFBABB - B9FFC1C2C1FFC1C2C1FF99C5A6FF2D9E56FF27A76CFF09C485FF05DB93FF66D9 - BAFFFFFFFF00FFFFFF00FFFFFF00FFFFFF006D6E6CFFB4B4B8FF939393FF8585 - 85FF878989FF86888AFFBABBB9FF7878A0FF7777A0FFBABBB9FF565857FF575A - 58FFFBFDFC00669C79FF509C77FF2BB286FF45C69DFFCCEEE4FFFFFFFF00FFFF - FF00FFFFFF00FFFFFF00757775FFA3A3A1FF9D9D9CFF878686FF8B8A87FF928D - 86FFBABBB9FF8383A8FF8383A8FFBABBB9FF9E9892FF9D9890FFBABBB9FFDEEA - E2FFCDDFD4FFBBE6D8FFD3F3E9FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF008B8B89FF8C8C8BFF989998FF7E807FFF6A7B90FF436999FF41689BFF4167 - 99FF416799FF416799FF406798FF3F6699FF416798FF4A6C98FF385D8CFF466D - 9FFF5C83B4FF587EB0FF577EB1FF8D96A2FFFFFFFF00FFFFFF00999999FF7D7E - 7DFFB6B5B2FF6E7680FF728DAFFFACC7E5FFA0BBDCFFA2BEDEFFA2BEDEFFA2BE - DEFFA2BEDEFFA2BEDEFFA3BEDEFFFDF4EDFFEF9342FFF19C53FFF19B52FFF197 - 4AFFFADDC4FFFEFEFEFFFEFDFDFFF8D1AFFFF0994CFFF19B52FFF19C53FFEF93 - 42FFFDF4EDFF0000000000000000FCEADAFFED801FFFEB7006FFEC7B19FFEE82 - 23FFFBE5D3FFFFFFFFFFFEFDFDFFF8CCA6FFEE8428FFEC7B19FFEB7006FFED80 - 1FFFFCEADAFF0000000000000000FFFFFFFFFDF2E9FFEB7006FFF5BC8AFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5BC8AFFEB7006FFFDF2 - E9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B782FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B782FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B782FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B782FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B782FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B782FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEB7106FFF5BB88FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5BB88FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEB7106FFEB7207FFEC75 - 0DFFEC740CFFEC740CFFEC740CFFEC740CFFEC750DFFEB7207FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF08F3AFFF3AD - 6FFFF2A968FFF2A968FFF2A968FFF2A968FFF3AD6FFFF08F3AFFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B985FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B985FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B782FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B782FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B782FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B782FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B782FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B782FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFDF1E7FFEC7106FFF6BC89FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6BC89FFEC7106FFFDF2 - E8FFFFFFFFFF0000000000000000F2A35FFFEF8A34FFEB7005FFEC7E20FFEF8D - 38FFFCEADAFFFFFFFFFFFEFDFDFFF8CEAAFFEF8D37FFEC7E20FFEB7005FFEF89 - 32FFF5B680FF0000000000000000F3AA6AFFF19A50FFF19B51FFF19B51FFF196 - 48FFF9DBC0FFFEFEFEFFFEFDFDFFF8CFACFFF0974AFFF19B51FFF19B51FFF19A - 4FFFF4B279FF0000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF008F90 - 8A398F908A9D8F908AD38F908AF28F908AD68F908AA28F908A3FFFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF008F908A118F908A899FA0 - 9AF4C8C9C2FADBDCD5FDE6E6DFFFDCDDD6FDCACBC4FBA1A29CF58F908A8C8F90 - 8A1AFFFFFF00FFFFFF00FFFFFF00FFFFFF008E8F890E8F908AF2B8B9B2F8E2E2 - DAFFE4E4DCFFE4E4DCFFCACAC4FFE2E2DAFFE4E4DCFFE3E3DBFFBCBCB5F99091 - 8BF28E8F891FFFFFFF00FFFFFF00FFFFFF008D8E8889B6B6B0F8E1E1DAFFE1E1 - DAFFE1E1DAFFE1E1DAFF646463FFD9D9D3FFE1E1DAFFE1E1DAFFE1E1DAFFBBBC - B5F98D8E888CFFFFFF00FFFFFF008D8E87399C9D96F4DCDDD4FFDEDFD6FFDEDF - D6FFDEDFD6FFDEDFD6FF646463FFD6D7CFFFDEDFD6FFDEDFD6FFDEDFD6FFDDDE - D5FFA0A199F58D8E874DFFFFFF008C8D869DC0C0B8FADBDBD2FFDBDBD2FFDBDB - D2FFDBDBD2FFDBDBD2FF636363FFD4D4CBFFDBDBD2FFDBDBD2FFDBDBD2FFDBDB - D2FFC7C7BEFB8C8D86B1FFFFFF008B8C85D8CFD0C7FED7D8CEFFD7D8CEFFD7D8 - CEFFD7D8CEFFD7D8CEFF636363FFD0D1C7FFD7D8CEFFD7D8CEFFD7D8CEFFD7D8 - CEFFD4D5CBFE8B8C85E7FFFFFF008A8B84F2D4D4CAFFD4D4CAFFD4D4CAFFD4D4 - CAFFD4D4CAFFD4D4CAFF636362FFCDCDC4FFD4D4CAFFD4D4CAFFD4D4CAFFD4D4 - CAFFD4D4CAFF8D8E86F28A8B8409898A83DBCACBBFFED0D1C5FFD0D1C5FFD0D1 - C5FFD0D1C5FFD0D1C5FF636362FFB2B3AAFFD0D1C5FFD0D1C5FFD0D1C5FFD0D1 - C5FFCDCEC3FF898A83E9FFFFFF008889839DB5B6ACFACCCDC1FFCCCDC1FFCCCD - C1FFCCCDC1FFCCCDC1FFAFB0A7FF656564FFB2B2A9FFCCCDC1FFCCCDC1FFCCCD - C1FFB9BAAFFB888983ABFFFFFF008788823C989991F5C9C9BCFFC9C9BCFFC9C9 - BCFFC9C9BCFFC9C9BCFFC9C9BCFFAEAEA4FF656564FFAFAFA5FFC9C9BCFFC9C9 - BCFF9D9D95F68788824DFFFFFF00FFFFFF0086878194ADAEA3FAC5C6B8FFC5C6 - B8FFC5C6B8FFC5C6B8FFC5C6B8FFC5C6B8FFACADA2FF999991FFC5C6B8FFB2B3 - A7FB868781A5FFFFFF00FFFFFF00FFFFFF0086878030878881F2ACADA2FAC2C3 - B5FFC2C3B5FFC2C3B5FFC2C3B5FFC2C3B5FFC2C3B5FFC2C3B5FFAFB0A4FB8889 - 82F286878041FFFFFF00FFFFFF00FFFFFF00FFFFFF0085867F3385867F979697 - 8EF6AFB0A4FBBFC0B1FFC0C1B2FFBFC0B1FFB0B1A4FB989990F685867FA28586 - 7F3FFFFFFF00FFFFFF00FFFFFF00BBBBBB00BBBBBB00BBBBBB00BBBBBB008485 - 7E4784857EAB84857EEC84857EF284857EEF84857EAE84857E4DBBBBBB00BBBB - BB00BBBBBB00BBBBBB00BBBBBB00BBBBBB00BBBBBB2ABBBBBB54BBBBBB7EBBBB - BBA8BBBBBBD5BBBBBBFFBBBBBBFFBBBBBBFFBBBBBBFFBBBBBBD5BBBBBB9FBBBB - BB6CBBBBBB36BBBBBB00BBBBBB00 + 4C7A100000001000000010000000071D00000000000078DACD9A095455D7B9C7 + BFF4C524B6F135AED7BCBC98A6696D6ABBDA34C69266A8B141E33CD438C52971 + 16278C380F2841410601050105045114C509107140501C100427040464109967 + 50662EE0FF7DDFBEDCEB6552D3BEAEF58EEBCFD977EFFDDFFB3BFBECDFDDFBDC + E31B5185F406EBBAC3185C771CDB564E6311CBE71887B1B8663F0A516BFA63E0 + CBBDC8F9957788E81D7A89DEA5412FBF43515B47A0BEAA0C0D3515AC7234541B + 88F3A5ACAA200539219B90EE361F3F213B7ABB9B2DB763C7EDD8D135BB51D0D4 + 5541F330064DD9B168CA613DBC8EC6AC6B6848BF8C9AE473405303EA5243911D + CC6DEC9C0787577ECAFE9F91132BDA7E341A6B1FA339F7169A726FB3F89C7303 + 8DDC4643C615D4269F470BFB9B0B6E41931F8B9C33D6885C3F08CEAFECA477BB + ED64FFA856FF1D34E5C5A339EF8E6A4B931D87C6CC28D4DD8F404D7196BA8EA6 + FA6AD45616E38AC510F67BD11B2F7B69FD358FB8FD4456125A0AF99C7757C5A1 + D1C7108EEAA4D3789C708AC7E811A2B60CC5631EC11E2F1345DB8D647F259E14 + A6B03799750F2DDC4E7341028FC74D68B262541B756917780CC2A1E1BAD15643 + F156B73B544B77D83F82FDE5785294DAAA146E8BDBC96F8D43DAE0B16DCCBCAA + DAD170DDE82D43D8DF9DFDDD29DA7A181AABCBD897ACBCDA185AE3E036644C9A + 72B57168B2A2A1A92A41B4E520F6E7B33F9FAE715B0D55A5DA3E0D55704F1F43 + 730EDF93EC1BDAFB5B5F856B1BBF647F09FB4BE81AB7D5F0B8084FF2B5F59547 + 27E5BDCDBAC97382BDD9D7D1A2A9C7659E8B6F75EBC7FE7E14B5D118F58F0AD0 + 103A09F5A1DFA0FEF4444E4F4043C804D49F1AAF55C838D658A5E6C65A442EFB + 04FFC1E35FCE33F0F2BA2F505F9E8B962BDF03A9FB8094BD40F21E3E7BF07917 + CB1DB8E70624B9A2E9E27C8EBF06E10BFA21F54A2155932F452EFF0CB5A55968 + 895C88E60B0B549DE68BF3B4BA30074D17E6A22962367F9E85E688396A2E86CD + FB33F6BC74871A5FBE45118B8CF8FA4B505F9685BAD207A82B11652869AA4BB5 + E2316FE6B9D7DC5083274F5A7076D61F61FD5277D2BCFC1AB3D49DCECFFF08E1 + 26FD70DEE4A3A79A2FEA8BB0F91F6A354FABB3733E4035F36BF952BE625F74EE + 0F0B9598FBA7721A4BCC3F31FFC4FC13F34F5DF04FCC06693222D1783F1C75CC + 6B4D62281EDF0942C58D63C20D31FFC4FC13F34F9DF04F9AF48B68E439A2297B + 80C68A1C3496E7A0A1380D8FEE5D40E1255FE19F987F62FE89F92743FE35E917 + D0C0F34353918B7A9E77753C5FEA78AED5E5C6A3B1241365774E23EB8CABF04F + CC3F31FFC4FC938EFFFA943034F2B82B2FB352FB300EB50FAEA336F39A6AA736 + 271EE9C18EEA3A987F62FE89F9271DFF72AD8DE5D95A6F562C7B63509311859A + F42BA849BB84066E37E5A88DF04FCC3F31FFC4FC938EFF47B703D1C8F7BE364B + FA8C66EF55F65D46F5FD8BA84EE16BE3EF9544FF1F847F1E837062FE89F9271D + FF65D70338F614D5BFAECFEAD40BEC0D579FAB1FC4E296AFB9F04FCC3FFBCB89 + F9271DFF4557FD501E7F160D45F7D5752B6FB2D65B9F9780AC701FF8B8ED14FE + 89F9279E8BC4FC9301FF947D6E178A6203519B7D0BF5CC6D7DFE5D54675E47D6 + 796FC404B8C026F01E066E3A2DFCF3185611F34F06FC13F34FF703B721F9C856 + 75ADF1FBCC71CB7B0DFC5CB761B5DF4D1CBB518435076FE323B300E19F987F32 + E09F987F62FE89F927E69FD31388F927669FBE587F12F3765F83CFE53C9878C6 + E0BDF93EC23F19F04FCC3F31FFC4FC13F34FCC3F9F3DF8BC8BE54E7F5AEA8F49 + 4E11B03F9D89FF99B95BF82703FE89F927E69F987F62FE89D9D7EAC21C62FE89 + F9A777E678A1F7021FF49CEE2AFC9301FF7CFD25C4FC13F34FCC3F2B4389D9D7 + 8AC79CF927E69F987F62FEA91DFFC4FC1373FF54F3457D89D9D76A9E56CC3F3D + 8FFF356BD6E29FE09F860F1F8EA8A828343737E3DAB56B303737C7850B17E0E8 + E888E7F04F77EEF0FADBD40439CACACA10141C8CE898187DDEA5A8589C3E1781 + 4EF8278B0DAB7029F61E4A4B8A91939D838B172F228AFB2F2C2C444545056A6B + 6BF1E87115C2C223B1618D19DAF14F911723B0C4FE140E8744E24470280E1E09 + E2FEE21073330137E25370E75E06AEC4DC41705814C2C3CFA11DFF947A3F1DD9 + D9D92FA4A47B2968C73F9D08BF8D836129F03F9788832CFFB0441C62C9E7C37C + 0E084BE033EB7C324E84DF423BFEE9CDB17BD0CFBA1A7D3795E0838D25F890CF + 83EC4BF115EB238B52FC99F37EB7B604BF58598357877BA31DFFF4FBC9BB31FB + 1030DDA711133D1B71EE5E0B920A80FC4740C08D168C746DC0008706FC612BD0 + 73D46EB4E7FFDDE19698C0CBE6F8DDF55879AC110FCB9EC03D52C3DE269C4D6C + C69F2C6BF186590DBA9901AF0DD882F6FCFF77FFC518C34BEE889D75287AFC04 + 07AE37816656E1172B6A9057F904E6C18DA05955F8092FD1AF1A99A23DFF3DFF + F22D7E6F0DBCBEA41AC76E35C1E66C233EB3ADC517DBEA107CA709B3FDEAF1EA + A26ABCBC8CFD1FCEEA94FF974C5B4026D5E86D518B9C8A27482B6D4165DD135C + CD6A81917B1D3EF5AAC31BEB9F08FFD419FFDDBE6F41B7A50D78D5AC1E7FB66F + C0A0DD1ACC3BD184C17B35F8EB9E460C3EDC845FD940F8A7CEF8EF3E370DAF2D + 29C7CF4C4BD19DF5FAB252FCE78A52BCB9B60CEF6E2AC36FB654E0CD6599F877 + F09FE73604B9AE8351E0351E39DBBF429675BF17E6BFC0E31FEC3186F09FB5F5 + AF28F09D854CF33F0AFFC4FC13F34FCC7F97EB7F8ED31768E59FB22C3E449EC7 + 54A4AFFAADF04FCC3F31FFC4F813F34FCC7F87F55FFACC761CA8FA2C3C608A07 + 9BFF26FC13F34FCC3F31FFC4FC13F34FCC3F31FFFAF53F7BFB20489FCC3F31FF + B4F3E877D8BA7F9CF0CFFDC511F34FCC3F31FFC4FC13F34FCCBF7EFDCF739F84 + F4B5BF03F34F8E0727C0EE8633ACA21D30DB77BCB04E035D46A0E0F83AE41F5D + 8BC2236B50706415F20F2D478E9F99DAFFCB75DE37FB155297BC03EB7DE36179 + CD0EC11967B0FADC4688F7F3AD5F229F7DF901AB5012BE13C5E75D51186A8F87 + 7B4DD18E7F62FE69DCE169587E66030EA59EC0DE447FF4DBF0A9F04FF987CC90 + EBB70C1511EE2839B2BA33FE89F927E65FC5BC27C10FEEF13EF8A3595F14B237 + 67FF52E4F82E4679A82D8A0FADE88C7F62FE4917B3F42B5E1B9B91C83BBA1159 + DE8B847F2A39BA1EC5016B3AE39F987F62FE89F927E69F987FCA3FB802597B16 + 0AFFC4FC53F1A19528F25FD119FFC4FC13F34FCC3F31FF54B07F11728F5A22C3 + 7D9EF04FCC3FE5EFFE8EE35FA3C6A113FE89F927E69F0AF72F44B6FF7A64B8CD + 41BACB6CA439CF40AAD374647999A2F8F07A350E9DF04FCC3F31FF94EFBF1A99 + 1E0B857F62FE89F927E69F729D27B37F03729C26A213FE89F9A722FF95DCE74C + 64387F27FC13F34FCC3F31FF94EFB5102527AC90E736039DF15FE0351BF9BB67 + 20C76D3AF33C0D3AFE73774CE43E2720C7711C72B67DAD57FBF59FF927E69F98 + FF2EF7FF4BBD93B0D82B0126BBEFA0957FF618532BFFC4FC13B348EDF937DB9B + 0CF16E3D9986692E6198E57A03ADFC93A5A5252C2C2CB071E3466CD8B0016BD7 + AEC5EAD5ABB162C50A2CDF9B8465ECB50DC9C0B1C4221C892FC014E77398BA3D + 1AADFCD3A64D9BE0E9E9A9E4E5E5A5B467CF1EA5653E89387AB710C7581E31D9 + 70B9F200DFEC388BF1F697C1FCCB770E499FE21DEF32159E5E9ECAE7EDEDAD64 + EA158FC3B7F3B1E37216EC2F64C08135C1E90C46594780F927E69F245EE973C0 + B62118B16DACF2F9F8F82899ECBA09BF1BB9CA6B1596066BD63887D3F8CAE20C + 06BB8DC1209751F8D2693806D80FC17707E763DABED91862350A7BF7EE559AB5 + 33167B637260752E0D9B425360712A0563ED43D19FF7B5039D47C22DC1172EF1 + 5E70BAB50BF63776C2FABA13C6794CC1C08D43E1EBEB8B69DBA3E071F52136B2 + 6F5550326644956394DD297CBCF218FEEE30143B6E7B6253B42DD65DDD8C9597 + 3662156BFD95CD18E13C16137F988C89F691708BCCC4EA1349987B2E1BA39280 + 410EE7F0C1F787D0DF7690BE4FCB683B985FB5C2DACB3F60D88E31E8BFEA4BEC + DFBF1FA3ADCFC3293C1DDF07DC85C9A1BB98199A85615B4FE2778BF6E3D32D7F + C7C716FDD16FFDA7F870F5C718E1F23586EE188DCF570E505E3F3F3F0CB10885 + DDD9FB5870E00E66EFBD89B9BE37797C4EE2BD79DED0F13F6BD62CECDBB70F03 + D60CC427CB3F573ED181030730607D30B6F0B5CF61DF34AF58CCD81387AF3607 + E1ED591ED0F1FFEDB7DFAAFEBE58698C7D7C169FE8E0C183F864D5516C0A4AC2 + 74F64E748FC1945DD731D03210FFF5AD1B74FC4F9932A54D9FE213F9FBFBA3EF + 327FAC3B96C04AC4CAC377B168DF2D18FF10889F4F7551736EF9F2E598387122 + C68D1B87B163C762F4E8D118397224860D1B86214386E077FCCCF097550118B0 + 3108C3AC4FE31FDBCEE3EF1627F0FAE41DE8847FFE8E9B41CC3F31FF64C03F73 + 3681DE98B6133DA63873EC3B95FF9FE49F987F62FE75EB3F5DBC1489EB71B12F + 24A9CBFC13F3AFD6FFADDBEC50C0FBF4FCFC7C14141420373757292F2F4FE5E9 + 247BF9E2E262141615423CCCBF5AFFB5FE023C7CF810393939888DE57EAE5F57 + 8AE1E7075D3A292949B521120FF32FEBBFBE7FF14ABFE2179F4E3A7F6262228A + 8A8AF4FD33FFB2FE2B7F3EC79D9999A9E2BC7FFF3ED2D2D2909191A1DA122527 + 27ABBD7F494989DECFFC13F3AFFC79F979B8C775A45C9E836EDDBAA524DF6BD3 + A74F87ADAD2DD2D3D3515E5ECEFE22E567FE89F9D7C72FB1E9FC478E1CC1B163 + C7101616A6BE4B4D4C4C544C9595957A3FF34FCCBFF2EBC645C657DA080A0AC2 + A2458B14538B172F56DFC3376EDC50CF5245AD7EE69F987F7DFC893CBEE24F49 + 49C1E9D3A7616A6A0AE15227F97EBF7BF7AEFEFA997F62FEF5F74FFA7FF4E891 + BA8F0F1E3C40424282BA96E8E868585B5B2B095FD97C9FC4C3FCABF55FC55FA4 + 8DBDB4B454DD67B9578692FB287C070606222757EB67FED5FAFF227EB96E2997 + 7B58D03A7F987FB5FE6BFD45EADEC8F8CA59EACBB53C7EFC18D5D5D568686880 + 46A351E7226E473CCC3F31FFC4FCFF287E2E705DE69F985FFA27F827E69F987F + E5FFBFE2FFEDB927A013C748CF125F2BB5E35FF98FD540F999411231FFF4A6D5 + AFF12CB5F2DFC6CFBC11F3AA247582B343E1977A08AEF19ED81AE380B5919BB0 + E88C19A607CE452BFFCA7FA4FAA99FE78B5EBAB6781E10CF7DE2B9A23C06FC2B + BF6F89D6CFFC13B346CC7F97F18BC7807FE57779A8F5CB7310B3AF24750F671E + 871BC7BEF99A0D969E5B89A927662BBF01FFCA6F99F4D4CFFC13F34FCCBFEC4D + 88F95731F1FCE4F88B94C7807FE5378BD6FA997F62FE89F9EF10BF3C4B15B5FA + 0DF857FE99615A3FF34FCC3F31FFCA1FF430047B530E60FB2D57E15F3F7E06FC + 2BFF3F4E68FDCC3F31FFC4FCAB6742E69F987D25E69F987FE511FE0DE79DB11F + 60F859EE972E6EB98FCC3F31FFC4FC6BFB6CE55FEA7EE60D7CE2057CEC09BD57 + E7F74F3FA2AE9BF92779A663FE95DF807FD586CECBFCAB674EE69F987F62FE89 + B927E65F9D997FE569C73FBD083B22E69FFE2FF997EF76D967060404A835E3F8 + F1E33871E2843ACB67C997BD8CEC89E53BBC3DFFBB77EFC68B1EB2DF69CFBF7C + A7CB7178C598674A0E8993EF09E924FC4B6C72049B7F83CB0EF370D5C904D776 + 2C40B4F3225CDFB904716EA6AA4C0E59CF987F62FE89F957EBBFECD774FEAB4E + 0BD8BBB08D37CEFD7BBD7FFF3E5FB4E75FFCF27BA7ACAFB2F6C9BA75FBF66DB5 + EECB6FA057AE5C4164642422F26B30C53F959F7FD231D4275EBFFE4B4C72C898 + 6FDFBE1DA9A9A96ADFB86DDB36D5CECA554518B8E101D65E2C4468C223E4F3F7 + D4F1844A0C778C91FD3FEDE5670C3964EF22EB93EC3B64AF20B1C8DAE5119B0A + CB7BE508C96D84C3A5420426D621EA61334C7C1365FF4F5EFCBC23C7C99327E1 + E2E2A2F64112CB8E1D3B1090F0001B93CA1155D702D3CC3A2C8D2BC7DC0329F8 + 6E4F827EFD777777577EB5376ADDC7492CC7121F627D620562EA5B3033A316D3 + 73EAB121B90AC69E5930E47F27F72947686828DCDCDC541B167EA1587BA35079 + 67B0775A763DCC931E63A87B2ADAF1CFCF960ECA2F6BB7C8FF7A2AD68425E30A + C73C37AB1EDFE534701C8F30D2939FBF9C76A13DFF3636367C8F2E2322220216 + DEC1D870E61E9CCFDEC5A4D83C4CCFAAC5BAF8728CDE9D82E0F028DE87D9A03D + FFF2EC686D65055B6EE72BFBA37858054CF44A45AF0D1731C2E31A06588563BD + 8D2BD7D9A29E6D9FC13FFD69BE15DC621AE112DB88815B63F1CB7947F163F8EF + 396012FE30D31623EC2E609053049EC73F1F305CFF65CD60EE89EFBF3ACB67E6 + 5F1823E69F98FF36EBBFF8997FF5FBDC8B48AEB72DFF247B3A55C68C3F535287 + F92743FEC52FB14919334ACC3F31FFC4FC13334CCC3031C3AA4CEA306B64C8BF + F8995FBD9FF967EF42D2452C5EE65FEF67FEDBACFF44C6E026847FB5BECADA27 + EB96CE2FBF8130FFC4FC13F34FCC3F31FFC4FCABF59F6892F28B64CC997F62FE + F57EE69F987F62FE493788CC3F31FFC4FCB7F1CB9E49D627D977E8FCB28631FF + C4FCEBFDCC3F31FFC4FCB7F133FFC4FC13F3AFF733FFC4FC13F3AFF733FFC4FC + ABF5DFD04FADFF987FBD9FF9276698987FBD9FF9D7AFFF9DF9E5375B9D5FBCCC + 3F31FF7ABF21FF9DF9997FBD9FF9272964FEF57E43FE3BF333FF7A3FF34FBA0A + 3ABF21FF9DF9997F7D65E6BF83DF90FFCEFCCCBFBE32F3DFC16FC83FD12FA16D + 83E7A131D799C47A9F3089F344EF93A409C6E237E63A93B8EEFBEF43E6BD8EFD + AEF8D7D5790EFF64C8BF1A647D9A7419CFE29F0CF9D78D8536ADF53F9B7FA06B + 69FDCFE6FF05FCCFE65F55D3F1AFF3829E5E7F7BFEA58201FFBA6AAD630EB4F2 + AFF71BF0DF3A4DB429E11FCFBE807FBB0CE3D79D5AF9D7C76FC07F9BF85BF96F + EB8FD2F3AFF71BF0AFF71BF0DFC12F32F4CB9F56FE95DAF0DF5ABF5319F8B5AD + 69FD6DF8FF27FCEDF87FA1F80DFDEDF86F6DC3583B15A314FF9C3349EF6F2DE5 + 3FFC77127F7AFF7DD21DCFE15F1D3F927F83B4F6F891FCD39BBCB77DF56E057E + 92588EFF60BD7AB7123FE53D5817FCB7D12BEC5B575C87A4C616DC6B684142C3 + 139E7FCD585354879F2654A013FEF57AF56E390E3CD2E06475335CCA1B605B5A + 0FA7B27A78553420A6AE19DE5C267175C67F8F8472ACE03E0E563561077BDD2B + 1AB19DCFAEECDDC569274E075737C1B4A816BD922A3BF0DF2DBE02A76A9AE156 + DEA8F554366237CB83E556A195B4236DBCC6E32111B7F2AF24637585F7CA4E65 + DABEF770ACBEAC7D8F35D8CB6767CE5B555C8FA09A1635AE683772927781AFD1 + 53FAABD4C047799BB09FAFC7853FAF2B6DC482A27AF857B5F51BC67FA45A3B46 + E6658DF8B6B001630A1A30BC408301798DF82CB71EA3F21B6057F9347E43FE65 + 5C97F0F8EDA86CC640AEFB455E0306B3774461933A7FC99FCDCA9AF0755E2D7E + CEFECEF87F8DEFEFB212BE4EAEF78FC2460C2BD4604C5133C6F2797649136616 + 35A03BD769C77F1B75E33886E6D462518906F34A9A31857D138B34E89F5D0B99 + 5B9DF0DF41BF50F3B7122FF138895E63DF1BADDE17E05FA9957F22837BF482FC + 9301FFFA3BD415FF9D3DA31F8AAC82D1D4B3E8616C891E7D9C391DAEF25EE418 + 6D12CE30D869D5CBB155CE4A52F6ACC3786A20FBAC417DDCD1A3C762F4EEFD05 + FAF431C66BAF99A83C91D4E9B4DF95915AAF9127C76C87BE7DFBC2C8C8482FEA + 65A7CAA48DA92BAFB7F1DEBC5FA58DB1075F6FAFB5E861E4DEC6ABFC12139749 + 1DA92B1EDD61E27893F356AA78A56ECF5F99A38FD11CBDB7579F392A4FD25247 + C6443CBAA3CF68BE6EB2D4D7EFDDDB583BEEFAD89D559EE1B5F4991AA2F74B5D + A963186FEFDE83D17BB8397E35D85AA5DB8E85B3F2E80E75ED3236926F640DA3 + D12678B3EF5A6D1E4BD29227658675DBF42FF7A797B9769C256D14025AC96D4F + 95F68FB67AECB475642C0DFAEF65E4AC9F23D4477B9F06CC4DC6AC7D0F31CBF5 + A14AEBCB5AFB178F76AEDE472F63EEAFC7D37926E546C68EEABD8748D2DAF874 + 7DB8A3D76847E5353209E134CF19235DDC9EFA7962585F9F2FF3CBC85D79B45E + C75669E7C5A79F4E45CF9E46AA5E57E95E463E4F3D4696A417FB7BF6EC8B37DF + D4D6EB2ADDC6D3CEAF8DDBD1E01A3A491B780CD77F7927F13C75F55C2F654F9E + 3CE920F9BF7BA2BABA3A75EEAA0D9D5FFEDF9FFA1DA7A454BD872A2E29467474 + 0C8E0507AA774C5DB5A1F38B577C25EC2B2E2E6A7D5F57042F5F1FF56E46DA10 + 19B6C12CEBFD25C525B0B7B7C7271F7FA8246979271970F4886AC3D9DDB5C358 + 30CB7ABF9D9D9D7AEFA53B242D7969E96908BF1081CB57AF203E3EBE8D9FF9D7 + FBA54F3974EFE3E4903CF94D313EE1AE7AFF23EFC70CFDCCD20BF975EF55A59E + A19FE78DDE6F6565A5DE15EA8E254B9660D9B265EA3D5C577EC3FEA55CDED3E9 + C64FDE5DDA6CDDACD2F23EB3333FB3DCC66F28F18857D786FC9E6AE8678689F9 + EFD22F92F796866DE8FCE2658689597EA65F141717A7BC8E0E767ABFD6EBA8F4 + 3CBFA1747EE65FCF6157FC7425A96FC8F18BB0DB5EE27BD1DFEDFE5D3A127716 + 3617BD31FF983D1605BAE25F6DEFAF7F5D88B77FFD35DEF7F81ABF09988CEE01 + 33F1D32033AC8B3AFA2FB5FDC10773F1DFEF7D8DDE7BC7E3B70727E2F5C333D0 + E3CC2A8CBDE08C80C48B3893160DDFCC489C488BFB51FDF4EF6F863EFD66E3B7 + 1ED3F11BEFA9F8F9E1D9E87986F72027CDF0CB5D93F1D6E17978397C3956279C + E9D0EE81837E30FD7E0996AF5C8E65CBCD60B662B9D2F9F0300C1EBC0EFDBE58 + 8CDFEC9F895E07A6E1F5A039E8717625DE8DD88877BDA7E0ADD0357825FA07AC + 48E9D8EEBC797370F9CA6584849C44C8A910A5E09341AADDC9936D317AFC0F30 + 0D77C1D2E336300FB2C7A4C36BF00EB7F9B6F76CBC75C506DD521D31232BAC43 + BBF29EE9E8B140989B6FC0962D5B589B95A4DDD9B377E0BB994E2A2D7D8B3CAF + 1DC29FF77E83DF1F3645F7A8ADE896EE0A93FBE73BB4BBF47B5384869E83AB2B + 7F376FDD0A5BFECEB6B1DBA6DA5AB76E1FEF01F6A9F437532663F2B429686A69 + 2613EFF5F8DA7B2DFE14628321D13EB85991D7A1DDD56B57E3C081FDF0F1F156 + BFED3B6CB3C54E271BD59695558092A4F77AEC848F87B34A3F28C9C1ADAC2484 + 17A422B1BAB8D3B9E0E0600F7967E1E1E9010BCB1FB0D8DC195F2DF2C4C0857B + 307081A75EC60B3CF0A589A43D30D2D4039F7DE788A14B7DF1AD5528A6580463 + B2C54938EDF283C1B33536596CC299D321F87E8D25563805E1784C3EF68567C0 + EFE2830E3AC06AA92947A5EB203CF69E80C77BC6E3F1EE91D0644669BF675A5A + D07037088F3C476BCBB88ED4158FEEF9A1B9240DE596EFA1D4EC159499BF8D8A + 2DBF45537EA25A3B94FFE6215458FF4195491DA92B1EC3E78F96AA6255561BB1 + ADCB670329933A5217063F2E48BAB9F83ECA96B3FFEC96AEFD5C2675A4EEFF47 + 7FA9F8C3EDBAF673D9F3FCA52B5E45D9EA1E285BF57A5B719E2A7B4EFC8F76FC + 0DD52796A1EAC8C236923C297BEEF5876DED3A7E2EFBFF3CFEFF8ABFE571A12A + AB8BB0EFD22F6552A7A5AAA88DBFEAC04C546EFB98E776379459FC1A954E9F29 + 3EF4FCDC3ECA799FAA32A95369FF17D49EB1D4FBAB8F2EC663AFAF99CF715AED + 1A8EC6F44B4FF9BD731C8F98697DB9D758D484AC4767BFCD8976386FFB9CE5C3 + 4A6455B192597EAC2F9FB58E71794F96BDEF3EAF9AEBB15734E919F75A0A0AB2 + 909199DC127723AA69BF9F772D973BB27AB5F76EDF61FF9FD2D7B9B090869C9C + 34E4E56528C5C54541F73937371D1111A71B9D5D1CAAB8FE7B867EA7ED76F667 + CE04376467A7C150F3E6CDC5FDFB896DF2C2B90DAEEFF8D46BFBB9B7CFAE9A8C + CC243CC84A6E23F127A7DC699397F9E01EF6EDF7AC659FFC87047274B2F1B974 + E99C263D3D01ED3577EE5C2425DDE8901F1373B1897D27D55AE0B835F54E7CCC + 9394D4DB682FF1C7DF8DE9909F74EFC613F6C9E69EB63958572525C5A133CD9D + 3B87F7CF519D96396DB7A9626F77FB6D56E97137229FC4DFBD86F6127FC8A9A3 + 1DF26FDDBE0AF6C91731D9D95BF99C3E735C73F3D665B45750F061CC9F3F8FF7 + 1147DAE4879D0F6A62DF31F1DBDA6DF9C2C3D3A5363636029D2930F0A06A2328 + C85F9FE7E3E35EC7BE31BA7B6863BBD9ED44E001CDB5E873E84CC74FF8C1D3D3 + 45A5434E1D6EE2FAFE86F3C7C6D6F2235BBBCD555C4F73E5EA6974A5A0E0831C + F7962AAE3FB0C3F3A7CD0F46ACDDBB766FAF937A91974EE2D2E510C839F8E4C1 + 260F4FE73A2EF763B5E1283C3CBC8DACB75A0C631D6395B1AA5895AC40D698F6 + 750DF447D64496052B80758F8576923C5F9629EB139DF77F0190E77553 } end object popEditQSO: TPopupMenu @@ -6341,743 +6123,396 @@ object frmNewQSO: TfrmNewQSO Left = 344 Top = 32 Bitmap = { - 4C69170000001000000010000000C803EA00C803EA00009B0000009B00000000 - 000000000000000000000000000000000000000000003939E7FF000000000000 - 0000000000000000000000000000472F2200D3A98700DCA77B00DCA67A00DAA4 - 7A00D8A27900D5A07600D49E7500D29D7300CF9A72009A9A9AFFCB966F00C994 - 6C00BC937500472F220000000000DBAB8400E8B99200E8B99200D6D6D6FFD3D3 - D3FFCFCFCFFFCCCCCCFFC8C8C8FFC4C4C4FFAFAFAFFF747474FF8E8E8EFFB1B1 - B1FFE8B99200BF8F6E0000000000DCA77B00DCA77B00DCA77B00D1D1D1FFF3F3 - F3FFF3F3F3FFF2F2F2FFF2F2F2FFF2F2F2FFF1F1F1FFF1F1F1FFF0F0F0FFA9A9 - A9FFDCA77B00C08B660000000000DBA47A00FFFFFF00FFFFFF00CDCDCDFFF3F3 - F3FFF5CCB2FFF5CCB2FFF5CBAFFFF5C9ACFFF3C8AAFFF3C5A7FFEFEFEFFFA2A2 - A2FFFFFFFF00BD87630000000000D9A37900FFFFFF00FCFBF900C7C7C7FFF2F2 - F2FFE4E4E4FFE3E3E3FFE2E2E2FFE1E1E1FFE0E0E0FFDFDFDFFFEFEFEFFF9B9B - 9BFFFFFFFF00BA85600000000000D8A27900FFFFFF00FDFDFA00C1C1C1FFF1F1 - F1FFF5C8ACFFF3C7AAFFF3C5A6FFF3C3A3FFF3C09FFFF2BE9DFFEEEEEEFF9393 - 93FFFFFFFF00B7815E0000000000D5A07600FFFFFF00FDFDFC00BBBBBBFFF1F1 - F1FFE1E1E1FFE0E0E0FFDFDFDFFFDEDEDEFFDDDDDDFFDCDCDCFFEDEDEDFF8C8C - 8CFFFFFFFF00B57E5C0000000000D49E7500FFFFFF00FEFEFC00B4B4B4FFF0F0 - F0FFF3C1A2FFF2C09FFFF2BE9BFFF2BB99FFF2BA96FFF1B895FFECECECFF8484 - 84FFFFFFFF00B27C5A0000000000D19C7300FFFFFF00FEFEFC00A4B1A5FFEFEF - EFFFDEDEDEFFDDDDDDFFDCDCDCFFDBDBDBFFDADADAFF9BB7A5FF5F9874FF4F8E - 66FF4A8A61FF7079500000000000CC976F00FFFFFF00ECF8EB0070C17AFFEEEE - EEFFDCDCDCFF818181FF838383FF848484FF6B8B77FF61AB81FF95D4B4FFBAE6 - D0FF6ABB8FFF2D8F57FF0E3B1EFFCA946E00FFFFFF00D8F0DB0073C67CFFC1DF - C5FFDBDBDBFF858585FFB5B5B5FFB7B7B7FF46875EFF90D3B1FF92D6B1FFFFFF - FFFF65BC8CFF67BC8FFF186835FFC8926C00F7FCF70067C272FF87CB8FFF78C3 - 80FFD9D9D9FF898989FFB9B9B9FFB9B9B9FF317B4CFF9CD4B6FFFFFFFFFFFFFF - FFFFFFFFFFFF95D2B2FF196B37FF704B360096A66A0062BC6BFF60B66AFF6EB0 - 75FF8FA792FF878E87FFBCBCBCFFBDBDBDFF1F6D3CFF62BA8BFF60BA87FFFFFF - FFFF60B987FF67BC8FFF186835FF000000006B6B6BFF6B6B6BFF6B6B6BFF6B6B - 6BFF6B6B6BFF6B6B6BFF6B6B6BFF6B6B6BFF416B50FF288C53FF64BA8DFF95D2 - B2FF64BA8DFF288C53FF0E3B1EFF000000000000000000000000000000000000 - 000000000000000000000000000000000000000000001F6531FF1A6A36FF196B - 37FF186634FF0D391DFF000000004804EA004804EA005055D9005055D9000000 - 0000000000004F4F4F0095959500939393004A4A4A003939E7FF000000000000 - 0000000000000000000000000000000000000000000000000000222222000B0B - 0B0002020200B7B7B700E5E5E500E4E4E4009E9E9E009A9A9AFF0A0A0A001C1C - 1C0000000000000000000000000000000000000000007F7F7F00D6D6D6FFD3D3 - D3FFCFCFCFFFCCCCCCFFC8C8C8FFC4C4C4FFAFAFAFFF747474FF8E8E8EFFB1B1 - B1FF6363630000000000000000000000000064646400DCDCDC00D1D1D1FFF3F3 - F3FFF3F3F3FFF2F2F2FFF2F2F2FFF2F2F2FFF1F1F1FFF1F1F1FFF0F0F0FFA9A9 - A9FFB7B7B70043434300000000000000000063636300C3C3C300CDCDCDFFF3F3 - F3FFF5CCB2FFF5CCB2FFF5CBAFFFF5C9ACFFF3C8AAFFF3C5A7FFEFEFEFFFA2A2 - A2FF797979003737370000000000000000000000000067676700C7C7C7FFF2F2 - F2FFE4E4E4FFE3E3E3FFE2E2E2FFE1E1E1FFE0E0E0FFDFDFDFFFEFEFEFFF9B9B - 9BFF474747000000000000000000A1A1A100AEAEAE00B3B3B300C1C1C1FFF1F1 - F1FFF5C8ACFFF3C7AAFFF3C5A6FFF3C3A3FFF3C09FFFF2BE9DFFEEEEEEFF9393 - 93FF838383007878780069696900C2C2C200E9E9E900D6D6D600BBBBBBFFF1F1 - F1FFE1E1E1FFE0E0E0FFDFDFDFFFDEDEDEFFDDDDDDFFDCDCDCFFEDEDEDFF8C8C - 8CFFC6C6C600DDDDDD006A6A6A00BDBDBD00E2E2E200D2D2D200B4B4B4FFF0F0 - F0FFF3C1A2FFF2C09FFFF2BE9BFFF2BB99FFF2BA96FFF1B895FFECECECFF8484 - 84FFC0C0C000D2D2D20060606000838383007F7F7F0095959500A4B1A5FFEFEF - EFFFDEDEDEFFDDDDDDFFDCDCDCFFDBDBDBFFDADADAFFD9D9D9FFEBEBEBFF7783 - 78FF188E45004E4E4E004343430000000000000000005C685E0070C17AFFEEEE - EEFFDCDCDCFF818181FF838383FF848484FF868686FFD7D7D7FFDBE4DCFF549C - 5AFF46A568000785340000010000000000005454540095AD980073C67CFFC1DF - C5FFDBDBDBFF858585FFB5B5B5FFB7B7B7FF8A8A8AFFD5D5D5FFCADBCBFF5AA7 - 60FF70B57F003CA05C00007C2400000000005156510067C272FF87CB8FFF78C3 - 80FFD9D9D9FF898989FFB9B9B9FFB9B9B9FF8B8B8BFFCBD1CCFF4E9E54FF79BB - 7FFF44944CFF1074280000040100000000002E5A330061BB6BFF60B66AFF6EB0 - 75FF8FA792FF878E87FFBCBCBCFFBDBDBDFF8D8D8DFF829A83FF549658FF65AD - 6DFF3E8D43FF2C612EFF00000000000000006B6B6BFF6B6B6BFF6B6B6BFF6B6B - 6BFF6B6B6BFF6B6B6BFF6B6B6BFF6B6B6BFF6B6B6BFF6B6B6BFF6A6C6AFF5979 - 5AFF5F7360FF676D67FF00000000000000000000000000000000000000000000 - 0000000000002A2A2A00424242003D3D3D002020200000731E00037B1E000002 - 0000000000000000000000000000F003EA00F003EA0038A2390038A239000000 - 0000000000004F4F4F0095959500939393004A4A4A003939E7FF000000000000 - 0000000000000000000000000000000000000000000000000000222222000B0B - 0B0002020200B7B7B700E5E5E500E4E4E4009E9E9E009A9A9AFF0A0A0A001C1C - 1C0000000000000000000000000000000000000000007F7F7F00D6D6D6FFD3D3 - D3FFCFCFCFFFCCCCCCFFC8C8C8FFC4C4C4FFAFAFAFFF747474FF8E8E8EFFB1B1 - B1FF6363630000000000000000000000000064646400DCDCDC00D1D1D1FFF3F3 - F3FFF3F3F3FFF2F2F2FFF2F2F2FFF2F2F2FFF1F1F1FFF1F1F1FFF0F0F0FFA9A9 - A9FFB7B7B70043434300000000000000000063636300C3C3C300CDCDCDFFF3F3 - F3FFF5CCB2FFF5CCB2FFF5CBAFFFF5C9ACFFF3C8AAFFF3C5A7FFEFEFEFFFA2A2 - A2FF797979003737370000000000000000000000000067676700C7C7C7FFF2F2 - F2FFE4E4E4FFE3E3E3FFE2E2E2FFE1E1E1FFE0E0E0FFDFDFDFFFEFEFEFFF9B9B - 9BFF474747000000000000000000A1A1A100AEAEAE00B3B3B300C1C1C1FFF1F1 - F1FFF5C8ACFFF3C7AAFFF3C5A6FFF3C3A3FFF3C09FFFF2BE9DFFEEEEEEFF9393 - 93FF838383007878780069696900C2C2C200E9E9E900D6D6D600BBBBBBFFF1F1 - F1FFE1E1E1FFE0E0E0FFDFDFDFFFDEDEDEFFDDDDDDFFDCDCDCFFEDEDEDFF8C8C - 8CFFC6C6C600DDDDDD006A6A6A00BDBDBD00E2E2E200D2D2D200B4B4B4FFF0F0 - F0FFF3C1A2FFF2C09FFFF2BE9BFFF2BB99FFF2BA96FFF1B895FFECECECFF8484 - 84FFC0C0C000D2D2D20060606000838383007F7F7F0095959500A4B1A5FFEFEF - EFFFDEDEDEFFDDDDDDFFDCDCDCFFDBDBDBFFDADADAFF819CCFFF2860C5FF0442 - BCFF064DACFF2A4980004343430000000000000000005C685E0070C17AFFEEEE - EEFFDCDCDCFF818181FF838383FF848484FF5570A3FF3C75D1FF8DB5F7FFB8D6 - FEFF72A8F5FF2C6CCAFF021E5000000000005454540095AD980073C67CFFC1DF - C5FFDBDBDBFF858585FFB5B5B5FFB7B7B7FF154DB3FF8DB5F6FF4D92FFFF1177 - FFFF2186FFFF408AEBFF034BA6FF000000005156510067C272FF87CB8FFF78C3 - 80FFD9D9D9FF898989FFB9B9B9FFB9B9B9FF0542BCFFAECDFEFFFFFFFFFFFFFF - FFFFFFFFFFFF187FEFFF0442BBFF000000002E5A330061BB6BFF60B66AFF6EB0 - 75FF8FA792FF878E87FFBCBCBCFFBDBDBDFF124DB4FF639DF4FF187FFFFF0076 - F8FF0076EEFF0368E1FF033EA5FF000000006B6B6BFF6B6B6BFF6B6B6BFF6B6B - 6BFF6B6B6BFF6B6B6BFF6B6B6BFF6B6B6BFF426197FF2664C8FF2177E6FF0579 - EAFF0164DDFF054DBCFF01215800000000000000000000000000000000000000 - 0000000000002A2A2A00424242003D3D3D00202020000E666C00034BA6FF0442 - BBFF033DA5FF0121580000000000FFFFFF00FFFFFF00E39344FFE29243FFE599 - 51FFE18D42FFDE8330FF0A7ED700EFC873000000000000FFFF00000000000000 - 0000E1ECF700F8D7790000000000000A7E00E5974DFFE18D3FFFAAFD5200DE84 - 34FFE59E5FFFDC7A29FFFFFFFF00FFFFFF000011CE00FFFFFF00FFD217000000 - 0000CEFFFF00FFFFFF001700000000FFFF00E18C3BFF00000000FFFFF600DE7D - 2DFFE39758FFDA7322FFFFFFFF00D217000015EAE9000000000016EBEA000000 - 000000FFFF000000000000AAFF003F091100DE8434FFE08B40FFDC7A29FFE6A2 - 6BFFDD8039FF00FFFF000000000000000000FFFF00000A8DFF0000000000AAFF - D00009115100FFBD01000055FF00E08D41FFDE7D2DFF0000000000FFFF0091A9 - 5CFF84A050FF0000000014E7FF0000003700E612000000001400FF48000000FF - FF000000000000000000FFFF0000E39454FFDA7624FFFFE612008BA352FF87CA - 8FFF82C58AFF609E51FFFFAA0000409048FFE5AB77FFE4A976FFE6A875FFE5A8 - 73FFE4A570FFE1A16FFF76000000DA7322FFD86F1DFFD76A1AFF839F51FF7FC4 - 87FFAFDBB5FF74B77BFF409048FF38843EFFE4A875FFE4A773FFE9BA91FFE8B9 - 92FFE6B388FFDF9D6BFF00FFFF0000000000D2FF2E0000000000002EFF0050A6 - 59FF70B579FFA5D7ACFF9DD2A4FF307936FF00000000E4A56FFFE2A16EFFEDBB - 94FFE9A874FFFF2E0000000000002EFFD70000000000FFACAD00550000000000 - 0000409048FF9AD1A1FF94CF9CFF296F2EFFE6A56FFFE1A06CFFE19E69FFECB3 - 86FFE8A571FF00FFFF000000000000000000FFFFFF00FFFF9200000000004090 - 48FF38843EFF307936FF296F2EFF858549FFE3A97BFFDE9B68FF00FFFF00E9A9 - 78FFE8A775FF000000000003FF000000FC000200000000000000FFFB000000FF - FF000000000000000000FFFFFF00E4A371FFDE9A67FFFF02000000000000E8A5 - 72FFE7A471FF2BFFFF00000000000000000000FFFF0000000000EFFF11000000 - 00000012FF000000EF00E5A068FFE2A97FFFDB9463FF00FFFF0000000000E496 - 5CFFE8A575FFEDBB94FF93000000FF1100000000000012FFEE0000000000ABFF - FF0000000000E6A067FFE0A478FFDB9361FFDA9060FFD98F5DFFD78C5AFFDE99 - 6BFFE8A678FFECB386FFFFCF000000FFFF000000000000000000FFFF00000000 - 2D00E3000000E4A474FFDC9767FF3BFFCF0000000000FFAAAB0055000000E28F - 56FFE8A679FFE18C53FF92FF8E0000000000008AFF00000092008E0000000000 - 0000E7A472FFDA905EFFDB8F5CFF00000000FFFF000000000500FB000000E499 - 67FFE9AC82FFE3935DFF00001500EA151500EA1500000000000000FFFF00E599 - 60FFE4965DFFE1935AFFE29259FF00003600F4220000E28E53FFE18C52FFE18B - 50FFE1894FFFE1894FFFE1894FFF636363006363630063636300636363006363 - 630063636300636363006363FF00001108000C000C00012200001101030001FF - C4006C9BD3FF6999D1FF6596CEFF000000000000000002030400060708000A0B - FF0000B5100002010300020403000504040000017D00020300006F9DD5FF6C9B - D3FF84B0D9FF5990B8FF5F92CAFF42B1C10052D1F0007F7F7FFF7D7D7DFF7B7B - 7BFF797979FF767676FF747474FF717171FF709DD3FF6E9DD5FF86B1DBFFAAD2 - E7FFA8CFE5FF578FB7FF588DC5FF83848500878889007C7C7CFF989898FF9898 - 98FF999999FF999999FF9A9A9AFF9A9A9AFF6E9CD2FFA9D0E6FFAAD0E6FF97C6 - E0FF90C1DDFF558EB6FF5188C0FFF2F3F400F6F7F800797979FF989898FF5190 - 58FF989998FF9A9A9AFF9B9B9BFF9B9B9BFF6B99CFFFA6CDE4FF8EC0DEFF88BC - DBFF8ABCDBFF528CB5FF4A83BBFF0102030004052100767676FF999999FF3C89 - 44FF48894EFF9B9B9BFF9C9C9CFF9C9C9CFF6595CBFFA1CAE2FF88BCDBFF82B8 - D9FF83B8D9FF508AB4FF427DB5FF43934CFF41904AFF3E8C47FF3C8844FF5CA3 - 64FF599F60FF44824AFF9D9D9DFF9D9D9DFF5F91C8FF9DC6E1FF82B7D9FF7CB3 - D6FF7DB2D6FF4E88B3FF3A78B0FF408F49FF93D19EFF90CF99FF8CCC95FF88CA - 91FF83C78CFF509757FF407B45FF9E9E9EFF598DC3FF97C2DFFF7BB2D6FF73AE - D5FF5DC3ECFF4A87B2FF3372AAFF3D8A45FF8ECD98FF7CC586FF77C280FF72BF - 7BFF73BF7BFF78C180FF488F4EFF537E56FF5388BEFF93BEDCFF74ACD3FF62B7 - E0FF4AD3FEFF418AB7FF2B6DA5FF3A8641FF88CA91FF83C78CFF7FC587FF7AC2 - 82FF76C07EFF468E4CFF3A733EFFA0A0A0FF4B83B9FF8CBADAFF6DA7D0FF65A5 - D0FF5EB3DEFF4684B0FF2468A0FF36813DFF337D3AFF307836FF2D7433FF4890 - 4FFF458E4BFF38723CFFA0A0A0FFA1A1A1FF447DB3FF87B6D8FF66A2CEFF609D - CBFF629ECBFF4482B0FF1E639BFF000000000000FF005F5F5FFF9F9F9FFF3C75 - 40FF357038FFA1A1A1FFA1A1A1FFA2A2A2FF3C78AFFF81B2D6FF619ECBFF5999 - C8FF5D9AC9FF4280AEFF185F97FFD900000000FFFF005B5B5BFFA0A0A0FF3B72 - 3FFF9FA0A0FFA2A2A2FFA2A2A2FFA3A3A3FF3573A9FF7CAED3FF5A99C8FF5394 - C6FF5795C7FF407FADFF125B93FF00000000FFFFD500575757FFA1A1A1FFA1A1 - A1FFA2A2A2FFA3A3A3FFA3A3A3FFA4A4A4FF2E6EA4FF77AAD1FF77AAD2FF72A6 - D0FF689FCCFF3F7EADFF0E5890FF989898FF707070FF535353FF505050FF4E4E - 4EFF4B4B4BFF494949FF464646FF444444FF24669CFF3173A7FF3C7BAEFF4683 - B4FF4D89B9FF3D7DACFF0B568EFFFFFF8500FF00000000009700FFFFFF000000 - 0400FFFFFF00FFFFFF00FFFF0D00F6EFAC000000000000FFFF00000000000F59 - 91FF0C578FFF125B91FF0B568EFFE003EA00E003EA0018950000189500000000 - 0000000000000000000000000000000000006C6C6C009A9A9EFF9B9B9BFF9999 - 99FF000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000006C6C6C009B9B9BFFE4E4E4FFEEEEEEFF9696 - 96FF000000000000000000000000000000000000000000000000D6D6D600D3D3 - D300CFCFCF00CCCCCC00C8C8C8009C9C9CFFE2E2E2FFE7E7E7FFB9B9B9FF9393 - 93FF000000000000000000000000000000000000000000000000D1D1D100F3F3 - F300F3F3F300F2F2F200F2F2F200989898FFE4E4E4FFCFCFCFFF979797FFA9A9 - A9008E8E8EFF8C8C8CFF8A8A8AFF000000000000000000000000CDCDCD00F3F3 - F300F5CCB200F5CCB200F5CBAF00969696FFDDDDDDFFC5C5C5FF949494FF8E8E - 8EFFACACACFFD7D7D7FF878787FF000000000000000000000000C7C7C700F2F2 - F200E4E4E400E3E3E300BCBCBC00939393FFD4D4D4FFC8C8C8FFBCBCBCFFBABA - BAFFC2C2C2FFC4C4C4FF828282FF000000000000000000000000C1C1C100F1F1 - F100E6B292FFDBA989FF929292FFC7C7C7FFCCCCCCFFC7C7C7FFC6C6C6FFC3C3 - C3FFC0C0C0FF848484FF59595900000000000000000000000000BBBBBB00E4B6 - 9BFFE7B99CFFE6B698FFD8A98CFFD2D2D2FFB5B5B5FF898989FF878787FF8585 - 85FF808080FF5959590000000000000000000000000000000000D9AB8FFFE6B7 - 9CFFEFCFBCFFEECEBAFFE2AE8CFFD29B7BFF888888FFD5AB9100ECECEC008484 - 84000000000000000000000000000000000000000000B8896CFFE6B799FFEECE - BBFFE9C0A7FFE8BDA3FFECC8B3FFDFA481FFD38D62FF819CCF002860C5000442 - BC00033DA400012057000000000000000000B7866BFFE6B498FFEECDBAFFE9BF - A5FFE5B496FFE7B99DFFEBC6AEFFDE9F79FFC7805AFF3C75D1008DB5F700B8D6 - FE0072A8F5002C6AC900021D5000B78668FFE6B394FFEECCB8FFE9BEA5FFE5B3 - 94FFE6B79BFFEAC4ADFFDE9E78FFD0875AFF154DB3008DB5F6004D92FF001177 - FF002186FF00408AEB00033BA100DD9F79FFEDCCB7FFE8BDA3FFE4B192FFE6B6 - 9AFFEAC3ACFFDE9C74FFD08658FFB9B9B9000542BC00AECDFE00FFFFFF00FFFF - FF00FFFFFF00187FEF000442BB00DB976FFFEDC8B3FFE7B89BFFE6B498FFEAC3 - ABFFDE9C73FFC97F4FFFBCBCBC00BDBDBD00124DB400639DF400187FFF000076 - F8000076EE000368E100033EA500D18B61FFDFA481FFEAC2ABFFEAC0A8FFDC99 - 71FFC7794BFF6B6B6B006B6B6B006B6B6B00426197002664C8002177E6000579 - EA000164DD00054DBC000121580000000000CF8455FFD58351FFD17D4BFFBC6D - 3EFF00000000000000000000000000000000000000000E295C00033CA2000442 - BB00033DA50001215800000000002804EA002804EA008034570080345700E083 - 2300EFD8AE0000000000A800000000355700B434570000000000000000000000 - 0000C834570000000000000000004C2F2200D3A987FFDCA77BFFDCA67AFFDAA4 - 7AFFD8A279FFD5A076FFD49E75FFD29D73FFCF9A72FFCE9970FFCB966FFFC994 - 6CFFBC9375FF472F220000000000DBAB84FFE8B992FFE8B992FFE8B992FFE8B9 - 92FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B9 - 92FFE8B992FFBF8F6EFF00000000DCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA7 - 7BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA7 - 7BFFDCA77BFFC08B66FF00000000DBA47AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFBD8763FF4F0F0000D9A379FFFFFFFFFFFCFBF9FFFCFBF8FFFBF9 - F7FFFBF7F4FFFAF7F2FFF9F5F0FFF7F3EDFFF6EFEAFFF5EBE7FFF3EAE4FFF2E7 - DEFFFFFFFFFFBA8560FF00000000D8A279FFFFFFFFFFFDFDFAFFFCFCFAFFFCFB - F9FFFBFAF6FFFBF8F5FFFBF7F4FFFBF6F1FFF8F4EEFFF7F2EBFFF7F0EAFFF6EC - E8FFFFFFFFFFB7815EFF00000000D5A076FFFFFFFFFFFDFDFCFFFDFDFBFFFDFD - FAFFFCFCF9FFFCFBF7FFFBF9F5FFFBF8F4FFFBF7F3FFFBF5F2FFFAF3EFFFF8F2 - ECFFFFFFFFFFB57E5CFF00000000D49E75FFFFFFFFFFFEFEFCFFFDFDFBFFFDFD - FCFFFDFDFBFFFDFDF9FFFCFCF8FFFBF9F7FFFBF9F5FFFBF8F4FFFBF7F2FFFBF5 - F2FFFFFFFFFFB27C5AFF00000000D19C73FFFFFFFFFFFEFEFCFFFEFEFCFFFEFE - FCFFFDFDFBFFFDFDFBFFFDFDFAFFFDFDF8FF60BC6CFF5CB667FF57B061FF52A8 - 5CFFFFFFFFFFB07A58FFC9DBA300CC976FFFFFFFFFFFFFFFFCFFFFFFFDFFFEFE - FCFFFEFEFCFFFEFEFBFFFDFDFAFFFDFDFAFF5BB465FF9DD6A6FF99D3A2FF4B9E - 53FFFFFFFFFFAC7554FFFFFFBF00CA946EFFFFFFFFFFFFFFFFFFFFFFFEFFFFFF - FDFFFEFEFDFFFEFEFCFFFEFEFCFFFEFEFCFF54AB5EFF96D29FFF91CF99FF539F - 5BFFD4E6D6FFAA7353FF00000000C8926CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFF84C58BFF57AB61FF6AB473FF90CE97FF8ACB91FF6AB0 - 70FF3B8442FF52773DFF000F4F008A5036FFC38E68FFC08B66FFBE8864FFBB85 - 61FFB9835FFFB47E5CFFB07D5AFF599954FF63AC6BFF88C990FF82C68AFF529A - 58FF407537FF6E4E41FF09000000D78833007BBEE9000D1F43002B100700E0A3 - 5D0047A3E4000F021100E2A244002A7DD200327239FF559E5CFF509856FF4C76 - 31FF3E99DE0000000D00000000004F0F0000BFEFBF00000F4F000F010000D591 - 3E003B8DD30000010E004F0F0000BFEFBF00000F4F00265F2AFF215725FF0000 - 000000000000000000005D170100C803EA00C803EA0098722100987221000000 - 0000000000004F4F4F0095959500939393004A4A4A003939E7FF000000000000 - 0000000000000000000000000000000000000000000000000000222222000B0B - 0B0002020200B7B7B700E5E5E500E4E4E4009E9E9E009A9A9AFF0A0A0A001C1C - 1C0000000000000000000000000000000000000000007F7F7F00D6D6D6FFD3D3 - D3FFCFCFCFFFCCCCCCFFC8C8C8FFC4C4C4FFAFAFAFFF747474FF8E8E8EFFB1B1 - B1FF6363630000000000000000000000000064646400DCDCDC00D1D1D1FFF3F3 - F3FFF3F3F3FFF2F2F2FFF2F2F2FFF2F2F2FFF1F1F1FFF1F1F1FFF0F0F0FFA9A9 - A9FFB7B7B70043434300000000000000000063636300C3C3C300CDCDCDFFF3F3 - F3FFF5CCB2FFF5CCB2FFF5CBAFFFF5C9ACFFF3C8AAFFF3C5A7FFEFEFEFFFA2A2 - A2FF797979003737370000000000000000000000000067676700C7C7C7FFF2F2 - F2FFE4E4E4FFE3E3E3FFE2E2E2FFE1E1E1FFE0E0E0FFDFDFDFFFB1DAE9FF58A5 - D8FF85B1DBFF469DD0FF10374D00A1A1A100AEAEAE00B3B3B300C1C1C1FFF1F1 - F1FFF5C8ACFFF3C7AAFFF3C5A6FFF3C3A3FFF3C09FFFA8BCB6FF77BEE7FFB4D2 - F0FFE5F3FFFFACD2EFFF4B88BEFFC2C2C200E9E9E900D6D6D600BBBBBBFFF1F1 - F1FFE1E1E1FFE0E0E0FFDFDFDFFFDEDEDEFF9FD0DFFF80D5EEFFB2E3F9FF8BC0 - E7FFAED3F6FFC4E0FCFF669DCFFFBDBDBD00E2E2E200D2D2D200B4B4B4FFF0F0 - F0FFF3C1A2FFF2C09FFFF2BE9BFFB8BAAEFF7DD4EDFFC4F6FDFF6CDDF6FF6DCA - EDFF63A3D7FF669FD2FF5E687000838383007F7F7F0095959500A4B1A5FFEFEF - EFFFDEDEDEFFDDDDDDFFA6CFDCFF79D3EEFFC7F7FDFF5FDCF5FF5BE2F7FF7AD6 - F2FF3C98D1FF4C5A66004343430000000000000000005C685E0070C17AFFEEEE - EEFFDCDCDCFF5E8293FF77CBE7FFC7F7FDFF5EDCF5FF5AE1F7FF7BD4F1FF4395 - D5FF43A07F000785340000010000000000005454540095AD980073C67CFFC1DF - C5FF9CBECFFF73B7D4FFC2F6FDFF63DFF7FF5DE2F8FF79D3F0FF4897DAFF56A4 - 6FFF70B57F003CA05C00007C2400000000005156510067C272FF87CB8FFF55A0 - 8BFF7AB6D5FF90B7D1FF55C9E4FF5BDFF5FF78D0EDFF4D99D9FF4B9C66FF79BB - 7FFF44944CFF1074280000040100000000002E5A330061BB6BFF60B66AFF4389 - AAFFE0F2FFFF549AD8FF1A7ABEFF4998C5FF3D83BCFF759791FF549658FF65AD - 6DFF3E8D43FF2C612EFF00000000000000006B6B6BFF6B6B6BFF6B6B6BFF2C65 - 83FF94C7F9FF91C9F9FF4185C9FF2064A7FF606E79FF6B6B6BFF6A6C6AFF5979 - 5AFF5F7360FF676D67FF0000000000000000000000000000000000000000103B - 52FF275E85FF4987BBFF427B9EFF3B454D002020200000731E00037B1E000002 - 000000000000000000000000000038FDF200C803EA0038FDF20038FDF2000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000EAA677FFE8A474FFE8A06EFFE69D6BFFE49965FFE2955EFF000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000E8A070FFF2C8ACFFF0C6A8FFF0C5A6FFEFC2A2FFE18E53FF000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000E69B67FFF0C5A6FFECB691FFEBB38CFFEEBC9BFFDF8547FF000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000E2925CFFEEC1A0FFEAB189FFE9AE85FFEDB794FFDB7C3AFF000000000000 - 00000000000000000000000000007478FEFF7478FEFF7276FEFF6E71FDFF6A6C - FCFFE18D52FFEDBB99FFE9AC81FFE7A87CFFEAB38DFFD8742CFF000000000000 - 00000000000000000000000000007478FEFFB8BBFEFFB6B9FEFFB3B6FEFFB0B3 - FEFFDF8445FFECB792FFE6A578FFE6A273FFE9AD85FFD66B1EFF000000000000 - 00000000000000000000000000007073FDFFB4B7FEFF8185FEFF7C81FEFFACAF - FEFFD97B39FFEAB28AFFE49F6EFFE39C6AFFE7A87DFFD1621AFF000000000000 - 00000000000000000000000000006A6CFCFFB0B3FEFF797EFEFF7579FEFFA8AA - FEFFD8742AFFE8AD83FFE29865FFE19560FFE5A376FFCF5718FF60BC6CFF5CB6 - 67FF57B061FF52A85CFF4DA155FF6364FAFFACAFFEFF7276FEFF6D71FEFFA2A4 - FEFFD6691EFFE7A77BFFE0925CFFDF8F56FFE49E6EFFCD4E16FFBAD9B5FFB7D6 - B1FFB3D3AEFFAED1A9FF45964DFF5B5BF8FFA8AAFEFF6B6FFEFF6569FEFF9EA0 - FEFFD1601AFFE5A274FFDE8C53FFDD894DFFE29966FFC94515FFB5D5B0FF8ABD - 83FF83B87DFFA7CDA3FF3D8B44FF5351F6FFA2A4FEFF6266FEFF5D61FEFF999B - FEFFCF5518FFE39C6CFFDC864AFFDB8344FFE0945EFFC63C13FFAFD1ABFF80B7 - 7AFF79B273FFA0C89CFF35803CFF4A47F5FF9EA0FEFF5B5EFEFF5659FEFF9597 - FEFFCD4C16FFE19763FFDA8041FFD97D3BFFDF8F58FFC63512FFA8CDA4FF77B0 - 71FF70AB6AFF9AC496FF2E7633FF413DF3FF999BFEFF9698FEFF9395FEFF9193 - FEFFC94315FFE0935DFFDF8F59FFDF8D55FFDE8A51FFC02E11FFA2C99EFF9DC6 - 99FF98C395FF94C091FF276D2CFF874480FF833F7EFF7F387DFF7C337CFF792E - 7BFFC63A13FFC63712FFC43112FFC02E11FFC02A10FFBF270FFF7C4F25FF7A4A - 21FF77461EFF75421BFF733F19FF000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000F003EA00F003EA00C0EA5300C0EA53000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000885A4100DCB18DFFDCA77BFFDCA67AFFDAA4 - 7AFFD8A279FFD5A076FFD49E75FFD29D73FFCF9A72FFCE9970FFCB966FFFC994 - 6CFFC49A7AFF885A410000000000DDAC85FFE8B992FFE8B992FFE8B992FFE8B9 - 92FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B9 - 92FFE8B992FFC1906FFF00000000DCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA7 - 7BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA7 - 7BFFDCA77BFFC08B66FF00000000DBA47AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFBD8763FF00000000D9A379FFFFFFFFFFFFC381FFFFC381FFFFC3 - 81FFFFFFFFFF66B16FFF66B16FFF66B16FFFFFFFFFFFFFCF98FFFFCF98FFFFCF - 98FFFFFFFFFFBA8560FF00000000D8A279FFFFFFFFFFFFC381FFFFD29FFFFFC3 - 81FFFFFFFFFF66B16FFF90CF99FF66B16FFFFEFEFEFFFFCF98FFFFD9ADFFFFCF - 98FFFFFFFFFFB7815EFF00000000D5A076FFFFFFFFFFFFC381FFFFC381FFFFC3 - 81FFFFFFFFFF66B16FFF66B16FFF66B16FFFFDFDFDFFFFCF98FFFFCF98FFFFCF - 98FFFFFFFFFFB57E5CFF00000000D49E75FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFEFEFEFFFEFEFEFFFEFEFEFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFCFC - FCFFFFFFFFFFB27C5AFF00000000D19C73FFFFFFFFFF66B16FFF66B16FFF66B1 - 6FFFFEFEFEFF5497FFFF5497FFFF5497FFFFFDFDFDFF67D5F0FF67D5F0FF67D5 - F0FFFFFFFFFFB07A58FF00000000CC976FFFFFFFFFFF66B16FFF97D29FFF66B1 - 6FFFFDFDFDFF5497FFFF73AAFFFF5497FFFFFCFCFCFF67D5F0FF9BEBFFFF67D5 - F0FFFFFFFFFFAC7554FF00000000CA946EFFFFFFFFFF66B16FFF66B16FFF66B1 - 6FFFFCFCFCFF5497FFFF5497FFFF5497FFFFFBFBFBFF67D5F0FF67D5F0FF67D5 - F0FFFFFFFFFFAA7353FF00000000C8926CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFA97251FF00000000A36D4EFFC38E68FFC08B66FFBE8864FFBB85 - 61FFB9835FFFB47E5CFFB27C5AFFB17B58FFAE7957FFAD7656FFAB7554FFA973 - 53FFA97151FFA36D4EFF00000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000636363006363630063636300636363006363 - 630063636300636363006363FF00001108000C000C00012200001101030001FF - C4006C9BD3006999D1006596CE00000000000000000002030400060708000A0B - FF0000B5100002010300020403000504040000017D00020300006F9DD5006C9B - D30084B0D9005990B8005F92CA0042B1C10052D1F0007F7F7F007D7D7D007B7B - 7B0014D1EEFF06D0EDFF01D2ECFF02D2ECFF06D0EEFF09CFECFF86B1DB00AAD2 - E700A8CFE500578FB700588DC50083848500878889007C7C7C009898980005D0 - EDFF77E8F5FFD3F8FCFFD4F7FCFFD1F7FDFFC6F6FBFF75E7F5FF09D1EDFF97C6 - E00090C1DD00558EB6005188C000F2F3F400F6F7F8007979790006D0ECFFA2EF - F9FFB0F2FBFF90ECF7FF86EAF6FF8CEBF6FF99EDF7FFC6F5FBFF9BEFF9FF06D0 - EDFF8ABCDB00528CB5004A83BB0001020300040521000CD1ECFF71E7F5FFA3F1 - FAFF8EECF7FF94EDF8FF8DECF7FF92EDF7FF95EDF8FF8CECF7FFAFF2FAFF6BE7 - F4FF19D3EEFF508AB400427DB50043934C0041904A0004CFEDFFB2F3FBFF93EC - F8FF92EDF7FF95EEF8FF96EEF8FF97EEF8FF93EDF8FF93EDF8FF95EDF8FFAFF2 - FAFF07D0EEFF4E88B3003A78B000408F490093D19E0001D2ECFFC1F6FCFF8CEB - F7FF94EDF8FF9AEFF9FF9EEFF9FF9FF0F9FF9DEFF9FF8FEDF8FF73E8F6FFAEF3 - FCFF01D2ECFF4A87B2003372AA003D8A45008ECD980001D2ECFFBCF5FBFF98EE - F8FF93EEF9FF9CEFF9FF9FF0FAFFA0F1FAFF90EEF9FF77EAF8FF66E7F6FFA4F1 - FCFF01D2ECFF418AB7002B6DA5003A86410088CA910004CFEDFFA8F2FBFF9BEF - F9FF7AEBF8FF5BE6F7FF4CE5F7FF47E5F9FF3CE3F8FF37E2F6FF4AE4F7FF87EE - FAFF07D0EEFF4684B0002468A00036813D00337D3A0006D0EDFF6AE7F5FF8EEE - FBFF40E2F6FF3BE3F7FF43E5F9FF48E6FAFF43E5F9FF3EE3F7FF6FEBFAFF4FE3 - F4FF0ED0EEFF4482B0001E639B00000000000000FF005F5F5F0007D1EDFF6EE9 - F8FF73EBFAFF4DE6F8FF46E6F9FF4CE7FBFF4EE6F9FF60E9FAFF5EE7F7FF08D1 - EDFF5D9AC9004280AE00185F9700D900000000FFFF005B5B5B00A0A0A00004D0 - EDFF45E1F4FF68E9F9FF63E9FBFF57E9FAFF53E7F9FF3AE0F4FF05D0EDFF5394 - C6005795C700407FAD00125B930000000000FFFFD50057575700A1A1A100A1A1 - A10013D1EEFF06D0EEFF00D2ECFF00D2ECFF07D0EDFF0FD0EDFF77AAD20072A6 - D000689FCC003F7EAD000E589000989898007070700053535300505050004E4E - 4E004B4B4B0049494900464646004444440024669C003173A7003C7BAE004683 - B4004D89B9003D7DAC000B568E00FFFF8500FF00000000009700FFFFFF000000 - 0400FFFFFF00FFFFFF00FFFF0D00F6EFAC000000000000FFFF00000000000F59 - 91000C578F00125B91000B568E00C803EA00C803EA0080A53D0080A53D000000 - 0000000000007F7F7F00BABABAFFB8B8B8FF7777770000000000000000000000 - 00000000000000000000000000000000000000000000000000003F3F3F001515 - 150004040400C6C6C6FFE5E5E5FFE4E4E4FFABABABFF02020200131313003333 - 33000000000000000000000000000000000000000000B1B1B1FFCECECEFFC8C8 - C8FF24242400C1C1C1FFDEDEDEFFDDDDDDFFB0B0B0FF20202000ABABABFFA7A7 - A7FF8A8A8AFF00000000000000000000000098989800DCDCDCFFEDEDEDFFDBDB - DBFFC2C2C2FFBEBEBEFFD6D6D6FFD4D4D4FFB0B0B0FFACACACFFCBCBCBFFE7E7 - E7FFB7B7B7FF66666600000000000000000095959500C4C4C4FFDCDCDCFFD4D4 - D4FFD9D9D9FFDBDBDBFFD6D6D6FFD4D4D4FFD9D9D9FFD2D2D2FFCBCBCBFFC8C8 - C8FF797979FF53535300000000000000000000000000989898FFD4D4D4FFCCCC - CCFFC9C9C9FFBABABAFF9C9C9CFFA1A1A1FFC2C2C2FFC6C6C6FFC1C1C1FFB7B7 - B7FF696969FF0000000000000000C1C1C1FFC1C1C1FFBFBFBFFFD8D8D8FFCDCD - CDFFBCBCBCFF7C7C7CFF373737003B3B3B00888888FFC3C3C3FFC2C2C2FFCDCD - CDFF8C8C8CFF858585FF7E7E7EFFC4C4C4FFE9E9E9FFD6D6D6FFC9C9C9FFCECE - CEFFA5A5A5FF3D3D3D0000000000000000004747470040A470FF319F65FFBABA - BAFFC6C6C6FFDDDDDDFF6B6B6BFFBFBFBFFFE2E2E2FFD2D2D2FFC6C6C6FFCDCD - CDFFB1B1B1FF444444000000000000000000454545003AA068FF5AB381FF2898 - 57FFC0C0C0FFD2D2D2FF616161FF9D9D9DFF8D8D8DFF9F9F9FFFCFCFCFFFC6C6 - C6FFCCCCCCFF3DA56FFF37A36DFF33A167FF309D62FF55AF7CFF91CBAAFF4FAB - 74FF188E45FF575757FF505050FF0000000000000000858585FFC5C5C5FFC1C1 - C1FFC5C5C5FF37A36BFF96CEB0FF94CDADFF91CBAAFF90CBA8FF74BC90FF8AC7 - A1FF46A568FF078735FF00020000000000007F7F7F00A6A6A6FFD5D5D5FFC5C5 - C5FFCBCBCBFF319F63FF94CDADFF6FBA8EFF6BB889FF66B685FF61B380FF67B5 - 82FF83C298FF3CA05CFF007F25FF0000000078787800BCBCBCFFDEDEDEFFA6A6 - A6FF828282FF299B5BFF90CAA9FF8DC8A5FF8AC6A1FF88C59EFF6AB685FF82C2 - 97FF48A566FF067825FF0008020000000000000000006D6D6DFF6F6F6FFF6464 - 64FF17171700229751FF1C914AFF168F44FF108B3BFF3A9F5EFF80C196FF46A3 - 62FF097723FF0006020000000000000000000000000000000000212121000C0C - 0C0002020200808080FFBDBDBDFFB2B2B2FF5B5B5BFF01822BFF43A15FFF0276 - 20FF000602000000000000000000000000000000000000000000000000000000 - 00000000000044444400535353FF4C4C4CFF34343400007C20FF037B1EFF0004 - 0000000000000000000000000000D003EA00D003EA00D8923900D89239000000 - 0000000000004F4F4F0095959500939393004A4A4A0000000000000000000000 - 0000000000000000000000000000000000000000000000000000222222000B0B - 0B0002020200B7B7B700E5E5E500E4E4E4009E9E9E00010101000A0A0A001C1C - 1C0000000000000000000000000000000000000000007F7F7F00CCCCCC009F94 - 89FFBCB0A4FF9D9185FFDEDEDE00AEA093FF9D9185FF58524BFF9C9C9C00A6A6 - A6006363630000000000000000000000000064646400DCDCDC00EDEDED00978D - 83FFC3B8AEFF655D55FFD6D6D6007C7268FFA89B8EFF9C9186FFCBCBCB00E7E7 - E700B7B7B70043434300000000000000000063636300746B62FFA4978AFF9589 - 7DFF9F9286FF3E3934FFD6D6D6004C4640FF7E746AFF857A70FF3E3934FF726E - 6BFF75757500373737000000000006050500262320009B8E82FF9D9185FF867B - 71FF564F48FF504A44FF80766CFF6E665DFF826C58FFA6917DFF948474FF564F - 48FF2B2A2A000000000000000000A1A0A000AEA297FFBAAEA2FF82776DFF8277 - 6DFFAA917BFFBAA794FFB4A28CFFB09781FF9F8D7DFF836D5BFF716357FF9589 - 7DFF141413FF7777770069696900C1C1C1009D9185FFB1A396FF7F756BFF7C72 - 68FF776D64FF6C635BFF2E2A26FF564F48FF80766CFF7C7268FF776D64FF7067 - 5EFF010101FFD9D9D9006A6A6A00BBBBBB005F5851FF423D38FF58514AFF3D38 - 33FF332F2BFF23211EFF04040400151412FF1A1816FF252220FF191715FF0F0E - 0DFF0E0E0EFFD0D0D0006060600083838300635D58FF9F9286FFCCC3BAFFC0B4 - AAFFA6988BFF3E5E48FF36A16C002E513BFF908479FFC2B8ADFFC0B4AAFFA89B - 8EFF132C1BFF4E4E4E004343430000000000524B45FF83786FFFCCC3BAFF7970 - 66FF71685FFF374638FF96CEB000373E37FF857A70FFC2B8ADFF786F65FF7B71 - 67FF0B0B09FF0785340000010000000000004D4741FF83786FFFCCC3BAFF786F - 65FF7B7167FF2F2E29FF93CCAC0022251FFF95897DFFC2B8ADFF786F65FF7C72 - 68FF060505FF3CA05C00007C24000000000046413BFF857A70FFC3B8AEFF7C72 - 68FF7F756BFF36322DFF8AC0A000394138FF95897DFFBAAEA2FF7C7268FF7F75 - 6BFF010101FF066F220000040100000000003E3934FF393430FF332F2BFF2C29 - 25FF272421FF201D1BFF1B844400122116FF0B0A09FF070706FF040403FF0000 - 00FF000000FF0003010000000000000000000000000000000000121212000606 - 06000101010076767600BDBDBD00B2B2B200545454000179280043A15F000265 - 1B00000301000000000000000000000000000000000000000000000000000000 - 0000000000002A2A2A00424242003D3D3D002020200000731E00037B1E000002 - 0000000000000000000000000000C803EA00C803EA00B8B3E000B8B3E000172F - 1A00418349FF55AB60FF5DBC69FF5EBF6BFF59B365FF44894DFF1B371F000000 - 0000000000000000000000000000472F2200D3A98700DBA77B008DB973FF64C4 - 6EFFA5E1BBFFBAEACCFFC5E0BEFFC5DAB4FFBDD7B0FFA6D7ACFF5FBD69FF7AAF - 68FFB7957400472F220000000000DBAB8400E5B9910081C277FF8CD8A2FFCDF5 - E8FFD4EDDAFFCEEDD3FFCFDFAFFFD6DEB5FFD4D4A2FFCED0A1FFC4D0AAFF87C9 - 91FF6EB066FFB9916D0000000000DCA77B008DBA72FF87D7A0FFC0F2DEFFC7F2 - D6FFD5EFD5FFD0E9CFFFD5DBA6FFDCDEABFFDBCD90FFD7C88BFFC9C18EFFBDD5 - AFFF7AC791FF6C9C58FF00000000BEAB770064C571FFC0F3E2FFB5EFB4FFB5F0 - ACFFC1EDB7FFD4E3B7FFD9D89CFFDAD395FFCDB56DFFC7B36DFFB5CB84FF94DF - 9AFFAFE7CDFF479B4DFF142E170088B972FF98DEB5FFB5EBCCFFB1EFA7FFC9EE - A9FFD1EAC9FFD5CF8DFFD9CB8BFFCDB466FFBCBC67FF9AD671FF82DE73FF7ADC - 71FF91D0A3FF88C8A4FF2C6831FF6FC06FFFB3ECD2FF9BE2A2FF9DEA8DFFD4ED - B7FFD0EAC7FFCFB96EFFCCB166FFCBC975FF76DB67FF66D94DFF65D74DFF6CD3 - 5DFF73BB7EFFA5DBC2FF337B38FF65C26FFFBEF0DCFF81D883FF77DB6DFFBFE5 - 9AFFCCDFA7FFCAA85DFFC2BD6CFFB8DA8BFFA6D860FF77D13FFF6AD046FF59BC - 50FF63AB6CFFB2E4CEFF337D37FF64C26DFFBEEFDDFF73D17DFF90D16CFFBCE0 - 9EFFC7A75EFFD3B05EFFC69953FFC6BC6EFFAFD17AFFB4C46DFFAFA95FFF7BA9 - 57FF5AA367FFB1E3CEFF2F7A33FF6ABC6BFFB0E9CFFF83D490FFBFDC8AFFC3CB - 82FFCCA256FFDAAF5CFFDCAF5BFFC99A4BFFBF8643FFB78443FFB99A52FF96A5 - 62FF65A676FFA2D8BDFF2B6F2DFF7DB069FF92D7AFFFA0DEB4FF84C670FFA8D0 - 80FFC5A55CFFD0A757FFE0AA56FFDAA651FFC7984AFFB98C47FFB69B57FF819F - 65FF79BF90FF81BE9CFF235B25FFAB9C6B0056B060FFB5EAD3FF69BC74FF6EBD - 71FFBEB66DFFC9A35BFFDFAB5BFFDDA858FFC1924EFF9DA958FF78B166FF5A96 - 67FFA6DCC0FF307A32FF112B1200C8926C0084C38AFF76C08DFF99D7B3FF79C0 - 80FFBCC27EFFC6A96AFFD7B169FFD6AD65FFBC9B5EFF60AD6AFF599768FF81C1 - 99FF67A97BFF387934FF00000000704B3600BD8F67005C9851FF70B786FFAEE8 - C7FFC0D2A0FFC5B381FFCAB47DFFCCAF78FFB9A778FF80CC95FFA0DABCFF66A8 - 7AFF317933FF68503600000000000000000000000000030804002C6630FF3988 - 3EFF9BC59DFFB3C29DFFBDC19CFFBEC39DFFB0D2B1FF7EC09AFF2F7B32FF2C73 - 2FFF040B0500000000000000000000000000000000000000000000000000112A - 1200255C27FF2C702EFF2D7530FF2D7530FF2A6E2DFF2D7330FF26642A000000 - 0000000000000000000000000000F803EA0060F03E0000000000000000001D02 - 00001F0000000000000040972500640020000000000000000000000000000300 - 0000C9010000E8AD4500C898390009000000E8EE43000C0000001847F3003E1E - 1B00D06C5F00DCDCAEFFECCDC0FFE9CBB3FFE5B6A3FFA367CE003421DE005601 - E4001806E5005501E5001906E6005401E6001A06E8005301E800624A7300DDC1 - C3FFF9E9DCFFF6E8DDFFF3E5DAFFF3E5DAFFF5E7DCFFF5E4D6FFDAB49BFFF741 - 39003B04F10054030F0087051000520310008905110086474800EEC9B1FFF7EA - DFFFEEDED0FFE3C1A7FFD8AE89FFD7AC86FFDDBB9CFFEBD6C7FFF3E6D9FFE4B6 - 9AFFAC405600FC02340094043600FB023600A11FB400E6B9AAFFF6E9DDFFECD8 - C6FFD7AC81FFDCBB9AFFF6ECE3FFF5ECE2FFE4C8AEFFD2A77BFFE6CEBAFFF1E2 - D5FFCBA19BFFFA18E6003904F4000002F4009065D100F4E3D4FFEFDCCDFFD5A8 - 7EFFD0A077FFFBF8F5FFFCF8F5FFFCF8F5FFFBF8F5FFD1A881FFCFA47BFFEAD5 - C3FFEAD4C2FFE8549D009304B700FE02B700DBA7A6FFF3E5D9FFDFBB9EFFCFA0 - 75FFCD9E72FFF5EBE3FFE4CBB4FFE7D3BFFFFBF8F6FFE5D3BFFFC4986BFFD6B4 - 91FFEEE0D2FFBB8872FF1906510056015100D9B297FFF2E5DAFFD1A67EFFCC9D - 71FFC79A6CFFC5986BFFE2CCB6FFF8F3EEFFF6EEE8FFD9BDA1FFC29468FFC59B - 71FFF0E2D6FFBE9068FF380000001049F300D5AE92FFF2E4D9FFD1A57AFFC599 - 6BFFC4976AFFC49669FFFAF6F2FFF3EAE1FFC2956DFFBE8F65FFBE8F64FFC095 - 6DFFEFE3D5FFC08D60FF4849F30009000000D6B17AFFEFE1D3FFD9B595FFC798 - 6CFFC39569FFC19367FFBF9066FFBF9066FFBB8B63FFB98A63FFB88A62FFCBA7 - 86FFEADCCCFFA9714DFF8A05120050031200AB514500E4CCB9FFEAD6C5FFC799 - 71FFBF9066FFBF9066FFF7F1ECFFF6F0EAFFB7895FFFB7895FFFB58963FFE2CE - BBFFD9BDA6FFA23E530027035900920159003D175D00BE8368FFEAD8C9FFE3CD - BAFFC0946BFFBA8C62FFCFB094FFCFB094FFB7895FFFB28761FFDAC0AAFFE4D1 - C0FFA0694FFF1712330090043200FE02320092043300E92E4100B98159FFE7D5 - C4FFE5D2BFFFC9A685FFB88E67FFB68A65FFC5A180FFE0CCBAFFE3D0BEFFAF6B - 45FF992790000003B8009004B9000202FE003604FF000002FF00612C1A00BA70 - 46FFD7BBA3FFE9DACAFFECE0D1FFECE0D1FFE8D8C8FFD3B59CFF9D614CFFE224 - B6003904F4000002F4003804F5000202F5003604F6005801E3001606E4006211 - CE00603B95009E6056FFA16844FFA36642FF925B50FF7A3490002D134A005401 - 4E001A0650005501500019065100560151001806520058015200160653004A02 - E600290000008888F500B001EA004C02E900D103EA004E02EA00CF03EB00C000 - 48001314150000040000380000001804EA001804EA00B0493D00B0493D00E083 - 2300E075B10000000000A4000000304A3D00E4493D0000000000000000000000 - 0000F8493D0000000000000000000800000001001E0089061C0090061E008A06 - 1E00FFFFFF000000000000000000000000000000000000000000000000000000 - 0000000000004F0F0000FFFFBF0089DFFF000009320066C472FF64C270FF62BF - 6EFF60BC6BFF5DB868FF5BB565FF57B062FF4E9E57FF3B7941FF234827000912 - 0A00000000000000000000000000000000000000000064C170FFA6DBB0FFA6DA - AFFFA3D9ADFFA2D8ABFF9FD7A8FF9CD5A5FF94D09DFF83C58CFF6CB474FF316A - 37FF0F2111000000000000000000000000000000000062BE6DFFA5DAAEFFA2D8 - ACFFA1D8AAFF9ED6A7FF9CD5A5FF99D4A2FF97D29FFF8CCD95FF91CF99FF73B8 - 7BFF2D6331FFA3591B00CCE3E800BFF5E900000F4F005FBA6AFF5CB667FF59B3 - 64FF56AE60FF53AA5DFF50A659FF4DA156FF68B170FF88C890FF8DCC95FF8BCB - 92FF5DA564FF193A1C0000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000027552CFF3A8142FF81C388FF7DC4 - 85FF6EB375FF265B2AFF000000004F0F0000C1EFBF00B567670074CDE8000005 - 25000000000028060000E9D078006766B500BFEFC10023564AFF64AB6BFF7FC4 - 86FF79BE81FF428444FFF4FFFF0076AFD90002113A0000000000060201006E79 - 3900F4DFBD00FFFFFF00CDECFF00346CA20000020F00234C24FF61A867FF7BC2 - 82FF76BC7CFF3A7E43FF346CA20000020F000200000052260C0085AC6AFF6BAF - 6FFFFBFFFF008EC2E500041B4F0000000000445224FF468D4BFF75BB7BFF70BD - 77FF63AB69FF1E5021FF9F430F0090DEE400501A37007DC283FF67B16FFF64AD - 6BFF43944BFF408F47FF3C8A43FF398540FF549D5AFF74BA7AFF79C17FFF77BF - 7DFF4A914FFF27606C000607110041210F006A9B61FF66B06EFF8ACA92FF89CA - 90FF86C88DFF83C68AFF80C587FF7EC384FF7BC281FF6DBB74FF76BE7CFF59A0 - 5DFF1B4C23FF25180800D592500054B3E800265235FF62AC6AFF85C88DFF85C7 - 8BFF82C688FF7FC486FF7CC282FF79C180FF71B978FF5FA865FF49914EFF1A4E - 35FF341F0900D3DF9700062A7D000000000000000000525F2AFF5AA462FF58A1 - 5EFF37833EFF347E3AFF317A36FF2E7533FF27682BFF1D4E20FF102E12003916 - 0400E7E59D004C74AF000E1E3200000004000000000000000000235328FF2D6B - 32FF0000000000000000000000005D170100A6E3C300000C41004F0F0000BFEF - BF00000F4F0047110100D7E4A40095648E00A4E6DD00011046004F1101007DBA - 8000000F4F004D0F0000FFFDBC00FFFFFF00FFFFFF00FFFFFF00FFFFFF00BEFE - FF00000F4F00030000006D3A13007804EA007804EA00F855EB00F855EB00E083 - 2300FE75B10000000000C00000007856EB002C56EB0000000000000000000000 - 00004056EB00000000000000000008000000F7E1D200F1C8ACFFEDC09FFFEBBE - 9DFFEBBC9AFFE9BA96FFE7B793FFE6B590FFE4B28CFFE2AF88FFE0AC84FFDDA9 - 80FFDCA57DFFBD8461FFBFEFBF00000F4F00DBB294FFFBF7F4FFFBF7F4FFFBF7 - F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7 - F4FFFBF7F4FFD19C71FF0000000000000000ECBF9EFFFBF7F4FF9CD5A5FF98D3 - A1FF94D09DFF90CE98FF8BCB93FF87C98EFF82C689FF7EC384FF7AC180FF76BE - 7CFFFBF7F4FFD49B6FFF0000000000000000EBBD9BFFFBF7F4FFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFBF7F4FFD1976AFFBFEFBF00000F4F00E9BA98FFFBF7F4FFE9C3A6FFE9C3 - A6FFE9C3A6FFE9C3A6FFE9C3A6FFE9C3A6FFE9C3A6FFE9C3A6FFE9C3A6FFE9C3 - A6FFFBF7F4FFCE9364FF0000000000000000E7B794FFFBF7F4FFE9C3A6FFFFFF - FFFFE8C4A9FFFFFFFFFFFFFFFFFFFFFFFFFFE8C7ACFFFFFFFFFFFFFFFFFFFFFF - FFFFF7F1EBFFCB8F5FFF0000000000000000E5B48FFFFAF6F2FFE9C6AAFFE9C6 - ACFFEAC7ACFFE9C7ADFFE9C9AEFFE9C9B0FFE8C7ACFFE9C9B0FFE8C8B0FFE8CC - B5FFF2E7DEFFC88A59FFBFEFBF00000F4F00E3B18CFFFAF6F1FFEAC9AEFFFFFF - FFFFEAC9B0FFFFFFFFFFFFFFFFFFFFFFFFFFE8C7ACFFFFFFFFFFFFFFFFFFFFFF - FFFFF1E5DBFFC68655FF52260C00DFBB8900E1AE87FFFAF4F0FFEACBB2FFEACC - B3FFEACCB3FFEACCB3FFEACCB3FFEACEB7FFE8C7ACFFE8C7ACFFE8C8B0FFE8C8 - AEFFF0E2D8FFC48654FF20070000BE8E5300DFAA82FFF9F3EFFFEACEB7FFFFFF - FFFFEBD0BBFFFFFFFFFFFFFFFFFFFFFFFFFFEACFBAFFFBF6F2FFFFFFFFFFFFFF - FFFFF0E2D8FFC88D5FFFBFEFBF00000F4F00DDA87EFFF9F3EFFFEBD0BAFFEBD0 - BBFFEBD0BBFFEBD0BBFFEBD0BBFFEBD1BDFFEACDB5FFEACDB5FFEACDB5FFEACD - B5FFF0E2D8FFC68A5CFFAED0AF0027467500D9A47AFFF9F3EEFFEBD2BEFFFFFF - FFFFEBD3BFFFFFFFFFFFFFFFFFFFFFFFFFFFEAC7ADFFFFFFFFFFFFFFFFFFFFFF - FFFFF0E2D8FFC68C5FFFD78833007BBEE900D7A175FFF8F2EDFFF7F0EAFFF6ED - E6FFF4EAE2FFF3E7DEFFF1E4DBFFF0E2D8FFF0E2D8FFF0E2D8FFF0E2D8FFF0E2 - D8FFF0E2D8FFC4895CFFBFEFBF00000F4F00B67C58FFD39C71FFD19668FFCE92 - 63FFCB8E5EFFC98A5BFFC78756FFC38452FFC38452FFC38452FFC38452FFC384 - 52FFC38452FF81522EFF000000000000000000000000000000005D170100A6E3 - C300000C41003C0B0000D4E29D00062A7E0000000000000000007E2A0600BFF5 - DA00000F4F00390A0000D3DF9700C803EA00C803EA0060F5C60060F5C6000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000704A3600DCB08DFFDCA77BFFDCA67AFFDAA4 - 7AFFD8A279FFD5A076FFD49E75FFD29D73FFCF9A72FFCE9970FFCB966FFFC994 - 6CFFC4997AFF704A360000000000DDAC85FFE8B992FFE8B992FFE8B992FFE8B9 - 92FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B9 - 92FFE8B992FFC0906FFF00000000DCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA7 - 7BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA7 - 7BFFDCA77BFFC08B66FF00000000DBA47AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFDCA77BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFBD8763FF00000000D9A379FFFFFFFFFFFFBF68FFBDBDBDFFB7B7 - B7FFFFFFFFFFDCA77BFFFFFFFFFFF7F3EDFFF6EFEAFFF5EBE7FFF3EAE4FFF2E7 - DEFFFFFFFFFFBA8560FF00000000D8A279FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFDCA77BFFFFFFFFFFFBF6F1FFF8F4EEFFF7F2EBFFF7F0EAFFF6EC - E8FFFFFFFFFFB7815EFF00000000D5A076FFFFFFFFFFFFBF68FFAFAFAFFFAAAA - AAFFFFFFFFFFDCA77BFFFFFFFFFFFBF8F4FFFBF7F3FFFBF5F2FFFAF3EFFFF8F2 - ECFFFFFFFFFFB57E5CFF00000000D49E75FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFDCA77BFFFFFFFFFFFBF9F7FFFBF9F5FFFBF8F4FFFBF7F2FFFBF5 - F2FFFFFFFFFFB27C5AFF00000000D19C73FFFFFFFFFFFF9E3AFF9F9F9FFF9999 - 99FFFFFFFFFFDCA77BFFFFFFFFFFFDFDF8FFFBFBF9FFFBFAF7FFFBFAF6FFFBF8 - F4FFFFFFFFFFB07A58FF00000000CC976FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFDCA77BFFFFFFFFFFFDFDFAFFFDFDFAFFFDFDFAFFFCFCF7FFFBFB - F6FFFFFFFFFFAC7554FF00000000CA946EFFFFFFFFFFFF8E2BFF959595FF8787 - 87FFFFFFFFFFDCA77BFFFFFFFFFFFEFEFCFFFEFEFCFFFEFEFAFFFEFEFAFFFCFC - F9FFFFFFFFFFAA7353FF00000000C8926CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFDCA77BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFA97251FF00000000966448FFC38E68FFC08B66FFBE8864FFBB85 - 61FFB9835FFFB47E5CFFB27C5AFFB17B58FFAE7957FFAD7656FFAB7554FFA973 - 53FFA97151FF966448FF00000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000F803EA00F055E200F055E200F055E200E083 - 2300B837BA009096250098C03B0090DB3D000000000000000000000018000000 - 18001C5D2000000018000000180057653500D3A987FFDCA77BFFDCA67AFFDAA4 - 7AFFD8A279FFD5A076FFD49E75FFD29D73FFCF9A72FFCE9970FFCB966FFFC994 - 6CFFBC9375FF472F22000E110600DDAC85FFE8B992FFE8B992FFE8B992FFE8B9 - 92FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B9 - 92FFE8B992FFC0916EFF40ADB000DCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA7 - 7BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA7 - 7BFFDCA77BFFC08B66FF1A00FF00DBA47AFFF6F6F6FFF6F6F6FFF6F6F6FFF6F6 - F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6 - F6FFF6F6F6FFBD8763FF40972500D9A379FFF5F5F5FFF5F5F4FFF4F5F4FFF4F4 - F4FFF5F5F4FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3 - C3FFF4F4F5FFBA8560FF00000000D8A279FFF2F2F2FFD28358FFD28358FFD283 - 58FFF2F2F3FFC3C3C3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFF3F3F3FFB7815EFF00000000D5A076FFF1F1F0FFF1F0F1FFF0F1F1FFF1F0 - F1FFF1F1F1FFC3C3C3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFF1F1F1FFB57E5CFF38000000D49E75FFEFEEEEFFEFEFEFFFEFEEEEFFEFEE - EEFFEEEFEEFFEEEEEEFFEEEFEFFFEEEEEEFFEEEEEEFFEEEEEEFFEFEEEEFFEEEE - EEFFEEEEEFFFB27C5AFFE8B0E000D19C73FFECECECFFECECEBFFECECEBFFECEC - ECFFECEBECFFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FF8FAC9AFF5D9672FF4F8E - 66FF498960FF717951FF40ADB000CC976FFFE9E9E9FFD28358FFD28358FFD283 - 58FFE9E9E9FFC3C3C3FFFFFFFFFFFFFFFFFFA8C7B3FF61AB81FF95D4B4FFBAE6 - D0FF6ABB8FFF2D8F57FF1A3B91FFCA946EFFE7E7E7FFE8E7E7FFE7E7E7FFE7E7 - E7FFE7E7E7FFC3C3C3FFFFFFFFFFFFFFFFFF4A8B62FF90D3B1FF92D6B1FFFFFF - FFFF65BC8CFF67BC8FFF1A6D36FFC8926CFFE6E5E5FFE5E5E5FFE5E5E6FFE5E5 - E5FFE5E5E5FFE6E5E5FFE5E5E5FFE6E5E5FF317B4CFF9CD4B6FFFFFFFFFFFFFF - FFFFFFFFFFFF95D2B2FF196B37FF704B36FFC38E68FFC08B66FFBE8864FFBB85 - 61FFB9835FFFB47E5CFFB27C5AFFB17B58FF206C3AFF62BA8BFF60BA87FFFFFF - FFFF60B987FF67BC8FFF186835FF8803000038000000F8B0B000EEB0E00050EB - 250040ADB0007E04FF001B00FF00000000002C802EFF288C53FF64BA8DFF95D2 - B2FF64BA8DFF288C53FF273B1EFF30B1B000EFB0E0004097250040ADB000FD02 - FF000800FF0000000000409725004100FF00000000000D391DFF186634FF196B - 37FF1B6634FF3E8C6FFFF0B0E000FDF4EDFFEF9342FFF19C53FFF19B52FFF197 - 4AFFFADDC4FFFEFEFEFFFEFDFDFFF8D1AFFFF0994CFFF19B52FFF19C53FFEF93 - 42FFFDF4EDFF0000000000000000FCEADAFFED801FFFEB7006FFEC7B19FFEE82 - 23FFFBE5D3FFFFFFFFFFFEFDFDFFF8CCA6FFEE8428FFEC7B19FFEB7006FFED80 - 1FFFFCEADAFF0000000000000000FFFFFFFFFDF2E9FFEB7006FFF5BC8AFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5BC8AFFEB7006FFFDF2 - E9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B782FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B782FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B782FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B782FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B782FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B782FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEB7106FFF5BB88FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5BB88FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEB7106FFEB7207FFEC75 - 0DFFEC740CFFEC740CFFEC740CFFEC740CFFEC750DFFEB7207FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF08F3AFFF3AD - 6FFFF2A968FFF2A968FFF2A968FFF2A968FFF3AD6FFFF08F3AFFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B985FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B985FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B782FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B782FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B782FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B782FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFCE9D9FFEC7106FFF5B782FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B782FFEC7106FFFCE9 - D9FFFFFFFFFF0000000000000000FFFFFFFFFDF1E7FFEC7106FFF6BC89FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6BC89FFEC7106FFFDF2 - E8FFFFFFFFFF0000000000000000F2A35FFFEF8A34FFEB7005FFEC7E20FFEF8D - 38FFFCEADAFFFFFFFFFFFEFDFDFFF8CEAAFFEF8D37FFEC7E20FFEB7005FFEF89 - 32FFF5B680FF0000000000000000F3AA6AFFF19A50FFF19B51FFF19B51FFF196 - 48FFF9DBC0FFFEFEFEFFFEFDFDFFF8CFACFFF0974AFFF19B51FFF19B51FFF19A - 4FFFF4B279FF0000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000F6F3EEFFFFFFFFFFFFFFFEFFFFFFF8FFFFFD - ECFFFFFFF5FFFFFFF8FFFFFFFFFFFFFFFCFFFFFFFFFFFFFFF3FFFFFFF6FFFFFC - E9FFFFFFFFFFFFFFFDFFFFFFFFFF00000000FFFFFDFFF7FAFFFFF1DDA5FFF1D9 - 98FFEBBF49FFF0D68DFFEBC357FFF0D892FFEDC75FFFEECE7AFFEDC967FFF0D7 - 91FFF4EAD1FFF8F9FFFFFFFFF9FF00000000FFFFFFFFF0D895FFF1DCA3FFF3E6 - C1FFF0D790FFF3E5BDFFEFD68FFFF3E3BBFFF0D794FFF3E5C0FFF0D68EFFF4EB - D4FFEFD07EFFF4E8C7FFFFFFFFFF00000000FFF2CCFFE6A600FFEFD27EFFE8B4 - 21FFEECC6FFFEFD282FFEBC04AFFF1DCA2FFE9BA33FFF1DEA3FFE8B320FFEDCA - 67FFEABD3EFFEAB625FFFFFDF8FF00000000FFF2C7FFEFCF79FFF3E4B7FFECC2 - 46FFF0D894FFEECD6FFFEBC04BFFF1DDA2FFEAB82FFFF1DB9CFFECC659FFEED0 - 77FFF2E0B0FFEFCF77FFFFFBEAFF00000000F8CC4CFFEECF72FFF3E2B6FFEECF - 7FFFF3E4BEFFF0D99BFFF0D897FFF3E7C6FFEFD286FFF2E3B8FFF1DBA1FFEFD3 - 86FFF3E3B8FFECBF3FFFFBDA80FF00000000F5B90CFFEBC247FFEECC6DFFE5A4 - 02FFEFD488FFE9BA35FFE8B628FFF0D892FFE6A805FFEECF79FFEBC147FFE6AB - 05FFF0D68AFFE7AE0BFFF7C846FF00000000FDE7A8FFF3E5C0FFF3E6C3FFF1DC - 9EFFF4EBD0FFF2E2B2FFF2E1AFFFF4EBD2FFF1DC9FFFF3E8C8FFF3E6BFFFF2DC - A1FFF4EACFFFF3E1ADFFFDEAB6FF00000000F6BD19FFECC34DFFEECF76FFE5A8 - 0DFFEFD388FFEBBD40FFE9B731FFF1D995FFE7AA10FFEFD07BFFECC555FFE7AC - 0FFFF0D78EFFE9B31BFFF7CA4EFF00000000F8C73CFFEDCA66FFF2DFAAFFEDC7 - 67FFF2E2B4FFF0D894FFEFD58DFFF3E6C1FFEECE7AFFF2E1B3FFF1D997FFEDC9 - 69FFF2E1AFFFEBBB36FFF9D672FF00000000FFF1C4FFF0D58CFFF3E4B9FFEBC1 - 47FFF0D999FFEFD17DFFECC456FFF1DEA8FFEABD3BFFF1DCA1FFEDC961FFEECD - 6EFFF3E5BDFFF0D487FFFFF8E2FF00000000FFF1C6FFE5A500FFEFD27EFFE8B1 - 19FFEDC860FFEECE75FFEAB937FFF1DA9BFFE8B21CFFF1DA97FFE8AF16FFECC5 - 55FFEBC148FFE9B41DFFFFFDF5FF00000000FFFFFFFFEFD182FFF0D898FFF3E6 - C2FFF1DA9CFFF3E6BEFFF0D68FFFF3E4BCFFF0D68EFFF4E8C8FFF1D895FFF4EA - D1FFEECD71FFF3E4B8FFFFFFFFFF00000000FFFFFFFFF8FBFFFFF2DC9FFFF2DB - 9CFFEBBF49FFF0D689FFECC250FFF0D78DFFECC554FFEFD07BFFEEC863FFF2DA - 98FFF5EACDFFF9FBFFFFFFFFFAFFF7F5F0FFFFFFFFFFFFFFFCFFFFFCEFFFFFF8 - E2FFFFF8E5FFFFFBEBFFFFFDF4FFFFFDF3FFFFFEF4FFFFF8E4FFFFFAE8FFFFF8 - E0FFFFFFFBFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7E4 - E5FFAEA4A7FF8A7178FF8F7F84FF96898EFF8B7D82FFB4ABAEFFE7E4E5FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF9F9FFAEA4A7FFD3CE - CFFFC7C0C2FFC7C0C2FFAE8E96FFC0B8BBFFCBC4C7FFCBC4C7FF8A7178FFB6AC - AFFFFAF9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFAF9F9FF9C9094FFBBADAFFFB4A1 - A4FF977F86FF5C1C2BFF5B1B2AFF561B29FF632735FF977F86FFB49CA2FFC0B8 - BBFF9C9094FFFAF9F9FFFFFFFFFFFFFFFFFFA89DA1FFAC969AFFAA9FA4FF7046 - 50FF5C1C2BFF5C1C2BFF5C1C2BFF5C1C2BFF5C1C2BFF5C1C2BFF662A38FFB4A1 - A4FF80535DFFB8AFB2FFFFFFFFFFE6E2E3FF7C6E73FFC0B8BBFF80535DFF5C1C - 2BFF5C1C2BFF5C1C2BFF5C1C2BFF5C1C2BFF5C1C2BFF5C1C2BFF5C1C2BFF6327 - 35FFBBADAFFF8A7178FFE7E4E5FFC7C0C2FFC0B8BBFF96757CFF5B1B2AFF5C1C - 2BFF794853FF7F7076FF662A38FF7C6E73FF726369FF726369FF5B1B2AFF5C1C - 2BFF8F7F84FFD2CCCEFFB4ABAEFF96898EFFA58B90FF662A38FF8A7178FF8053 - 5DFFB8AFB2FFAC969AFFAA9FA4FFB4A1A4FF885F68FFB4ABAEFF561B29FF5C1C - 2BFF704650FFC0B8BBFF8A7178FF561B2AFF704650FF885F68FFC0B8BBFFB8AF - B2FFB4ABAEFFAA9FA4FFAC969AFFD0CDCCFFAEA4A7FFAEA4A7FF5B1B2AFF5C1C - 2BFF96757CFFD3C7CAFF93868AFF6A323FFF8A7178FF8F7F84FFAEA4A7FF8A71 - 78FFC0B8BBFFC0B8BBFF96757CFFAEA4A7FFA89DA1FFB7AEB1FF8B626DFF9675 - 7CFF704650FF723D49FF5C1C2BFFC7C0C2FFCBC4C7FF662A38FF561B29FF5A1B - 2AFF5A1B2AFF662A38FF561B29FF561B29FF5A1B2AFF561B29FF5A1B2AFF5A1B - 2AFF5C1C2BFFCBC4C7FFAEA4A7FFB4ABAEFFB4A1A4FF723D49FF5C1C2BFF5C1C - 2BFF5C1C2BFF5C1C2BFF5C1C2BFF5C1C2BFF5C1C2BFF5C1C2BFF5C1C2BFF5B1B - 2AFF8F6A72FFC0B8BBFFCBC4C7FFE6E2E3FFA19599FFC3ABB0FF561B29FF5C1C - 2BFF5C1C2BFF5C1C2BFF5C1C2BFF5C1C2BFF5C1C2BFF5C1C2BFF5C1C2BFF8053 - 5DFFC4BCBFFF703845FFE9E6E7FFFFFFFFFFB4ABAEFF977F86FFAC969AFF7046 - 50FF5B1B2AFF5C1C2BFF5C1C2BFF5C1C2BFF5C1C2BFF5C1C2BFF662A38FFBBAD - AFFFAC969AFFA89DA1FFFFFFFFFFFFFFFFFFFAF9F9FF998D92FFC3ABB0FF9E92 - 97FFA58B90FF632735FF561B29FF561B29FF5B1B2AFF977F86FFC6BEC0FFAC96 - 9AFF928589FFFAF9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFAF9F9FFA89DA1FFA58B - 90FFA58B90FFC6BEC0FFC0B8BBFFD3C7CAFFA19599FFC0B8BBFF794853FFAEA4 - A7FFFAF9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7E4 - E5FFACA1A5FF96898EFF8A7178FF93868AFF75666CFFADA2A6FFE6E2E3FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F3E508F0E4D42CF0E5D523F0E5D529F3E8 - D920F0E2CF2FF4ECDF0EF1E8D923F0E0CB32FAF9F106FDFFF902C2E6CB3251B8 - 7B36C5EEF62EEDD9C13BF2EDE00AFDFAF003F9F5EA11FAF5EA0DFAF5EA10FAF6 - EC0CF9F4E812FBF8EE05FAF6EC0DF9F3E613FDFDF502FFFFF800E8F5E61351BE - 7D15E9F9F712F8F0E217FAF8EE04EAD4BC27CCA683A4CAA8878ECAAA8A99D2AD - 8C8ECC9F78A8D3B89E52CFB19386CC9D70B3E3E2DC24F0FBFB0C3FAF6DA3519F - 838F48BEE7AFC5854CCDD4C4AD1FEAD5BD20CDA88696CDAA887CCDAB898CD5B2 - 9378CDA0779DD7BEA53ED1B3967ACD9D6DA7EAE7E01BF4FEFB093EAE6CA151A2 - 7AA047C5EDA0C6844BC4D4C4AD20E5CDB453C79D74E9C0A187D5BFA78FD7C594 - 6BFAC39D7DD4C09D7FC8C5A380CBC29C78F2BBC9CD4EC5E0F34152B685A5488E - BC3E428ACAF9BE8958DFD8C6AE15D3B79980C9A684E0D0B299A5CEAB89D3BE97 - 75EDC0A389CBC99F7AECC29971EFC29973E9A6CCE74671A7D3E981C6D660419C - D461233ECBBDB1AA8750C5C7AC2DDAC2A877CBA27DE6D1B7A097CFB193CCBF95 - 70F2BFA388BDCAA07CF3C39B74EABE9169F2AACBE04271A7D3E182BDCF6E3798 - E2541F3BCDD3B5997466D9CBAF18CEB49B6EC4B4A59BD4BDA891C5A585B8C7B2 - A19BC5AD98C8C9AD969BC3A689C2D1C1AFA78DC8F57F7DAED3E8A1DDE92972B5 - C168273DB25EA3BBA71379958548C7A58486C5B09BBDCFB095B2C89F77D3C0A4 - 8CC6C3A891E0C7A383C3C19B76E5CEB49AC397CCF76276AAD3F48DDBE83763AD - B9772A42BE79A6C9B0188AAE9957E0D2C635C2C2C06CDCDBD868BDBAB291D8D8 - D55ACABFB3A5CDCBCA5FC7C7C385D5DEE18387BCE0E4A2BBCAD5D8DBDE49AACB - D2724D589A4FA5A09A4A6A6D6A5DE2DAD52BC1C2C249E0E0DF44BBB7AF77DCDC - DB33CBBDB190CECCCD39C7C8C568D8E3E96679BCEADD99BACFCBDCE0E61DA4CC - D751303E91259D96911F54585736E1C4A246B5C3C6E3B3C6CAF3B0C6CAF3B0C6 - CAF3B0C6CAF3B0C6CAF3B0C6CAF3B0C6CAF3AABDC4F3B0BFC4F3B0C6CAF3B0C6 - CAF3B0C6CAF3B0C6CAF3B0C6CAF3FFFFF700A7D2E66880B4CDA57CB0CB9D84B9 - D19D79ADC69A7AAFC9A17AAFC99776ABC69F82B7D19F7AB1C9A07EB3CBA17AAF - C99984B8D09E80B5CF9C84B8D0AFFFFFF7008ECDED7D70BEE4BC6EBCE3B872C0 - E6B86DBBE2B76EBBE3BA6EBBE3B66CBAE1B971BFE6B96EBCE3B96FBDE4BA6EBB - E3B772BFE5B970BEE5B872BFE5C0FFFFF700DDDDD82FACACA96BA2A2A158AFB0 - AB5BA0A09D5A999A996AA3A3A24E9C9D9C62B0B1B05DA0A39E69A7A7A3689C9D - 9C52B1AFAA59AEAFAF57AEADA76EFFFFF700DCDDD738A5A5A1719C9C9B60ACAD - A7619896935B9696966C9A9A9A5392939266AAABA964999D9869A1A19D6C9797 - 9757ADACA561A7A8A65EACABA480 + 4C7A1700000010000000100000009D3000000000000078DAED7C775897C7D2F6 + 5AD38BE624313127D13413634CD1D835F65EB062171B204D8A8880280A4891DE + 7B6FD21190DEBB74100541A5F78E1445B9BFDDA504124D48CEFB5EDFF9E35DAF + F129BBF7CEECECCEB3B3B3FB236D420349A3446CC800BD242D5E5C8B17BDDFF0 + C3E7A4E0862629F55026A5EE4AE4BEAB1229725624858EE7C91D7B79926F2747 + 72AC6589B5B53532CCCF92745309126522CF712C9578AB93BA70634E77EFDE45 + 41410172727290999989B4B434242525C1DFDF1FE7CE9D83BEBE3E020303C1CA + C61A48713CE73B48797979E8ECECE4D4D1D1314CEDEDED9CDADADA70E3C60DB0 + B271D78507F853790170CACACAE2D8AECC9B0394E18FAE741F74A679A133D903 + ADADAD707676062B1BAD7992E38B5D1439F659DF13929A9ACAF9555555A1B2B2 + 12151515282F2F475959191E3D7AC4F13636361C1FA121C4F14C57ECF9F9F3A7 + 243E3E9ECBD9954679A6329EEEE84C7441679C033A62ECD0D2D2021313138E0F + BD7294E3999E07F0CF48646424C78FE4F9F0E1433C78F000A5A5A5686E6E86AE + AE2EC7875C3ACCF1AC8FD8737FFF33121C1CCC75D419EF8C0ECED3061D9156E8 + 8830477B98199A9A9AA0AEAECEF1372F1EE4F83C5BB961BC6BA01B6FE3489E25 + 2525B87FFF3E6C42DD70CCF21C76E80B63B3CE71482B0A707CA6C5598E6FEA6D + 24D2F14ABC8D0C77E5CA15A8A9A9717EE2D71570DCFB0ACCEE0423A226176291 + 06F8DE40106F2FFD14B74DA538BEA8AD84C8A55C44FCA364CE53434303212121 + 080D0DC57ACDA3302C0884F1DD40263B4E47E94224CA00D3447F419AB104E979 + D643441264A19961800B89AA282E2E86B6B636C2C3C339FDA4BC15B6776E6164 + 32CBBF898FC417427ACB0262EE2E464E448943E89618A402E461E0610C4D7D4D + 444545213A3A1A9F492EC38988EB108AD0E458A170CD61FE4C07E2E2E2F8335A + 252E806F7477E354841EE7CBAEEC99B59F8C317D76FA277C2CB680CB3C4D783E + DE5AFC6F8EDD38B18193C0DE624E4369C78E1DC4CCCC8CD0F146366FDEFC52FB + 1F993EFFFC73F2C61B6F90F1E3C713AA77525D5D4DA82D107B7B7B6EFFAFBFFE + 3AF9E4934F5E88BD7CF9F298EDFFE4C993A3B0A74E9D2274CC8CD9FE996C6BD6 + AC19C6B3FA121313C76CFF8A8A8A64E1C285A36410111119B3FD6FD8B06118E7 + E4E444FCFCFC485050D098ED9FDA05B970E1023973E60C49484820F5F5F54C77 + 63B6FF94941442DF1131313142C727A17292FCFCFC31DB7F5C5C1C2F2F242444 + 982CACEFD858F933FB6736D5D8D80805B50B98A6BF8E6CDFBE7D541F1C163DFA + 52FBBF76ED1AEEDDBB8792AA52ECB13D88F56EA2E4158DF9848C1BC0EED9B387 + 98F95ABED4FE75747450585888DB251938E82104E990CB649923FDFE5DFC92E3 + 77EEDBF9A7F67FFDFA7564E46562BBFD1E28465EC65AD3AD78F7DC37844C1C10 + 60EEC179E478E4CBED5F4F4F0F57ADD5B0C77C3F4EFB4A6285DE1ACC393E77D8 + 9EFECAFE87484C420C07140FE2989C10442445FED41E67CF9E4D56AF5E4D962F + 5F4E66CC984188DCA76482F2A7848C1F5DAE8DCEFD8C16392FE6F47FF6FF7FF6 + FFBF61FF576C73F08D503226AE8EC2E46D3E98BD4975CCF6BF57DA05CBE4F3A0 + 17D283B0BBFD90F5ECC21C89DB18FFA9C098ECFFFD6D4114DB8D6DC6C0140560 + E63560A54E23266C71C758EC7F1295D92FAB7FD4FC3FED722B6D4B24C662FF53 + B705E3A4DD638AA18ECAF95E4A2D98205A8E092BDCC634FFAF3E6E81AF4FA561 + A6420D26293660DCA90798B42D0AE366EE1FB3FDBF2D2C41587B99CC1396BB0D + 63877CDF4A93B5A8305E836AAB9D28D75B8D876A3FE2F54BF7486B9A1C192C38 + 5C7779530FE9BDA738F0F0FA25526DB18D627E85D7F35DE4A1FA7C54DB1F43A9 + D2B718AA9B4CC91EE093FF2187640FBEFF70B0DE72DDA518B8ED260F55BE47A5 + C57EDC97FB9CE319E4FD867A8EFBA0B161B42C5E20BFBE3685F32CBBBE92F3AC + 7116C703D5C518292FBB7D5D0F83905CF2DA949D04D1F4DBBD17A44C6F1518CF + A18246370E43DD51803FFF8B7FF216929AA9FC8960E3683DB0DB4AD33DB87FFE + 4B8016BAEEB20B9AB70D7035590742F63B012F42561A6E44B5B702AA6E9C478D + A73CAA3DE550E5268D72A7B3384FEB60ED2C3AFB6FDC13FB186A0E3B71394913 + FE25213817AA0C865DA4BE02551457E52187FA0823B6F6414D90161ED9890FB7 + 311F730704A2538A80FB013ABF29C2ED9E0FECF25DF1A3E2025EA8CAED2C2A9C + A4D01C698A7ACF73F80D726FA02D3EBE64EF60BB185FEB3C2798E6D8E2DBB373 + 5143B1E58E1228B73F83A6A06BA87393F99D7ED9A3F13096C9CCF832AC86C626 + 54DE50C6431B518EA9BF7101751EF203E009ECF26C784A42DFEFF50B52E52283 + 87D622C060A13A3759D4BACAE0BB11E58630AD9832F03C953DB7926A475154DC + B88C12D393C3F256991FA6F2CB733D9830E830A4855FBD07CBD5388AA0CCF502 + 4A4C8EE3BEA1108A0D8EE09EEE413CB412479DFB05AE07E4FC713C10F23DA964 + 7C5CCFA1D442044B79219AE7E5CDF55B61B08FE215514EFD7763E80F007518D0 + 980C3E915A5759CAF3284A0C0EE3B77A2711A69E2A2B11D4FB5C45A5C911FAF6 + 7DD2F03EA3DF04A8B6124295F911949B1CA4F67C809659401ED3A57685FE6ECA + 7317CAAF0BA05C7BC730B1B9EFE5C46CF755F226FD378ED63165DC04320E4944 + C2A60067ACF270DA3C7BB8F1E3274C24935F7995BCFE067D15F22E194FCB8E9F + 38814C9A3891FA692A349F90B376856058F580621C300CC331E3DB581D184F76 + E5B5B139042A2A2A50565666F32BCE9F3FCFE77C19191948DB15408A62AF0596 + C02BBF169E39D5103408C57EBD64A8A96B104D2D6D72F1E245585A5A72B2B2B2 + E2C47C0E4652B6F9B8915B032F4A162965308C7F80BDFAB7B0532B0E1D9D8F49 + 774F2F613C1976A7E17E585A59721C9BAB19895BE5C03DAB0AFA710FA1155502 + 1D4ABB7443B0592D12E368C3264E9A4998BC8CE732EDB5D8A8BD9DE36C6D6D39 + 9D36CB80D3ED0A8EBD1A560C354A023AC158AD128235265BB1CA703356E86EC0 + 32ADB538EC720A071C84B0F6EA66D8D9D9713A669406BB94725C0D2DC6C5A0BB + 50B97917DBB582B0E44200561A6C82499E3D0C73ACA09B6906ADDB46504BD585 + 808520562AAF03F5BD70402F1116098FA04C71727E853892D884CD9A37314FD6 + 0BCB75D6413FCB121793AF41214115B2B1CA90A374215E151B0DB663F7A57DD8 + AD15039398529CF329C089D0326C2EE8C72A9D507C27E98625D7560DF3BC9CAC + 09A584AB381F7709EBF5B76289DC0A383A3A628B5A387423EE43D22317A7DD72 + 7134E821D6AB07E04B51472CB8B21CF35496E0C70B0BF0FDB979D868B803EBF4 + B76091EC328EA5FE11D6AA0441F35611849DB32164978113F619543F01F8F4A4 + CDE0F8033976EC181C1C1CA89FB012BF482FE23846CC5F5B76C11F5768DB8F53 + DC01AB341CB14EC76A553F4C3B6681E241BB3974E810E7B754F65738D02BC331 + 727171C12F723770D1AF00072976B7690A04CD52B1F2B22FA61E3219B4CF4222 + 2828388A27C331727575C55C29572878E551CA87AC7B2E441D32F1EB255FBCBD + DF908F39696969ECDEBD1B020202A0EB226CD9B2059B366DC2FAF5EBB176ED5A + 7C296C8B9FE43CB04CD90FEBD582B14D3B1CCB557CF0C63E7DFA89D420034AB0 + 18986BC9C4E1391D788B74B7FA8CFA46BE73C0086F0A1A50D98D38BE8CFAFE8C + A699114E2F4A121212D47FB7E7639A8D71F23712C3321CF389996F676E6EFE52 + 3CF361A9FF4FA8FF4FA8FF4FA8FF4F98FD303FBAB6B696FB62CCFF7D199EFAFF + 84FAEF9CA81FCE89E997F1666B0A0B0B0BE6FF13B68E607E305B178EC453FF9F + 63A9EF3F4019FE84C9CB7CD9E4E464989A9AF235888F8F0F5F8F6A6A6A8EC253 + FF9FF3646B1EEAFF13EAFFB1F513EEDCB9C3D732CC1F8C888800F5D9F9BAE6EA + D5ABA3F0D4FF27D47F2735378D5172431BC6C6C6606B0AB6166257EAB783AE53 + 98FFCDFDE203070E8C6A3FF5FF49D52D1BD486DBA2E696258A6EE882FAE9DC0F + 66FE2C9397F9C5AAAAAA7FC0F258A6B7016A426DD19A138596EC0854F851BC8D + 32B4B4B450E86D44A8FF4F28DF17EA3E4C5B8262AD282E12F5711EA88B764153 + 5A101EB95E4181DE09E6FF13EAFF13EAFF9309CB5DC9B81982C3D8D06BE2A809 + B6444B5604EA63DD501D6C4EDB6087C6143F3C745044AAEA41E6FF13EAFF13EA + FF13EAFF933962E964FCBF05285694FA43A668C90C437D0CC5D2FB9A501B3424 + F9E2A1FD05E46A1E64FE3FC57613EAFF13EAFF13EAFF13EAFF93094B9DC8035A + 7F73662897B72A90FA56B7ACD190E88387B6E7907B6D3F1B7384FAFF84FAFF23 + EC0A84FAFFB42D91A4C4E22C9A693B6BC36C781B1A12BD29560EE99777B0FEE6 + EB2BEAFF13EAFF530CEDEEF3BD945A08F5FF09F5FF49DEF5E35C470D09DE6888 + F344A9950C5215B730BF9F0C11F5FF09F5FF09F5FF09F5FF09F5FF09F5FFC990 + 0F9FA3BE17856A3B91A7B20551922B5E681F6F7F7B984C58E6CC65A6FEFF30F6 + 9B890D9C54E70B722A53FB82B416F9F13C4FF6DF2F822478BEE0A8BAD2463C6F + 1D88FFB3983A4ADD9570DF550945CE8A28743C8F3BF6F2C8B793438EB52CB2AD + A459FC1FE9A612883291C788F83FF769FF2EC51A486130FE8F7F4271D7853118 + FFC73F49D19A27B1E31D1EFFE7CFCFFA9E50EA45DF931EF4F53CC6D39E0E3CE9 + 6A434F6733BA5B1BD0D5588BCE862A74D43EE4E52334843018FFE7CFCF9F3FC5 + B3674F793D7D4FBBD1D7DBC5EBE9EB6E47EFE316F47434A2A7AD01DD4D75BC7C + E895A3188CFF0FE29F51EA1BAC87C942E57842EBE8A575F474A2AFAB034F3B5B + D1DBD1C4CB875C1AF02D591FB1D4DF3F841FBAD23A9E0DB667B89E0E5E0F4B37 + 2F1EC460FC7F183F4403F801599E3FEF855094040EDF128160C071ECF23CCCCB + 0728ED477A890B8BFF0F6AF4196BC5887A86F04F7128F834ECEEBAC3AAC0195B + EC77F3D23EF27BE8FFB1E4B6A9D4885EE91FACE3F92879F6781F8579BE038CA8 + 8FB4DBE110EED4DC8597DC6E2E7F9AB1C44BFB583DF93A04BD8F432C580E86D9 + 16D0C9308258803496AAAFC62E85E520EFEC203A020B90A82FCAC7538CD62944 + 6A1C47B8DA310453FD06A81CA4FEC61E9CF4118756BA21AEA6E86097F57EAC94 + 5F08A9EDABF01AE57F4F6B1E518EA9276F7DB6867CF7EE2BA4CCE508D9E05245 + DE193F855438AF25B355F2C9CFB28BB1D7FE30042CF761EBF99FB0C2EA2145BE + 3510A7A36330B635963059DEA14BDA42A31564A95E01F5B9DF1E95F7F5B1D998 + 29F8D5A86FC3910FC7F1BD3F4696B23339FD5FFCEF7F2FFE1778BF1EFBDD8AA0 + 41D731EBED72F1EEC26D638EFF7946DD82424C2D82F3DB50DD49C77F7E2BB650 + BF7C2CF13F87DC47502D6CC1CDCA27B81E570BBF826E24953D83B05D0EFE2AFE + 1716E107953BCD48EA7E0E8907DD90BCDD8C932EF720EC908FA3A2D27F1AFF73 + CF298562410B527B9EE35869170E55F440E96E079659E661EB41E13F8DFF1DBD + 6A02858C5A8E3D4AB107CB7BA07CA71D6BCC0AB1C6F1F29FC6FF6D637220177A + 070954E6938F7A70A4A297CAD1868D16F7B1CFF5EC9FC6FFF73A5E87D2AD4218 + 86E6616F7A150E3DEAC285DC666CB32AC6165BE1BF8CFFAFD1F64219FD44EEB1 + 2EC2C74A31D864998CE56A5190B7301A53FC7FCE693598A63E8151FA13ACD248 + C78C531E1092521C73FCFFDDA5BB30EBA80636694662B5B23D96AEDBF6A7F1FF + 45CF3BB8FDB32BA3FF89D4E0AE803AD773A87394428D9D38AAAC4EA3C2ECE898 + D70D758ED2E8A036D096E289366A03AD09CE28D7DF3D667C8D8D08C735DD3242 + 63902E5AA26CF04863C398F115C687D112EF8886406DD4FB69A039D414251797 + BC107FEE423F18C99EEF8794CC73DA47CF50AEB70BCD9156A8F7B9825ACF8B68 + 08D243D1B9392FC58745F6E356783F826EF52320A81F8FD4D7A12994FAA26E17 + 50E32C877A5F0DDC157FF15EAFB4DC730487F6E38A463F2E5EE9878F7F3F8A95 + 17A3E1A60EAA1CA450692B46655041DE898F5F8867F2329E8A97FA21AFD80F4F + AF7E2AEB6CD4F9AAA1C2F234CACD8450ED721E3982D3FE308F6F73DA8B93A79E + 729EACFD9232FD7076EDC7DD339FA296FA5865548F8F0CF6A1CA5E0A59DB3F40 + 44710842EF0622A8C00F7E7937B0CE7C1B0E1DEAE53CC5CFF6E3F4997ED83BF6 + 234FE863543B9FC343DDDD78A0BD0D1556C2485FF73E420A03A013AD06B53015 + 7864B960F9F5B5D8BDB39BF33C21DC8F23C7FB6165D38F9CBDD368BB25507A6D + 334AD4D6A2CCF4285296BD07FF3C6FA8862A41F1A61C1CD36CF18BEA326CDED0 + C5791E3ADA8F7D07FA6166D18FACAD1FA0DCE224EEABAE42B1CA52DA86FD48F9 + 652A3CB3E83A3E4006D2DE62B04E32C7DCF3F3B06A7927E7696ED90F13B37E18 + 99F4237DCDFB283339427107F0486F2F1EEAEC44DCDC29704EB7875D8A152C13 + CD601A6784599273A0B956156ABF5EC2E5452AB838EF2214E72A2365C97B4859 + 3815493F4DE5B8B8D9EF2276D63BB8B8E32B286D9E0985F59F427EF574C8FDFA + 11FE535B1DDAFF8B6BD8CDE9EF26AD83AB4869A0DEDFF2FF93AC95C0702C3DF0 + D1F847FE7FBCE1D9FFEFFEFFE0F99F811789577E239A8403CF0E134F3996BFD1 + 0BFC7F8EA33EEA483C8BE9B16B7F7FFF00AED87718FF7BFFFFCFF83F7FFEFC0F + FC7FEFFF8F4C8CDF1031EC487AF6ECD90BFDFF91FC186E8F058689E1440ADB86 + 69C8FF1F3CFF338CB7A0ED1F9297E1E4BC06F08C27C3D9346218CFFC7F861FF2 + FF47F267E547F2EFEBEBFB03FFB1F8FF7F966EC8EEE47817C9ED2FF5FF998E02 + 95F7C34F5110BEE7F7C19BCA7C83F2BD21B3130C47FE0BD23F8CFF93335679E4 + B47936F99BF17F8E550F2826070CC3C831E3DB6444FC9FA8A8A810656565F2AF + BC164CA63ED7B8FC268CA73439B705AFE534B1F83FF1CAAF259E39D544D02094 + ECD74B2623E2FF2CD64726519C425D170A7A9FE14ECF33E451FF31A5BB0FF2B5 + 5D782DAF99C5FF8961FC03B257FF16D9A9154746C4FFC9E4DC2638B73E414047 + 1F0C9B7A70ADA11BBA8DDDB06AEE414A571F6C681E934B27AA84ECD20D219BD5 + 22C950FCFFCDBC26C8501E2EED4FA14FB1A6CDBDD0A357638A35A3F7BAF4DEBF + E329C46B1FE323EA130BE80493D52A21648DC956B2CA70339998D38C9B9D7D30 + 69EA1DC0B4F4C29C92052593E60162F5B03A5EA1FAD8AE1544965C08202B0D36 + 11933C7BC27415DFFD8CCA3BC0DB9ACA6A4FC9A1ED09ECE8D580BE93ABEB865F + E733AED7CD9A37C93C592FB25C671DD1CFB2E4F828DA464BC6AFE5096C39F629 + 1C697B0CE9B342432F846BBBE1DA3E805FA5134ABE9374234BAEAD225AB78DB8 + FC9E1D033A526AECC5A19A1E6CADEEC186EA275856D98B8515DDD85CD503CD96 + 01F9D7AB07902F451DC9822BCBC93C952584E9558CEA4FBFA50F2B69D9A5953D + 5843B11B6B9EF2EB0AFA7CB6F12976543EC6DB14BFF66A00F9F4E4D081551EFF + 27AFD0FE95AAA7EDA4E5B6D5F4627DCD136CADEDC3767A15AA7F8AA3B53D7895 + 9639629D4E56ABFA9169C72CC888F83F7174742413A91CEBCA1F43B4FE094ED6 + F74190E276D73EC192B2C760636BB7690A11344B252B2FFB92A9874CC888F83F + 5FCB317A8F8FDF1610AA2746AF50DC3B6C5C7AE51359F75C22EA90497EBDE44B + DEDE6FC8C7ACB4B434D9BD7B37111010E0E7A2B66CD942366DDA44D6AF5F4FD6 + AE5D4BBE14B6253FC9799065CA7E64BD5A30D9A61D4E96ABF89037F6E9937F10 + FF276F0A1A50D98D387E68FDAFEAB69CD3C8F5388B55878585414141614CDF92 + 5F7FFD95BCFFFEFB6422B57916ABA6EB7FBE16F6F6F6068B09BCF7DE7B64DEBC + 792FC4B2757D7676365FF37FF9E5977C2D3CB48E0C0808005BC3B07A3C3C3CFE + 10B7673A1C3ADFC2CE7EB0F87A4C4C0C583C81C5DE199EC5EC333232F83E023B + 13222C2C3C8C676B5716676075B0F2ECFC07AB6708CF9E591C9DE1997C6CAF90 + F5D7EF64E06559DC223D3D9DC7F9D9DE05DB0F62F2307DB03631DE67CE9CC188 + 983F7F1F1B1B8BA2A222B01804DB2760FB992CC6B074E952C2E2EF2CEECFEA61 + F96CEF82C5F12F5DBAC4E32374FDCF65657C990EDDDCDCC0CE7D0C9FD1DEB081 + AC7495C64F0EA7B95C4C16A657B6A6647C599C82B58FBD67F5B3BE60E36E28AD + 5BB78E2C7114C5C1A02BF8C65290EF3FB0F2C78F1FE7FB93EC7C1BDB7B63711B + 5607D3C172B7B358E82289794E22F8D1EE04F6FA5F8451861776789F63E7FFC0 + F6CBD87ED7100FD61EB6C7C274C1AE0B5DC4619E1D00D32C5F8E33CCF0C4B928 + 43E8A43AB1F37F7845F3170CAD65D958757777E767FC1896F5D34F0E2739F66C + 843EC4C3B4217C4B03C78354211272156A0996A0EB7F90CB03F13076968AE99C + 8D37560FDB97F9D6E6100C6FDF805E9A1B74529CA0956C0F315AC7D5040B6C74 + 13C6E40B14FBEA6F8B694949499C3D7B16A74E9DC2871F7E483EB7D8894F8C36 + E30383B578F7FA522C71380AD57873AC773981D714BE00993CFE0F363073269D + 47DE7C93C7CFD81E0D3B3B74F3E64DB0BDC97157BFC31AA763187F7EC60BB1BF + 4FACFFD89EE2D6AD5B317FFE7C422ECE005DFF837E1E46A55C6AFB8C8A8C1773 + 7A59FC6F2CE9CFE27FE3C68D237F15FF637B7E0EA6DA880A70859D9106EB0FE2 + E768C2EFF7EFDAC2EC89F5337959FC8FDA3FB1D0534362981F4E1FD9CB6C825C + 941585A78D3E6C8DAEB17141A8FD9317C5FFCE899F80AB850ECCB455E0607C0D + 2B16CFE7F8ADEB57E2D23931682849F377B252E29097971F8EFF4D9E34897CFD + C50C62A37F95CB794D5906FB766C84C0E6B5503D2F0129E123B82AB11FEE462A + 30553FC7F3BE9B3DFBB7F37F74CEF173B640849F33AE2A4872F2325246848729 + 829D75116071050E7A2A50933C049993825CBE7FFDEB3DFE4D66E7FFD89E21E3 + 1BE8628ECBF2E260ED55903C058993873077F6D79C1F9363E8BDB4C851D0BE60 + DF347EFE8FED191EDBBF13AB972FC2FE9D9BB17CD13CCCFBE13B7C31F353B0EF + F8FBFF9A8A8FA77D80AF3E9F818F3E7C1FEFBCFD16DE7EFB6DE4E6E60E9FFF3B + 79643FD759666204E282BDE06E791D2B8E6EC40227093277E75218AA2B2221CC + 97E7B1BE786FCE748C3CFFBB6BCB3AA85D38CBF18AD2C290113D8685EB1731FB + 270B572CE4BA67F80B674F435946046FBCF11A46C6FFB66D58358C1F2AF3C3DC + 6F6192E9433EFFEA33AEB3213CD303ED338C8CFFAD5FB594F360E386E5333D2E + F8F97BE8C43992C5AB16713CEB9FA13CA6BFC9673F1F8EFFB171B178FE8F5C6F + 73BEFD0AB3BE9C8919FF9E8EE9EA6BC9D4991FE08DD7A9BCAF4CA6FAE4079E06 + 68C2B83FD8C0D4A953C9E4C993B9AD9C3F7F9EEF1D52FBE7F1CD718ADF106AFF + 64FCE9E9E445D87F7AFE7768FE0F0B2AE3F4E10F1F93556A9BB0D75B0847A2CE + E068AC380E049DC65AED6D98BEF0B397FEFEA7C44399E885CBE1549214DCCA23 + 11D19089E4B21824DF0F46F4BD00B8DFF3C1B1E83350F21745A8D9B951BFFFA9 + 0E3722571214A05BE48CACAE3ADC69BE8FECE602E43CF2C7DD8721745E754676 + AE139272BDA0996E04A90061841B490EFFFE472F42169AF71C11D7F110A91D77 + 51D85A88DCFA1C1496B8A3F4A1374AB20C712FED3AD2E3F5115DE80FA5542348 + D80EAC3F63BC15C8A96419C4755620A43518216D3E886F0EC59DCA501417D9E2 + 7E8119B24224911A2489900C75983EB2867F6D1636D86CC3BFE67E48B4C26561 + 49650C69CC4460AB07D25B6E20AF211D85397A28CEB88EAC60613A9F8BC0FAAE + 0CAE3E948352A90C8C725DA095E68A39A23FE16CDC590435E5C3A6C219760D7A + B4EDA1C86D48454EB81432038591912E8FF32522102EDE86D3F7B641A2E008E4 + 222FC1AD2401F39417E174C259C4B495E24A911A144A24115B6D8DCC471EB8ED + 790409D11208BB7F1DEE454250C8FB1562B9EB71204A0027BD2570B32A1BF354 + 16E2548224625A1F402E4F05867912882AB347AAC75114041C458AD56EA44449 + C13F4F09C14992F0BF710CCA370471D045048195D9F841691EC4A2C4114075AD + 76C710B1A53A48CCB88A4CE77DB8EF7F18A5FE87906EBD05B1D7D620547D0DC2 + AD77C1DCED044EBB9F87735134BE3BFB3D5402CEC0F89E3F1C1F06433D451A9E + B9AA48763B8C5C0F419479D17ADC7722D57233C27537E0968D20AE501F4631D6 + 1057626CF1C5A1AFE06D2B4EF6050821A4A10067A2CE412A5A0631B72491EE72 + 088FBC0FE181E77EC41B6F87DD8DFDB840F579D05C04EEA571F851E9674CF96E + 2A5BFF13F5441D9C8FD383D5BD2028C6A9222AE112526E88E15EE019DCF53D8D + 289BA310F215C3010B515C89B782C80D652C529CCFC70FFBFD4FB48108396CB9 + 13D2A1D7E057978AB87C4724535FE976B00A32FD2F20DCE3025433CDE0783F0A + C29E4AF849711E4405168CB2A309AF4E2473847FC462AD15B049B64350821DA2 + E36D1193688780FC405C8AB3C60FCA3F638EDC0F98F8C6A497DAFD94D953C957 + 8767618EF45C7C2FFF23A7D952DFE37BB91FF1F5A9D97F28DF4B6D5FA86DC5F0 + F3BFE9F761C8CA575A7C454E9119A3E5A4944E3F3F75BEEB489AE562C2F630EB + 5AD69037E975DA864EB2E2D3E92457E2189D8FFDD0941587FA8C2054DF72818B + 4836993FF321D937AE8A4C9B5C4DF68EAB261F4DAE217BC6D5908F27D791DDE3 + EAC889CD72E4417C229ED497A2BBEE013AABEF73EAAA2D4557D55DDC0FB641CF + AAC564E9C476B267C23B4473D2BB64D7847789F6A429E4DA868DA4253D103D0D + 8FD0F2301795F11E28F2D3C63D9F6B7810698BC6BBA9E8AC2946D52D6BF8ACDC + 479E8D9F4F4C272E207DE31710A7CF82494DB817BAEB1FA0A9288562AEA034D2 + 1ADD4D95E86AAA40559A1FF23D9451931D81F68A426438D9E0E9B41AB278E263 + FA3D7D4C0C4FE791C79577D05A9A8542CF4BC87554E0FBF7CF0689DDE7795E41 + 8EAB321A0A13D1702701757BEC88C9C450D23F3E947E3BDD693B8BF128D21E39 + 8EF2C8B29745576325AA3282515B104BF1DDA8A6D7244B71DC0D36424B593E22 + B564F1D1E49D549F3B49F14D0B74503DE5B95F42A69D0C52AD25904CCB5664DE + 426F670BBA5BEA501C4DD721A6A248B691415BC55DC4188A6211DB2FDAD4490A + FD8CD151558C3C3725245B8923C9420C49E667F0B4BB039D0DE54830A3DF0883 + D3944E218EDEB75616224E4F081B2996F5FFDD4025B49617A038C48CDAAA0412 + CDCE20DE4404B186C29C22AF9F44B8CE4984E99C4086C735349466E286CC36E8 + 4C9A4A04264C25DE3BD791AACC7034DC4D46AA95CC30AEA7BD09DD6D0D08D53E + C62944FB242AB223695BDCE1BC62379935E100311E77802CFFF0088951134543 + 513A2AB3A80F622A8E08DD13C80930E5C4B037358FE37E9C17AAF2E2E0786607 + 3E9C3A8F184EFC99EAFF67623C711EA99FBB8A845F3980DAC22454E7C722DD5D + 0361FA22B8A5731AC94EAA28CB8C40656E0CFCC5D7C16A96213584308A0FA7BE + 6E3F5930917E0AC6831C9FF33189905E8F7B912EA8BF7F1B4D65799CEA8AD250 + 10620BBBE35B51F1E5ADE171B3686217C577517C37D93FAE927C30B98A9C9892 + 4D84969A117BA17D70125D0B17E1D5303E2400A5F986E4FBF736537BD94EED45 + 80DA8F0019EAFF69937751FC2E8ADF4D368FAF21DFB2B8BC56170918D740B68E + AF2779D4C6B78F6F2039131A491CD948DEFBD7FB2C4C4058FF4F9BD8C02960D3 + 724EECFC4F997C20B775574A3F6E5E4EAA362D1FFDCD18F1FC2A616ED8A7447B + F227C470F2A7448712F0D7A14D7636819DDFD07E44CBBEF633114E92A5739134 + 4EC44A4188CE2947C2447128E43404034E60BBBD20962AAEC2171B6791D7A6BE + FEC2FA4EC54BC3BD84FA19F7FDE152EC4BE7176F38DCF3846DA11B4C73EDA096 + AC0B89E073F8496C21DE9939E50FF813319270BBEF47713E702AF282FD5D0F8E + B5A2BE078B4BEB6699F1F3237261CAF8FEE44F7039309D6456D691D8AE7A7EBE + E2588418DF1B3B10740AFBFC84B0DBEB08D859FC6D4EFB201A284DE77B43E8D1 + 39E07A86318EB89DC2474B3E19738C76D6DE3958726535AE246A412549035241 + F2F8FAD06C0CE931BE359684888890735975844CFA6AE05CD76442EA732F1011 + E11012DB1A4FBED8B719A7BCC57139E91A1463AE60B5FA5A3C663F47F12F26E3 + A72C1958CB8C1F47A4141793C78FA2077E0FDD04325FC2998ED577C8175BBFC4 + 714F1128B3F3BD5117B1E4D21A0CE5319772D7D76F120D1F3188FB9F451FC5EA + 27549389D3770CAC45777D89F57A5B201FA90CE96805EA7F9CC1A70233E1B0E6 + 1D62F8B08A087CBC90A824A8412490AE9F7DC5B1C6740B561A6CC0329D3558AC + B1127BEC0EE25C841214E32F432156059B8D766096900499FCCA14B26AE63B44 + CCE6388403A4A073DB18DAB70D712D4D0F6A293A504DD6C4A544752AF3154846 + 9EC3F9988B38E07804D3B77E81AFA6BD4A0A8D05C89EA03AF2F5AE5F7082CAAE + 41711AA9D77135458BEBE9226DAB62BC2A64C22FE098E7696C32DA8E8FB7FF82 + F99FBD460A1E5990C9B35586FB68D7B1D938E87A02FB9D8E62A1DA0ACCBFB404 + 3F292DC05CF9799825FA1DFEBD7D06DE9D3B952CFE6022A9ADB6235BCFF993B7 + 3FFD99C7EB86D217BBBFC1F7E23FFFE18C8E7B6522216FAE1A759E67C39471E4 + 5E952B313BA54F5C6B1E9071EFAE273BE83B9508559EBF8DD9D7F3A851671619 + C5F483E7B3795C72C97BE402B57D46BD7B1B3931FBEF1FB4FF38161BD9D748E6 + 501A99568E7866F6DF539E4FDAD37CD01CE780C6183B344659A33EC21CB5A126 + A8093144D54D5D54F86BA1CC471D0F6EA8A2D44D05D1EAC731D496929BA60367 + DDFE06E5D9CA0CEBA929D69EBF63F66A59E0C4EDDD30DB92DA9A095D2FE8D3FE + D4E6E34089F6251B03ACEC1D9BB3C3F8C6681BFE6EAC89F3A773E490FCF51196 + FC5D7DA2FB988895CD363935CCBF36D47418CF525DD28D51FCEA527D463DF7B4 + 3722C3E0D830BE3AD880CFD5F5295E947CD040CBD7A7FAA23EDD8F5200C7F36B + 1AA5CC107E06314DE7C0B0FC9581BA14DF8E065A9EA5065AF6CFF8B7579720E5 + DA5E309B7F14A94DCAFD34F1F4711B1A326EA2213368346587723C27C69FFA52 + 6D154548BAB607335EA1EB2FFDDDE491D7553CE96CE565596ACC8D1CC5AF2127 + 027DDD1DC3CF0C9FA6776C58FE07D4E762F8C6DC088E1D4579D168C80A19450C + 9FA273187EB9FE64D67A7952ECAA44F12D68CC8F19E04F7DAD51FCA92E47268E + D73D86A1B37BF79CE4D1DBD13C703EB3B9068F1B2AD04975DC5E55C2CBBE8892 + B40F0FCB7FEBE27E14D0F19C672E8A6CE393C8D03F8A749D4348D5DC8744F55D + 2FA42BBBE6FE61921DF9AD58F60621772AECE837EAD270FEA5D993E97C759FF3 + 5C4CA751F60D1B5AFF0B75A570FABB497AF302521AF037F7FFAD94C070FFC9FE + 7FDCFFF2FE3F2BF3B7F6FF634579BC96C5F747E2C77AFEF765FCC77AFE97F167 + E724BDBCBC46E3C778FEF7A5FCC778FE17F64BF81E00FB7DC8483C3BFFDBC7CF + 34F70C9E6B7EFCC2FDFF97F11F3A033C70AE99D6D1D7FDC2FD7FE87F07333333 + FE1B8791F8DFCE013FE5C4CE468F65FFFFAFFA7F68FFDFFCD4C67FB4FFCF70FF + 0DFBFF6CFDDFB6B76298D8FC1FB63082189A7F452CE39612C39291BEFF344E9F + 1C99317C2F78FA977F7CFEFFED2993FFB9FD1B4961A56FC07F64FF1F1370FBEF + EEEEFEDBC4EC9FC54798FD777575517A8CC78C1E3FE6F76CBFEE65F4F871D728 + FB676786F3D5F60F534747272FF7B2C4CE288FB4FFF6F636B4B7B5A38D9D736E + 1B38EBFC677896CFEC7FD1A0FDB7B6B4F073BBFC4AA9A5B5859FC36DA1EFF875 + 905A87EF5BF9D8AE0B28E3F6CFFE2E405353E320D1FBC6A63FB4D9C0C71A47CC + 65F9DFFFD9A42D0419C59DBCFF98FDB3FDCB91ED67CF23E5F74C0D7AE1DFFFF9 + 78A911FBFB3F7C4FB78E52ED081A89DF7CFDC40BFFFECFC7920BD8DFFF414D75 + 35DFABAEAEAE19BC560FBF63D7BFF8FB3F7F69FF332496BCF4EFFF684D185887 + F706049016AA4F81C6AF08D3CBA58920D30777F6E7A8CE7DE1DFFF99B5F453FC + 1818405A298E8D45867B3E1ED427C770FC6ED5E03DFB7B3FECEFFE3099A7D3EB + 0ADDB368A3B8E78F9BD16AB21AEDB6BBD16EB30BED169BF1F441D2C0F9AFE7CF + D19BE78F36ABAD0379B40C2BCB30435F84670DF7D1ACFA191AA527A349F923B4 + 5CFD027DD50503DF5E86CF74478BFA373C8F9561651966C46FBCF1BCA39EE775 + 45E9BC74CCB23C568695C5880003FFE5487D319A64283EF4EACBF1348F956165 + FF1BF18D0C1FA9F5723CCDFB2B7CA3EC2B68927F0B4DE7DE1C4DF41DCFFB0BF9 + DB0C96A0D3F72C3A6E888E22F68EE5FD65FBC3355E2E3FCDFB6FD6FF7F827FDE + 5ECBF3BAA3B45F8A6779ACCCF38EBA51F80E976368D5994FC7F624345D9A8156 + BD45DC3E86ED27DB8BBE5BC8F3589956ED9FD1754B7518DFE92586766B016A9F + 3B07C87C239E94C4FD66BF393E68A3363D9C6FBD038F6F2AFE8FF91EDD74DDF4 + DB6FAF7AA932987FD935703FFCBB2E3E6B312D30650F3E3F1FD603BBEF794AE7 + A5076E682FB64463EC26B4DDD54363A220DA8A8CD19C7A0C2DD94A684E1741DB + 3D23BABECA432F77E39E60A80FDA8ACCD05EEA82CE9A785AC6109DD5D168BD6B + 80CECA48FA6C4A9FE3689DFA78DC7807ADB997F0B82EF537FE1D99A8712768CD + BF84BAE09968C93C4BEFAFA2318EEAADD419F511F3D0FED005754133D07C5B04 + 0DD12BD070EB2B2A76EF203E15AD398AE8AC0A4553C27A2A8B295AB2CE52FC16 + DA26673484FD80F6125B34A51C404BAE023ACA02687905EA5C37707C6FE656B4 + E4C8A2B3E216BD5EA6F5C4A0ADD886D66341D7912954966BE8A80CA37538A1B5 + E01A6D53189A627F45DFFD8171D015FE261A133650B92551ED3A1EAD77B4A8CC + BFA0EED6375C7F359E9368BD8A688CDF801AEF49540F3AA8F57B033D69EB39FE + 79AD27D74F674D226DAF3DD5512E3A2A6EA2A3DC9FDEE7D3770EE8AC4BA3F9B1 + E82875A2FACF4167B92F9E37DCE2F8EEE88FD094B88DF2388F6ACFB7A88C5A68 + 8C5E89FAD09F687F9AA1D6EB5DAA73653425EF45ADCF3BB43FF4511F341D3DB7 + 07CEC0F6A62EA37A1546C7232FDAD722947730D7616BA11EEF4FD6F71DE541B4 + 2E0B3A06CE70B91A2317E0C95DD901FDB727A1AD5097EA2D9CB7B1ADD80AAD79 + 2A684ADA47FBCD93F6D752DA06278A3D4EFB458A8F8DB63B742EEEAD18C4A7A0 + DA6DB0FF033F42739A10E5298F86F08568BF6F83BA9B9FD0AB05EAFC3FE06D68 + 8CDF88FAE07FD3FEEF1A1E7FAD7957A9CC9654DE045AD6965E691FB2F1571535 + 30EEA8FEDAE9186563B7254B86BE0F1B31FEA9287DA0BA7540071D2703E39F7E + 2F1204A8AEF428CF3D5C7F2D6927D171DF125D0D5978D2C7504FD1D3D5F69B9D + 3D6BE56D426F351D5B8D543EBAD67A4EEDAE9F5E7BAB6871FAEDE92D63ABBA41 + FA63AAADAA869FAB0774642EC0E0B23ACCB5F5715DE52A82BDFD78DECBD2D327 + 4F38AE203B07A971099CFCF4CD111716898CA4544EACCE5B3EFEBCECEFB1B686 + A688F4F547B0932B2C2E5FC3E14FBEC3A1E9B3B16FFAB73839EB17FE2ED8D699 + D7C7CA8EACC3D3CE093EE6D6F0727085F47A018E7D1109CF5EC4EB57DD7D0461 + FE3739B6A6A21217A5E478BDECFDCBB043C4646172B2B6307DB07632ACB9FC45 + 2E2F2BA3B871372E4B9FE7FC58DDB227CF701ACA677ACDCFCCE63A65FA75BB6E + C8CBB23A87641B6A0F9357EB98282FCB74C1F0AC8D8C272BBF8FD6C99E5919F6 + 8E615959866575E46665F27E6134C49FC95A907A1B26D77420F6F3AFC37D3DD4 + EFAC9EA136B1774CBFA17E81B87E4292BF63FC64976FE275B1F6B3BE65F233F9 + 0E521E8C869E87DE8DCC63388661753359591B87EAFB2B626D3010931D1E57AC + FF9CCCAC90E81D30AC9F3F23A6DFA4A858482F5A87FA9A5A3E06980C6C7C317D + B1B60DE9E945E387F53D2BC7743272FC5AE9197319EC8D2D787FB27132D47E56 + 1FAB3F25268E638D35B45F6803AC4E8665C4CAB236B27E62ED63F76C5C319DFD + 1EFB7BFBF57172E3E38AF525EB63796109F83ABB735DFD3E3DE9AC7EB5ADEACE + 9CB6EAC22F287DDB59573CA3AD22E787C74D8FDE6EAF2BFEA2AD2CE3E7A74FDA + 273FC793F10935193FEF0C535E90DCD23DB7B9387E694773D9EBCF9FB64D78D2 + D530E56957C35B94DE7DDADDF4E693C77553FB7A5B26D1FBB79E74D6BCF7FC79 + D778FAE121755D35EFED8C5179BFFE49CFD4DEB68A0F9FF6B64C6CB813352BD3 + 5DCDF5B6A7A6FE6D2F1DAB7C5F5DFD4C870B9E0561F6BB72024DAE65DA490755 + 56947ED9D6D7F7E6AFFE922E3B1DD40C36C6D4FA276B6CCDBA93E4FB594361F4 + 8C2CCF6BE6595E5A17B3BCB5750B6F9A5CC87254B0BB17E3B6222FC85C29CB4E + D2A3A1B66CFAE3FEBED756F84938ED745672DC90DCEC98A2BE2589E267546705 + EF4EB53B571FE7A45918EB61702FD954FC69A29DCA9D38BBCB69C92EAA1909B6 + 173A22D3B3B6279775AEDA754BC36DA37ED48AD53AB79FC468EF7F5494E2F77E + 41A8956ABABB7A59EE4D2BB76C6FED82180BF9E63817ED8C7407A5A6042B99D6 + 042BB97AF7CCDAF5321E05F55752EE0AADB2BD73FC8B1519D1815E9A02C9A93E + DFDF4FF054C87056A9C90B75B4A0EDCD8C3593EE8875D18ABEED78B133D1E65C + 438CD1990EAF8CB2D5145F7E353A476AA165C59ECF96661584589D132ECEF09F + 961D6C239514EC667327DAD328D94D232CF5A6934DB2AF655ABAAFB94DA2BB76 + 425EBCBF875E5AD76515BF823AA707F5DFCA86C48BCE5A7EF3A84BA4C77B8A66 + 1A1B53DDD4AF2507D844E70498DD4C7350288873D54D49F4342A4B75514B8CB7 + 395F9D1D6C9D6891D973E2BC57C163BD92BA85277DC31566AF8E51744F0F98A6 + E3672558969FF24B42429C446949916874C44DA3A2A2C283B76383DCB2326E1F + 4B4D4DD4287C58AEA6195556E51C79BBB0A8E4E126AF8C7CD96DFBAD77B8395A + 6F1693143B5271BFF0BBF884844D65658FD64686FA2B949696CCA3DA31CCCECC + 5A9C9A962C5A54592FAC18D5F0C02A2227A3B4ACE6DFAE99F776FEB8C2E82B3B + 73A3CFF6EC175C509EE4BC3E2431A53228E57667C04BC82B3AA9332036E98579 + 400FF1C8AF11550DCE72BB189061A71E9E67A7E89B62ADE49FEE44C9E2BC778A + C3D5D03C07A5C074C74B4119EC9D957A58AEBD6A488E2DBDFA33BC7E56B38A74 + 4C5594545465986C5C4D98646445A854646504A55B1211E5E132B135E1342FFC + 6C74157B172A1B5B1D2E1D531D46AF710CFFE041D10F3E3E37C49D9D9DF6FB07 + 781F7274B43B68656D25E6E2E2BCDDD6CEF6444060C0114717FB331E1E2EA2F4 + 7957A0BFD7013F7F7F413F5F0F29862F7D706F919B9B938CADAD8D908FAFC771 + 4B739343E6E6E612D6D6D6BB8D4D8C85BDBC6F9CB2B2B33CE3E4642761616121 + E8EBE376DCC3D3FDA88FB7ABEAFF0301519580 } end object tmrESC: TTimer diff --git a/src/fNewQSO.pas b/src/fNewQSO.pas index b87e335..ce18a4d 100644 --- a/src/fNewQSO.pas +++ b/src/fNewQSO.pas @@ -82,10 +82,12 @@ type acReminder: TAction; acContest: TAction; acRemoteModeADIF: TAction; + acCounty: TAction; acUploadToAll: TAction; acUploadToHrdLog: TAction; acUploadToClubLog: TAction; acUploadToHamQTH: TAction; + acUploadToUDPLog: TAction; acTune : TAction; btnClearSatellite : TButton; cbOffline: TCheckBox; @@ -133,6 +135,8 @@ type MenuItem40: TMenuItem; MenuItem41: TMenuItem; MenuItem43: TMenuItem; + MenuItem45: TMenuItem; + MenuItem46: TMenuItem; MenuItem51: TMenuItem; MenuItem52: TMenuItem; MenuItem53: TMenuItem; @@ -140,6 +144,7 @@ type MenuItem57: TMenuItem; MenuItem58: TMenuItem; MenuItem63: TMenuItem; + MenuItem84: TMenuItem; MenuItem94 : TMenuItem; mnueQSLView: TMenuItem; mnuRemoteModeADIF: TMenuItem; @@ -357,6 +362,7 @@ type sbtnQSL: TSpeedButton; sgrdStatistic : TStringGrid; btnSunRise: TSpeedButton; + sgrdCallStatistic: TStringGrid; SpeedButton2: TSpeedButton; SpeedButton3: TSpeedButton; btnSunSet: TSpeedButton; @@ -364,6 +370,7 @@ type tabDXCCStat : TTabSheet; tabSatellite : TTabSheet; tabLOConfig: TTabSheet; + tabCallStat: TTabSheet; tmrADIF: TTimer; tmrWsjtSpd: TTimer; tmrWsjtx: TTimer; @@ -377,6 +384,7 @@ type procedure acBigSquareExecute(Sender: TObject); procedure acCommentToCallsignExecute(Sender : TObject); procedure acContestExecute(Sender: TObject); + procedure acCountyExecute(Sender: TObject); procedure acCWFKeyExecute(Sender: TObject); procedure acHotkeysExecute(Sender: TObject); procedure acLocatorMapExecute(Sender: TObject); @@ -401,6 +409,7 @@ type procedure acUploadToClubLogExecute(Sender: TObject); procedure acUploadToHamQTHExecute(Sender: TObject); procedure acUploadToHrdLogExecute(Sender: TObject); + procedure acUploadToUDPLogExecute(Sender: TObject); procedure acPropExecute(Sender: TObject); procedure btnClearSatelliteClick(Sender : TObject); procedure cbRxLoChange(Sender: TObject); @@ -418,8 +427,10 @@ type procedure dbgrdQSOBeforeColumnSized(Sender: TObject); procedure edtAwardEnter(Sender: TObject); procedure edtCallChange(Sender: TObject); + procedure edtDateChange(Sender: TObject); procedure edtDateEnter(Sender: TObject); procedure edtDXCCRefEnter(Sender: TObject); + procedure edtEndTimeChange(Sender: TObject); procedure edtEndTimeEnter(Sender: TObject); procedure edtGridChange(Sender: TObject); procedure edtGridEnter(Sender: TObject); @@ -437,6 +448,7 @@ type procedure edtRXFreqChange(Sender: TObject); procedure edtRXFreqExit(Sender: TObject); procedure edtRXLOExit(Sender: TObject); + procedure edtStartTimeChange(Sender: TObject); procedure edtStartTimeEnter(Sender: TObject); procedure edtStateEnter(Sender: TObject); procedure edtTXLOExit(Sender: TObject); @@ -451,6 +463,10 @@ type procedure MenuItem11Click(Sender: TObject); procedure MenuItem12Click(Sender: TObject); procedure MenuItem17Click(Sender: TObject); + procedure MenuItem46Click(Sender: TObject); + procedure MenuItem95Click(Sender: TObject); + procedure MenuItem96Click(Sender: TObject); + procedure MenuItem45Click(Sender: TObject); procedure mnuQrzClick(Sender: TObject); procedure mnuIK3QARClick(Sender: TObject); procedure mnuHamQthClick(Sender : TObject); @@ -565,6 +581,7 @@ type procedure mnuIOTAClick(Sender: TObject); procedure mnuQSOBeforeClick(Sender: TObject); procedure mnuQSOListClick(Sender: TObject); + procedure pgDetailsChange(Sender: TObject); procedure popEditQSOPopup(Sender: TObject); procedure sbtnAttachClick(Sender: TObject); procedure sbtnLocatorMapClick(Sender: TObject); @@ -619,11 +636,9 @@ type WhatUpNext : TWhereToUpload; UploadAll : Boolean; WsjtxDecodeRunning : boolean; - + DiffCalls : byte; RememberAutoMode : Boolean; IsJS8Callrmt : Boolean; //way to isolate adif from JS8's JSON - - Op : String; QSLcfm, eQSLcfm, LoTWcfm : String; @@ -632,7 +647,6 @@ type procedure ShowDXCCInfo(ref_adif : Word = 0); procedure ShowFields; procedure ChangeReports; - procedure ShowStatistic(ref_adif : Word); procedure CalculateDistanceEtc; procedure SetDateTime(EndTime : Boolean = True); procedure CheckCallsignClub; @@ -647,9 +661,6 @@ type procedure CheckQSLImage; procedure ShowCountryInfo; procedure InsertNameQTH; - procedure UpdateFKeyLabels; - procedure ClearStatGrid; - procedure AddBandsToStatGrid; procedure LoadSettings; procedure SaveSettings; procedure ChangeCallBookCaption; @@ -674,7 +685,7 @@ type function CheckFreq(freq : String) : String; procedure WaitWeb(secs:integer); - procedure ShowOperator; + function RigCmd2DataMode(mode:String):String; procedure StartUpRemote; procedure NewLogSplash; @@ -688,19 +699,21 @@ type ShowWin : Boolean; LastFkey : Word; old_t_band : String; - RemoteName : String; + RemoteName : String; //with wsjt has name from UDP datagram + RemoteActive: String; //Actve remote name, empty if no remote running. + CallFromSpot: Boolean; //Used with wsjtx UDP#15 + Op : String; WsjtxSock : TUDPBlockSocket; //receive socket WsjtxSockS : TUDPBlockSocket; //multicast send socket ADIFSock : TUDPBlockSocket; - WsjtxMode : String; //Moved from private + WsjtxMode : String; //Moved from private WsjtxBand : String; - wHiSpeed : integer; // when packets received :udp polling speeds (tmrWsjtx) - wLoSpeed : integer; // when running idle - old_call : String; //Moved from private - was_call : String; //holds recent edtCallsign.text before it was cleared - + wHiSpeed : integer; // when packets received :udp polling speeds (tmrWsjtx) + wLoSpeed : integer; // when running idle + old_call : String; //Moved from private + was_call : String; //holds recent edtCallsign.text before it was cleared FldigiXmlRpc : Boolean; AnyRemoteOn : Boolean; //true if any of remotes fldigi,wsjt,or ADIF is active); @@ -716,10 +729,11 @@ type property EditQSO : Boolean read fEditQSO write fEditQSO default False; property ViewQSO : Boolean read fViewQSO write fViewQSO default False; + procedure ShowOperator; procedure DisableRemoteMode; //Moved from private procedure SaveRemote; - procedure GetCallInfo(callTOinfo,mode,rsts:string); + procedure GetCallInfo(callTOinfo,mode,rsts:string); //used with wsjtx remote procedure OnBandMapClick(Sender:TObject;Call,Mode : String;Freq:Currency); procedure AppIdle(Sender: TObject; var Handled: Boolean); @@ -741,6 +755,7 @@ type procedure UploadAllQSOOnline; procedure ReturnToNewQSO; procedure InitializeCW; + procedure UpdateFKeyLabels; procedure RunVK(key_pressed: String); procedure RunST(script: String); end; @@ -813,7 +828,7 @@ uses dUtils, fChangeLocator, fChangeOperator, dDXCC, dDXCluster, dData, fMain, f fLongNote, fRefCall, fKeyTexts, fCWType, fExportProgress, fPropagation, fCallAttachment, fQSLViewer, fCWKeys, uMyIni, fDBConnect, fAbout, uVersion, fChangelog, fBigSquareStat, fSCP, fRotControl, fLogUploadStatus, fRbnMonitor, fException, fCommentToCall, - fRemind, fContest, fXfldigi, dMembership, dSatellite; + fRemind, fContest, fXfldigi, dMembership, dSatellite, fCountyStat; @@ -856,6 +871,8 @@ begin end end; + + procedure TDOKTabThread.Execute; var data : string; @@ -880,6 +897,7 @@ begin if edtCall.Text <> callTOinfo then //call (and web info) maybe there already ok from pevious status packet begin edtCall.Text := '';//clean grid like double ESC does + Sleep(200); //to be sure edtCallChange has time to run; old_ccall := ''; old_cfreq := ''; old_cmode := ''; @@ -905,6 +923,7 @@ begin rsts:= '+'+rsts end; edtHisRST.Text := rsts; + SendToBack; end; procedure TfrmNewQSO.WaitWeb(secs:integer); @@ -1007,38 +1026,6 @@ begin end end; -procedure TfrmNewQSO.ClearStatGrid; -var - i,y : Integer; -begin - for i:= 0 to sgrdStatistic.ColCount-1 do - for y := 0 to sgrdStatistic.RowCount-1 do - sgrdStatistic.Cells[i,y] := ' '; - with sgrdStatistic do - begin - Cells[0, 1] := 'SSB'; - Cells[0, 2] := 'CW'; - Cells[0, 3] := 'DIGI' - end -end; - -procedure TfrmNewQSO.AddBandsToStatGrid; -var - i : Integer; -begin - sgrdStatistic.ColCount := cMaxBandsCount; - - for i:=0 to cMaxBandsCount-1 do - begin - if dmUtils.MyBands[i][0]='' then - begin - sgrdStatistic.ColCount := i+1; - break - end; - sgrdStatistic.Cells[i+1,0] := dmUtils.MyBands[i][1]; - end; -end; - procedure TfrmNewQSO.SetDateTime(EndTime : Boolean = True); var date : TDateTime; @@ -1244,12 +1231,13 @@ procedure TfrmNewQSO.ClearGrayLineMapLine; var lat,long :currency; Begin - frmGrayLine.ob^.GC_line_clear; + frmGrayLine.ob^.GC_line_clear; //clear short and long path lines dmUtils.CoordinateFromLocator(dmUtils.CompleteLoc(CurrentMyLoc),lat,long); lat := lat*-1; frmGrayLine.ob^.jachcucaru(true,long,lat,long+0.03,lat+0.03); //trying to make own qth dot a bit bigger //the Grayline window zoom affects to visibility anyhow frmGrayline.Refresh; + frmRotControl.BeamDir:=-1; end; procedure TfrmNewQSO.ClearAll; @@ -1277,6 +1265,7 @@ begin end; edtDate.ReadOnly := False; mComment.ReadOnly := False; + edtDXCCRef.ReadOnly:=True; //we allow only DXCCs from list, no free type end; sbtnQRZ.Visible := False; sbtnLoTW.Visible := False; @@ -1431,8 +1420,12 @@ begin dmData.qQSOBefore.EnableControls; end; ChangeCallBookCaption; - ClearStatGrid; - AddBandsToStatGrid; + dmUtils.ClearStatGrid(sgrdStatistic); + dmUtils.AddBandsToStatGrid(sgrdStatistic); + dmUtils.ClearStatGrid(sgrdCallStatistic); + dmUtils.AddBandsToStatGrid(sgrdCallStatistic); + tabDXCCStat.Caption:='DXCC statistic'; + tabCallStat.Caption:='Call statistic'; ClearGrayLineMapLine; if not AnyRemoteOn then @@ -1474,7 +1467,13 @@ begin if cqrini.ReadBool('CW', 'NoReset', false) then //is set: user does not want reset CW keyer at rig switch/init InitializeCW; //so we have to do it at least once: Here. - Op := ''; + + Op := cqrini.ReadString('NewQSO', 'Op', ''); + if OP<>'' then + begin + cqrini.WriteString('TMPQSO','OP',Op); + ShowOperator; + end; if dbgrdQSOBefore.Visible then mnuQSOBefore.Caption := 'Disable QSO before grid' @@ -1497,15 +1496,7 @@ begin end; if frmTRXControl.Showing then - begin - if frmTRXControl.rbRadio1.Checked then - tmrRadio.Interval := cqrini.ReadInteger('TRX1','Poll',500) - else - tmrRadio.Interval := cqrini.ReadInteger('TRX2','Poll',500) - end - else begin - tmrRadio.Interval := cqrini.ReadInteger('TRX1','Poll',500) - end; + tmrRadio.Interval := cqrini.ReadInteger('TRX'+IntToStr(frmTRXControl.cmbRig.ItemIndex),'Poll',500); cbTxLo.Checked := cqrini.ReadBool('NewQSO', 'UseTXLO', False); edtTXLO.Text := cqrini.ReadString('NewQSO', 'TXLO', ''); @@ -1579,10 +1570,13 @@ begin frmDXCluster.BringToFront end; - pgDetails.Pages[1].TabVisible := cqrini.ReadBool('NewQSO','SatelliteMode', False); - pgDetails.Pages[2].TabVisible := cqrini.ReadBool('NewQSO','SatelliteMode', False); - if cqrini.ReadBool('NewQSO','SatelliteMode',False) then - frmNewQSO.pgDetails.TabIndex := 1; + if not cqrini.ReadBool('NewQSO','SatelliteMode', False) then + if (cqrini.ReadInteger('NewQSO','DetailsTabIndex', 0)>1 ) then + cqrini.WriteInteger('NewQSO','DetailsTabIndex',1); + + frmNewQSO.pgDetails.TabIndex:= cqrini.ReadInteger('NewQSO','DetailsTabIndex', 0); + frmNewQSO.pgDetails.Pages[2].TabVisible := cqrini.ReadBool('NewQSO','SatelliteMode', False); + frmNewQSO.pgDetails.Pages[3].TabVisible := cqrini.ReadBool('NewQSO','SatelliteMode', False); //this have to be done here when log is selected (settings at database) frmReminder.chRemi.Checked := cqrini.ReadBool('Reminder','chRemi',False); @@ -1775,6 +1769,7 @@ begin cqrini.DeleteKey('TMPQSO','PWR'); cqrini.DeleteKey('TMPQSO','OP'); cqrini.WriteBool('NewQSO','AutoMode',chkAutoMode.Checked); + cqrini.WriteInteger('NewQSO','DetailsTabIndex', pgDetails.TabIndex); SavePosition; cqrini.WriteBool('NewQSO','ShowGrd',dbgrdQSOBefore.Visible); if cqrini.ReadBool('xplanet','close',False) then @@ -1843,13 +1838,16 @@ begin EscFirstPressDone := False; ChangeDXCC := False; + RemoteActive:=''; + CurrentMyLoc := cqrini.ReadString('Station','LOC',''); ClearAll; - AddBandsToStatGrid; + dmUtils.AddBandsToStatGrid(sgrdStatistic); + dmUtils.AddBandsToStatGrid(sgrdCallStatistic); edtCall.SetFocus; tmrRadio.Enabled := True; tmrStart.Enabled := True; - + if cqrini.ReadBool('Modes', 'Rig2Data', False) then chkAutoMode.Font.Color:=clRed; dmUtils.UpdateHelpBrowser; dmSatellite.SetListOfSatellites(cmbSatellite); //load combo box lists dmSatellite.SetListOfPropModes(cmbPropagation); @@ -1859,6 +1857,8 @@ begin if cqrini.ReadString('Station','Call','') = '' then NewLogSplash; + + dmUtils.UpdateCallBookcnf; //renames old user and pass of ini file end; procedure TfrmNewQSO.tmrEndStartTimer(Sender: TObject); @@ -2162,7 +2162,7 @@ begin edtCall.Text := uppercase(data); c_lock :=false; edtCallExit(nil); //does info fetch - WaitWeb(5); //wait for web response 5sec timeout + WaitWeb(2); //wait for web response 5sec timeout end; 'GRIDSQUARE' :Begin data := uppercase(data); @@ -2255,7 +2255,7 @@ begin if (frmTRXControl.GetModeFreqNewQSO(mode,freq)) then begin if( mode <> '') and chkAutoMode.Checked then - cmbMode.Text := mode; + cmbMode.Text := RigCmd2DataMode(mode); if (freq <> empty_freq) then begin cmbFreq.Text := freq; @@ -2331,6 +2331,15 @@ begin if cqrini.ReadBool('OnlineLog','HrUpOnline',False) then frmLogUploadStatus.UploadDataToHrdLog end; + WhatUpNext := upUDPLog + end; + upUDPLog : begin + if UploadAll then + frmLogUploadStatus.UploadDataToUDPLog(UploadAll) + else begin + if cqrini.ReadBool('OnlineLog','UdUpOnline',False) then + frmLogUploadStatus.UploadDataToUDPLog + end; tmrUploadAll.Enabled := False; UploadAll := False; WhatUpNext := upHamQTH @@ -2431,6 +2440,7 @@ var Dtim : TDateTime; Dfreq : Integer; new : Boolean; + newstart : Boolean; TXEna : Boolean; TXOn : Boolean; i : word; @@ -2626,6 +2636,7 @@ begin 1 : begin //Status new := false; + newstart := false; ParStr := StrBuf(index); if dmData.DebugLevel>=1 then Writeln('Status Id:', ParStr); //---------------------------------------------------- @@ -2648,17 +2659,19 @@ begin end; ParStr := dmUtils.GetBandFromFreq(mhz); - if ParStr<>WsjtxBand then + if (ParStr<>WsjtxBand) then begin new := true; + newstart:= WsjtxBand=''; //clean start do not use for wsjtx cleaning WsjtxBand := ParStr end; if dmData.DebugLevel>=1 then Writeln('Band :', WsjtxBand); //---------------------------------------------------- ParStr := StrBuf(index); - if ParStr<>WsjtxMode then + if (ParStr<>WsjtxMode) then begin new :=true; + newstart:= Wsjtxmode=''; //clean start do not use for wsjtx cleaning WsjtxMode := ParStr; end; if dmData.DebugLevel>=1 then Writeln('Mode:', WsjtxMode); @@ -2706,8 +2719,6 @@ begin ContestNr := ui8Buf(index); if dmData.DebugLevel>=1 then Writeln('Contest nr: ', ContestNr); - - //---------------------------------------------------- if TXEna and TXOn then begin @@ -2719,22 +2730,49 @@ begin else frmMonWsjtx.DblClickCall :=''; if dmData.DebugLevel>=1 then Writeln('Change 2click call to:',frmMonWsjtx.DblClickCall); end; - - GetCallInfo(call,WsjtxMode,rstS); //call web info - - //these can be altered always - if dmUtils.GetBandFromFreq(mhz) <> '' then //then add new values from status msg + end; + //these can be altered always + if dmUtils.GetBandFromFreq(mhz) <> '' then //then add new values from status msg + begin cmbFreq.Text := mhz; cmbMode.Text := TXmode; + end; + + //callsign can be changed during RX or TX if band does not change + if not new then + begin + if (call <> edtCall.Text) then + Begin + if (DiffCalls < 3) then + inc( DiffCalls ) + else + Begin + GetCallInfo(call,WsjtxMode,rstS); + DiffCalls := 0; + end; + end + else //same calls + DiffCalls := 0; + end + else //band changes + begin + new := False; + if (frmNewQSO.RepHead <> '') and (not CallFromSpot) and (not newstart) then + //clean wsjtx's DXCall and DXGrid and do GenStdMsg(to clean it too) + Begin + frmMonWsjtx.SendConfigure('','',' ',' ',$7FFFFFFF,$7FFFFFFF,$7FFFFFFF,False,True); + end; + if not CallFromSpot then + Begin + edtCall.Text := '';//clean grid like double ESC does + Sleep(200); //to be sure edtCallChange has time to run; + old_ccall := ''; + old_cfreq := ''; + old_cmode := ''; + end + else + CallFromSpot:=False; - end; - //---------------------------------------------------- - if new then - begin - edtCall.Text := '';//clean grid like double ESC does - old_ccall := ''; - old_cfreq := ''; - old_cmode := ''; if (frmMonWsjtx <> nil) and frmMonWsjtx.Showing then Begin frmMonWsjtx.NewBandMode(WsjtxBand,WsjtxMode); @@ -2746,7 +2784,7 @@ begin btnClearSatelliteClick(nil); //if band changes sat and prop cleared end; end; - end + end //band changes end; //Status @@ -2900,6 +2938,8 @@ begin if dmData.DebugLevel>=1 then Writeln('Call decoded #5:', call,' edtCall:',edtCall.Text ); if edtCall.Text <> call then //call (and web info) maybe there already ok from status packet Begin + edtCall.Text := ''; + Sleep(200); //to be sure edtCallChange has time to run; edtCall.Text := call; c_lock:=False; edtCallExit(nil); //<--------this will fetch web info @@ -3006,7 +3046,7 @@ begin if dmData.DebugLevel>=1 then Writeln('timespec: ', ParNum); //---------------------------------------------------- if dmData.DebugLevel>=1 then Writeln('Remote name: ', RemoteName); - if RemoteName = 'WSJT-X' then //no contest in JTDX + if Pos('WSJT',RemoteName)>0 then //no contest in JTDX begin if dmData.DebugLevel>=1 then Writeln('Tail logging part entered'); OpCall := UpperCase(trim(StrBuf(index))); //operator callsign (in contest, club etc.) @@ -3069,7 +3109,11 @@ begin 5,6 : edtContestName.Text := ContestName[ContestNr]+'-QSO'; end; case ContestNr of - 1,2,3,4 : edtContestSerialReceived.Text := copy( edtContestSerialReceived.Text,1,6); //Max Db length=6 + 1,2,3,4 : Begin + edtContestSerialReceived.Text := copy( edtContestSerialReceived.Text,1,6); //Max Db length=6 + if (frmContest.Showing and (frmContest.cmbContestName.Text<>'')) then + edtContestName.Text :=frmContest.cmbContestName.Text; + end; end; end; //----------this is not yet in wsjt-x 2.2.2 and JTDX 2.1.0rc151------------------ @@ -3241,10 +3285,17 @@ begin //Writeln('OldPfx:',old_pfx); //Writeln('ChangeDXCC:',ChangeDXCC); + { if (old_call = edtCall.Text) and (old_adif <> adif) then ChangeDXCC := True; //if user chooses another country by direct enter to the edtDXCCref //without clicking to btnDXCCRef + OH1KH 2022.12.30 + + Above does not work as EDITQSO does not properly set adif and old_adif from qso data from database. + Force changes always via btnDXCCRef. + Otherwise EditQSO changes to DXCCref are not saved. (because old_adf & adif values are false set) + } if not TryStrToFloat(edtRXFreq.Text, RxFreq) then RxFreq := 0; @@ -3394,14 +3445,30 @@ begin end; if fEditQSO and (not fromNewQSO) then begin - dmData.RefreshMainDatabase(id) + dmData.RefreshMainDatabase(id); + if cqrini.ReadBool('OnlineLog','IgnoreEdit',False) then + Begin + dmLogUpload.DisableOnlineLogSupport; + dmLogUpload.EnableOnlineLogSupport; + end; end; if not AnyRemoteOn then UnsetEditLabel; dmData.qQSOBefore.Close; was_call := edtCall.Text; - edtCall.Text := ''; //calls ClearAll + edtCall.Text := ''; //calls ClearAll (except when EDITQSO to be sure that callsign changes do not clear all) + Sleep(200); //to be sure edtCallChange has time to run; + + if (cqrini.ReadBool('NewQSO','RefreshAfterSave', True) and frmMain.Showing) then + begin + frmMain.acRefresh.Execute; + if not fEditQso then + frmMain.dbgrdMainKeyUp(nil,key,[ssCtrl]); //shows last logged qso + + end; + if fEditQso then + ClearAll; old_ccall := ''; old_cfreq := ''; old_cmode := ''; @@ -3409,16 +3476,7 @@ begin if cqrini.ReadBool('NewQSO','ClearRIT',False) then frmTRXControl.ClearRIT; - if (cqrini.ReadBool('NewQSO','RefreshAfterSave', True) and frmMain.Showing) then - begin - frmMain.acRefresh.Execute; - if not fEditQso then - frmMain.dbgrdMainKeyUp(nil,key,[ssCtrl]); //shows last logged qso - - end; - - fEditQSO := False; - + fEditQSO := False; //this should be cleared by clearAll. Needed here ??? UploadAllQSOOnline; if frmWorkedGrids.Showing then frmWorkedGrids.UpdateMap; Op := cqrini.ReadString('TMPQSO','OP',''); @@ -3435,7 +3493,10 @@ begin frmMain.dbgrdMain.SetFocus end else - edtCall.SetFocus; + Begin + if cbOffline.Checked then edtDate.SetFocus + else edtCall.SetFocus; + end; end; end; @@ -3518,7 +3579,7 @@ begin old_adif := adif; ShowCountryInfo; ChangeReports; - ShowStatistic(adif) + dmUtils.ShowStatistic(adif,old_stat_adif,sgrdStatistic); end; CalculateDistanceEtc; @@ -3632,7 +3693,14 @@ begin begin edtStartTime.SetFocus; key := 0 - end + end; + if ( ((length(edtDate.Text)=5) or (length(edtDate.Text)=8)) + and ((key = VK_BACK) or (key = VK_DELETE)) + and (not AnyRemoteOn and cbOffline.Checked) ) then //auto del "-" + begin + edtDate.Text:=copy(edtDate.Text,1,length(edtDate.Text)-2); + key := 0 + end; end; @@ -3711,6 +3779,18 @@ begin mComment.SetFocus; key := 0 end; + if ((key = VK_TAB) and cbOffline.Checked and (edtCall.Text='') and (not AnyRemoteOn)) then + Begin + edtCall.SetFocus; + key := 0 + end; + if ((length(edtEndTime.Text)=3) + and ((key = VK_BACK) or (key = VK_DELETE)) + and (not AnyRemoteOn and cbOffline.Checked) ) then //aute del ":" + begin + edtEndTime.Text:=copy(edtEndTime.Text,1,length(edtEndTime.Text)-2); + key := 0 + end; end; @@ -3965,7 +4045,14 @@ begin begin edtEndTime.SetFocus; key := 0 - end + end; + if ((length(edtStartTime.Text)=3) + and ((key = VK_BACK) or (key = VK_DELETE)) + and (not AnyRemoteOn and cbOffline.Checked) ) then //aute del ":" + begin + edtStartTime.Text:=copy(edtStartTime.Text,1,length(edtStartTime.Text)-2); + key := 0 + end; end; procedure TfrmNewQSO.FormClose(Sender: TObject; var CloseAction: TCloseAction); @@ -4138,13 +4225,14 @@ begin waz := q.Fields[8].AsString; itu := q.Fields[7].AsString; + adif:= q.Fields[9].AsInteger; dmUtils.ModifyWAZITU(waz,itu); edtWAZ.Text := waz; edtITU.Text := itu; lblHisTime.Caption := dmUtils.HisDateTime(edtDXCCRef.Text); ShowCountryInfo; - ShowStatistic(q.FieldByName('ADIF').AsInteger); + dmUtils.ShowStatistic(q.FieldByName('ADIF').AsInteger,old_stat_adif,sgrdStatistic); if dmData.GetIOTAForDXCC(edtCall.Text, lblDXCC.Caption, cmbIOTA, dmUtils.MyStrToDate(edtDate.Text)) then lblIOTA.Font.Color := clRed else @@ -4408,7 +4496,20 @@ begin if frmSCP.Showing and (Length(edtCall.Text)>2) then frmSCP.mSCP.Text := dmData.GetSCPCalls(edtCall.Text) else - frmSCP.mSCP.Clear + frmSCP.mSCP.Clear; + lblGrid.Font.Style:=[]; + lblGrid.Font.Color:=clDefault; +end; + +procedure TfrmNewQSO.edtDateChange(Sender: TObject); +begin + if cbOffline.Checked and not AnyRemoteOn then + begin + if (length(edtDate.Text)=4) or (length(edtDate.Text)=7) then //auto "-" + edtDate.Text:=edtDate.Text+'-'; + edtDate.SelStart:=length(edtDate.Text); + edtDate.SelLength:=0; + end; end; procedure TfrmNewQSO.edtDateEnter(Sender: TObject); @@ -4421,6 +4522,17 @@ begin edtDXCCRef.SelectAll end; +procedure TfrmNewQSO.edtEndTimeChange(Sender: TObject); +begin + if cbOffline.Checked and not AnyRemoteOn then + begin + if (length(edtEndTime.Text)=2) then //auto ":" + edtEndTime.Text:=edtEndTime.Text+':'; + edtEndTime.SelStart:=length(edtEndTime.Text); + edtEndTime.SelLength:=0; + end; +end; + procedure TfrmNewQSO.edtEndTimeEnter(Sender: TObject); begin edtEndTime.SelectAll @@ -4432,6 +4544,7 @@ begin // keying has own checking edtGrid.Text := dmUtils.StdFormatLocator(edtGrid.Text); edtGrid.SelStart := Length(edtGrid.Text); + edtGrid.SelLength:=0; end; procedure TfrmNewQSO.edtGridEnter(Sender: TObject); @@ -4445,7 +4558,14 @@ begin begin CalculateDistanceEtc; sbtnLocatorMap.Visible := True; + lblGrid.Font.Style:=[]; + lblGrid.Font.Color:=clDefault; end + else + Begin + lblGrid.Font.Style:=[fsBold]; + lblGrid.Font.Color:=clRed; + end; end; procedure TfrmNewQSO.edtGridKeyDown(Sender: TObject; var Key: Word; @@ -4504,7 +4624,7 @@ end; procedure TfrmNewQSO.acRefreshTRXExecute(Sender: TObject); begin - frmTRXControl.InicializeRig; + frmTRXControl.InitializeRig; tmrRadio.Enabled := True; frmRotControl.InicializeRot; tmrRotor.Enabled := True @@ -4598,6 +4718,11 @@ begin frmLogUploadStatus.UploadDataToHrdLog end; +procedure TfrmNewQSO.acUploadToUDPLogExecute(Sender: TObject); +begin + frmLogUploadStatus.UploadDataToUDPLog +end; + procedure TfrmNewQSO.acPropExecute(Sender: TObject); begin frmPropagation.Show @@ -4683,6 +4808,16 @@ begin frmContest.Show; end; +procedure TfrmNewQSO.acCountyExecute(Sender: TObject); +begin + frmCountyStat := TfrmCountyStat.Create(frmNewQSO); + try + frmCountyStat.ShowModal + finally + FreeAndNil(frmCountyStat) + end +end; + procedure TfrmNewQSO.acOpenLogExecute(Sender: TObject); var old : String; @@ -4762,6 +4897,7 @@ begin tabSatellite.Font.Color := clRed else tabSatellite.Font.Color := clDefault; + old_prop := dmSatellite.GetPropShortName(cmbPropagation.Text); //keep prop mode even when no qsos saved yet end; procedure TfrmNewQSO.cmbQSL_REnter(Sender: TObject); @@ -4894,6 +5030,17 @@ begin cqrini.WriteString('NewQSO', 'RXLO', edtRXLO.Text); end; +procedure TfrmNewQSO.edtStartTimeChange(Sender: TObject); +begin + if cbOffline.Checked and not AnyRemoteOn then + begin + if (length(edtStartTime.Text)=2) then //auto ":" + edtStartTime.Text:=edtStartTime.Text+':'; + edtStartTime.SelStart:=length(edtStartTime.Text); + edtStartTime.SelLength:=0; + end; +end; + procedure TfrmNewQSO.edtStartTimeEnter(Sender: TObject); begin edtStartTime.SelectAll @@ -5010,6 +5157,21 @@ begin ShowHelp end; +procedure TfrmNewQSO.MenuItem46Click(Sender: TObject); +begin + +end; + +procedure TfrmNewQSO.MenuItem45Click(Sender: TObject); +var + S: string; +begin + //message box here for commands + if not assigned(CWint) then exit; + if InputQuery('Send hex commands to Win/K3NG keyer','Type in comma separated hex bytes 00-ff (can be: 0xff, xff or ff)',False,S) then + CWint.SendHex(Uppercase(s)); +end; + procedure TfrmNewQSO.mnuQrzClick(Sender: TObject); begin dmUtils.ShowQRZInBrowser(dmData.qQSOBefore.Fields[4].AsString) @@ -5036,6 +5198,18 @@ begin dmUtils.ShowHamQTHInBrowser(dmData.qQSOBefore.Fields[4].AsString) end; +procedure TfrmNewQSO.MenuItem95Click(Sender: TObject); +begin + chkAutoMode.Font.Color:=clDefault; + cqrini.WriteBool('Modes', 'Rig2Data', False); +end; + +procedure TfrmNewQSO.MenuItem96Click(Sender: TObject); +begin + chkAutoMode.Font.Color:=clRed; + cqrini.WriteBool('Modes', 'Rig2Data', True); +end; + procedure TfrmNewQSO.acNewQSOExecute(Sender: TObject); begin ClearAll; @@ -5360,6 +5534,7 @@ begin dmUtils.LoadFontSettings(frmNewQSO) end; + dmData.qQSOBefore.Last; // to be sure the count is proper in next if if fViewQSO or fEditQSO then lblQSONr.Caption := IntToStr(dmData.qQSOBefore.RecordCount) else @@ -5379,7 +5554,10 @@ begin ShowCountryInfo; ChangeReports; - ShowStatistic(adif); + dmUtils.ShowStatistic(adif,old_stat_adif,sgrdStatistic); + dmUtils.ShowStatistic(adif,old_stat_adif,sgrdCallStatistic,edtCall.Text); + tabDXCCStat.Caption:=edtDXCCRef.Text+' statistic'; + tabCallStat.Caption:=edtCall.Text+' statistic'; CalculateDistanceEtc; mComment.Text := dmData.GetComment(edtCall.Text); if (lblDXCC.Caption <> '!') and (lblDXCC.Caption <> '#') then @@ -5402,7 +5580,7 @@ begin if (not (fViewQSO or fEditQSO or cbOffline.Checked)) and (frmTRXControl.GetModeFreqNewQSO(mode,freq)) then begin if chkAutoMode.Checked then - cmbMode.Text := mode; + cmbMode.Text := RigCmd2DataMode(mode); cmbFreq.Text := freq; edtHisRST.SetFocus; edtHisRST.SelStart := 1; @@ -5475,6 +5653,7 @@ var tmp : String; speed : Integer = 0; i : Integer = 0; + n : String; ShowMain : Boolean = False; begin if key = VK_ESCAPE then @@ -5496,9 +5675,12 @@ begin old_cfreq := ''; old_cmode := ''; end - else begin - - if Assigned(CWint) then CWint.StopSending; + else + begin + if (cmbMode.Text='CW') and (Assigned(CWint)) then + CWint.StopSending; + if ((cmbMode.Text='SSB') or (cmbMode.Text='FM') or (cmbMode.Text='AM')) then + frmTRXControl.StopVoice; EscFirstPressDone := True; tmrESC.Enabled := True end @@ -5516,6 +5698,7 @@ begin end; edtDate.ReadOnly := False; mComment.ReadOnly := False; + edtDXCCRef.ReadOnly:=True; //we allow only DXCCs from list, no free type end; ShowMain := (fEditQSO or fViewQSO) and (not fromNewQSO); ClearAll; @@ -5539,6 +5722,11 @@ begin if LastFkey = 0 then begin if (Sender <> nil ) then LastFKey := Key; //LastKey resets by KeyUp. Nil sender is a mouse click on button + if ( frmContest.Showing and (key = VK_F1)) then //set the "lastCqFreq" @contest window + Begin + frmContest.lblCqMode.Caption:=frmTRXControl.GetRawMode; + frmContest.lblCqFreq.Caption := FormatFloat('0.00',frmTRXControl.GetFreqkHz); + end; if ((cmbMode.Text='SSB') or (cmbMode.Text='FM') or (cmbMode.Text='AM')) then begin RunVK(dmUtils.GetDescKeyFromCode(Key)); @@ -5548,6 +5736,7 @@ begin if Assigned(CWint) and (cmbMode.Text='CW') then CWint.SendText(dmUtils.GetCWMessage(dmUtils.GetDescKeyFromCode(Key),frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'')) else if (cmbMode.Text='CW') then ShowMessage('CW interface: No keyer defined for current radio!'); end; @@ -5567,13 +5756,17 @@ begin end end; + n:=IntToStr(frmTRXControl.cmbRig.ItemIndex); if (key = 33) and (not dbgrdQSOBefore.Focused) then//pgup begin if Assigned(CWint) then begin speed := CWint.GetSpeed+2; CWint.SetSpeed(speed); - sbNewQSO.Panels[4].Text := IntToStr(speed)+'WPM'; + if (cqrini.ReadInteger('CW'+n,'Type',0)=1) and cqrini.ReadBool('CW'+n,'PotSpeed',False) then + sbNewQSO.Panels[4].Text := 'Pot WPM' + else + sbNewQSO.Panels[4].Text := IntToStr(speed) + 'WPM'; if (frmCWType <> nil ) then frmCWType.edtSpeed.Value := speed; end end; @@ -5584,7 +5777,10 @@ begin begin speed := CWint.GetSpeed-2; CWint.SetSpeed(speed); - sbNewQSO.Panels[4].Text := IntToStr(speed)+'WPM'; + if (cqrini.ReadInteger('CW'+n,'Type',0)=1) and cqrini.ReadBool('CW'+n,'PotSpeed',False) then + sbNewQSO.Panels[4].Text := 'Pot WPM' + else + sbNewQSO.Panels[4].Text := IntToStr(speed) + 'WPM'; if (frmCWType <> nil ) then frmCWType.edtSpeed.Value := speed; end end; @@ -5781,7 +5977,7 @@ procedure TfrmNewQSO.edtStateExit(Sender: TObject); begin ShowDXCCInfo(); ShowCountryInfo; - ShowStatistic(adif); + dmUtils.ShowStatistic(adif,old_stat_adif,sgrdStatistic); CalculateDistanceEtc; if (( frmGrayline.Showing ) and (edtCall.Text<>'')) then DrawGrayline; @@ -5816,8 +6012,11 @@ end; procedure TfrmNewQSO.mCommentKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin - if key = VK_TAB then - edtCall.SetFocus; + if ((key = VK_TAB) and (not AnyRemoteOn)) then + Begin + edtCall.SetFocus; + key := 0 + end; end; procedure TfrmNewQSO.mCommentKeyUp(Sender: TObject; var Key: Word; @@ -5880,6 +6079,11 @@ begin frmMain.BringToFront; end; +procedure TfrmNewQSO.pgDetailsChange(Sender: TObject); +begin + cqrini.WriteInteger('NewQSO','DetailsTabIndex', pgDetails.TabIndex); +end; + procedure TfrmNewQSO.popEditQSOPopup(Sender: TObject); var v:boolean; @@ -6120,132 +6324,6 @@ begin end; end; -procedure TfrmNewQSO.ShowStatistic(ref_adif : Word); -var - i : Integer; - ShowLoTW : Boolean = False; - mode : String; - QSLR,LoTW,eQSL : String; - tmps : String; - space: String; -begin - if old_stat_adif = ref_adif then - exit; - old_stat_adif := ref_adif; - sgrdStatistic.ColCount := cMaxBandsCount; - - ClearStatGrid; - AddBandsToStatGrid; - - space := ' '; - if cqrini.ReadBool('Fonts','GridDotsInsteadSpaces',False) = True then - begin - space := '.'; - end; - - for i:=0 to cMaxBandsCount-1 do - begin - if dmUtils.MyBands[i][0]='' then - begin - sgrdStatistic.ColCount := i+1; - break - end; - - sgrdStatistic.Cells[i+1,1] := space+space+space; - sgrdStatistic.Cells[i+1,2] := space+space+space; - sgrdStatistic.Cells[i+1,3] := space+space+space; - end; - - if dmData.trQ.Active then - dmData.trQ.RollBack; - dmData.Q.Close; - - ShowLoTW := cqrini.ReadBool('LoTW','NewQSOLoTW',False); - if ShowLoTW then - dmData.Q.SQL.Text := 'select band,mode,qsl_r,lotw_qslr,eqsl_qsl_rcvd from cqrlog_main where adif='+ - IntToStr(ref_adif) + ' and ((qsl_r='+QuotedStr('Q')+') or '+ - '(lotw_qslr = '+QuotedStr('L')+') or (eqsl_qsl_rcvd='+QuotedStr('E')+ - ')) group by band,mode,qsl_r,lotw_qslr,eqsl_qsl_rcvd' - else - dmData.Q.SQL.Text := 'select band,mode,qsl_r,lotw_qslr,eqsl_qsl_rcvd from cqrlog_main where adif='+ - IntToStr(ref_adif) + ' and (qsl_r = '+QuotedStr('Q')+') '+ - 'group by band,mode,qsl_r,lotw_qslr,eqsl_qsl_rcvd'; - dmData.trQ.StartTransaction; - dmData.Q.Open; - while not dmData.Q.Eof do - begin - i := dmUtils.GetBandPos(dmData.Q.Fields[0].AsString)+1; - mode := dmData.Q.Fields[1].AsString; - QSLR := dmData.Q.Fields[2].AsString; - LoTW := dmData.Q.Fields[3].AsString; - eQSL := dmData.Q.Fields[4].AsString; - if i > 0 then - begin - if (Mode = 'SSB') or (Mode='FM') or (Mode='AM') then - begin - tmps := sgrdStatistic.Cells[i,1] ; - if QSLR = 'Q' then - tmps[1] := 'Q'; - if (LoTW = 'L') then - tmps[2] := 'L'; - if (eQSL = 'E') then - tmps[3] := 'E'; - sgrdStatistic.Cells[i,1] := tmps - end - else begin - if (Mode='CW') or (Mode='CWQ') then - begin - tmps := sgrdStatistic.Cells[i,2] ; - if QSLR = 'Q' then - tmps[1] := 'Q'; - if (LoTW = 'L') then - tmps[2] := 'L'; - if (eQSL = 'E') then - tmps[3] := 'E'; - sgrdStatistic.Cells[i,2] := tmps - end - else begin - tmps := sgrdStatistic.Cells[i,3] ; - if QSLR = 'Q' then - tmps[1] := 'Q'; - if (LoTW = 'L') then - tmps[2] := 'L'; - if (eQSL = 'E') then - tmps[3] := 'E'; - sgrdStatistic.Cells[i,3] := tmps - end - end; - end; - dmData.Q.Next - end; - dmData.trQ.Rollback; - - dmData.Q.Close; - if dmData.trQ.Active then - dmData.trQ.Rollback; - dmData.Q.SQL.Text := 'select band,mode from cqrlog_main where adif='+ - IntToStr(ref_adif) + ' group by band,mode'; - dmData.trQ.StartTransaction; - dmData.Q.Open; - while not dmData.Q.Eof do - begin - i := dmUtils.GetBandPos(dmData.Q.Fields[0].AsString)+1; - mode := dmData.Q.Fields[1].AsString; - if i > 0 then - begin - if ((mode = 'SSB') or (mode = 'FM') or (mode = 'AM')) then - if(sgrdStatistic.Cells[i,1] = space+space+space) then sgrdStatistic.Cells[i,1] := ' X '; - if ((mode = 'CW') or (mode = 'CWR')) then - if (sgrdStatistic.Cells[i,2] = space+space+space) then sgrdStatistic.Cells[i,2] := ' X '; - if ((mode <> 'SSB') and (mode <>'FM') and (mode <> 'AM') and (mode <> 'CW') and (mode <> 'CWR')) then - if (sgrdStatistic.Cells[i,3] = space+space+space) then sgrdStatistic.Cells[i,3] := ' X ' - end; - dmData.Q.Next; - end; - dmData.Q.Close; - dmData.trQ.Rollback -end; - procedure TfrmNewQSO.CalculateDistanceEtc; var azim, qra, myloc : String; @@ -6508,6 +6586,7 @@ begin end; edtDate.ReadOnly := fViewQSO; mComment.ReadOnly := fViewQSO; + edtDXCCRef.ReadOnly:=True; //we allow only DXCCs from list, no free type edtCall.SetFocus end; @@ -6700,7 +6779,7 @@ begin edtCall.Text := call; cmbFreq.Text := freq; if chkAutoMode.Checked then - cmbMode.Text := mode; + cmbMode.Text := RigCmd2DataMode(mode); freq := FloatToStr(etmp); if not FromRbn then mode := dmUtils.GetModeFromFreq(freq); @@ -6709,7 +6788,14 @@ begin frmTRXControl.SetModeFreq(mode,freq); edtCallExit(nil); if AnyRemoteOn then - SendToBack + begin + if RemoteActive='wsjtx' then + Begin + CallFromSpot:=True; + frmMonWsjtx.SendConfigure('','',call,' ',$7FFFFFFF,$7FFFFFFF,$7FFFFFFF,False,True); + end; + SendToBack; + end else BringToFront; if frmContest.Showing then @@ -6977,15 +7063,18 @@ end; procedure TfrmNewQSO.UpdateFKeyLabels; begin + frmCWType.fraCWKeys1.UpdateFKeyLabels; frmCWKeys.fraCWKeys.UpdateFKeyLabels end; procedure TfrmNewQSO.ChangeCallBookCaption; begin if cqrini.ReadBool('Callbook','HamQTH',True) then - lblCallbookInformation.Caption := 'Callbook (HamQTH.com):' - else - lblCallbookInformation.Caption := 'Callbook (qrz.com):' + lblCallbookInformation.Caption := 'Callbook (HamQTH.com):'; + if cqrini.ReadBool('Callbook','QRZ',True) then + lblCallbookInformation.Caption := 'Callbook (qrz.com):'; + if cqrini.ReadBool('Callbook','QRZCQ',True) then + lblCallbookInformation.Caption := 'Callbook (qrzCQ.com):'; end; procedure TfrmNewQSO.CalculateLocalSunRiseSunSet; @@ -7023,7 +7112,7 @@ end; procedure TfrmNewQSO.SendSpot; var - call,rst_s,stx,stx_str,HisName,HelloMsg : String; + call,rst_s,stx,stx_str,srx,srx_str,HisName,HelloMsg : String; tmp : String; ModRst, HMLoc :String; @@ -7042,6 +7131,8 @@ begin rst_s := edtHisRST.Text; stx := edtContestSerialSent.Text; stx_str:=edtContestExchangeMessageSent.Text; + srx := edtContestSerialReceived.Text; + srx_str:=edtContestExchangeMessageReceived.Text; HisName:= edtName.Text; tmp := 'DX ' + FloatToStrF(f,ffFixed,8,1) + ' ' + call; ModRst := cmbMode.Text+' '+ rst_s; @@ -7065,7 +7156,7 @@ begin dmData.trQ.Rollback; tmp := 'DX ' + freq + ' ' + call; - dmData.Q.SQL.Text := 'SELECT mode,rst_s,loc,prop_mode,my_loc,stx,stx_string,name FROM cqrlog_main ORDER BY qsodate DESC, time_on DESC LIMIT 1'; + dmData.Q.SQL.Text := 'SELECT mode,rst_s,loc,prop_mode,my_loc,stx,stx_string,srx,srx_string,name FROM cqrlog_main ORDER BY qsodate DESC, time_on DESC LIMIT 1'; dmData.trQ.StartTransaction; if dmData.DebugLevel >=1 then Writeln(dmData.Q.SQL.Text); @@ -7075,7 +7166,9 @@ begin rst_s := dmData.Q.Fields[1].AsString; stx := dmData.Q.Fields[5].AsString; stx_str:=dmData.Q.Fields[6].AsString; - HisName:= dmData.Q.Fields[7].AsString; + srx := dmData.Q.Fields[7].AsString; + srx_str:=dmData.Q.Fields[8].AsString; + HisName:= dmData.Q.Fields[9].AsString; dmData.Q.Close(); dmData.trQ.Rollback; @@ -7092,6 +7185,8 @@ begin Srst_s := rst_s; Sstx := stx ; Sstx_str:=stx_str; + Ssrx := srx ; + Ssrx_str:=srx_str; SHisName:= HisName; SHelloMsg:=HelloMsg; ShowModal; @@ -7142,6 +7237,12 @@ const var AProcess: TProcess; begin + if cqrini.ReadBool('TRX' + frmTRXControl.RigInUse, 'RigVoice', False) then ///use Hamlib's \send_voice command instead. + Begin + frmTRXControl.SendVoice(Copy(key_pressed,2,length(key_pressed)-1)); + exit; + end; + if not FileExists(dmData.HomeDir + cVoiceKeyer) then exit; @@ -7171,41 +7272,47 @@ begin CWint.Close; FreeAndNil(CWint) end; - - if frmTRXControl.rbRadio1.Checked then n := '1' else n := '2'; + UseSpeed:=0; //show zero when pot speed or no keyer + n:=intToStr(frmTRXControl.cmbRig.ItemIndex); if ((dmData.DebugLevel>=1 ) or ((abs(dmData.DebugLevel) and 8) = 8 )) then Writeln('Radio'+n+' CW settings:'); - KeyerType := cqrini.ReadInteger('CW','Type'+n,0); + KeyerType := cqrini.ReadInteger('CW'+n,'Type',0); if ((dmData.DebugLevel>=1 ) or ((abs(dmData.DebugLevel) and 8) = 8 )) then Writeln('CW init keyer type:',KeyerType); + Menuitem45.Visible:=False; //send hex commands to win/k3ng keyer case KeyerType of 1 : begin CWint := TCWWinKeyerUSB.Create; CWint.DebugMode := dmData.DebugLevel>=1; if dmData.DebugLevel < 0 then CWint.DebugMode := CWint.DebugMode or ((abs(dmData.DebugLevel) and 8) = 8 ); - CWint.Port := cqrini.ReadString('CW','wk_port'+n,''); - CWint.Device := cqrini.ReadString('CW','wk_port'+n,''); + CWint.Port := cqrini.ReadString('CW'+n,'wk_port',''); + CWint.Device := cqrini.ReadString('CW'+n,'wk_port',''); CWint.PortSpeed := 1200; - UseSpeed := cqrini.ReadInteger('CW','wk_speed',30); + if not cqrini.ReadBool('CW'+n,'PotSpeed',False) then + UseSpeed := cqrini.ReadInteger('CW'+n,'wk_speed',30) + else + UseSpeed:=-1; + Menuitem45.Visible:=True; end; 2 : begin CWint := TCWDaemon.Create; CWint.DebugMode := dmData.DebugLevel>=1; if dmData.DebugLevel < 0 then CWint.DebugMode := CWint.DebugMode or ((abs(dmData.DebugLevel) and 8) = 8 ); - CWint.Port := cqrini.ReadString('CW','cw_port'+n,''); - CWint.Device := cqrini.ReadString('CW','cw_address',''); + CWint.Port := cqrini.ReadString('CW'+n,'cw_port',''); + CWint.Device := cqrini.ReadString('CW'+n,'cw_address',''); CWint.PortSpeed := 0; - UseSpeed := cqrini.ReadInteger('CW','cw_speed',30); + UseSpeed := cqrini.ReadInteger('CW'+n,'cw_speed',30); end; 3 : begin CWint := TCWK3NG.Create; CWint.DebugMode := dmData.DebugLevel>=1; if dmData.DebugLevel < 0 then CWint.DebugMode := CWint.DebugMode or ((abs(dmData.DebugLevel) and 8) = 8 ); - CWint.Port := cqrini.ReadString('CW','K3NGPort'+n,''); - CWint.Device := cqrini.ReadString('CW','K3NGPort'+n,''); - CWint.PortSpeed := cqrini.ReadInteger('CW','K3NGSerSpeed',115200); - UseSpeed := cqrini.ReadInteger('CW','K3NGSpeed',30); + CWint.Port := cqrini.ReadString('CW'+n,'K3NGPort'+n,''); + CWint.Device := cqrini.ReadString('CW'+n,'K3NGPort'+n,''); + CWint.PortSpeed := cqrini.ReadInteger('CW'+n,'K3NGSerSpeed',115200); + UseSpeed := cqrini.ReadInteger('CW'+n,'K3NGSpeed',30); + Menuitem45.Visible:=True; end; 4 : begin CWint := TCWHamLib.Create; @@ -7214,16 +7321,20 @@ begin CWint.DebugMode := CWint.DebugMode or ((abs(dmData.DebugLevel) and 8) = 8 ); CWint.Port := cqrini.ReadString('TRX'+n,'RigCtldPort','4532'); CWint.Device := cqrini.ReadString('TRX'+n,'host','localhost'); - UseSpeed := cqrini.ReadInteger('CW','HamLibSpeed',30); + CWint.HamlibBuffer:=cqrini.ReadBool('CW'+n, 'UseHamlibBuffer', False); + UseSpeed := cqrini.ReadInteger('CW'+n,'HamLibSpeed',30); end; end; //case if KeyerType > 0 then Begin CWint.Open; - CWint.SetSpeed(UseSpeed); - sbNewQSO.Panels[4].Text := IntToStr(UseSpeed) + 'WPM'; - if frmCWType.Showing then frmCWType.edtSpeed.Value := UseSpeed; + if UseSpeed>0 then CWint.SetSpeed(UseSpeed); end; + if (cqrini.ReadInteger('CW'+n,'Type',0)=1) and cqrini.ReadBool('CW'+n,'PotSpeed',False) then + sbNewQSO.Panels[4].Text := 'Pot WPM' + else + sbNewQSO.Panels[4].Text := IntToStr(UseSpeed) + 'WPM'; + if frmCWType.Showing then frmCWType.edtSpeed.Value := UseSpeed; end; procedure TfrmNewQSO.OnBandMapClick(Sender:TObject;Call,Mode: String;Freq:Currency); @@ -7359,6 +7470,7 @@ begin tmrFldigi.Enabled := true; if FldigiXmlRpc then frmxfldigi.Visible := true; + RemoteActive := 'fldigi'; end; rmtWsjt : begin RememberAutoMode := chkAutoMode.Checked; @@ -7439,7 +7551,8 @@ begin exit end; mnuWsjtxmonitor.Visible := True; //we show "monitor" in view-submenu when active - if cqrini.ReadBool('Window','MonWsjtx',true) then acMonitorWsjtxExecute(nil) + if cqrini.ReadBool('Window','MonWsjtx',true) then acMonitorWsjtxExecute(nil); + RemoteActive := 'wsjtx'; end; rmtADIF : begin @@ -7481,6 +7594,7 @@ begin DisableRemoteMode; exit end; + RemoteActive := 'adif'; end; end; //case remote type @@ -7521,7 +7635,6 @@ begin if Assigned(WsjtxSock) then FreeAndNil(WsjtxSock); // to release UDP socket if multicast then if Assigned(WsjtxSockS) then FreeAndNil(WsjtxSockS); // to release UDP multicast TX socket mnuRemoteModeWsjt.Checked:= False; - AnyRemoteOn := False; end; if mnuRemoteMode.Checked then @@ -7529,7 +7642,6 @@ begin tmrFldigi.Enabled := False; if FldigiXmlRpc then frmxfldigi.Visible := false; mnuRemoteMode.Checked := False; - AnyRemoteOn := False; end ; if mnuRemoteModeADIF.Checked then @@ -7537,9 +7649,10 @@ begin tmrADIF.Enabled:=false; if Assigned(ADIFSock) then FreeAndNil(ADIFSock); // to release UDP socket mnuRemoteModeADIF.Checked:= False; - AnyRemoteOn := False; end; + AnyRemoteOn := False; + RemoteActive := ''; chkAutoMode.Checked:= RememberAutoMode; lblCall.Caption := 'Call:'; lblCall.Font.Color := clDefault; @@ -7709,6 +7822,19 @@ Begin ShowMessage(message); end; +function TfrmNewQSO.RigCmd2DataMode(mode:String):String; +var + DatCmd, + n :String; +Begin + n:=IntToStr(frmTRXControl.cmbRig.ItemIndex); + DatCmd := upcase(cqrini.ReadString('Band'+n, 'Datacmd', 'RTTY')); + if (DatCmd = 'USB') or (DatCmd = 'LSB') then DatCmd := 'SSB'; //this is what RigControl responses + + if cqrini.ReadBool('Band'+n, 'UseReverse', False) and (mode = DatCmd) then + Result := cqrini.ReadString('Band'+n, 'Datamode', 'RTTY') + else Result := mode; +end; end. diff --git a/src/fPreferences.lfm b/src/fPreferences.lfm index 20f93ce..73f63d6 100644 --- a/src/fPreferences.lfm +++ b/src/fPreferences.lfm @@ -1,26 +1,26 @@ object frmPreferences: TfrmPreferences - Left = 74 - Height = 652 - Top = 31 - Width = 1103 + Left = 2 + Height = 709 + Top = 3 + Width = 1095 HelpType = htKeyword HelpKeyword = 'help/h1.html' - HorzScrollBar.Page = 1090 - VertScrollBar.Page = 639 + HorzScrollBar.Page = 1082 + VertScrollBar.Page = 696 ActiveControl = lbPreferences AutoScroll = True BorderIcons = [biSystemMenu] Caption = 'Preferences' - ClientHeight = 639 - ClientWidth = 1090 + ClientHeight = 696 + ClientWidth = 1082 OnCloseQuery = FormCloseQuery OnCreate = FormCreate OnShow = FormShow Position = poMainFormCenter - LCLVersion = '2.2.0.4' + LCLVersion = '2.2.6.0' object pgPreferences: TPageControl Left = 160 - Height = 703 + Height = 753 Top = 0 Width = 846 ActivePage = tabProgram @@ -30,8 +30,8 @@ object frmPreferences: TfrmPreferences OnChange = pgPreferencesChange object tabProgram: TTabSheet Caption = 'Program' - ClientHeight = 621 - ClientWidth = 845 + ClientHeight = 722 + ClientWidth = 836 object lblWebBrowser: TLabel AnchorSideLeft.Control = gbInternet AnchorSideLeft.Side = asrBottom @@ -243,21 +243,20 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Control = edtQSOColorDate AnchorSideTop.Side = asrBottom Left = 6 - Height = 203 + Height = 230 Top = 333 - Width = 626 + Width = 666 BorderSpacing.Top = 9 Caption = ' Offsets and colors' - ClientHeight = 185 - ClientWidth = 624 + ClientHeight = 212 + ClientWidth = 664 TabOrder = 7 object lblUtc: TLabel AnchorSideLeft.Control = edtOffset - AnchorSideLeft.Side = asrCenter AnchorSideBottom.Control = edtOffset - Left = 193 + Left = 176 Height = 17 - Top = 11 + Top = 26 Width = 27 Anchors = [akLeft, akBottom] Caption = 'UTC' @@ -269,7 +268,7 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 6 Height = 17 - Top = 79 + Top = 94 Width = 59 BorderSpacing.Top = 15 Caption = 'Grayline:' @@ -281,7 +280,7 @@ object frmPreferences: TfrmPreferences AnchorSideBottom.Control = edtSunOffset Left = 233 Height = 17 - Top = 11 + Top = 26 Width = 76 Anchors = [akLeft, akBottom] Caption = 'Sun rise/set' @@ -294,7 +293,7 @@ object frmPreferences: TfrmPreferences AnchorSideRight.Control = edtSunOffset Left = 176 Height = 34 - Top = 28 + Top = 43 Width = 60 Anchors = [akTop, akRight] BorderSpacing.Right = 6 @@ -308,7 +307,7 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 128 Height = 34 - Top = 96 + Top = 111 Width = 50 TabOrder = 1 Text = '0' @@ -321,7 +320,7 @@ object frmPreferences: TfrmPreferences AnchorSideRight.Side = asrBottom Left = 242 Height = 34 - Top = 28 + Top = 43 Width = 58 Anchors = [akTop, akRight] BorderSpacing.Left = 6 @@ -334,10 +333,10 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 3 Height = 38 - Top = 26 + Top = 41 Width = 122 BorderSpacing.Left = 3 - BorderSpacing.Top = 6 + BorderSpacing.Top = 21 Caption = 'get UTC from '#10'computer time' OnClick = chkSysUTCClick TabOrder = 3 @@ -348,8 +347,9 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 6 Height = 34 - Top = 130 + Top = 148 Width = 294 + BorderSpacing.Top = 3 Caption = 'Sometimes grayline is not accurate, you can '#10'enter the correction here (in hours, try -1.25)' ParentColor = False end @@ -366,39 +366,41 @@ object frmPreferences: TfrmPreferences ParentColor = False end object edtGCStep: TEdit - AnchorSideLeft.Control = lblGCHint - AnchorSideLeft.Side = asrCenter + AnchorSideLeft.Control = edtGCLineWidth + AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtGrayLineOffset AnchorSideTop.Side = asrCenter - Left = 430 + Left = 392 Height = 34 - Top = 96 - Width = 80 + Top = 111 + Width = 55 + BorderSpacing.Left = 9 + MaxLength = 4 OnExit = edtGCStepExit TabOrder = 4 end object edtGCPolarDivisor: TEdit + AnchorSideLeft.Control = edtGCStep + AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtGrayLineOffset AnchorSideTop.Side = asrCenter - AnchorSideRight.Control = gbOffsets AnchorSideRight.Side = asrBottom - Left = 538 + Left = 456 Height = 34 - Top = 96 - Width = 80 - Anchors = [akTop, akRight] - BorderSpacing.Right = 6 + Top = 111 + Width = 55 + BorderSpacing.Left = 9 + MaxLength = 2 NumbersOnly = True OnExit = edtGCPolarDivisorExit TabOrder = 5 end object lblGCStep: TLabel AnchorSideLeft.Control = edtGCStep - AnchorSideLeft.Side = asrCenter AnchorSideBottom.Control = edtGCStep - Left = 456 + Left = 392 Height = 17 - Top = 79 + Top = 94 Width = 29 Anchors = [akLeft, akBottom] Caption = 'Step' @@ -406,11 +408,10 @@ object frmPreferences: TfrmPreferences end object lblGCDivisor: TLabel AnchorSideLeft.Control = edtGCPolarDivisor - AnchorSideLeft.Side = asrCenter AnchorSideBottom.Control = edtGCPolarDivisor - Left = 555 + Left = 456 Height = 17 - Top = 79 + Top = 94 Width = 46 Anchors = [akLeft, akBottom] Caption = 'Divisor' @@ -422,22 +423,22 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbOffsets AnchorSideRight.Side = asrBottom - Left = 322 + Left = 328 Height = 51 - Top = 130 + Top = 148 Width = 296 Anchors = [akTop, akRight] - BorderSpacing.Right = 6 + BorderSpacing.Top = 3 + BorderSpacing.Right = 40 Caption = 'Great circle plotting setps in decimal degrees'#10'Step divisor is used in N and S polar areas'#10'where distance/degree is smaller' ParentColor = False end object lblGLOffset: TLabel AnchorSideLeft.Control = edtGrayLineOffset - AnchorSideLeft.Side = asrCenter AnchorSideBottom.Control = edtGrayLineOffset - Left = 133 + Left = 128 Height = 17 - Top = 79 + Top = 94 Width = 40 Anchors = [akLeft, akBottom] Caption = 'Offset' @@ -445,80 +446,169 @@ object frmPreferences: TfrmPreferences end object edtGCLineWidth: TEdit AnchorSideLeft.Control = lblGCHint - AnchorSideTop.Control = edtGCStep - Left = 322 + AnchorSideTop.Control = edtGrayLineOffset + Left = 328 Height = 34 - Top = 96 - Width = 80 + Top = 111 + Width = 55 + MaxLength = 2 NumbersOnly = True OnExit = edtGCLineWidthExit TabOrder = 6 end object lblGCwidth: TLabel AnchorSideLeft.Control = edtGCLineWidth - AnchorSideLeft.Side = asrCenter AnchorSideBottom.Control = edtGCLineWidth Left = 328 Height = 17 - Top = 79 - Width = 69 + Top = 94 + Width = 50 Anchors = [akLeft, akBottom] - Caption = 'Line Width' + Caption = 'P-Width' ParentColor = False end object lblGC_SP_Color: TLabel - AnchorSideLeft.Control = btnSPColor - AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = lblUtc Left = 342 Height = 17 - Top = 11 - Width = 91 - Caption = 'ShortPath line' + Top = 26 + Width = 34 + Caption = 'Short' ParentColor = False end object lblGC_LP_Color: TLabel - AnchorSideLeft.Side = asrCenter + AnchorSideLeft.Control = btnLPColor AnchorSideTop.Control = lblUtc - Left = 503 + Left = 442 Height = 17 - Top = 11 - Width = 88 - Caption = 'LongPath line' + Top = 26 + Width = 31 + Caption = 'Long' ParentColor = False end - object btnSPColor: TButton + object Label12: TLabel AnchorSideLeft.Control = lblGCHint - AnchorSideTop.Control = edtOffset - Left = 322 + AnchorSideTop.Control = LblTimes + Left = 328 + Height = 17 + Top = 3 + Width = 127 + Caption = 'Grayline path lines:' + ParentColor = False + end + object lblGC_BP_Color: TLabel + AnchorSideLeft.Control = btnBPColor + AnchorSideTop.Control = lblUtc + Left = 544 + Height = 17 + Top = 26 + Width = 38 + Caption = 'Beam' + ParentColor = False + end + object edtGCBeamWidth: TEdit + AnchorSideLeft.Control = edtGCPolarDivisor + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtGrayLineOffset + AnchorSideTop.Side = asrCenter + AnchorSideRight.Side = asrBottom + Left = 520 Height = 34 - Hint = 'Click to select color' - Top = 28 - Width = 130 - Caption = 'Select Color' - Color = clYellow - OnClick = btnSPColorClick - ParentShowHint = False - ShowHint = True + Top = 111 + Width = 55 + BorderSpacing.Left = 9 + MaxLength = 2 + NumbersOnly = True + OnChange = edtGCBeamWidthChange + OnExit = edtGCPolarDivisorExit TabOrder = 7 end - object btnLPColor: TButton - AnchorSideTop.Control = edtOffset - AnchorSideRight.Control = lblGCHint + object lblGCBeamWidth: TLabel + AnchorSideLeft.Control = edtGCBeamWidth + AnchorSideBottom.Control = edtGCBeamWidth + Left = 520 + Height = 17 + Top = 94 + Width = 52 + Anchors = [akLeft, akBottom] + Caption = 'B-Width' + ParentColor = False + end + object edtGCBeamLength: TEdit + AnchorSideLeft.Control = lblGCBeamWidth + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtGrayLineOffset + AnchorSideTop.Side = asrCenter AnchorSideRight.Side = asrBottom - Left = 488 + Left = 581 Height = 34 - Hint = 'Click to select color' - Top = 28 - Width = 130 - Anchors = [akTop, akRight] - Caption = 'Select Color' - Color = clFuchsia - OnClick = btnLPColorClick - ParentShowHint = False - ShowHint = True + Top = 111 + Width = 55 + BorderSpacing.Left = 9 + MaxLength = 4 + NumbersOnly = True + OnChange = edtGCBeamWidthChange + OnExit = edtGCPolarDivisorExit TabOrder = 8 end + object lblGCBeamLength: TLabel + AnchorSideLeft.Control = edtGCBeamLength + AnchorSideBottom.Control = edtGCBeamWidth + Left = 581 + Height = 17 + Top = 94 + Width = 44 + Anchors = [akLeft, akBottom] + Caption = 'Length' + ParentColor = False + end + object btnSPColor: TColorButton + AnchorSideLeft.Control = lblGCHint + AnchorSideTop.Control = edtOffset + Left = 340 + Height = 34 + Top = 43 + Width = 90 + BorderSpacing.Left = 12 + BorderWidth = 1 + ButtonColorAutoSize = False + ButtonColorSize = 20 + ButtonColor = clYellow + Caption = 'Color' + Color = clDefault + end + object btnLPColor: TColorButton + AnchorSideLeft.Control = btnSPColor + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtOffset + Left = 442 + Height = 34 + Top = 43 + Width = 90 + BorderSpacing.Left = 12 + BorderWidth = 1 + ButtonColorAutoSize = False + ButtonColorSize = 20 + ButtonColor = clFuchsia + Caption = 'Color' + Color = clDefault + end + object btnBPColor: TColorButton + AnchorSideLeft.Control = btnLPColor + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtOffset + Left = 544 + Height = 34 + Top = 43 + Width = 90 + BorderSpacing.Left = 12 + BorderWidth = 1 + ButtonColorAutoSize = False + ButtonColorSize = 20 + ButtonColor = clRed + Caption = 'Color' + Color = clDefault + end end object chkShowMiles: TCheckBox AnchorSideLeft.Control = chkNewDXCCTables @@ -537,7 +627,7 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 6 Height = 33 - Top = 542 + Top = 569 Width = 213 AutoSize = True BorderSpacing.Top = 6 @@ -582,23 +672,6 @@ object frmPreferences: TfrmPreferences Caption = 'show with different color' ParentColor = False end - object btnSelectQSOColor: TButton - AnchorSideLeft.Control = lblDiffColor - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = edtQSOColorDate - AnchorSideTop.Side = asrCenter - Left = 414 - Height = 33 - Hint = 'Click to select color' - Top = 291 - Width = 130 - BorderSpacing.Left = 12 - Caption = 'Select Color' - OnClick = btnSelectQSOColorClick - ParentShowHint = False - ShowHint = True - TabOrder = 12 - end object lblQsoColorDate: TLabel AnchorSideLeft.Control = edtQSOColorDate AnchorSideLeft.Side = asrCenter @@ -620,12 +693,28 @@ object frmPreferences: TfrmPreferences Top = 181 Width = 446 Caption = 'Check for newer version of DOK database after program startup' - TabOrder = 13 + TabOrder = 12 + end + object btnSelectQSOColor: TColorButton + AnchorSideLeft.Control = lblDiffColor + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtQSOColorDate + Left = 414 + Height = 34 + Top = 290 + Width = 90 + BorderSpacing.Left = 12 + BorderWidth = 1 + ButtonColorAutoSize = False + ButtonColorSize = 20 + ButtonColor = clBlack + Caption = 'Color' + Color = clDefault end end object tabStation: TTabSheet Caption = 'Station' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object GroupBox5: TGroupBox Left = 16 @@ -633,15 +722,16 @@ object frmPreferences: TfrmPreferences Top = 16 Width = 312 Caption = 'General' - ClientHeight = 166 + ClientHeight = 150 ClientWidth = 310 TabOrder = 0 object Label4: TLabel Left = 104 Height = 17 Top = 112 - Width = 27 + Width = 26 Caption = 'Loc:' + ParentColor = False end object Label3: TLabel Left = 103 @@ -649,6 +739,7 @@ object frmPreferences: TfrmPreferences Top = 16 Width = 29 Caption = 'Call:' + ParentColor = False end object edtCall: TEdit Left = 147 @@ -662,8 +753,9 @@ object frmPreferences: TfrmPreferences Left = 88 Height = 17 Top = 48 - Width = 44 + Width = 43 Caption = 'Name:' + ParentColor = False end object edtName: TEdit Left = 147 @@ -676,8 +768,9 @@ object frmPreferences: TfrmPreferences Left = 98 Height = 17 Top = 80 - Width = 33 + Width = 32 Caption = 'QTH:' + ParentColor = False end object edtQTH: TEdit Left = 147 @@ -702,15 +795,16 @@ object frmPreferences: TfrmPreferences Top = 208 Width = 312 Caption = 'Contest Info' - ClientHeight = 194 + ClientHeight = 178 ClientWidth = 310 TabOrder = 1 object Label10: TLabel Left = 20 Height = 17 Top = 45 - Width = 112 + Width = 108 Caption = 'Mailing Address:' + ParentColor = False end object edtMailingAddress: TEdit Left = 147 @@ -726,6 +820,7 @@ object frmPreferences: TfrmPreferences Top = 77 Width = 54 Caption = 'ZIP City:' + ParentColor = False end object edtZipCity: TEdit Left = 147 @@ -741,6 +836,7 @@ object frmPreferences: TfrmPreferences Top = 109 Width = 45 Caption = 'E-Mail:' + ParentColor = False end object edtEmail: TEdit Left = 147 @@ -754,8 +850,9 @@ object frmPreferences: TfrmPreferences Left = 8 Height = 17 Top = 141 - Width = 122 + Width = 118 Caption = 'Club Membership:' + ParentColor = False end object edtClub: TEdit Left = 147 @@ -769,8 +866,9 @@ object frmPreferences: TfrmPreferences Left = 8 Height = 17 Top = 8 - Width = 146 + Width = 142 Caption = '(used for EDI exports)' + ParentColor = False end end end @@ -778,32 +876,33 @@ object frmPreferences: TfrmPreferences AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Caption = 'New QSO' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object Label82: TLabel AnchorSideLeft.Control = edtRecetQSOs AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtRecetQSOs AnchorSideTop.Side = asrCenter - Left = 336 + Left = 330 Height = 17 - Top = 401 - Width = 30 + Top = 404 + Width = 31 BorderSpacing.Left = 5 Caption = 'days' + ParentColor = False end object GroupBox1: TGroupBox AnchorSideLeft.Control = tabNewQSO AnchorSideTop.Control = tabNewQSO Left = 20 - Height = 160 - Top = 10 - Width = 600 + Height = 170 + Top = 3 + Width = 636 BorderSpacing.Left = 20 - BorderSpacing.Top = 10 + BorderSpacing.Top = 3 Caption = ' Default values ' - ClientHeight = 158 - ClientWidth = 598 + ClientHeight = 152 + ClientWidth = 634 TabOrder = 0 object Label5: TLabel AnchorSideLeft.Control = edtRST_S @@ -815,6 +914,7 @@ object frmPreferences: TfrmPreferences Width = 40 BorderSpacing.Top = 10 Caption = 'RST_S' + ParentColor = False end object Label6: TLabel AnchorSideLeft.Control = edtRST_R @@ -824,6 +924,7 @@ object frmPreferences: TfrmPreferences Top = 10 Width = 41 Caption = 'RST_R' + ParentColor = False end object Label7: TLabel AnchorSideLeft.Control = edtPWR @@ -831,8 +932,9 @@ object frmPreferences: TfrmPreferences Left = 143 Height = 17 Top = 10 - Width = 32 + Width = 30 Caption = 'PWR' + ParentColor = False end object Label8: TLabel AnchorSideLeft.Control = cmbFreq @@ -840,8 +942,9 @@ object frmPreferences: TfrmPreferences Left = 263 Height = 17 Top = 10 - Width = 36 + Width = 35 Caption = 'FREQ' + ParentColor = False end object Label9: TLabel AnchorSideLeft.Control = cmbMode @@ -849,20 +952,20 @@ object frmPreferences: TfrmPreferences Left = 433 Height = 17 Top = 10 - Width = 39 + Width = 36 Caption = 'Mode' + ParentColor = False end object Label11: TLabel AnchorSideLeft.Control = edtComments - AnchorSideBottom.Control = GroupBox1 - AnchorSideBottom.Side = asrBottom + AnchorSideBottom.Control = edtComments Left = 5 Height = 17 - Top = 101 - Width = 123 + Top = 96 + Width = 118 Anchors = [akLeft, akBottom] - BorderSpacing.Bottom = 40 Caption = 'Comment for QSO' + ParentColor = False end object edtRST_S: TEdit AnchorSideLeft.Control = GroupBox1 @@ -916,7 +1019,7 @@ object frmPreferences: TfrmPreferences AnchorSideBottom.Side = asrBottom Left = 5 Height = 34 - Top = 119 + Top = 113 Width = 216 Anchors = [akLeft, akBottom] BorderSpacing.Left = 5 @@ -962,6 +1065,30 @@ object frmPreferences: TfrmPreferences OnClick = btnChangeDefModeClick TabOrder = 7 end + object edtOperator: TEdit + AnchorSideLeft.Control = cmbFreq + AnchorSideBottom.Control = GroupBox1 + AnchorSideBottom.Side = asrBottom + Left = 263 + Height = 34 + Top = 113 + Width = 216 + Anchors = [akLeft, akBottom] + BorderSpacing.Bottom = 5 + OnExit = edtOperatorExit + TabOrder = 8 + end + object Label13: TLabel + AnchorSideLeft.Control = edtOperator + AnchorSideBottom.Control = edtComments + Left = 263 + Height = 17 + Top = 96 + Width = 276 + Anchors = [akLeft, akBottom] + Caption = 'Operator (if different than station callsign)' + ParentColor = False + end end object chkUseSpaceBar: TCheckBox AnchorSideLeft.Control = tabNewQSO @@ -969,8 +1096,8 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 20 Height = 23 - Top = 254 - Width = 274 + Top = 257 + Width = 272 BorderSpacing.Left = 20 Caption = 'Use spacebar to move between fields' TabOrder = 1 @@ -981,8 +1108,8 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 20 Height = 23 - Top = 300 - Width = 214 + Top = 303 + Width = 211 BorderSpacing.Left = 20 Caption = 'Refresh data after save QSO' TabOrder = 2 @@ -993,8 +1120,8 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 20 Height = 23 - Top = 277 - Width = 391 + Top = 280 + Width = 387 BorderSpacing.Left = 20 Caption = 'Skip over mode and frequency when radio is connected' TabOrder = 3 @@ -1005,10 +1132,10 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 20 Height = 23 - Top = 323 - Width = 338 + Top = 326 + Width = 415 BorderSpacing.Left = 20 - Caption = 'Enable auto search on HamQTH.com/QRZ.COM' + Caption = 'Enable auto search on HamQTH.com/QRZ.COM/QRZCQ.com' TabOrder = 4 end object chkShowRecentQSOs: TCheckBox @@ -1017,8 +1144,8 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrCenter Left = 20 Height = 23 - Top = 398 - Width = 250 + Top = 401 + Width = 244 BorderSpacing.Left = 20 Caption = 'Show recent QSO records for last ' TabOrder = 5 @@ -1028,9 +1155,9 @@ object frmPreferences: TfrmPreferences AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = chkMvToRem AnchorSideTop.Side = asrBottom - Left = 275 + Left = 269 Height = 34 - Top = 392 + Top = 395 Width = 56 BorderSpacing.Left = 5 OnKeyPress = edtRecetQSOsKeyPress @@ -1043,8 +1170,8 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 20 Height = 23 - Top = 346 - Width = 288 + Top = 349 + Width = 281 BorderSpacing.Left = 20 Caption = 'Ignore HamQTH.com/QRZ.COM qsl info' TabOrder = 7 @@ -1055,7 +1182,7 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 20 Height = 23 - Top = 369 + Top = 372 Width = 578 BorderSpacing.Left = 20 Caption = 'If ''QSL via'' field contains other info than a call sign, move to ''Comment to QSO'' field' @@ -1067,8 +1194,8 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 20 Height = 23 - Top = 180 - Width = 279 + Top = 183 + Width = 276 BorderSpacing.Left = 20 BorderSpacing.Top = 10 Caption = 'Enable auto mark QSO QSL__S field as' @@ -1079,9 +1206,9 @@ object frmPreferences: TfrmPreferences AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = chkAutoQSLS AnchorSideTop.Side = asrCenter - Left = 309 + Left = 306 Height = 27 - Top = 178 + Top = 181 Width = 74 AutoSize = False BorderSpacing.Left = 10 @@ -1094,8 +1221,8 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 40 Height = 23 - Top = 208 - Width = 415 + Top = 211 + Width = 414 BorderSpacing.Left = 40 BorderSpacing.Top = 3 Caption = 'Mark only QSO which are new country, new band country ...' @@ -1107,8 +1234,8 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 40 Height = 23 - Top = 231 - Width = 396 + Top = 234 + Width = 387 BorderSpacing.Left = 40 Caption = 'Mark only the first QSO, first band QSO, first mode QSO' TabOrder = 12 @@ -1119,8 +1246,8 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 20 Height = 23 - Top = 426 - Width = 465 + Top = 429 + Width = 458 BorderSpacing.Left = 20 Caption = 'In previous QSO list show also QSO with call/p, call/m, W6/call etc.' TabOrder = 13 @@ -1131,7 +1258,7 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 20 Height = 23 - Top = 449 + Top = 452 Width = 199 BorderSpacing.Left = 20 Caption = 'Clear RIT after saving QSO' @@ -1143,8 +1270,8 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 20 Height = 23 - Top = 472 - Width = 427 + Top = 475 + Width = 419 BorderSpacing.Left = 20 Caption = 'Always overwrite info from previous QSO with callbook data' TabOrder = 15 @@ -1155,8 +1282,8 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 20 Height = 23 - Top = 518 - Width = 245 + Top = 521 + Width = 241 BorderSpacing.Left = 20 Caption = 'Capitalise first letter in QTH field' TabOrder = 16 @@ -1167,8 +1294,8 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 40 Height = 23 - Top = 495 - Width = 403 + Top = 498 + Width = 405 BorderSpacing.Left = 40 Caption = 'Always overwrite only CQ, ITU zones, county and US state' TabOrder = 17 @@ -1179,8 +1306,8 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 20 Height = 23 - Top = 541 - Width = 259 + Top = 544 + Width = 253 BorderSpacing.Left = 20 Caption = 'Fill Award field from previous QSO ' TabOrder = 18 @@ -1191,8 +1318,8 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 20 Height = 23 - Top = 564 - Width = 171 + Top = 567 + Width = 168 BorderSpacing.Left = 20 Caption = 'Enable satellite mode' TabOrder = 19 @@ -1202,10 +1329,10 @@ object frmPreferences: TfrmPreferences AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = Label82 AnchorSideTop.Side = asrCenter - Left = 371 + Left = 366 Height = 23 - Top = 398 - Width = 348 + Top = 401 + Width = 345 BorderSpacing.Left = 5 Caption = 'instead of recent, show QSOs B4 with logged call' TabOrder = 20 @@ -1216,8 +1343,8 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 20 Height = 23 - Top = 587 - Width = 283 + Top = 590 + Width = 279 BorderSpacing.Left = 20 Caption = 'Upload SAT info to AMSAT status page' TabOrder = 21 @@ -1228,10 +1355,11 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 40 Height = 17 - Top = 610 - Width = 542 + Top = 613 + Width = 528 BorderSpacing.Left = 40 Caption = 'User defined web button. Macros: $CALL, $BAND, $FREQ, $MODE, $LOC, $MYLOC' + ParentColor = False end object edtUsrBtn: TEdit AnchorSideLeft.Control = tabNewQSO @@ -1239,7 +1367,7 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 20 Height = 34 - Top = 627 + Top = 630 Width = 548 BorderSpacing.Left = 20 TabOrder = 22 @@ -1247,7 +1375,7 @@ object frmPreferences: TfrmPreferences end object tabVisibleColumns: TTabSheet Caption = 'Visible columns' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object chkDate: TCheckBox AnchorSideLeft.Control = tabVisibleColumns @@ -1255,7 +1383,7 @@ object frmPreferences: TfrmPreferences Left = 18 Height = 23 Top = 6 - Width = 58 + Width = 57 BorderSpacing.Left = 18 BorderSpacing.Top = 6 Caption = 'Date' @@ -1268,7 +1396,7 @@ object frmPreferences: TfrmPreferences Left = 18 Height = 23 Top = 32 - Width = 79 + Width = 78 BorderSpacing.Top = 3 Caption = 'Time on' TabOrder = 1 @@ -1280,7 +1408,7 @@ object frmPreferences: TfrmPreferences Left = 18 Height = 23 Top = 58 - Width = 82 + Width = 80 BorderSpacing.Top = 3 Caption = 'Time off' TabOrder = 2 @@ -1304,7 +1432,7 @@ object frmPreferences: TfrmPreferences Left = 18 Height = 23 Top = 110 - Width = 65 + Width = 62 BorderSpacing.Top = 3 Caption = 'Mode' TabOrder = 4 @@ -1316,7 +1444,7 @@ object frmPreferences: TfrmPreferences Left = 18 Height = 23 Top = 136 - Width = 56 + Width = 54 BorderSpacing.Top = 3 Caption = 'Freq' TabOrder = 5 @@ -1328,7 +1456,7 @@ object frmPreferences: TfrmPreferences Left = 18 Height = 23 Top = 266 - Width = 85 + Width = 83 BorderSpacing.Top = 3 Caption = 'QSL sent' TabOrder = 6 @@ -1340,7 +1468,7 @@ object frmPreferences: TfrmPreferences Left = 18 Height = 23 Top = 292 - Width = 113 + Width = 111 BorderSpacing.Top = 3 Caption = 'QSL received' TabOrder = 7 @@ -1364,7 +1492,7 @@ object frmPreferences: TfrmPreferences Left = 18 Height = 23 Top = 188 - Width = 114 + Width = 115 BorderSpacing.Top = 3 Caption = 'RST Received' TabOrder = 9 @@ -1376,7 +1504,7 @@ object frmPreferences: TfrmPreferences Left = 18 Height = 23 Top = 214 - Width = 66 + Width = 65 BorderSpacing.Top = 3 Caption = 'Name' TabOrder = 10 @@ -1388,7 +1516,7 @@ object frmPreferences: TfrmPreferences Left = 18 Height = 23 Top = 240 - Width = 55 + Width = 54 BorderSpacing.Top = 3 Caption = 'QTH' TabOrder = 11 @@ -1399,7 +1527,7 @@ object frmPreferences: TfrmPreferences Left = 163 Height = 23 Top = 6 - Width = 115 + Width = 113 BorderSpacing.Left = 145 Caption = 'QSL manager' TabOrder = 12 @@ -1411,7 +1539,7 @@ object frmPreferences: TfrmPreferences Left = 163 Height = 23 Top = 32 - Width = 78 + Width = 74 BorderSpacing.Top = 3 Caption = 'Locator' TabOrder = 13 @@ -1423,7 +1551,7 @@ object frmPreferences: TfrmPreferences Left = 163 Height = 23 Top = 58 - Width = 98 + Width = 95 BorderSpacing.Top = 3 Caption = 'My locator' TabOrder = 14 @@ -1435,7 +1563,7 @@ object frmPreferences: TfrmPreferences Left = 163 Height = 23 Top = 133 - Width = 58 + Width = 57 BorderSpacing.Top = 3 Caption = 'IOTA' TabOrder = 15 @@ -1447,7 +1575,7 @@ object frmPreferences: TfrmPreferences Left = 163 Height = 23 Top = 159 - Width = 69 + Width = 67 BorderSpacing.Top = 3 Caption = 'Award' TabOrder = 16 @@ -1459,7 +1587,7 @@ object frmPreferences: TfrmPreferences Left = 163 Height = 23 Top = 185 - Width = 73 + Width = 72 BorderSpacing.Top = 3 Caption = 'County' TabOrder = 17 @@ -1471,7 +1599,7 @@ object frmPreferences: TfrmPreferences Left = 163 Height = 23 Top = 211 - Width = 68 + Width = 66 BorderSpacing.Top = 3 Caption = 'Power' TabOrder = 18 @@ -1495,7 +1623,7 @@ object frmPreferences: TfrmPreferences Left = 163 Height = 23 Top = 263 - Width = 143 + Width = 139 BorderSpacing.Top = 3 Caption = 'Comment to QSO' TabOrder = 20 @@ -1531,7 +1659,7 @@ object frmPreferences: TfrmPreferences Left = 163 Height = 23 Top = 341 - Width = 62 + Width = 60 BorderSpacing.Top = 3 Caption = 'State' TabOrder = 23 @@ -1542,7 +1670,7 @@ object frmPreferences: TfrmPreferences Left = 308 Height = 23 Top = 6 - Width = 164 + Width = 159 BorderSpacing.Left = 145 Caption = 'LoTW QSL send date' TabOrder = 24 @@ -1554,7 +1682,7 @@ object frmPreferences: TfrmPreferences Left = 308 Height = 23 Top = 32 - Width = 189 + Width = 184 BorderSpacing.Top = 3 Caption = 'LoTW QSL received date' TabOrder = 25 @@ -1566,7 +1694,7 @@ object frmPreferences: TfrmPreferences Left = 308 Height = 23 Top = 58 - Width = 127 + Width = 123 BorderSpacing.Top = 3 Caption = 'LoTW QSL sent' TabOrder = 26 @@ -1578,7 +1706,7 @@ object frmPreferences: TfrmPreferences Left = 308 Height = 23 Top = 84 - Width = 155 + Width = 151 BorderSpacing.Top = 3 Caption = 'LoTW QSL received' TabOrder = 27 @@ -1590,7 +1718,7 @@ object frmPreferences: TfrmPreferences Left = 308 Height = 23 Top = 110 - Width = 92 + Width = 89 BorderSpacing.Top = 3 Caption = 'Continent' TabOrder = 28 @@ -1602,7 +1730,7 @@ object frmPreferences: TfrmPreferences Left = 308 Height = 23 Top = 136 - Width = 119 + Width = 116 BorderSpacing.Top = 3 Caption = 'QSL sent date' TabOrder = 29 @@ -1614,7 +1742,7 @@ object frmPreferences: TfrmPreferences Left = 308 Height = 23 Top = 162 - Width = 147 + Width = 144 BorderSpacing.Top = 3 Caption = 'QSL received date' TabOrder = 30 @@ -1626,7 +1754,7 @@ object frmPreferences: TfrmPreferences Left = 308 Height = 23 Top = 188 - Width = 93 + Width = 91 BorderSpacing.Top = 3 Caption = 'eQSL sent' TabOrder = 31 @@ -1638,7 +1766,7 @@ object frmPreferences: TfrmPreferences Left = 308 Height = 23 Top = 214 - Width = 127 + Width = 124 BorderSpacing.Top = 3 Caption = 'eQSL sent date' TabOrder = 32 @@ -1650,7 +1778,7 @@ object frmPreferences: TfrmPreferences Left = 308 Height = 23 Top = 240 - Width = 121 + Width = 119 BorderSpacing.Top = 3 Caption = 'eQSL received' TabOrder = 33 @@ -1662,7 +1790,7 @@ object frmPreferences: TfrmPreferences Left = 308 Height = 23 Top = 266 - Width = 155 + Width = 152 BorderSpacing.Top = 3 Caption = 'eQSL received date' TabOrder = 34 @@ -1674,7 +1802,7 @@ object frmPreferences: TfrmPreferences Left = 308 Height = 23 Top = 292 - Width = 200 + Width = 196 BorderSpacing.Top = 3 Caption = 'Received QSL,LoTW,eQSL ' TabOrder = 35 @@ -1686,9 +1814,10 @@ object frmPreferences: TfrmPreferences Left = 329 Height = 17 Top = 315 - Width = 166 + Width = 169 BorderSpacing.Left = 21 Caption = '(all values in one column)' + ParentColor = False end object chkCountry: TCheckBox AnchorSideLeft.Control = chkDate @@ -1697,7 +1826,7 @@ object frmPreferences: TfrmPreferences Left = 18 Height = 23 Top = 318 - Width = 119 + Width = 118 BorderSpacing.Top = 3 Caption = 'Country name' TabOrder = 36 @@ -1709,7 +1838,7 @@ object frmPreferences: TfrmPreferences Left = 18 Height = 23 Top = 344 - Width = 110 + Width = 104 BorderSpacing.Top = 3 Caption = 'Propagation' TabOrder = 37 @@ -1721,7 +1850,7 @@ object frmPreferences: TfrmPreferences Left = 163 Height = 23 Top = 367 - Width = 122 + Width = 121 BorderSpacing.Top = 3 Caption = 'Satellite name' TabOrder = 38 @@ -1733,7 +1862,7 @@ object frmPreferences: TfrmPreferences Left = 163 Height = 23 Top = 393 - Width = 115 + Width = 113 BorderSpacing.Top = 3 Caption = 'RX frequency' TabOrder = 39 @@ -1745,7 +1874,7 @@ object frmPreferences: TfrmPreferences Left = 308 Height = 23 Top = 344 - Width = 119 + Width = 117 BorderSpacing.Top = 29 Caption = 'Contest name' TabOrder = 40 @@ -1757,7 +1886,7 @@ object frmPreferences: TfrmPreferences Left = 18 Height = 23 Top = 370 - Width = 116 + Width = 114 BorderSpacing.Top = 3 Caption = 'SerialNR sent' TabOrder = 41 @@ -1769,7 +1898,7 @@ object frmPreferences: TfrmPreferences Left = 18 Height = 23 Top = 396 - Width = 116 + Width = 114 BorderSpacing.Top = 3 Caption = 'SerialNR rcvd' TabOrder = 42 @@ -1781,7 +1910,7 @@ object frmPreferences: TfrmPreferences Left = 308 Height = 23 Top = 370 - Width = 121 + Width = 118 BorderSpacing.Top = 3 Caption = 'ContMSG sent' TabOrder = 43 @@ -1793,7 +1922,7 @@ object frmPreferences: TfrmPreferences Left = 308 Height = 23 Top = 396 - Width = 121 + Width = 118 BorderSpacing.Top = 3 Caption = 'ContMSG rcvd' TabOrder = 44 @@ -1816,7 +1945,7 @@ object frmPreferences: TfrmPreferences Left = 307 Height = 23 Top = 424 - Width = 97 + Width = 96 BorderSpacing.Top = 5 Caption = 'DARC DOK' TabOrder = 46 @@ -1828,276 +1957,394 @@ object frmPreferences: TfrmPreferences Left = 163 Height = 23 Top = 81 - Width = 89 + Width = 83 Caption = 'Operator' TabOrder = 47 end end object tabBands: TTabSheet Caption = 'Bands' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object cb136kHz: TCheckBox - Left = 14 + AnchorSideLeft.Control = tabBands + AnchorSideTop.Control = tabBands + Left = 16 Height = 23 - Top = 19 - Width = 78 + Top = 16 + Width = 79 + BorderSpacing.Left = 16 + BorderSpacing.Top = 16 Caption = '136 kHz' TabOrder = 0 end object cb160m: TCheckBox - Left = 14 + AnchorSideLeft.Control = cb136kHz + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = cb136kHz + Left = 111 Height = 23 - Top = 67 + Top = 16 Width = 79 + BorderSpacing.Left = 16 Caption = '1.8 MHz' TabOrder = 1 end object cb80m: TCheckBox - Left = 14 + AnchorSideLeft.Control = cb160m + AnchorSideTop.Control = cb160m + AnchorSideTop.Side = asrBottom + Left = 111 Height = 23 - Top = 99 + Top = 39 Width = 79 Caption = '3.5 MHz' TabOrder = 2 end object cb40m: TCheckBox - Left = 14 + AnchorSideLeft.Control = cb160m + AnchorSideTop.Control = cb60m + AnchorSideTop.Side = asrBottom + Left = 111 Height = 23 - Top = 163 + Top = 85 Width = 67 Caption = '7 MHz' TabOrder = 3 end object cb30m: TCheckBox - Left = 14 + AnchorSideLeft.Control = cb160m + AnchorSideTop.Control = cb40m + AnchorSideTop.Side = asrBottom + Left = 111 Height = 23 - Top = 195 + Top = 108 Width = 87 Caption = '10.1 MHz' TabOrder = 4 end object cb20m: TCheckBox - Left = 14 + AnchorSideLeft.Control = cb160m + AnchorSideTop.Control = cb30m + AnchorSideTop.Side = asrBottom + Left = 111 Height = 23 - Top = 227 + Top = 131 Width = 75 Caption = '14 MHz' TabOrder = 5 end object cb17m: TCheckBox - Left = 14 + AnchorSideLeft.Control = cb160m + AnchorSideTop.Control = cb20m + AnchorSideTop.Side = asrBottom + Left = 111 Height = 23 - Top = 259 + Top = 154 Width = 75 Caption = '18 MHz' TabOrder = 6 end object cb15m: TCheckBox - Left = 14 + AnchorSideLeft.Control = cb160m + AnchorSideTop.Control = cb17m + AnchorSideTop.Side = asrBottom + Left = 111 Height = 23 - Top = 291 + Top = 177 Width = 75 Caption = '21 MHz' TabOrder = 7 end object cb12m: TCheckBox - Left = 14 + AnchorSideLeft.Control = cb160m + AnchorSideTop.Control = cb15m + AnchorSideTop.Side = asrBottom + Left = 111 Height = 23 - Top = 323 + Top = 200 Width = 75 Caption = '24 MHz' TabOrder = 8 end object cb10m: TCheckBox - Left = 14 + AnchorSideLeft.Control = cb160m + AnchorSideTop.Control = cb12m + AnchorSideTop.Side = asrBottom + Left = 111 Height = 23 - Top = 355 + Top = 223 Width = 75 Caption = '28 MHz' TabOrder = 9 end object cb6m: TCheckBox - Left = 166 + AnchorSideLeft.Control = cb8m + AnchorSideTop.Control = cb8m + AnchorSideTop.Side = asrBottom + Left = 206 Height = 23 - Top = 67 + Top = 39 Width = 75 Caption = '50 MHz' TabOrder = 10 end object cb2m: TCheckBox - Left = 166 + AnchorSideLeft.Control = cb8m + AnchorSideTop.Control = cb4m + AnchorSideTop.Side = asrBottom + Left = 206 Height = 23 - Top = 131 + Top = 108 Width = 83 Caption = '144 MHz' TabOrder = 11 end object cb70cm: TCheckBox - Left = 166 + AnchorSideLeft.Control = cb8m + AnchorSideTop.Control = cb125m + AnchorSideTop.Side = asrBottom + Left = 206 Height = 23 - Top = 195 + Top = 154 Width = 83 Caption = '430 MHz' TabOrder = 12 end object cb23cm: TCheckBox - Left = 166 + AnchorSideLeft.Control = cb8m + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = cb8m + Left = 293 Height = 23 - Top = 259 + Top = 16 Width = 91 + BorderSpacing.Left = 16 Caption = '1260 MHz' TabOrder = 13 end object cb13cm: TCheckBox - Left = 166 + AnchorSideLeft.Control = cb23cm + AnchorSideTop.Control = cb23cm + AnchorSideTop.Side = asrBottom + Left = 293 Height = 23 - Top = 291 + Top = 39 Width = 91 Caption = '2300 MHz' TabOrder = 14 end object cb8cm: TCheckBox - Left = 166 + AnchorSideLeft.Control = cb23cm + AnchorSideTop.Control = cb13cm + AnchorSideTop.Side = asrBottom + Left = 293 Height = 23 - Top = 323 + Top = 62 Width = 91 Caption = '3400 MHz' TabOrder = 15 end object cb5cm: TCheckBox - Left = 166 + AnchorSideLeft.Control = cb23cm + AnchorSideTop.Control = cb8cm + AnchorSideTop.Side = asrBottom + Left = 293 Height = 23 - Top = 355 + Top = 85 Width = 91 Caption = '5650 MHz' TabOrder = 16 end object cb3cm: TCheckBox - Left = 310 + AnchorSideLeft.Control = cb23cm + AnchorSideTop.Control = cb5cm + AnchorSideTop.Side = asrBottom + Left = 293 Height = 23 - Top = 67 - Width = 72 + Top = 108 + Width = 73 Caption = '10 GHz' TabOrder = 17 end object cb1cm: TCheckBox - Left = 310 + AnchorSideLeft.Control = cb23cm + AnchorSideTop.Control = cb3cm + AnchorSideTop.Side = asrBottom + Left = 293 Height = 23 - Top = 99 - Width = 72 + Top = 131 + Width = 73 Caption = '24 GHz' TabOrder = 18 end object cb47GHz: TCheckBox - Left = 310 + AnchorSideLeft.Control = cb23cm + AnchorSideTop.Control = cb1cm + AnchorSideTop.Side = asrBottom + Left = 293 Height = 23 - Top = 131 - Width = 72 + Top = 154 + Width = 73 Caption = '47 GHz' TabOrder = 19 end object cb76GHz: TCheckBox - Left = 310 + AnchorSideLeft.Control = cb23cm + AnchorSideTop.Control = cb47GHz + AnchorSideTop.Side = asrBottom + Left = 293 Height = 23 - Top = 163 - Width = 72 + Top = 177 + Width = 73 Caption = '76 GHz' TabOrder = 20 end object cb122GHz: TCheckBox - Left = 310 + AnchorSideLeft.Control = cb23cm + AnchorSideTop.Control = cb76GHz + AnchorSideTop.Side = asrBottom + Left = 293 Height = 23 - Top = 195 - Width = 80 + Top = 200 + Width = 81 Caption = '122 GHz' TabOrder = 21 end object cb134GHz: TCheckBox - Left = 310 + AnchorSideLeft.Control = cb23cm + AnchorSideTop.Control = cb122GHz + AnchorSideTop.Side = asrBottom + Left = 293 Height = 23 - Top = 227 - Width = 80 + Top = 223 + Width = 81 Caption = '134 GHz' TabOrder = 22 end object cb241GHz: TCheckBox - Left = 310 + AnchorSideLeft.Control = cb23cm + AnchorSideTop.Control = cb134GHz + AnchorSideTop.Side = asrBottom + Left = 293 Height = 23 - Top = 259 - Width = 80 + Top = 246 + Width = 81 Caption = '241 GHz' TabOrder = 23 end object btnFrequencies: TButton - Left = 312 + AnchorSideLeft.Control = cb23cm + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = cb23cm + Left = 400 Height = 25 - Top = 362 + Top = 16 Width = 94 + BorderSpacing.Left = 16 BorderSpacing.InnerBorder = 4 Caption = 'Frequencies' OnClick = btnFrequenciesClick TabOrder = 24 end object cb4m: TCheckBox - Left = 166 + AnchorSideLeft.Control = cb8m + AnchorSideTop.Control = cb5m + AnchorSideTop.Side = asrBottom + Left = 206 Height = 23 - Top = 98 - Width = 72 + Top = 85 + Width = 71 Caption = '70MHz' TabOrder = 25 end object cb60m: TCheckBox - Left = 14 + AnchorSideLeft.Control = cb160m + AnchorSideTop.Control = cb80m + AnchorSideTop.Side = asrBottom + Left = 111 Height = 23 - Top = 131 + Top = 62 Width = 67 Caption = '5 MHz' TabOrder = 26 end object cb125m: TCheckBox - Left = 166 + AnchorSideLeft.Control = cb8m + AnchorSideTop.Control = cb2m + AnchorSideTop.Side = asrBottom + Left = 206 Height = 23 - Top = 162 + Top = 131 Width = 83 Caption = '220 MHz' TabOrder = 27 end object cb30cm: TCheckBox - Left = 166 + AnchorSideLeft.Control = cb8m + AnchorSideTop.Control = cb70cm + AnchorSideTop.Side = asrBottom + Left = 206 Height = 23 - Top = 227 + Top = 177 Width = 83 Caption = '900 MHz' TabOrder = 28 end object cb472kHz: TCheckBox - Left = 166 + AnchorSideLeft.Control = cb136kHz + AnchorSideTop.Control = cb136kHz + AnchorSideTop.Side = asrBottom + Left = 16 Height = 23 - Top = 19 - Width = 78 + Top = 39 + Width = 79 Caption = '472 kHz' TabOrder = 29 end + object cb5m: TCheckBox + AnchorSideLeft.Control = cb8m + AnchorSideTop.Control = cb6m + AnchorSideTop.Side = asrBottom + Left = 206 + Height = 23 + Top = 62 + Width = 71 + Caption = '60MHz' + TabOrder = 30 + end + object cb8m: TCheckBox + AnchorSideLeft.Control = cb160m + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = cb160m + Left = 206 + Height = 23 + Top = 16 + Width = 71 + BorderSpacing.Left = 16 + Caption = '40MHz' + TabOrder = 31 + end end object tabTRXcontrol: TTabSheet Caption = 'TRX control' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 + OnExit = cmbRadioNrCloseUp + OnShow = tabTRXcontrolEnter object btnChangeDefaultFreq: TButton - AnchorSideTop.Control = pgTRXControl + AnchorSideTop.Control = grbRadio AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = pgTRXControl AnchorSideRight.Side = asrBottom Left = 471 Height = 25 - Top = 566 + Top = 549 Width = 192 Anchors = [akTop, akRight] BorderSpacing.Top = 6 Caption = 'Change default frequencies' OnClick = btnChangeDefaultFreqClick - TabOrder = 0 + TabOrder = 4 end object btnSplit: TButton AnchorSideTop.Control = btnAddTrxMem @@ -2106,12 +2353,12 @@ object frmPreferences: TfrmPreferences AnchorSideRight.Side = asrBottom Left = 559 Height = 25 - Top = 616 + Top = 599 Width = 104 Anchors = [akTop, akRight] Caption = 'Split settings' OnClick = btnSplitClick - TabOrder = 1 + TabOrder = 6 end object grbRigctldPath: TGroupBox AnchorSideLeft.Control = tabTRXcontrol @@ -2123,19 +2370,20 @@ object frmPreferences: TfrmPreferences BorderSpacing.Left = 6 BorderSpacing.Top = 4 Caption = ' rigctld ' - ClientHeight = 86 + ClientHeight = 70 ClientWidth = 655 - TabOrder = 2 + TabOrder = 0 object lblRigctdPath: TLabel AnchorSideLeft.Control = grbRigctldPath AnchorSideTop.Control = grbRigctldPath Left = 6 Height = 17 Top = 6 - Width = 145 + Width = 139 BorderSpacing.Left = 6 BorderSpacing.Top = 6 Caption = 'Path to rigctld binary:' + ParentColor = False end object edtRigCtldPath: TEdit AnchorSideLeft.Control = lblRigctdPath @@ -2149,1189 +2397,30 @@ object frmPreferences: TfrmPreferences OnChange = TRXParamsChange TabOrder = 0 end - end - object pgTRXControl: TPageControl - AnchorSideLeft.Control = grbRigctldPath - AnchorSideTop.Control = grbRigctldPath - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = grbRigctldPath - AnchorSideRight.Side = asrBottom - Left = 6 - Height = 466 - Top = 94 - Width = 657 - ActivePage = tabTRX1 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 2 - TabIndex = 0 - TabOrder = 3 - object tabTRX1: TTabSheet - Caption = 'Radio one' - ClientHeight = 462 - ClientWidth = 647 - object grbRadio1: TGroupBox - AnchorSideLeft.Control = tabTRX1 - AnchorSideTop.Control = tabTRX1 - AnchorSideRight.Control = tabTRX1 - AnchorSideRight.Side = asrBottom - AnchorSideBottom.Control = tabTRX1 - AnchorSideBottom.Side = asrBottom - Left = 3 - Height = 456 - Top = 3 - Width = 641 - Anchors = [akTop, akLeft, akRight, akBottom] - BorderSpacing.Left = 3 - BorderSpacing.Top = 3 - BorderSpacing.Right = 3 - BorderSpacing.Bottom = 3 - Caption = ' Radio one, desc.:' - ClientHeight = 438 - ClientWidth = 639 - TabOrder = 0 - object lblDeviceR1: TLabel - AnchorSideLeft.Control = edtRadio1Name - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = lblModelR1 - Left = 226 - Height = 17 - Top = 37 - Width = 159 - BorderSpacing.Left = 6 - Caption = 'Device (e.g. /dev/ttyS0):' - end - object lblModelR1: TLabel - AnchorSideLeft.Control = grbRadio1 - AnchorSideTop.Control = edtRadio1Name - AnchorSideTop.Side = asrBottom - Left = 6 - Height = 17 - Top = 37 - Width = 73 - BorderSpacing.Left = 6 - BorderSpacing.Top = 3 - Caption = 'RIG model:' - end - object lblPollR1: TLabel - AnchorSideLeft.Control = edtR1Host - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = lblDeviceR1 - Left = 432 - Height = 17 - Top = 37 - Width = 61 - Caption = 'Poll rate:' - end - object edtR1Device: TEdit - AnchorSideLeft.Control = lblDeviceR1 - AnchorSideTop.Control = lblDeviceR1 - AnchorSideTop.Side = asrBottom - Left = 226 - Height = 34 - Top = 54 - Width = 173 - OnChange = TRXParamsChange - TabOrder = 0 - end - object edtPoll1: TEdit - AnchorSideLeft.Control = lblPollR1 - AnchorSideTop.Control = lblPollR1 - AnchorSideTop.Side = asrBottom - Left = 432 - Height = 34 - Top = 54 - Width = 80 - OnChange = TRXParamsChange - OnExit = edtPoll1Exit - TabOrder = 1 - end - object chkR1SendCWR: TCheckBox - AnchorSideLeft.Control = edtR1RigCtldArgs - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = lblExtra - Left = 273 - Height = 23 - Top = 91 - Width = 186 - BorderSpacing.Left = 12 - Caption = 'Use CWR instead of CW ' - OnChange = TRXParamsChange - TabOrder = 2 - end - object chkR1RunRigCtld: TCheckBox - AnchorSideLeft.Control = chkR1SendCWR - AnchorSideTop.Control = chkR1SendCWR - AnchorSideTop.Side = asrBottom - Left = 273 - Height = 23 - Top = 114 - Width = 241 - Caption = 'Run rigctld when program starts' - OnChange = TRXParamsChange - TabOrder = 3 - end - object lblExtra: TLabel - AnchorSideLeft.Control = lblModelR1 - AnchorSideTop.Control = cmbModelRig1 - AnchorSideTop.Side = asrBottom - Left = 6 - Height = 17 - Top = 91 - Width = 212 - BorderSpacing.Top = 3 - Caption = 'Extra command line arguments:' - end - object edtR1RigCtldArgs: TEdit - AnchorSideLeft.Control = lblModelR1 - AnchorSideTop.Control = lblExtra - AnchorSideTop.Side = asrBottom - Left = 6 - Height = 34 - Top = 108 - Width = 255 - OnChange = TRXParamsChange - TabOrder = 4 - end - object lblPortR1: TLabel - AnchorSideLeft.Control = edtPoll1 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = lblPollR1 - Left = 524 - Height = 17 - Top = 37 - Width = 89 - BorderSpacing.Left = 12 - Caption = 'Port number:' - end - object edtR1RigCtldPort: TEdit - AnchorSideLeft.Control = lblPortR1 - AnchorSideTop.Control = lblPortR1 - AnchorSideTop.Side = asrBottom - Left = 524 - Height = 34 - Top = 54 - Width = 80 - OnChange = TRXParamsChange - TabOrder = 5 - end - object grbSerialR1: TGroupBox - AnchorSideLeft.Control = lblModelR1 - AnchorSideTop.Control = edtR1RigCtldArgs - AnchorSideTop.Side = asrBottom - Left = 6 - Height = 148 - Top = 145 - Width = 511 - BorderSpacing.Top = 3 - Caption = 'Radio one serial parameters' - ClientHeight = 146 - ClientWidth = 509 - TabOrder = 6 - object lblSerialR1Spd: TLabel - AnchorSideLeft.Control = grbSerialR1 - AnchorSideTop.Control = grbSerialR1 - Left = 6 - Height = 17 - Top = 6 - Width = 86 - BorderSpacing.Left = 6 - BorderSpacing.Top = 6 - Caption = 'Serial speed:' - end - object lblserialR1DataBits: TLabel - AnchorSideLeft.Control = cmbDataBitsR1 - AnchorSideTop.Control = lblSerialR1Spd - Left = 125 - Height = 17 - Top = 6 - Width = 61 - Caption = 'Data bits' - end - object lblSerialR1Stop: TLabel - AnchorSideLeft.Control = cmbStopBitsR1 - AnchorSideTop.Control = lblSerialR1Spd - Left = 244 - Height = 17 - Top = 6 - Width = 61 - Caption = 'Stop bits' - end - object lblSerialR1Hand: TLabel - AnchorSideLeft.Control = lblSerialR1Spd - AnchorSideTop.Control = cmbSpeedR1 - AnchorSideTop.Side = asrBottom - Left = 6 - Height = 17 - Top = 70 - Width = 73 - BorderSpacing.Top = 6 - Caption = 'Handshake' - end - object lblSerialR1Parity: TLabel - AnchorSideLeft.Control = cmbParityR1 - AnchorSideTop.Control = lblSerialR1Spd - Left = 356 - Height = 17 - Top = 6 - Width = 40 - Caption = 'Parity' - end - object cmbHanshakeR1: TComboBox - AnchorSideLeft.Control = lblSerialR1Spd - AnchorSideTop.Control = lblSerialR1Hand - AnchorSideTop.Side = asrBottom - Left = 6 - Height = 29 - Top = 93 - Width = 107 - BorderSpacing.Top = 6 - ItemHeight = 0 - ItemIndex = 0 - Items.Strings = ( - 'default' - 'None' - 'XON/XOFF' - 'HARDWARE' - ) - OnChange = TRXParamsChange - Style = csDropDownList - TabOrder = 0 - Text = 'default' - end - object cmbParityR1: TComboBox - AnchorSideLeft.Control = cmbStopBitsR1 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = cmbSpeedR1 - Left = 356 - Height = 29 - Top = 35 - Width = 109 - BorderSpacing.Left = 12 - ItemHeight = 0 - ItemIndex = 0 - Items.Strings = ( - 'default' - 'None' - 'Odd' - 'Even' - 'Mark' - 'Space' - ) - OnChange = TRXParamsChange - Style = csDropDownList - TabOrder = 1 - Text = 'default' - end - object cmbDataBitsR1: TComboBox - AnchorSideLeft.Control = cmbSpeedR1 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = cmbSpeedR1 - Left = 125 - Height = 29 - Top = 35 - Width = 107 - BorderSpacing.Left = 12 - ItemHeight = 0 - ItemIndex = 0 - Items.Strings = ( - 'default' - '5' - '6' - '7' - '8' - '9' - ) - OnChange = TRXParamsChange - Style = csDropDownList - TabOrder = 2 - Text = 'default' - end - object cmbStopBitsR1: TComboBox - AnchorSideLeft.Control = cmbDataBitsR1 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = cmbSpeedR1 - Left = 244 - Height = 29 - Top = 35 - Width = 100 - BorderSpacing.Left = 12 - ItemHeight = 0 - ItemIndex = 0 - Items.Strings = ( - 'default' - '0' - '1' - '2' - '3' - ) - OnChange = TRXParamsChange - Style = csDropDownList - TabOrder = 3 - Text = 'default' - end - object cmbSpeedR1: TComboBox - AnchorSideLeft.Control = lblSerialR1Spd - AnchorSideTop.Control = lblSerialR1Spd - AnchorSideTop.Side = asrBottom - Left = 6 - Height = 29 - Top = 35 - Width = 107 - BorderSpacing.Top = 12 - ItemHeight = 0 - ItemIndex = 0 - Items.Strings = ( - 'default' - '1200' - '2400' - '4800' - '9600' - '14400' - '19200' - '38400' - '57600' - '115200' - ) - OnChange = TRXParamsChange - Style = csDropDownList - TabOrder = 4 - Text = 'default' - end - object cmbDTRR1: TComboBox - AnchorSideLeft.Control = cmbHanshakeR1 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = cmbHanshakeR1 - Left = 125 - Height = 29 - Top = 93 - Width = 107 - BorderSpacing.Left = 12 - ItemHeight = 0 - ItemIndex = 0 - Items.Strings = ( - 'default' - 'Unset' - 'ON' - 'OFF' - ) - OnChange = TRXParamsChange - Style = csDropDownList - TabOrder = 5 - Text = 'default' - end - object lblSerialR1Dtr: TLabel - AnchorSideLeft.Control = cmbDTRR1 - AnchorSideTop.Control = lblSerialR1Hand - Left = 125 - Height = 17 - Top = 70 - Width = 27 - Caption = 'DTR' - end - object cmbRTSR1: TComboBox - AnchorSideLeft.Control = cmbDTRR1 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = cmbDTRR1 - Left = 244 - Height = 29 - Top = 93 - Width = 100 - BorderSpacing.Left = 12 - ItemHeight = 0 - ItemIndex = 0 - Items.Strings = ( - 'default' - 'Unset' - 'ON' - 'OFF' - ) - OnChange = TRXParamsChange - Style = csDropDownList - TabOrder = 6 - Text = 'default' - end - object lblSerialR1Rts: TLabel - AnchorSideLeft.Control = cmbRTSR1 - AnchorSideTop.Control = lblSerialR1Hand - Left = 244 - Height = 17 - Top = 70 - Width = 25 - Caption = 'RTS' - end - end - object cmbModelRig1: TComboBox - AnchorSideLeft.Control = lblModelR1 - AnchorSideTop.Control = lblModelR1 - AnchorSideTop.Side = asrBottom - Left = 6 - Height = 34 - Top = 54 - Width = 200 - ItemHeight = 0 - OnChange = cmbModelRig1Change - TabOrder = 7 - end - object lblHost: TLabel - AnchorSideLeft.Control = edtRadio1Name - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = edtRadio1Name - Left = 260 - Height = 17 - Top = 0 - Width = 32 - BorderSpacing.Left = 40 - Caption = 'Host' - end - object edtRadio1Name: TEdit - AnchorSideLeft.Control = grbRadio1 - AnchorSideTop.Control = grbRadio1 - Left = 126 - Height = 34 - Top = 0 - Width = 94 - BorderSpacing.Left = 126 - OnChange = TRXParamsChange - TabOrder = 8 - end - object edtR1Host: TEdit - AnchorSideLeft.Control = lblHost - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = grbRadio1 - Left = 304 - Height = 34 - Top = 0 - Width = 128 - BorderSpacing.Left = 12 - OnChange = TRXParamsChange - TabOrder = 9 - end - object grpUsrCmds: TGroupBox - AnchorSideLeft.Control = grbRadio1 - AnchorSideTop.Control = grbSerialR1 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = grbRadio1 - AnchorSideRight.Side = asrBottom - AnchorSideBottom.Control = grbRadio1 - AnchorSideBottom.Side = asrBottom - Left = 6 - Height = 136 - Top = 296 - Width = 627 - Anchors = [akTop, akLeft, akRight, akBottom] - BorderSpacing.Left = 6 - BorderSpacing.Top = 3 - BorderSpacing.Right = 6 - BorderSpacing.Bottom = 6 - Caption = 'User defined TRX control buttons' - ClientHeight = 118 - ClientWidth = 625 - TabOrder = 10 - object lblUsr1R1: TLabel - AnchorSideLeft.Control = grpUsrCmds - AnchorSideTop.Control = edtUsr1R1 - AnchorSideTop.Side = asrCenter - Left = 3 - Height = 17 - Top = 9 - Width = 31 - BorderSpacing.Left = 3 - BorderSpacing.Top = 6 - Caption = 'Usr1' - end - object lblUsr2R1: TLabel - AnchorSideLeft.Control = lblUsr1R1 - AnchorSideTop.Control = edtUsr2R1 - AnchorSideTop.Side = asrCenter - Left = 3 - Height = 17 - Top = 43 - Width = 31 - Caption = 'Usr2' - end - object lblUsr3R1: TLabel - AnchorSideLeft.Control = lblUsr1R1 - AnchorSideTop.Control = edtUsr3R1 - AnchorSideTop.Side = asrCenter - Left = 3 - Height = 17 - Top = 77 - Width = 31 - Caption = 'Usr3' - end - object edtUsr1R1: TEdit - AnchorSideLeft.Control = edtUsr1R1Name - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = grpUsrCmds - AnchorSideRight.Control = grpUsrCmds - AnchorSideRight.Side = asrBottom - Left = 103 - Height = 34 - Top = 0 - Width = 510 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Left = 6 - BorderSpacing.Right = 12 - TabOrder = 0 - end - object edtUsr2R1: TEdit - AnchorSideLeft.Control = edtUsr1R1 - AnchorSideTop.Control = edtUsr1R1 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = edtUsr1R1 - AnchorSideRight.Side = asrBottom - Left = 103 - Height = 34 - Top = 34 - Width = 510 - Anchors = [akTop, akLeft, akRight] - TabOrder = 1 - end - object edtUsr3R1: TEdit - AnchorSideLeft.Control = edtUsr2R1 - AnchorSideTop.Control = edtUsr2R1 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = edtUsr2R1 - AnchorSideRight.Side = asrBottom - Left = 103 - Height = 34 - Top = 68 - Width = 510 - Anchors = [akTop, akLeft, akRight] - TabOrder = 2 - end - object edtUsr1R1Name: TEdit - AnchorSideLeft.Control = lblUsr1R1 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = grpUsrCmds - Left = 40 - Height = 34 - Top = 0 - Width = 57 - BorderSpacing.Left = 6 - MaxLength = 4 - TabOrder = 3 - end - object edtUsr2R1Name: TEdit - AnchorSideLeft.Control = edtUsr1R1Name - AnchorSideTop.Control = edtUsr1R1Name - AnchorSideTop.Side = asrBottom - Left = 40 - Height = 34 - Top = 34 - Width = 57 - MaxLength = 4 - TabOrder = 4 - end - object edtUsr3R1Name: TEdit - AnchorSideLeft.Control = edtUsr1R1Name - AnchorSideTop.Control = edtUsr2R1Name - AnchorSideTop.Side = asrBottom - Left = 40 - Height = 34 - Top = 68 - Width = 57 - MaxLength = 4 - TabOrder = 5 - end - end - object chkR1Vfo: TCheckBox - AnchorSideLeft.Control = edtR1RigCtldPort - AnchorSideTop.Control = chkR1SendCWR - AnchorSideTop.Side = asrCenter - Left = 524 - Height = 23 - Top = 91 - Width = 105 - Caption = 'Use \chkvfo' - Checked = True - OnChange = TRXParamsChange - State = cbChecked - TabOrder = 11 - end - end + object edtRigCount: TSpinEdit + AnchorSideLeft.Control = edtRigCtldPath + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtRigCtldPath + Left = 542 + Height = 34 + Top = 29 + Width = 50 + BorderSpacing.Left = 33 + MaxValue = 6 + MinValue = 1 + OnExit = edtRigCountChange + TabOrder = 1 + Value = 2 end - object tabTRX2: TTabSheet - Caption = 'Radio two' - ClientHeight = 462 - ClientWidth = 647 - object grbRadio2: TGroupBox - AnchorSideLeft.Control = tabTRX2 - AnchorSideTop.Control = tabTRX2 - AnchorSideRight.Control = tabTRX2 - AnchorSideRight.Side = asrBottom - AnchorSideBottom.Control = tabTRX2 - AnchorSideBottom.Side = asrBottom - Left = 3 - Height = 456 - Top = 3 - Width = 641 - Anchors = [akTop, akLeft, akRight, akBottom] - BorderSpacing.Left = 3 - BorderSpacing.Top = 3 - BorderSpacing.Right = 3 - BorderSpacing.Bottom = 3 - Caption = ' Radio two, desc.:' - ClientHeight = 438 - ClientWidth = 639 - TabOrder = 0 - object lblDevieR2: TLabel - AnchorSideLeft.Control = edtRadio2Name - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = lblModelR2 - Left = 226 - Height = 17 - Top = 37 - Width = 159 - BorderSpacing.Left = 6 - Caption = 'Device (e.g. /dev/ttyS0):' - end - object lblModelR2: TLabel - AnchorSideLeft.Control = grbRadio2 - AnchorSideTop.Control = edtRadio2Name - AnchorSideTop.Side = asrBottom - Left = 6 - Height = 17 - Top = 37 - Width = 73 - BorderSpacing.Left = 6 - BorderSpacing.Top = 3 - Caption = 'RIG model:' - end - object lblPollR2: TLabel - AnchorSideLeft.Control = edtR2Host - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = lblModelR2 - Left = 432 - Height = 17 - Top = 37 - Width = 61 - Caption = 'Poll rate:' - end - object edtR2Device: TEdit - AnchorSideLeft.Control = lblDevieR2 - AnchorSideTop.Control = cmbModelRig2 - Left = 226 - Height = 34 - Top = 54 - Width = 173 - OnChange = TRXParamsChange - TabOrder = 0 - end - object edtPoll2: TEdit - AnchorSideLeft.Control = lblPollR2 - AnchorSideTop.Control = edtR2Device - Left = 432 - Height = 34 - Top = 54 - Width = 80 - OnChange = TRXParamsChange - OnExit = edtPoll1Exit - TabOrder = 1 - end - object chkR2SendCWR: TCheckBox - AnchorSideLeft.Control = edtR2RigCtldArgs - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = lblExtra2 - Left = 273 - Height = 23 - Top = 91 - Width = 186 - BorderSpacing.Left = 12 - Caption = 'Use CWR instead of CW ' - OnChange = TRXParamsChange - TabOrder = 2 - end - object chkR2RunRigCtld: TCheckBox - AnchorSideLeft.Control = chkR2SendCWR - AnchorSideTop.Control = chkR2SendCWR - AnchorSideTop.Side = asrBottom - Left = 273 - Height = 23 - Top = 114 - Width = 241 - Caption = 'Run rigctld when program starts' - OnChange = TRXParamsChange - TabOrder = 3 - end - object lblExtra2: TLabel - AnchorSideLeft.Control = lblModelR2 - AnchorSideTop.Control = cmbModelRig2 - AnchorSideTop.Side = asrBottom - Left = 6 - Height = 17 - Top = 91 - Width = 212 - BorderSpacing.Top = 3 - Caption = 'Extra command line arguments:' - end - object edtR2RigCtldArgs: TEdit - AnchorSideLeft.Control = lblModelR2 - AnchorSideTop.Control = lblExtra2 - AnchorSideTop.Side = asrBottom - Left = 6 - Height = 34 - Top = 108 - Width = 255 - OnChange = TRXParamsChange - TabOrder = 4 - end - object lblPortR2: TLabel - AnchorSideLeft.Control = edtR2RigCtldPort - AnchorSideTop.Control = lblModelR2 - Left = 524 - Height = 17 - Top = 37 - Width = 89 - Caption = 'Port number:' - end - object edtR2RigCtldPort: TEdit - AnchorSideLeft.Control = edtPoll2 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = edtPoll2 - Left = 524 - Height = 34 - Top = 54 - Width = 80 - BorderSpacing.Left = 12 - OnChange = TRXParamsChange - TabOrder = 5 - end - object grbSerialR2: TGroupBox - AnchorSideLeft.Control = lblModelR2 - AnchorSideTop.Control = edtR2RigCtldArgs - AnchorSideTop.Side = asrBottom - Left = 6 - Height = 148 - Top = 145 - Width = 511 - BorderSpacing.Top = 3 - Caption = 'Radio two serial parameters' - ClientHeight = 146 - ClientWidth = 509 - TabOrder = 6 - object lblSerialR2Spd: TLabel - AnchorSideLeft.Control = grbSerialR2 - AnchorSideTop.Control = grbSerialR2 - Left = 6 - Height = 17 - Top = 6 - Width = 86 - BorderSpacing.Left = 6 - BorderSpacing.Top = 6 - Caption = 'Serial speed:' - end - object lblSerialR2DataBits: TLabel - AnchorSideLeft.Control = cmbDataBitsR2 - AnchorSideTop.Control = lblSerialR2Spd - Left = 125 - Height = 17 - Top = 6 - Width = 61 - Caption = 'Data bits' - end - object lblSerialR2Stop: TLabel - AnchorSideLeft.Control = cmbStopBitsR2 - AnchorSideTop.Control = lblSerialR2Spd - Left = 244 - Height = 17 - Top = 6 - Width = 61 - Caption = 'Stop bits' - end - object lblSerialR2Hand: TLabel - AnchorSideLeft.Control = cmbSpeedR2 - AnchorSideTop.Control = cmbSpeedR2 - AnchorSideTop.Side = asrBottom - Left = 6 - Height = 17 - Top = 70 - Width = 73 - BorderSpacing.Top = 6 - Caption = 'Handshake' - end - object lblSerialR2Parity: TLabel - AnchorSideLeft.Control = cmbParityR2 - AnchorSideTop.Control = lblSerialR2Spd - Left = 356 - Height = 17 - Top = 6 - Width = 40 - Caption = 'Parity' - end - object cmbHanshakeR2: TComboBox - AnchorSideLeft.Control = lblSerialR2Hand - AnchorSideTop.Control = lblSerialR2Hand - AnchorSideTop.Side = asrBottom - Left = 6 - Height = 29 - Top = 93 - Width = 107 - BorderSpacing.Top = 6 - ItemHeight = 0 - ItemIndex = 0 - Items.Strings = ( - 'default' - 'None' - 'XON/XOFF' - 'HARDWARE' - ) - OnChange = TRXParamsChange - Style = csDropDownList - TabOrder = 0 - Text = 'default' - end - object cmbParityR2: TComboBox - AnchorSideLeft.Control = cmbStopBitsR2 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = cmbStopBitsR2 - Left = 356 - Height = 29 - Top = 35 - Width = 109 - BorderSpacing.Left = 12 - ItemHeight = 0 - ItemIndex = 0 - Items.Strings = ( - 'default' - 'None' - 'Odd' - 'Even' - 'Mark' - 'Space' - ) - OnChange = TRXParamsChange - Style = csDropDownList - TabOrder = 1 - Text = 'default' - end - object cmbDataBitsR2: TComboBox - AnchorSideLeft.Control = cmbSpeedR2 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = cmbSpeedR2 - Left = 125 - Height = 29 - Top = 35 - Width = 107 - BorderSpacing.Left = 12 - ItemHeight = 0 - ItemIndex = 0 - Items.Strings = ( - 'default' - '5' - '6' - '7' - '8' - '9' - ) - OnChange = TRXParamsChange - Style = csDropDownList - TabOrder = 2 - Text = 'default' - end - object cmbStopBitsR2: TComboBox - AnchorSideLeft.Control = cmbDataBitsR2 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = cmbDataBitsR2 - Left = 244 - Height = 29 - Top = 35 - Width = 100 - BorderSpacing.Left = 12 - ItemHeight = 0 - ItemIndex = 0 - Items.Strings = ( - 'default' - '0' - '1' - '2' - '3' - ) - OnChange = TRXParamsChange - Style = csDropDownList - TabOrder = 3 - Text = 'default' - end - object cmbSpeedR2: TComboBox - AnchorSideLeft.Control = lblSerialR2Spd - AnchorSideTop.Control = lblSerialR2Spd - AnchorSideTop.Side = asrBottom - Left = 6 - Height = 29 - Top = 35 - Width = 107 - BorderSpacing.Top = 12 - ItemHeight = 0 - ItemIndex = 0 - Items.Strings = ( - 'default' - '1200' - '2400' - '4800' - '9600' - '14400' - '19200' - '38400' - '57600' - '115200' - ) - OnChange = TRXParamsChange - Style = csDropDownList - TabOrder = 4 - Text = 'default' - end - object cmbDTRR2: TComboBox - AnchorSideLeft.Control = cmbHanshakeR2 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = cmbHanshakeR2 - Left = 125 - Height = 29 - Top = 93 - Width = 107 - BorderSpacing.Left = 12 - ItemHeight = 0 - ItemIndex = 0 - Items.Strings = ( - 'default' - 'Unset' - 'ON' - 'OFF' - ) - OnChange = TRXParamsChange - Style = csDropDownList - TabOrder = 5 - Text = 'default' - end - object lblSerialR2Dtr: TLabel - AnchorSideLeft.Control = cmbDTRR2 - AnchorSideTop.Control = lblSerialR2Hand - Left = 125 - Height = 17 - Top = 70 - Width = 27 - Caption = 'DTR' - end - object cmbRTSR2: TComboBox - AnchorSideLeft.Control = cmbDTRR2 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = cmbDTRR2 - Left = 244 - Height = 29 - Top = 93 - Width = 100 - BorderSpacing.Left = 12 - ItemHeight = 0 - ItemIndex = 0 - Items.Strings = ( - 'default' - 'Unset' - 'ON' - 'OFF' - ) - OnChange = TRXParamsChange - Style = csDropDownList - TabOrder = 6 - Text = 'default' - end - object lblSerialr2Rts: TLabel - AnchorSideLeft.Control = cmbRTSR2 - AnchorSideTop.Control = lblSerialR2Hand - Left = 244 - Height = 17 - Top = 70 - Width = 25 - Caption = 'RTS' - end - end - object cmbModelRig2: TComboBox - AnchorSideLeft.Control = lblModelR2 - AnchorSideTop.Control = lblModelR2 - AnchorSideTop.Side = asrBottom - Left = 6 - Height = 34 - Top = 54 - Width = 200 - ItemHeight = 0 - OnChange = cmbModelRig2Change - TabOrder = 7 - end - object edtRadio2Name: TEdit - AnchorSideLeft.Control = grbRadio2 - AnchorSideTop.Control = grbRadio2 - Left = 126 - Height = 34 - Top = 0 - Width = 94 - BorderSpacing.Left = 126 - OnChange = TRXParamsChange - TabOrder = 8 - end - object edtR2Host: TEdit - AnchorSideLeft.Control = lblHost2 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = edtRadio2Name - Left = 304 - Height = 34 - Top = 0 - Width = 128 - BorderSpacing.Left = 12 - OnChange = TRXParamsChange - TabOrder = 9 - end - object lblHost2: TLabel - AnchorSideLeft.Control = edtRadio2Name - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = edtR2Host - Left = 260 - Height = 17 - Top = 0 - Width = 32 - BorderSpacing.Left = 40 - Caption = 'Host' - end - object grpUsrCmds1: TGroupBox - AnchorSideLeft.Control = grbRadio2 - AnchorSideTop.Control = grbSerialR2 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = grbRadio2 - AnchorSideRight.Side = asrBottom - AnchorSideBottom.Control = grbRadio2 - AnchorSideBottom.Side = asrBottom - Left = 6 - Height = 136 - Top = 296 - Width = 627 - Anchors = [akTop, akLeft, akRight, akBottom] - BorderSpacing.Left = 6 - BorderSpacing.Top = 3 - BorderSpacing.Right = 6 - BorderSpacing.Bottom = 6 - Caption = 'User defined TRX control buttons' - ClientHeight = 118 - ClientWidth = 625 - TabOrder = 10 - object lblUsr1R2: TLabel - AnchorSideLeft.Control = grpUsrCmds1 - AnchorSideTop.Control = edtUsr1R2 - AnchorSideTop.Side = asrCenter - Left = 3 - Height = 17 - Top = 9 - Width = 31 - BorderSpacing.Left = 3 - BorderSpacing.Top = 6 - Caption = 'Usr1' - end - object lblUsr2R2: TLabel - AnchorSideLeft.Control = lblUsr1R2 - AnchorSideTop.Control = edtUsr2R2 - AnchorSideTop.Side = asrCenter - Left = 3 - Height = 17 - Top = 43 - Width = 31 - Caption = 'Usr2' - end - object lblUsr3R2: TLabel - AnchorSideLeft.Control = lblUsr1R2 - AnchorSideTop.Control = edtUsr3R2 - AnchorSideTop.Side = asrCenter - Left = 3 - Height = 17 - Top = 77 - Width = 31 - Caption = 'Usr3' - end - object edtUsr1R2: TEdit - AnchorSideLeft.Control = edtUsr1R2Name - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = grpUsrCmds1 - AnchorSideRight.Control = grpUsrCmds1 - AnchorSideRight.Side = asrBottom - Left = 103 - Height = 34 - Top = 0 - Width = 510 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Left = 6 - BorderSpacing.Right = 12 - TabOrder = 0 - end - object edtUsr2R2: TEdit - AnchorSideLeft.Control = edtUsr1R2 - AnchorSideTop.Control = edtUsr1R2 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = edtUsr1R2 - AnchorSideRight.Side = asrBottom - Left = 103 - Height = 34 - Top = 34 - Width = 510 - Anchors = [akTop, akLeft, akRight] - TabOrder = 1 - end - object edtUsr3R2: TEdit - AnchorSideLeft.Control = edtUsr2R2 - AnchorSideTop.Control = edtUsr2R2 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = edtUsr2R2 - AnchorSideRight.Side = asrBottom - Left = 103 - Height = 34 - Top = 68 - Width = 510 - Anchors = [akTop, akLeft, akRight] - TabOrder = 2 - end - object edtUsr1R2Name: TEdit - AnchorSideLeft.Control = lblUsr1R2 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = grpUsrCmds1 - Left = 40 - Height = 34 - Top = 0 - Width = 57 - BorderSpacing.Left = 6 - MaxLength = 4 - TabOrder = 3 - end - object edtUsr2R2Name: TEdit - AnchorSideLeft.Control = edtUsr1R2Name - AnchorSideTop.Control = edtUsr1R2Name - AnchorSideTop.Side = asrBottom - Left = 40 - Height = 34 - Top = 34 - Width = 57 - MaxLength = 4 - TabOrder = 4 - end - object edtUsr3R2Name: TEdit - AnchorSideLeft.Control = edtUsr2R2Name - AnchorSideTop.Control = edtUsr2R2Name - AnchorSideTop.Side = asrBottom - Left = 40 - Height = 34 - Top = 68 - Width = 57 - MaxLength = 4 - TabOrder = 5 - end - end - object chkR2Vfo: TCheckBox - AnchorSideLeft.Control = edtR2RigCtldPort - AnchorSideTop.Control = chkR2SendCWR - Left = 524 - Height = 23 - Top = 91 - Width = 105 - Caption = 'Use \chkvfo' - Checked = True - OnChange = TRXParamsChange - State = cbChecked - TabOrder = 11 - end - end + object lblNrOfRadios: TLabel + AnchorSideLeft.Control = edtRigCount + AnchorSideTop.Control = lblRigctdPath + Left = 542 + Height = 17 + Top = 6 + Width = 76 + Caption = 'Nr of radios' + ParentColor = False end end object chkTrxControlDebug: TCheckBox @@ -3340,10 +2429,10 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrCenter Left = 18 Height = 23 - Top = 592 - Width = 300 + Top = 575 + Width = 298 Caption = 'Show communication with TRX in console' - TabOrder = 4 + TabOrder = 3 end object lblDebug: TLabel AnchorSideLeft.Control = chkTrxControlDebug @@ -3351,9 +2440,10 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrCenter Left = 18 Height = 17 - Top = 620 - Width = 400 + Top = 603 + Width = 397 Caption = 'You have to run cqrlog in console to see the debug messages' + ParentColor = False end object chkModeRelatedOnly: TCheckBox AnchorSideLeft.Control = tabTRXcontrol @@ -3361,11 +2451,11 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrCenter Left = 18 Height = 23 - Top = 567 - Width = 327 + Top = 550 + Width = 322 BorderSpacing.Left = 18 Caption = 'Switch only between mode related memories' - TabOrder = 5 + TabOrder = 2 end object btnAddTrxMem: TButton AnchorSideTop.Control = btnChangeDefaultFreq @@ -3374,17 +2464,742 @@ object frmPreferences: TfrmPreferences AnchorSideRight.Side = asrBottom Left = 472 Height = 25 - Top = 591 + Top = 574 Width = 191 Anchors = [akTop, akRight] Caption = 'Add/Modify memory' OnClick = btnAddTrxMemClick - TabOrder = 6 + TabOrder = 5 + end + object grbRadio: TGroupBox + AnchorSideLeft.Control = grbRigctldPath + AnchorSideTop.Control = grbRigctldPath + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = grbRigctldPath + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Side = asrBottom + Left = 6 + Height = 445 + Top = 98 + Width = 657 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 6 + ClientHeight = 443 + ClientWidth = 655 + TabOrder = 1 + object lblDeviceR: TLabel + AnchorSideLeft.Control = cmbModelRig + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = lblModelR + Left = 236 + Height = 17 + Top = 59 + Width = 157 + BorderSpacing.Left = 30 + Caption = 'Device (e.g. /dev/ttyS0):' + ParentColor = False + end + object lblModelR: TLabel + AnchorSideLeft.Control = grbRadio + AnchorSideTop.Control = cmbRadioNr + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 17 + Top = 59 + Width = 72 + BorderSpacing.Left = 6 + BorderSpacing.Top = 5 + Caption = 'RIG model:' + ParentColor = False + end + object lblPollR: TLabel + AnchorSideLeft.Control = edtRDevice + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = lblDeviceR + Left = 439 + Height = 17 + Top = 59 + Width = 58 + BorderSpacing.Left = 30 + Caption = 'Poll rate:' + ParentColor = False + end + object edtRDevice: TEdit + AnchorSideLeft.Control = lblDeviceR + AnchorSideTop.Control = lblDeviceR + AnchorSideTop.Side = asrBottom + Left = 236 + Height = 34 + Hint = 'Device that commacts rig. It can be /dev/ttyXXXX or /dev/serial/by-id/XXXXXXXXXXX'#10'or if rig has eternet connection IPaddress:port (10.11.12.13:1234)' + Top = 76 + Width = 173 + OnChange = TRXParamsChange + ParentShowHint = False + ShowHint = True + TabOrder = 4 + end + object edtPoll: TEdit + AnchorSideLeft.Control = lblPollR + AnchorSideTop.Control = lblPollR + AnchorSideTop.Side = asrBottom + Left = 439 + Height = 34 + Hint = 'How often rig is polled (in MIlliseconds). Suitable value is around 500-3000'#10'This also effects how fast changes made with TRXControl will show up.' + Top = 76 + Width = 80 + MaxLength = 5 + NumbersOnly = True + OnChange = TRXParamsChange + OnExit = edtPollExit + ParentShowHint = False + ShowHint = True + TabOrder = 5 + Text = '500' + end + object chkRSendCWR: TCheckBox + AnchorSideLeft.Control = edtRRigCtldArgs + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = lblExtra + Left = 273 + Height = 23 + Top = 113 + Width = 185 + BorderSpacing.Left = 12 + Caption = 'Use CWR instead of CW ' + OnChange = TRXParamsChange + TabOrder = 8 + end + object chkRunRigCtld: TCheckBox + AnchorSideLeft.Control = chkRSendCWR + AnchorSideTop.Control = chkRSendCWR + AnchorSideTop.Side = asrBottom + Left = 273 + Height = 23 + Hint = 'Cqrlog will start rigctld if checked. This is not needed when rigctld runs on'#10'other PC, or is started separately, or emulator (sdr rig, flrig, WFview...etc.)'#10'is used.' + Top = 136 + Width = 235 + Caption = 'Run rigctld when program starts' + OnChange = TRXParamsChange + ParentShowHint = False + ShowHint = True + TabOrder = 9 + end + object lblExtra: TLabel + AnchorSideLeft.Control = lblModelR + AnchorSideTop.Control = cmbModelRig + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 17 + Top = 113 + Width = 209 + BorderSpacing.Top = 3 + Caption = 'Extra command line arguments:' + ParentColor = False + end + object edtRRigCtldArgs: TEdit + AnchorSideLeft.Control = lblModelR + AnchorSideTop.Control = lblExtra + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 34 + Hint = 'Extra arguments for rigctld command line that do not belong in TRXConrol tab''s'#10'setting. These could be for example "--vfo", "-vvvvv" etc.' + Top = 130 + Width = 255 + OnChange = TRXParamsChange + ParentShowHint = False + ShowHint = True + TabOrder = 7 + end + object lblPortR: TLabel + AnchorSideLeft.Control = edtPoll + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = lblPollR + Left = 549 + Height = 17 + Top = 59 + Width = 84 + BorderSpacing.Left = 30 + Caption = 'Port number:' + ParentColor = False + end + object edtRRigCtldPort: TEdit + AnchorSideLeft.Control = lblPortR + AnchorSideTop.Control = lblPortR + AnchorSideTop.Side = asrBottom + Left = 549 + Height = 34 + Top = 76 + Width = 80 + MaxLength = 5 + NumbersOnly = True + OnChange = TRXParamsChange + TabOrder = 6 + Text = '4532' + end + object grbSerialR: TGroupBox + AnchorSideLeft.Control = lblModelR + AnchorSideTop.Control = edtRRigCtldArgs + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 148 + Top = 167 + Width = 511 + BorderSpacing.Top = 3 + Caption = 'Radio one serial parameters' + ClientHeight = 130 + ClientWidth = 509 + TabOrder = 11 + object lblSerialRSpd: TLabel + AnchorSideLeft.Control = grbSerialR + AnchorSideTop.Control = grbSerialR + Left = 6 + Height = 17 + Top = 6 + Width = 84 + BorderSpacing.Left = 6 + BorderSpacing.Top = 6 + Caption = 'Serial speed:' + ParentColor = False + end + object lblserialRDataBits: TLabel + AnchorSideLeft.Control = cmbDataBitsR + AnchorSideTop.Control = lblSerialRSpd + Left = 125 + Height = 17 + Top = 6 + Width = 59 + Caption = 'Data bits' + ParentColor = False + end + object lblSerialRStop: TLabel + AnchorSideLeft.Control = cmbStopBitsR + AnchorSideTop.Control = lblSerialRSpd + Left = 244 + Height = 17 + Top = 6 + Width = 57 + Caption = 'Stop bits' + ParentColor = False + end + object lblSerialRHand: TLabel + AnchorSideLeft.Control = lblSerialRSpd + AnchorSideTop.Control = cmbSpeedR + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 17 + Top = 70 + Width = 72 + BorderSpacing.Top = 6 + Caption = 'Handshake' + ParentColor = False + end + object lblSerialRParity: TLabel + AnchorSideLeft.Control = cmbParityR + AnchorSideTop.Control = lblSerialRSpd + Left = 356 + Height = 17 + Top = 6 + Width = 38 + Caption = 'Parity' + ParentColor = False + end + object cmbHanshakeR: TComboBox + AnchorSideLeft.Control = lblSerialRSpd + AnchorSideTop.Control = lblSerialRHand + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 29 + Top = 93 + Width = 107 + BorderSpacing.Top = 6 + ItemHeight = 0 + ItemIndex = 0 + Items.Strings = ( + 'default' + 'None' + 'XON/XOFF' + 'HARDWARE' + ) + OnChange = TRXParamsChange + Style = csDropDownList + TabOrder = 4 + Text = 'default' + end + object cmbParityR: TComboBox + AnchorSideLeft.Control = cmbStopBitsR + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = cmbSpeedR + Left = 356 + Height = 29 + Top = 35 + Width = 109 + BorderSpacing.Left = 12 + ItemHeight = 0 + ItemIndex = 0 + Items.Strings = ( + 'default' + 'None' + 'Odd' + 'Even' + 'Mark' + 'Space' + ) + OnChange = TRXParamsChange + Style = csDropDownList + TabOrder = 3 + Text = 'default' + end + object cmbDataBitsR: TComboBox + AnchorSideLeft.Control = cmbSpeedR + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = cmbSpeedR + Left = 125 + Height = 29 + Top = 35 + Width = 107 + BorderSpacing.Left = 12 + ItemHeight = 0 + ItemIndex = 0 + Items.Strings = ( + 'default' + '5' + '6' + '7' + '8' + '9' + ) + OnChange = TRXParamsChange + Style = csDropDownList + TabOrder = 1 + Text = 'default' + end + object cmbStopBitsR: TComboBox + AnchorSideLeft.Control = cmbDataBitsR + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = cmbSpeedR + Left = 244 + Height = 29 + Top = 35 + Width = 100 + BorderSpacing.Left = 12 + ItemHeight = 0 + ItemIndex = 0 + Items.Strings = ( + 'default' + '0' + '1' + '2' + '3' + ) + OnChange = TRXParamsChange + Style = csDropDownList + TabOrder = 2 + Text = 'default' + end + object cmbSpeedR: TComboBox + AnchorSideLeft.Control = lblSerialRSpd + AnchorSideTop.Control = lblSerialRSpd + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 29 + Top = 35 + Width = 107 + BorderSpacing.Top = 12 + ItemHeight = 0 + ItemIndex = 0 + Items.Strings = ( + 'default' + '1200' + '2400' + '4800' + '9600' + '14400' + '19200' + '38400' + '57600' + '115200' + ) + OnChange = TRXParamsChange + Style = csDropDownList + TabOrder = 0 + Text = 'default' + end + object cmbDTRR: TComboBox + AnchorSideLeft.Control = cmbHanshakeR + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = cmbHanshakeR + Left = 125 + Height = 29 + Top = 93 + Width = 107 + BorderSpacing.Left = 12 + ItemHeight = 0 + ItemIndex = 0 + Items.Strings = ( + 'default' + 'Unset' + 'ON' + 'OFF' + ) + OnChange = TRXParamsChange + Style = csDropDownList + TabOrder = 5 + Text = 'default' + end + object lblSerialRDtr: TLabel + AnchorSideLeft.Control = cmbDTRR + AnchorSideTop.Control = lblSerialRHand + Left = 125 + Height = 17 + Top = 70 + Width = 27 + Caption = 'DTR' + ParentColor = False + end + object cmbRTSR: TComboBox + AnchorSideLeft.Control = cmbDTRR + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = cmbDTRR + Left = 244 + Height = 29 + Top = 93 + Width = 100 + BorderSpacing.Left = 12 + ItemHeight = 0 + ItemIndex = 0 + Items.Strings = ( + 'default' + 'Unset' + 'ON' + 'OFF' + ) + OnChange = TRXParamsChange + Style = csDropDownList + TabOrder = 6 + Text = 'default' + end + object lblSerialRRts: TLabel + AnchorSideLeft.Control = cmbRTSR + AnchorSideTop.Control = lblSerialRHand + Left = 244 + Height = 17 + Top = 70 + Width = 25 + Caption = 'RTS' + ParentColor = False + end + end + object cmbModelRig: TComboBox + AnchorSideLeft.Control = lblModelR + AnchorSideTop.Control = lblModelR + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 34 + Top = 76 + Width = 200 + ItemHeight = 0 + OnChange = cmbModelRigChange + TabOrder = 3 + end + object lblHost: TLabel + AnchorSideLeft.Control = edtRHost + AnchorSideTop.Control = lblRName + Left = 439 + Height = 17 + Top = 3 + Width = 30 + BorderSpacing.Right = 6 + Caption = 'Host' + ParentColor = False + end + object edtRadioName: TEdit + AnchorSideLeft.Control = edtRDevice + AnchorSideTop.Control = lblRName + AnchorSideTop.Side = asrBottom + AnchorSideRight.Side = asrBottom + Left = 236 + Height = 34 + Hint = 'Name of rig. This will show up in radio selector.' + Top = 20 + Width = 100 + OnChange = TRXParamsChange + ParentShowHint = False + ShowHint = True + TabOrder = 1 + end + object edtRHost: TEdit + AnchorSideLeft.Control = edtPoll + AnchorSideTop.Control = edtRadioName + AnchorSideRight.Side = asrBottom + Left = 439 + Height = 34 + Hint = 'IP address of rinnig rigctld or emulator. Usually "127.0.0.1" or "localhost"' + Top = 20 + Width = 128 + OnChange = TRXParamsChange + ParentShowHint = False + ShowHint = True + TabOrder = 2 + end + object grpUsrCmds: TGroupBox + AnchorSideLeft.Control = grbRadio + AnchorSideTop.Control = grbSerialR + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = grbRadio + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = grbRadio + AnchorSideBottom.Side = asrBottom + Left = 6 + Height = 119 + Top = 318 + Width = 643 + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Left = 6 + BorderSpacing.Top = 3 + BorderSpacing.Right = 6 + BorderSpacing.Bottom = 6 + Caption = 'User defined TRX control buttons' + ClientHeight = 101 + ClientWidth = 641 + TabOrder = 12 + object lblUsr1R: TLabel + AnchorSideLeft.Control = grpUsrCmds + AnchorSideTop.Control = edtUsr1R + AnchorSideTop.Side = asrCenter + Left = 3 + Height = 17 + Top = 9 + Width = 30 + BorderSpacing.Left = 3 + BorderSpacing.Top = 6 + Caption = 'Usr1' + ParentColor = False + end + object lblUsr2R: TLabel + AnchorSideLeft.Control = lblUsr1R + AnchorSideTop.Control = edtUsr2R + AnchorSideTop.Side = asrCenter + Left = 3 + Height = 17 + Top = 43 + Width = 30 + Caption = 'Usr2' + ParentColor = False + end + object lblUsr3R: TLabel + AnchorSideLeft.Control = lblUsr1R + AnchorSideTop.Control = edtUsr3R + AnchorSideTop.Side = asrCenter + Left = 3 + Height = 17 + Top = 77 + Width = 30 + Caption = 'Usr3' + ParentColor = False + end + object edtUsr1R: TEdit + AnchorSideLeft.Control = edtUsr1RName + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = grpUsrCmds + AnchorSideRight.Control = grpUsrCmds + AnchorSideRight.Side = asrBottom + Left = 102 + Height = 34 + Top = 0 + Width = 527 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Left = 6 + BorderSpacing.Right = 12 + TabOrder = 1 + end + object edtUsr2R: TEdit + AnchorSideLeft.Control = edtUsr1R + AnchorSideTop.Control = edtUsr1R + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = edtUsr1R + AnchorSideRight.Side = asrBottom + Left = 102 + Height = 34 + Top = 34 + Width = 527 + Anchors = [akTop, akLeft, akRight] + TabOrder = 3 + end + object edtUsr3R: TEdit + AnchorSideLeft.Control = edtUsr2R + AnchorSideTop.Control = edtUsr2R + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = edtUsr2R + AnchorSideRight.Side = asrBottom + Left = 102 + Height = 34 + Top = 68 + Width = 527 + Anchors = [akTop, akLeft, akRight] + TabOrder = 5 + end + object edtUsr1RName: TEdit + AnchorSideLeft.Control = lblUsr1R + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = grpUsrCmds + Left = 39 + Height = 34 + Top = 0 + Width = 57 + BorderSpacing.Left = 6 + MaxLength = 4 + TabOrder = 0 + end + object edtUsr2RName: TEdit + AnchorSideLeft.Control = edtUsr1RName + AnchorSideTop.Control = edtUsr1RName + AnchorSideTop.Side = asrBottom + Left = 39 + Height = 34 + Top = 34 + Width = 57 + MaxLength = 4 + TabOrder = 2 + end + object edtUsr3RName: TEdit + AnchorSideLeft.Control = edtUsr1RName + AnchorSideTop.Control = edtUsr2RName + AnchorSideTop.Side = asrBottom + Left = 39 + Height = 34 + Top = 68 + Width = 57 + MaxLength = 4 + TabOrder = 4 + end + end + object chkRVfo: TCheckBox + AnchorSideLeft.Control = grbSerialR + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = chkRSendCWR + AnchorSideTop.Side = asrCenter + Left = 520 + Height = 23 + Hint = 'Check if rigctld has started with --vfo parameter. '#10'if response is 1 the polling command format should be'#10'changed from "+f +m +v" to "+f currVFO +m currVFO +v"'#10'And also some other Hamlib commands need "currVFO" then.' + Top = 113 + Width = 103 + BorderSpacing.Left = 3 + Caption = 'Use \chkvfo' + Checked = True + OnChange = TRXParamsChange + ParentShowHint = False + ShowHint = True + State = cbChecked + TabOrder = 10 + end + object cmbRadioNr: TComboBox + AnchorSideLeft.Control = grbRadio + AnchorSideTop.Control = lblRName + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 33 + Top = 21 + Width = 120 + BorderSpacing.Left = 6 + BorderSpacing.Top = 1 + ItemHeight = 0 + OnChange = cmbRadioNrChange + OnCloseUp = cmbRadioNrCloseUp + Style = csDropDownList + TabOrder = 0 + end + object lblRName: TLabel + AnchorSideLeft.Control = edtRadioName + AnchorSideTop.Control = grbRadio + Left = 236 + Height = 17 + Top = 3 + Width = 39 + BorderSpacing.Top = 3 + BorderSpacing.Right = 6 + Caption = 'Name' + ParentColor = False + end + object chkRPwrOn: TCheckBox + AnchorSideLeft.Control = chkRVfo + AnchorSideTop.Control = chkRVfo + AnchorSideTop.Side = asrBottom + Left = 520 + Height = 23 + Hint = 'When checked Power_ON command will be sent when initializing rig.'#10'This is done with extra rigctld command line argument "-C auto_power_on=1"' + Top = 136 + Width = 131 + Caption = 'Rig pwr ON cmd' + Checked = True + OnChange = TRXParamsChange + ParentShowHint = False + ShowHint = True + State = cbChecked + TabOrder = 13 + end + object lblRadio: TLabel + AnchorSideLeft.Control = cmbRadioNr + AnchorSideTop.Control = grbRadio + Left = 6 + Height = 17 + Top = 3 + Width = 37 + BorderSpacing.Top = 3 + Caption = 'Radio' + ParentColor = False + end + object chkUTC2R: TCheckBox + AnchorSideLeft.Control = chkRPwrOn + AnchorSideTop.Control = chkRPwrOn + AnchorSideTop.Side = asrBottom + Left = 520 + Height = 23 + Hint = 'Send UTC time from PC to rig via Hamlib command.'#10'Sending occurs once after rigctld start.' + Top = 159 + Width = 120 + Caption = 'Set UTC to Rig' + OnChange = TRXParamsChange + ParentShowHint = False + ShowHint = True + TabOrder = 14 + end + object chkCPollR: TCheckBox + AnchorSideLeft.Control = chkRPwrOn + AnchorSideTop.Control = chkVoiceR + AnchorSideTop.Side = asrBottom + Left = 520 + Height = 23 + Hint = 'Default rig poll is compound +f +m +v as one command.'#10'Unchecking this breaks compound and every single '#10'command is sent as own line.'#10'This may help poor rigctld emulators like WFview to work.' + Top = 205 + Width = 124 + Caption = 'Compound poll' + Checked = True + OnChange = TRXParamsChange + ParentShowHint = False + ShowHint = True + State = cbChecked + TabOrder = 15 + end + object chkVoiceR: TCheckBox + AnchorSideLeft.Control = chkRPwrOn + AnchorSideTop.Control = chkUTC2R + AnchorSideTop.Side = asrBottom + Left = 520 + Height = 23 + Hint = 'When in phone modes launch rig''s voice memories'#10'via rigctld command instead of starting voice_keyer'#10'script. (Rig must support \send_voice_mem command)' + Top = 182 + Width = 118 + Caption = 'Send rig voice' + OnChange = TRXParamsChange + ParentShowHint = False + ShowHint = True + TabOrder = 16 + end end end object TabROTcontrol: TTabSheet Caption = 'ROT control' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object GroupBox41: TGroupBox AnchorSideLeft.Control = TabROTcontrol @@ -3396,7 +3211,7 @@ object frmPreferences: TfrmPreferences BorderSpacing.Left = 6 BorderSpacing.Top = 6 Caption = ' rotctld ' - ClientHeight = 86 + ClientHeight = 70 ClientWidth = 655 TabOrder = 0 object Label124: TLabel @@ -3405,10 +3220,11 @@ object frmPreferences: TfrmPreferences Left = 6 Height = 17 Top = 6 - Width = 148 + Width = 140 BorderSpacing.Left = 6 BorderSpacing.Top = 6 Caption = 'Path to rotctld binary:' + ParentColor = False end object edtRotCtldPath: TEdit AnchorSideLeft.Control = Label124 @@ -3443,7 +3259,7 @@ object frmPreferences: TfrmPreferences AnchorSideBottom.Control = pgROTControl AnchorSideBottom.Side = asrBottom Caption = 'Rotor one' - ClientHeight = 388 + ClientHeight = 361 ClientWidth = 647 object gbRot1: TGroupBox AnchorSideLeft.Control = tabRot1 @@ -3455,7 +3271,7 @@ object frmPreferences: TfrmPreferences BorderSpacing.Left = 6 BorderSpacing.Top = 12 Caption = ' Rotor one, desc.:' - ClientHeight = 339 + ClientHeight = 323 ClientWidth = 622 TabOrder = 0 object lblDevice1: TLabel @@ -3464,8 +3280,9 @@ object frmPreferences: TfrmPreferences Left = 218 Height = 17 Top = 18 - Width = 159 + Width = 157 Caption = 'Device (e.g. /dev/ttyS0):' + ParentColor = False end object lblRotId1: TLabel AnchorSideLeft.Control = gbRot1 @@ -3473,10 +3290,11 @@ object frmPreferences: TfrmPreferences Left = 6 Height = 17 Top = 18 - Width = 95 + Width = 94 BorderSpacing.Left = 6 BorderSpacing.Top = 18 Caption = 'ROT ID model:' + ParentColor = False end object lblPoll1: TLabel AnchorSideLeft.Control = edtRot1Poll @@ -3484,8 +3302,9 @@ object frmPreferences: TfrmPreferences Left = 438 Height = 17 Top = 18 - Width = 61 + Width = 58 Caption = 'Poll rate:' + ParentColor = False end object edtRot1Device: TEdit AnchorSideLeft.Control = cmbModelRot1 @@ -3508,9 +3327,11 @@ object frmPreferences: TfrmPreferences Top = 35 Width = 80 BorderSpacing.Left = 12 + MaxLength = 5 + NumbersOnly = True OnChange = RotorParamsChange - OnExit = edtPoll1Exit TabOrder = 1 + Text = '500' end object chkRot1RunRotCtld: TCheckBox AnchorSideLeft.Control = edtRot1RotCtldArgs @@ -3519,7 +3340,7 @@ object frmPreferences: TfrmPreferences Left = 285 Height = 23 Top = 81 - Width = 244 + Width = 236 BorderSpacing.Left = 24 Caption = 'Run rotctld when program starts' OnChange = RotorParamsChange @@ -3532,9 +3353,10 @@ object frmPreferences: TfrmPreferences Left = 6 Height = 17 Top = 81 - Width = 212 + Width = 209 BorderSpacing.Top = 12 Caption = 'Extra command line arguments:' + ParentColor = False end object edtRot1RotCtldArgs: TEdit AnchorSideLeft.Control = lblRotId1 @@ -3554,8 +3376,9 @@ object frmPreferences: TfrmPreferences Left = 530 Height = 17 Top = 18 - Width = 89 + Width = 84 Caption = 'Port number:' + ParentColor = False end object edtRot1RotCtldPort: TEdit AnchorSideLeft.Control = edtRot1Poll @@ -3566,8 +3389,11 @@ object frmPreferences: TfrmPreferences Top = 35 Width = 80 BorderSpacing.Left = 12 + MaxLength = 5 + NumbersOnly = True OnChange = RotorParamsChange TabOrder = 4 + Text = '4533' end object grbSerialRot1: TGroupBox AnchorSideLeft.Control = gbRot1 @@ -3577,14 +3403,14 @@ object frmPreferences: TfrmPreferences AnchorSideBottom.Side = asrBottom Left = 6 Height = 161 - Top = 172 + Top = 156 Width = 610 Anchors = [akLeft, akRight, akBottom] BorderSpacing.Left = 6 BorderSpacing.Right = 6 BorderSpacing.Bottom = 6 Caption = 'Rotor one serial parameters' - ClientHeight = 159 + ClientHeight = 143 ClientWidth = 608 TabOrder = 5 object lblSpeed1: TLabel @@ -3593,10 +3419,11 @@ object frmPreferences: TfrmPreferences Left = 6 Height = 17 Top = 6 - Width = 86 + Width = 84 BorderSpacing.Left = 6 BorderSpacing.Top = 6 Caption = 'Serial speed:' + ParentColor = False end object lblDataBits1: TLabel AnchorSideLeft.Control = cmbDataBitsRot1 @@ -3604,8 +3431,9 @@ object frmPreferences: TfrmPreferences Left = 137 Height = 17 Top = 6 - Width = 61 + Width = 59 Caption = 'Data bits' + ParentColor = False end object lblStopBits1: TLabel AnchorSideLeft.Control = cmbStopBitsRot1 @@ -3613,8 +3441,9 @@ object frmPreferences: TfrmPreferences Left = 268 Height = 17 Top = 6 - Width = 61 + Width = 57 Caption = 'Stop bits' + ParentColor = False end object lblHandshake1: TLabel AnchorSideLeft.Control = lblSpeed1 @@ -3623,9 +3452,10 @@ object frmPreferences: TfrmPreferences Left = 6 Height = 17 Top = 76 - Width = 73 + Width = 72 BorderSpacing.Top = 24 Caption = 'Handshake' + ParentColor = False end object lblParity1: TLabel AnchorSideLeft.Control = cmbParityRot1 @@ -3633,8 +3463,9 @@ object frmPreferences: TfrmPreferences Left = 392 Height = 17 Top = 6 - Width = 40 + Width = 38 Caption = 'Parity' + ParentColor = False end object cmbHanshakeRot1: TComboBox AnchorSideLeft.Control = lblSpeed1 @@ -3785,6 +3616,7 @@ object frmPreferences: TfrmPreferences Top = 76 Width = 27 Caption = 'DTR' + ParentColor = False end object cmbRTSRot1: TComboBox AnchorSideLeft.Control = cmbDTRRot1 @@ -3816,6 +3648,7 @@ object frmPreferences: TfrmPreferences Top = 76 Width = 25 Caption = 'RTS' + ParentColor = False end end object cmbModelRot1: TComboBox @@ -3828,7 +3661,6 @@ object frmPreferences: TfrmPreferences ItemHeight = 0 OnChange = cmbModelRot1Change TabOrder = 6 - Text = '' end object chkRot1AzMinMax: TCheckBox AnchorSideLeft.Control = chkRot1RunRotCtld @@ -3837,7 +3669,7 @@ object frmPreferences: TfrmPreferences Left = 285 Height = 23 Top = 104 - Width = 289 + Width = 276 Caption = 'Use rotctrld \dump:state info for limits' OnChange = RotorParamsChange TabOrder = 7 @@ -3890,7 +3722,7 @@ object frmPreferences: TfrmPreferences AnchorSideBottom.Control = tabRot1 AnchorSideBottom.Side = asrBottom Caption = 'Rotor two' - ClientHeight = 388 + ClientHeight = 361 ClientWidth = 647 object gbRot2: TGroupBox AnchorSideLeft.Control = tabRot2 @@ -3911,8 +3743,9 @@ object frmPreferences: TfrmPreferences Left = 218 Height = 17 Top = 18 - Width = 159 + Width = 157 Caption = 'Device (e.g. /dev/ttyS0):' + ParentColor = False end object lblRotId2: TLabel AnchorSideLeft.Control = gbRot2 @@ -3920,10 +3753,11 @@ object frmPreferences: TfrmPreferences Left = 6 Height = 17 Top = 18 - Width = 95 + Width = 94 BorderSpacing.Left = 6 BorderSpacing.Top = 18 Caption = 'ROT ID model:' + ParentColor = False end object lblPoll2: TLabel AnchorSideLeft.Control = edtRot2Poll @@ -3931,8 +3765,9 @@ object frmPreferences: TfrmPreferences Left = 438 Height = 17 Top = 18 - Width = 61 + Width = 58 Caption = 'Poll rate:' + ParentColor = False end object edtRot2Device: TEdit AnchorSideLeft.Control = cmbModelRot2 @@ -3955,9 +3790,11 @@ object frmPreferences: TfrmPreferences Top = 35 Width = 80 BorderSpacing.Left = 12 + MaxLength = 5 + NumbersOnly = True OnChange = RotorParamsChange - OnExit = edtPoll1Exit TabOrder = 1 + Text = '500' end object chkRot2RunRotCtld: TCheckBox AnchorSideLeft.Control = edtRot2RotCtldArgs @@ -3966,7 +3803,7 @@ object frmPreferences: TfrmPreferences Left = 285 Height = 23 Top = 81 - Width = 244 + Width = 236 BorderSpacing.Left = 24 Caption = 'Run rotctld when program starts' OnChange = RotorParamsChange @@ -3979,9 +3816,10 @@ object frmPreferences: TfrmPreferences Left = 6 Height = 17 Top = 81 - Width = 212 + Width = 209 BorderSpacing.Top = 12 Caption = 'Extra command line arguments:' + ParentColor = False end object edtRot2RotCtldArgs: TEdit AnchorSideLeft.Control = lblRotId2 @@ -4001,8 +3839,9 @@ object frmPreferences: TfrmPreferences Left = 530 Height = 17 Top = 18 - Width = 89 + Width = 84 Caption = 'Port number:' + ParentColor = False end object edtRot2RotCtldPort: TEdit AnchorSideLeft.Control = edtRot2Poll @@ -4013,8 +3852,11 @@ object frmPreferences: TfrmPreferences Top = 35 Width = 80 BorderSpacing.Left = 12 + MaxLength = 5 + NumbersOnly = True OnChange = RotorParamsChange TabOrder = 4 + Text = '4533' end object grbSerialRot2: TGroupBox AnchorSideLeft.Control = gbRot2 @@ -4040,10 +3882,11 @@ object frmPreferences: TfrmPreferences Left = 6 Height = 17 Top = 6 - Width = 86 + Width = 84 BorderSpacing.Left = 6 BorderSpacing.Top = 6 Caption = 'Serial speed:' + ParentColor = False end object lblDataBits2: TLabel AnchorSideLeft.Control = cmbDataBitsRot2 @@ -4051,8 +3894,9 @@ object frmPreferences: TfrmPreferences Left = 137 Height = 17 Top = 6 - Width = 61 + Width = 59 Caption = 'Data bits' + ParentColor = False end object lblStopBits2: TLabel AnchorSideLeft.Control = cmbStopBitsRot2 @@ -4060,8 +3904,9 @@ object frmPreferences: TfrmPreferences Left = 268 Height = 17 Top = 6 - Width = 61 + Width = 57 Caption = 'Stop bits' + ParentColor = False end object lblHandshake2: TLabel AnchorSideLeft.Control = lblSpeed2 @@ -4070,9 +3915,10 @@ object frmPreferences: TfrmPreferences Left = 6 Height = 17 Top = 76 - Width = 73 + Width = 72 BorderSpacing.Top = 24 Caption = 'Handshake' + ParentColor = False end object lblParity2: TLabel AnchorSideLeft.Control = cmbParityRot2 @@ -4080,8 +3926,9 @@ object frmPreferences: TfrmPreferences Left = 392 Height = 17 Top = 6 - Width = 40 + Width = 38 Caption = 'Parity' + ParentColor = False end object cmbHanshakeRot2: TComboBox AnchorSideLeft.Control = lblHandshake2 @@ -4232,6 +4079,7 @@ object frmPreferences: TfrmPreferences Top = 76 Width = 27 Caption = 'DTR' + ParentColor = False end object cmbRTSRot2: TComboBox AnchorSideLeft.Control = cmbDTRRot2 @@ -4263,6 +4111,7 @@ object frmPreferences: TfrmPreferences Top = 76 Width = 25 Caption = 'RTS' + ParentColor = False end end object cmbModelRot2: TComboBox @@ -4276,7 +4125,6 @@ object frmPreferences: TfrmPreferences ItemHeight = 0 OnChange = cmbModelRot2Change TabOrder = 6 - Text = '' end object chkRot2AzMinMax: TCheckBox AnchorSideLeft.Control = chkRot2RunRotCtld @@ -4285,7 +4133,7 @@ object frmPreferences: TfrmPreferences Left = 285 Height = 23 Top = 104 - Width = 289 + Width = 276 Caption = 'Use rotctrld \dump:state info for limits' OnChange = RotorParamsChange TabOrder = 7 @@ -4335,25 +4183,29 @@ object frmPreferences: TfrmPreferences end object tabModes: TTabSheet Caption = 'Modes' - ClientHeight = 621 - ClientWidth = 845 - object GroupBox35: TGroupBox + ClientHeight = 722 + ClientWidth = 836 + OnExit = tabModesExit + object grpUsrDigitalModes: TGroupBox AnchorSideLeft.Control = tabModes - AnchorSideTop.Control = GroupBox39 + AnchorSideTop.Control = grbRigBandWidths AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = grbRigBandWidths + AnchorSideRight.Side = asrBottom Left = 12 Height = 73 - Top = 266 - Width = 561 + Top = 328 + Width = 524 + Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 12 BorderSpacing.Top = 24 Caption = ' User defined digital modes (use , as delimitter)' ClientHeight = 55 - ClientWidth = 559 + ClientWidth = 522 TabOrder = 0 object edtDigiModes: TEdit - AnchorSideLeft.Control = GroupBox35 - AnchorSideTop.Control = GroupBox35 + AnchorSideLeft.Control = grpUsrDigitalModes + AnchorSideTop.Control = grpUsrDigitalModes Left = 6 Height = 34 Top = 6 @@ -4361,490 +4213,373 @@ object frmPreferences: TfrmPreferences BorderSpacing.Left = 6 BorderSpacing.Top = 6 CharCase = ecUppercase + OnExit = edtDigiModesExit TabOrder = 0 end end - object GroupBox37: TGroupBox + object grbRigBandWidths: TGroupBox AnchorSideLeft.Control = tabModes AnchorSideTop.Control = tabModes Left = 12 - Height = 230 + Height = 292 Top = 12 - Width = 208 + Width = 524 BorderSpacing.Left = 12 BorderSpacing.Top = 12 - Caption = ' Radio one ' - ClientHeight = 212 - ClientWidth = 206 + Caption = ' Radio' + ClientHeight = 274 + ClientWidth = 522 TabOrder = 1 - object Label28: TLabel - AnchorSideLeft.Control = GroupBox37 - AnchorSideTop.Control = GroupBox37 + object lblMode: TLabel + AnchorSideLeft.Control = grbRigBandWidths + AnchorSideTop.Control = cmbRadioModes + AnchorSideTop.Side = asrBottom Left = 12 Height = 17 - Top = 12 + Top = 40 Width = 36 BorderSpacing.Left = 12 - BorderSpacing.Top = 12 + BorderSpacing.Top = 6 Caption = 'Mode' ParentColor = False end - object Label29: TLabel - AnchorSideLeft.Control = Label28 + object lblBandWidth: TLabel + AnchorSideLeft.Control = lblMode AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = Label28 + AnchorSideTop.Control = lblMode Left = 81 Height = 17 - Top = 12 + Top = 40 Width = 69 BorderSpacing.Left = 33 Caption = 'Bandwidth' ParentColor = False end - object Label30: TLabel - AnchorSideLeft.Control = Label28 - AnchorSideTop.Control = edtCW1 + object lblCWbw: TLabel + AnchorSideLeft.Control = lblMode + AnchorSideTop.Control = edtCW AnchorSideTop.Side = asrCenter Left = 12 Height = 17 - Top = 45 + Top = 66 Width = 22 Caption = 'CW' ParentColor = False end - object edtCW1: TSpinEdit - AnchorSideLeft.Control = Label29 - AnchorSideTop.Control = Label29 - AnchorSideRight.Control = Label29 + object edtCW: TSpinEdit + AnchorSideLeft.Control = lblBandWidth + AnchorSideTop.Control = lblBandWidth + AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 81 Height = 34 - Top = 36 - Width = 69 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 24 + Top = 57 + Width = 90 + AutoSize = False Increment = 50 MaxValue = 100000 MinValue = -1 TabOrder = 0 Value = 500 end - object Label35: TLabel - AnchorSideLeft.Control = edtCW1 + object lblCWHz: TLabel + AnchorSideLeft.Control = edtCW AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = edtCW1 + AnchorSideTop.Control = edtCW AnchorSideTop.Side = asrCenter - Left = 156 + Left = 177 Height = 17 - Top = 45 + Top = 66 Width = 17 BorderSpacing.Left = 6 Caption = 'Hz' ParentColor = False end - object Label36: TLabel - AnchorSideLeft.Control = Label35 - AnchorSideTop.Control = edtSSB1 + object lblSSBHz: TLabel + AnchorSideLeft.Control = lblCWHz + AnchorSideTop.Control = edtSSB AnchorSideTop.Side = asrCenter - Left = 156 + Left = 177 Height = 17 - Top = 79 + Top = 100 Width = 17 Caption = 'Hz' ParentColor = False end - object edtSSB1: TSpinEdit - AnchorSideLeft.Control = edtCW1 - AnchorSideTop.Control = edtCW1 + object edtSSB: TSpinEdit + AnchorSideLeft.Control = edtCW + AnchorSideTop.Control = edtCW AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = edtCW1 AnchorSideRight.Side = asrBottom Left = 81 Height = 34 - Top = 70 - Width = 69 - Anchors = [akTop, akLeft, akRight] + Top = 91 + Width = 90 + AutoSize = False Increment = 50 MaxValue = 100000 MinValue = -1 TabOrder = 1 Value = 1800 end - object Label31: TLabel - AnchorSideLeft.Control = Label28 - AnchorSideTop.Control = edtSSB1 + object lblSSBBw: TLabel + AnchorSideLeft.Control = lblMode + AnchorSideTop.Control = edtSSB AnchorSideTop.Side = asrCenter Left = 12 Height = 17 - Top = 79 + Top = 100 Width = 25 Caption = 'SSB' ParentColor = False end - object Label32: TLabel - AnchorSideLeft.Control = Label28 - AnchorSideTop.Control = edtRTTY1 + object lblDataBw: TLabel + AnchorSideLeft.Control = lblMode + AnchorSideTop.Control = edtData AnchorSideTop.Side = asrCenter Left = 12 Height = 17 - Top = 113 - Width = 33 - Caption = 'RTTY' + Top = 134 + Width = 31 + Caption = 'Data' ParentColor = False end - object edtRTTY1: TSpinEdit - AnchorSideLeft.Control = edtCW1 - AnchorSideTop.Control = edtSSB1 + object edtData: TSpinEdit + AnchorSideLeft.Control = edtCW + AnchorSideTop.Control = edtSSB AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = edtCW1 AnchorSideRight.Side = asrBottom Left = 81 Height = 34 - Top = 104 - Width = 69 - Anchors = [akTop, akLeft, akRight] + Top = 125 + Width = 90 + AutoSize = False Increment = 50 MaxValue = 100000 MinValue = -1 TabOrder = 2 Value = 500 end - object Label37: TLabel - AnchorSideLeft.Control = Label35 - AnchorSideTop.Control = edtRTTY1 + object lblDataHz: TLabel + AnchorSideLeft.Control = lblCWHz + AnchorSideTop.Control = edtData AnchorSideTop.Side = asrCenter - Left = 156 + Left = 177 Height = 17 - Top = 104 + Top = 134 + Width = 17 + Anchors = [akTop, akLeft, akRight] + Caption = 'Hz' + ParentColor = False + end + object lblAMHz: TLabel + AnchorSideLeft.Control = lblCWHz + AnchorSideTop.Control = edtAM + AnchorSideTop.Side = asrCenter + Left = 177 + Height = 17 + Top = 168 Width = 17 Caption = 'Hz' ParentColor = False end - object Label38: TLabel - AnchorSideLeft.Control = Label35 - AnchorSideTop.Control = edtAM1 - AnchorSideTop.Side = asrCenter - Left = 156 - Height = 17 - Top = 147 - Width = 17 - Caption = 'Hz' - ParentColor = False - end - object edtAM1: TSpinEdit - AnchorSideLeft.Control = edtCW1 - AnchorSideTop.Control = edtRTTY1 + object edtAM: TSpinEdit + AnchorSideLeft.Control = edtCW + AnchorSideTop.Control = edtData AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = edtCW1 AnchorSideRight.Side = asrBottom Left = 81 Height = 34 - Top = 138 - Width = 69 - Anchors = [akTop, akLeft, akRight] + Top = 159 + Width = 90 + AutoSize = False Increment = 100 MaxValue = 100000 MinValue = -1 TabOrder = 3 Value = 3000 end - object Label33: TLabel - AnchorSideLeft.Control = Label28 - AnchorSideTop.Control = edtAM1 + object lblAMBw: TLabel + AnchorSideLeft.Control = lblMode + AnchorSideTop.Control = edtAM AnchorSideTop.Side = asrCenter Left = 12 Height = 17 - Top = 147 + Top = 168 Width = 21 Caption = 'AM' ParentColor = False end - object Label34: TLabel - AnchorSideLeft.Control = Label28 - AnchorSideTop.Control = edtFM1 + object lblFMBw: TLabel + AnchorSideLeft.Control = lblMode + AnchorSideTop.Control = edtFM AnchorSideTop.Side = asrCenter Left = 12 Height = 17 - Top = 181 + Top = 202 Width = 20 Caption = 'FM' ParentColor = False end - object edtFM1: TSpinEdit - AnchorSideLeft.Control = edtCW1 - AnchorSideTop.Control = edtAM1 + object edtFM: TSpinEdit + AnchorSideLeft.Control = edtCW + AnchorSideTop.Control = edtAM AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = edtCW1 AnchorSideRight.Side = asrBottom Left = 81 Height = 34 - Top = 172 - Width = 69 - Anchors = [akTop, akLeft, akRight] + Top = 193 + Width = 90 + AutoSize = False Increment = 100 MaxValue = 100000 MinValue = -1 TabOrder = 4 Value = 2500 end - object Label39: TLabel - AnchorSideLeft.Control = Label35 - AnchorSideTop.Control = edtFM1 + object lblFMHz: TLabel + AnchorSideLeft.Control = lblCWHz + AnchorSideTop.Control = edtFM AnchorSideTop.Side = asrCenter - Left = 156 + Left = 177 Height = 17 - Top = 181 + Top = 202 Width = 17 Caption = 'Hz' ParentColor = False end - end - object GroupBox39: TGroupBox - AnchorSideLeft.Control = GroupBox37 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = tabModes - Left = 232 - Height = 230 - Top = 12 - Width = 208 - BorderSpacing.Left = 12 - BorderSpacing.Top = 12 - Caption = ' Radio two ' - ClientHeight = 212 - ClientWidth = 206 - TabOrder = 2 - object Label110: TLabel - AnchorSideLeft.Control = GroupBox39 - AnchorSideTop.Control = GroupBox39 + object cmbRadioModes: TComboBox + AnchorSideLeft.Control = grbRigBandWidths + AnchorSideTop.Control = grbRigBandWidths Left = 12 - Height = 17 - Top = 12 - Width = 36 + Height = 33 + Top = 1 + Width = 120 BorderSpacing.Left = 12 - BorderSpacing.Top = 12 - Caption = 'Mode' + BorderSpacing.Top = 1 + ItemHeight = 0 + OnChange = cmbRadioModesChange + OnCloseUp = cmbRadioModesCloseUp + ReadOnly = True + Style = csDropDownList + TabOrder = 7 + end + object lblDataMode: TLabel + AnchorSideLeft.Control = lblCWHz + AnchorSideTop.Control = lblMode + Left = 207 + Height = 17 + Top = 40 + Width = 31 + BorderSpacing.Left = 30 + Caption = 'Data' ParentColor = False end - object Label113: TLabel - AnchorSideLeft.Control = Label110 + object lblLogDataMode: TLabel + AnchorSideLeft.Control = lblDataMode + AnchorSideTop.Control = edtCW + AnchorSideTop.Side = asrCenter + Left = 207 + Height = 17 + Top = 66 + Width = 63 + Caption = 'Log Mode' + ParentColor = False + end + object lblRigDataCmd: TLabel + AnchorSideLeft.Control = lblLogDataMode + AnchorSideTop.Control = lblSSBHz + AnchorSideTop.Side = asrCenter + Left = 207 + Height = 17 + Top = 100 + Width = 58 + Caption = 'CAT cmd' + ParentColor = False + end + object lblDataMode1: TLabel + AnchorSideLeft.Control = lblDataMode AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = Label110 - Left = 81 + AnchorSideTop.Control = lblMode + Left = 280 Height = 17 - Top = 12 - Width = 69 - BorderSpacing.Left = 33 - Caption = 'Bandwidth' + Top = 40 + Width = 40 + BorderSpacing.Left = 42 + Caption = 'Mode ' ParentColor = False end - object Label114: TLabel - AnchorSideLeft.Control = Label110 - AnchorSideTop.Control = edtCW2 + object edtDataCmd: TEdit + AnchorSideLeft.Control = cmbDataMode + AnchorSideTop.Control = lblRigDataCmd AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 45 - Width = 22 - Caption = 'CW' - ParentColor = False - end - object edtCW2: TSpinEdit - AnchorSideLeft.Control = Label113 - AnchorSideTop.Control = Label113 - AnchorSideRight.Control = Label113 - AnchorSideRight.Side = asrBottom - Left = 81 + Left = 280 Height = 34 - Top = 36 - Width = 69 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 24 - Increment = 50 - MaxValue = 100000 - MinValue = -1 - TabOrder = 0 - Value = 500 + Hint = '"CAT cmd" is the rigctld mode command needed to'#10'send to rig for working "Log mode" qsos.' + Top = 91 + Width = 100 + AutoSize = False + OnChange = edtDataCmdChange + ParentShowHint = False + ShowHint = True + TabOrder = 8 end - object Label115: TLabel - AnchorSideLeft.Control = edtCW2 + object lblNoRigForMode: TLabel + AnchorSideLeft.Control = cmbRadioModes AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = edtCW2 + AnchorSideTop.Control = cmbRadioModes AnchorSideTop.Side = asrCenter - Left = 156 + Left = 144 Height = 17 - Top = 45 - Width = 17 - BorderSpacing.Left = 6 - Caption = 'Hz' + Top = 9 + Width = 207 + BorderSpacing.Left = 12 + Caption = 'There is no radio definition' + Font.Color = clRed + Font.Style = [fsBold] ParentColor = False + ParentFont = False + Visible = False end - object Label116: TLabel - AnchorSideLeft.Control = Label115 - AnchorSideTop.Control = edtSSB2 + object chkModeReverse: TCheckBox + AnchorSideLeft.Control = lblRigDataCmd + AnchorSideTop.Control = lblDataHz AnchorSideTop.Side = asrCenter - Left = 156 - Height = 17 - Top = 79 - Width = 17 - Caption = 'Hz' - ParentColor = False + Left = 207 + Height = 23 + Hint = 'Cheking this will cause Cqrlog to set selected "Log mode" if'#10'rigctld reads this mode from rig and NewQSO/Auto is checked.'#10#10'This can be a pitfall if your "Log mode" needs for ex. USB mode'#10'from rig. Then when working phone qso using USB your log gets'#10'mode as "Log mode". '#10'Normally when using remote modes and get mode from remote'#10'program this does not need to be checked.' + Top = 131 + Width = 205 + BorderSpacing.Top = 5 + Caption = 'Use also reverse (cat->log)' + ParentShowHint = False + ShowHint = True + TabOrder = 5 end - object edtSSB2: TSpinEdit - AnchorSideLeft.Control = Label113 - AnchorSideTop.Control = edtCW2 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Label113 - AnchorSideRight.Side = asrBottom - Left = 81 + object cmbDataMode: TComboBox + AnchorSideLeft.Control = lblDataMode1 + AnchorSideTop.Control = edtCW + Left = 280 Height = 34 - Top = 70 - Width = 69 - Anchors = [akTop, akLeft, akRight] - Increment = 50 - MaxValue = 100000 - MinValue = -1 - TabOrder = 1 - Value = 1800 - end - object Label117: TLabel - AnchorSideLeft.Control = Label110 - AnchorSideTop.Control = edtSSB2 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 79 - Width = 25 - Caption = 'SSB' - ParentColor = False - end - object Label118: TLabel - AnchorSideLeft.Control = Label110 - AnchorSideTop.Control = edtRTTY2 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 113 - Width = 33 - Caption = 'RTTY' - ParentColor = False - end - object edtRTTY2: TSpinEdit - AnchorSideLeft.Control = Label113 - AnchorSideTop.Control = edtSSB2 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Label113 - AnchorSideRight.Side = asrBottom - Left = 81 - Height = 34 - Top = 104 - Width = 69 - Anchors = [akTop, akLeft, akRight] - Increment = 50 - MaxValue = 100000 - MinValue = -1 - TabOrder = 2 - Value = 500 - end - object Label119: TLabel - AnchorSideLeft.Control = Label115 - AnchorSideTop.Control = edtRTTY2 - AnchorSideTop.Side = asrCenter - Left = 156 - Height = 17 - Top = 113 - Width = 17 - Caption = 'Hz' - ParentColor = False - end - object Label120: TLabel - AnchorSideLeft.Control = Label115 - AnchorSideTop.Control = edtAM2 - AnchorSideTop.Side = asrCenter - Left = 156 - Height = 17 - Top = 147 - Width = 17 - Caption = 'Hz' - ParentColor = False - end - object edtAM2: TSpinEdit - AnchorSideLeft.Control = Label113 - AnchorSideTop.Control = edtRTTY2 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Label113 - AnchorSideRight.Side = asrBottom - Left = 81 - Height = 34 - Top = 138 - Width = 69 - Anchors = [akTop, akLeft, akRight] - Increment = 100 - MaxValue = 100000 - MinValue = -1 - TabOrder = 3 - Value = 3000 - end - object Label121: TLabel - AnchorSideLeft.Control = Label110 - AnchorSideTop.Control = edtAM2 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 147 - Width = 21 - Caption = 'AM' - ParentColor = False - end - object Label122: TLabel - AnchorSideLeft.Control = Label110 - AnchorSideTop.Control = edtFM2 - AnchorSideTop.Side = asrCenter - Left = 12 - Height = 17 - Top = 181 - Width = 20 - Caption = 'FM' - ParentColor = False - end - object edtFM2: TSpinEdit - AnchorSideLeft.Control = Label113 - AnchorSideTop.Control = edtAM2 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Label113 - AnchorSideRight.Side = asrBottom - Left = 81 - Height = 34 - Top = 172 - Width = 69 - Anchors = [akTop, akLeft, akRight] - Increment = 100 - MaxValue = 100000 - MinValue = -1 - TabOrder = 4 - Value = 2500 - end - object Label123: TLabel - AnchorSideLeft.Control = Label115 - AnchorSideTop.Control = edtFM2 - AnchorSideTop.Side = asrCenter - Left = 156 - Height = 17 - Top = 181 - Width = 17 - Caption = 'Hz' - ParentColor = False + Hint = '"Log Mode" is the data mode name you want to use.'#10'(most used data mode)'#10'This setting effects to DXCluster spot line colors and'#10'sets wanted rig mode when double click on DXspot line.'#10#10'NOTE: You may have to add your "Log mode" to'#10'"User defined digital modes" first.' + Top = 57 + Width = 100 + ItemHeight = 0 + ParentShowHint = False + ShowHint = True + TabOrder = 6 end end end object tabQTHProfiles: TTabSheet Caption = 'QTH Profiles' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object chkUseProfiles: TCheckBox Left = 9 Height = 23 Top = 12 - Width = 138 + Width = 136 Caption = 'Use QTH Profiles' OnChange = chkUseProfilesChange TabOrder = 0 @@ -4855,7 +4590,7 @@ object frmPreferences: TfrmPreferences Top = 48 Width = 622 Caption = 'Profiles' - ClientHeight = 263 + ClientHeight = 247 ClientWidth = 620 TabOrder = 1 object Bevel1: TBevel @@ -4875,9 +4610,10 @@ object frmPreferences: TfrmPreferences Left = 14 Height = 17 Top = 122 - Width = 250 + Width = 244 BorderSpacing.Top = 5 Caption = 'Description of the profile will include:' + ParentColor = False end object cmbProfiles: TComboBox Left = 9 @@ -4894,7 +4630,7 @@ object frmPreferences: TfrmPreferences Left = 9 Height = 37 Top = 55 - Width = 165 + Width = 158 AutoSize = True BorderSpacing.Top = 10 BorderSpacing.InnerBorder = 2 @@ -4908,7 +4644,7 @@ object frmPreferences: TfrmPreferences Left = 14 Height = 23 Top = 149 - Width = 78 + Width = 74 BorderSpacing.Top = 10 Caption = 'Locator' OnClick = chkProfileLocatorClick @@ -4920,7 +4656,7 @@ object frmPreferences: TfrmPreferences Left = 14 Height = 23 Top = 182 - Width = 55 + Width = 54 BorderSpacing.Top = 10 Caption = 'QTH' OnClick = chkProfileQTHClick @@ -4942,7 +4678,7 @@ object frmPreferences: TfrmPreferences end object tabExport: TTabSheet Caption = 'Export' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 inline fraExportPref1: TfraExportPref Top = 8 @@ -4960,7 +4696,7 @@ object frmPreferences: TfrmPreferences end object tabDXCluster: TTabSheet Caption = 'DXCluster' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object gbDXCColor: TGroupBox AnchorSideLeft.Control = tabDXCluster @@ -4972,7 +4708,7 @@ object frmPreferences: TfrmPreferences BorderSpacing.Left = 6 BorderSpacing.Top = 1 Caption = 'Colors' - ClientHeight = 103 + ClientHeight = 87 ClientWidth = 598 TabOrder = 0 object Label41: TLabel @@ -4981,10 +4717,11 @@ object frmPreferences: TfrmPreferences Left = 3 Height = 17 Top = 12 - Width = 88 + Width = 85 BorderSpacing.Left = 3 BorderSpacing.Top = 12 Caption = 'New country:' + ParentColor = False end object Label42: TLabel AnchorSideLeft.Control = Label41 @@ -4993,38 +4730,41 @@ object frmPreferences: TfrmPreferences Left = 3 Height = 17 Top = 53 - Width = 112 + Width = 109 BorderSpacing.Top = 24 Caption = 'New band count.' + ParentColor = False end object Label43: TLabel AnchorSideLeft.Control = cmbNewCountry AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = Label41 AnchorSideTop.Side = asrCenter - Left = 282 + Left = 279 Height = 17 Top = 12 - Width = 117 + Width = 114 BorderSpacing.Left = 43 Caption = 'New mode count.' + ParentColor = False end object Label44: TLabel AnchorSideLeft.Control = Label43 AnchorSideTop.Control = Label42 AnchorSideTop.Side = asrCenter - Left = 282 + Left = 279 Height = 17 Top = 53 - Width = 84 + Width = 81 Caption = 'QSL needed:' + ParentColor = False end object cmbNewCountry: TColorBox AnchorSideLeft.Control = Label41 AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = Label41 AnchorSideTop.Side = asrCenter - Left = 121 + Left = 118 Height = 29 Top = 6 Width = 118 @@ -5038,7 +4778,7 @@ object frmPreferences: TfrmPreferences AnchorSideLeft.Control = cmbNewCountry AnchorSideTop.Control = Label42 AnchorSideTop.Side = asrCenter - Left = 121 + Left = 118 Height = 29 Top = 47 Width = 118 @@ -5051,7 +4791,7 @@ object frmPreferences: TfrmPreferences AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = Label41 AnchorSideTop.Side = asrCenter - Left = 423 + Left = 417 Height = 29 Top = 6 Width = 118 @@ -5064,7 +4804,7 @@ object frmPreferences: TfrmPreferences AnchorSideLeft.Control = cmbNewMode AnchorSideTop.Control = Label42 AnchorSideTop.Side = asrCenter - Left = 423 + Left = 417 Height = 29 Top = 47 Width = 118 @@ -5083,7 +4823,7 @@ object frmPreferences: TfrmPreferences Width = 600 BorderSpacing.Left = 6 Caption = ' Show only spots' - ClientHeight = 254 + ClientHeight = 238 ClientWidth = 598 TabOrder = 1 object Label45: TLabel @@ -5091,12 +4831,13 @@ object frmPreferences: TfrmPreferences AnchorSideBottom.Control = edtDoNotShow Left = 6 Height = 17 - Top = 176 - Width = 404 + Top = 160 + Width = 397 Anchors = [akLeft, akBottom] BorderSpacing.Left = 6 BorderSpacing.Bottom = 3 Caption = 'Do not show spots for following countries (use ; as delimiter)' + ParentColor = False end object chkShow2190M: TCheckBox AnchorSideLeft.Control = gbDXCSpots @@ -5111,32 +4852,38 @@ object frmPreferences: TfrmPreferences TabOrder = 0 end object chkShow160M: TCheckBox - AnchorSideLeft.Control = chkShow9CM - AnchorSideTop.Control = chkShow630M + AnchorSideLeft.Control = chkShow630M + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = chkShow2190M Left = 188 Height = 23 Top = 6 Width = 79 + BorderSpacing.Left = 16 Caption = '1.8 MHz' TabOrder = 1 end object chkShow80M: TCheckBox - AnchorSideLeft.Control = chkShow6CM - AnchorSideTop.Control = chkShow160M - Left = 279 + AnchorSideLeft.Control = chkShow160M + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = chkShow2190M + Left = 283 Height = 23 Top = 6 Width = 79 + BorderSpacing.Left = 16 Caption = '3.5 MHz' TabOrder = 2 end object chkShow40M: TCheckBox - AnchorSideLeft.Control = chkShow33CM - AnchorSideTop.Control = chkShow60M - Left = 453 + AnchorSideLeft.Control = chkShow60M + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = chkShow2190M + Left = 461 Height = 23 Top = 6 Width = 67 + BorderSpacing.Left = 16 Caption = '7 MHz' TabOrder = 3 end @@ -5152,9 +4899,8 @@ object frmPreferences: TfrmPreferences TabOrder = 4 end object chkShow20M: TCheckBox - AnchorSideLeft.Control = chkShow13CM - AnchorSideTop.Control = chkShow160M - AnchorSideTop.Side = asrBottom + AnchorSideLeft.Control = chkShow630M + AnchorSideTop.Control = chkShow30M Left = 97 Height = 23 Top = 29 @@ -5163,8 +4909,8 @@ object frmPreferences: TfrmPreferences TabOrder = 5 end object chkShow17M: TCheckBox - AnchorSideLeft.Control = chkShow9CM - AnchorSideTop.Control = chkShow20M + AnchorSideLeft.Control = chkShow160M + AnchorSideTop.Control = chkShow30M Left = 188 Height = 23 Top = 29 @@ -5173,9 +4919,9 @@ object frmPreferences: TfrmPreferences TabOrder = 6 end object chkShow15M: TCheckBox - AnchorSideLeft.Control = chkShow6CM - AnchorSideTop.Control = chkShow20M - Left = 279 + AnchorSideLeft.Control = chkShow80M + AnchorSideTop.Control = chkShow30M + Left = 283 Height = 23 Top = 29 Width = 75 @@ -5183,9 +4929,9 @@ object frmPreferences: TfrmPreferences TabOrder = 7 end object chkShow12M: TCheckBox - AnchorSideLeft.Control = chkShow3CM - AnchorSideTop.Control = chkShow20M - Left = 370 + AnchorSideLeft.Control = chkShow60M + AnchorSideTop.Control = chkShow30M + Left = 378 Height = 23 Top = 29 Width = 75 @@ -5193,9 +4939,9 @@ object frmPreferences: TfrmPreferences TabOrder = 8 end object chkShow10M: TCheckBox - AnchorSideLeft.Control = chkShow33CM - AnchorSideTop.Control = chkShow20M - Left = 453 + AnchorSideLeft.Control = chkShow40M + AnchorSideTop.Control = chkShow30M + Left = 461 Height = 23 Top = 29 Width = 75 @@ -5203,9 +4949,9 @@ object frmPreferences: TfrmPreferences TabOrder = 9 end object chkShow2M: TCheckBox - AnchorSideLeft.Control = chkShow9CM - AnchorSideTop.Control = chkShow4M - Left = 188 + AnchorSideLeft.Control = chkShow60M + AnchorSideTop.Control = chkShow8M + Left = 378 Height = 23 Top = 52 Width = 83 @@ -5213,10 +4959,9 @@ object frmPreferences: TfrmPreferences TabOrder = 10 end object chkShow6M: TCheckBox - AnchorSideLeft.Control = chkShow30M - AnchorSideTop.Control = chkShow30M - AnchorSideTop.Side = asrBottom - Left = 6 + AnchorSideLeft.Control = chkShow630M + AnchorSideTop.Control = chkShow8M + Left = 97 Height = 23 Top = 52 Width = 75 @@ -5224,20 +4969,21 @@ object frmPreferences: TfrmPreferences TabOrder = 11 end object chkShow70CM: TCheckBox - AnchorSideLeft.Control = chkShow3CM - AnchorSideTop.Control = chkShow125M - Left = 370 + AnchorSideLeft.Control = chkShow2190M + AnchorSideTop.Control = chkShow8M + AnchorSideTop.Side = asrBottom + Left = 6 Height = 23 - Top = 52 + Top = 75 Width = 83 Caption = '430 MHz' TabOrder = 12 end object chkShow23CM: TCheckBox - AnchorSideLeft.Control = chkShow2190M - AnchorSideTop.Control = chkShow6M + AnchorSideLeft.Control = chkShow160M + AnchorSideTop.Control = chkShow8M AnchorSideTop.Side = asrBottom - Left = 6 + Left = 188 Height = 23 Top = 75 Width = 91 @@ -5245,10 +4991,9 @@ object frmPreferences: TfrmPreferences TabOrder = 13 end object chkShow13CM: TCheckBox - AnchorSideLeft.Control = chkShow23CM - AnchorSideLeft.Side = asrBottom + AnchorSideLeft.Control = chkShow80M AnchorSideTop.Control = chkShow23CM - Left = 97 + Left = 283 Height = 23 Top = 75 Width = 91 @@ -5256,10 +5001,9 @@ object frmPreferences: TfrmPreferences TabOrder = 14 end object chkShow9CM: TCheckBox - AnchorSideLeft.Control = chkShow13CM - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = chkShow13CM - Left = 188 + AnchorSideLeft.Control = chkShow60M + AnchorSideTop.Control = chkShow23CM + Left = 378 Height = 23 Top = 75 Width = 91 @@ -5267,10 +5011,9 @@ object frmPreferences: TfrmPreferences TabOrder = 15 end object chkShow6CM: TCheckBox - AnchorSideLeft.Control = chkShow9CM - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = chkShow9CM - Left = 279 + AnchorSideLeft.Control = chkShow40M + AnchorSideTop.Control = chkShow23CM + Left = 461 Height = 23 Top = 75 Width = 91 @@ -5278,92 +5021,94 @@ object frmPreferences: TfrmPreferences TabOrder = 16 end object chkShow3CM: TCheckBox - AnchorSideLeft.Control = chkShow6CM - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = chkShow6CM - Left = 370 + AnchorSideLeft.Control = chkShow2190M + AnchorSideTop.Control = chkShow70CM + AnchorSideTop.Side = asrBottom + Left = 6 Height = 23 - Top = 75 - Width = 72 + Top = 98 + Width = 73 Caption = '10 GHz' TabOrder = 17 end object chkShow125CM: TCheckBox - AnchorSideLeft.Control = chkShow33CM + AnchorSideLeft.Control = chkShow630M AnchorSideTop.Control = chkShow3CM - Left = 453 + Left = 97 Height = 23 - Top = 75 - Width = 72 + Top = 98 + Width = 73 Caption = '24 GHz' TabOrder = 18 end object chkShow6MM: TCheckBox - AnchorSideLeft.Control = chkShow23CM - AnchorSideTop.Control = chkShow125CM - AnchorSideTop.Side = asrBottom - Left = 6 + AnchorSideLeft.Control = chkShow160M + AnchorSideTop.Control = chkShow3CM + Left = 188 Height = 23 Top = 98 - Width = 72 + Width = 73 + Anchors = [akLeft] Caption = '47 GHz' TabOrder = 19 end object chkShow4MM: TCheckBox - AnchorSideLeft.Control = chkShow13CM - AnchorSideTop.Control = chkShow6MM - Left = 97 + AnchorSideLeft.Control = chkShow80M + AnchorSideTop.Control = chkShow3CM + Left = 283 Height = 23 Top = 98 - Width = 72 + Width = 73 + Anchors = [akLeft] Caption = '76 GHz' TabOrder = 20 end object chkShow25MM: TCheckBox - AnchorSideLeft.Control = chkShow9CM - AnchorSideTop.Control = chkShow4MM - Left = 188 + AnchorSideLeft.Control = chkShow60M + AnchorSideTop.Control = chkShow3CM + Left = 378 Height = 23 Top = 98 - Width = 80 + Width = 81 Caption = '122 GHz' TabOrder = 21 end object chkShow2MM: TCheckBox - AnchorSideLeft.Control = chkShow6CM - AnchorSideTop.Control = chkShow25MM - Left = 279 + AnchorSideLeft.Control = chkShow40M + AnchorSideTop.Control = chkShow3CM + Left = 461 Height = 23 Top = 98 - Width = 80 + Width = 81 Caption = '134 GHz' TabOrder = 22 end object chkShow1MM: TCheckBox - AnchorSideLeft.Control = chkShow3CM - AnchorSideTop.Control = chkShow2MM - Left = 370 - Height = 23 - Top = 98 - Width = 80 - Caption = '241 GHz' - TabOrder = 23 - end - object chkCW: TCheckBox - AnchorSideLeft.Control = chkShow6MM - AnchorSideTop.Control = chkShow6MM + AnchorSideLeft.Control = chkShow2190M + AnchorSideTop.Control = chkShow3CM AnchorSideTop.Side = asrBottom Left = 6 Height = 23 Top = 121 - Width = 49 + Width = 81 + Caption = '241 GHz' + TabOrder = 23 + end + object chkCW: TCheckBox + AnchorSideLeft.Control = chkShow60M + AnchorSideTop.Control = chkShow6MM + AnchorSideTop.Side = asrBottom + Left = 378 + Height = 23 + Top = 121 + Width = 48 Caption = 'CW' TabOrder = 24 end object chkSSB: TCheckBox - AnchorSideLeft.Control = chkShow13CM + AnchorSideLeft.Control = chkShow40M AnchorSideTop.Control = chkCW - Left = 97 + Left = 461 Height = 23 Top = 121 Width = 51 @@ -5375,36 +5120,38 @@ object frmPreferences: TfrmPreferences AnchorSideBottom.Control = chkShowDxcCountry Left = 6 Height = 34 - Top = 196 + Top = 180 Width = 471 Anchors = [akLeft, akBottom] BorderSpacing.Left = 6 TabOrder = 26 end object chkShow4M: TCheckBox - AnchorSideLeft.Control = chkShow13CM - AnchorSideTop.Control = chkShow6M - Left = 97 + AnchorSideLeft.Control = chkShow80M + AnchorSideTop.Control = chkShow8M + Left = 283 Height = 23 Top = 52 - Width = 72 + Width = 71 Caption = '70MHz' TabOrder = 27 end object chkShow60M: TCheckBox - AnchorSideLeft.Control = chkShow3CM - AnchorSideTop.Control = chkShow80M - Left = 370 + AnchorSideLeft.Control = chkShow80M + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = chkShow2190M + Left = 378 Height = 23 Top = 6 Width = 67 + BorderSpacing.Left = 16 Caption = '5 MHz' TabOrder = 28 end object chkShow125M: TCheckBox - AnchorSideLeft.Control = chkShow6CM - AnchorSideTop.Control = chkShow2M - Left = 279 + AnchorSideLeft.Control = chkShow40M + AnchorSideTop.Control = chkShow8M + Left = 461 Height = 23 Top = 52 Width = 83 @@ -5412,23 +5159,24 @@ object frmPreferences: TfrmPreferences TabOrder = 29 end object chkShow33CM: TCheckBox - AnchorSideLeft.Control = chkShow70CM - AnchorSideLeft.Side = asrBottom + AnchorSideLeft.Control = chkShow630M AnchorSideTop.Control = chkShow70CM - Left = 453 + Left = 97 Height = 23 - Top = 52 + Top = 75 Width = 83 Caption = '900 MHz' TabOrder = 30 end object chkShow630M: TCheckBox - AnchorSideLeft.Control = chkShow13CM + AnchorSideLeft.Control = chkShow2190M + AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = chkShow2190M Left = 97 Height = 23 Top = 6 Width = 75 + BorderSpacing.Left = 16 Caption = '472kHz' TabOrder = 31 end @@ -5438,14 +5186,46 @@ object frmPreferences: TfrmPreferences AnchorSideBottom.Side = asrBottom Left = 6 Height = 23 - Top = 230 - Width = 300 + Top = 214 + Width = 299 Anchors = [akLeft, akBottom] BorderSpacing.Left = 6 BorderSpacing.Bottom = 1 Caption = 'Show country name in the DX cluster spot' TabOrder = 32 end + object chkShow8M: TCheckBox + AnchorSideLeft.Control = chkShow2190M + AnchorSideTop.Control = chkShow30M + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 23 + Top = 52 + Width = 75 + Caption = '40 MHz' + TabOrder = 33 + end + object chkShow5M: TCheckBox + AnchorSideLeft.Control = chkShow160M + AnchorSideTop.Control = chkShow8M + Left = 188 + Height = 23 + Top = 52 + Width = 75 + Caption = '60 MHz' + TabOrder = 34 + end + object chkDATA: TCheckBox + AnchorSideLeft.Control = chkShow80M + AnchorSideTop.Control = chkShow6MM + AnchorSideTop.Side = asrBottom + Left = 283 + Height = 23 + Top = 121 + Width = 60 + Caption = 'DATA' + TabOrder = 35 + end end object gbDXCAlert: TGroupBox AnchorSideLeft.Control = tabDXCluster @@ -5458,7 +5238,7 @@ object frmPreferences: TfrmPreferences BorderSpacing.Left = 6 BorderSpacing.Top = 1 Caption = ' Callsign alert ' - ClientHeight = 142 + ClientHeight = 126 ClientWidth = 598 TabOrder = 2 object btnAlertCallsigns: TButton @@ -5481,10 +5261,11 @@ object frmPreferences: TfrmPreferences Left = 6 Height = 17 Top = 43 - Width = 289 + Width = 287 BorderSpacing.Left = 6 BorderSpacing.Top = 12 Caption = 'Run this command when callsign is spotted:' + ParentColor = False end object edtAlertCmd: TEdit AnchorSideLeft.Control = gbDXCAlert @@ -5507,10 +5288,11 @@ object frmPreferences: TfrmPreferences Left = 6 Height = 17 Top = 103 - Width = 343 + Width = 334 BorderSpacing.Left = 6 BorderSpacing.Top = 6 Caption = 'Macros: $CALLSIGN, $BAND, $MODE, $FREQ, $MSG' + ParentColor = False end end object gbDXCConnect: TGroupBox @@ -5524,7 +5306,7 @@ object frmPreferences: TfrmPreferences BorderSpacing.Left = 6 BorderSpacing.Top = 1 Caption = 'Connect' - ClientHeight = 98 + ClientHeight = 82 ClientWidth = 598 TabOrder = 3 object chkConToDXC: TCheckBox @@ -5534,8 +5316,8 @@ object frmPreferences: TfrmPreferences AnchorSideBottom.Side = asrBottom Left = 5 Height = 23 - Top = 75 - Width = 322 + Top = 59 + Width = 311 Anchors = [akLeft, akBottom] BorderSpacing.Left = 5 Caption = 'Connect to DX cluster after program startup' @@ -5546,7 +5328,7 @@ object frmPreferences: TfrmPreferences AnchorSideBottom.Control = chkConToDXC Left = 6 Height = 34 - Top = 40 + Top = 24 Width = 471 Anchors = [akLeft, akBottom] BorderSpacing.Left = 6 @@ -5559,18 +5341,19 @@ object frmPreferences: TfrmPreferences AnchorSideBottom.Control = edtStartConCmd Left = 6 Height = 17 - Top = 19 - Width = 518 + Top = 3 + Width = 513 Anchors = [akLeft, akBottom] BorderSpacing.Left = 6 BorderSpacing.Bottom = 4 Caption = 'Send these commands to telnet DXCluster when connected (use ; as delimiter)' + ParentColor = False end end end object tabFont: TTabSheet Caption = 'Fonts' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object GroupBox7: TGroupBox Left = 14 @@ -5578,22 +5361,24 @@ object frmPreferences: TfrmPreferences Top = 3 Width = 496 Caption = ' Font settings ' - ClientHeight = 350 + ClientHeight = 334 ClientWidth = 494 TabOrder = 0 object lblButtons: TLabel Left = 12 Height = 17 Top = 39 - Width = 295 + Width = 287 Caption = 'Buttons, labels, radiobuttons, checkboxes ...' + ParentColor = False end object lblbFont: TLabel Left = 12 Height = 17 Top = 71 - Width = 57 + Width = 52 Caption = 'lblbFont' + ParentColor = False end object Bevel2: TBevel Left = 12 @@ -5605,15 +5390,17 @@ object frmPreferences: TfrmPreferences Left = 12 Height = 17 Top = 119 - Width = 231 + Width = 226 Caption = 'Edits, comboboxes, memoboxes ...' + ParentColor = False end object lbleFont: TLabel Left = 12 Height = 17 Top = 151 - Width = 56 + Width = 52 Caption = 'lbleFont' + ParentColor = False end object Bevel3: TBevel Left = 12 @@ -5625,15 +5412,17 @@ object frmPreferences: TfrmPreferences Left = 12 Height = 17 Top = 199 - Width = 63 + Width = 60 Caption = 'Statistics' + ParentColor = False end object lblgFont: TLabel Left = 12 Height = 17 Top = 231 - Width = 56 + Width = 52 Caption = 'lblgFont' + ParentColor = False end object Bevel4: TBevel Left = 12 @@ -5645,15 +5434,17 @@ object frmPreferences: TfrmPreferences Left = 12 Height = 17 Top = 279 - Width = 61 + Width = 59 Caption = 'QSO lists' + ParentColor = False end object lblqFont: TLabel Left = 12 Height = 17 Top = 311 - Width = 57 + Width = 52 Caption = 'lblqFont' + ParentColor = False end object btnSelbFont: TButton Left = 382 @@ -5699,7 +5490,7 @@ object frmPreferences: TfrmPreferences Left = 12 Height = 23 Top = 7 - Width = 160 + Width = 157 Caption = 'Use default settings' TabOrder = 4 end @@ -5718,7 +5509,7 @@ object frmPreferences: TfrmPreferences Height = 23 Hint = 'Set every second line of grid lists to other color' Top = 7 - Width = 141 + Width = 137 Caption = '''green bar'' paper' ParentShowHint = False ShowHint = True @@ -5740,7 +5531,7 @@ object frmPreferences: TfrmPreferences Height = 23 Hint = 'Set title line of gridlists to bold' Top = 7 - Width = 115 + Width = 113 Caption = 'Bold title line' ParentShowHint = False ShowHint = True @@ -5763,7 +5554,7 @@ object frmPreferences: TfrmPreferences Height = 23 Hint = 'Set dots instead spaces in DXCC stat grid' Top = 7 - Width = 184 + Width = 180 Caption = 'Set dots instead spaces' ParentShowHint = False ShowHint = True @@ -5773,7 +5564,7 @@ object frmPreferences: TfrmPreferences end object tabWazItu: TTabSheet Caption = 'WAZ, ITU zones' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object GroupBox8: TGroupBox Left = 14 @@ -5781,15 +5572,16 @@ object frmPreferences: TfrmPreferences Top = 11 Width = 233 Caption = 'WAZ colors ' - ClientHeight = 228 + ClientHeight = 212 ClientWidth = 231 TabOrder = 0 object Label23: TLabel Left = 13 Height = 17 Top = 15 - Width = 106 + Width = 107 Caption = 'New WAZ zone: ' + ParentColor = False end object Label52: TLabel Left = 13 @@ -5797,13 +5589,15 @@ object frmPreferences: TfrmPreferences Top = 78 Width = 143 Caption = 'New band WAZ zone: ' + ParentColor = False end object Label53: TLabel Left = 13 Height = 17 Top = 139 - Width = 180 + Width = 177 Caption = 'QSL needed for WAZ zone: ' + ParentColor = False end object clboxNewWaz: TColorBox Left = 13 @@ -5839,15 +5633,16 @@ object frmPreferences: TfrmPreferences Top = 11 Width = 233 Caption = 'ITU colors ' - ClientHeight = 228 + ClientHeight = 212 ClientWidth = 231 TabOrder = 1 object Label54: TLabel Left = 13 Height = 17 Top = 15 - Width = 97 + Width = 98 Caption = 'New ITU zone: ' + ParentColor = False end object Label55: TLabel Left = 13 @@ -5855,13 +5650,15 @@ object frmPreferences: TfrmPreferences Top = 78 Width = 134 Caption = 'New band ITU zone: ' + ParentColor = False end object Label56: TLabel Left = 13 Height = 17 Top = 139 - Width = 171 + Width = 168 Caption = 'QSL needed for ITU zone: ' + ParentColor = False end object clboxNewITU: TColorBox Left = 13 @@ -5895,7 +5692,7 @@ object frmPreferences: TfrmPreferences Left = 14 Height = 23 Top = 251 - Width = 91 + Width = 90 Caption = 'Show info' TabOrder = 2 end @@ -5903,14 +5700,14 @@ object frmPreferences: TfrmPreferences Left = 262 Height = 23 Top = 251 - Width = 91 + Width = 90 Caption = 'Show info' TabOrder = 3 end end object tabIOTA: TTabSheet Caption = 'IOTA' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object GroupBox10: TGroupBox Left = 22 @@ -5918,22 +5715,24 @@ object frmPreferences: TfrmPreferences Top = 19 Width = 249 Caption = 'IOTA colors' - ClientHeight = 166 + ClientHeight = 150 ClientWidth = 247 TabOrder = 0 object Label57: TLabel Left = 13 Height = 17 Top = 13 - Width = 69 + Width = 67 Caption = 'New IOTA:' + ParentColor = False end object Label58: TLabel Left = 13 Height = 17 Top = 80 - Width = 146 + Width = 141 Caption = 'QSL needed for IOTA: ' + ParentColor = False end object clboxNewIOTA: TColorBox Left = 13 @@ -5958,14 +5757,14 @@ object frmPreferences: TfrmPreferences Left = 22 Height = 23 Top = 203 - Width = 91 + Width = 90 Caption = 'Show info' TabOrder = 1 end end object tabMemebership: TTabSheet Caption = 'Membership' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object GroupBox11: TGroupBox AnchorSideLeft.Control = tabMemebership @@ -5977,7 +5776,7 @@ object frmPreferences: TfrmPreferences BorderSpacing.Left = 18 BorderSpacing.Top = 6 Caption = 'First club' - ClientHeight = 98 + ClientHeight = 82 ClientWidth = 582 TabOrder = 0 object cmbFirstClub: TComboBox @@ -5986,7 +5785,7 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrCenter Left = 12 Height = 33 - Top = 33 + Top = 25 Width = 293 BorderSpacing.Left = 12 ItemHeight = 0 @@ -6030,10 +5829,11 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrCenter Left = 317 Height = 17 - Top = 41 + Top = 33 Width = 39 BorderSpacing.Left = 12 Caption = 'Since:' + ParentColor = False end object edtClub1Date: TEdit AnchorSideLeft.Control = Label103 @@ -6042,7 +5842,7 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrCenter Left = 368 Height = 34 - Top = 32 + Top = 24 Width = 96 BorderSpacing.Left = 12 TabOrder = 3 @@ -6058,7 +5858,7 @@ object frmPreferences: TfrmPreferences Width = 584 BorderSpacing.Top = 6 Caption = 'Second club' - ClientHeight = 98 + ClientHeight = 82 ClientWidth = 582 TabOrder = 1 object cmbSecondClub: TComboBox @@ -6067,7 +5867,7 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrCenter Left = 12 Height = 33 - Top = 33 + Top = 25 Width = 293 BorderSpacing.Left = 12 ItemHeight = 0 @@ -6111,10 +5911,11 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrCenter Left = 317 Height = 17 - Top = 41 + Top = 33 Width = 39 BorderSpacing.Left = 12 Caption = 'Since:' + ParentColor = False end object edtClub2Date: TEdit AnchorSideLeft.Control = Label104 @@ -6123,7 +5924,7 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrCenter Left = 368 Height = 34 - Top = 32 + Top = 24 Width = 96 BorderSpacing.Left = 12 TabOrder = 3 @@ -6139,7 +5940,7 @@ object frmPreferences: TfrmPreferences Width = 584 BorderSpacing.Top = 6 Caption = 'Third club' - ClientHeight = 98 + ClientHeight = 82 ClientWidth = 582 TabOrder = 2 object cmbThirdClub: TComboBox @@ -6148,7 +5949,7 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrCenter Left = 12 Height = 33 - Top = 33 + Top = 25 Width = 293 BorderSpacing.Left = 12 ItemHeight = 0 @@ -6192,10 +5993,11 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrCenter Left = 317 Height = 17 - Top = 41 + Top = 33 Width = 39 BorderSpacing.Left = 12 Caption = 'Since:' + ParentColor = False end object edtClub3Date: TEdit AnchorSideLeft.Control = Label105 @@ -6204,7 +6006,7 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrCenter Left = 368 Height = 34 - Top = 32 + Top = 24 Width = 96 BorderSpacing.Left = 12 TabOrder = 3 @@ -6220,7 +6022,7 @@ object frmPreferences: TfrmPreferences Width = 584 BorderSpacing.Top = 6 Caption = 'Fourth club' - ClientHeight = 98 + ClientHeight = 82 ClientWidth = 582 TabOrder = 3 object cmbFourthClub: TComboBox @@ -6229,7 +6031,7 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrCenter Left = 12 Height = 33 - Top = 33 + Top = 25 Width = 293 BorderSpacing.Left = 12 ItemHeight = 0 @@ -6273,10 +6075,11 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrCenter Left = 317 Height = 17 - Top = 41 + Top = 33 Width = 39 BorderSpacing.Left = 12 Caption = 'Since:' + ParentColor = False end object edtClub4Date: TEdit AnchorSideLeft.Control = Label106 @@ -6285,7 +6088,7 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrCenter Left = 368 Height = 34 - Top = 32 + Top = 24 Width = 96 BorderSpacing.Left = 12 TabOrder = 3 @@ -6301,7 +6104,7 @@ object frmPreferences: TfrmPreferences Width = 584 BorderSpacing.Top = 6 Caption = 'Fifth club' - ClientHeight = 98 + ClientHeight = 82 ClientWidth = 582 TabOrder = 4 object cmbFifthClub: TComboBox @@ -6310,7 +6113,7 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrCenter Left = 12 Height = 33 - Top = 33 + Top = 25 Width = 293 BorderSpacing.Left = 12 ItemHeight = 0 @@ -6354,10 +6157,11 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrCenter Left = 317 Height = 17 - Top = 41 + Top = 33 Width = 39 BorderSpacing.Left = 12 Caption = 'Since:' + ParentColor = False end object edtClub5Date: TEdit AnchorSideLeft.Control = Label107 @@ -6366,7 +6170,7 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrCenter Left = 368 Height = 34 - Top = 32 + Top = 24 Width = 96 BorderSpacing.Left = 12 TabOrder = 3 @@ -6379,7 +6183,7 @@ object frmPreferences: TfrmPreferences Left = 18 Height = 23 Top = 556 - Width = 402 + Width = 391 BorderSpacing.Top = 26 Caption = 'Check for updated list of members when program starts' TabOrder = 5 @@ -6389,10 +6193,10 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrCenter AnchorSideRight.Control = GroupBox14 AnchorSideRight.Side = asrBottom - Left = 506 + Left = 508 Height = 33 Top = 551 - Width = 96 + Width = 94 Anchors = [akTop, akRight] AutoSize = True Caption = 'Update now' @@ -6402,7 +6206,7 @@ object frmPreferences: TfrmPreferences end object tabBandMap: TTabSheet Caption = 'Bandmap' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object GroupBox16: TGroupBox Left = 13 @@ -6419,6 +6223,7 @@ object frmPreferences: TfrmPreferences Top = 6 Width = 383 AutoSize = False + ParentColor = False end object btnSelectBandFont: TButton Left = 464 @@ -6436,15 +6241,16 @@ object frmPreferences: TfrmPreferences Top = 74 Width = 572 Caption = ' Color ' - ClientHeight = 60 + ClientHeight = 44 ClientWidth = 570 TabOrder = 1 object Label61: TLabel Left = 6 Height = 17 Top = 11 - Width = 333 + Width = 326 Caption = 'Select color of entry added from new qso window ' + ParentColor = False end object cmbQSOBandColor: TColorBox Left = 460 @@ -6479,7 +6285,7 @@ object frmPreferences: TfrmPreferences Left = 238 Height = 23 Top = 330 - Width = 172 + Width = 173 Caption = 'Show only active band' TabOrder = 4 end @@ -6487,7 +6293,7 @@ object frmPreferences: TfrmPreferences Left = 14 Height = 23 Top = 354 - Width = 177 + Width = 178 Caption = 'Show only active mode' TabOrder = 5 end @@ -6505,29 +6311,32 @@ object frmPreferences: TfrmPreferences Top = 146 Width = 572 Caption = ' Band Map Entries Aging (in minutes) ' - ClientHeight = 66 + ClientHeight = 50 ClientWidth = 570 TabOrder = 7 object Label62: TLabel Left = 11 Height = 17 Top = 14 - Width = 95 + Width = 93 Caption = 'The first after ' + ParentColor = False end object Label63: TLabel Left = 163 Height = 17 Top = 14 - Width = 113 + Width = 110 Caption = 'the second after ' + ParentColor = False end object Label64: TLabel Left = 350 Height = 17 Top = 14 - Width = 108 + Width = 103 Caption = 'disappear after ' + ParentColor = False end object edtFirst: TEdit Left = 104 @@ -6560,15 +6369,16 @@ object frmPreferences: TfrmPreferences Top = 230 Width = 369 Caption = 'Band map entries (from dxcluster)' - ClientHeight = 90 + ClientHeight = 74 ClientWidth = 367 TabOrder = 8 object Label65: TLabel Left = 6 Height = 17 Top = 41 - Width = 41 + Width = 38 Caption = 'Color:' + ParentColor = False end object Button1: TButton Left = 239 @@ -6601,7 +6411,7 @@ object frmPreferences: TfrmPreferences Left = 6 Height = 23 Top = 6 - Width = 230 + Width = 228 Caption = 'Use the same color as the spot' OnChange = chkUseDXCColorsChange TabOrder = 3 @@ -6611,7 +6421,7 @@ object frmPreferences: TfrmPreferences Left = 238 Height = 23 Top = 354 - Width = 295 + Width = 285 Caption = 'Delete station from bandmap after QSO' TabOrder = 9 end @@ -6619,7 +6429,7 @@ object frmPreferences: TfrmPreferences Left = 14 Height = 23 Top = 381 - Width = 304 + Width = 296 Caption = 'Add station to bandmap after saving QSO' TabOrder = 10 end @@ -6627,7 +6437,7 @@ object frmPreferences: TfrmPreferences Left = 14 Height = 23 Top = 408 - Width = 632 + Width = 625 Caption = 'Ignore DX spots with freq equals to the start of the band (21.000, 14.000 etc., usually notes)' TabOrder = 11 end @@ -6635,7 +6445,7 @@ object frmPreferences: TfrmPreferences Left = 14 Height = 23 Top = 435 - Width = 553 + Width = 545 Caption = 'When TRX control is not active, use frequency and mode from NewQSO window' TabOrder = 12 end @@ -6643,7 +6453,7 @@ object frmPreferences: TfrmPreferences Left = 16 Height = 23 Top = 464 - Width = 406 + Width = 410 Caption = 'Use ''+'' key to add spots to band map (CTRL+A is a deault)' TabOrder = 13 end @@ -6653,7 +6463,7 @@ object frmPreferences: TfrmPreferences Top = 232 Width = 201 Caption = 'Column widths' - ClientHeight = 87 + ClientHeight = 71 ClientWidth = 199 TabOrder = 14 object seFreqWidth: TSpinEdit @@ -6661,7 +6471,7 @@ object frmPreferences: TfrmPreferences AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = lbFreqW AnchorSideTop.Side = asrBottom - Left = 14 + Left = 12 Height = 34 Top = 29 Width = 55 @@ -6677,7 +6487,7 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Control = lbCallW AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom - Left = 133 + Left = 126 Height = 34 Top = 29 Width = 55 @@ -6693,27 +6503,29 @@ object frmPreferences: TfrmPreferences Left = 6 Height = 17 Top = 6 - Width = 71 + Width = 66 BorderSpacing.Left = 6 BorderSpacing.Top = 6 Caption = 'FreqWidth' + ParentColor = False end object lbCallW: TLabel AnchorSideLeft.Control = lbFreqW AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lbFreqW - Left = 127 + Left = 122 Height = 17 Top = 6 - Width = 66 + Width = 63 BorderSpacing.Left = 50 Caption = 'CallWidth' + ParentColor = False end end end object tabXplanet: TTabSheet Caption = 'xplanet support' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object GroupBox21: TGroupBox Left = 14 @@ -6739,22 +6551,24 @@ object frmPreferences: TfrmPreferences Top = 107 Width = 113 Caption = ' Window size ' - ClientHeight = 110 + ClientHeight = 94 ClientWidth = 111 TabOrder = 1 object Label66: TLabel Left = 8 Height = 17 Top = 3 - Width = 48 + Width = 47 Caption = 'Height:' + ParentColor = False end object Label67: TLabel Left = 6 Height = 17 Top = 43 - Width = 45 + Width = 42 Caption = 'Width:' + ParentColor = False end object edtXHeight: TEdit Left = 64 @@ -6777,22 +6591,24 @@ object frmPreferences: TfrmPreferences Top = 107 Width = 129 Caption = ' Window position ' - ClientHeight = 110 + ClientHeight = 94 ClientWidth = 127 TabOrder = 2 object Label68: TLabel Left = 8 Height = 17 Top = 3 - Width = 29 + Width = 26 Caption = 'Top:' + ParentColor = False end object Label69: TLabel Left = 8 Height = 17 Top = 43 - Width = 31 + Width = 29 Caption = 'Left:' + ParentColor = False end object edtXTop: TEdit Left = 64 @@ -6822,7 +6638,7 @@ object frmPreferences: TfrmPreferences Left = 14 Height = 23 Top = 352 - Width = 266 + Width = 258 Caption = 'Show xplanet after program startup' TabOrder = 3 end @@ -6830,7 +6646,7 @@ object frmPreferences: TfrmPreferences Left = 320 Height = 23 Top = 352 - Width = 211 + Width = 210 Caption = 'Close xplanet with CQRLOG ' TabOrder = 4 end @@ -6840,7 +6656,7 @@ object frmPreferences: TfrmPreferences Top = 107 Width = 298 Caption = ' Refresh ' - ClientHeight = 110 + ClientHeight = 94 ClientWidth = 296 TabOrder = 5 object Label70: TLabel @@ -6849,6 +6665,7 @@ object frmPreferences: TfrmPreferences Top = 3 Width = 144 Caption = 'Refresh xplanet every' + ParentColor = False end object Label71: TLabel Left = 240 @@ -6856,6 +6673,7 @@ object frmPreferences: TfrmPreferences Top = 3 Width = 26 Caption = 'sec.' + ParentColor = False end object Label72: TLabel Left = 6 @@ -6863,13 +6681,15 @@ object frmPreferences: TfrmPreferences Top = 43 Width = 63 Caption = 'Show last' + ParentColor = False end object Label73: TLabel Left = 136 Height = 17 Top = 43 - Width = 38 + Width = 35 Caption = 'spots' + ParentColor = False end object edtXRefresh: TEdit Left = 168 @@ -6948,7 +6768,7 @@ object frmPreferences: TfrmPreferences Left = 14 Height = 23 Top = 386 - Width = 202 + Width = 198 Caption = 'Use this xplanet font color' TabOrder = 9 end @@ -6974,14 +6794,14 @@ object frmPreferences: TfrmPreferences Left = 14 Height = 23 Top = 504 - Width = 247 + Width = 245 Caption = 'Show own position within xplanet' TabOrder = 11 end end object tabZipCode: TTabSheet Caption = 'Zip code tracking' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object GroupBox25: TGroupBox Left = 6 @@ -6989,22 +6809,24 @@ object frmPreferences: TfrmPreferences Top = 11 Width = 545 Caption = ' First ' - ClientHeight = 102 + ClientHeight = 86 ClientWidth = 543 TabOrder = 0 object Label74: TLabel Left = 14 Height = 17 Top = 50 - Width = 96 + Width = 97 Caption = 'Save county to' + ParentColor = False end object Label75: TLabel Left = 254 Height = 17 Top = 50 - Width = 30 + Width = 29 Caption = 'field' + ParentColor = False end object cmbFirstZip: TComboBox Left = 14 @@ -7071,22 +6893,24 @@ object frmPreferences: TfrmPreferences Top = 123 Width = 545 Caption = ' Second ' - ClientHeight = 102 + ClientHeight = 86 ClientWidth = 543 TabOrder = 1 object Label76: TLabel Left = 14 Height = 17 Top = 50 - Width = 96 + Width = 97 Caption = 'Save county to' + ParentColor = False end object Label77: TLabel Left = 254 Height = 17 Top = 50 - Width = 30 + Width = 29 Caption = 'field' + ParentColor = False end object cmbSecondZip: TComboBox Left = 14 @@ -7153,22 +6977,24 @@ object frmPreferences: TfrmPreferences Top = 235 Width = 545 Caption = ' Third ' - ClientHeight = 102 + ClientHeight = 86 ClientWidth = 543 TabOrder = 2 object Label78: TLabel Left = 14 Height = 17 Top = 50 - Width = 96 + Width = 97 Caption = 'Save county to' + ParentColor = False end object Label79: TLabel Left = 254 Height = 17 Top = 50 - Width = 30 + Width = 29 Caption = 'field' + ParentColor = False end object cmbThirdZip: TComboBox Left = 14 @@ -7232,18 +7058,19 @@ object frmPreferences: TfrmPreferences end object tabLoTW: TTabSheet Caption = 'LoTW/eQSL support' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object lblLoTWBkg: TLabel AnchorSideLeft.Control = cmbLoTWBckColor AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = cmbLoTWBckColor - Left = 270 + Left = 271 Height = 34 Top = 431 - Width = 330 + Width = 327 BorderSpacing.Left = 6 Caption = 'color as a background in DX cluster and band map'#10'for stations using LoTW' + ParentColor = False end object chkIncLoTWDXCC: TCheckBox AnchorSideLeft.Control = gbeQSL @@ -7252,7 +7079,7 @@ object frmPreferences: TfrmPreferences Left = 12 Height = 23 Top = 347 - Width = 433 + Width = 425 BorderSpacing.Top = 6 Caption = 'Include LoTW and eQSL confirmed countries in DXCC statistic' TabOrder = 0 @@ -7264,7 +7091,7 @@ object frmPreferences: TfrmPreferences Left = 12 Height = 23 Top = 376 - Width = 608 + Width = 594 BorderSpacing.Top = 6 Caption = 'Use LoTW and eQSL confirmed countries for New country or New band country etc. info' TabOrder = 1 @@ -7279,7 +7106,7 @@ object frmPreferences: TfrmPreferences BorderSpacing.Left = 12 BorderSpacing.Top = 3 Caption = ' Data for access to ARRL LoTW website ' - ClientHeight = 70 + ClientHeight = 54 ClientWidth = 514 TabOrder = 2 object lblLoUsr: TLabel @@ -7292,17 +7119,19 @@ object frmPreferences: TfrmPreferences BorderSpacing.Left = 6 BorderSpacing.Top = 6 Caption = 'User name:' + ParentColor = False end object lblLoTWpass: TLabel AnchorSideTop.Control = lblLoUsr AnchorSideRight.Control = edtLoTWPass - Left = 316 + Left = 319 Height = 17 Top = 6 - Width = 73 + Width = 70 Anchors = [akTop, akRight] BorderSpacing.Right = 6 Caption = 'Password: ' + ParentColor = False end object edtLoTWName: TEdit AnchorSideLeft.Control = lblLoUsr @@ -7337,7 +7166,7 @@ object frmPreferences: TfrmPreferences Left = 12 Height = 23 Top = 405 - Width = 405 + Width = 398 BorderSpacing.Top = 6 Caption = 'Show info in New QSO window if station uses LoTW/eQSL' TabOrder = 3 @@ -7349,7 +7178,7 @@ object frmPreferences: TfrmPreferences Left = 12 Height = 23 Top = 434 - Width = 82 + Width = 83 BorderSpacing.Top = 6 Caption = 'Use this ' TabOrder = 4 @@ -7359,7 +7188,7 @@ object frmPreferences: TfrmPreferences AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = chkShowBckLoTW AnchorSideTop.Side = asrCenter - Left = 100 + Left = 101 Height = 29 Top = 431 Width = 164 @@ -7381,7 +7210,7 @@ object frmPreferences: TfrmPreferences Width = 516 BorderSpacing.Top = 6 Caption = ' Data for access to eQSL website ' - ClientHeight = 258 + ClientHeight = 242 ClientWidth = 514 TabOrder = 6 object lbleQSLUsr: TLabel @@ -7394,17 +7223,19 @@ object frmPreferences: TfrmPreferences BorderSpacing.Left = 6 BorderSpacing.Top = 6 Caption = 'User name:' + ParentColor = False end object lbleQSLPass: TLabel AnchorSideTop.Control = lbleQSLUsr AnchorSideRight.Control = edteQSLPass - Left = 319 + Left = 322 Height = 17 Top = 6 - Width = 73 + Width = 70 Anchors = [akTop, akRight] BorderSpacing.Right = 6 Caption = 'Password: ' + ParentColor = False end object edteQSLName: TEdit AnchorSideLeft.Control = lbleQSLUsr @@ -7438,9 +7269,10 @@ object frmPreferences: TfrmPreferences Left = 6 Height = 17 Top = 46 - Width = 468 + Width = 458 BorderSpacing.Top = 6 Caption = 'eQSL download start address prefix. Your user data is added as suffix.' + ParentColor = False end object edteQSLStartAddr: TEdit AnchorSideLeft.Control = lbleQSLUsr @@ -7464,9 +7296,10 @@ object frmPreferences: TfrmPreferences Left = 6 Height = 17 Top = 109 - Width = 440 + Width = 436 BorderSpacing.Top = 6 Caption = 'eQSL download file address prefix. Adi filename is added as suffix.' + ParentColor = False end object edteQSLDnlAddr: TEdit AnchorSideLeft.Control = lbleQSLUsr @@ -7490,9 +7323,10 @@ object frmPreferences: TfrmPreferences Left = 6 Height = 17 Top = 172 - Width = 396 + Width = 392 BorderSpacing.Top = 6 Caption = 'eQSL view address prefix. Your user data is added as suffix.' + ParentColor = False end object edteQSLViewAddr: TEdit AnchorSideLeft.Control = lbleQSLUsr @@ -7517,7 +7351,7 @@ object frmPreferences: TfrmPreferences Left = 12 Height = 23 Top = 469 - Width = 82 + Width = 83 BorderSpacing.Top = 12 Caption = 'Use this ' TabOrder = 7 @@ -7527,7 +7361,7 @@ object frmPreferences: TfrmPreferences AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = chkShowBckEQSL AnchorSideTop.Side = asrCenter - Left = 100 + Left = 101 Height = 29 Top = 466 Width = 164 @@ -7543,12 +7377,13 @@ object frmPreferences: TfrmPreferences AnchorSideLeft.Control = cmbeQSLBckColor AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = cmbeQSLBckColor - Left = 270 + Left = 271 Height = 34 Top = 466 - Width = 330 + Width = 327 BorderSpacing.Left = 6 Caption = 'color as a background in DX cluster and band map'#10'for stations using eQSL' + ParentColor = False end object chkExpCommet: TCheckBox AnchorSideLeft.Control = chkShowBckEQSL @@ -7557,7 +7392,7 @@ object frmPreferences: TfrmPreferences Left = 12 Height = 23 Top = 504 - Width = 323 + Width = 316 BorderSpacing.Top = 12 Caption = 'Upload to eQSL also data in COMMENT field ' TabOrder = 9 @@ -7565,114 +7400,99 @@ object frmPreferences: TfrmPreferences end object tabCWInterface: TTabSheet Caption = 'CW interface' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 + OnContextPopup = tabCWInterfaceContextPopup + OnExit = tabCWInterfaceExit object lbIfaceType: TLabel - AnchorSideLeft.Control = tabCWInterface - AnchorSideTop.Control = tabCWInterface - Left = 18 + AnchorSideLeft.Control = cmbCWRadio + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = lblCWRadio + Left = 156 Height = 17 Top = 6 - Width = 124 + Width = 121 BorderSpacing.Left = 18 - BorderSpacing.Top = 6 Caption = 'CW interface type:' - end - object cmbIfaceType1: TComboBox - AnchorSideLeft.Control = lblRadio1 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = lblRadio1 - AnchorSideTop.Side = asrCenter - Left = 91 - Height = 34 - Top = 32 - Width = 170 - BorderSpacing.Left = 6 - ItemHeight = 0 - ItemIndex = 0 - Items.Strings = ( - 'None' - 'WinKeyer USB' - 'cwdaemon' - 'K3NG Key' - 'HamLib' - ) - OnChange = cmbIfaceType1Change - TabOrder = 0 - Text = 'None' + ParentColor = False end object gbWinkeyer: TGroupBox - AnchorSideLeft.Control = lbIfaceType + AnchorSideLeft.Control = tabCWInterface AnchorSideTop.Control = cbNoKeyerReset AnchorSideTop.Side = asrBottom Left = 18 Height = 141 - Top = 107 + Top = 115 Width = 497 + BorderSpacing.Left = 18 BorderSpacing.Top = 12 - Caption = ' WinKeyer USB ' - ClientHeight = 139 + Caption = ' WinKeyer' + ClientHeight = 123 ClientWidth = 495 - TabOrder = 1 + TabOrder = 3 object lblWinPort: TLabel AnchorSideLeft.Control = gbWinkeyer AnchorSideTop.Control = gbWinkeyer Left = 6 Height = 17 Top = 6 - Width = 123 + Width = 111 BorderSpacing.Left = 6 BorderSpacing.Top = 6 - Caption = 'Radio1 keyer Port:' + Caption = 'Radio keyer Port:' + ParentColor = False end object lblWinSpeed: TLabel - AnchorSideLeft.Control = lblWinPort - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = lblWinPort - Left = 174 + AnchorSideLeft.Control = edtWinPort + AnchorSideTop.Control = edtWinPort + AnchorSideTop.Side = asrBottom + Left = 6 Height = 17 - Top = 6 - Width = 120 - BorderSpacing.Left = 45 + Top = 60 + Width = 117 + BorderSpacing.Top = 3 Caption = 'Default CW speed' + ParentColor = False end object lblWinWPM: TLabel AnchorSideLeft.Control = edtWinSpeed AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtWinSpeed AnchorSideTop.Side = asrCenter - Left = 230 + Left = 62 Height = 17 - Top = 32 - Width = 36 + Top = 86 + Width = 33 BorderSpacing.Left = 6 Caption = 'WPM' + ParentColor = False end object lblWinMinSpeed: TLabel - AnchorSideLeft.Control = lblWinSpeed - AnchorSideTop.Control = edtWinMinSpeed + AnchorSideLeft.Control = chkPotSpeed + AnchorSideTop.Control = lblWinSpeed AnchorSideTop.Side = asrCenter - Left = 174 + Left = 162 Height = 17 - Top = 89 - Width = 73 + Top = 60 + Width = 71 Caption = 'Min speed:' - Visible = False + ParentColor = False end object lblWinMaxSpeed: TLabel - AnchorSideLeft.Control = edtWinMinSpeed AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = edtWinMaxSpeed + AnchorSideTop.Control = lblWinSpeed AnchorSideTop.Side = asrCenter - Left = 314 + AnchorSideRight.Control = chkPotSpeed + AnchorSideRight.Side = asrBottom + Left = 315 Height = 17 - Top = 89 - Width = 76 - BorderSpacing.Left = 12 + Top = 60 + Width = 75 + Anchors = [akTop, akRight] Caption = 'Max speed:' - Visible = False + ParentColor = False end - object edtWinPort1: TEdit + object edtWinPort: TEdit AnchorSideLeft.Control = lblWinPort AnchorSideTop.Control = lblWinPort AnchorSideTop.Side = asrBottom @@ -7680,97 +7500,68 @@ object frmPreferences: TfrmPreferences Height = 34 Top = 23 Width = 147 - OnChange = edtWinPort1Change + OnChange = edtWinSpeedChange TabOrder = 0 - Text = 'edtWinPort1' end object edtWinSpeed: TSpinEdit AnchorSideLeft.Control = lblWinSpeed AnchorSideTop.Control = lblWinSpeed AnchorSideTop.Side = asrBottom - Left = 174 + Left = 6 Height = 34 - Top = 23 + Top = 77 Width = 50 MaxValue = 99 MinValue = 5 OnChange = edtWinSpeedChange - TabOrder = 1 + TabOrder = 2 Value = 5 end object chkPotSpeed: TCheckBox - AnchorSideLeft.Control = lblWinMaxSpeed - AnchorSideTop.Control = lblWinWPM + AnchorSideLeft.Control = edtWinPort + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtWinPort AnchorSideTop.Side = asrCenter AnchorSideRight.Side = asrBottom - Left = 314 + Left = 162 Height = 23 Top = 29 - Width = 148 + Width = 228 + BorderSpacing.Left = 9 BorderSpacing.Right = 6 - Caption = 'Use pot CW speed' + Caption = 'Use potentiometer''s CW speed' OnChange = chkPotSpeedChange - TabOrder = 2 - Visible = False + TabOrder = 1 end object edtWinMinSpeed: TSpinEdit AnchorSideLeft.Control = lblWinMinSpeed - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = edtWinPort2 - AnchorSideTop.Side = asrCenter + AnchorSideTop.Control = lblWinSpeed + AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom - Left = 252 + Left = 162 Height = 34 Top = 80 Width = 50 - BorderSpacing.Left = 5 BorderSpacing.Top = 3 MaxValue = 99 MinValue = 5 - OnChange = edtWinMinSpeedChange + OnChange = edtWinSpeedChange TabOrder = 3 Value = 5 - Visible = False end object edtWinMaxSpeed: TSpinEdit AnchorSideLeft.Control = lblWinMaxSpeed - AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtWinMinSpeed - Left = 396 + Left = 321 Height = 34 Top = 80 Width = 50 BorderSpacing.Left = 6 MaxValue = 99 MinValue = 5 - OnChange = edtWinMaxSpeedChange + OnChange = edtWinSpeedChange TabOrder = 4 Value = 60 - Visible = False - end - object lblWinPort2: TLabel - AnchorSideLeft.Control = gbWinkeyer - AnchorSideTop.Control = edtWinPort1 - AnchorSideTop.Side = asrBottom - Left = 6 - Height = 17 - Top = 63 - Width = 123 - BorderSpacing.Left = 6 - BorderSpacing.Top = 6 - Caption = 'Radio2 keyer Port:' - end - object edtWinPort2: TEdit - AnchorSideLeft.Control = lblWinPort - AnchorSideTop.Control = lblWinPort2 - AnchorSideTop.Side = asrBottom - Left = 6 - Height = 34 - Top = 80 - Width = 147 - OnChange = edtWinPort1Change - TabOrder = 5 - Text = 'edtWinPort2' end end object gbCwkeyer: TGroupBox @@ -7779,56 +7570,61 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 18 Height = 138 - Top = 254 + Top = 262 Width = 497 BorderSpacing.Top = 6 Caption = ' cwdaemon ' - ClientHeight = 136 + ClientHeight = 120 ClientWidth = 495 - TabOrder = 2 + TabOrder = 4 object lblCWAddr: TLabel AnchorSideLeft.Control = gbCwkeyer AnchorSideTop.Control = gbCwkeyer Left = 6 Height = 17 Top = 6 - Width = 60 + Width = 56 BorderSpacing.Left = 6 BorderSpacing.Top = 6 Caption = 'Address:' + ParentColor = False end object lblCWPort1: TLabel - AnchorSideLeft.Control = lblCWAddr + AnchorSideLeft.Control = edtCWAddress + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = lblCWAddr + Left = 193 + Height = 17 + Top = 6 + Width = 111 + BorderSpacing.Left = 48 + Caption = 'Radio keyer Port:' + ParentColor = False + end + object lblCWDefSpeed: TLabel + AnchorSideLeft.Control = edtCWAddress AnchorSideTop.Control = edtCWAddress AnchorSideTop.Side = asrBottom Left = 6 Height = 17 - Top = 57 - Width = 123 - Caption = 'Radio1 keyer Port:' - end - object lblCWDefSpeed: TLabel - AnchorSideLeft.Control = lblCWPort1 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = lblCWAddr - Left = 250 - Height = 17 - Top = 6 - Width = 120 - BorderSpacing.Left = 121 + Top = 60 + Width = 117 + BorderSpacing.Top = 3 Caption = 'Default CW speed' + ParentColor = False end object lblCWWPM: TLabel AnchorSideLeft.Control = edtCWSpeed AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtCWSpeed AnchorSideTop.Side = asrCenter - Left = 306 + Left = 62 Height = 17 - Top = 32 - Width = 36 + Top = 86 + Width = 33 BorderSpacing.Left = 6 Caption = 'WPM' + ParentColor = False end object edtCWAddress: TEdit AnchorSideLeft.Control = lblCWAddr @@ -7838,68 +7634,48 @@ object frmPreferences: TfrmPreferences Height = 34 Top = 23 Width = 139 + OnChange = edtWinSpeedChange TabOrder = 0 - Text = 'localhost' end - object edtCWPort1: TEdit + object edtCWPort: TEdit AnchorSideLeft.Control = lblCWPort1 AnchorSideTop.Control = lblCWPort1 AnchorSideTop.Side = asrBottom - Left = 6 + Left = 193 Height = 34 - Top = 74 + Top = 23 Width = 80 + OnChange = edtWinSpeedChange TabOrder = 1 - Text = 'edtCWPort1' end object edtCWSpeed: TSpinEdit AnchorSideLeft.Control = lblCWDefSpeed AnchorSideTop.Control = lblCWDefSpeed AnchorSideTop.Side = asrBottom - Left = 250 + Left = 6 Height = 34 - Top = 23 + Top = 77 Width = 50 MaxValue = 99 MinValue = 5 + OnChange = edtWinSpeedChange TabOrder = 2 Value = 5 end - object lblCWPort2: TLabel - AnchorSideLeft.Control = lblCWDefSpeed - AnchorSideTop.Control = lblCWPort1 - Left = 250 - Height = 17 - Top = 57 - Width = 123 - Caption = 'Radio2 keyer Port:' - end - object edtCWPort2: TEdit - AnchorSideLeft.Control = lblCWPort2 - AnchorSideTop.Control = lblCWPort2 - AnchorSideTop.Side = asrBottom - Left = 250 - Height = 34 - Top = 74 - Width = 80 - TabOrder = 3 - Text = 'edtCWPort2' - end end object btnKeyMacros: TButton - AnchorSideTop.Control = gbHamlib - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = gbHamlib + AnchorSideLeft.Control = cmbIfaceType + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = cmbCWRadio AnchorSideRight.Side = asrBottom - Left = 345 - Height = 25 - Top = 647 - Width = 170 - Anchors = [akTop, akRight] - BorderSpacing.Top = 6 + Left = 294 + Height = 29 + Top = 26 + Width = 120 + BorderSpacing.Left = 18 Caption = 'CW Messages' OnClick = btnKeyMacrosClick - TabOrder = 3 + TabOrder = 7 end object gbK3NGkey: TGroupBox AnchorSideLeft.Control = gbCwkeyer @@ -7907,46 +7683,49 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Side = asrBottom Left = 18 Height = 144 - Top = 398 + Top = 406 Width = 497 BorderSpacing.Top = 6 Caption = 'K3NG Key' - ClientHeight = 142 + ClientHeight = 126 ClientWidth = 495 - TabOrder = 4 + TabOrder = 5 object lblK3NGPort: TLabel AnchorSideLeft.Control = gbK3NGkey AnchorSideTop.Control = gbK3NGkey Left = 6 Height = 17 Top = 6 - Width = 126 + Width = 111 BorderSpacing.Left = 6 BorderSpacing.Top = 6 - Caption = 'Radio 1 keyer Port:' + Caption = 'Radio keyer Port:' + ParentColor = False end object lblK3NGSpeed: TLabel AnchorSideLeft.Control = lblK3NGPort - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = lblK3NGPort - Left = 178 + AnchorSideTop.Control = edtK3NGPort + AnchorSideTop.Side = asrBottom + Left = 6 Height = 17 - Top = 6 - Width = 120 - BorderSpacing.Left = 46 + Top = 60 + Width = 117 + BorderSpacing.Top = 3 Caption = 'Default CW speed' + ParentColor = False end object lblK3NGWPM: TLabel AnchorSideLeft.Control = edtK3NGSpeed AnchorSideLeft.Side = asrBottom - Left = 234 + Left = 62 Height = 17 Top = 31 - Width = 36 + Width = 33 BorderSpacing.Left = 6 Caption = 'WPM' + ParentColor = False end - object edtK3NGPort1: TEdit + object edtK3NGPort: TEdit AnchorSideLeft.Control = lblK3NGPort AnchorSideTop.Control = lblK3NGPort AnchorSideTop.Side = asrBottom @@ -7954,70 +7733,45 @@ object frmPreferences: TfrmPreferences Height = 34 Top = 23 Width = 147 - OnChange = edtWinPort1Change + OnChange = edtWinSpeedChange TabOrder = 0 - Text = 'edtK3NGPort1' end object edtK3NGSpeed: TSpinEdit AnchorSideLeft.Control = lblK3NGSpeed AnchorSideTop.Control = lblK3NGSpeed AnchorSideTop.Side = asrBottom - Left = 178 + Left = 6 Height = 34 - Top = 23 + Top = 77 Width = 50 MaxValue = 99 MinValue = 5 OnChange = edtWinSpeedChange - TabOrder = 1 + TabOrder = 2 Value = 5 end object edtK3NGSerSpeed: TEdit AnchorSideLeft.Control = lblK3NGSerSpeed AnchorSideTop.Control = lblK3NGSerSpeed AnchorSideTop.Side = asrBottom - Left = 178 + Left = 201 Height = 34 - Top = 80 + Top = 23 Width = 118 - OnChange = edtK3NGSerSpeedChange - TabOrder = 2 - Text = 'edtK3NGSerSpeed' + OnChange = edtWinSpeedChange + TabOrder = 1 end object lblK3NGSerSpeed: TLabel - AnchorSideLeft.Control = lblK3NGSpeed - AnchorSideTop.Control = edtK3NGPort1 - AnchorSideTop.Side = asrBottom - Left = 178 + AnchorSideLeft.Control = edtK3NGPort + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = lblK3NGPort + Left = 201 Height = 17 - Top = 63 - Width = 119 - BorderSpacing.Top = 6 + Top = 6 + Width = 114 + BorderSpacing.Left = 48 Caption = 'Serial port speed:' - end - object lblK3NGPort2: TLabel - AnchorSideLeft.Control = gbK3NGkey - AnchorSideTop.Control = edtK3NGPort1 - AnchorSideTop.Side = asrBottom - Left = 6 - Height = 17 - Top = 63 - Width = 126 - BorderSpacing.Left = 6 - BorderSpacing.Top = 6 - Caption = 'Radio 2 keyer Port:' - end - object edtK3NGPort2: TEdit - AnchorSideLeft.Control = lblK3NGPort - AnchorSideTop.Control = lblK3NGPort2 - AnchorSideTop.Side = asrBottom - Left = 6 - Height = 34 - Top = 80 - Width = 147 - OnChange = edtWinPort1Change - TabOrder = 3 - Text = 'edtK3NGPort2' + ParentColor = False end end object gbHamlib: TGroupBox @@ -8025,24 +7779,25 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Control = gbK3NGkey AnchorSideTop.Side = asrBottom Left = 18 - Height = 93 - Top = 548 + Height = 100 + Top = 556 Width = 497 BorderSpacing.Top = 6 Caption = 'HamLib' - ClientHeight = 91 + ClientHeight = 82 ClientWidth = 495 - TabOrder = 5 + TabOrder = 6 object lblHamLibSpeed: TLabel AnchorSideLeft.Control = gbHamlib AnchorSideTop.Control = gbHamlib Left = 6 Height = 17 Top = 6 - Width = 120 + Width = 117 BorderSpacing.Left = 6 BorderSpacing.Top = 6 Caption = 'Default CW speed' + ParentColor = False end object edtHamLibSpeed: TSpinEdit AnchorSideLeft.Control = lblHamLibSpeed @@ -8066,98 +7821,124 @@ object frmPreferences: TfrmPreferences Left = 62 Height = 17 Top = 32 - Width = 36 + Width = 33 BorderSpacing.Left = 6 Caption = 'WPM' + ParentColor = False end object lblHamlib: TLabel - AnchorSideLeft.Control = lblHamLibWPM + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = lblHamLibSpeed + AnchorSideRight.Control = gbHamlib + AnchorSideRight.Side = asrBottom + Left = 384 + Height = 68 + Top = 6 + Width = 99 + Anchors = [akTop, akRight] + BorderSpacing.Left = 81 + BorderSpacing.Right = 12 + Caption = 'Hamlib keyer'#10'uses selected'#10'radio''s address'#10'and port' + ParentColor = False + end + object chkUseHLBuffer: TCheckBox + AnchorSideLeft.Control = lblHamLibSpeed AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtHamLibSpeed - Left = 179 - Height = 17 + Left = 168 + Height = 23 + Hint = 'Hamlib July 2023 and after has 1k CW buffer for long strings.'#10'Setting this ignores letter by letter sending on messages '#10'longer than 10 chrs.' Top = 23 - Width = 180 - BorderSpacing.Left = 81 - Caption = 'Hamlib keyer uses selected' + Width = 165 + BorderSpacing.Left = 45 + Caption = 'Use Hamlib 1k buffer' + OnChange = cmbIfaceTypeChange + ParentShowHint = False + ShowHint = True + TabOrder = 1 end - object lblHamlib1: TLabel - AnchorSideLeft.Control = lblHamlib - AnchorSideTop.Control = lblHamlib - AnchorSideTop.Side = asrBottom - Left = 179 - Height = 17 - Top = 40 - Width = 164 - Caption = 'radio''s address and port' - end - end - object cmbIfaceType2: TComboBox - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = lblRadio2 - AnchorSideTop.Side = asrCenter - AnchorSideRight.Control = gbWinkeyer - AnchorSideRight.Side = asrBottom - Left = 345 - Height = 34 - Top = 32 - Width = 170 - Anchors = [akTop, akRight] - BorderSpacing.Left = 6 - ItemHeight = 0 - ItemIndex = 0 - Items.Strings = ( - 'None' - 'WinKeyer USB' - 'cwdaemon' - 'K3NG Key' - 'HamLib' - ) - OnChange = cmbIfaceType2Change - TabOrder = 6 - Text = 'None' - end - object lblRadio1: TLabel - AnchorSideLeft.Control = lbIfaceType - AnchorSideTop.Control = lbIfaceType - AnchorSideTop.Side = asrBottom - AnchorSideRight.Side = asrBottom - Left = 18 - Height = 17 - Top = 41 - Width = 67 - BorderSpacing.Top = 18 - Caption = 'Radio one' - end - object lblRadio2: TLabel - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = lblRadio1 - AnchorSideRight.Control = cmbIfaceType2 - Left = 271 - Height = 17 - Top = 41 - Width = 68 - Anchors = [akTop, akRight] - BorderSpacing.Right = 6 - Caption = 'Radio two' end object cbNoKeyerReset: TCheckBox - AnchorSideLeft.Control = lblRadio1 - AnchorSideTop.Control = cmbIfaceType1 + AnchorSideLeft.Control = tabCWInterface + AnchorSideTop.Control = cmbCWRadio AnchorSideTop.Side = asrBottom Left = 18 Height = 23 - Top = 72 - Width = 537 - BorderSpacing.Top = 6 - Caption = 'Do not reset keyer when switch radios (Same keyer for both, and not HamLib)' + Top = 80 + Width = 539 + BorderSpacing.Left = 18 + BorderSpacing.Top = 21 + Caption = 'Do not reset keyer when switching radios (Same keyer for all, and not HamLib)' OnChange = cbNoKeyerResetChange - TabOrder = 7 + TabOrder = 2 + end + object lblCWRadio: TLabel + AnchorSideLeft.Control = tabCWInterface + AnchorSideTop.Control = tabCWInterface + Left = 18 + Height = 17 + Top = 6 + Width = 37 + BorderSpacing.Left = 18 + BorderSpacing.Top = 6 + Caption = 'Radio' + ParentColor = False + end + object cmbCWRadio: TComboBox + AnchorSideLeft.Control = lblCWRadio + AnchorSideTop.Control = lblCWRadio + AnchorSideTop.Side = asrBottom + Left = 18 + Height = 33 + Top = 26 + Width = 120 + BorderSpacing.Top = 3 + ItemHeight = 0 + OnChange = cmbCWRadioChange + OnCloseUp = cmbCWRadioCloseUp + Style = csDropDownList + TabOrder = 0 + end + object lblNoRigForCW: TLabel + AnchorSideLeft.Control = cmbCWRadio + AnchorSideTop.Control = cmbCWRadio + AnchorSideTop.Side = asrBottom + Left = 18 + Height = 17 + Top = 62 + Width = 135 + BorderSpacing.Top = 3 + Caption = 'There is no radio!' + Font.Color = clRed + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + Visible = False + end + object cmbIfaceType: TComboBox + AnchorSideLeft.Control = lbIfaceType + AnchorSideTop.Control = cmbCWRadio + Left = 156 + Height = 29 + Top = 26 + Width = 120 + ItemHeight = 0 + Items.Strings = ( + 'None' + 'Winkeyer' + 'cwdaemon' + 'K3NG Key' + 'Hamlib' + ) + OnChange = cmbIfaceTypeChange + OnCloseUp = cmbIfaceTypeCloseUp + Style = csDropDownList + TabOrder = 1 end end object tabFldigi1: TTabSheet Caption = 'fldigi/wsjt interface' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object GroupBox31: TGroupBox AnchorSideLeft.Control = tabFldigi1 @@ -8179,35 +7960,37 @@ object frmPreferences: TfrmPreferences Left = 10 Height = 17 Top = 270 - Width = 222 + Width = 218 BorderSpacing.Left = 10 BorderSpacing.Top = 26 Caption = 'Try to load QSO from fldigi every ' + ParentColor = False end object Label92: TLabel AnchorSideLeft.Control = edtLoadFromFldigi AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtLoadFromFldigi AnchorSideTop.Side = asrCenter - Left = 302 + Left = 298 Height = 17 Top = 270 - Width = 55 + Width = 53 BorderSpacing.Left = 10 Caption = 'seconds' + ParentColor = False end object edtLoadFromFldigi: TSpinEdit AnchorSideLeft.Control = Label91 AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = Label91 AnchorSideTop.Side = asrCenter - Left = 242 + Left = 238 Height = 34 Top = 261 Width = 50 BorderSpacing.Left = 10 MinValue = 1 - TabOrder = 0 + TabOrder = 9 Value = 2 end object rgFreqFrom: TRadioGroup @@ -8237,7 +8020,7 @@ object frmPreferences: TfrmPreferences 'fldigi' 'default' ) - TabOrder = 1 + TabOrder = 3 end object edtDefaultFreq: TEdit AnchorSideRight.Control = rgFreqFrom @@ -8251,7 +8034,7 @@ object frmPreferences: TfrmPreferences Anchors = [akRight, akBottom] BorderSpacing.Right = 6 BorderSpacing.Bottom = 6 - TabOrder = 2 + TabOrder = 4 end object rgModeFrom: TRadioGroup AnchorSideLeft.Control = rgFreqFrom @@ -8281,7 +8064,7 @@ object frmPreferences: TfrmPreferences 'fldigi' 'default' ) - TabOrder = 3 + TabOrder = 5 end object cmbDefaultMode: TComboBox AnchorSideRight.Control = rgModeFrom @@ -8297,7 +8080,7 @@ object frmPreferences: TfrmPreferences BorderSpacing.Right = 6 BorderSpacing.Bottom = 6 ItemHeight = 0 - TabOrder = 4 + TabOrder = 6 end object rgRSTFrom: TRadioGroup AnchorSideLeft.Control = rgModeFrom @@ -8326,7 +8109,7 @@ object frmPreferences: TfrmPreferences 'fldigi' 'default' ) - TabOrder = 5 + TabOrder = 7 end object edtDefaultRST: TEdit AnchorSideRight.Control = rgRSTFrom @@ -8340,7 +8123,7 @@ object frmPreferences: TfrmPreferences Anchors = [akRight, akBottom] BorderSpacing.Right = 6 BorderSpacing.Bottom = 6 - TabOrder = 6 + TabOrder = 8 end object GroupBox34: TGroupBox AnchorSideLeft.Control = GroupBox31 @@ -8353,17 +8136,18 @@ object frmPreferences: TfrmPreferences BorderSpacing.Top = 6 ClientHeight = 110 ClientWidth = 541 - TabOrder = 7 + TabOrder = 0 object Label95: TLabel AnchorSideLeft.Control = edtFldigiPath AnchorSideBottom.Control = edtFldigiPath Left = 20 Height = 17 Top = 49 - Width = 91 + Width = 87 Anchors = [akLeft, akBottom] BorderSpacing.Bottom = 5 Caption = 'Path to fldigi:' + ParentColor = False end object chkRunFldigi: TCheckBox AnchorSideLeft.Control = edtFldigiPath @@ -8371,7 +8155,7 @@ object frmPreferences: TfrmPreferences Left = 20 Height = 23 Top = 16 - Width = 301 + Width = 294 Anchors = [akLeft, akBottom] BorderSpacing.Bottom = 10 Caption = 'Run fldigi after entering to Remote mode' @@ -8416,7 +8200,7 @@ object frmPreferences: TfrmPreferences Width = 80 BorderSpacing.Left = 26 BorderSpacing.Top = 22 - TabOrder = 8 + TabOrder = 1 end object edtFldigiIp: TEdit AnchorSideLeft.Control = edtFldigiPort @@ -8428,58 +8212,60 @@ object frmPreferences: TfrmPreferences Top = 83 Width = 80 BorderSpacing.Top = 2 - TabOrder = 9 + TabOrder = 2 end object Label48: TLabel AnchorSideLeft.Control = edtFldigiIp AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = edtFldigiPort AnchorSideTop.Side = asrBottom - Left = 591 + Left = 593 Height = 17 Top = 64 - Width = 60 + Width = 56 BorderSpacing.Top = 2 Caption = 'Address:' + ParentColor = False end object Label49: TLabel AnchorSideLeft.Control = edtFldigiPort AnchorSideLeft.Side = asrCenter AnchorSideBottom.Control = edtFldigiPort AnchorSideBottom.Side = asrBottom - Left = 604 + Left = 606 Height = 17 Top = 10 - Width = 34 + Width = 30 Anchors = [akLeft, akBottom] BorderSpacing.Bottom = 35 Caption = 'Port:' + ParentColor = False end object chkFldXmlRpc: TCheckBox AnchorSideLeft.Control = edtDropSyncErr AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtDropSyncErr AnchorSideTop.Side = asrCenter - Left = 605 + Left = 599 Height = 23 Top = 267 Width = 105 BorderSpacing.Left = 10 Caption = 'Use XmlRpc' - TabOrder = 10 + TabOrder = 11 end object edtDropSyncErr: TSpinEdit AnchorSideLeft.Control = Label50 AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = Label50 AnchorSideTop.Side = asrCenter - Left = 545 + Left = 539 Height = 34 Top = 261 Width = 50 BorderSpacing.Left = 10 MaxValue = 20 - TabOrder = 11 + TabOrder = 10 Value = 2 end object Label50: TLabel @@ -8487,12 +8273,13 @@ object frmPreferences: TfrmPreferences AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = Label92 AnchorSideTop.Side = asrCenter - Left = 397 + Left = 391 Height = 17 Top = 270 Width = 138 BorderSpacing.Left = 40 Caption = 'Drop after SyncErr >' + ParentColor = False end end object GroupBox51: TGroupBox @@ -8500,12 +8287,12 @@ object frmPreferences: TfrmPreferences AnchorSideTop.Control = GroupBox31 AnchorSideTop.Side = asrBottom Left = 6 - Height = 264 + Height = 300 Top = 340 Width = 724 BorderSpacing.Top = 6 Caption = 'Reading data from wsjtx' - ClientHeight = 262 + ClientHeight = 298 ClientWidth = 722 TabOrder = 1 object GroupBox52: TGroupBox @@ -8526,10 +8313,11 @@ object frmPreferences: TfrmPreferences Left = 25 Height = 17 Top = 44 - Width = 91 + Width = 89 Anchors = [akLeft, akBottom] BorderSpacing.Bottom = 5 Caption = 'Path to wsjtx:' + ParentColor = False end object chkRunWsjt: TCheckBox AnchorSideLeft.Control = edtWsjtPath @@ -8537,7 +8325,7 @@ object frmPreferences: TfrmPreferences Left = 25 Height = 23 Top = 11 - Width = 366 + Width = 362 Anchors = [akLeft, akBottom] BorderSpacing.Bottom = 10 Caption = 'Run wsjtx after entering to Remote mode for wsjt-x' @@ -8554,7 +8342,7 @@ object frmPreferences: TfrmPreferences Anchors = [akLeft, akBottom] BorderSpacing.Left = 20 BorderSpacing.Around = 5 - TabOrder = 1 + TabOrder = 2 end object btnWsjtPath: TButton AnchorSideLeft.Side = asrBottom @@ -8568,7 +8356,7 @@ object frmPreferences: TfrmPreferences Anchors = [akRight, akBottom] Caption = 'Browse' OnClick = btnWsjtPathClick - TabOrder = 2 + TabOrder = 1 end end object lblwsjtport: TLabel @@ -8576,12 +8364,13 @@ object frmPreferences: TfrmPreferences AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = lblADIFport AnchorSideBottom.Side = asrBottom - Left = 603 + Left = 605 Height = 17 Top = 6 - Width = 67 + Width = 63 BorderSpacing.Bottom = 35 Caption = 'Wsjt port:' + ParentColor = False end object edtWsjtPort: TEdit AnchorSideLeft.Control = edtADIFPort @@ -8593,7 +8382,7 @@ object frmPreferences: TfrmPreferences Top = 24 Width = 80 BorderSpacing.Left = 16 - TabOrder = 1 + TabOrder = 2 end object rgWsjtModeFrom: TRadioGroup AnchorSideLeft.Control = rgWsjtFreqFrom @@ -8623,7 +8412,7 @@ object frmPreferences: TfrmPreferences 'wsjtx' 'default' ) - TabOrder = 2 + TabOrder = 7 end object rgWsjtFreqFrom: TRadioGroup AnchorSideLeft.Control = GroupBox51 @@ -8653,7 +8442,7 @@ object frmPreferences: TfrmPreferences 'wsjtx' 'default' ) - TabOrder = 3 + TabOrder = 5 end object edtWsjtDefaultFreq: TEdit AnchorSideRight.Control = rgWsjtFreqFrom @@ -8667,7 +8456,7 @@ object frmPreferences: TfrmPreferences Anchors = [akRight, akBottom] BorderSpacing.Right = 5 BorderSpacing.Bottom = 5 - TabOrder = 4 + TabOrder = 6 end object cmbWsjtDefaultMode: TComboBox AnchorSideRight.Control = rgWsjtModeFrom @@ -8683,7 +8472,7 @@ object frmPreferences: TfrmPreferences BorderSpacing.Right = 5 BorderSpacing.Bottom = 5 ItemHeight = 0 - TabOrder = 5 + TabOrder = 8 end object edtWsjtIp: TEdit AnchorSideTop.Control = lblwsjtaddr @@ -8696,19 +8485,20 @@ object frmPreferences: TfrmPreferences Width = 81 Anchors = [akTop, akRight] BorderSpacing.Top = 2 - TabOrder = 6 + TabOrder = 4 end object lblwsjtaddr: TLabel AnchorSideLeft.Control = edtWsjtIp AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = edtWsjtPort AnchorSideTop.Side = asrBottom - Left = 601 + Left = 602 Height = 17 Top = 60 - Width = 69 + Width = 66 BorderSpacing.Top = 2 Caption = 'Wsjt addr:' + ParentColor = False end object cgLimit: TCheckGroup AnchorSideLeft.Control = rgWsjtModeFrom @@ -8737,7 +8527,7 @@ object frmPreferences: TfrmPreferences 'Call' 'Loc' ) - TabOrder = 7 + TabOrder = 9 Data = { 020000000202 } @@ -8756,7 +8546,7 @@ object frmPreferences: TfrmPreferences AutoSize = False NumGlyphs = 1 MaxLength = 10 - TabOrder = 2 + TabOrder = 0 Text = ' . . ' end object DateEditLoc: TDateEdit @@ -8776,7 +8566,7 @@ object frmPreferences: TfrmPreferences BorderSpacing.Top = 10 NumGlyphs = 1 MaxLength = 10 - TabOrder = 3 + TabOrder = 2 Text = ' . . ' end end @@ -8791,7 +8581,7 @@ object frmPreferences: TfrmPreferences Width = 80 BorderSpacing.Left = 8 BorderSpacing.Top = 18 - TabOrder = 8 + TabOrder = 1 end object lblADIFport: TLabel AnchorSideLeft.Control = GroupBox52 @@ -8801,10 +8591,11 @@ object frmPreferences: TfrmPreferences Left = 504 Height = 17 Top = 6 - Width = 69 + Width = 65 BorderSpacing.Left = 12 BorderSpacing.Bottom = 35 Caption = 'ADIF port:' + ParentColor = False end object edtADIFIp: TEdit AnchorSideLeft.Control = edtADIFPort @@ -8816,25 +8607,38 @@ object frmPreferences: TfrmPreferences Top = 79 Width = 81 BorderSpacing.Top = 2 - TabOrder = 9 + TabOrder = 3 end object lblADIFaddr: TLabel AnchorSideLeft.Control = edtADIFIp AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = edtADIFPort AnchorSideTop.Side = asrBottom - Left = 505 + Left = 506 Height = 17 Top = 60 - Width = 71 + Width = 68 BorderSpacing.Top = 2 Caption = 'ADIF addr:' + ParentColor = False + end + object chkwsjtLoeQ: TCheckBox + AnchorSideLeft.Control = rgWsjtFreqFrom + AnchorSideTop.Control = rgWsjtFreqFrom + AnchorSideTop.Side = asrBottom + Left = 12 + Height = 23 + Top = 245 + Width = 281 + BorderSpacing.Top = 6 + Caption = 'Show LoTW, eQSL usage in CQ-monitor' + TabOrder = 10 end end end object tabAutoBackup: TTabSheet Caption = 'Exit & Auto backup' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object GroupBox32: TGroupBox Left = 8 @@ -8854,6 +8658,7 @@ object frmPreferences: TfrmPreferences Width = 104 BorderSpacing.Top = 12 Caption = 'Save backup to:' + ParentColor = False end object chkEnableBackup: TCheckBox AnchorSideLeft.Control = GroupBox32 @@ -8861,7 +8666,7 @@ object frmPreferences: TfrmPreferences Left = 16 Height = 23 Top = 7 - Width = 288 + Width = 279 BorderSpacing.Left = 16 BorderSpacing.Top = 7 Caption = 'Enable autobackup after program ends' @@ -8898,7 +8703,7 @@ object frmPreferences: TfrmPreferences Left = 16 Height = 23 Top = 297 - Width = 219 + Width = 215 BorderSpacing.Top = 18 Caption = 'Compress backup with tar.gz' TabOrder = 3 @@ -8935,10 +8740,10 @@ object frmPreferences: TfrmPreferences AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = chkEnableBackup AnchorSideTop.Side = asrBottom - Left = 50 + Left = 47 Height = 23 Top = 30 - Width = 221 + Width = 216 Caption = 'Ask before creating a backup' TabOrder = 5 end @@ -8972,43 +8777,48 @@ object frmPreferences: TfrmPreferences Left = 16 Height = 17 Top = 65 - Width = 557 + Width = 547 BorderSpacing.Top = 12 Caption = 'Check "Enable autobackup" and "Ask before" to prevent accidental closing of cqrlog' + ParentColor = False end end end object tabExtViewers: TTabSheet Caption = 'External viewers' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object Label99: TLabel Left = 23 Height = 17 Top = 30 - Width = 103 + Width = 102 Caption = 'Text files(*.txt):' + ParentColor = False end object Label100: TLabel Left = 23 Height = 17 Top = 86 - Width = 110 + Width = 108 Caption = 'PDF files (*.pdf):' + ParentColor = False end object Label101: TLabel Left = 23 Height = 17 Top = 142 - Width = 162 + Width = 160 Caption = 'Images (*.jpg;*.png*.gif)' + ParentColor = False end object Label102: TLabel Left = 21 Height = 17 Top = 240 - Width = 163 + Width = 161 Caption = 'HTML files(*.html;*.htm)' + ParentColor = False end object edtTxtFiles: TEdit Left = 47 @@ -9047,7 +8857,7 @@ object frmPreferences: TfrmPreferences Left = 47 Height = 23 Top = 200 - Width = 310 + Width = 307 Caption = 'Open QSL card images with internal viewer' TabOrder = 4 end @@ -9058,84 +8868,173 @@ object frmPreferences: TfrmPreferences Width = 1 Font.Color = clRed Font.Style = [fsBold] + ParentColor = False ParentFont = False end end object tabCallbook: TTabSheet Caption = 'Callbook support' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object GroupBox38: TGroupBox - Left = 13 + AnchorSideLeft.Control = tabCallbook + AnchorSideTop.Control = tabCallbook + Left = 6 Height = 160 - Top = 8 - Width = 585 + Top = 6 + Width = 650 + BorderSpacing.Left = 6 + BorderSpacing.Top = 6 Caption = ' Callbook search ' ClientHeight = 158 - ClientWidth = 583 + ClientWidth = 648 TabOrder = 0 object rbHamQTH: TRadioButton - Left = 6 + AnchorSideLeft.Control = Label111 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox38 + Left = 93 Height = 23 - Top = 7 - Width = 122 + Top = 6 + Width = 121 + BorderSpacing.Left = 12 + BorderSpacing.Top = 6 Caption = 'HamQTH.com ' Checked = True TabOrder = 0 TabStop = True end object rbQRZ: TRadioButton - Left = 6 + AnchorSideLeft.Control = edtCbQRZUser + AnchorSideTop.Control = rbHamQTH + Left = 225 Height = 23 - Top = 31 - Width = 88 + Top = 6 + Width = 86 Caption = 'QRZ.com' + TabOrder = 3 + end + object edtCbHamQTHUser: TEdit + AnchorSideLeft.Control = Label111 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = rbHamQTH + AnchorSideTop.Side = asrBottom + Left = 93 + Height = 34 + Top = 41 + Width = 120 + BorderSpacing.Left = 12 + BorderSpacing.Top = 12 TabOrder = 1 end - object edtCbUser: TEdit - Left = 96 - Height = 34 - Top = 63 - Width = 134 - TabOrder = 2 - end object Label111: TLabel + AnchorSideLeft.Control = GroupBox38 + AnchorSideTop.Control = edtCbHamQTHUser + AnchorSideTop.Side = asrCenter Left = 6 Height = 17 - Top = 71 + Top = 50 Width = 75 + BorderSpacing.Left = 6 Caption = 'User name:' + ParentColor = False end object Label112: TLabel + AnchorSideLeft.Control = Label111 + AnchorSideTop.Control = edtCbHamQTHPass + AnchorSideTop.Side = asrCenter Left = 6 Height = 17 - Top = 103 - Width = 70 + Top = 90 + Width = 66 Caption = 'Password:' + ParentColor = False end - object edtCbPass: TEdit - Left = 96 + object edtCbHamQTHPass: TEdit + AnchorSideLeft.Control = edtCbHamQTHUser + AnchorSideTop.Control = edtCbHamQTHUser + AnchorSideTop.Side = asrBottom + Left = 93 Height = 34 - Top = 97 - Width = 134 + Top = 81 + Width = 120 + BorderSpacing.Top = 6 EchoMode = emPassword PasswordChar = '*' - TabOrder = 3 + TabOrder = 2 + end + object rbQRZCQ: TRadioButton + AnchorSideLeft.Control = edtCbQRZCQUser + AnchorSideTop.Control = rbHamQTH + Left = 357 + Height = 23 + Top = 6 + Width = 105 + Caption = 'QRZCQ.com' + TabOrder = 6 + end + object edtCbQRZUser: TEdit + AnchorSideLeft.Control = edtCbHamQTHUser + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtCbHamQTHUser + Left = 225 + Height = 34 + Top = 41 + Width = 120 + BorderSpacing.Left = 12 + TabOrder = 4 + end + object edtCbQRZCQUser: TEdit + AnchorSideLeft.Control = edtCbQRZUser + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtCbQRZUser + Left = 357 + Height = 34 + Top = 41 + Width = 120 + BorderSpacing.Left = 12 + TabOrder = 7 + end + object edtCbQRZPass: TEdit + AnchorSideLeft.Control = edtCbQRZUser + AnchorSideTop.Control = edtCbHamQTHUser + AnchorSideTop.Side = asrBottom + Left = 225 + Height = 34 + Top = 81 + Width = 120 + BorderSpacing.Top = 6 + EchoMode = emPassword + PasswordChar = '*' + TabOrder = 5 + end + object edtCbQRZCQPass: TEdit + AnchorSideLeft.Control = edtCbQRZCQUser + AnchorSideTop.Control = edtCbHamQTHUser + AnchorSideTop.Side = asrBottom + Left = 357 + Height = 34 + Top = 81 + Width = 120 + BorderSpacing.Top = 6 + EchoMode = emPassword + PasswordChar = '*' + TabOrder = 8 end end end object tabRBN: TTabSheet Caption = 'RBN support' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object chkRBNAutoConn: TCheckBox AnchorSideLeft.Control = lblRbnWindowOpen AnchorSideTop.Control = cmbCl10db AnchorSideTop.Side = asrCenter - Left = 405 + Left = 404 Height = 23 Top = 219 - Width = 201 + Width = 198 Caption = 'Autoconnect RBN Grayline' TabOrder = 0 end @@ -9143,7 +9042,7 @@ object frmPreferences: TfrmPreferences AnchorSideLeft.Control = edtRBNServer AnchorSideTop.Control = edtRBNServer AnchorSideTop.Side = asrBottom - Left = 95 + Left = 94 Height = 34 Top = 95 Width = 101 @@ -9157,8 +9056,9 @@ object frmPreferences: TfrmPreferences Left = 24 Height = 17 Top = 104 - Width = 40 + Width = 39 Caption = 'Login:' + ParentColor = False end object lblRbnWatchFor: TLabel AnchorSideLeft.Control = lblRbnHeader @@ -9167,14 +9067,15 @@ object frmPreferences: TfrmPreferences Left = 24 Height = 17 Top = 138 - Width = 70 + Width = 67 Caption = 'Watch for:' + ParentColor = False end object edtWatchFor: TEdit AnchorSideLeft.Control = edtRBNLogin AnchorSideTop.Control = edtRBNLogin AnchorSideTop.Side = asrBottom - Left = 95 + Left = 94 Height = 34 Top = 129 Width = 101 @@ -9186,24 +9087,26 @@ object frmPreferences: TfrmPreferences AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtRBNLogin AnchorSideTop.Side = asrCenter - Left = 202 + Left = 201 Height = 17 Top = 104 - Width = 172 + Width = 175 BorderSpacing.Left = 6 Caption = '(usually your own callsign)' + ParentColor = False end object lblRbnWatchForHint: TLabel AnchorSideLeft.Control = edtWatchFor AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtWatchFor AnchorSideTop.Side = asrCenter - Left = 202 + Left = 201 Height = 17 Top = 138 - Width = 365 + Width = 367 BorderSpacing.Left = 6 Caption = '(callsign you are watching for, also can be your callsign)' + ParentColor = False end object lblRbnHeader: TLabel AnchorSideLeft.Control = tabRBN @@ -9211,10 +9114,11 @@ object frmPreferences: TfrmPreferences Left = 24 Height = 34 Top = 12 - Width = 644 + Width = 646 BorderSpacing.Left = 24 BorderSpacing.Top = 12 Caption = 'CQRLOG can receive spots from RBN and show receivers as dots on Gray line map. It''s very useful '#10'especially when you are calling CQ and want to see where your signal can be received.' + ParentColor = False end object lblRbnSignal: TLabel AnchorSideLeft.Control = lblRbnHeader @@ -9223,18 +9127,20 @@ object frmPreferences: TfrmPreferences Left = 24 Height = 17 Top = 187 - Width = 93 + Width = 92 BorderSpacing.Top = 24 Caption = 'Signal strench' + ParentColor = False end object lblRbnColor: TLabel AnchorSideLeft.Control = lblRbnWatchForHint AnchorSideTop.Control = lblRbnSignal - Left = 202 + Left = 201 Height = 17 Top = 187 - Width = 37 + Width = 34 Caption = 'Color' + ParentColor = False end object lblRbnDb1: TLabel AnchorSideLeft.Control = lblRbnHeader @@ -9245,12 +9151,13 @@ object frmPreferences: TfrmPreferences Top = 222 Width = 60 Caption = '0 ... 10db' + ParentColor = False end object cmbCl10db: TColorBox AnchorSideLeft.Control = lblRbnColor AnchorSideTop.Control = lblRbnColor AnchorSideTop.Side = asrBottom - Left = 202 + Left = 201 Height = 29 Top = 216 Width = 137 @@ -9271,12 +9178,13 @@ object frmPreferences: TfrmPreferences Top = 251 Width = 68 Caption = '11 ... 20db' + ParentColor = False end object cmbCl20db: TColorBox AnchorSideLeft.Control = cmbCl10db AnchorSideTop.Control = cmbCl10db AnchorSideTop.Side = asrBottom - Left = 202 + Left = 201 Height = 29 Top = 245 Width = 137 @@ -9296,12 +9204,13 @@ object frmPreferences: TfrmPreferences Top = 280 Width = 68 Caption = '21 ... 30db' + ParentColor = False end object cmbCl30db: TColorBox AnchorSideLeft.Control = cmbCl20db AnchorSideTop.Control = cmbCl20db AnchorSideTop.Side = asrBottom - Left = 202 + Left = 201 Height = 29 Top = 274 Width = 137 @@ -9321,12 +9230,13 @@ object frmPreferences: TfrmPreferences Top = 309 Width = 66 Caption = 'over 30dB' + ParentColor = False end object cmbClOver30db: TColorBox AnchorSideLeft.Control = cmbCl30db AnchorSideTop.Control = cmbCl30db AnchorSideTop.Side = asrBottom - Left = 202 + Left = 201 Height = 29 Top = 303 Width = 137 @@ -9341,7 +9251,7 @@ object frmPreferences: TfrmPreferences AnchorSideLeft.Control = lblRbnWindowOpen AnchorSideTop.Control = cmbClOver30db AnchorSideTop.Side = asrCenter - Left = 405 + Left = 404 Height = 34 Top = 300 Width = 40 @@ -9353,12 +9263,13 @@ object frmPreferences: TfrmPreferences AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = cmbClOver30db AnchorSideTop.Side = asrCenter - Left = 446 + Left = 445 Height = 17 Top = 309 - Width = 190 + Width = 186 BorderSpacing.Left = 1 Caption = 'seconds view time for dot(s)' + ParentColor = False end object lnlRbnServer: TLabel AnchorSideLeft.Control = lblRbnHeader @@ -9367,16 +9278,17 @@ object frmPreferences: TfrmPreferences Left = 24 Height = 17 Top = 70 - Width = 47 + Width = 46 BorderSpacing.Top = 24 Caption = 'Server:' + ParentColor = False end object edtRBNServer: TEdit AnchorSideLeft.Control = lnlRbnServer AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lnlRbnServer AnchorSideTop.Side = asrCenter - Left = 95 + Left = 94 Height = 34 Top = 61 Width = 304 @@ -9389,40 +9301,42 @@ object frmPreferences: TfrmPreferences AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lnlRbnServer AnchorSideTop.Side = asrCenter - Left = 405 + Left = 404 Height = 17 Top = 70 - Width = 76 + Width = 71 BorderSpacing.Left = 6 Caption = 'server:port' + ParentColor = False end object lblRbnWindowOpen: TLabel AnchorSideLeft.Control = lblRbnAdrFormat AnchorSideTop.Control = lblRbnSignal - Left = 405 + Left = 404 Height = 17 Top = 187 - Width = 138 + Width = 132 Caption = 'After window opens:' + ParentColor = False end object chkRBNMAutoConn: TCheckBox AnchorSideLeft.Control = lblRbnWindowOpen AnchorSideTop.Control = cmbCl20db AnchorSideTop.Side = asrCenter - Left = 405 + Left = 404 Height = 23 Top = 248 - Width = 202 + Width = 193 Caption = 'Autoconnect RBN Monitor' TabOrder = 9 end object chkRBNLink: TCheckBox AnchorSideLeft.Control = lblRbnWindowOpen AnchorSideTop.Control = cmbCl30db - Left = 405 + Left = 404 Height = 23 Top = 274 - Width = 219 + Width = 216 Caption = 'Link Grayline to RBN monitor' OnChange = chkRBNLinkChange TabOrder = 10 @@ -9430,371 +9344,739 @@ object frmPreferences: TfrmPreferences end object tabOnlineLog: TTabSheet Caption = 'Online log upload' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object GroupBox44: TGroupBox - Left = 13 - Height = 179 - Top = 7 - Width = 569 + AnchorSideLeft.Control = tabOnlineLog + AnchorSideTop.Control = tabOnlineLog + Left = 12 + Height = 155 + Top = 0 + Width = 650 + BorderSpacing.Left = 12 Caption = ' HamQTH ' - ClientHeight = 177 - ClientWidth = 567 + ClientHeight = 135 + ClientWidth = 648 TabOrder = 0 object chkHaUpEnabled: TCheckBox - Left = 7 + AnchorSideLeft.Control = GroupBox44 + AnchorSideTop.Control = GroupBox44 + Left = 6 Height = 23 - Top = 4 - Width = 202 + Top = 0 + Width = 199 + BorderSpacing.Left = 6 Caption = 'Enable upload to HamQTH' OnChange = chkHaUpEnabledChange TabOrder = 0 end object Label179: TLabel - Left = 9 - Height = 17 - Top = 36 + AnchorSideLeft.Control = chkHaUpEnabled + AnchorSideTop.Control = edtHaUserName + AnchorSideTop.Side = asrCenter + Left = 6 + Height = 19 + Top = 68 Width = 75 + BorderSpacing.Top = 6 Caption = 'User name:' + ParentColor = False end object edtHaUserName: TEdit - Left = 9 - Height = 34 - Top = 52 + AnchorSideLeft.Control = Label179 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtHamQTHurl + AnchorSideTop.Side = asrBottom + Left = 84 + Height = 36 + Top = 59 Width = 102 - TabOrder = 1 + BorderSpacing.Left = 3 + TabOrder = 3 Text = 'edtHaUserName' end object lbl: TLabel - Left = 199 - Height = 17 - Top = 36 - Width = 70 + AnchorSideLeft.Control = edtHaUserName + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = Label179 + Left = 198 + Height = 19 + Top = 68 + Width = 68 + BorderSpacing.Left = 12 Caption = 'Password:' + ParentColor = False end object edtHaPasswd: TEdit - Left = 199 - Height = 34 - Top = 52 + AnchorSideLeft.Control = lbl + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = lbl + AnchorSideTop.Side = asrCenter + Left = 269 + Height = 36 + Top = 59 Width = 104 + BorderSpacing.Left = 3 EchoMode = emPassword PasswordChar = '*' - TabOrder = 2 + TabOrder = 4 Text = 'edtHaPasswd' end object chkHaupOnline: TCheckBox - Left = 7 + AnchorSideLeft.Control = chkHaUpEnabled + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox44 + Left = 208 Height = 23 - Top = 92 - Width = 417 - Caption = 'Upload QSO data immediately after save, update or delete' - TabOrder = 3 + Top = 0 + Width = 222 + BorderSpacing.Left = 3 + Caption = 'Upload QSO data immediately' + TabOrder = 1 end object Label184: TLabel - Left = 9 - Height = 17 - Top = 132 - Width = 53 + AnchorSideLeft.Control = Label179 + AnchorSideTop.Control = cmbHaColor + AnchorSideTop.Side = asrCenter + Left = 6 + Height = 19 + Top = 104 + Width = 52 + BorderSpacing.Top = 9 Caption = 'Use this' + ParentColor = False end object Label185: TLabel - Left = 238 - Height = 17 - Top = 132 - Width = 338 + AnchorSideLeft.Control = cmbHaColor + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = cmbHaColor + AnchorSideTop.Side = asrCenter + Left = 234 + Height = 19 + Top = 104 + Width = 324 + BorderSpacing.Left = 6 Caption = 'color to show information in status upload window' + ParentColor = False end object cmbHaColor: TColorBox - Left = 62 - Height = 29 - Top = 124 + AnchorSideLeft.Control = Label184 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtHaUserName + AnchorSideTop.Side = asrBottom + Left = 64 + Height = 31 + Top = 98 Width = 164 DefaultColorColor = clBlue NoneColorColor = clMoneyGreen Selected = clBlue Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbPrettyNames] + BorderSpacing.Left = 6 + BorderSpacing.Top = 3 ItemHeight = 28 - TabOrder = 4 + TabOrder = 5 + end + object edtHamQTHurl: TEdit + AnchorSideLeft.Control = chkHaUpEnabled + AnchorSideTop.Control = chkHaUpEnabled + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 36 + Top = 23 + Width = 600 + TabOrder = 2 + Text = 'http://www.hamqth.com/qso_realtime.php' end end object GroupBox45: TGroupBox + AnchorSideLeft.Control = GroupBox44 + AnchorSideTop.Control = GroupBox44 + AnchorSideTop.Side = asrBottom Left = 12 - Height = 168 - Top = 194 - Width = 569 + Height = 194 + Top = 158 + Width = 650 + BorderSpacing.Top = 3 Caption = ' ClubLog ' - ClientHeight = 166 - ClientWidth = 567 + ClientHeight = 174 + ClientWidth = 648 TabOrder = 1 object chkClUpEnabled: TCheckBox - Left = 7 + AnchorSideLeft.Control = GroupBox45 + AnchorSideTop.Control = GroupBox45 + Left = 6 Height = 23 - Top = 4 - Width = 196 + Top = 0 + Width = 189 + BorderSpacing.Left = 6 Caption = 'Enable upload to ClubLog' OnChange = chkClUpEnabledChange TabOrder = 0 end object Label180: TLabel - Left = 9 - Height = 17 - Top = 36 + AnchorSideLeft.Control = chkClUpEnabled + AnchorSideTop.Control = edtClUserName + AnchorSideTop.Side = asrCenter + Left = 6 + Height = 19 + Top = 107 Width = 56 Caption = 'Callsign:' + ParentColor = False end object edtClUserName: TEdit - Left = 9 - Height = 34 - Top = 57 + AnchorSideLeft.Control = Label180 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtClubLogUrlDel + AnchorSideTop.Side = asrBottom + Left = 62 + Height = 36 + Top = 98 Width = 102 - TabOrder = 1 + BorderSpacing.Top = 3 + TabOrder = 4 Text = 'edtClUserName' end object lbl1: TLabel - Left = 198 - Height = 17 - Top = 36 - Width = 70 + AnchorSideLeft.Control = edtClUserName + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = Label180 + AnchorSideTop.Side = asrCenter + Left = 170 + Height = 19 + Top = 107 + Width = 68 + BorderSpacing.Left = 6 Caption = 'Password:' + ParentColor = False end object edtClPasswd: TEdit - Left = 198 - Height = 34 - Top = 57 + AnchorSideLeft.Control = lbl1 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtClUserName + AnchorSideTop.Side = asrCenter + Left = 238 + Height = 36 + Top = 98 Width = 104 EchoMode = emPassword PasswordChar = '*' - TabOrder = 2 + TabOrder = 5 Text = 'edtClPasswd' end object chkClUpOnline: TCheckBox - Left = 6 + AnchorSideLeft.Control = chkClUpEnabled + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox45 + Left = 198 Height = 23 - Top = 89 - Width = 417 - Caption = 'Upload QSO data immediately after save, update or delete' - TabOrder = 4 + Top = 0 + Width = 222 + BorderSpacing.Left = 3 + Caption = 'Upload QSO data immediately' + TabOrder = 1 end object Label181: TLabel - Left = 358 - Height = 17 - Top = 36 - Width = 41 + AnchorSideLeft.Control = edtClPasswd + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = Label180 + Left = 348 + Height = 19 + Top = 107 + Width = 42 + BorderSpacing.Left = 6 Caption = 'Email:' + ParentColor = False end object edtClEmail: TEdit - Left = 358 - Height = 34 - Top = 57 + AnchorSideLeft.Control = Label181 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = Label181 + AnchorSideTop.Side = asrCenter + Left = 390 + Height = 36 + Top = 98 Width = 184 - TabOrder = 3 + TabOrder = 6 Text = 'edtClEmail' end object Label186: TLabel - Left = 10 - Height = 17 - Top = 121 - Width = 53 + AnchorSideLeft.Control = Label180 + AnchorSideTop.Control = cmbClColor + AnchorSideTop.Side = asrCenter + Left = 6 + Height = 19 + Top = 143 + Width = 52 Caption = 'Use this' + ParentColor = False end object Label187: TLabel - Left = 238 - Height = 17 - Top = 121 - Width = 338 + AnchorSideLeft.Control = cmbClColor + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = cmbClColor + AnchorSideTop.Side = asrCenter + Left = 234 + Height = 19 + Top = 143 + Width = 324 + BorderSpacing.Left = 6 Caption = 'color to show information in status upload window' + ParentColor = False end object cmbClColor: TColorBox - Left = 65 - Height = 29 - Top = 113 + AnchorSideLeft.Control = Label186 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtClUserName + AnchorSideTop.Side = asrBottom + Left = 64 + Height = 31 + Top = 137 Width = 164 DefaultColorColor = clRed NoneColorColor = clMoneyGreen Selected = clRed Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbPrettyNames] + BorderSpacing.Left = 6 + BorderSpacing.Top = 3 ItemHeight = 28 - TabOrder = 5 + TabOrder = 7 + end + object edtClubLogUrl: TEdit + AnchorSideLeft.Control = chkClUpEnabled + AnchorSideTop.Control = chkClUpEnabled + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 36 + Top = 23 + Width = 600 + TabOrder = 2 + Text = 'https://clublog.org/realtime.php' + end + object edtClubLogUrlDel: TEdit + AnchorSideLeft.Control = chkClUpEnabled + AnchorSideTop.Control = edtClubLogUrl + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 36 + Top = 59 + Width = 600 + TabOrder = 3 + Text = 'https://clublog.org/delete.php' end end object GroupBox46: TGroupBox + AnchorSideLeft.Control = GroupBox45 + AnchorSideTop.Control = GroupBox45 + AnchorSideTop.Side = asrBottom Left = 12 - Height = 168 - Top = 370 - Width = 569 + Height = 157 + Top = 355 + Width = 650 + BorderSpacing.Top = 3 Caption = ' HRDLog.net ' - ClientHeight = 166 - ClientWidth = 567 + ClientHeight = 137 + ClientWidth = 648 TabOrder = 2 object chkHrUpEnabled: TCheckBox - Left = 7 + AnchorSideLeft.Control = GroupBox46 + AnchorSideTop.Control = GroupBox46 + Left = 6 Height = 23 - Top = 4 - Width = 221 + Top = 0 + Width = 215 + BorderSpacing.Left = 6 Caption = 'Enable upload to HRDLog.net' OnChange = chkHrUpEnabledChange TabOrder = 0 end object Label182: TLabel - Left = 9 - Height = 17 - Top = 36 + AnchorSideLeft.Control = chkHrUpEnabled + AnchorSideTop.Control = edtHrUserName + AnchorSideTop.Side = asrCenter + Left = 6 + Height = 19 + Top = 71 Width = 56 + BorderSpacing.Top = 3 Caption = 'Callsign:' + ParentColor = False end object edtHrUserName: TEdit - Left = 9 - Height = 34 - Top = 57 + AnchorSideLeft.Control = Label182 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtHrdUrl + AnchorSideTop.Side = asrBottom + Left = 62 + Height = 36 + Top = 62 Width = 102 - TabOrder = 1 + BorderSpacing.Top = 3 + TabOrder = 3 Text = 'edtHrUserName' end object chkHrUpOnline: TCheckBox - Left = 6 + AnchorSideLeft.Control = chkHrUpEnabled + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox46 + Left = 224 Height = 23 - Top = 89 - Width = 417 - Caption = 'Upload QSO data immediately after save, update or delete' - TabOrder = 3 + Top = 0 + Width = 222 + BorderSpacing.Left = 3 + Caption = 'Upload QSO data immediately' + TabOrder = 1 end object Label183: TLabel - Left = 200 - Height = 17 - Top = 36 - Width = 39 + AnchorSideLeft.Control = edtHrUserName + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = Label182 + Left = 170 + Height = 19 + Top = 71 + Width = 37 + BorderSpacing.Left = 6 Caption = 'Code:' + ParentColor = False end object edtHrCode: TEdit - Left = 200 - Height = 34 - Top = 57 + AnchorSideLeft.Control = Label183 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtHrUserName + AnchorSideTop.Side = asrCenter + Left = 207 + Height = 36 + Top = 62 Width = 184 - TabOrder = 2 + TabOrder = 4 Text = 'edtHrCode' end object Label188: TLabel - Left = 9 - Height = 17 - Top = 125 - Width = 53 + AnchorSideLeft.Control = Label182 + AnchorSideTop.Control = cmbHrColor + AnchorSideTop.Side = asrCenter + Left = 6 + Height = 19 + Top = 107 + Width = 52 Caption = 'Use this' + ParentColor = False end object cmbHrColor: TColorBox + AnchorSideLeft.Control = Label188 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtHrUserName + AnchorSideTop.Side = asrBottom Left = 64 - Height = 29 - Top = 117 + Height = 31 + Top = 101 Width = 164 DefaultColorColor = clPurple NoneColorColor = clMoneyGreen Selected = clPurple Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbPrettyNames] + BorderSpacing.Left = 6 + BorderSpacing.Top = 3 ItemHeight = 28 - TabOrder = 4 + TabOrder = 5 end object Label189: TLabel - Left = 237 - Height = 17 - Top = 125 - Width = 338 + AnchorSideLeft.Control = cmbHrColor + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = cmbHrColor + AnchorSideTop.Side = asrCenter + Left = 234 + Height = 19 + Top = 107 + Width = 324 + BorderSpacing.Left = 6 Caption = 'color to show information in status upload window' + ParentColor = False + end + object edtHrdUrl: TEdit + AnchorSideLeft.Control = chkHrUpEnabled + AnchorSideTop.Control = chkHrUpEnabled + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 36 + Top = 23 + Width = 600 + TabOrder = 2 + Text = 'http://robot.hrdlog.net/NewEntry.aspx' end end object chkCloseAfterUpload: TCheckBox + AnchorSideLeft.Control = GroupBox47 + AnchorSideTop.Control = GroupBox47 + AnchorSideTop.Side = asrBottom Left = 12 Height = 23 - Top = 544 - Width = 451 + Top = 662 + Width = 434 + BorderSpacing.Top = 6 Caption = 'Close the "Status of log upload" window after successful upload' TabOrder = 3 end object chkIgnoreLoTW: TCheckBox - Left = 13 + AnchorSideLeft.Control = chkCloseAfterUpload + AnchorSideTop.Control = chkCloseAfterUpload + AnchorSideTop.Side = asrBottom + Left = 12 Height = 23 - Top = 576 - Width = 413 + Top = 688 + Width = 401 + BorderSpacing.Top = 3 Caption = 'Ignore changes caused by LoTW/eQSL upload or download' + OnChange = chkIgnoreLoTWChange TabOrder = 4 end + object chkIgnoreQSL: TCheckBox + AnchorSideLeft.Control = chkIgnoreLoTW + AnchorSideTop.Control = chkIgnoreLoTW + AnchorSideTop.Side = asrBottom + Left = 12 + Height = 23 + Top = 711 + Width = 313 + Caption = 'Ignore changes caused by QSL sent/received' + OnChange = chkIgnoreQSLChange + TabOrder = 5 + end + object chkIgnoreEdit: TCheckBox + AnchorSideLeft.Control = chkIgnoreQSL + AnchorSideTop.Control = chkIgnoreQSL + AnchorSideTop.Side = asrBottom + Left = 12 + Height = 23 + Top = 734 + Width = 253 + Caption = 'Ignore changes caused by QSO edit' + OnChange = chkIgnoreEditChange + TabOrder = 6 + end + object GroupBox47: TGroupBox + AnchorSideLeft.Control = GroupBox46 + AnchorSideTop.Control = GroupBox46 + AnchorSideTop.Side = asrBottom + Left = 12 + Height = 141 + Top = 515 + Width = 650 + BorderSpacing.Top = 3 + Caption = 'UDP Log Messages' + ClientHeight = 121 + ClientWidth = 648 + TabOrder = 7 + object chkUdUpEnabled: TCheckBox + AnchorSideLeft.Control = GroupBox47 + AnchorSideTop.Control = GroupBox47 + Left = 6 + Height = 23 + Top = 0 + Width = 252 + BorderSpacing.Left = 6 + Caption = 'Enable sending UDP Log Messages' + OnChange = chkUdUpEnabledChange + TabOrder = 0 + end + object chkUdUpOnline: TCheckBox + AnchorSideLeft.Control = chkUdUpEnabled + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = GroupBox47 + Left = 261 + Height = 23 + Top = 0 + Width = 222 + BorderSpacing.Left = 3 + Caption = 'Upload QSO data immediately' + TabOrder = 1 + end + object Label193: TLabel + AnchorSideLeft.Control = edtUdAddress + AnchorSideTop.Control = cmbUdColor + AnchorSideTop.Side = asrCenter + Left = 6 + Height = 19 + Top = 91 + Width = 52 + Caption = 'Use this' + ParentColor = False + end + object cmbUdColor: TColorBox + AnchorSideLeft.Control = Label193 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = chkUdIncExch + AnchorSideTop.Side = asrBottom + Left = 64 + Height = 31 + Top = 85 + Width = 164 + DefaultColorColor = clGreen + NoneColorColor = clMoneyGreen + Selected = clGreen + Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbPrettyNames] + BorderSpacing.Left = 6 + BorderSpacing.Top = 3 + ItemHeight = 28 + TabOrder = 4 + end + object Label194: TLabel + AnchorSideLeft.Control = cmbUdColor + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = cmbUdColor + AnchorSideTop.Side = asrCenter + Left = 234 + Height = 19 + Top = 91 + Width = 324 + BorderSpacing.Left = 6 + Caption = 'color to show information in status upload window' + ParentColor = False + end + object edtUdAddress: TEdit + AnchorSideLeft.Control = chkUdUpEnabled + AnchorSideTop.Control = chkUdUpEnabled + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 36 + Top = 23 + Width = 600 + TabOrder = 2 + Text = '127.0.0.1:5444' + end + object chkUdIncExch: TCheckBox + AnchorSideLeft.Control = edtUdAddress + AnchorSideTop.Control = edtUdAddress + AnchorSideTop.Side = asrBottom + Left = 9 + Height = 23 + Top = 59 + Width = 189 + BorderSpacing.Left = 3 + Caption = 'Include contest exchange' + Checked = True + State = cbChecked + TabOrder = 3 + end + end end object tabCondx: TTabSheet Caption = 'Propagation' - ClientHeight = 672 + ClientHeight = 722 ClientWidth = 836 object rbCondxAsImage: TRadioButton - Left = 25 + AnchorSideLeft.Control = tabCondx + AnchorSideTop.Control = tabCondx + Left = 24 Height = 23 - Top = 16 - Width = 210 + Top = 24 + Width = 207 + BorderSpacing.Left = 24 + BorderSpacing.Top = 24 Caption = 'Show propagation as image' Checked = True TabOrder = 0 TabStop = True end object edtCondxImageUrl: TEdit - Left = 72 + AnchorSideLeft.Control = lblDnloadCondxImg + AnchorSideTop.Control = lblDnloadCondxImg + AnchorSideTop.Side = asrBottom + Left = 61 Height = 34 - Top = 72 + Top = 70 Width = 528 TabOrder = 1 Text = 'edtCondxImageUrl' end - object Label204: TLabel - Left = 74 + object lblDnloadCondxImg: TLabel + AnchorSideLeft.Control = rbCondxAsImage + AnchorSideLeft.Side = asrCenter + AnchorSideTop.Control = rbCondxAsImage + AnchorSideTop.Side = asrBottom + Left = 61 Height = 17 - Top = 48 - Width = 138 + Top = 53 + Width = 133 + BorderSpacing.Top = 6 Caption = 'Downoad data from:' + ParentColor = False end object rbCondxAsText: TRadioButton - Left = 25 + AnchorSideLeft.Control = rbCondxAsImage + Left = 24 Height = 23 Top = 152 - Width = 193 + Width = 190 Caption = 'Show as text information' TabOrder = 2 end object chkShowCondxValues: TCheckBox - Left = 56 + AnchorSideLeft.Control = edtCondxTextUrl + AnchorSideTop.Control = edtCondxTextUrl + AnchorSideTop.Side = asrBottom + Left = 61 Height = 23 - Top = 185 - Width = 194 + Top = 209 + Width = 195 Caption = 'Show A, K, SSN, FOF2 etc.' TabOrder = 3 end object chkCondxCalcHF: TCheckBox - Left = 56 + AnchorSideLeft.Control = chkShowCondxValues + AnchorSideTop.Control = chkShowCondxValues + AnchorSideTop.Side = asrBottom + Left = 61 Height = 23 - Top = 217 - Width = 295 + Top = 232 + Width = 288 Caption = 'Show calculated prediction for HF bands' TabOrder = 4 end object chkCondxCalcVHF: TCheckBox - Left = 56 + AnchorSideLeft.Control = chkShowCondxValues + AnchorSideTop.Control = chkCondxCalcHF + AnchorSideTop.Side = asrBottom + Left = 61 Height = 23 - Top = 249 - Width = 305 + Top = 255 + Width = 297 Caption = 'Show calculated prediction for VHF bands' TabOrder = 5 end - object Label205: TLabel - Left = 72 + object lblCondxImgexample: TLabel + AnchorSideLeft.Control = edtCondxImageUrl + AnchorSideTop.Control = edtCondxImageUrl + AnchorSideTop.Side = asrBottom + Left = 61 Height = 17 Top = 104 - Width = 413 + Width = 393 Caption = 'Look at http://www.hamqsl.com/solar.html for more variants' + ParentColor = False + end + object edtCondxTextUrl: TEdit + AnchorSideLeft.Control = edtCondxImageUrl + AnchorSideTop.Control = rbCondxAsText + AnchorSideTop.Side = asrBottom + Left = 61 + Height = 34 + Top = 175 + Width = 528 + TabOrder = 6 + Text = 'edtCondxTextUrl' end end end object Panel1: TPanel AnchorSideBottom.Side = asrBottom Left = 1006 - Height = 703 + Height = 753 Top = 0 Width = 88 Align = alRight - ClientHeight = 703 + ClientHeight = 753 ClientWidth = 88 TabOrder = 1 object btnOK: TButton @@ -9859,7 +10141,7 @@ object frmPreferences: TfrmPreferences end object lbPreferences: TListBox Left = 0 - Height = 703 + Height = 753 Top = 0 Width = 160 Align = alLeft diff --git a/src/fPreferences.pas b/src/fPreferences.pas index d63d5e6..5019ff0 100644 --- a/src/fPreferences.pas +++ b/src/fPreferences.pas @@ -32,7 +32,9 @@ type btnBrowseBackup1: TButton; btnDefineProfile1: TButton; btnHelp1: TButton; - btnLPColor: TButton; + btnBPColor: TColorButton; + btnSPColor: TColorButton; + btnLPColor: TColorButton; btnWsjtPath: TButton; btnSecondLoad: TButton; btnFrequencies1: TButton; @@ -46,8 +48,6 @@ type btnDefineProfile: TButton; btnSplit: TButton; btnThirdLoad: TButton; - btnSetRadio3: TButton; - btnSetRadio4: TButton; btnSelbFont: TButton; btnSeleFont: TButton; btnSelsFont: TButton; @@ -73,36 +73,15 @@ type btnAlertCallsigns: TButton; btnCfgStorage: TButton; btnAddTrxMem : TButton; - btnSelectQSOColor : TButton; btnForceMembershipUpdate : TButton; - btnSPColor: TButton; - cb10m1: TCheckBox; - cb12m1: TCheckBox; cb136kHz: TCheckBox; cb472kHz: TCheckBox; - cb13cm1: TCheckBox; - cb15m1: TCheckBox; cb160m: TCheckBox; - cb160m1: TCheckBox; - cb17m1: TCheckBox; - cb1cm1: TCheckBox; - cb20m1: TCheckBox; - cb23cm1: TCheckBox; - cb2m1: TCheckBox; - cb30m1: TCheckBox; - cb3cm1: TCheckBox; - cb40m1: TCheckBox; - cb47GHz1: TCheckBox; - cb5cm1: TCheckBox; - cb6m1: TCheckBox; - cb70cm1: TCheckBox; - cb76GHz1: TCheckBox; + cb5m: TCheckBox; + cb8m: TCheckBox; cb122GHz: TCheckBox; - cb122GHz1: TCheckBox; cb134GHz: TCheckBox; - cb134GHz1: TCheckBox; cb241GHz: TCheckBox; - cb241GHz1: TCheckBox; cb80m: TCheckBox; cb40m: TCheckBox; cb30m: TCheckBox; @@ -116,25 +95,37 @@ type cb70cm: TCheckBox; cb23cm: TCheckBox; cb13cm: TCheckBox; - cb80m1: TCheckBox; cb8cm: TCheckBox; cb5cm: TCheckBox; cb3cm: TCheckBox; cb1cm: TCheckBox; cb47GHz: TCheckBox; cb76GHz: TCheckBox; - cb8cm1: TCheckBox; cb4m: TCheckBox; cb125m: TCheckBox; cb60m: TCheckBox; cb30cm: TCheckBox; cgLimit: TCheckGroup; cbNoKeyerReset: TCheckBox; - chkR2Vfo: TCheckBox; - chkR1Vfo: TCheckBox; + chkUdUpEnabled: TCheckBox; + chkUdUpOnline: TCheckBox; + chkUdIncExch: TCheckBox; + chkVoiceR: TCheckBox; + chkUseHLBuffer: TCheckBox; + chkUTC2R: TCheckBox; + chkShow5M: TCheckBox; + chkCPollR: TCheckBox; + chkwsjtLoeQ: TCheckBox; + chkModeReverse: TCheckBox; + chkRPwrOn: TCheckBox; chkOperator: TCheckBox; + chkIgnoreEdit: TCheckBox; + chkIgnoreQSL: TCheckBox; chkDarcDok: TCheckBox; chkNewDOKTables: TCheckBox; + chkRunRigCtld: TCheckBox; + chkRSendCWR: TCheckBox; + chkRVfo: TCheckBox; chkRBNMAutoConn: TCheckBox; chkRBNLink: TCheckBox; chkRot1AzMinMax: TCheckBox; @@ -192,10 +183,6 @@ type chkRot2RunRotCtld: TCheckBox; chkClearRIT : TCheckBox; chkCountry: TCheckBox; - chkR1RunRigCtld: TCheckBox; - chkR2RunRigCtld: TCheckBox; - chkR1SendCWR: TCheckBox; - chkR2SendCWR: TCheckBox; chkShowBckEQSL: TCheckBox; chkSysUTC: TCheckBox; chkAllVariants: TCheckBox; @@ -258,37 +245,13 @@ type chkCounty3: TCheckBox; chkCounty4: TCheckBox; chkCounty5: TCheckBox; - chkCW1: TCheckBox; + chkDATA: TCheckBox; chkDate3: TCheckBox; chkDate4: TCheckBox; chkDate5: TCheckBox; chkDXCC3: TCheckBox; chkDXCC4: TCheckBox; chkDXCC5: TCheckBox; - chkexAward1: TCheckBox; - chkexCall1: TCheckBox; - chkexCounty1: TCheckBox; - chkexDate1: TCheckBox; - chkexDXCC1: TCheckBox; - chkexFreq1: TCheckBox; - chkexIOTA1: TCheckBox; - chkexITU1: TCheckBox; - chkexLoc1: TCheckBox; - chkexMode1: TCheckBox; - chkexMyLoc1: TCheckBox; - chkexName1: TCheckBox; - chkexNote1: TCheckBox; - chkexPower1: TCheckBox; - chkexQSLR1: TCheckBox; - chkexQSLS1: TCheckBox; - chkexQSLVIA1: TCheckBox; - chkexQTH1: TCheckBox; - chkexRemarks1: TCheckBox; - chkexRSTR1: TCheckBox; - chkexRSTS1: TCheckBox; - chkexTimeoff1: TCheckBox; - chkexTimeon1: TCheckBox; - chkexWAZ1: TCheckBox; chkexAscTime: TCheckBox; chkFreq3: TCheckBox; chkFreq4: TCheckBox; @@ -337,31 +300,11 @@ type chkRST_S3: TCheckBox; chkRST_S4: TCheckBox; chkRST_S5: TCheckBox; - chkShow10m1: TCheckBox; - chkShow12m1: TCheckBox; - chkShow136k1: TCheckBox; - chkShow13cm1: TCheckBox; - chkShow15m1: TCheckBox; - chkShow160m1: TCheckBox; - chkShow17m1: TCheckBox; - chkShow1cm1: TCheckBox; - chkShow20m1: TCheckBox; - chkShow23cm1: TCheckBox; - chkShow2m1: TCheckBox; - chkShow30m1: TCheckBox; - chkShow3cm1: TCheckBox; - chkShow3mm1: TCheckBox; - chkShow40m1: TCheckBox; - chkShow5cm1: TCheckBox; - chkShow6m1: TCheckBox; - chkShow6mm1: TCheckBox; + chkShow8M: TCheckBox; chkShow33CM: TCheckBox; - chkShow80m1: TCheckBox; - chkShow8cm1: TCheckBox; chkSkipModeFreq: TCheckBox; chkRefreshAfterSave: TCheckBox; chkCW: TCheckBox; - chkSkipModeFreq1: TCheckBox; chkSSB: TCheckBox; chkShow125CM: TCheckBox; chkShow23CM: TCheckBox; @@ -382,22 +325,14 @@ type chkShow80M: TCheckBox; chkShow160M: TCheckBox; chkShow2190M: TCheckBox; - chkCloseAterSave1: TCheckBox; - chkNoConnection1: TCheckBox; - chkOpenAfterRun1: TCheckBox; - chkProfileLocator1: TCheckBox; - chkProfileQTH1: TCheckBox; chkProfileRig: TCheckBox; chkProfileQTH: TCheckBox; chkProfileLocator: TCheckBox; - chkProfileRig1: TCheckBox; chkShow17M: TCheckBox; chkShow6MM: TCheckBox; chkShow25MM: TCheckBox; chkShow2MM: TCheckBox; chkShow1MM: TCheckBox; - chkShowGrayline1: TCheckBox; - chkShowTRXwindow1: TCheckBox; chkSSB1: TCheckBox; chkTimeOff3: TCheckBox; chkTimeOff4: TCheckBox; @@ -406,10 +341,8 @@ type chkTimeOn4: TCheckBox; chkTimeOn5: TCheckBox; chkUseProfiles: TCheckBox; - chkUseProfiles1: TCheckBox; chkUseSpaceBar: TCheckBox; chkITU: TCheckBox; - chkUseSpaceBar1: TCheckBox; chkWAZ: TCheckBox; chkRemarks: TCheckBox; chkDXCC: TCheckBox; @@ -443,14 +376,20 @@ type clboxNewITU: TColorBox; clboxNewIOTA: TColorBox; clBoxQSLITU: TColorBox; - cmbDataBitsR2: TComboBox; + cmbDataBitsR: TComboBox; cmbDataBitsRot1: TComboBox; cmbDataBitsRot2: TComboBox; - cmbIfaceType2: TComboBox; + cmbDTRR: TComboBox; + cmbHanshakeR: TComboBox; + cmbUdColor: TColorBox; + cmbModelRig: TComboBox; cmbModelRot1: TComboBox; cmbModelRot2: TComboBox; + cmbParityR: TComboBox; + cmbRTSR: TComboBox; + cmbSpeedR: TComboBox; + cmbStopBitsR: TComboBox; cmbWsjtDefaultMode: TComboBox; - cmbDTRR1: TComboBox; cmbDTRRot1: TComboBox; cmbDTRRot2: TComboBox; cmbHaColor: TColorBox; @@ -458,28 +397,16 @@ type cmbHrColor: TColorBox; cmbHanshakeRot1: TComboBox; cmbHanshakeRot2: TComboBox; - cmbModelRig2: TComboBox; cmbParityRot1: TComboBox; cmbParityRot2: TComboBox; - cmbRTSR1: TComboBox; - cmbDTRR2: TComboBox; - cmbRTSR2: TComboBox; - cmbHanshakeR2: TComboBox; - cmbParityR2: TComboBox; cmbRTSRot1: TComboBox; cmbRTSRot2: TComboBox; - cmbSpeedR1: TComboBox; - cmbSpeedR2: TComboBox; cmbSpeedRot1: TComboBox; cmbSpeedRot2: TComboBox; - cmbStopBitsR1: TComboBox; cmbDefaultMode: TComboBox; cmbeQSLBckColor: TColorBox; - cmbHanshakeR1: TComboBox; - cmbParityR1: TComboBox; cmbQSL_S: TComboBox; cmbSecondSaveTo: TComboBox; - cmbStopBitsR2: TComboBox; cmbStopBitsRot1: TComboBox; cmbStopBitsRot2: TComboBox; cmbThirdSaveTo: TComboBox; @@ -490,8 +417,6 @@ type cmbFourthClub: TComboBox; cmbFifthClub: TComboBox; cmbMode: TComboBox; - cmbMode1: TComboBox; - cmbNewBand1: TColorBox; cmbNewMode: TColorBox; cmbQSLNeeded: TColorBox; cmbFreq: TComboBox; @@ -506,46 +431,58 @@ type cmbFrmDXCColor: TColorBox; cmbFirstZip: TComboBox; cmbFirstSaveTo: TComboBox; - cmbIfaceType1: TComboBox; cmbXplanetColor: TColorBox; cmbLoTWBckColor: TColorBox; - cmbDataBitsR1: TComboBox; cmbCl10db : TColorBox; - cmbModelRig1: TComboBox; + cmbRadioNr: TComboBox; + cmbRadioModes: TComboBox; + cmbCWRadio: TComboBox; + cmbIfaceType: TComboBox; + cmbDataMode: TComboBox; + btnSelectQSOColor: TColorButton; DateEditCall: TDateEdit; DateEditLoc: TDateEdit; dlgColor : TColorDialog; + edtCbQRZPass: TEdit; + edtCbQRZCQPass: TEdit; + edtCbQRZUser: TEdit; + edtCbQRZCQUser: TEdit; + edtUdAddress: TEdit; + edtOperator: TEdit; + edtCondxTextUrl: TEdit; + edtDataCmd: TEdit; + edtGCBeamWidth: TEdit; + edtGCBeamLength: TEdit; + edtHrdUrl: TEdit; + edtClubLogUrl: TEdit; + edtClubLogUrlDel: TEdit; + edtHamQTHurl: TEdit; edtGCLineWidth: TEdit; edtGCStep: TEdit; edtGCPolarDivisor: TEdit; + edtPoll: TEdit; + edtRDevice: TEdit; + edtRHost: TEdit; + edtRRigCtldArgs: TEdit; + edtRRigCtldPort: TEdit; + edtRadioName: TEdit; + edtUsr1R: TEdit; + edtUsr1RName: TEdit; + edtUsr2R: TEdit; + edtUsr2RName: TEdit; + edtUsr3R: TEdit; + edtUsr3RName: TEdit; edtUsrBtn: TEdit; - edtUsr1R1Name: TEdit; - edtR2Host: TEdit; - edtRadio2Name: TEdit; - edtUsr1R2Name: TEdit; - edtUsr2R2Name: TEdit; - edtUsr3R2Name: TEdit; - edtUsr2R1Name: TEdit; - edtUsr3R1Name: TEdit; - edtUsr2R2: TEdit; - edtUsr1R1: TEdit; - edtUsr2R1: TEdit; - edtUsr1R2: TEdit; - edtUsr3R1: TEdit; edtClub: TEdit; - edtCWPort2: TEdit; + edtDataMode1: TEdit; + edtCMD1: TEdit; edteQSLDnlAddr: TEdit; edteQSLStartAddr: TEdit; edteQSLViewAddr: TEdit; - edtK3NGPort2: TEdit; - edtR1Host: TEdit; - edtRadio1Name: TEdit; edtRot1Host: TEdit; edtRot2Host: TEdit; edtRotor2: TEdit; edtMailingAddress: TEdit; - edtUsr3R2: TEdit; - edtWinPort2: TEdit; edtZipCity: TEdit; edtStartConCmd: TEdit; edtDropSyncErr: TSpinEdit; @@ -568,45 +505,33 @@ type edtClUserName: TEdit; edtWatchFor : TEdit; edtRBNLogin : TEdit; - edtPoll1: TEdit; - edtPoll2: TEdit; edtRot1Poll: TEdit; edtRot2Poll: TEdit; - edtR1Device: TEdit; edtRot1Device: TEdit; edtRot1RotCtldArgs: TEdit; edtRot1RotCtldPort: TEdit; - edtR2Device: TEdit; edtRot2Device: TEdit; - edtR1RigCtldArgs: TEdit; - edtR2RigCtldArgs: TEdit; - edtR1RigCtldPort: TEdit; edtRot2RotCtldArgs: TEdit; - edtR2RigCtldPort: TEdit; edtRot2RotCtldPort: TEdit; edtRotor1: TEdit; edtRigCtldPath: TEdit; - edtAM1: TSpinEdit; + edtAM: TSpinEdit; edtClub1Date: TEdit; edtClub2Date: TEdit; edtClub4Date: TEdit; edtClub5Date: TEdit; edtClub3Date: TEdit; - edtCW1: TSpinEdit; - edtCW2: TSpinEdit; - edtFM1: TSpinEdit; - edtFM2: TSpinEdit; + edtCW: TSpinEdit; + edtFM: TSpinEdit; edtImgFiles: TEdit; edtHtmlFiles: TEdit; - edtCbPass: TEdit; - edtCbUser: TEdit; + edtCbHamQTHPass: TEdit; + edtCbHamQTHUser: TEdit; edteQSLName: TEdit; edteQSLPass: TEdit; edtRotCtldPath: TEdit; - edtRTTY1: TSpinEdit; - edtRTTY2: TSpinEdit; - edtSSB1: TSpinEdit; - edtSSB2: TSpinEdit; + edtData: TSpinEdit; + edtSSB: TSpinEdit; edtTxtFiles: TEdit; edtDigiModes: TEdit; edtFldigiPath: TEdit; @@ -617,16 +542,16 @@ type edtSunOffset: TEdit; edtOffset: TEdit; edtCWAddress: TEdit; - edtCWPort1: TEdit; + edtCWPort: TEdit; edtPdfFiles: TEdit; - edtWinPort1: TEdit; + edtWinPort: TEdit; edtRecetQSOs: TEdit; edtLoTWPass: TEdit; edtLoTWName: TEdit; edtCWSpeed: TSpinEdit; edtWinMinSpeed: TSpinEdit; edtWinMaxSpeed: TSpinEdit; - edtK3NGPort1: TEdit; + edtK3NGPort: TEdit; edtK3NGSpeed: TSpinEdit; edtFldigiIp: TEdit; edtADIFIp: TEdit; @@ -649,11 +574,7 @@ type edtWAward1: TEdit; edtDoNotShow: TEdit; edtXLeft: TEdit; - edtAM2: TSpinEdit; edtCIV3: TEdit; - edtPasswd1: TEdit; - edtPort1: TEdit; - edtRadioPort2: TEdit; edtPasswd: TEdit; edtUser: TEdit; edtPort: TEdit; @@ -669,8 +590,8 @@ type dlgFont: TFontDialog; edtEmail: TEdit; fraExportPref1: TfraExportPref; - gbProfiles1: TGroupBox; - grbSerialR2: TGroupBox; + grbRadio: TGroupBox; + grbSerialR: TGroupBox; grbSerialRot1: TGroupBox; grbSerialRot2: TGroupBox; GroupBox1: TGroupBox; @@ -696,22 +617,18 @@ type gbLoTW: TGroupBox; gbWidths: TGroupBox; gbWinkeyer: TGroupBox; - grbRadio1: TGroupBox; gbCwkeyer: TGroupBox; - grpUsrCmds: TGroupBox; GroupBox31: TGroupBox; GroupBox32: TGroupBox; gbOffsets: TGroupBox; GroupBox34: TGroupBox; - GroupBox35: TGroupBox; + GroupBox47: TGroupBox; + grpUsrDigitalModes: TGroupBox; gbeQSL: TGroupBox; - GroupBox37: TGroupBox; + grbRigBandWidths: TGroupBox; GroupBox38: TGroupBox; - GroupBox39: TGroupBox; gbProfiles: TGroupBox; - grbRadio2: TGroupBox; grbRigctldPath: TGroupBox; - grbSerialR1: TGroupBox; GroupBox41: TGroupBox; gbRot1: TGroupBox; gbRot2: TGroupBox; @@ -733,10 +650,29 @@ type GroupBox7: TGroupBox; GroupBox8: TGroupBox; GroupBox9: TGroupBox; - grpUsrCmds1: TGroupBox; + grpUsrCmds: TGroupBox; Label1: TLabel; Label10: TLabel; Label108: TLabel; + Label12: TLabel; + Label13: TLabel; + Label193: TLabel; + Label194: TLabel; + lblGCBeamWidth: TLabel; + lblGCBeamLength: TLabel; + lblGC_BP_Color: TLabel; + lblRadio: TLabel; + lblCWRadio: TLabel; + lblNoRigForCW: TLabel; + lblNrOfRadios: TLabel; + lblNoRigForMode: TLabel; + lblDataMode: TLabel; + lblDataMode1: TLabel; + lblLogDataMode: TLabel; + lblRigDataCmd: TLabel; + lblRName: TLabel; + lblDeviceR: TLabel; + lblExtra: TLabel; lblGC_SP_Color: TLabel; lblGC_LP_Color: TLabel; lblGCwidth: TLabel; @@ -744,25 +680,28 @@ type lblGCStep: TLabel; lblGCDivisor: TLabel; lblGCHint: TLabel; + lblHost: TLabel; + lblModelR: TLabel; + lblPollR: TLabel; + lblPortR: TLabel; + lblserialRDataBits: TLabel; + lblSerialRDtr: TLabel; + lblSerialRHand: TLabel; + lblSerialRParity: TLabel; + lblSerialRRts: TLabel; + lblSerialRSpd: TLabel; + lblSerialRStop: TLabel; LblTimes: TLabel; Label17: TLabel; + lblUsr1R: TLabel; + lblUsr2R: TLabel; + lblUsr3R: TLabel; lblUsrBtn: TLabel; - lblHost2: TLabel; - lblUsr1R1: TLabel; - lblUsr1R2: TLabel; - lblUsr2R1: TLabel; - lblUsr2R2: TLabel; - lblUsr3R1: TLabel; - lblHost: TLabel; Label26: TLabel; Label80: TLabel; Label81: TLabel; lblRbnWindowOpen: TLabel; - lblCWPort2: TLabel; lblHamlib: TLabel; - lblHamlib1: TLabel; - lblK3NGPort2: TLabel; - lblRadio1: TLabel; lbCallW: TLabel; lbFreqW: TLabel; lbleQSLDnlAddr: TLabel; @@ -780,44 +719,15 @@ type lbleQSLUsr: TLabel; lbleQSLPass: TLabel; Label11: TLabel; - Label110: TLabel; Label111: TLabel; Label112: TLabel; - Label113: TLabel; - Label114: TLabel; - Label115: TLabel; - Label116: TLabel; - Label117: TLabel; - Label118: TLabel; - Label119: TLabel; lblintProxy: TLabel; - Label120: TLabel; - Label121: TLabel; - Label122: TLabel; - Label123: TLabel; Label124: TLabel; lblDevice1: TLabel; - lblPortR1: TLabel; - lblPortR2: TLabel; lbleQSLBkg: TLabel; - lblRadio2: TLabel; lblRotId1: TLabel; lblIntPort: TLabel; - lblSerialR1Spd: TLabel; - lblserialR1DataBits: TLabel; - lblSerialR1Stop: TLabel; - lblSerialR1Hand: TLabel; - lblSerialR1Parity: TLabel; - lblSerialR1Dtr: TLabel; - lblSerialR1Rts: TLabel; - lblSerialR2Spd: TLabel; - lblSerialR2DataBits: TLabel; - lblSerialR2Stop: TLabel; lblIntUser: TLabel; - lblSerialR2Hand: TLabel; - lblSerialR2Parity: TLabel; - lblSerialR2Dtr: TLabel; - lblSerialr2Rts: TLabel; lblPoll1: TLabel; lblExtaArgs1: TLabel; lblPort1: TLabel; @@ -856,7 +766,6 @@ type lblRbnDb4 : TLabel; lblRbnDeleteAfterSec : TLabel; Label179: TLabel; - lblDeviceR1: TLabel; Label180: TLabel; Label181: TLabel; Label182: TLabel; @@ -867,7 +776,6 @@ type Label187: TLabel; Label188: TLabel; Label189: TLabel; - lblUsr3R2: TLabel; lnlRbnServer : TLabel; lblRbnAdrFormat : TLabel; Label192: TLabel; @@ -880,12 +788,13 @@ type lblHamLibSpeed: TLabel; lblHamLibWPM: TLabel; Label202: TLabel; + lblRig1DataMode: TLabel; + lblRig1cmd: TLabel; lblADIFport: TLabel; lblADIFaddr: TLabel; - lblWinPort2: TLabel; lblwsjtport: TLabel; - Label204: TLabel; - Label205: TLabel; + lblDnloadCondxImg: TLabel; + lblCondxImgexample: TLabel; lblDebug : TLabel; Label207: TLabel; lblwsjtaddr: TLabel; @@ -898,25 +807,19 @@ type lbl: TLabel; lblIntPasswd: TLabel; Label2: TLabel; - lblExtra: TLabel; - lblModelR1: TLabel; - lblDevieR2: TLabel; Label23: TLabel; - lblModelR2: TLabel; - lblExtra2: TLabel; - lblPollR1: TLabel; - Label28: TLabel; - Label29: TLabel; - Label30: TLabel; - Label31: TLabel; - Label32: TLabel; - Label33: TLabel; - Label34: TLabel; - Label35: TLabel; - Label36: TLabel; - Label37: TLabel; - Label38: TLabel; - Label39: TLabel; + lblMode: TLabel; + lblBandWidth: TLabel; + lblCWbw: TLabel; + lblSSBBw: TLabel; + lblDataBw: TLabel; + lblAMBw: TLabel; + lblFMBw: TLabel; + lblCWHz: TLabel; + lblSSBHz: TLabel; + lblDataHz: TLabel; + lblAMHz: TLabel; + lblFMHz: TLabel; Label52: TLabel; Label53: TLabel; Label54: TLabel; @@ -930,7 +833,6 @@ type Label93: TLabel; lblSunRiseSet: TLabel; Label95: TLabel; - lblPollR2: TLabel; lbl1: TLabel; lblButtons: TLabel; Label3: TLabel; @@ -994,7 +896,6 @@ type odFindBrowser: TOpenDialog; pnl2Host: TPanel; pnlHost1: TPanel; - pgTRXControl: TPageControl; pgPreferences: TPageControl; Panel1: TPanel; pgROTControl: TPageControl; @@ -1002,6 +903,7 @@ type rbCondxAsImage: TRadioButton; rbHamQTH: TRadioButton; rbQRZ: TRadioButton; + rbQRZCQ: TRadioButton; rgBackupType: TRadioGroup; rgRSTFrom: TRadioGroup; RadioGroup2: TRadioGroup; @@ -1023,6 +925,7 @@ type edtLoadFromFldigi: TSpinEdit; seCallWidth: TSpinEdit; seFreqWidth: TSpinEdit; + edtRigCount: TSpinEdit; tabExport: TTabSheet; tabExport1: TTabSheet; tabFont1: TTabSheet; @@ -1039,8 +942,6 @@ type tabRBN : TTabSheet; tabOnlineLog: TTabSheet; tabCondx: TTabSheet; - tabTRX2: TTabSheet; - tabTRX1: TTabSheet; tabRot1: TTabSheet; tabRot2: TTabSheet; tabZipCode: TTabSheet; @@ -1073,11 +974,8 @@ type procedure btnChangeDefFreqClick(Sender: TObject); procedure btnChangeDefModeClick(Sender: TObject); procedure btnHelp1Click(Sender: TObject); - procedure btnLPColorClick(Sender: TObject); - procedure btnSPColorClick(Sender: TObject); procedure btnWsjtPathClick(Sender: TObject); procedure btnFldigiPathClick(Sender: TObject); - procedure btnSelectQSOColorClick(Sender : TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure btnBrowseBackupClick(Sender: TObject); @@ -1089,6 +987,10 @@ type procedure chkClUpEnabledChange(Sender: TObject); procedure chkHaUpEnabledChange(Sender: TObject); procedure chkHrUpEnabledChange(Sender: TObject); + procedure chkUdUpEnabledChange(Sender: TObject); + procedure chkIgnoreEditChange(Sender: TObject); + procedure chkIgnoreLoTWChange(Sender: TObject); + procedure chkIgnoreQSLChange(Sender: TObject); procedure chkPotSpeedChange(Sender: TObject); procedure chkProfileLocatorClick(Sender: TObject); procedure chkProfileQTHClick(Sender: TObject); @@ -1099,13 +1001,21 @@ type procedure btnFirstLoadClick(Sender: TObject); procedure btnSecondLoadClick(Sender: TObject); procedure btnThirdLoadClick(Sender: TObject); - procedure cmbIfaceType1Change(Sender: TObject); - procedure cmbIfaceType2Change(Sender: TObject); - procedure cmbModelRig1Change(Sender: TObject); - procedure cmbModelRig2Change(Sender: TObject); + procedure cmbCWRadioChange(Sender: TObject); + procedure cmbCWRadioCloseUp(Sender: TObject); + procedure cmbIfaceTypeChange(Sender: TObject); + procedure cmbIfaceTypeCloseUp(Sender: TObject); + procedure cmbModelRigChange(Sender: TObject); procedure cmbModelRot1Change(Sender: TObject); procedure cmbModelRot2Change(Sender: TObject); + procedure cmbRadioModesChange(Sender: TObject); + procedure cmbRadioModesCloseUp(Sender: TObject); + procedure cmbRadioNrChange(Sender: TObject); + procedure cmbRadioNrCloseUp(Sender: TObject); procedure edtAlertCmdExit(Sender: TObject); + procedure edtDataCmdChange(Sender: TObject); + procedure edtDigiModesExit(Sender: TObject); + procedure edtGCBeamWidthChange(Sender: TObject); procedure edtGCLineWidthExit(Sender: TObject); procedure edtGCPolarDivisorExit(Sender: TObject); procedure edtGCStepExit(Sender: TObject); @@ -1115,16 +1025,20 @@ type procedure edtK3NGSerSpeedChange(Sender: TObject); procedure edtLocChange(Sender: TObject); procedure edtLocExit(Sender: TObject); + procedure edtOperatorExit(Sender: TObject); procedure edtPdfFilesExit(Sender: TObject); procedure edtRecetQSOsKeyPress(Sender: TObject; var Key: char); + procedure edtRigCountChange(Sender: TObject); procedure RotorParamsChange(Sender: TObject); + procedure tabCWInterfaceContextPopup(Sender: TObject; MousePos: TPoint; + var Handled: Boolean); + procedure tabCWInterfaceExit(Sender: TObject); + procedure tabModesExit(Sender: TObject); + procedure tabTRXcontrolEnter(Sender: TObject); procedure TRXParamsChange(Sender: TObject); procedure edtTxtFilesExit(Sender: TObject); procedure edtWebBrowserClick(Sender: TObject); procedure edtWebBrowserExit(Sender: TObject); - procedure edtWinMaxSpeedChange(Sender: TObject); - procedure edtWinMinSpeedChange(Sender: TObject); - procedure edtWinPort1Change(Sender: TObject); procedure edtWinSpeedChange(Sender: TObject); procedure edtXplanetLocChange(Sender: TObject); procedure lbPreferencesClick(Sender: TObject); @@ -1152,19 +1066,32 @@ type procedure btnFrequenciesClick(Sender: TObject); procedure btnOKClick(Sender: TObject); procedure FormShow(Sender: TObject); - procedure edtPoll2Exit(Sender: TObject); - procedure edtPoll1Exit(Sender: TObject); + procedure edtPollExit(Sender: TObject); procedure pgPreferencesChange(Sender: TObject); private wasOnlineLogSupportEnabled : Boolean; - + RadioNrLoaded : integer; + BandWNrLoaded : integer; + CWifLoaded : integer; + procedure SaveTRX(RigNr:integer); + procedure LoadTRX(RigNr:integer); + procedure SaveBandW(RigNr:integer); + procedure LoadBandW(RigNr:integer); + procedure SaveCWif(RigNr:integer); + procedure LoadCWif(RigNr:integer); + procedure InitRigCmb(SetUsedRig:boolean=false); + procedure ClearUnUsedRigs; procedure SaveClubSection; procedure LoadMebershipCombo; procedure LoadMembersFromCombo(ClubComboText, ClubNumber : String); function SeekExecFile(MyFile,MyExeFor:String): String; + function DataModeInput(s:string):string; + function WarnCheck(chk:boolean):boolean; + public { public declarations } ActPageIdx : integer; + end; var @@ -1178,7 +1105,7 @@ var RotChanged: boolean; ReloadFreq: Boolean = False; ReloadModes: Boolean = False; - WinKeyerChanged : Boolean; + CWKeyerChanged : Boolean; implementation {$R *.lfm} @@ -1189,12 +1116,30 @@ uses dUtils, dData, fMain, fFreq, fQTHProfiles, fSerialPort, fClubSettings, fLoa fSplitSettings, uMyIni, fNewQSODefValues, fDXCluster, fCallAlert, fConfigStorage, fPropagation, fRadioMemories, dMembership, dLogUpload; + + +function TfrmPreferences.WarnCheck(chk:boolean):boolean; +var + s:PChar; +Begin + Result:= chk; + if chk then + begin + s:= 'Using this option MAY GIVE UNEXPECTED RESULTS'+LineEnding+ + 'if you use MORE THAN ONE ONLINE LOG'+LineEnding+LineEnding+ + 'Are you SURE you want to check this?'; + if Application.MessageBox(s,'Question ...', mb_YesNo + mb_IconQuestion) = idNo then + Result:=False; + end; +end; + procedure TfrmPreferences.btnOKClick(Sender: TObject); var freq : Currency; int : integer; KeyType: TKeyType; begin + cqrini.SetCache(True); cqrini.WriteString('Station', 'Call', edtCall.Text); cqrini.WriteString('Station', 'Name', edtName.Text); cqrini.WriteString('Station', 'QTH', edtQTH.Text); @@ -1211,6 +1156,7 @@ begin cqrini.WriteString('NewQSO', 'Mode', cmbMode.Text); cqrini.WriteString('NewQSO', 'QSL_S', cmbQSL_S.Text); cqrini.WriteString('NewQSO', 'RemQSO', edtComments.Text); + cqrini.WriteString('NewQSO', 'Op', edtOperator.Text); cqrini.WriteString('NewQSO', 'UsrBtn', edtUsrBtn.Text); cqrini.WriteBool('NewQSO', 'UseSpaceBar', chkUseSpaceBar.Checked); cqrini.WriteBool('NewQSO', 'RefreshAfterSave', chkRefreshAfterSave.Checked); @@ -1244,8 +1190,11 @@ begin cqrini.WriteFloat('Program', 'GraylineGCstep',StrToCurr(edtGCStep.Caption)); cqrini.WriteInteger('Program', 'GraylineGCPolarDivisor',StrToInt(edtGCPolarDivisor.Caption)); cqrini.WriteInteger('Program', 'GraylineGCLineWidth',StrToInt(edtGCLineWidth.Caption)); - cqrini.WriteString('Program', 'GraylineGCLineSPColor', ColorToString(btnSPColor.Color)); - cqrini.WriteString('Program', 'GraylineGCLineLPColor', ColorToString(btnLPColor.Color)); + cqrini.WriteString('Program', 'GraylineGCLineSPColor', ColorToString(btnSPColor.ButtonColor)); + cqrini.WriteString('Program', 'GraylineGCLineLPColor', ColorToString(btnLPColor.ButtonColor)); + cqrini.WriteString('Program', 'GraylineGCLineBEColor', ColorToString(btnBPColor.ButtonColor)); + cqrini.WriteInteger('Program', 'GraylineGBeamLineWidth',StrToInt(edtGCBeamWidth.Caption)); + cqrini.WriteInteger('Program', 'GraylineGBeamLineLength',StrToInt(edtGCBeamLength.Caption)); if edtWebBrowser.Text = '' then edtWebBrowser.Text:= dmUtils.MyDefaultBrowser; //may not be empty string cqrini.WriteString('Program', 'WebBrowser', edtWebBrowser.Text); @@ -1259,7 +1208,7 @@ begin cqrini.WriteBool('Program', 'SysUTC', chkSysUTC.Checked); cqrini.WriteBool('Program','ShowMiles',chkShowMiles.Checked); cqrini.WriteBool('Program', 'QSODiffColor', chkQSOColor.Checked); - cqrini.WriteInteger('Program', 'QSOColor', btnSelectQSOColor.Color); + cqrini.WriteInteger('Program', 'QSOColor', btnSelectQSOColor.ButtonColor); cqrini.WriteString('Program', 'QSOColorDate', edtQSOColorDate.Text); cqrini.WriteBool('Columns', 'Date', chkDate.Checked); @@ -1324,12 +1273,15 @@ begin cqrini.WriteBool('Bands', '12m', cb12m.Checked); cqrini.WriteBool('Bands', '10m', cb10m.Checked); - cqrini.WriteBool('Bands', '4m', cb4m.Checked); + cqrini.WriteBool('Bands', '8m', cb8m.Checked); cqrini.WriteBool('Bands', '6m', cb6m.Checked); + cqrini.WriteBool('Bands', '5m', cb5m.Checked); + cqrini.WriteBool('Bands', '4m', cb4m.Checked); cqrini.WriteBool('Bands', '2m', cb2m.Checked); cqrini.WriteBool('Bands', '1.25m', cb125m.Checked); cqrini.WriteBool('Bands', '70cm', cb70cm.Checked); cqrini.WriteBool('Bands', '33cm', cb30cm.Checked); + cqrini.WriteBool('Bands', '23cm', cb23cm.Checked); cqrini.WriteBool('Bands', '13cm', cb13cm.Checked); cqrini.WriteBool('Bands', '8cm', cb8cm.Checked); @@ -1345,54 +1297,9 @@ begin cqrini.WriteString('TRX', 'RigCtldPath', edtRigCtldPath.Text); cqrini.WriteBool('TRX','Debug',chkTrxControlDebug.Checked); cqrini.WriteBool('TRX','MemModeRelated',chkModeRelatedOnly.Checked); + cqrini.WriteInteger('TRX', 'RigCount', edtRigCount.Value); - cqrini.WriteString('TRX1', 'device', edtR1Device.Text); - cqrini.WriteString('TRX1', 'model', dmUtils.GetRigIdFromComboBoxItem(cmbModelRig1.Text)); - cqrini.WriteString('TRX1', 'poll', edtPoll1.Text); - cqrini.WriteString('TRX1', 'Desc', edtRadio1Name.Text); - cqrini.WriteBool('TRX1', 'CWR', chkR1SendCWR.Checked); - cqrini.WriteBool('TRX1', 'ChkVfo',chkR1Vfo.Checked); - cqrini.WriteString('TRX1', 'RigCtldPort', edtR1RigCtldPort.Text); - cqrini.WriteString('TRX1', 'ExtraRigCtldArgs', edtR1RigCtldArgs.Text); - cqrini.WriteBool('TRX1', 'RunRigCtld', chkR1RunRigCtld.Checked); - cqrini.WriteString('TRX1', 'host', edtR1Host.Text); - cqrini.WriteInteger('TRX1', 'SerialSpeed', cmbSpeedR1.ItemIndex); - cqrini.WriteInteger('TRX1', 'DataBits', cmbDataBitsR1.ItemIndex); - cqrini.WriteInteger('TRX1', 'StopBits', cmbStopBitsR1.ItemIndex); - cqrini.WriteInteger('TRX1', 'Parity', cmbParityR1.ItemIndex); - cqrini.WriteInteger('TRX1', 'HandShake', cmbHanshakeR1.ItemIndex); - cqrini.WriteInteger('TRX1', 'DTR', cmbDTRR1.ItemIndex); - cqrini.WriteInteger('TRX1', 'RTS', cmbRTSR1.ItemIndex); - cqrini.WriteString('TRX1', 'usr1name', edtUsr1R1name.Text); - cqrini.WriteString('TRX1', 'usr2name', edtUsr2R1name.Text); - cqrini.WriteString('TRX1', 'usr3name', edtUsr3R1name.Text); - cqrini.WriteString('TRX1', 'usr1', edtUsr1R1.Text); - cqrini.WriteString('TRX1', 'usr2', edtUsr2R1.Text); - cqrini.WriteString('TRX1', 'usr3', edtUsr3R1.Text); - - cqrini.WriteString('TRX2', 'device', edtR2Device.Text); - cqrini.WriteString('TRX2', 'model', dmUtils.GetRigIdFromComboBoxItem(cmbModelRig2.Text)); - cqrini.WriteString('TRX2', 'poll', edtPoll2.Text); - cqrini.WriteString('TRX2', 'Desc', edtRadio2Name.Text); - cqrini.WriteBool('TRX2', 'CWR', chkR2SendCWR.Checked); - cqrini.WriteBool('TRX2', 'ChkVfo',chkR2Vfo.Checked); - cqrini.WriteString('TRX2', 'RigCtldPort', edtR2RigCtldPort.Text); - cqrini.WriteString('TRX2', 'ExtraRigCtldArgs', edtR2RigCtldArgs.Text); - cqrini.WriteBool('TRX2', 'RunRigCtld', chkR2RunRigCtld.Checked); - cqrini.WriteString('TRX2', 'host', edtR2Host.Text); - cqrini.WriteInteger('TRX2', 'SerialSpeed', cmbSpeedR2.ItemIndex); - cqrini.WriteInteger('TRX2', 'DataBits', cmbDataBitsR2.ItemIndex); - cqrini.WriteInteger('TRX2', 'StopBits', cmbStopBitsR2.ItemIndex); - cqrini.WriteInteger('TRX2', 'Parity', cmbParityR2.ItemIndex); - cqrini.WriteInteger('TRX2', 'HandShake', cmbHanshakeR2.ItemIndex); - cqrini.WriteInteger('TRX2', 'DTR', cmbDTRR2.ItemIndex); - cqrini.WriteInteger('TRX2', 'RTS', cmbRTSR2.ItemIndex); - cqrini.WriteString('TRX2', 'usr1name', edtUsr1R2name.Text); - cqrini.WriteString('TRX2', 'usr2name', edtUsr2R2name.Text); - cqrini.WriteString('TRX2', 'usr3name', edtUsr3R2name.Text); - cqrini.WriteString('TRX2', 'usr1', edtUsr1R2.Text); - cqrini.WriteString('TRX2', 'usr2', edtUsr2R2.Text); - cqrini.WriteString('TRX2', 'usr3', edtUsr3R2.Text); + ClearUnUsedRigs; //rigs modes and cw are saved when editing. Just delete unused rigs (model=empty) cqrini.WriteString('ROT', 'RotCtldPath', edtRotCtldPath.Text); @@ -1430,20 +1337,6 @@ begin cqrini.WriteInteger('ROT2', 'DTR', cmbDTRRot2.ItemIndex); cqrini.WriteInteger('ROT2', 'RTS', cmbRTSRot2.ItemIndex); - cqrini.WriteInteger('Band1', 'CW', edtCW1.Value); - cqrini.WriteInteger('Band1', 'SSB', edtSSB1.Value); - cqrini.WriteInteger('Band1', 'RTTY', edtRTTY1.Value); - cqrini.WriteInteger('Band1', 'AM', edtAM1.Value); - cqrini.WriteInteger('Band1', 'FM', edtFM1.Value); - - cqrini.WriteInteger('Band2', 'CW', edtCW2.Value); - cqrini.WriteInteger('Band2', 'SSB', edtSSB2.Value); - cqrini.WriteInteger('Band2', 'RTTY', edtRTTY2.Value); - cqrini.WriteInteger('Band2', 'AM', edtAM2.Value); - cqrini.WriteInteger('Band2', 'FM', edtFM2.Value); - - cqrini.WriteString('Modes', 'Digi', edtDigiModes.Text); - cqrini.WriteBool('Profiles', 'Use', chkUseProfiles.Checked); cqrini.WriteInteger('Profiles', 'Selected', dmData.GetNRFromProfile(cmbProfiles.Text)); cqrini.WriteBool('Profiles', 'Locator', chkProfileLocator.Checked); @@ -1466,7 +1359,9 @@ begin cqrini.WriteBool('DXCluster', 'Show15M', chkShow15M.Checked); cqrini.WriteBool('DXCluster', 'Show12M', chkShow12M.Checked); cqrini.WriteBool('DXCluster', 'Show10M', chkShow10M.Checked); + cqrini.WriteBool('DXCluster', 'Show8M', chkShow8M.Checked); cqrini.WriteBool('DXCluster', 'Show6M', chkShow6M.Checked); + cqrini.WriteBool('DXCluster', 'Show5M', chkShow5M.Checked); cqrini.WriteBool('DXCluster', 'Show4M', chkShow4M.Checked); cqrini.WriteBool('DXCluster', 'Show2M', chkShow2M.Checked); cqrini.WriteBool('DXCluster', 'Show125M', chkShow125M.Checked); @@ -1485,6 +1380,7 @@ begin cqrini.WriteBool('DXCluster', 'Show1MM', chkShow1MM.Checked); cqrini.WriteBool('DXCluster', 'CW', chkCW.Checked); cqrini.WriteBool('DXCluster', 'SSB', chkSSB.Checked); + cqrini.WriteBool('DXCluster', 'DATA', chkDATA.Checked); cqrini.WriteString('DXCluster', 'NotShow', edtDoNotShow.Text); cqrini.WriteBool('DXCluster', 'ConAfterRun', chkConToDXC.Checked); cqrini.WriteBool('DXCluster','ShowDxcCountry',chkShowDxcCountry.Checked); @@ -1584,25 +1480,6 @@ begin cqrini.WriteInteger('LoTW', 'eBckColor', cmbeQSLBckColor.Selected); cqrini.WriteBool('LoTW', 'ExpComment', chkExpCommet.Checked); - cqrini.WriteInteger('CW', 'Type1', cmbIfaceType1.ItemIndex); - cqrini.WriteInteger('CW', 'Type2', cmbIfaceType2.ItemIndex); - cqrini.WriteBool('CW', 'NoReset', cbNoKeyerReset.Checked); - cqrini.WriteString('CW', 'wk_port1', edtWinPort1.Text); - cqrini.WriteString('CW', 'wk_port2', edtWinPort2.Text); - cqrini.WriteBool('CW', 'PotSpeed', chkPotSpeed.Checked); - cqrini.WriteInteger('CW', 'wk_speed', edtWinSpeed.Value); - cqrini.WriteString('CW', 'cw_address', edtCWAddress.Text); - cqrini.WriteString('CW', 'cw_port1', edtCWPort1.Text); - cqrini.WriteString('CW', 'cw_port2', edtCWPort2.Text); - cqrini.WriteInteger('CW', 'cw_speed', edtCWSpeed.Value); - cqrini.WriteInteger('CW', 'wk_min', edtWinMinSpeed.Value); - cqrini.WriteInteger('CW', 'wk_max', edtWinMaxSpeed.Value); - cqrini.WriteString('CW','K3NGPort1',edtK3NGPort1.Text); - cqrini.WriteString('CW','K3NGPort2',edtK3NGPort2.Text); - cqrini.WriteInteger('CW','K3NGSerSpeed',StrToInt(edtK3NGSerSpeed.Text)); - cqrini.WriteInteger('CW','K3NGSpeed',StrToInt(edtK3NGSpeed.Text)); - cqrini.WriteInteger('CW','HamLibSpeed',StrToInt(edtHamLibSpeed.Text)); - cqrini.WriteInteger('fldigi', 'freq', rgFreqFrom.ItemIndex); cqrini.WriteString('fldigi', 'deffreq', edtDefaultFreq.Text); cqrini.WriteInteger('fldigi', 'mode', rgModeFrom.ItemIndex); @@ -1629,6 +1506,7 @@ begin cqrini.WriteString('wsjt', 'wb4locdate', DateEditLoc.Text); cqrini.WriteBool('wsjt','wb4CCall', cgLimit.Checked[0]); cqrini.WriteBool('wsjt','wb4CLoc', cgLimit.Checked[1]); + cqrini.WriteBool('wsjt', 'chkLoTWeQSL', chkwsjtLoeQ.Checked); cqrini.WriteString('n1mm','port',edtADIFPort.Text); cqrini.WriteString('n1mm','ip',edtADIFIp.Text); @@ -1659,9 +1537,14 @@ begin cqrini.WriteString('FifthClub', 'DateFrom', edtClub5Date.Text); cqrini.WriteBool('CallBook', 'QRZ', rbQRZ.Checked); + cqrini.WriteBool('CallBook', 'QRZCQ', rbQRZCQ.Checked); cqrini.WriteBool('Callbook', 'HamQTH', rbHamQTH.Checked); - cqrini.WriteString('CallBook', 'CBUser', edtCbUser.Text); - cqrini.WriteString('CallBook', 'CBPass', edtCbPass.Text); + cqrini.WriteString('CallBook', 'CbHamQTHUser', edtCbHamQTHUser.Text); + cqrini.WriteString('CallBook', 'CbHamQTHPass', edtCbHamQTHPass.Text); + cqrini.WriteString('CallBook', 'CbQRZUser', edtCbQRZUser.Text); + cqrini.WriteString('CallBook', 'CbQRZPass', edtCbQRZPass.Text); + cqrini.WriteString('CallBook', 'CbQRZCQUser', edtCbQRZCQUser.Text); + cqrini.WriteString('CallBook', 'CbQRZCQPass', edtCbQRZCQPass.Text); cqrini.WriteInteger('RBN','10db',cmbCl10db.Selected); cqrini.WriteInteger('RBN','20db',cmbCl20db.Selected); @@ -1683,6 +1566,7 @@ begin cqrini.WriteString('OnlineLog','HaUserName',edtHaUserName.Text); cqrini.WriteString('OnlineLog','HaPasswd',edtHaPasswd.Text); cqrini.WriteInteger('OnlineLog','HaColor',cmbHaColor.Selected); + cqrini.WriteString('OnlineLog','HaUrl',edtHamQthUrl.Text); cqrini.WriteBool('OnlineLog','ClUP',chkClUpEnabled.Checked); cqrini.WriteBool('OnlineLog','ClUpOnline',chkClUpOnline.Checked); @@ -1690,23 +1574,36 @@ begin cqrini.WriteString('OnlineLog','ClPasswd',edtClPasswd.Text); cqrini.WriteString('OnlineLog','ClEmail',edtClEmail.Text); cqrini.WriteInteger('OnlineLog','ClColor',cmbClColor.Selected); + cqrini.WriteString('OnlineLog','ClUrl',edtClubLogUrl.Text); + cqrini.WriteString('OnlineLog','ClUrlDel',edtClubLogUrlDel.Text); cqrini.WriteBool('OnlineLog','HrUP',chkHrUpEnabled.Checked); cqrini.WriteBool('OnlineLog','HrUpOnline',chkHrUpOnline.Checked); cqrini.WriteString('OnlineLog','HrUserName',edtHrUserName.Text); cqrini.WriteString('OnlineLog','HrCode',edtHrCode.Text); cqrini.WriteInteger('OnlineLog','HrColor',cmbHrColor.Selected); + + cqrini.WriteBool('OnlineLog','UdUP',chkUdUpEnabled.Checked); + cqrini.WriteBool('OnlineLog','UdUpOnline',chkUdUpOnline.Checked); + cqrini.WriteString('OnlineLog','UdAddress',edtUdAddress.Text); + cqrini.WriteBool('OnlineLog','UdIncExch',chkUdIncExch.Checked); + cqrini.WriteInteger('OnlineLog','UdColor',cmbUdColor.Selected); + cqrini.WriteBool('OnlineLog','CloseAfterUpload',chkCloseAfterUpload.Checked); cqrini.WriteBool('OnlineLog','IgnoreLoTWeQSL',chkIgnoreLoTW.Checked); + cqrini.WriteBool('OnlineLog','IgnoreQSL',chkIgnoreQSL.Checked); + cqrini.WriteBool('OnlineLog','IgnoreEdit',chkIgnoreEdit.Checked); + cqrini.WriteString('OnlineLog','HrUrl',edtHrdUrl.Text); cqrini.WriteString('prop','Url',edtCondxImageUrl.Text); + cqrini.WriteString('prop','UrlTxt',edtCondxTextUrl.Text); cqrini.WriteBool('prop','AsImage',rbCondxAsImage.Checked); cqrini.WriteBool('prop','AsText',rbCondxAsText.Checked); cqrini.WriteBool('prop','Values',chkShowCondxValues.Checked); cqrini.WriteBool('prop','CalcHF',chkCondxCalcHF.Checked); cqrini.WriteBool('prop','CalcVHF',chkCondxCalcVHF.Checked); - if WinKeyerChanged then frmNewQSO.InitializeCW; + if CWKeyerChanged then frmNewQSO.InitializeCW; fraExportPref1.SaveExportPref; @@ -1728,7 +1625,7 @@ begin frmBandMap.LoadFonts; cqrini.SaveToDisk; if TRXChanged then - frmTRXControl.InicializeRig; + frmTRXControl.InitializeRig; if RotChanged then frmRotControl.InicializeRot; @@ -1739,18 +1636,17 @@ begin frmNewQSO.ClearAfterFreqChange := False;//cqrini.ReadBool('NewQSO','ClearAfterFreqChange',False); frmNewQSO.ChangeFreqLimit := cqrini.ReadFloat('NewQSO','FreqChange',0.010); - if not chkSatelliteMode.Checked then - begin - frmNewQSO.btnClearSatelliteClick(nil); - frmNewQSO.pgDetails.TabIndex := 0 - end - else - begin - frmNewQSO.pgDetails.TabIndex := 1 - end; - frmNewQSO.pgDetails.Pages[1].TabVisible := chkSatelliteMode.Checked; - frmNewQSO.pgDetails.Pages[2].TabVisible := chkSatelliteMode.Checked; + Begin + if (cqrini.ReadInteger('NewQSO','DetailsTabIndex', 0) > 1 ) then + cqrini.WriteInteger('NewQSO','DetailsTabIndex',1); + frmNewQSO.btnClearSatelliteClick(nil); + end; + + frmNewQSO.pgDetails.TabIndex:= cqrini.ReadInteger('NewQSO','DetailsTabIndex', 0); + frmNewQSO.pgDetails.Pages[2].TabVisible := chkSatelliteMode.Checked; + frmNewQSO.pgDetails.Pages[3].TabVisible := chkSatelliteMode.Checked; + if ReloadFreq then dmUtils.InsertFreq(frmNewQSO.cmbFreq); @@ -1762,7 +1658,7 @@ begin frmNewQSO.cmbMode.Text := cmbMode.Text; end; - if (not (chkHaUpEnabled.Checked or chkClUpEnabled.Checked or chkHrUpEnabled.Checked)) then + if (not (chkHaUpEnabled.Checked or chkClUpEnabled.Checked or chkHrUpEnabled.Checked or chkUdUpEnabled.Checked)) then begin if wasOnlineLogSupportEnabled then dmLogUpload.DisableOnlineLogSupport @@ -1779,8 +1675,10 @@ begin if frmPropagation.Showing then frmPropagation.RefreshPropagation; - frmTRXControl.rbRadio1.Caption := edtRadio1Name.Text; - frmTRXControl.rbRadio2.Caption := edtRadio2Name.Text; + frmNewQSO.Op:=edtOperator.text; + cqrini.WriteString('TMPQSO','OP',edtOperator.text); + frmNewQSO.ShowOperator; + frmTRXControl.SetDebugMode(chkTrxControlDebug.Checked or (dmData.DebugLevel>0)); if ((frmNewQSO.sbNewQSO.Panels[0].Text = '') or (frmNewQSO.sbNewQSO.Panels[0].Text = cMyLoc)) then @@ -1789,6 +1687,8 @@ begin frmNewQSO.CurrentMyLoc:=edtLoc.Text; end; + if frmMain.Visible then frmMain.ShowFields; + cqrini.SaveToDisk; dmData.SaveConfigFile; frmDXCluster.ReloadSettings; @@ -1798,6 +1698,7 @@ begin dmData.LoadClubsSettings; dmData.LoadZipSettings; dmUtils.UpdateHelpBrowser; + cqrini.SetCache(False); end; procedure TfrmPreferences.FormCreate(Sender: TObject); @@ -2155,15 +2056,10 @@ procedure TfrmPreferences.btnFldigiPathClick(Sender: TObject); begin dlgOpen.Title := 'Locate fldigi binary ...'; if dlgOpen.Execute then - edtFldigiPath.Text := dlgOpen.FileName; -end; - -procedure TfrmPreferences.btnSelectQSOColorClick(Sender : TObject); -begin - dlgColor.Color := btnSelectQSOColor.Color; - if dlgColor.Execute then - btnSelectQSOColor.Color := dlgColor.Color; - btnSelectQSOColor.Repaint; + if FileExists(dlgOpen.FileName) then //with QT5 opendialog user can enter filename that may not exist + edtFldigiPath.Text := dlgOpen.FileName + else + ShowMessage('File not found!'); end; procedure TfrmPreferences.btnChangeDefFreqClick(Sender: TObject); @@ -2215,28 +2111,15 @@ begin dmUtils.OpenInApp('file://' + dmData.HelpDir + 'index.html' ); end; -procedure TfrmPreferences.btnLPColorClick(Sender: TObject); -begin - dlgColor.Color := btnLPColor.Color; - if dlgColor.Execute then - btnLPColor.Color := dlgColor.Color; - btnLPColor.Repaint; -end; - - -procedure TfrmPreferences.btnSPColorClick(Sender: TObject); -begin - dlgColor.Color := btnSPColor.Color; - if dlgColor.Execute then - btnSPColor.Color := dlgColor.Color; - btnSPColor.Repaint; -end; procedure TfrmPreferences.btnWsjtPathClick(Sender: TObject); begin dlgOpen.Title := 'Locate wsjtx binary ...'; if dlgOpen.Execute then - edtWsjtPath.Text := dlgOpen.FileName; + if FileExists(dlgOpen.FileName) then //with QT5 opendialog user can enter filename that may not exist + edtWsjtPath.Text := dlgOpen.FileName + else + ShowMessage('File not found!'); end; procedure TfrmPreferences.btnAlertCallsignsClick(Sender: TObject); @@ -2366,16 +2249,6 @@ begin dmMembership.CheckForMembershipUpdate end; -procedure TfrmPreferences.cbNoKeyerResetChange(Sender: TObject); -begin - if cbNoKeyerReset.Checked - and (cmbIfaceType1.ItemIndex <> cmbIfaceType2.ItemIndex ) //both keyers are not same - or (cmbIfaceType1.ItemIndex = 4) - or (cmbIfaceType2.ItemIndex = 4) //type is HamLib - then cbNoKeyerReset.Checked := false; //restart is always needed when radio changes -end; - - procedure TfrmPreferences.chkClUpEnabledChange(Sender: TObject); begin edtClUserName.Enabled := chkClUpEnabled.Checked; @@ -2401,12 +2274,43 @@ begin cmbHrColor.Enabled := chkHrUpEnabled.Checked end; +procedure TfrmPreferences.chkIgnoreEditChange(Sender: TObject); +begin + //Warn: + if not chkIgnoreEdit.Focused then exit; //otherwise triggers on settings load + chkIgnoreEdit.Checked:=WarnCheck(chkIgnoreEdit.Checked) +end; + +procedure TfrmPreferences.chkIgnoreLoTWChange(Sender: TObject); + +begin + //Warn: + if not chkIgnoreLoTW.Focused then exit; //otherwise triggers on settings load + chkIgnoreLoTW.Checked:=WarnCheck(chkIgnoreLoTW.Checked) +end; + +procedure TfrmPreferences.chkIgnoreQSLChange(Sender: TObject); +begin + //Warn: + if not chkIgnoreQSL.Focused then exit;//otherwise triggers on settings load + chkIgnoreQSL.Checked:=WarnCheck(chkIgnoreQSL.Checked) +end; + +procedure TfrmPreferences.chkUdUpEnabledChange(Sender: TObject); +begin + edtUdAddress.Enabled := chkUdUpEnabled.Checked; + chkUdIncExch.Enabled := chkUdUpEnabled.Checked; + chkUdUpOnline.Enabled := chkUdUpEnabled.Checked; + cmbUdColor.Enabled := chkUdUpEnabled.Checked +end; + procedure TfrmPreferences.chkPotSpeedChange(Sender: TObject); begin if chkPotSpeed.Checked then edtWinSpeed.Enabled := False else edtWinSpeed.Enabled := True; + CWKeyerChanged := True end; procedure TfrmPreferences.chkProfileLocatorClick(Sender: TObject); @@ -2514,55 +2418,47 @@ begin end; end; -procedure TfrmPreferences.cmbIfaceType1Change(Sender: TObject); +procedure TfrmPreferences.cmbCWRadioChange(Sender: TObject); begin - WinKeyerChanged := True; - if cbNoKeyerReset.Checked - and (cmbIfaceType1.ItemIndex <> cmbIfaceType2.ItemIndex ) //both keyers are not same - or (cmbIfaceType1.ItemIndex = 4) - or (cmbIfaceType2.ItemIndex = 4) //type is HamLib - then cbNoKeyerReset.Checked := false; //restart is always needed when radio changes + if cmbCWRadio.ItemIndex<1 then cmbCWRadio.ItemIndex:=1; end; -procedure TfrmPreferences.cmbIfaceType2Change(Sender: TObject); + +procedure TfrmPreferences.cmbCWRadioCloseUp(Sender: TObject); +begin + if cmbCWRadio.ItemIndex<1 then cmbCWRadio.ItemIndex:=1; + SaveCWif(CWifLoaded); + LoadCWif(cmbCWRadio.ItemIndex); +end; + +procedure TfrmPreferences.cmbIfaceTypeChange(Sender: TObject); +begin + CWKeyerChanged:=true; +end; + +procedure TfrmPreferences.cbNoKeyerResetChange(Sender: TObject); begin - WinKeyerChanged := True; if cbNoKeyerReset.Checked - and (cmbIfaceType1.ItemIndex <> cmbIfaceType2.ItemIndex ) //both keyers are not same - or (cmbIfaceType1.ItemIndex = 4) - or (cmbIfaceType2.ItemIndex = 4) //type is HamLib + and (cmbIfaceType.ItemIndex = 4) //type is HamLib + then cbNoKeyerReset.Checked := false; //restart is always needed when radio changes + CWKeyerChanged := True +end; + +procedure TfrmPreferences.cmbIfaceTypeCloseUp(Sender: TObject); +begin + CWKeyerChanged := True; + if cbNoKeyerReset.Checked + and (cmbIfaceType.ItemIndex = 4) //type is HamLib then cbNoKeyerReset.Checked := false; //restart is always needed when radio changes end; -procedure TfrmPreferences.cmbModelRig1Change(Sender: TObject); +procedure TfrmPreferences.cmbModelRigChange(Sender: TObject); begin - chkR1RunRigCtld.Enabled:=True; + chkRunRigCtld.Enabled:=True; - if cmbModelRig1.ItemIndex=0 then //With Hamlib Dummy force rigctld to start + if cmbModelRig.ItemIndex=1 then //With Hamlib Net rigctld do not start rigctld (no sense) Begin - chkR1RunRigCtld.Checked:=True; - chkR1RunRigCtld.Enabled:=False; - end; - if cmbModelRig1.ItemIndex=1 then //With Hamlib Net rigctld do not start rigctld (no sense) - Begin - chkR1RunRigCtld.Checked:=False; - chkR1RunRigCtld.Enabled:=False; - end; - TRXParamsChange(nil); -end; - -procedure TfrmPreferences.cmbModelRig2Change(Sender: TObject); -begin - chkR2RunRigCtld.Enabled:=True; - - if cmbModelRig2.ItemIndex=0 then //With Hamlib Dummy force rigctld to start - Begin - chkR2RunRigCtld.Checked:=True; - chkR2RunRigCtld.Enabled:=False; - end; - if cmbModelRig2.ItemIndex=1 then //With Hamlib Net rigctld do not start rigctld (no sense) - Begin - chkR2RunRigCtld.Checked:=False; - chkR2RunRigCtld.Enabled:=False; + chkRunRigCtld.Checked:=False; + chkRunRigCtld.Enabled:=False; end; TRXParamsChange(nil); end; @@ -2590,12 +2486,74 @@ begin chkRot2RunRotCtld.Enabled:=True; RotorParamsChange(nil); end; + +procedure TfrmPreferences.cmbRadioModesChange(Sender: TObject); +begin + if cmbRadioModes.ItemIndex<1 then cmbRadioModes.ItemIndex:=1; +end; + +procedure TfrmPreferences.cmbRadioModesCloseUp(Sender: TObject); + +begin + if cmbRadioModes.ItemIndex<1 then cmbRadioModes.ItemIndex:=1; + SaveBandW(BandWNrLoaded); + LoadBandW(cmbRadioModes.ItemIndex); +end; + +procedure TfrmPreferences.cmbRadioNrChange(Sender: TObject); +begin + if cmbRadioNr.ItemIndex<1 then cmbRadioNr.ItemIndex:=1; +end; + +procedure TfrmPreferences.cmbRadioNrCloseUp(Sender: TObject); +begin + if cmbRadioNr.ItemIndex<1 then cmbRadioNr.ItemIndex:=1; + SaveTRX(RadioNrLoaded); //save edited rig + LoadTRX(cmbRadioNr.ItemIndex); //load selected rig + InitRigCmb; //load names and set currently edited rig + + cmbRadioModes.ItemIndex:= cmbRadioNr.ItemIndex; //select rig in use + cmbCWRadio.ItemIndex:=cmbRadioNr.ItemIndex; +end; + procedure TfrmPreferences.edtAlertCmdExit(Sender: TObject); begin edtAlertCmd.Text:=StringReplace(edtAlertCmd.Text,'~/',dmData.UsrHomeDir,[rfReplaceAll]); // ~ in command causes DXCluster spot flow stop (!?) end; +procedure TfrmPreferences.edtDataCmdChange(Sender: TObject); +begin + edtDataCmd.Text:=DataModeInput(edtDataCmd.Text); + edtDataCmd.SelStart:=length(edtDataCmd.Text); + edtDataCmd.SelLength:=0; +end; + +procedure TfrmPreferences.edtDigiModesExit(Sender: TObject); +var i :integer; +begin + cqrini.WriteString('Modes', 'Digi', edtDigiModes.Text); + i:=cmbDataMode.ItemIndex; + dmUtils.InsertModes(cmbDataMode); + cmbDataMode.ItemIndex:=i; +end; + +procedure TfrmPreferences.edtGCBeamWidthChange(Sender: TObject); +begin + +end; + +function TfrmPreferences.DataModeInput(s:string):string; +begin + s:=Upcase(s); + if (length(s)>0) + and + not ( (s[length(s)] in ['A'..'Z']) + or (s[length(s)] in ['0'..'9']) ) then + s:=copy(s,1,length(s)-1); + Result:=s; +end; + procedure TfrmPreferences.edtGCLineWidthExit(Sender: TObject); var v:integer; begin @@ -2654,6 +2612,11 @@ begin edtImgFiles.Text:=SeekExecFile(edtImgFiles.Text,'Find image viewer'); end; +procedure TfrmPreferences.edtK3NGSerSpeedChange(Sender: TObject); +begin + +end; + procedure TfrmPreferences.edtPdfFilesExit(Sender: TObject); begin if ExtractFilePath(edtPdfFiles.Text)='' then @@ -2676,11 +2639,6 @@ Begin Result := odFindBrowser.Filename; end; -procedure TfrmPreferences.edtK3NGSerSpeedChange(Sender: TObject); -begin - WinKeyerChanged := True -end; - procedure TfrmPreferences.edtLocChange(Sender: TObject); begin edtLoc.Text := dmUtils.StdFormatLocator(edtLoc.Text); @@ -2703,12 +2661,23 @@ begin end; end; +procedure TfrmPreferences.edtOperatorExit(Sender: TObject); +begin + edtOperator.text:=Trim(Uppercase(edtOperator.text)); +end; + procedure TfrmPreferences.edtRecetQSOsKeyPress(Sender: TObject; var Key: char); begin if not (key in ['0'..'9']) then key := #0; end; +procedure TfrmPreferences.edtRigCountChange(Sender: TObject); +begin + cqrini.WriteInteger('TRX', 'RigCount', edtRigCount.Value); + InitRigCmb; //load names and set currently edited rig +end; + procedure TfrmPreferences.TRXParamsChange(Sender: TObject); begin TRXChanged := True @@ -2718,6 +2687,31 @@ begin RotChanged := True; end; +procedure TfrmPreferences.tabCWInterfaceContextPopup(Sender: TObject; + MousePos: TPoint; var Handled: Boolean); +begin + +end; + +procedure TfrmPreferences.tabCWInterfaceExit(Sender: TObject); +begin + SaveCWif(CWifLoaded); //save currently open CW settings + cmbRadioNr.ItemIndex:=cmbCWRadio.ItemIndex; + cmbRadioModes.ItemIndex:= cmbRadioNr.ItemIndex; //select rig in use +end; + +procedure TfrmPreferences.tabModesExit(Sender: TObject); +begin + SaveBandW(BandWNrLoaded); //save currently loaded modes + cmbRadioNr.ItemIndex:=cmbRadioModes.ItemIndex; //select rig in use + cmbCWRadio.ItemIndex:=cmbRadioNr.ItemIndex; +end; + +procedure TfrmPreferences.tabTRXcontrolEnter(Sender: TObject); +begin + LoadTRX(cmbRadioNr.ItemIndex); +end; + procedure TfrmPreferences.edtWebBrowserClick(Sender: TObject); Begin odFindBrowser.InitialDir:='/usr/bin'; @@ -2744,24 +2738,9 @@ begin end; end; -procedure TfrmPreferences.edtWinMaxSpeedChange(Sender: TObject); -begin - WinKeyerChanged := True -end; - -procedure TfrmPreferences.edtWinMinSpeedChange(Sender: TObject); -begin - WinKeyerChanged := True -end; - -procedure TfrmPreferences.edtWinPort1Change(Sender: TObject); -begin - WinKeyerChanged := True -end; - procedure TfrmPreferences.edtWinSpeedChange(Sender: TObject); begin - WinKeyerChanged := True + CWKeyerChanged := True end; procedure TfrmPreferences.edtXplanetLocChange(Sender: TObject); @@ -2785,9 +2764,10 @@ begin dmUtils.InsertModes(cmbDefaultMode); dmUtils.InsertModes(cmbMode); dmUtils.InsertModes(cmbWsjtDefaultMode); + dmUtils.InsertModes(cmbDataMode); cmbDefaultMode.Style := csDropDownList; cmbWsjtDefaultMode.Style := csDropDownList; - + cmbDataMode.Style:=csDropDownList; LoadMebershipCombo; dmUtils.ReadZipList(cmbFirstZip); @@ -2817,6 +2797,7 @@ begin cmbMode.Text := cqrini.ReadString('NewQSO', 'Mode', 'CW'); cmbQSL_S.Text := cqrini.ReadString('NewQSO', 'QSL_S', ''); edtComments.Text := cqrini.ReadString('NewQSO', 'RemQSO', ''); + edtOperator.Text := cqrini.ReadString('NewQSO', 'Op', ''); edtUsrBtn.Text := cqrini.ReadString('NewQSO', 'UsrBtn', 'https://www.qrzcq.com/call/$CALL'); chkUseSpaceBar.Checked := cqrini.ReadBool('NewQSO', 'UseSpaceBar', False); chkRefreshAfterSave.Checked := cqrini.ReadBool('NewQSO', 'RefreshAfterSave', True); @@ -2849,8 +2830,11 @@ begin edtGCStep.Caption := CurrToStr(cqrini.ReadFloat('Program', 'GraylineGCstep',0.1)); edtGCPolarDivisor.Caption := IntToStr(cqrini.ReadInteger('Program', 'GraylineGCPolarDivisor',10)); edtGCLineWidth.Caption := IntToStr(cqrini.ReadInteger('Program', 'GraylineGCLineWidth',2)); - btnSPColor.Color := StringToColor(cqrini.ReadString('Program', 'GraylineGCLineSPColor', 'clYellow' )); - btnLPColor.Color := StringToColor(cqrini.ReadString('Program', 'GraylineGCLineLPColor', 'clFuchsia' )); + btnSPColor.ButtonColor := StringToColor(cqrini.ReadString('Program', 'GraylineGCLineSPColor','clYellow' )); + btnLPColor.ButtonColor := StringToColor(cqrini.ReadString('Program', 'GraylineGCLineLPColor','clFuchsia' )); + btnBPColor.ButtonColor:= StringToColor(cqrini.ReadString('Program', 'GraylineGCLineBEColor','clRed')); + edtGCBeamWidth.Caption:= IntToStr(cqrini.ReadInteger('Program', 'GraylineGBeamLineWidth',2)); + edtGCBeamLength.Caption:= IntToStr(cqrini.ReadInteger('Program', 'GraylineGBeamLineLength',1500)); edtWebBrowser.Text := cqrini.ReadString('Program', 'WebBrowser', dmUtils.MyDefaultBrowser); @@ -2863,7 +2847,7 @@ begin chkSysUTC.Checked := cqrini.ReadBool('Program', 'SysUTC', True); chkShowMiles.Checked := cqrini.ReadBool('Program','ShowMiles',False); chkQSOColor.Checked := cqrini.ReadBool('Program', 'QSODiffColor', False); - btnSelectQSOColor.Color := cqrini.ReadInteger('Program', 'QSOColor', clPurple); + btnSelectQSOColor.ButtonColor := cqrini.ReadInteger('Program', 'QSOColor', clPurple); edtQSOColorDate.Text := cqrini.ReadString('Program', 'QSOColorDate', ''); if cqrini.ReadBool('Program', 'BandStatMHz', True) then @@ -2932,11 +2916,12 @@ begin cb15m.Checked := cqrini.ReadBool('Bands', '15m', True); cb12m.Checked := cqrini.ReadBool('Bands', '12m', True); cb10m.Checked := cqrini.ReadBool('Bands', '10m', True); - - cb4m.Checked := cqrini.ReadBool('Bands', '4m', False); + cb8m.Checked := cqrini.ReadBool('Bands', '8m', True); cb6m.Checked := cqrini.ReadBool('Bands', '6m', True); - cb125m.Checked := cqrini.ReadBool('Bands', '1.25m', False); + cb5m.Checked := cqrini.ReadBool('Bands', '5m', True); + cb4m.Checked := cqrini.ReadBool('Bands', '4m', False); cb2m.Checked := cqrini.ReadBool('Bands', '2m', True); + cb125m.Checked := cqrini.ReadBool('Bands', '1.25m', False); cb70cm.Checked := cqrini.ReadBool('Bands', '70cm', True); cb30cm.Checked := cqrini.ReadBool('Bands', '33cm', False); cb23cm.Checked := cqrini.ReadBool('Bands', '23cm', False); @@ -2954,74 +2939,23 @@ begin edtRigCtldPath.Text := cqrini.ReadString('TRX', 'RigCtldPath', '/usr/bin/rigctld'); chkTrxControlDebug.Checked := cqrini.ReadBool('TRX','Debug',False); chkModeRelatedOnly.Checked := cqrini.ReadBool('TRX','MemModeRelated',False); + edtRigCount.Value:=cqrini.ReadInteger('TRX', 'RigCount', 2); + InitRigCmb(true); //define used rig=true + LoadTRX(cmbRadioNr.ItemIndex); + LoadBandW(cmbRadioNr.ItemIndex); + LoadCWif(cmbRadioNr.ItemIndex); edtRotCtldPath.Text := cqrini.ReadString('ROT', 'RotCtldPath', '/usr/bin/rotctld'); - - if (FileExistsUTF8(edtRigCtldPath.Text)) then - begin - dmUtils.LoadRigsToComboBox(cqrini.ReadString('TRX1', 'model', ''),edtRigCtldPath.Text,cmbModelRig1); - dmUtils.LoadRigsToComboBox(cqrini.ReadString('TRX2', 'model', ''),edtRigCtldPath.Text,cmbModelRig2) - end - else begin - Application.MessageBox('rigctld binary not fount, cannot load list of supported rigs!'+LineEnding+LineEnding+ - 'Fix path to rigctld in TRX control tab.', 'Error', mb_OK+ mb_IconError) - end; - if (FileExistsUTF8(edtRotCtldPath.Text)) then begin dmUtils.LoadRigsToComboBox(cqrini.ReadString('ROT1', 'model', ''),edtRotCtldPath.Text,cmbModelRot1); dmUtils.LoadRigsToComboBox(cqrini.ReadString('ROT2', 'model', ''),edtRotCtldPath.Text,cmbModelRot2) end else begin - Application.MessageBox('rotctld binary not fount, cannot load list of supported rotators!'+LineEnding+LineEnding+ + Application.MessageBox('rotctld binary not found, unable to load list of supported rotators!'+LineEnding+LineEnding+ 'Fix path to rotctld in ROT control tab.', 'Error', mb_OK+ mb_IconError) end; - edtR1Device.Text := cqrini.ReadString('TRX1', 'device', ''); - edtPoll1.Text := cqrini.ReadString('TRX1', 'poll', '500'); - edtRadio1Name.Text := cqrini.ReadString('TRX1', 'Desc', 'Radio 1'); - chkR1SendCWR.Checked := cqrini.ReadBool('TRX1', 'CWR', False); - chkR1Vfo.Checked:= cqrini.ReadBool('TRX1', 'ChkVfo', True); - edtR1RigCtldPort.Text := cqrini.ReadString('TRX1', 'RigCtldPort', '4532'); - edtR1RigCtldArgs.Text := cqrini.ReadString('TRX1', 'ExtraRigCtldArgs', ''); - chkR1RunRigCtld.Checked := cqrini.ReadBool('TRX1', 'RunRigCtld', False); - edtR1Host.Text := cqrini.ReadString('TRX1', 'host', 'localhost'); - cmbSpeedR1.ItemIndex := cqrini.ReadInteger('TRX1', 'SerialSpeed', 0); - cmbDataBitsR1.ItemIndex := cqrini.ReadInteger('TRX1', 'DataBits', 0); - cmbStopBitsR1.ItemIndex := cqrini.ReadInteger('TRX1', 'StopBits', 0); - cmbParityR1.ItemIndex := cqrini.ReadInteger('TRX1', 'Parity', 0); - cmbHanshakeR1.ItemIndex := cqrini.ReadInteger('TRX1', 'HandShake', 0); - cmbDTRR1.ItemIndex := cqrini.ReadInteger('TRX1', 'DTR', 0); - cmbRTSR1.ItemIndex := cqrini.ReadInteger('TRX1', 'RTS', 0); - edtUsr1R1name.Text:=cqrini.ReadString('TRX1', 'usr1name', 'Usr1'); - edtUsr2R1name.Text:=cqrini.ReadString('TRX1', 'usr2name', 'Usr2'); - edtUsr3R1name.Text:=cqrini.ReadString('TRX1', 'usr3name', 'Usr3'); - edtUsr1R1.Text:=cqrini.ReadString('TRX1', 'usr1', ''); - edtUsr2R1.Text:=cqrini.ReadString('TRX1', 'usr2', ''); - edtUsr3R1.Text:=cqrini.ReadString('TRX1', 'usr3', ''); - - edtR2Device.Text := cqrini.ReadString('TRX2', 'device', ''); - edtPoll2.Text := cqrini.ReadString('TRX2', 'poll', '500'); - edtRadio2Name.Text := cqrini.ReadString('TRX2', 'Desc', 'Radio 2'); - chkR2SendCWR.Checked := cqrini.ReadBool('TRX2', 'CWR', False); - chkR2Vfo.Checked:= cqrini.ReadBool('TRX2', 'ChkVfo', True); - edtR2RigCtldPort.Text := cqrini.ReadString('TRX2', 'RigCtldPort', '4532'); - edtR2RigCtldArgs.Text := cqrini.ReadString('TRX2', 'ExtraRigCtldArgs', ''); - chkR2RunRigCtld.Checked := cqrini.ReadBool('TRX2', 'RunRigCtld', False); - edtR2Host.Text := cqrini.ReadString('TRX2', 'host', 'localhost'); - cmbSpeedR2.ItemIndex := cqrini.ReadInteger('TRX2', 'SerialSpeed', 0); - cmbDataBitsR2.ItemIndex := cqrini.ReadInteger('TRX2', 'DataBits', 0); - cmbStopBitsR2.ItemIndex := cqrini.ReadInteger('TRX2', 'StopBits', 0); - cmbParityR2.ItemIndex := cqrini.ReadInteger('TRX2', 'Parity', 0); - cmbHanshakeR2.ItemIndex := cqrini.ReadInteger('TRX2', 'HandShake', 0); - cmbDTRR2.ItemIndex := cqrini.ReadInteger('TRX2', 'DTR', 0); - cmbRTSR2.ItemIndex := cqrini.ReadInteger('TRX2', 'RTS', 0); - edtUsr1R2name.Text:=cqrini.ReadString('TRX2', 'usr1name', 'Usr1'); - edtUsr2R2name.Text:=cqrini.ReadString('TRX2', 'usr2name', 'Usr2'); - edtUsr3R2name.Text:=cqrini.ReadString('TRX2', 'usr3name', 'Usr3'); - edtUsr1R2.Text:=cqrini.ReadString('TRX2', 'usr1', ''); - edtUsr2R2.Text:=cqrini.ReadString('TRX2', 'usr2', ''); - edtUsr3R2.Text:=cqrini.ReadString('TRX2', 'usr3', ''); edtRot1Device.Text := cqrini.ReadString('ROT1', 'device', ''); edtRot1Poll.Text := cqrini.ReadString('ROT1', 'poll', '500'); @@ -3055,20 +2989,8 @@ begin cmbDTRRot2.ItemIndex := cqrini.ReadInteger('ROT2', 'DTR', 0); cmbRTSRot2.ItemIndex := cqrini.ReadInteger('ROT2', 'RTS', 0); - edtCW1.Value := cqrini.ReadInteger('Band1', 'CW', 500); - edtSSB1.Value := cqrini.ReadInteger('Band1', 'SSB', 1800); - edtRTTY1.Value := cqrini.ReadInteger('Band1', 'RTTY', 500); - edtAM1.Value := cqrini.ReadInteger('Band1', 'AM', 3000); - edtFM1.Value := cqrini.ReadInteger('Band1', 'FM', 2500); + cmbModelRigChange(nil); - edtCW2.Value := cqrini.ReadInteger('Band2', 'CW', 500); - edtSSB2.Value := cqrini.ReadInteger('Band2', 'SSB', 1800); - edtRTTY2.Value := cqrini.ReadInteger('Band2', 'RTTY', 500); - edtAM2.Value := cqrini.ReadInteger('Band2', 'AM', 3000); - edtFM2.Value := cqrini.ReadInteger('Band2', 'FM', 2500); - - cmbModelRig1Change(nil); - cmbModelRig2Change(nil); cmbModelRot1Change(nil); cmbModelRot2Change(nil); @@ -3096,7 +3018,9 @@ begin chkShow15M.Checked := cqrini.ReadBool('DXCluster', 'Show15M', True); chkShow12M.Checked := cqrini.ReadBool('DXCluster', 'Show12M', True); chkShow10M.Checked := cqrini.ReadBool('DXCluster', 'Show10M', True); + chkShow8M.Checked := cqrini.ReadBool('DXCluster', 'Show8M', True); chkShow6M.Checked := cqrini.ReadBool('DXCluster', 'Show6M', True); + chkShow5M.Checked := cqrini.ReadBool('DXCluster', 'Show5M', True); chkShow4M.Checked := cqrini.ReadBool('DXCluster', 'Show4M', True); chkShow2M.Checked := cqrini.ReadBool('DXCluster', 'Show2M', True); chkShow125M.Checked := cqrini.ReadBool('DXCluster', 'Show125M', True); @@ -3115,6 +3039,7 @@ begin chkShow1MM.Checked := cqrini.ReadBool('DXCluster', 'Show1MM', True); chkCW.Checked := cqrini.ReadBool('DXCluster', 'CW', True); chkSSB.Checked := cqrini.ReadBool('DXCluster', 'SSB', True); + chkDATA.Checked := cqrini.ReadBool('DXCluster', 'DATA', True); edtDoNotShow.Text := cqrini.ReadString('DXCluster', 'NotShow', ''); cmbNewCountry.Selected := cqrini.ReadInteger('DXCluster', 'NewCountry', 0); cmbNewBand.Selected := cqrini.ReadInteger('DXCluster', 'NewBand', 0); @@ -3226,25 +3151,6 @@ begin cmbeQSLBckColor.Selected := cqrini.ReadInteger('LoTW', 'eBckColor', clSkyBlue); chkExpCommet.Checked := cqrini.ReadBool('LoTW', 'ExpComment', True); - cmbIfaceType1.ItemIndex := cqrini.ReadInteger('CW', 'Type1', 0); - cmbIfaceType2.ItemIndex := cqrini.ReadInteger('CW', 'Type2', 0); - cbNoKeyerReset.Checked := cqrini.ReadBool('CW', 'NoReset', false); - edtWinPort1.Text := cqrini.ReadString('CW', 'wk_port1', ''); - edtWinPort2.Text := cqrini.ReadString('CW', 'wk_port2', ''); - chkPotSpeed.Checked := cqrini.ReadBool('CW', 'PotSpeed', False); - edtWinSpeed.Value := cqrini.ReadInteger('CW', 'wk_speed', 30); - edtCWAddress.Text := cqrini.ReadString('CW', 'cw_address', 'localhost'); - edtCWPort1.Text := cqrini.ReadString('CW', 'cw_port1', '6789'); - edtCWPort2.Text := cqrini.ReadString('CW', 'cw_port2', '6789'); - edtCWSpeed.Value := cqrini.ReadInteger('CW', 'cw_speed', 30); - edtWinMinSpeed.Value := cqrini.ReadInteger('CW', 'wk_min', 5); - edtWinMaxSpeed.Value := cqrini.ReadInteger('CW', 'wk_max', 60); - edtK3NGPort1.Text := cqrini.ReadString('CW','K3NGPort1',''); - edtK3NGPort2.Text := cqrini.ReadString('CW','K3NGPort2',''); - edtK3NGSerSpeed.Text := IntToStr(cqrini.ReadInteger('CW','K3NGSerSpeed',115200)); - edtK3NGSpeed.Text := IntToStr(cqrini.ReadInteger('CW','K3NGSpeed',30)); - edtHamLibSpeed.Text := IntToStr(cqrini.ReadInteger('CW','HamLibSpeed',30)); - rgFreqFrom.ItemIndex := cqrini.ReadInteger('fldigi', 'freq', 1); // edtDefaultFreq.Text := cqrini.ReadString('fldigi', 'deffreq', '3.600');// rgModeFrom.ItemIndex := cqrini.ReadInteger('fldigi', 'mode', 1); // @@ -3267,7 +3173,8 @@ begin rgWsjtFreqFrom.ItemIndex := cqrini.ReadInteger('wsjt', 'freq', 1); edtWsjtDefaultFreq.Text := cqrini.ReadString('wsjt', 'deffreq', '3.600'); rgWsjtModeFrom.ItemIndex := cqrini.ReadInteger('wsjt', 'mode', 1); - cmbWsjtDefaultMode.Text := cqrini.ReadString('wsjt', 'defmode', 'JT65'); + cmbWsjtDefaultMode.Text := cqrini.ReadString('wsjt', 'defmode', 'FT8'); + chkwsjtLoeQ.Checked := cqrini.ReadBool('wsjt', 'chkLoTWeQSL', False); DateEditCall.Text := cqrini.ReadString('wsjt', 'wb4calldate', '1900-01-01'); //sure all qsos by default :-) DateEditLoc.Text := cqrini.ReadString('wsjt', 'wb4locdate','1900-01-01'); cgLimit.Checked[0] := cqrini.ReadBool('wsjt','wb4CCall', False); @@ -3296,10 +3203,15 @@ begin edtClub4Date.Text := cqrini.ReadString('FourthClub', 'DateFrom', C_CLUB_DEFAULT_DATE_FROM); edtClub5Date.Text := cqrini.ReadString('FifthClub', 'DateFrom', C_CLUB_DEFAULT_DATE_FROM); - edtCbUser.Text := cqrini.ReadString('CallBook', 'CBUser', ''); - edtCbPass.Text := cqrini.ReadString('CallBook', 'CBPass', ''); + edtCbHamQTHUser.Text := cqrini.ReadString('CallBook', 'CbHamQTHUser', ''); + edtCbHamQTHPass.Text := cqrini.ReadString('CallBook', 'CbHamQTHPass', ''); + edtCbQRZUser.Text := cqrini.ReadString('CallBook', 'CbQRZUser', ''); + edtCbQRZPass.Text := cqrini.ReadString('CallBook', 'CbQRZPass', ''); + edtCbQRZCQUser.Text := cqrini.ReadString('CallBook', 'CbQRZCQUser', ''); + edtCbQRZCQPass.Text := cqrini.ReadString('CallBook', 'CbQRZCQPass', ''); rbHamQTH.Checked := cqrini.ReadBool('Callbook', 'HamQTH', True); rbQRZ.Checked := cqrini.ReadBool('Callbook', 'QRZ', False); + rbQRZCQ.Checked := cqrini.ReadBool('Callbook', 'QRZCQ', False); cmbCl10db.Selected := cqrini.ReadInteger('RBN','10db',clWhite); cmbCl20db.Selected := cqrini.ReadInteger('RBN','20db',clPurple); @@ -3318,6 +3230,7 @@ begin edtHaUserName.Text := cqrini.ReadString('OnlineLog','HaUserName',''); edtHaPasswd.Text := cqrini.ReadString('OnlineLog','HaPasswd',''); cmbHaColor.Selected := cqrini.ReadInteger('OnlineLog','HaColor',clBlue); + edtHamQTHurl.Text := cqrini.ReadString('OnlineLog','HaUrl','http://www.hamqth.com/qso_realtime.php'); chkHaUpEnabledChange(nil); chkClUpEnabled.Checked := cqrini.ReadBool('OnlineLog','ClUP',False); @@ -3326,6 +3239,8 @@ begin edtClPasswd.Text := cqrini.ReadString('OnlineLog','ClPasswd',''); edtClEmail.Text := cqrini.ReadString('OnlineLog','ClEmail',''); cmbClColor.Selected := cqrini.ReadInteger('OnlineLog','ClColor',clRed); + edtClubLogUrl.Text := cqrini.ReadString('OnlineLog','ClUrl','https://clublog.org/realtime.php'); + edtClubLogUrlDel.Text := cqrini.ReadString('OnlineLog','ClUrlDel','https://clublog.org/delete.php'); chkClUpEnabledChange(nil); chkHrUpEnabled.Checked := cqrini.ReadBool('OnlineLog','HrUP',False); @@ -3333,51 +3248,51 @@ begin edtHrUserName.Text := cqrini.ReadString('OnlineLog','HrUserName',''); edtHrCode.Text := cqrini.ReadString('OnlineLog','HrCode',''); cmbHrColor.Selected := cqrini.ReadInteger('OnlineLog','HrColor',clPurple); - chkCloseAfterUpload.Checked := cqrini.ReadBool('OnlineLog','CloseAfterUpload',False); - chkIgnoreLoTW.Checked := cqrini.ReadBool('OnlineLog','IgnoreLoTWeQSL',False); + edtHrdUrl.Text := cqrini.ReadString('OnlineLog','HrUrl','http://robot.hrdlog.net/NewEntry.aspx'); chkHrUpEnabledChange(nil); + chkUdUpEnabled.Checked := cqrini.ReadBool('OnlineLog','UdUP',False); + chkUdUpOnline.Checked := cqrini.ReadBool('OnlineLog','UdUpOnline',False); + edtUdAddress.Text := cqrini.ReadString('OnlineLog','UdAddress',''); + chkUdIncExch.Checked := cqrini.ReadBool('OnlineLog','UdIncExch',True); + cmbUdColor.Selected := cqrini.ReadInteger('OnlineLog','UdColor',clGreen); + chkUdUpEnabledChange(nil); + + chkCloseAfterUpload.Checked := cqrini.ReadBool('OnlineLog','CloseAfterUpload',False); + chkIgnoreLoTW.Checked := cqrini.ReadBool('OnlineLog','IgnoreLoTWeQSL',False); + chkIgnoreQSL.Checked := cqrini.ReadBool('OnlineLog','IgnoreQSL',False); + chkIgnoreEdit.Checked := cqrini.ReadBool('OnlineLog','IgnoreEdit',False); + edtCondxImageUrl.Text := cqrini.ReadString('prop','Url','http://www.hamqsl.com/solarbrief.php'); + edtCondxTextUrl.Text := cqrini.ReadString('prop','UrlTxt','https://www.hamqsl.com/solarxml.php' ); rbCondxAsImage.Checked := cqrini.ReadBool('prop','AsImage',True); rbCondxAsText.Checked := cqrini.ReadBool('prop','AsText',False); chkShowCondxValues.Checked := cqrini.ReadBool('prop','Values',True); chkCondxCalcHF.Checked := cqrini.ReadBool('prop','CalcHF',True); chkCondxCalcVHF.Checked := cqrini.ReadBool('prop','CalcVHF',True); - wasOnlineLogSupportEnabled := chkHaUpEnabled.Checked or chkClUpEnabled.Checked or chkHrUpEnabled.Checked; + wasOnlineLogSupportEnabled := chkHaUpEnabled.Checked or chkClUpEnabled.Checked or chkHrUpEnabled.Checked or chkUdUpEnabled.Checked; fraExportPref1.LoadExportPref; lbPreferences.Selected[pgPreferences.ActivePageIndex] := True; - edtCW1.Width := 60; - edtSSB1.Width := 60; - edtRTTY1.Width := 60; - edtAM1.Width := 60; - edtFM1.Width := 60; + chkSysUTCClick(nil); TRXChanged := False; RotChanged := False; - WinKeyerChanged := False; + CWKeyerChanged := False; pgPreferences.ActivePageIndex := ActPageIdx; //set wanted tab for showing when open. ActTab is public variable. lbPreferences.ItemIndex := ActPageIdx; end; -procedure TfrmPreferences.edtPoll2Exit(Sender: TObject); +procedure TfrmPreferences.edtPollExit(Sender: TObject); var tmp: integer = 0; begin - if not TryStrToInt(edtPoll1.Text, tmp) then - edtPoll2.Text := '500'; -end; - -procedure TfrmPreferences.edtPoll1Exit(Sender: TObject); -var - tmp: integer = 0; -begin - if not TryStrToInt(edtPoll1.Text, tmp) then - edtPoll1.Text := '500'; + if not TryStrToInt(edtPoll.Text, tmp) then + edtPoll.Text := '500'; end; procedure TfrmPreferences.pgPreferencesChange(Sender: TObject); @@ -3455,6 +3370,263 @@ begin LoadMebershipCombo end; +Procedure TfrmPreferences.LoadTRX(RigNr:integer); +var + nr, + rp :string; +Begin + nr:=IntToStr(RigNr); + rp:= cqrini.ReadString('TRX', 'RigCtldPath', '/usr/bin/rigctld'); + if FileExistsUTF8(rp) then + dmUtils.LoadRigsToComboBox(cqrini.ReadString('TRX'+nr, 'model', ''),rp,cmbModelRig) + else begin + Application.MessageBox('rigctld binary not found, unable to load list of supported rigs!'+LineEnding+LineEnding+ + 'Fix path to rigctld in TRX control tab.', 'Error', mb_OK+ mb_IconError) + end; + edtRDevice.Text := cqrini.ReadString('TRX'+nr, 'device', ''); + edtPoll.Text := cqrini.ReadString('TRX'+nr, 'poll', '500'); + edtRadioName.Text := cqrini.ReadString('TRX'+nr, 'Desc', ''); + chkRSendCWR.Checked := cqrini.ReadBool('TRX'+nr, 'CWR', False); + chkRVfo.Checked:= cqrini.ReadBool('TRX'+nr, 'ChkVfo', True); + edtRRigCtldPort.Text := cqrini.ReadString('TRX'+nr, 'RigCtldPort', '4532'); + edtRRigCtldArgs.Text := cqrini.ReadString('TRX'+nr, 'ExtraRigCtldArgs', ''); + chkRunRigCtld.Checked := cqrini.ReadBool('TRX'+nr, 'RunRigCtld', False); + chkRPwrON.Checked := cqrini.ReadBool('TRX'+nr, 'RigPwrON', True); + chkUTC2R.Checked := cqrini.ReadBool('TRX'+nr, 'UTC2Rig', False); + chkCPollR.Checked:= cqrini.ReadBool('TRX'+nr, 'CPollR', True); + chkVoiceR.Checked:= cqrini.ReadBool('TRX'+nr, 'RigVoice', True); + edtRHost.Text := cqrini.ReadString('TRX'+nr, 'host', 'localhost'); + cmbSpeedR.ItemIndex := cqrini.ReadInteger('TRX'+nr, 'SerialSpeed', 0); + cmbDataBitsR.ItemIndex := cqrini.ReadInteger('TRX'+nr, 'DataBits', 0); + cmbStopBitsR.ItemIndex := cqrini.ReadInteger('TRX'+nr, 'StopBits', 0); + cmbParityR.ItemIndex := cqrini.ReadInteger('TRX'+nr, 'Parity', 0); + cmbHanshakeR.ItemIndex := cqrini.ReadInteger('TRX'+nr, 'HandShake', 0); + cmbDTRR.ItemIndex := cqrini.ReadInteger('TRX'+nr, 'DTR', 0); + cmbRTSR.ItemIndex := cqrini.ReadInteger('TRX'+nr, 'RTS', 0); + edtUsr1RName.Text:=cqrini.ReadString('TRX'+nr, 'usr1name', 'Usr1'); + edtUsr2RName.Text:=cqrini.ReadString('TRX'+nr, 'usr2name', 'Usr2'); + edtUsr3RName.Text:=cqrini.ReadString('TRX'+nr, 'usr3name', 'Usr3'); + edtUsr1R.Text:=cqrini.ReadString('TRX'+nr, 'usr1', ''); + edtUsr2R.Text:=cqrini.ReadString('TRX'+nr, 'usr2', ''); + edtUsr3R.Text:=cqrini.ReadString('TRX'+nr, 'usr3', ''); + RadioNrLoaded:= RigNr; +end; +Procedure TfrmPreferences.SaveTRX(RigNr:integer); +var + nr :string; +Begin + + nr:=IntToStr(RigNr); + if cmbModelRig.Text='' then //empty model will erase whole TRX and corresponding bandwidth section + Begin + cqrini.SectionErase('TRX'+nr); + cqrini.SectionErase('Band'+nr); + cqrini.SectionErase('CW'+nr); + exit; + end; + + cqrini.WriteString('TRX'+nr, 'device', edtRDevice.Text); + cqrini.WriteString('TRX'+nr, 'model', dmUtils.GetRigIdFromComboBoxItem(cmbModelRig.Text)); + cqrini.WriteString('TRX'+nr, 'poll', edtPoll.Text); + cqrini.WriteString('TRX'+nr, 'Desc', edtRadioName.Text); + cqrini.WriteBool('TRX'+nr, 'CWR', chkRSendCWR.Checked); + cqrini.WriteBool('TRX'+nr, 'ChkVfo',chkRVfo.Checked); + cqrini.WriteString('TRX'+nr, 'RigCtldPort', edtRRigCtldPort.Text); + cqrini.WriteString('TRX'+nr, 'ExtraRigCtldArgs', edtRRigCtldArgs.Text); + cqrini.WriteBool('TRX'+nr, 'RunRigCtld', chkRunRigCtld.Checked); + cqrini.WriteBool('TRX'+nr, 'RigPwrON', chkRPwrON.Checked); + cqrini.WriteBool('TRX'+nr, 'UTC2Rig', chkUTC2R.Checked); + cqrini.WriteBool('TRX'+nr, 'CPollR',chkCPollR.Checked); + cqrini.WriteBool('TRX'+nr, 'RigVoice', chkVoiceR.Checked); + cqrini.WriteString('TRX'+nr, 'host', edtRHost.Text); + cqrini.WriteInteger('TRX'+nr, 'SerialSpeed', cmbSpeedR.ItemIndex); + cqrini.WriteInteger('TRX'+nr, 'DataBits', cmbDataBitsR.ItemIndex); + cqrini.WriteInteger('TRX'+nr, 'StopBits', cmbStopBitsR.ItemIndex); + cqrini.WriteInteger('TRX'+nr, 'Parity', cmbParityR.ItemIndex); + cqrini.WriteInteger('TRX'+nr, 'HandShake', cmbHanshakeR.ItemIndex); + cqrini.WriteInteger('TRX'+nr, 'DTR', cmbDTRR.ItemIndex); + cqrini.WriteInteger('TRX'+nr, 'RTS', cmbRTSR.ItemIndex); + cqrini.WriteString('TRX'+nr, 'usr1name', edtUsr1RName.Text); + cqrini.WriteString('TRX'+nr, 'usr2name', edtUsr2RName.Text); + cqrini.WriteString('TRX'+nr, 'usr3name', edtUsr3RName.Text); + cqrini.WriteString('TRX'+nr, 'usr1', edtUsr1R.Text); + cqrini.WriteString('TRX'+nr, 'usr2', edtUsr2R.Text); + cqrini.WriteString('TRX'+nr, 'usr3', edtUsr3R.Text); +end; +procedure TfrmPreferences.LoadBandW(RigNr:integer); +var + nr :string; +Begin + nr:=IntToStr(RigNr); + edtCW.Value := cqrini.ReadInteger('Band'+nr, 'CW', 500); + edtSSB.Value := cqrini.ReadInteger('Band'+nr, 'SSB', 1800); + edtData.Value := cqrini.ReadInteger('Band'+nr, 'RTTY', 500); //note: Data is called rtty for backward compatibility + edtAM.Value := cqrini.ReadInteger('Band'+nr, 'AM', 3000); + edtFM.Value := cqrini.ReadInteger('Band'+nr, 'FM', 2500); + cmbDataMode.ItemIndex := cmbDataMode.Items.IndexOf(cqrini.ReadString('Band'+nr, 'Datamode', 'RTTY')); + edtDataCmd.Text:=cqrini.ReadString('Band'+nr, 'Datacmd', 'RTTY'); + chkModeReverse.Checked :=cqrini.ReadBool('Band'+nr, 'UseReverse', False); + BandWNrLoaded := RigNr; + if (cqrini.ReadString('TRX'+nr, 'model', '')='') then + lblNoRigForMode.Visible:=True + else + lblNoRigForMode.Visible:=False; +end; +procedure TfrmPreferences.SaveBandW(RigNr:integer); +var + nr :string; +Begin + nr:=IntToStr(RigNr); + if (cqrini.ReadString('TRX'+nr, 'model', '')='') then exit; //No rig, no save + cqrini.WriteInteger('Band'+nr, 'CW', edtCW.Value); + cqrini.WriteInteger('Band'+nr, 'SSB', edtSSB.Value); + cqrini.WriteInteger('Band'+nr, 'RTTY', edtData.Value); //note: Data is called rtty for backward compatibility + cqrini.WriteInteger('Band'+nr, 'AM', edtAM.Value); + cqrini.WriteInteger('Band'+nr, 'FM', edtFM.Value); + cqrini.WriteString('Band'+nr, 'Datamode', cmbDataMode.Text); + cqrini.WriteString('Band'+nr, 'Datacmd', edtDatacmd.Text); + cqrini.WriteBool('Band'+nr, 'UseReverse', chkModeReverse.Checked); +end; +procedure TfrmPreferences.LoadCWif(RigNr:integer); +var + nr :string; +Begin + nr:=IntToStr(RigNr); + cmbIfaceType.ItemIndex := cqrini.ReadInteger('CW'+nr, 'Type', 0); + cbNoKeyerReset.Checked := cqrini.ReadBool('CW'+nr, 'NoReset', false); + edtWinPort.Text := cqrini.ReadString('CW'+nr, 'wk_port', ''); + chkPotSpeed.Checked := cqrini.ReadBool('CW'+nr, 'PotSpeed', False); + edtWinSpeed.Value := cqrini.ReadInteger('CW'+nr, 'wk_speed', 30); + edtCWAddress.Text := cqrini.ReadString('CW'+nr, 'cw_address', 'localhost'); + edtCWPort.Text := cqrini.ReadString('CW'+nr, 'cw_port', '6789'); + edtCWSpeed.Value := cqrini.ReadInteger('CW'+nr, 'cw_speed', 30); + edtWinMinSpeed.Value := cqrini.ReadInteger('CW'+nr, 'wk_min', 5); + edtWinMaxSpeed.Value := cqrini.ReadInteger('CW'+nr, 'wk_max', 60); + edtK3NGPort.Text := cqrini.ReadString('CW'+nr,'K3NGPort',''); + edtK3NGSerSpeed.Text := IntToStr(cqrini.ReadInteger('CW'+nr,'K3NGSerSpeed',115200)); + edtK3NGSpeed.Text := IntToStr(cqrini.ReadInteger('CW'+nr,'K3NGSpeed',30)); + edtHamLibSpeed.Text := IntToStr(cqrini.ReadInteger('CW'+nr,'HamLibSpeed',30)); + chkUseHLBuffer.checked := cqrini.ReadBool('CW'+nr, 'UseHamlibBuffer', False); + CWifLoaded := RigNr; + if (cqrini.ReadString('TRX'+nr, 'model', '')='') then + lblNoRigForCW.Visible:=True + else + lblNoRigForCW.Visible:=False; +end; +procedure TfrmPreferences.SaveCWif(RigNr:integer); +var + nr :string; +Begin + nr:=IntToStr(RigNr); + if (cqrini.ReadString('TRX'+nr, 'model', '')='') then exit; //No rig, no save + cqrini.WriteInteger('CW'+nr, 'Type', cmbIfaceType.ItemIndex); + cqrini.WriteBool('CW'+nr, 'NoReset', cbNoKeyerReset.Checked); + cqrini.WriteString('CW'+nr, 'wk_port', edtWinPort.Text); + cqrini.WriteBool('CW'+nr, 'PotSpeed', chkPotSpeed.Checked); + cqrini.WriteInteger('CW'+nr, 'wk_speed', edtWinSpeed.Value); + cqrini.WriteString('CW'+nr, 'cw_address', edtCWAddress.Text); + cqrini.WriteString('CW'+nr, 'cw_port', edtCWPort.Text); + cqrini.WriteInteger('CW'+nr, 'cw_speed', edtCWSpeed.Value); + cqrini.WriteInteger('CW'+nr, 'wk_min', edtWinMinSpeed.Value); + cqrini.WriteInteger('CW'+nr, 'wk_max', edtWinMaxSpeed.Value); + cqrini.WriteString('CW'+nr,'K3NGPort',edtK3NGPort.Text); + cqrini.WriteInteger('CW'+nr,'K3NGSerSpeed',StrToInt(edtK3NGSerSpeed.Text)); + cqrini.WriteInteger('CW'+nr,'K3NGSpeed',StrToInt(edtK3NGSpeed.Text)); + cqrini.WriteInteger('CW'+nr,'HamLibSpeed',StrToInt(edtHamLibSpeed.Text)); + cqrini.WriteBool('CW'+nr, 'UseHamlibBuffer', chkUseHLBuffer.checked); +end; + +procedure TfrmPreferences.InitRigCmb(SetUsedRig:boolean=false); //initialize radio selectors in TRXControl, CW and Modes +var //set itemindexes to used rig + f,i : integer; + s,d : string; +Begin + i:=cmbRadioNr.ItemIndex; + cmbRadioNr.Items.Clear; + cmbRadioNr.Items.Add(''); + cmbRadioModes.Items.Clear; //zero position is empty + cmbRadioModes.Items.Add(''); + cmbCWRadio.Items.Clear; + cmbCWRadio.Items.Add(''); + for f:=1 to edtRigCount.Value do + Begin + s:=IntToStr(f); + if (cqrini.ReadString('TRX'+s, 'model', '')='') then + cmbRadioNr.Items.Add(s+' None') + else + cmbRadioNr.Items.Add(s+' '+cqrini.ReadString('TRX'+s, 'Desc', '')); + end; + for f:=1 to cqrini.ReadInteger('TRX', 'RigCount', 2) do //others just defined rigs + Begin + s:=IntToStr(f); + d:= cqrini.ReadString('TRX'+s, 'Desc', ''); + if (cqrini.ReadString('TRX'+s, 'model', '')='') then + Begin + cmbRadioModes.Items.Add(s+' None'); + cmbCWRadio.Items.Add(s+' None'); + end + else + begin + cmbRadioModes.Items.Add(s+' '+d); + cmbCWRadio.Items.Add(s+' '+d); + end; + end; + + cmbRadioNr.ItemIndex:=i; + + if not (cqrini.ReadInteger('TRX', 'RigInUse', 1) in [ 1..edtRigCount.Value] ) then + begin + cqrini.WriteInteger('TRX', 'RigInUse', 1); //used rig was deleted (rig count changed) + SetUsedRig:=true; + end; + + if SetUsedRig then + begin + cmbRadioNr.ItemIndex:=cqrini.ReadInteger('TRX', 'RigInUse', 1); + cmbRadioModes.ItemIndex:=cmbRadioNr.ItemIndex; + cmbCWRadio.ItemIndex:=cmbRadioNr.ItemIndex; + end; + + LoadBandW(cmbRadioNr.ItemIndex); + LoadCWif(cmbRadioNr.ItemIndex); + +end; +procedure TfrmPreferences.ClearUnUsedRigs; +var + f:integer; +Begin + //remove these just in case (they should not exist) + for f:=-1 to 0 do + begin + cqrini.SectionErase('TRX'+IntToStr(f)); + cqrini.SectionErase('Band'+IntToStr(f)); + cqrini.SectionErase('CW'+IntToStr(f)); + end; + //remove unused rigs and modes from configuration + if edtRigCount.Value< edtRigCount.MaxValue then + begin + f:= edtRigCount.MaxValue; + repeat + Begin + cqrini.SectionErase('TRX'+IntToStr(f)); + cqrini.SectionErase('Band'+IntToStr(f)); + cqrini.SectionErase('CW'+IntToStr(f)); + dec(f); + end; + until (f=edtRigCount.Value); + end; + + if not ( cqrini.ReadInteger('TRX', 'RigInUse', 1) in [ 1..edtRigCount.Value] ) then + cqrini.WriteInteger('TRX', 'RigInUse', 1); //used rig was deleted + + frmTRXControl.cmbRigGetItems(nil); //update TRXControl rig names before returning + + //6 is max rig count set by edtRigCount:Tspinedit + //if you change it you must change also fConfigStorage.pas + //TRX, CW and Band lists + +end; + end. diff --git a/src/fProgress.lfm b/src/fProgress.lfm new file mode 100644 index 0000000..33ace23 --- /dev/null +++ b/src/fProgress.lfm @@ -0,0 +1,39 @@ +object frmProgress: TfrmProgress + Left = 400 + Height = 91 + Top = 400 + Width = 340 + Caption = 'Progress' + ClientHeight = 91 + ClientWidth = 340 + OnCreate = FormCreate + OnShow = FormShow + LCLVersion = '2.0.4.0' + object p: TProgressBar + AnchorSideLeft.Control = Owner + AnchorSideLeft.Side = asrCenter + AnchorSideTop.Control = lblInfo + AnchorSideTop.Side = asrBottom + Left = 70 + Height = 30 + Top = 29 + Width = 200 + BorderSpacing.Top = 6 + Max = 40 + Smooth = True + TabOrder = 0 + end + object lblInfo: TLabel + AnchorSideLeft.Control = Owner + AnchorSideLeft.Side = asrCenter + AnchorSideTop.Control = Owner + Left = 136 + Height = 17 + Top = 6 + Width = 69 + Alignment = taCenter + BorderSpacing.Top = 6 + Caption = 'Working....' + ParentColor = False + end +end diff --git a/src/fProgress.pas b/src/fProgress.pas new file mode 100644 index 0000000..5039286 --- /dev/null +++ b/src/fProgress.pas @@ -0,0 +1,85 @@ +unit fProgress; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, ExtCtrls, + StdCtrls, Types; + +type + + { TfrmProgress } + + TfrmProgress = class(TForm) + lblInfo: TLabel; + p: TProgressBar; + procedure FormCreate(Sender: TObject); + procedure FormShow(Sender: TObject); + + private + + public + procedure DoStep(info:string = ''); + procedure DoInit(max,step:integer); + procedure DoJump(i:integer); + procedure DoPos(i:integer); + procedure DoPros(i:integer); + end; + +var + frmProgress: TfrmProgress; + i:integer; + +implementation +{$R *.lfm} +{ TfrmProgress } + +procedure TfrmProgress.FormShow(Sender: TObject); +begin + frmProgress.ShowOnTop; +end; + +procedure TfrmProgress.FormCreate(Sender: TObject); +begin + frmProgress.Hide; +end; + +procedure TfrmProgress.DoStep(info:string = ''); +begin + lblInfo.Caption:=info; + p.StepIt; + repaint; + Application.ProcessMessages; + //frmProgress.ShowOnTop; +end; +procedure TfrmProgress.DoJump(i:integer); +begin + p.Position:=p.Position + i; + repaint; + Application.ProcessMessages; + //frmProgress.ShowOnTop; +end; +procedure TfrmProgress.DoPos(i:integer); +begin + p.Position:= i; + repaint; + Application.ProcessMessages; + //frmProgress.ShowOnTop; +end; +procedure TfrmProgress.DoPros(i:integer); +begin + p.Position:= (p.max * i) div 100; + repaint; + Application.ProcessMessages; + //frmProgress.ShowOnTop; +end; +procedure TfrmProgress.DoInit(max,step:integer); +begin + p.position:=0; + p.max:=max; + p.step:=step; +end; +end. + diff --git a/src/fPropagation.pas b/src/fPropagation.pas index 623889e..a92a754 100644 --- a/src/fPropagation.pas +++ b/src/fPropagation.pas @@ -150,14 +150,14 @@ begin if cqrini.ReadBool('prop','AsImage',True) then begin - if HTTP.HTTPMethod('GET',cqrini.ReadString('prop','Url','http://www.hamqsl.com/solarbrief.php')) then + if HTTP.HTTPMethod('GET',cqrini.ReadString('prop','Url','https://www.hamqsl.com/solarbrief.php')) then begin HTTP.Document.SaveToFile(dmData.HomeDir + 'propagation.gif'); Synchronize(@frmPropagation.SyncPropImage) end end else begin - if HTTP.HTTPMethod('GET', 'http://www.hamqsl.com/solarxml.php' ) then + if HTTP.HTTPMethod('GET', cqrini.ReadString('prop','UrlTxt','https://www.hamqsl.com/solarxml.php' )) then begin m.LoadFromStream(HTTP.Document); m.SaveToFile(dmData.HomeDir+'solar.xml'); diff --git a/src/fRadioMemories.lfm b/src/fRadioMemories.lfm index 5dfb9bd..d52c5e5 100644 --- a/src/fRadioMemories.lfm +++ b/src/fRadioMemories.lfm @@ -7,15 +7,16 @@ object frmRadioMemories: TfrmRadioMemories ClientHeight = 415 ClientWidth = 578 OnClose = FormClose + OnCreate = FormCreate OnShow = FormShow - LCLVersion = '1.8.4.0' + LCLVersion = '2.2.4.0' object sgrdMem: TStringGrid AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner Left = 0 Height = 415 Top = 0 - Width = 478 + Width = 458 Align = alClient ColCount = 4 Columns = < @@ -38,8 +39,8 @@ object frmRadioMemories: TfrmRadioMemories FixedCols = 0 RowCount = 1 TabOrder = 0 - OnCompareCells = sgrdMemCompareCells OnDblClick = sgrdMemDblClick + OnHeaderClick = sgrdMemHeaderClick OnSelectCell = sgrdMemSelectCell ColWidths = ( 81 @@ -53,109 +54,154 @@ object frmRadioMemories: TfrmRadioMemories AnchorSideTop.Control = Owner AnchorSideTop.Side = asrBottom AnchorSideRight.Control = sgrdMem - Left = 478 + Left = 458 Height = 415 Top = 0 - Width = 100 + Width = 120 Align = alRight Anchors = [akTop, akRight] BevelOuter = bvNone ClientHeight = 415 - ClientWidth = 100 + ClientWidth = 120 TabOrder = 1 object btnCancel: TButton AnchorSideLeft.Control = btnOK AnchorSideTop.Control = btnOK AnchorSideTop.Side = asrBottom - Left = 13 + Left = 23 Height = 25 - Top = 43 + Top = 52 Width = 75 BorderSpacing.Top = 6 Cancel = True Caption = 'Cancel' ModalResult = 2 - TabOrder = 0 + TabOrder = 1 end object btnAdd: TButton AnchorSideLeft.Control = btnOK AnchorSideTop.Control = btnCancel AnchorSideTop.Side = asrBottom - Left = 13 + Left = 23 Height = 25 - Top = 110 + Top = 119 Width = 75 Action = acAdd BorderSpacing.Top = 42 - TabOrder = 1 + TabOrder = 2 end object btnEdit: TButton AnchorSideLeft.Control = btnOK AnchorSideTop.Control = btnAdd AnchorSideTop.Side = asrBottom - Left = 13 + Left = 23 Height = 25 - Top = 141 + Top = 150 Width = 75 Action = acEdit BorderSpacing.Top = 6 - TabOrder = 2 + TabOrder = 3 end object btnDelete: TButton AnchorSideLeft.Control = btnOK AnchorSideTop.Control = btnEdit AnchorSideTop.Side = asrBottom - Left = 13 + Left = 23 Height = 25 - Top = 172 + Top = 181 Width = 75 Action = acDelete BorderSpacing.Top = 6 - TabOrder = 3 + TabOrder = 4 end object btnMore: TButton AnchorSideLeft.Control = btnOK AnchorSideTop.Control = btnDelAll AnchorSideTop.Side = asrBottom - Left = 13 + Left = 23 Height = 25 - Top = 258 + Top = 267 Width = 75 BorderSpacing.Top = 30 Caption = 'More...' OnClick = btnMoreClick - TabOrder = 4 + TabOrder = 6 end object btnOK: TButton AnchorSideLeft.Control = Panel1 AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = Panel1 - Left = 13 + Left = 23 Height = 25 - Top = 12 + Top = 21 Width = 75 - BorderSpacing.Top = 12 + BorderSpacing.Top = 21 Caption = 'OK' ModalResult = 1 - TabOrder = 5 + TabOrder = 0 end object btnDelAll: TButton AnchorSideLeft.Control = btnOK AnchorSideTop.Control = btnDelete AnchorSideTop.Side = asrBottom - Left = 13 + Left = 23 Height = 25 - Top = 203 + Top = 212 Width = 75 BorderSpacing.Top = 6 Caption = 'Delete All' OnClick = btnDelAllClick - TabOrder = 6 + TabOrder = 5 + end + object lblLines: TLabel + AnchorSideLeft.Control = lblSlash + AnchorSideTop.Side = asrBottom + AnchorSideRight.Side = asrCenter + AnchorSideBottom.Control = Panel1 + AnchorSideBottom.Side = asrBottom + Left = 64 + Height = 1 + Top = 396 + Width = 1 + Anchors = [akLeft, akBottom] + BorderSpacing.Left = 6 + BorderSpacing.Bottom = 18 + ParentColor = False + end + object lblSelected: TLabel + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = lblSlash + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = Panel1 + AnchorSideBottom.Side = asrBottom + Left = 55 + Height = 1 + Top = 396 + Width = 1 + Anchors = [akRight, akBottom] + BorderSpacing.Right = 6 + BorderSpacing.Bottom = 18 + ParentColor = False + end + object lblSlash: TLabel + AnchorSideLeft.Control = Panel1 + AnchorSideLeft.Side = asrCenter + AnchorSideTop.Side = asrBottom + AnchorSideBottom.Control = Panel1 + AnchorSideBottom.Side = asrBottom + Left = 58 + Height = 17 + Top = 380 + Width = 4 + Anchors = [akLeft, akBottom] + BorderSpacing.Bottom = 18 + Caption = '/' + ParentColor = False end end object acMem: TActionList - left = 24 - top = 48 + Left = 24 + Top = 48 object acAdd: TAction Caption = 'Add' OnExecute = acAddExecute @@ -184,12 +230,11 @@ object frmRadioMemories: TfrmRadioMemories end object acSortByFreq: TAction Caption = 'Sort by freq' - OnExecute = acSortByFreqExecute end end object popMem: TPopupMenu - left = 96 - top = 48 + Left = 96 + Top = 48 object MenuItem1: TMenuItem Action = acImport end @@ -199,21 +244,18 @@ object frmRadioMemories: TfrmRadioMemories object MenuItem3: TMenuItem Caption = '-' end - object MenuItem4: TMenuItem - Action = acSortByFreq - end end object dlgOpen: TOpenDialog DefaultExt = '.csv' Filter = 'CSV files|*.csv' - left = 176 - top = 48 + Left = 176 + Top = 48 end object dlgSave: TSaveDialog DefaultExt = '.csv' Filter = 'CSV files|*.csv' Options = [ofOverwritePrompt, ofEnableSizing, ofViewDetail] - left = 264 - top = 48 + Left = 264 + Top = 48 end end diff --git a/src/fRadioMemories.pas b/src/fRadioMemories.pas index e15a338..af5b847 100644 --- a/src/fRadioMemories.pas +++ b/src/fRadioMemories.pas @@ -29,10 +29,12 @@ type btnMore: TButton; btnOK: TButton; btnDelAll: TButton; + lblLines: TLabel; + lblSelected: TLabel; + lblSlash: TLabel; MenuItem1: TMenuItem; MenuItem2: TMenuItem; MenuItem3: TMenuItem; - MenuItem4: TMenuItem; dlgOpen: TOpenDialog; Panel1: TPanel; popMem: TPopupMenu; @@ -43,18 +45,19 @@ type procedure acEditExecute(Sender: TObject); procedure acExportExecute(Sender: TObject); procedure acImportExecute(Sender: TObject); - procedure acSortByFreqExecute(Sender: TObject); procedure btnDelAllClick(Sender: TObject); procedure btnMoreClick(Sender: TObject); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); + procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); - procedure sgrdMemCompareCells(Sender: TObject; ACol, ARow, BCol, - BRow: Integer; var Result: integer); procedure sgrdMemDblClick(Sender: TObject); + procedure sgrdMemHeaderClick(Sender: TObject; IsColumn: Boolean; + Index: Integer); procedure sgrdMemSelectCell(Sender: TObject; aCol, aRow: Integer; var CanSelect: Boolean); private - + LastSearchLine : integer; + LastSearchString : String; procedure AddToGrid(freq,mode,bandwidth,info : String); public @@ -80,6 +83,7 @@ begin sgrdMem.Cells[1,sgrdMem.RowCount-1] := mode; sgrdMem.Cells[2,sgrdMem.RowCount-1] := bandwidth; sgrdMem.Cells[3,sgrdMem.RowCount-1] := info; + lblLines.Caption:=IntToStr(sgrdMem.RowCount-1) end; procedure TfrmRadioMemories.acAddExecute(Sender: TObject); @@ -100,7 +104,8 @@ begin if (sgrdMem.RowCount < 2) then Application.MessageBox('There is nothing to delete','Info...',mb_ok+mb_IconInformation) else - sgrdMem.DeleteRow(sgrdMem.Row) + sgrdMem.DeleteRow(sgrdMem.Row); + lblLines.Caption:=IntToStr(sgrdMem.RowCount-1) end; procedure TfrmRadioMemories.btnDelAllClick(Sender: TObject); @@ -113,6 +118,7 @@ begin sgrdMem.DeleteRow(sgrdMem.Row) until (sgrdMem.RowCount < 2) ; end; + lblLines.Caption:=IntToStr(sgrdMem.RowCount-1) end; procedure TfrmRadioMemories.acEditExecute(Sender: TObject); @@ -123,6 +129,7 @@ begin frmAddRadioMemory.cmbMode.Text := sgrdMem.Cells[1,sgrdMem.Row]; frmAddRadioMemory.edtWidth.Text := sgrdMem.Cells[2,sgrdMem.Row]; frmAddRadioMemory.edtInfo.Text := sgrdMem.Cells[3,sgrdMem.Row]; + frmAddRadioMemory.edtFreq.Text := sgrdMem.Cells[0,sgrdMem.Row]; if frmAddRadioMemory.ShowModal = mrOK then begin sgrdMem.Cells[0,sgrdMem.Row] := FloatToStrF(StrToFloat(frmAddRadioMemory.edtFreq.Text),ffFixed,15,6); @@ -178,63 +185,63 @@ var b : Integer; begin if dlgOpen.Execute then - begin - try - SetLength(d,0); - AssignFile(f,dlgOpen.FileName); - Reset(f); - while not Eof(f) do - begin - ReadLn(f,l); - inc(i); - a := dmUtils.Explode(';',l); - - if (Length(a)<>4) then + begin + if FileExists(dlgOpen.FileName) then //with QT5 opendialog user can enter filename that may not exist begin - Application.MessageBox(PChar(Format(C_ERR,[i])),'Error...',mb_OK+mb_IconError); - exit - end; + try + SetLength(d,0); + AssignFile(f,dlgOpen.FileName); + Reset(f); + while not Eof(f) do + begin + ReadLn(f,l); + inc(i); + a := dmUtils.Explode(';',l); - if not TryStrToFloat(a[0],n) then - begin - Application.MessageBox(PChar(Format(C_ERR,[i])),'Error...',mb_OK+mb_IconError); - exit - end; + if (Length(a)<>4) then + begin + Application.MessageBox(PChar(Format(C_ERR,[i])),'Error...',mb_OK+mb_IconError); + exit + end; - if a[1]='' then - begin - Application.MessageBox(PChar(Format(C_ERR,[i])),'Error...',mb_OK+mb_IconError); - exit - end; + if not TryStrToFloat(a[0],n) then + begin + Application.MessageBox(PChar(Format(C_ERR,[i])),'Error...',mb_OK+mb_IconError); + exit + end; - if not TryStrToInt(a[2],b) then - begin - Application.MessageBox(PChar(Format(C_ERR,[i])),'Error...',mb_OK+mb_IconError); - exit - end; + if a[1]='' then + begin + Application.MessageBox(PChar(Format(C_ERR,[i])),'Error...',mb_OK+mb_IconError); + exit + end; - SetLength(d,i); - d[i-1].freq := a[0]; - d[i-1].mode := a[1]; - d[i-1].width := a[2]; - d[i-1].info := a[3]; - end; + if not TryStrToInt(a[2],b) then + begin + Application.MessageBox(PChar(Format(C_ERR,[i])),'Error...',mb_OK+mb_IconError); + exit + end; - for i:= 0 to Length(d)-1 do - begin - AddToGrid(d[i].freq, d[i].mode, d[i].width,d[i].info) - end; + SetLength(d,i); + d[i-1].freq := a[0]; + d[i-1].mode := a[1]; + d[i-1].width := a[2]; + d[i-1].info := a[3]; + end; - ShowMessage('File has been imported') - finally - CloseFile(f) - end - end -end; + for i:= 0 to Length(d)-1 do + begin + AddToGrid(d[i].freq, d[i].mode, d[i].width,d[i].info) + end; -procedure TfrmRadioMemories.acSortByFreqExecute(Sender: TObject); -begin - sgrdMem.SortColRow(true, 0, sgrdMem.FixedRows, sgrdMem.RowCount-1) + ShowMessage('File has been imported') + finally + CloseFile(f) + end + end + else + ShowMessage('File not found!'); + end; end; procedure TfrmRadioMemories.btnMoreClick(Sender: TObject); @@ -253,18 +260,18 @@ begin dmUtils.SaveWindowPos(frmRadioMemories); end; +procedure TfrmRadioMemories.FormCreate(Sender: TObject); +begin + sgrdMem.Clear; +end; + procedure TfrmRadioMemories.FormShow(Sender: TObject); begin dmUtils.LoadWindowPos(frmRadioMemories); ShowMode := False; -end; - -procedure TfrmRadioMemories.sgrdMemCompareCells(Sender: TObject; ACol, ARow, - BCol, BRow: Integer; var Result: integer); -begin - result := round(StrToFloat(sgrdMem.Cells[ACol,ARow])*1000-StrToFloat(sgrdMem.Cells[BCol,BRow])*1000); - if sgrdMem.SortOrder = soDescending then - result := -result + lblLines.Caption:=IntToStr(sgrdMem.RowCount-1); + LastSearchLine := 1; + LastSearchString :=''; end; procedure TfrmRadioMemories.sgrdMemDblClick(Sender: TObject); @@ -295,11 +302,53 @@ begin end; end; +procedure TfrmRadioMemories.sgrdMemHeaderClick(Sender: TObject; + IsColumn: Boolean; Index: Integer); +var + Shead : string; + s : integer; + found : boolean; +begin + Shead:='Search from '; + case index of + 0: Shead:=Shead+'frequency'; + 1: Shead:=Shead+'mode'; + 2: Shead:=Shead+'bandwidth'; + 3: Shead:=Shead+'info'; + end; + If InputQuery(Shead,'Enter search string.'+LineEnding+ + 'Start with + to start from row 1,'+LineEnding+ + 'otherwise continue from row '+IntToStr(LastSearchLine), LastSearchString) then + begin + found:=false; + if LastSearchString[1]='+' then + begin + LastSearchString:= copy (LastSearchString,2,length( LastSearchString)-1); + LastSearchLine:=1; + end; + + for s:=LastSearchLine to sgrdMem.RowCount-1 do + begin + if (pos(LastSearchString, sgrdMem.Cells[index,s] )> 0) then + Begin + sgrdMem.TopRow:= s; + sgrdMem.Row:= s; + sgrdMem.Col:=index; + if sgrdMem.Row < sgrdMem.RowCount-2 then LastSearchLine :=sgrdMem.Row+1; + found:=true; + Break; + end; + end; + if not found then ShowMessage('None found!'); + end; +end; + procedure TfrmRadioMemories.sgrdMemSelectCell(Sender: TObject; aCol, aRow: Integer; var CanSelect: Boolean); begin dcRow:=aRow; //remember clicked row and handle it with ondblclick dcRowOk :=true; + lblSelected.Caption:=IntToStr(aRow); end; end. diff --git a/src/fRbnFilter.lfm b/src/fRbnFilter.lfm index 0d0ca15..f0ccdac 100644 --- a/src/fRbnFilter.lfm +++ b/src/fRbnFilter.lfm @@ -1,32 +1,50 @@ object frmRbnFilter: TfrmRbnFilter - Left = 364 - Height = 608 - Top = 74 + Left = 433 + Height = 641 + Top = 48 Width = 684 BorderStyle = bsDialog Caption = 'RBN filter criteria' - ClientHeight = 608 + ClientHeight = 641 ClientWidth = 684 OnShow = FormShow Position = poOwnerFormCenter - LCLVersion = '2.0.4.0' - object GroupBox3: TGroupBox - Left = 8 - Height = 520 - Top = 80 - Width = 664 + LCLVersion = '2.2.4.0' + object grpDXStation: TGroupBox + AnchorSideLeft.Control = Owner + AnchorSideTop.Control = Owner + AnchorSideRight.Control = Owner + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = Owner + AnchorSideBottom.Side = asrBottom + Left = 3 + Height = 635 + Top = 3 + Width = 678 + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Left = 3 + BorderSpacing.Top = 3 + BorderSpacing.Right = 3 + BorderSpacing.Bottom = 3 Caption = 'DX station ' - ClientHeight = 502 - ClientWidth = 662 - TabOrder = 1 - object GroupBox5: TGroupBox - Left = 8 + ClientHeight = 617 + ClientWidth = 676 + TabOrder = 0 + object grpCallisgn: TGroupBox + AnchorSideLeft.Control = grpSource + AnchorSideTop.Control = edtDate + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = grpCallsignFrom + AnchorSideRight.Side = asrBottom + Left = 6 Height = 137 - Top = 96 - Width = 638 + Top = 191 + Width = 667 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 6 Caption = ' Callsign ' ClientHeight = 119 - ClientWidth = 636 + ClientWidth = 665 TabOrder = 5 object rbAllDx: TRadioButton Left = 16 @@ -89,316 +107,536 @@ object frmRbnFilter: TfrmRbnFilter ParentColor = False end end - object Label4: TLabel - Left = 8 - Height = 17 - Top = 252 - Width = 67 - Caption = 'Continent:' - ParentColor = False - end - object edtDXCont: TEdit - Left = 96 - Height = 34 - Top = 248 - Width = 280 - CharCase = ecUppercase - TabOrder = 6 - Text = 'EDTDXCONT' - end - object edtDXBand: TEdit - Left = 96 - Height = 34 - Top = 280 - Width = 368 - CharCase = ecUppercase - TabOrder = 7 - Text = 'EDTDXBAND' - end - object Label5: TLabel - Left = 8 - Height = 17 - Top = 285 - Width = 44 - Caption = 'Bands:' - ParentColor = False - end - object Label6: TLabel - Left = 520 - Height = 17 - Top = 285 - Width = 100 - Caption = '160M, 80M etc.' - ParentColor = False - end - object Label7: TLabel - Left = 8 - Height = 17 - Top = 317 - Width = 47 - Caption = 'Modes:' - ParentColor = False - end - object edtDXMode: TEdit - Left = 96 - Height = 34 - Top = 312 - Width = 344 - CharCase = ecUppercase - TabOrder = 8 - Text = 'EDTDXMODE' - end - object Label8: TLabel - Left = 496 - Height = 17 - Top = 317 - Width = 94 - Caption = 'CW, RTTY etc.' - ParentColor = False - end object rbIgnWkdHour: TRadioButton - Left = 8 + AnchorSideLeft.Control = grpSource + AnchorSideTop.Control = edtLastHours + AnchorSideTop.Side = asrCenter + Left = 6 Height = 23 - Top = 17 - Width = 167 + Top = 117 + Width = 166 + BorderSpacing.Top = 3 Caption = 'Ignore worked in last ' Checked = True TabOrder = 0 TabStop = True end - object Bevel1: TBevel - Left = 8 - Height = 2 - Top = 456 - Width = 638 - end object edtLastHours: TEdit - Left = 192 + AnchorSideLeft.Control = edtDate + AnchorSideTop.Control = grpSource + AnchorSideTop.Side = asrBottom + Left = 169 Height = 34 - Top = 16 + Top = 111 Width = 41 + BorderSpacing.Top = 3 TabOrder = 1 Text = '48' end - object Label1: TLabel - Left = 244 + object lblIgnoreHours: TLabel + AnchorSideLeft.Control = edtLastHours + AnchorSideTop.Control = edtLastHours + AnchorSideTop.Side = asrCenter + Left = 175 Height = 17 - Top = 21 + Top = 120 Width = 226 + BorderSpacing.Left = 6 Caption = 'hours on the same band and mode' ParentColor = False end object rbIgnWkdDate: TRadioButton - Left = 8 + AnchorSideLeft.Control = grpSource + AnchorSideTop.Control = edtDate + AnchorSideTop.Side = asrCenter + Left = 6 Height = 23 - Top = 52 - Width = 158 + Top = 157 + Width = 157 + BorderSpacing.Top = 3 Caption = 'Ignore worked after ' TabOrder = 2 end object edtDate: TEdit - Left = 192 + AnchorSideLeft.Control = rbIgnWkdDate + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtLastHours + AnchorSideTop.Side = asrBottom + Left = 169 Height = 34 - Top = 51 - Width = 96 + Top = 151 + Width = 119 + BorderSpacing.Left = 6 + BorderSpacing.Top = 6 TabOrder = 3 Text = '2000-10-10' end object edtTime: TEdit - Left = 300 + AnchorSideLeft.Control = edtDate + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtDate + Left = 294 Height = 34 - Top = 51 - Width = 48 + Top = 151 + Width = 66 + BorderSpacing.Left = 6 TabOrder = 4 Text = '12:12' end - object Label2: TLabel - Left = 384 + object lblDateTimeFormat: TLabel + AnchorSideLeft.Control = edtTime + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtTime + AnchorSideTop.Side = asrCenter + Left = 369 Height = 17 - Top = 56 + Top = 160 Width = 150 + BorderSpacing.Left = 9 Caption = '(YYYY-MM-DD, HH:MM)' ParentColor = False end - object Bevel2: TBevel - Left = 8 - Height = 2 - Top = 380 - Width = 638 - end object chkOnlyeQSL: TCheckBox - Left = 8 + AnchorSideLeft.Control = grpCallsignFrom + AnchorSideTop.Control = chkOnlyLoTW + AnchorSideTop.Side = asrBottom + Left = 6 Height = 23 - Top = 424 + Top = 545 Width = 169 Caption = 'Show only eQSL users' - TabOrder = 14 + TabOrder = 7 end object chkOnlyLoTW: TCheckBox - Left = 8 + AnchorSideLeft.Control = grpCallsignFrom + AnchorSideTop.Control = grpCallsignFrom + AnchorSideTop.Side = asrBottom + Left = 6 Height = 23 - Top = 392 + Top = 522 Width = 172 + BorderSpacing.Top = 6 Caption = 'Show only LoTW users' - TabOrder = 13 + TabOrder = 6 end object chkNewDXConly: TCheckBox - Left = 8 + AnchorSideLeft.Control = grpCallsignFrom + AnchorSideTop.Control = Bevel1 + AnchorSideTop.Side = asrBottom + Left = 6 Height = 23 - Top = 465 + Top = 585 Width = 431 + BorderSpacing.Top = 6 Caption = 'Show only spots that are "New one"/"New band"/"New mode" ' - TabOrder = 15 + TabOrder = 8 end - object edtDXCnty: TEdit - Left = 96 - Height = 34 - Top = 344 - Width = 184 - CharCase = ecUppercase + object grpSource: TGroupBox + AnchorSideLeft.Control = grpDXStation + AnchorSideTop.Control = grpDXStation + Left = 6 + Height = 105 + Top = 3 + Width = 576 + BorderSpacing.Left = 6 + BorderSpacing.Top = 3 + Caption = ' Source data from ' + ClientHeight = 87 + ClientWidth = 574 TabOrder = 9 - Text = 'EDTDXCNTY' + object lblContent: TLabel + AnchorSideLeft.Control = grpSource + AnchorSideTop.Control = edtSrcCont + AnchorSideTop.Side = asrCenter + Left = 6 + Height = 17 + Top = 12 + Width = 67 + BorderSpacing.Left = 6 + Caption = 'Continent:' + ParentColor = False + end + object edtSrcCont: TEdit + AnchorSideLeft.Control = lblContent + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = grpSource + Left = 79 + Height = 34 + Top = 3 + Width = 280 + BorderSpacing.Left = 6 + BorderSpacing.Top = 3 + CharCase = ecUppercase + TabOrder = 0 + Text = 'EDTSRCCONT' + end + object lblContExample: TLabel + AnchorSideLeft.Control = btnSrcContAll + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = lblContent + AnchorSideTop.Side = asrCenter + Left = 415 + Height = 17 + Top = 12 + Width = 93 + BorderSpacing.Left = 6 + Caption = 'AF, AN, AS etc' + ParentColor = False + end + object btnSrcContAll: TButton + AnchorSideLeft.Control = edtSrcCont + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtSrcCont + AnchorSideTop.Side = asrCenter + Left = 365 + Height = 27 + Top = 7 + Width = 44 + BorderSpacing.Left = 6 + Caption = 'All' + OnClick = btnSrcContAllClick + TabOrder = 1 + end + object lblSrcCall: TLabel + AnchorSideLeft.Control = lblContent + AnchorSideTop.Control = edtSrcCall + AnchorSideTop.Side = asrCenter + Left = 6 + Height = 17 + Top = 46 + Width = 56 + Caption = 'Callsign:' + ParentColor = False + end + object edtSrcCall: TEdit + AnchorSideLeft.Control = edtSrcCont + AnchorSideTop.Control = edtSrcCont + AnchorSideTop.Side = asrBottom + Left = 79 + Height = 34 + Hint = 'Start of callsign(s), or full callsign(s),c omma separated' + Top = 37 + Width = 280 + CharCase = ecUppercase + ParentShowHint = False + ShowHint = True + TabOrder = 2 + Text = 'EDTSRCCALL' + end + object btnSrcCallAll: TButton + AnchorSideLeft.Control = edtSrcCont + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtSrcCall + AnchorSideTop.Side = asrCenter + Left = 365 + Height = 27 + Top = 41 + Width = 44 + BorderSpacing.Left = 6 + Caption = 'All' + OnClick = btnSrcCallAllClick + TabOrder = 3 + end + object lblCallExample: TLabel + AnchorSideLeft.Control = btnSrcContAll + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtSrcCall + AnchorSideTop.Side = asrCenter + Left = 415 + Height = 17 + Top = 46 + Width = 136 + BorderSpacing.Left = 6 + Caption = 'OK, OH1, AB1CD, etc' + ParentColor = False + end end - object Label11: TLabel - Left = 8 - Height = 17 - Top = 349 - Width = 66 - Caption = 'Countries:' - ParentColor = False - end - object Label12: TLabel - Left = 320 - Height = 17 - Top = 349 - Width = 49 - Caption = 'or NOT ' - ParentColor = False - end - object edtDXCNotCnty: TEdit - Left = 392 - Height = 34 - Top = 344 - Width = 175 - CharCase = ecUppercase - TabOrder = 11 - Text = 'EDTDXCNOTCNTY' - end - object btnDXCCnty: TButton - Left = 280 - Height = 25 - Top = 345 - Width = 30 - Caption = '...' - OnClick = btnDXCCntyClick + object grpCallsignFrom: TGroupBox + AnchorSideLeft.Control = grpCallisgn + AnchorSideTop.Control = grpCallisgn + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = grpDXStation + AnchorSideRight.Side = asrBottom + Left = 6 + Height = 185 + Top = 331 + Width = 667 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 3 + BorderSpacing.Right = 3 + Caption = 'Callsign From' + ClientHeight = 167 + ClientWidth = 665 TabOrder = 10 + object lblContinentFrom: TLabel + AnchorSideLeft.Control = grpCallsignFrom + AnchorSideTop.Control = edtDXCont + AnchorSideTop.Side = asrCenter + Left = 3 + Height = 17 + Top = 12 + Width = 67 + BorderSpacing.Left = 3 + BorderSpacing.Top = 3 + Caption = 'Continent:' + ParentColor = False + end + object edtDXCont: TEdit + AnchorSideLeft.Control = lblContinentFrom + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = grpCallsignFrom + Left = 94 + Height = 34 + Top = 3 + Width = 280 + BorderSpacing.Left = 24 + BorderSpacing.Top = 3 + CharCase = ecUppercase + TabOrder = 0 + Text = 'EDTDXCONT' + end + object lblContExFrom: TLabel + AnchorSideLeft.Control = lblBandExFrom + AnchorSideTop.Control = edtDXCont + AnchorSideTop.Side = asrCenter + Left = 518 + Height = 17 + Top = 12 + Width = 93 + Caption = 'AF, AN, AS etc' + ParentColor = False + end + object lblBandFrom: TLabel + AnchorSideLeft.Control = lblContinentFrom + AnchorSideTop.Control = edtDXBand + AnchorSideTop.Side = asrCenter + Left = 3 + Height = 17 + Top = 46 + Width = 44 + Caption = 'Bands:' + ParentColor = False + end + object edtDXBand: TEdit + AnchorSideLeft.Control = edtDXCont + AnchorSideTop.Control = edtDXCont + AnchorSideTop.Side = asrBottom + Left = 94 + Height = 34 + Top = 37 + Width = 368 + CharCase = ecUppercase + TabOrder = 1 + Text = 'EDTDXBAND' + end + object lblBandExFrom: TLabel + AnchorSideLeft.Control = btnDxBandsAll + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtDXBand + AnchorSideTop.Side = asrCenter + Left = 518 + Height = 17 + Top = 46 + Width = 100 + BorderSpacing.Left = 12 + Caption = '160M, 80M etc.' + ParentColor = False + end + object edtDXMode: TEdit + AnchorSideLeft.Control = edtDXBand + AnchorSideTop.Control = edtDXBand + AnchorSideTop.Side = asrBottom + Left = 94 + Height = 34 + Top = 71 + Width = 344 + CharCase = ecUppercase + TabOrder = 2 + Text = 'EDTDXMODE' + end + object lblModeFrom: TLabel + AnchorSideLeft.Control = lblContinentFrom + AnchorSideTop.Control = edtDXMode + AnchorSideTop.Side = asrCenter + Left = 3 + Height = 17 + Top = 80 + Width = 47 + Caption = 'Modes:' + ParentColor = False + end + object Label8: TLabel + AnchorSideLeft.Control = lblBandExFrom + AnchorSideTop.Control = edtDXMode + AnchorSideTop.Side = asrCenter + Left = 518 + Height = 17 + Top = 80 + Width = 95 + Caption = 'CW, RTTY etc.' + ParentColor = False + end + object edtDXCnty: TEdit + AnchorSideLeft.Control = edtDXMode + AnchorSideTop.Control = edtDXMode + AnchorSideTop.Side = asrBottom + Left = 94 + Height = 34 + Top = 105 + Width = 184 + CharCase = ecUppercase + TabOrder = 3 + Text = 'EDTDXCNTY' + end + object lblCountryFrom: TLabel + AnchorSideLeft.Control = lblContinentFrom + AnchorSideTop.Control = edtDXCnty + AnchorSideTop.Side = asrCenter + Left = 3 + Height = 17 + Top = 114 + Width = 66 + Caption = 'Countries:' + ParentColor = False + end + object btnDxContAll: TButton + AnchorSideLeft.Control = edtDXCont + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtDXCont + AnchorSideTop.Side = asrCenter + Left = 374 + Height = 27 + Top = 7 + Width = 44 + Caption = 'All' + OnClick = btnDxContAllClick + TabOrder = 4 + end + object btnDxBandsAll: TButton + AnchorSideLeft.Control = edtDXBand + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtDXBand + AnchorSideTop.Side = asrCenter + Left = 462 + Height = 28 + Top = 40 + Width = 44 + Caption = 'All' + OnClick = btnDxBandsAllClick + TabOrder = 5 + end + object btnDxModeAll: TButton + AnchorSideLeft.Control = edtDXMode + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtDXMode + AnchorSideTop.Side = asrCenter + Left = 438 + Height = 27 + Top = 75 + Width = 44 + Caption = 'All' + OnClick = btnDxModeAllClick + TabOrder = 6 + end + object btnDXCCnty: TButton + AnchorSideLeft.Control = edtDXCnty + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtDXCnty + AnchorSideTop.Side = asrCenter + Left = 278 + Height = 25 + Top = 110 + Width = 30 + Caption = '...' + OnClick = btnDXCCntyClick + TabOrder = 7 + end + object lblNotCountry: TLabel + AnchorSideLeft.Control = btnDXCCnty + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = btnDXCCnty + AnchorSideTop.Side = asrCenter + Left = 311 + Height = 17 + Top = 114 + Width = 49 + BorderSpacing.Left = 3 + Caption = 'or NOT ' + ParentColor = False + end + object edtDXCNotCnty: TEdit + AnchorSideLeft.Control = lblNotCountry + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = lblNotCountry + AnchorSideTop.Side = asrCenter + Left = 363 + Height = 34 + Top = 105 + Width = 175 + BorderSpacing.Left = 3 + CharCase = ecUppercase + TabOrder = 8 + Text = 'EDTDXCNOTCNTY' + end + object btnDXCNotCnty: TButton + AnchorSideLeft.Control = edtDXCNotCnty + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtDXCNotCnty + AnchorSideTop.Side = asrCenter + Left = 541 + Height = 25 + Top = 110 + Width = 30 + BorderSpacing.Left = 3 + Caption = '...' + OnClick = btnDXCNotCntyClick + TabOrder = 9 + end end - object btnDXCNotCnty: TButton - Left = 567 + object Bevel1: TBevel + AnchorSideLeft.Control = grpCallsignFrom + AnchorSideTop.Control = chkOnlyeQSL + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = grpCallsignFrom + AnchorSideRight.Side = asrBottom + Left = 12 + Height = 5 + Top = 574 + Width = 655 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Left = 6 + BorderSpacing.Top = 6 + BorderSpacing.Right = 6 + end + object btnOK: TButton + AnchorSideTop.Control = grpSource + AnchorSideRight.Control = grpDXStation + AnchorSideRight.Side = asrBottom + Left = 592 Height = 25 - Top = 345 - Width = 30 - Caption = '...' - OnClick = btnDXCNotCntyClick + Top = 15 + Width = 75 + Anchors = [akTop, akRight] + BorderSpacing.Top = 12 + BorderSpacing.Right = 9 + Caption = 'OK' + OnClick = btnOKClick + TabOrder = 11 + end + object btnCancel: TButton + AnchorSideLeft.Control = btnOK + AnchorSideTop.Control = btnOK + AnchorSideTop.Side = asrBottom + Left = 592 + Height = 25 + Top = 46 + Width = 75 + BorderSpacing.Top = 6 + BorderSpacing.Right = 9 + Cancel = True + Caption = 'Cancel' + ModalResult = 2 TabOrder = 12 end - object Label14: TLabel - Left = 432 - Height = 17 - Top = 252 - Width = 93 - Caption = 'AF, AN, AS etc' - ParentColor = False - end - object btnDxModeAll: TButton - Left = 438 - Height = 27 - Top = 312 - Width = 44 - Caption = 'All' - OnClick = btnDxModeAllClick - TabOrder = 16 - end - end - object GroupBox4: TGroupBox - Left = 8 - Height = 65 - Top = 8 - Width = 576 - Caption = ' Source data from ' - ClientHeight = 47 - ClientWidth = 574 - TabOrder = 0 - object Label3: TLabel - Left = 8 - Height = 17 - Top = 12 - Width = 67 - Caption = 'Continent:' - ParentColor = False - end - object edtSrcCont: TEdit - Left = 96 - Height = 34 - Top = 8 - Width = 280 - CharCase = ecUppercase - TabOrder = 0 - Text = 'EDTSRCCONT' - end - object Label13: TLabel - Left = 432 - Height = 17 - Top = 12 - Width = 93 - Caption = 'AF, AN, AS etc' - ParentColor = False - end - object btnSrcContAll: TButton - Left = 374 - Height = 27 - Top = 8 - Width = 44 - Caption = 'All' - OnClick = btnSrcContAllClick - TabOrder = 1 - end - end - object btnOK: TButton - Left = 597 - Height = 25 - Top = 8 - Width = 75 - Caption = 'OK' - OnClick = btnOKClick - TabOrder = 2 - end - object btnCancel: TButton - Left = 597 - Height = 25 - Top = 40 - Width = 75 - Cancel = True - Caption = 'Cancel' - ModalResult = 2 - TabOrder = 3 - end - object btnDxContAll: TButton - Left = 384 - Height = 27 - Top = 345 - Width = 44 - Caption = 'All' - OnClick = btnDxContAllClick - TabOrder = 4 - end - object btnDxBandsAll: TButton - Left = 472 - Height = 28 - Top = 376 - Width = 44 - Caption = 'All' - OnClick = btnDxBandsAllClick - TabOrder = 5 end end diff --git a/src/fRbnFilter.pas b/src/fRbnFilter.pas index a31af89..ff7b5a8 100644 --- a/src/fRbnFilter.pas +++ b/src/fRbnFilter.pas @@ -14,46 +14,50 @@ type TfrmRbnFilter = class(TForm) Bevel1: TBevel; - Bevel2: TBevel; - btnOK: TButton; btnCancel: TButton; + btnDxBandsAll: TButton; btnDXCCnty: TButton; btnDXCNotCnty: TButton; btnDxContAll: TButton; - btnSrcContAll: TButton; - btnDxBandsAll: TButton; btnDxModeAll: TButton; + btnOK: TButton; + btnSrcContAll: TButton; + btnSrcCallAll: TButton; chkNewDXConly: TCheckBox; chkOnlyeQSL: TCheckBox; chkOnlyLoTW: TCheckBox; - edtDXCnty: TEdit; - edtDXCNotCnty: TEdit; + edtSrcCall: TEdit; edtDate: TEdit; + edtDXBand: TEdit; + edtDXCNotCnty: TEdit; + edtDXCnty: TEdit; + edtDXCont: TEdit; + edtDXMode: TEdit; edtDXOnlyCall: TEdit; edtDXOnlyExpres: TEdit; - edtDXBand: TEdit; - edtDXMode: TEdit; - edtDXCont: TEdit; edtLastHours: TEdit; edtSrcCont: TEdit; edtTime: TEdit; - GroupBox3: TGroupBox; - GroupBox4: TGroupBox; - GroupBox5: TGroupBox; - Label1: TLabel; + grpCallsignFrom: TGroupBox; + grpDXStation: TGroupBox; + grpCallisgn: TGroupBox; + grpSource: TGroupBox; + lblIgnoreHours: TLabel; Label10: TLabel; - Label11: TLabel; - Label12: TLabel; - Label13: TLabel; - Label14: TLabel; - Label2: TLabel; - Label3: TLabel; - Label4: TLabel; - Label5: TLabel; - Label6: TLabel; - Label7: TLabel; + lblCallExample: TLabel; + lblSrcCall: TLabel; Label8: TLabel; + lblBandExFrom: TLabel; + lblBandFrom: TLabel; + lblContExample: TLabel; + lblContExFrom: TLabel; + lblContinentFrom: TLabel; + lblCountryFrom: TLabel; + lblDateTimeFormat: TLabel; + lblContent: TLabel; Label9: TLabel; + lblModeFrom: TLabel; + lblNotCountry: TLabel; rbAllDx: TRadioButton; rbOnlyCall: TRadioButton; rbOnlyCallReg: TRadioButton; @@ -65,6 +69,7 @@ type procedure btnDxContAllClick(Sender: TObject); procedure btnDxModeAllClick(Sender: TObject); procedure btnOKClick(Sender: TObject); + procedure btnSrcCallAllClick(Sender: TObject); procedure btnSrcContAllClick(Sender: TObject); procedure FormShow(Sender: TObject); private @@ -89,7 +94,7 @@ begin dmUtils.LoadFontSettings(self); edtSrcCont.Text := cqrini.ReadString('RBNFilter','SrcCont',C_RBN_CONT); - + edtSrcCall.Text := cqrini.ReadString('RBNFilter','SrcCall',''); rbIgnWkdHour.Checked := cqrini.ReadBool('RBNFilter','IgnHour',True); edtLastHours.Text := IntToStr(cqrini.ReadInteger('RBNFilter','IgnHourValue',48)); rbIgnWkdDate.Checked := cqrini.ReadBool('RBNFilter','IgnDate',False); @@ -169,6 +174,7 @@ begin edtDXMode.Text := C_RBN_MODES; cqrini.WriteString('RBNFilter','SrcCont',RmSp(edtSrcCont.Text)); + cqrini.WriteString('RBNFilter','SrcCall',RmSp(edtSrcCall.Text)); cqrini.WriteBool('RBNFilter','IgnHour',rbIgnWkdHour.Checked); cqrini.WriteInteger('RBNFilter','IgnHourValue',StrToint(edtLastHours.Text)); @@ -196,6 +202,11 @@ begin ModalResult := mrOK end; +procedure TfrmRbnFilter.btnSrcCallAllClick(Sender: TObject); +begin + edtSrcCall.Text:=''; +end; + procedure TfrmRbnFilter.btnSrcContAllClick(Sender: TObject); begin edtSrcCont.Text := C_RBN_CONT diff --git a/src/fRbnMonitor.pas b/src/fRbnMonitor.pas index 1cbd6fb..35ab4c2 100644 --- a/src/fRbnMonitor.pas +++ b/src/fRbnMonitor.pas @@ -42,6 +42,7 @@ type public DxccWithLoTW : Boolean; fil_SrcCont : String; + fil_SrcCalls : TStringList; fil_IgnWkdHour : Boolean; fil_IgnHourValue : Integer; fil_IgnDate : Boolean; @@ -125,6 +126,8 @@ type RbnMonThread : TRbnThread; lTelnet : TLTelnetClientComponent; aRbnArchive : Array of TRbnSpot; + SrcCalls : TStringlist; + function GetModeFromFreq(freq: string): string; @@ -172,11 +175,31 @@ var adif : Word; index : Integer; f : Double; + i : integer; + SpotterOk: Boolean; begin Result := False; - dmDXCluster.id_country(spotter,now,pfx,Country,waz,itu,SrcCont); + if (fil_SrcCalls.Count>0) then + Begin + SpotterOK:=false; + for i:=0 to fil_SrcCalls.Count-1 do + Begin + if (pos(fil_SrcCalls.Strings[i], spotter)=1) then //begins with definition + begin + SpotterOk := True; + Break; + end; + end; + if Not SpotterOK then + Begin + if dmData.DebugLevel>=2 then + Writeln('RBNMonitor: ','Wrong source callsign - ',Spotter); + Exit + end; + end; + dmDXCluster.id_country(spotter,now,pfx,Country,waz,itu,SrcCont); if (Pos(SrcCont+',',fil_SrcCont+',') = 0) and (fil_SrcCont<>'') then begin if dmData.DebugLevel>=2 then Writeln('RBNMonitor: ','Wrong source continent - ',SrcCont); @@ -576,7 +599,7 @@ begin for i:=0 to sgRbn.ColCount-1 do cqrini.WriteInteger('WindowSize','RbnCol'+IntToStr(i),sgRbn.ColWidths[i]); lTelnet.Disconnect(); - dmUtils.SaveWindowPos(self) + dmUtils.SaveWindowPos(self); end; procedure TfrmRbnMonitor.FormCreate(Sender: TObject); @@ -588,6 +611,7 @@ begin sgRbn.RowCount := 1; slRbnSpots := TStringList.Create; + SrcCalls:= TStringList.Create; lTelnet := TLTelnetClientComponent.Create(nil); lTelnet.OnConnect := @lConnect; @@ -600,6 +624,7 @@ procedure TfrmRbnMonitor.FormDestroy(Sender: TObject); begin FreeAndNil(lTelnet); DoneCriticalsection(csRbnMonitor); + FreeAndNil(SrcCalls); FreeAndNil(slRbnSpots) end; @@ -631,8 +656,8 @@ begin sgRbn.Cells[2,0] := 'DX'; sgRbn.Cells[3,0] := 'Mode'; sgRbn.Cells[4,0] := 'dB'; - sgRbn.Cells[5,0] := 'Q'; - sgRbn.Cells[6,0] := 'D'; + sgRbn.Cells[5,0] := 'Qsl'; + sgRbn.Cells[6,0] := 'DXCC'; if ((not(TRbnThread = nil)) and ( cqrini.ReadBool('RBN','AutoConnectM',False) )) then acConnectExecute(nil); @@ -705,11 +730,17 @@ begin end; //------------------------------------------------- procedure TfrmRbnMonitor.LoadConfigToThread; + begin if Assigned(RbnMonThread) then begin RbnMonThread.fil_SrcCont := cqrini.ReadString('RBNFilter','SrcCont',C_RBN_CONT); + SrcCalls.Clear; //we need to do this via another TString list. Direct mods to fil_SrcCalls cause SIGSEGV + SrcCalls.Delimiter:=','; + SrcCalls.AddDelimitedtext(cqrini.ReadString('RBNFilter','SrcCall','')); + RbnMonThread.fil_SrcCalls := SrcCalls; + RbnMonThread.fil_IgnWkdHour := cqrini.ReadBool('RBNFilter','IgnHour',True); RbnMonThread.fil_IgnHourValue := cqrini.ReadInteger('RBNFilter','IgnHourValue',48); RbnMonThread.fil_IgnDate := cqrini.ReadBool('RBNFilter','IgnDate',False); diff --git a/src/fRotControl.lfm b/src/fRotControl.lfm index 0301ba3..e88a5d7 100644 --- a/src/fRotControl.lfm +++ b/src/fRotControl.lfm @@ -14,14 +14,14 @@ object frmRotControl: TfrmRotControl OnDestroy = FormDestroy OnKeyUp = FormKeyUp OnShow = FormShow - LCLVersion = '2.0.12.0' + LCLVersion = '2.2.6.0' object gbAzimuth: TGroupBox AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 - Height = 75 + Height = 79 Top = 1 Width = 172 Anchors = [akTop, akLeft, akRight] @@ -30,7 +30,7 @@ object frmRotControl: TfrmRotControl BorderSpacing.Top = 1 BorderSpacing.Right = 6 Caption = 'Azimuth' - ClientHeight = 57 + ClientHeight = 61 ClientWidth = 170 TabOrder = 0 OnClick = gbAzimuthClick @@ -42,8 +42,8 @@ object frmRotControl: TfrmRotControl AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 2 - Height = 34 - Top = 23 + Height = 36 + Top = 25 Width = 166 Alignment = taRightJustify Anchors = [akTop, akLeft, akRight] @@ -65,7 +65,7 @@ object frmRotControl: TfrmRotControl AnchorSideRight.Control = gbAzimuth AnchorSideRight.Side = asrBottom Left = 1 - Height = 20 + Height = 22 Top = 1 Width = 168 Anchors = [akTop, akLeft, akRight] @@ -73,7 +73,7 @@ object frmRotControl: TfrmRotControl BorderSpacing.Left = 1 BorderSpacing.Top = 1 BorderSpacing.Right = 1 - ClientHeight = 20 + ClientHeight = 22 ClientWidth = 168 TabOrder = 0 Visible = False @@ -86,7 +86,7 @@ object frmRotControl: TfrmRotControl AnchorSideBottom.Side = asrBottom Left = 4 Height = 10 - Top = 9 + Top = 11 Width = 160 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 3 @@ -97,7 +97,7 @@ object frmRotControl: TfrmRotControl AnchorSideLeft.Control = pnlMinMax AnchorSideTop.Control = pnlMinMax Left = 4 - Height = 8 + Height = 10 Top = 1 Width = 3 BorderSpacing.Left = 3 @@ -111,7 +111,7 @@ object frmRotControl: TfrmRotControl AnchorSideRight.Control = pnlMinMax AnchorSideRight.Side = asrBottom Left = 161 - Height = 8 + Height = 10 Top = 1 Width = 3 Alignment = taRightJustify diff --git a/src/fRotControl.pas b/src/fRotControl.pas index b12f252..45f4895 100644 --- a/src/fRotControl.pas +++ b/src/fRotControl.pas @@ -69,6 +69,7 @@ type MouseWheelUsed : Boolean; public { public declarations } + BeamDir : Double; procedure SynROT; function InicializeRot : Boolean; procedure UpdateAZdisp(Az,AzMin,AzMax:Double;UseState:Boolean); @@ -82,7 +83,7 @@ implementation { TfrmRotControl } -uses dUtils, dData; +uses dUtils, dData, fGrayline; procedure TfrmRotControl.FormShow(Sender: TObject); begin @@ -97,6 +98,7 @@ begin btnStop.Visible:=cqrini.ReadBool('ROT','Stopbtn',False); mnuStopbtn.Checked:=cqrini.ReadBool('ROT','Stopbtn',False); if pnlMinMax.Visible then gbAzimuth.Height:=70; + Beamdir:=-1; end; procedure TfrmRotControl.gbAzimuthClick(Sender: TObject); @@ -146,11 +148,13 @@ end; procedure TfrmRotControl.rbRotor1Click(Sender: TObject); begin + cqrini.WriteBool('ROT','Use1',rbRotor1.Checked); InicializeRot end; procedure TfrmRotControl.rbRotor2Click(Sender: TObject); begin + cqrini.WriteBool('ROT','Use1',rbRotor1.Checked); InicializeRot end; @@ -168,7 +172,7 @@ end; procedure TfrmRotControl.FormDestroy(Sender: TObject); begin if Assigned(rotor) then - FreeAndNil(rotor) + FreeAndNil(rotor) end; procedure TfrmRotControl.FormKeyUp(Sender: TObject; var Key: Word; @@ -376,11 +380,19 @@ begin //broken configuration caused crash because RotCtldPort was empty //probably late to change it to Integer, I have no idea if the current //setting would be converted automatically or user has to do it again :( - if not TryStrToInt(cqrini.ReadString('ROT'+n,'RotCtldPort','4533'),port) then - port := 4533; - if not TryStrToInt(cqrini.ReadString('ROT'+n,'poll','500'),poll) then - poll := 500; + + //OH1KH 2022-12-09: cqrini.ReadInteger and cqrini.ReadString both can be used! + //Works same way as database ReadAsString or ReadAsInteger; Source is same but resulting read is + //either String or Integer how programmer wants. + //cqrini.Write does not make difference in config file if variable is saved as String or Integer + //both results look same in .cfg file. + + port:= cqrini.ReadInteger('ROT'+n, 'RotCtldPort', 4533); + if ((port>65534) or (port<1024)) then port := 4533; //limit values + + poll:=cqrini.ReadInteger('ROT'+n, 'poll', 500); + if ((poll>60000) or (poll<10)) then poll := 500; //limit values rotor.RotCtldPath := cqrini.ReadString('ROT','RotCtldPath','/usr/bin/rotctld'); rotor.RotCtldArgs := dmUtils.GetRotorRotCtldCommandLine(StrToInt(n)); @@ -401,10 +413,29 @@ end; procedure TfrmRotControl.SynROT; var - Az : Double ; + Az :Double; + mylat,mylon :currency; + exlat,exlon :extended; + dist :longint; begin + exlon:=0; + exlat:=0; + dist :=1000; if Assigned(rotor) then - Az := rotor.GetAzimut + begin + Az := rotor.GetAzimut; + if frmGrayline.Showing then + Begin + if (Trunc(Az)<>BeamDir) and frmGrayline.pumShowBeamPath.Checked then + Begin + dist :=cqrini.ReadInteger('Program', 'GraylineGBeamLineLength',1500); //in kilometers + dmutils.CoordinateFromLocator(frmNewQSO.CurrentMyLoc,mylat,mylon); + frmGrayline.CalculateLatLonOfNewPoint(mylon,mylat,dist,Trunc(Az),exlon,exlat); + frmGrayline.PlotGreatCircleArcLine(mylon,mylat,exlon,exlat,2); + Beamdir:=Trunc(Az); + end; + end; + end else Az := 0; lblAzimuth.Caption := FormatFloat(empty_azimuth+';;',Az) diff --git a/src/fSOTAExport.pas b/src/fSOTAExport.pas index d12ee4d..33bdd2e 100644 --- a/src/fSOTAExport.pas +++ b/src/fSOTAExport.pas @@ -163,7 +163,9 @@ begin Rewrite(f); dmData.trQ.StartTransaction; dmData.Q.Open; + dmData.Q.Last; //to get proper count pbExport.Max := dmData.Q.RecordCount; + dmData.Q.First; while not dmData.Q.Eof do begin if rbSotaLog.Checked then diff --git a/src/fSQLConsole.pas b/src/fSQLConsole.pas index 551671f..028f8c4 100644 --- a/src/fSQLConsole.pas +++ b/src/fSQLConsole.pas @@ -149,7 +149,10 @@ procedure TfrmSQLConsole.acLoadSQLExecute(Sender: TObject); begin dlgOpen.Filter := 'SQL|*.sql'; if dlgOpen.Execute then - mSQL.Lines.LoadFromFile(dlgOpen.FileName) + if FileExists(dlgOpen.FileName) then //with QT5 opendialog user can enter filename that may not exist + mSQL.Lines.LoadFromFile(dlgOpen.FileName) + else + ShowMessage('File not found!'); end; procedure TfrmSQLConsole.acNextExecute(Sender: TObject); diff --git a/src/fSendSpot.pas b/src/fSendSpot.pas index 6f00466..a2b4dc9 100644 --- a/src/fSendSpot.pas +++ b/src/fSendSpot.pas @@ -49,6 +49,8 @@ type Srst_s, Sstx, Sstx_str, + Ssrx, + Ssrx_str, SHisName, SHelloMsg :String; { public declarations } @@ -86,6 +88,7 @@ end; procedure TfrmSendSpot.btnUsrClick(Sender: TObject); begin UsrString := cqrini.ReadString('DXCluster', 'UsrMsg', ''); + UsrString:=dmUtils.GetCWMessage('',Scall,Srst_s,Sstx,Sstx_str,Ssrx,Ssrx_str,SHisName,SHelloMsg,UsrString); if pos(UsrString, edtSpot.Text) = 0 then edtSpot.Text := edtSpot.Text+' '+UsrString; end; @@ -126,13 +129,13 @@ end; procedure TfrmSendSpot.FormShow(Sender: TObject); begin - if not ((frmDXCluster.ConWeb) or (frmDXCluster.ConTelnet)) then + if not (frmDXCluster.ConTelnet) then Begin - ShowMessage('You must connect to DXCluster first!'); + ShowMessage('You must connect to telnet DXCluster first!'); btnCancel.Click; end; UsrString := cqrini.ReadString('DXCluster', 'UsrMsg', ''); - UsrString:=dmUtils.GetCWMessage('',Scall,Srst_s,Sstx,Sstx_str,SHisName,SHelloMsg,UsrString); + UsrString:=dmUtils.GetCWMessage('',Scall,Srst_s,Sstx,Sstx_str,Ssrx,Ssrx_str,SHisName,SHelloMsg,UsrString); btnUsr.Hint:=UsrString; btnLoc.Hint:= HisMyLoc; btnModRst.Hint:= ModeRst; diff --git a/src/fSplitSettings.lfm b/src/fSplitSettings.lfm index c141335..33b99d5 100644 --- a/src/fSplitSettings.lfm +++ b/src/fSplitSettings.lfm @@ -208,6 +208,8 @@ object frmSplitSettings: TfrmSplitSettings BorderSpacing.Left = 6 BorderSpacing.Top = 6 MaxValue = 9999 + MinValue = 0 + Value = 0 TabOrder = 0 end object cmbSplit1: TComboBox @@ -238,8 +240,9 @@ object frmSplitSettings: TfrmSplitSettings Top = 39 Width = 88 MaxValue = 9999 + MinValue = 0 + Value = 0 TabOrder = 2 - Value = 1 end object cmbSplit2: TComboBox AnchorSideLeft.Control = cmbSplit1 @@ -267,8 +270,9 @@ object frmSplitSettings: TfrmSplitSettings Top = 72 Width = 88 MaxValue = 9999 + MinValue = 0 + Value = 0 TabOrder = 4 - Value = 1 end object cmbSplit3: TComboBox AnchorSideLeft.Control = cmbSplit2 @@ -296,8 +300,9 @@ object frmSplitSettings: TfrmSplitSettings Top = 105 Width = 88 MaxValue = 9999 + MinValue = 0 + Value = 0 TabOrder = 6 - Value = 1 end object cmbSplit4: TComboBox AnchorSideLeft.Control = cmbSplit3 @@ -325,8 +330,9 @@ object frmSplitSettings: TfrmSplitSettings Top = 138 Width = 88 MaxValue = 9999 + MinValue = 0 + Value = 0 TabOrder = 8 - Value = 1 end object cmbSplit5: TComboBox AnchorSideLeft.Control = cmbSplit4 @@ -354,8 +360,9 @@ object frmSplitSettings: TfrmSplitSettings Top = 171 Width = 88 MaxValue = 9999 + MinValue = 0 + Value = 0 TabOrder = 10 - Value = 1 end object cmbSplit6: TComboBox AnchorSideLeft.Control = cmbSplit5 @@ -383,8 +390,9 @@ object frmSplitSettings: TfrmSplitSettings Top = 204 Width = 88 MaxValue = 9999 + MinValue = 0 + Value = 0 TabOrder = 12 - Value = 1 end object cmbSplit7: TComboBox AnchorSideLeft.Control = cmbSplit6 @@ -412,8 +420,9 @@ object frmSplitSettings: TfrmSplitSettings Top = 237 Width = 88 MaxValue = 9999 + MinValue = 0 + Value = 0 TabOrder = 14 - Value = 1 end object cmbSplit8: TComboBox AnchorSideLeft.Control = cmbSplit7 @@ -443,7 +452,7 @@ object frmSplitSettings: TfrmSplitSettings BorderSpacing.Top = 18 Caption = 'OK' OnClick = btnOKClick - TabOrder = 16 + TabOrder = 18 end object btnCancel: TButton AnchorSideLeft.Control = cmbSplit9 @@ -458,7 +467,7 @@ object frmSplitSettings: TfrmSplitSettings Cancel = True Caption = 'Cancel' ModalResult = 2 - TabOrder = 17 + TabOrder = 19 end object lbl9: TLabel AnchorSideLeft.Control = lbl1 @@ -491,10 +500,10 @@ object frmSplitSettings: TfrmSplitSettings Height = 33 Top = 270 Width = 88 - MaxValue = 8000 - MinValue = 1 - TabOrder = 18 - Value = 2 + MaxValue = 9999 + MinValue = 0 + Value = 0 + TabOrder = 16 end object cmbSplit9: TComboBox AnchorSideLeft.Control = cmbSplit8 @@ -510,7 +519,7 @@ object frmSplitSettings: TfrmSplitSettings 'UP' 'DOWN' ) - TabOrder = 19 + TabOrder = 17 Text = 'UP' end end diff --git a/src/fTRXControl.lfm b/src/fTRXControl.lfm index 0639918..c2df004 100644 --- a/src/fTRXControl.lfm +++ b/src/fTRXControl.lfm @@ -1,12 +1,12 @@ object frmTRXControl: TfrmTRXControl - Left = 732 - Height = 326 - Top = 27 - Width = 275 + Left = 950 + Height = 302 + Top = 29 + Width = 265 Anchors = [] Caption = 'TRX control' - ClientHeight = 301 - ClientWidth = 275 + ClientHeight = 277 + ClientWidth = 265 Icon.Data = { BE1000000000010001002020000001002000A810000016000000280000002000 0000400000000100200000000000001000006400000064000000000000000000 @@ -152,7 +152,7 @@ object frmTRXControl: TfrmTRXControl OnKeyDown = FormKeyDown OnKeyUp = FormKeyUp OnShow = FormShow - LCLVersion = '2.2.0.4' + LCLVersion = '2.2.6.0' object gbMode: TGroupBox AnchorSideLeft.Control = gbVfo AnchorSideTop.Control = gbVfo @@ -160,7 +160,7 @@ object frmTRXControl: TfrmTRXControl AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom - Left = 196 + Left = 186 Height = 238 Top = 48 Width = 78 @@ -194,7 +194,7 @@ object frmTRXControl: TfrmTRXControl OnClick = btnSSBClick TabOrder = 1 end - object btnRTTY: TButton + object btnDATA: TButton AnchorSideLeft.Control = btnCW AnchorSideTop.Control = btnSSB AnchorSideTop.Side = asrBottom @@ -202,13 +202,13 @@ object frmTRXControl: TfrmTRXControl Height = 25 Top = 50 Width = 51 - Caption = 'RTTY' - OnClick = btnRTTYClick + Caption = 'DATA' + OnClick = btnDATAClick TabOrder = 2 end object btnAM: TButton AnchorSideLeft.Control = btnCW - AnchorSideTop.Control = btnRTTY + AnchorSideTop.Control = btnDATA AnchorSideTop.Side = asrBottom Left = 13 Height = 25 @@ -279,16 +279,16 @@ object frmTRXControl: TfrmTRXControl AnchorSideTop.Control = Owner AnchorSideRight.Control = gbMode Left = 1 - Height = 301 + Height = 277 Top = 0 - Width = 194 + Width = 184 Align = alLeft Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 1 BorderSpacing.Right = 1 BevelOuter = bvNone - ClientHeight = 301 - ClientWidth = 194 + ClientHeight = 277 + ClientWidth = 184 TabOrder = 1 object gbFreq: TGroupBox AnchorSideLeft.Control = pnlMain @@ -297,14 +297,14 @@ object frmTRXControl: TfrmTRXControl Left = 1 Height = 64 Top = 1 - Width = 192 + Width = 182 Align = alTop BorderSpacing.Left = 1 BorderSpacing.Top = 1 BorderSpacing.Right = 1 Caption = ' Freq ' ClientHeight = 46 - ClientWidth = 190 + ClientWidth = 180 TabOrder = 0 OnClick = gbFreqClick object lblFreq: TLabel @@ -319,7 +319,7 @@ object frmTRXControl: TfrmTRXControl Left = 4 Height = 39 Top = 4 - Width = 183 + Width = 173 Alignment = taRightJustify Anchors = [akTop, akLeft, akRight, akBottom] AutoSize = False @@ -332,6 +332,7 @@ object frmTRXControl: TfrmTRXControl Font.Height = 30 Font.Style = [fsBold] Layout = tlCenter + ParentColor = False ParentFont = False OnClick = lblFreqClick end @@ -345,7 +346,7 @@ object frmTRXControl: TfrmTRXControl Left = 4 Height = 39 Top = 4 - Width = 183 + Width = 173 Anchors = [akTop, akLeft, akRight, akBottom] AutoSize = False AutoSelect = False @@ -365,16 +366,16 @@ object frmTRXControl: TfrmTRXControl AnchorSideTop.Control = gbInfo AnchorSideRight.Control = pnlMain Left = 1 - Height = 158 + Height = 128 Top = 117 - Width = 192 + Width = 182 Align = alClient BorderSpacing.Left = 1 BorderSpacing.Top = 3 BorderSpacing.Right = 1 Caption = ' Band ' - ClientHeight = 140 - ClientWidth = 190 + ClientHeight = 110 + ClientWidth = 180 TabOrder = 1 object btn160m: TButton AnchorSideLeft.Control = gbBand @@ -440,7 +441,7 @@ object frmTRXControl: TfrmTRXControl AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = btn15m AnchorSideTop.Side = asrBottom - Left = 67 + Left = 62 Height = 25 Top = 84 Width = 56 @@ -455,7 +456,7 @@ object frmTRXControl: TfrmTRXControl AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = btn17m AnchorSideTop.Side = asrBottom - Left = 67 + Left = 62 Height = 25 Top = 58 Width = 56 @@ -470,7 +471,7 @@ object frmTRXControl: TfrmTRXControl AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = btn20m AnchorSideTop.Side = asrBottom - Left = 67 + Left = 62 Height = 25 Top = 32 Width = 56 @@ -484,7 +485,7 @@ object frmTRXControl: TfrmTRXControl AnchorSideLeft.Control = gbBand AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = gbBand - Left = 67 + Left = 62 Height = 25 Top = 6 Width = 56 @@ -498,7 +499,7 @@ object frmTRXControl: TfrmTRXControl AnchorSideTop.Control = gbBand AnchorSideRight.Control = gbBand AnchorSideRight.Side = asrBottom - Left = 128 + Left = 118 Height = 25 Top = 6 Width = 56 @@ -515,7 +516,7 @@ object frmTRXControl: TfrmTRXControl AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbBand AnchorSideRight.Side = asrBottom - Left = 128 + Left = 118 Height = 25 Top = 32 Width = 56 @@ -532,7 +533,7 @@ object frmTRXControl: TfrmTRXControl AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbBand AnchorSideRight.Side = asrBottom - Left = 128 + Left = 118 Height = 25 Top = 84 Width = 56 @@ -549,7 +550,7 @@ object frmTRXControl: TfrmTRXControl AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbBand AnchorSideRight.Side = asrBottom - Left = 128 + Left = 118 Height = 25 Top = 58 Width = 56 @@ -570,12 +571,12 @@ object frmTRXControl: TfrmTRXControl AnchorSideBottom.Side = asrBottom Left = 0 Height = 30 - Top = 110 - Width = 190 + Top = 80 + Width = 180 Anchors = [akLeft, akRight, akBottom] BevelOuter = bvNone ClientHeight = 30 - ClientWidth = 190 + ClientWidth = 180 TabOrder = 12 Visible = False object btPon: TButton @@ -596,7 +597,7 @@ object frmTRXControl: TfrmTRXControl AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = pnlPower AnchorSideTop.Side = asrCenter - Left = 67 + Left = 62 Height = 25 Top = 3 Width = 56 @@ -610,7 +611,7 @@ object frmTRXControl: TfrmTRXControl AnchorSideTop.Side = asrCenter AnchorSideRight.Control = pnlPower AnchorSideRight.Side = asrBottom - Left = 128 + Left = 118 Height = 25 Top = 3 Width = 56 @@ -629,12 +630,12 @@ object frmTRXControl: TfrmTRXControl AnchorSideBottom.Control = pnlPower Left = 0 Height = 30 - Top = 80 - Width = 190 + Top = 50 + Width = 180 Anchors = [akLeft, akRight, akBottom] BevelOuter = bvNone ClientHeight = 30 - ClientWidth = 190 + ClientWidth = 180 TabOrder = 13 Visible = False object btnUsr1: TButton @@ -647,7 +648,7 @@ object frmTRXControl: TfrmTRXControl Width = 56 BorderSpacing.Left = 6 Caption = 'USR1' - OnClick = btnUsr1Click + OnClick = btnUsrClick TabOrder = 0 end object btnUsr2: TButton @@ -655,12 +656,12 @@ object frmTRXControl: TfrmTRXControl AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = pnlUsr AnchorSideTop.Side = asrCenter - Left = 67 + Left = 62 Height = 25 Top = 3 Width = 56 Caption = 'USR2' - OnClick = btnUsr2Click + OnClick = btnUsrClick TabOrder = 1 end object btnUsr3: TButton @@ -669,14 +670,14 @@ object frmTRXControl: TfrmTRXControl AnchorSideTop.Side = asrCenter AnchorSideRight.Control = pnlUsr AnchorSideRight.Side = asrBottom - Left = 128 + Left = 118 Height = 25 Top = 3 Width = 56 Anchors = [akTop, akRight] BorderSpacing.Right = 6 Caption = 'USR3' - OnClick = btnUsr3Click + OnClick = btnUsrClick TabOrder = 2 end end @@ -688,47 +689,60 @@ object frmTRXControl: TfrmTRXControl AnchorSideBottom.Control = pnlMain AnchorSideBottom.Side = asrBottom Left = 0 - Height = 26 - Top = 275 - Width = 194 + Height = 27 + Top = 247 + Width = 184 Align = alBottom + BorderSpacing.Top = 2 + BorderSpacing.Bottom = 3 BevelOuter = bvNone - ClientHeight = 26 - ClientWidth = 194 + ClientHeight = 27 + ClientWidth = 184 ParentBidiMode = False TabOrder = 2 - object rbRadio1: TRadioButton + object cmbRig: TComboBox AnchorSideLeft.Control = pnlRig + AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = pnlRig - Left = 7 - Height = 23 - Top = 1 - Width = 56 - BorderSpacing.Left = 7 - BorderSpacing.Top = 1 - Caption = 'RIG: ' - Checked = True - OnClick = rbRadio1Click - ParentBidiMode = False + AnchorSideTop.Side = asrCenter + AnchorSideBottom.Control = pnlRig + AnchorSideBottom.Side = asrBottom + Left = 27 + Height = 27 + Top = 0 + Width = 130 + Anchors = [akTop, akLeft, akBottom] + ItemHeight = 0 + ItemIndex = 1 + Items.Strings = ( + '' + '1' + '2' + '3' + '4' + '5' + '6' + ) + OnChange = cmbRigChange + OnCloseUp = cmbRigCloseUp + OnGetItems = cmbRigGetItems + Style = csDropDownList TabOrder = 0 - TabStop = True + Text = '1' end - object rbRadio2: TRadioButton + object lblInitRig: TLabel + AnchorSideLeft.Control = pnlRig + AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = pnlRig - AnchorSideRight.Control = pnlRig - AnchorSideRight.Side = asrBottom - Left = 131 - Height = 23 - Top = 1 - Width = 56 - Anchors = [akTop, akRight] - BidiMode = bdRightToLeft - BorderSpacing.Top = 1 - BorderSpacing.Right = 7 - Caption = 'RIG: ' - OnClick = rbRadio2Click - ParentBidiMode = False - TabOrder = 1 + AnchorSideTop.Side = asrCenter + Left = 52 + Height = 17 + Top = 5 + Width = 80 + Alignment = taCenter + Caption = 'Please wait!' + ParentColor = False + Visible = False end end object gbInfo: TGroupBox @@ -738,14 +752,14 @@ object frmTRXControl: TfrmTRXControl Left = 1 Height = 46 Top = 68 - Width = 192 + Width = 182 Align = alTop BorderSpacing.Left = 1 BorderSpacing.Top = 3 BorderSpacing.Right = 1 Caption = 'Mem Info' ClientHeight = 28 - ClientWidth = 190 + ClientWidth = 180 TabOrder = 3 Visible = False object edtMemNr: TEdit @@ -757,7 +771,7 @@ object frmTRXControl: TfrmTRXControl Left = 6 Height = 27 Top = 0 - Width = 178 + Width = 168 Anchors = [akTop, akLeft, akRight] AutoSize = False AutoSelect = False @@ -775,7 +789,7 @@ object frmTRXControl: TfrmTRXControl AnchorSideTop.Control = pnlMain AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom - Left = 196 + Left = 186 Height = 48 Top = 0 Width = 78 @@ -861,4 +875,10 @@ object frmTRXControl: TfrmTRXControl OnExecute = acAddModMemExecute end end + object tmrSetRigTime: TTimer + Enabled = False + OnTimer = tmrSetRigTimeTimer + Left = 128 + Top = 112 + end end diff --git a/src/fTRXControl.pas b/src/fTRXControl.pas index fadf3e6..dcbd76a 100644 --- a/src/fTRXControl.pas +++ b/src/fTRXControl.pas @@ -45,7 +45,7 @@ type btnMemWri : TButton; btnMemUp : TButton; btnSSB : TButton; - btnRTTY : TButton; + btnDATA : TButton; btnAM : TButton; btnFM : TButton; btnVFOA : TButton; @@ -56,6 +56,7 @@ type btnUsr1 : TButton; btPstby : TButton; btnUsr3 : TButton; + cmbRig: TComboBox; edtFreqInput : TEdit; edtMemNr : TEdit; gbBand : TGroupBox; @@ -64,6 +65,7 @@ type gbInfo : TGroupBox; gbVfo : TGroupBox; GroupBox4 : TGroupBox; + lblInitRig: TLabel; lblFreq : TLabel; mnuShowUsr : TMenuItem; mnuShowInfo : TMenuItem; @@ -78,8 +80,7 @@ type pnlRig : TPanel; pnlMain : TPanel; pnlPower : TPanel; - rbRadio1 : TRadioButton; - rbRadio2 : TRadioButton; + tmrSetRigTime: TTimer; tmrRadio : TTimer; procedure acAddModMemExecute(Sender : TObject); procedure btnMemWriClick(Sender : TObject); @@ -90,9 +91,10 @@ type procedure btPoffClick(Sender : TObject); procedure btPonClick(Sender : TObject); procedure btPstbyClick(Sender : TObject); - procedure btnUsr1Click(Sender : TObject); - procedure btnUsr2Click(Sender : TObject); - procedure btnUsr3Click(Sender : TObject); + procedure btnUsrClick(Sender : TObject); + procedure cmbRigChange(Sender: TObject); + procedure cmbRigCloseUp(Sender: TObject); + procedure cmbRigGetItems(Sender: TObject); procedure edtFreqInputKeyPress(Sender : TObject; var Key : Char); procedure edtFreqInputKeyUp(Sender : TObject; var Key : Word; Shift : TShiftState); procedure edtFreqInputMouseLeave(Sender : TObject); @@ -121,7 +123,7 @@ type procedure btnAMClick(Sender : TObject); procedure btnCWClick(Sender : TObject); procedure btnFMClick(Sender : TObject); - procedure btnRTTYClick(Sender : TObject); + procedure btnDATAClick(Sender : TObject); procedure btnSSBClick(Sender : TObject); procedure gbFreqClick(Sender : TObject); procedure lblFreqClick(Sender : TObject); @@ -130,9 +132,8 @@ type procedure mnuProgPrefClick(Sender : TObject); procedure mnuShowUsrClick(Sender : TObject); procedure mnuShowVfoClick(Sender : TObject); - procedure rbRadio1Click(Sender : TObject); - procedure rbRadio2Click(Sender : TObject); procedure tmrRadioTimer(Sender : TObject); + procedure tmrSetRigTimeTimer(Sender: TObject); private MouseWheelUsed : Boolean; radio : TRigControl; @@ -151,23 +152,31 @@ type btn2MBand : String; btn70CMBand : String; + currMin :String; //for timing rig command: set_clock + function GetActualMode : String; function GetModeNumber(mode : String) : Cardinal; procedure SetMode(mode : String; bandwidth : Integer); - procedure ClearButtonsColor; + procedure ClearBandButtonsColor; + procedure ClearModeButtonsColor; procedure UpdateModeButtons(mode : String); + + procedure CheckUserMode(var mode : String); procedure UserButton(r, b : Char); public AutoMode : Boolean; infosetstage : Integer; infosetfreq : String; + RigInUse : String; //rig in use. Number as string + IsNewHamlib : Boolean; + procedure SynTRX; function GetFreqFromModeBand(band : Integer; smode : String) : String; function GetModeFreqNewQSO(var mode, freq : String) : Boolean; function GetBandWidth(mode : String) : Integer; function GetModeBand(var mode, band : String) : Boolean; - function InicializeRig : Boolean; + function InitializeRig : Boolean; function GetFreqHz : Double; function GetFreqkHz : Double; function GetFreqMHz : Double; @@ -188,6 +197,8 @@ type procedure LoadBandButtons; function ListModeClose : Boolean; procedure HLTune(start : Boolean); + procedure SendVoice(mem : String); + procedure StopVoice; end; var @@ -262,7 +273,7 @@ begin lblFreq.Caption := FormatFloat(empty_freq, f); UpdateModeButtons(m); - ClearButtonsColor; + ClearBandButtonsColor; // this waits5 rig polls before lock freq set by memory. After that if freq chanfǵes (by vfo knob) clean info text // stupid but works quite well case infosetstage of @@ -367,7 +378,11 @@ begin frmBandMap.CurrentFreq := f * 1000; frmBandMap.CurrentMode := m; if Assigned(radio) then - pnlPower.Enabled:=radio.Power; + begin + btPon.Enabled:=radio.Power; + btPoff.Enabled:=radio.Power; + btPstby.Enabled:=radio.Power; + end; end; function TfrmTRXControl.GetModeNumber(mode : String) : Cardinal; @@ -393,10 +408,7 @@ function TfrmTRXControl.GetBandWidth(mode : String) : Integer; var section : String; begin - if rbRadio1.Checked then - section := 'Band1' - else - section := 'Band2'; + section := 'Band'+RigInUse; Result := 500; if (mode = 'LSB') or (mode = 'USB') then mode := 'SSB'; @@ -405,21 +417,23 @@ begin if mode = 'SSB' then Result := (cqrini.ReadInteger(section, 'SSB', 1800)); if mode = 'RTTY' then - Result := (cqrini.ReadInteger(section, 'RTTY', 500)); + Result := (cqrini.ReadInteger(section, 'RTTY', 500)); //note: Data is called rtty for backward compatibility if mode = 'AM' then Result := (cqrini.ReadInteger(section, 'AM', 3000)); if mode = 'FM' then Result := (cqrini.ReadInteger(section, 'FM', 2500)); end; - procedure TfrmTRXControl.FormShow(Sender : TObject); + begin LoadUsrButtonCaptions; LoadButtonCaptions; LoadBandButtons; dmUtils.LoadWindowPos(frmTRXControl); - rbRadio1.Caption := cqrini.ReadString('TRX1', 'Desc', 'Radio 1'); - rbRadio2.Caption := cqrini.ReadString('TRX2', 'Desc', 'Radio 2'); + cmbRigGetItems(nil); + //These two are needed here othewise rig selector has "None" even if rig is initialized at startup + cmbRig.ItemIndex:=cqrini.ReadInteger('TRX', 'RigInUse', 1); + cmbRigCloseUp(nil); //defaults rig 1 in case of undefined old_mode := ''; MemRelated := cqrini.ReadBool('TRX', 'MemModeRelated', False); gbInfo.Visible := cqrini.ReadBool('TRX', 'MemShowInfo', gbInfo.Visible); @@ -436,7 +450,7 @@ var freq : String = ''; mode : String = ''; begin - ClearButtonsColor; + ClearBandButtonsColor; mode := GetActualMode; freq := GetFreqFromModeBand(8, mode); SetModeFreq(mode, freq); @@ -449,7 +463,7 @@ var freq : String = ''; mode : String = ''; begin - ClearButtonsColor; + ClearBandButtonsColor; mode := GetActualMode; freq := GetFreqFromModeBand(7, mode); SetModeFreq(mode, freq); @@ -462,7 +476,7 @@ var freq : String = ''; mode : String = ''; begin - ClearButtonsColor; + ClearBandButtonsColor; mode := GetActualMode; freq := GetFreqFromModeBand(6, mode); SetModeFreq(mode, freq); @@ -475,7 +489,7 @@ var freq : String = ''; mode : String = ''; begin - ClearButtonsColor; + ClearBandButtonsColor; mode := GetActualMode; freq := GetFreqFromModeBand(0, mode); SetModeFreq(mode, freq); @@ -488,7 +502,7 @@ var freq : String = ''; mode : String = ''; begin - ClearButtonsColor; + ClearBandButtonsColor; mode := GetActualMode; freq := GetFreqFromModeBand(5, mode); SetModeFreq(mode, freq); @@ -501,7 +515,7 @@ var freq : String = ''; mode : String = ''; begin - ClearButtonsColor; + ClearBandButtonsColor; mode := GetActualMode; freq := GetFreqFromModeBand(4, mode); SetModeFreq(mode, freq); @@ -514,7 +528,7 @@ var freq : String = ''; mode : String = ''; begin - ClearButtonsColor; + ClearBandButtonsColor; mode := GetActualMode; freq := GetFreqFromModeBand(10, mode); SetModeFreq(mode, freq); @@ -527,7 +541,7 @@ var freq : String = ''; mode : String = ''; begin - ClearButtonsColor; + ClearBandButtonsColor; mode := GetActualMode; freq := GetFreqFromModeBand(3, mode); SetModeFreq(mode, freq); @@ -540,7 +554,7 @@ var freq : String = ''; mode : String = ''; begin - ClearButtonsColor; + ClearBandButtonsColor; mode := GetActualMode; freq := GetFreqFromModeBand(2, mode); SetModeFreq(mode, freq); @@ -553,7 +567,7 @@ var freq : String = ''; mode : String = ''; begin - ClearButtonsColor; + ClearBandButtonsColor; mode := GetActualMode; freq := GetFreqFromModeBand(9, mode); SetModeFreq(mode, freq); @@ -566,7 +580,7 @@ var freq : String = ''; mode : String = ''; begin - ClearButtonsColor; + ClearBandButtonsColor; mode := GetActualMode; freq := GetFreqFromModeBand(11, mode); SetModeFreq(mode, freq); @@ -579,7 +593,7 @@ var freq : String = ''; mode : String = ''; begin - ClearButtonsColor; + ClearBandButtonsColor; mode := GetActualMode; freq := GetFreqFromModeBand(1, mode); SetModeFreq(mode, freq); @@ -644,9 +658,10 @@ begin cqrini.WriteBool('TRX', 'MemShowInfo', gbInfo.Visible); end; -procedure TfrmTRXControl.btnRTTYClick(Sender : TObject); +procedure TfrmTRXControl.btnDATAClick(Sender : TObject); begin frmTRXControl.edtMemNr.Text := ''; //clear memo nr display if any text from last M push + //TODO fix mode setting here SetMode('RTTY', GetBandWidth('RTTY')); end; @@ -697,25 +712,33 @@ begin cqrini.WriteBool('TRX', 'ShowVfo', gbVfo.Visible); end; -procedure TfrmTRXControl.rbRadio1Click(Sender : TObject); -begin - LoadUsrButtonCaptions; - InicializeRig; -end; - -procedure TfrmTRXControl.rbRadio2Click(Sender : TObject); -begin - LoadUsrButtonCaptions; - InicializeRig; -end; - procedure TfrmTRXControl.tmrRadioTimer(Sender : TObject); begin SynTRX; end; +procedure TfrmTRXControl.tmrSetRigTimeTimer(Sender: TObject); +var + m : String; +begin + tmrSetRigTime.Enabled:=False; + m:= FormatDateTime('n',Now); + if currMin='' then currMin:=m; + if currMin<>m then //minute has changed set rig time + Begin + m:='+\set_clock '+FormatDateTime('yyyy-mm-dd"T"hh:mm',dmutils.GetDateTime(0))+'+00'; + if Assigned(radio) then + radio.UsrCmd(m); + if ((dmData.DebugLevel >= 1) or ((abs(dmData.DebugLevel) and 8) = 8)) then + writeln(m); + end + else + tmrSetRigTime.Enabled:=True; //continue waiting +end; + procedure TfrmTRXControl.FormClose(Sender : TObject; var CloseAction : TCloseAction); begin + cqrini.WriteInteger('TRX', 'RigInUse', cmbRig.ItemIndex); dmUtils.SaveWindowPos(frmTRXControl); end; @@ -870,49 +893,53 @@ begin dmutils.RunOnBackground(c); end else - radio.UsrCmd(c); + if Assigned(radio) then + radio.UsrCmd(c); end; - -procedure TfrmTRXControl.btnUsr1Click(Sender : TObject); +procedure TfrmTRXControl.btnUsrClick(Sender : TObject); var - r : Char; + b : Char; begin - if Assigned(radio) then - begin - if rbRadio1.Checked then r := '1' - else - r := '2'; - UserButton(r, '1'); - end; + if Sender = btnUsr1 then b:='1'; + if Sender = btnUsr2 then b:='2'; + if Sender = btnUsr3 then b:='3'; + UserButton(RigInUse[1], b); end; -procedure TfrmTRXControl.btnUsr2Click(Sender : TObject); +procedure TfrmTRXControl.cmbRigChange(Sender: TObject); +begin + cmbRig.Visible:=False; + lblInitRig.Visible:=True; + InitializeRig; + lblInitRig.Visible:=False; + cmbRig.Visible:=True; +end; + +procedure TfrmTRXControl.cmbRigCloseUp(Sender: TObject); +begin + if cmbRig.ItemIndex<1 then cmbRig.ItemIndex:=1; + RigInUse:=IntToStr(cmbRig.ItemIndex); + cqrini.WriteInteger('TRX', 'RigInUse',cmbRig.ItemIndex); +end; + +procedure TfrmTRXControl.cmbRigGetItems(Sender: TObject); +//sets rig names or none to selector list var - r : Char; -begin - if Assigned(radio) then - begin - if rbRadio1.Checked then r := '1' - else - r := '2'; - UserButton(r, '2'); - end; + n:integer; + s,r:string; +Begin + cmbRig.Items.Clear; + cmbRig.Items.add(''); //nr zero is empty + for n:=1 to cqrini.ReadInteger('TRX', 'RigCount', 2) do + Begin + s:=IntToStr(n); + r:=cqrini.ReadString('TRX'+s, 'Desc', ''); + if r='' then r:=' None' else r:=' '+r; + cmbRig.Items.add(s + r); + end; + cmbRig.ItemIndex:=cqrini.ReadInteger('TRX', 'RigInUse', 1); end; -procedure TfrmTRXControl.btnUsr3Click(Sender : TObject); -var - r : Char; -begin - if Assigned(radio) then - begin - if rbRadio1.Checked then r := '1' - else - r := '2'; - UserButton(r, '3'); - end; -end; - - procedure TfrmTRXControl.edtFreqInputKeyPress(Sender : TObject; var Key : Char); begin if key = '.' then @@ -1034,9 +1061,8 @@ begin end; end; -function TfrmTRXControl.InicializeRig : Boolean; +function TfrmTRXControl.InitializeRig : Boolean; var - n : String = ''; id : Integer = 0; port : Integer; poll : Integer; @@ -1050,71 +1076,90 @@ begin Sleep(500); Application.ProcessMessages; - if rbRadio1.Checked then n := '1' + if not TryStrToInt(cqrini.ReadString('TRX' + RigInUse, 'model', ''), id) then + Begin + cmbRig.Items[cmbRig.ItemIndex]:= RigInUse + ' Is not Set'; + lblFreq.Caption:='0.0000'; + ClearBandButtonsColor; + ClearModeButtonsColor; + exit; + end else - n := '2'; - - radio := TRigControl.Create; - - if (dmData.DebugLevel > 0) or cqrini.ReadBool('TRX', 'Debug', False) then + begin + radio := TRigControl.Create; + if (dmData.DebugLevel > 0) or cqrini.ReadBool('TRX', 'Debug', False) then radio.DebugMode := True; - - if not TryStrToInt(cqrini.ReadString('TRX' + n, 'model', ''), id) then - radio.RigId := 1 - else radio.RigId := id; + end; //broken configuration caused crash because RigCtldPort was empty //probably late to change it to Integer, I have no idea if the current //setting would be converted automatically or user has to do it again :( - if not TryStrToInt(cqrini.ReadString('TRX' + n, 'RigCtldPort', '4532'), port) then - port := 4532; - if not TryStrToInt(cqrini.ReadString('TRX' + n, 'poll', '500'), poll) then - poll := 500; + + //OH1KH 2022-12-09: cqrini.ReadInteger and cqrini.ReadString both can be used! + //Works same way as database ReadAsString or ReadAsInteger; Source is same but resulting read is + //either String or Integer how programmer wants. + //cqrini.Write does not make difference in config file if variable is saved as String or Integer + //both results look same in .cfg file. + + port:= cqrini.ReadInteger('TRX' + RigInUse, 'RigCtldPort', 4532); + if ((port>65534) or (port<1024)) then port := 4532; //limit values + + poll:=cqrini.ReadInteger('TRX' + RigInUse, 'poll', 500); + if ((poll>60000) or (poll<10)) then poll := 500; //limit values radio.RigCtldPath := cqrini.ReadString('TRX', 'RigCtldPath', '/usr/bin/rigctld'); - radio.RigCtldArgs := dmUtils.GetRadioRigCtldCommandLine(StrToInt(n)); - radio.RunRigCtld := cqrini.ReadBool('TRX' + n, 'RunRigCtld', False); - radio.RigDevice := cqrini.ReadString('TRX' + n, 'device', ''); + radio.RigCtldArgs := dmUtils.GetRadioRigCtldCommandLine(StrToInt(RigInUse)); + radio.RunRigCtld := cqrini.ReadBool('TRX' + RigInUse, 'RunRigCtld', False); + radio.RigDevice := cqrini.ReadString('TRX' + RigInUse, 'device', ''); radio.RigCtldPort := port; - radio.RigCtldHost := cqrini.ReadString('TRX' + n, 'host', 'localhost'); + radio.RigCtldHost := cqrini.ReadString('TRX' + RigInUse, 'host', 'localhost'); radio.RigPoll := poll; - radio.RigSendCWR := cqrini.ReadBool('TRX' + n, 'CWR', False); - radio.RigChkVfo := cqrini.ReadBool('TRX' + n, 'ChkVfo', True); + radio.RigSendCWR := cqrini.ReadBool('TRX' + RigInUse, 'CWR', False); + radio.RigChkVfo := cqrini.ReadBool('TRX' + RigInUse, 'ChkVfo', True); + radio.PowerON:=cqrini.ReadBool('TRX'+ RigInUse, 'RigPwrON', True); + radio.CompoundPoll:=cqrini.ReadBool('TRX'+RigInUse, 'CPollR', True); tmrRadio.Interval := radio.RigPoll; tmrRadio.Enabled := True; Result := True; + LoadUsrButtonCaptions; + pnlPower.Visible := cqrini.ReadBool('TRX', 'PowerButtons', False); mnuShowPwr.Checked := pnlPower.Visible; - if not radio.Connected then begin FreeAndNil(radio); end else //radio changed, restart CW interface begin + IsNewHamlib:=radio.IsNewHamlib; //we check this again although preferences prevent false setting - if (cqrini.ReadBool('CW', 'NoReset', False) //is set: user does not want reset - and (cqrini.ReadInteger('CW', 'Type1', 0) = - cqrini.ReadInteger('CW', 'Type2', 0)) //both keyers are same - and (cqrini.ReadInteger('CW', 'Type1', 0) <> 4) //type is not HamLib + if ( cqrini.ReadBool('CW', 'NoReset', False) //is set: user does not want reset + and (cqrini.ReadInteger('CW'+RigInUse, 'Type', 0) <> 4) //type is not HamLib ) then //no restart keyer it is same device for both radios. begin if ((dmData.DebugLevel >= 1) or ((abs(dmData.DebugLevel) and 8) = 8)) then - Writeln('User ask: No reset and keyer not Hamlib: No restart by TRControl radio' - + n + ' change'); + Writeln('User want: No reset and keyer not Hamlib: No restart by TRControl radio' + + RigInUse + ' change'); end else Begin frmNewQSO.InitializeCW; if ((dmData.DebugLevel >= 1) or ((abs(dmData.DebugLevel) and 8) = 8)) then - Writeln('CW keyer reloaded by TRControl radio' + n + ' change'); + Writeln('CW keyer reloaded by TRControl radio' + RigInUse + ' change'); end; + if cqrini.ReadBool('TRX'+RigInUse, 'UTC2Rig', False) then + Begin + currMin:=''; + tmrSetRigTime.Enabled:=True; //sets rig time on next minute change + if ((dmData.DebugLevel >= 1) or ((abs(dmData.DebugLevel) and 8) = 8)) then + Writeln('Set UTC to radio' + RigInUse + ' on next full minute'); + end; end; end; @@ -1122,6 +1167,8 @@ procedure TfrmTRXControl.SetMode(mode : String; bandwidth : Integer); var rmode : TRigMode; begin + + CheckUserMode(mode); if Assigned(radio) then begin rmode.mode := mode; @@ -1259,11 +1306,11 @@ begin 11: begin case mode of - 0: freq := cqrini.ReadFloat('DefFreq', '70cw', 3525); - 1: freq := cqrini.ReadFloat('DefFreq', '70ssb', 3750); - 2: freq := cqrini.ReadFloat('DefFreq', '70rtty', 3590); - 3: freq := cqrini.ReadFloat('DefFreq', '70am', 3750); - 4: freq := cqrini.ReadFloat('DefFreq', '70fm', 3750); + 0: freq := cqrini.ReadFloat('DefFreq', '70cw', 432050); + 1: freq := cqrini.ReadFloat('DefFreq', '70ssb', 432300); + 2: freq := cqrini.ReadFloat('DefFreq', '70rtty', 432100); + 3: freq := cqrini.ReadFloat('DefFreq', '70am', 433600); + 4: freq := cqrini.ReadFloat('DefFreq', '70fm', 433500); end; //case end; @@ -1301,6 +1348,7 @@ begin mode := 'LSB'; end; end; + CheckUserMode(mode); if Assigned(radio) then begin @@ -1360,7 +1408,7 @@ begin dmUtils.SaveWindowPos(frmTRXControl); end; -procedure TfrmTRXControl.ClearButtonsColor; +procedure TfrmTRXControl.ClearBandButtonsColor; begin btn160m.Font.Color := COLOR_WINDOWTEXT; btn80m.Font.Color := COLOR_WINDOWTEXT; @@ -1374,6 +1422,15 @@ begin btn6m.Font.Color := COLOR_WINDOWTEXT; btn2m.Font.Color := COLOR_WINDOWTEXT; btn70cm.Font.Color := COLOR_WINDOWTEXT; + +end; +procedure TfrmTRXControl.ClearModeButtonsColor; +begin + btnCW.Font.Color := COLOR_WINDOWTEXT; + btnSSB.Font.Color := COLOR_WINDOWTEXT; + btnDATA.Font.Color := COLOR_WINDOWTEXT; + btnAM.Font.Color := COLOR_WINDOWTEXT; + btnFM.Font.Color := COLOR_WINDOWTEXT; end; function TfrmTRXControl.GetModeBand(var mode, band : String) : Boolean; @@ -1401,27 +1458,28 @@ begin end; procedure TfrmTRXControl.UpdateModeButtons(mode : String); +var + usermode :String; begin - btnCW.Font.Color := COLOR_WINDOWTEXT; - btnSSB.Font.Color := COLOR_WINDOWTEXT; - btnRTTY.Font.Color := COLOR_WINDOWTEXT; - btnAM.Font.Color := COLOR_WINDOWTEXT; - btnFM.Font.Color := COLOR_WINDOWTEXT; - if mode = 'CW' then - btnCW.Font.Color := clRed - else - if mode = 'SSB' then - btnSSB.Font.Color := clRed - else - if mode = 'RTTY' then - btnRTTY.Font.Color := clRed - else - if mode = 'AM' then - btnAM.Font.Color := clRed - else - if mode = 'FM' then - btnFM.Font.Color := clRed; + ClearModeButtonsColor; + usermode:=cqrini.ReadString('Band'+RigInUse, 'Datacmd', 'RTTY'); + + btnCW.Font.Color := COLOR_WINDOWTEXT; + btnSSB.Font.Color := COLOR_WINDOWTEXT; + btnDATA.Font.Color := COLOR_WINDOWTEXT; + btnAM.Font.Color := COLOR_WINDOWTEXT; + btnFM.Font.Color := COLOR_WINDOWTEXT; + + if mode = usermode then btnDATA.Font.Color := clRed + else + case mode of + 'CW' : btnCW.Font.Color := clRed; + 'SSB' : btnSSB.Font.Color := clRed; + 'AM' : btnAM.Font.Color := clRed; + 'FM' : btnFM.Font.Color := clRed; + end; + //update vfobuttons if vfo is known by radio.vfostr if Assigned(radio) then begin if radio.CanGetVfo then @@ -1446,7 +1504,6 @@ begin end; procedure TfrmTRXControl.Split(Up : Integer); - begin //we do split with XIT, no need to play with 2 VFOs if Assigned(radio) then @@ -1509,15 +1566,10 @@ begin end; procedure TfrmTRXControl.LoadUsrButtonCaptions; -var - r : Char; begin - if rbRadio1.Checked then r := '1' - else - r := '2'; - btnUsr1.Caption := cqrini.ReadString('TRX' + r, 'usr1name', 'Usr1'); - btnUsr2.Caption := cqrini.ReadString('TRX' + r, 'usr2name', 'Usr2'); - btnUsr3.Caption := cqrini.ReadString('TRX' + r, 'usr3name', 'Usr3'); + btnUsr1.Caption := cqrini.ReadString('TRX' + RigInUse, 'usr1name', 'Usr1'); + btnUsr2.Caption := cqrini.ReadString('TRX' + RigInUse, 'usr2name', 'Usr2'); + btnUsr3.Caption := cqrini.ReadString('TRX' + RigInUse, 'usr3name', 'Usr3'); end; procedure TfrmTRXControl.LoadButtonCaptions; @@ -1554,30 +1606,43 @@ end; procedure TfrmTRXControl.LoadBandButtons; begin - btn160MBand := dmUtils.GetBandFromFreq( - FloatToStr(cqrini.ReadFloat('DefFreq', '160cw', 1830) / 1000)); - btn80MBand := dmUtils.GetBandFromFreq( - FloatToStr(cqrini.ReadFloat('DefFreq', '80cw', 3525) / 1000)); - btn40MBand := dmUtils.GetBandFromFreq( - FloatToStr(cqrini.ReadFloat('DefFreq', '40cw', 7015) / 1000)); - btn30MBand := dmUtils.GetBandFromFreq( - FloatToStr(cqrini.ReadFloat('DefFreq', '30cw', 10110) / 1000)); - btn20MBand := dmUtils.GetBandFromFreq( - FloatToStr(cqrini.ReadFloat('DefFreq', '20cw', 14025) / 1000)); - btn17MBand := dmUtils.GetBandFromFreq( - FloatToStr(cqrini.ReadFloat('DefFreq', '17cw', 18080) / 1000)); - btn15MBand := dmUtils.GetBandFromFreq( - FloatToStr(cqrini.ReadFloat('DefFreq', '15cw', 21025) / 1000)); - btn12MBand := dmUtils.GetBandFromFreq( - FloatToStr(cqrini.ReadFloat('DefFreq', '12cw', 24895) / 1000)); - btn10MBand := dmUtils.GetBandFromFreq( - FloatToStr(cqrini.ReadFloat('DefFreq', '10cw', 28025) / 1000)); - btn6MBand := dmUtils.GetBandFromFreq( - FloatToStr(cqrini.ReadFloat('DefFreq', '6cw', 50090) / 1000)); - btn2MBand := dmUtils.GetBandFromFreq( - FloatToStr(cqrini.ReadFloat('DefFreq', '2cw', 144050) / 1000)); - btn70CMBand := dmUtils.GetBandFromFreq( - FloatToStr(cqrini.ReadFloat('DefFreq', '70cw', 430000) / 1000)); + btn160MBand := dmUtils.GetBandFromFreq(FloatToStr(cqrini.ReadFloat('DefFreq','160cw',1830)/1000)); + btn80MBand := dmUtils.GetBandFromFreq(FloatToStr(cqrini.ReadFloat('DefFreq','80cw',3525)/1000)); + btn40MBand := dmUtils.GetBandFromFreq(FloatToStr(cqrini.ReadFloat('DefFreq','40cw',7015)/1000)); + btn30MBand := dmUtils.GetBandFromFreq(FloatToStr(cqrini.ReadFloat('DefFreq','30cw',10110)/1000)); + btn20MBand := dmUtils.GetBandFromFreq(FloatToStr(cqrini.ReadFloat('DefFreq','20cw',14025)/1000)); + btn17MBand := dmUtils.GetBandFromFreq(FloatToStr(cqrini.ReadFloat('DefFreq','17cw',18080)/1000)); + btn15MBand := dmUtils.GetBandFromFreq(FloatToStr(cqrini.ReadFloat('DefFreq','15cw',21025)/1000)); + btn12MBand := dmUtils.GetBandFromFreq(FloatToStr(cqrini.ReadFloat('DefFreq','12cw',24895)/1000)); + btn10MBand := dmUtils.GetBandFromFreq(FloatToStr(cqrini.ReadFloat('DefFreq','10cw',28025)/1000)); + btn6MBand := dmUtils.GetBandFromFreq(FloatToStr(cqrini.ReadFloat('DefFreq','6cw',50090)/1000)); + btn2MBand := dmUtils.GetBandFromFreq(FloatToStr(cqrini.ReadFloat('DefFreq','2cw',144050)/1000)); + btn70CMBand := dmUtils.GetBandFromFreq(FloatToStr(cqrini.ReadFloat('DefFreq','70cw',430000)/1000)) +end; +procedure TfrmTRXControl.CheckUserMode(var mode : String); +var + usermode, + usercmd :String; +begin + usercmd:=cqrini.ReadString('Band'+RigInUse, 'Datacmd', 'RTTY'); + usermode:=cqrini.ReadString('Band'+RigInUse, 'Datamode', 'RTTY'); + + if ((Upcase(mode)='RTTY') or (Upcase(mode)=Upcase(usermode))) then + mode := usercmd; +end; +procedure TfrmTRXControl.SendVoice(mem : String); + +begin + if Assigned(radio) then + if radio.Voice then + radio.SendVoice(mem); +end; +procedure TfrmTRXControl.StopVoice; + +begin + if Assigned(radio) then + if radio.Voice then + radio.StopVoice; end; end. diff --git a/src/fWorkedGrids.pas b/src/fWorkedGrids.pas index 616c2e1..c4403dd 100644 --- a/src/fWorkedGrids.pas +++ b/src/fWorkedGrids.pas @@ -58,10 +58,10 @@ type procedure ToRigMode(mode: string); procedure ToRigBand(band: string); function RecordCount: string; - function WkdGrid(loc, band, mode: string): integer; //returns (0=not wkd, 1=main grid wkd, 2=wkd ) this band and mode - // (3=main grid wkd, 4=wkd ) this band but NOT this mode - // (5=main grid wkd, 6=wkd ) any other band or mode - function WkdCall(call, band, mode: string): integer; //returns wkd this b+m=1, this b=2, any b+m=3 + function WkdMainGrid(loc, band, mode: string): integer; + function WkdGrid(loc, band, mode: string): integer; + function WkdCall(call, band, mode: string): integer; + function WkdState(state, band, mode: string): integer; function GridOK(Loc: string): boolean; procedure UpdateMap; end; @@ -166,6 +166,7 @@ begin dmData.trW1.StartTransaction; try dmData.W1.Open; + dmData.W1.Last; RecordCount := dmData.W1.Fields[0].AsString; if (RecordCount = '') then RecordCount := '0'; @@ -176,6 +177,60 @@ begin end; end; +function TfrmWorkedGrids.WkdMainGrid(loc, band, mode: String): integer; +//returns 0=not wkd +// 1=main grid this band and mode +// 2=main grid this band but NOT this mode +// 3=main grid any other band/mode + +var + i : integer; + L2, + L4: String; + + Begin + if LocalDbg then Writeln('Start WkdMainGrid'); + WkdMainGrid := 0; + L4:= copy(loc, 1, 4); + L2:= copy(loc, 1, 2); + if cqrini.ReadBool('wsjt','wb4CLoc', False) then + daylimit := ' and qsodate >= '+#39+cqrini.ReadString('wsjt', 'wb4locdate','1900-01-01')+#39 //default date check all qsos + else + daylimit :=''; + + dmData.W.Close; + if dmData.trW.Active then dmData.trW.Rollback; + + try + dmData.W.SQL.Text :='select count(loc) as '+#39+'sum'+#39+' from '+LogTable+ + ' where loc like '+#39+L2+ '%'+#39+ + ' and band='+#39+band+#39+' and mode='+#39+mode+#39+daylimit+ + 'union all '+ + 'select count(loc) from '+LogTable+ + ' where loc like '+#39+L2+ '%'+#39+ + ' and band='+#39+band+#39+daylimit+ + 'union all '+ + 'select count(loc) from '+LogTable+ + ' where loc like '+#39+L2+ '%'+#39+daylimit; + + + if LocalDbg then Write('Main loc query: '); + dmData.W.Open; + i := 1; + while not dmData.W.Eof do + begin + if LocalDbg then writeln(dmData.W.FieldByName('sum').AsInteger); + if (dmData.W.FieldByName('sum').AsInteger > 0 ) and (WkdMainGrid = 0) then WkdMainGrid := i; + inc(i); + dmData.W.Next; + end; + dmData.W.Close; + finally + dmData.trW.Rollback; + end; + if LocalDbg then Writeln('WkdMainGrid is:', WkdMainGrid); + end; + function TfrmWorkedGrids.WkdGrid(loc, band, mode: String): integer; //returns 0=not wkd @@ -188,10 +243,14 @@ function TfrmWorkedGrids.WkdGrid(loc, band, mode: String): integer; var i : integer; + L2, + L4: String; begin if LocalDbg then Writeln('Start WkdGrid'); WkdGrid := 0; + L4:= copy(loc, 1, 4); + L2:= copy(loc, 1, 2); if cqrini.ReadBool('wsjt','wb4CLoc', False) then daylimit := ' and qsodate >= '+#39+cqrini.ReadString('wsjt', 'wb4locdate','1900-01-01')+#39 //default date check all qsos else @@ -202,26 +261,26 @@ begin try dmData.W.SQL.Text := 'select count(loc) as '+#39+'sum'+#39+' from '+LogTable+ - ' where loc like '+#39+copy(loc, 1, 4)+ '%'+#39+ + ' where loc like '+#39+L4+ '%'+#39+ ' and band='+#39+band+#39+' and mode='+#39+mode+#39+daylimit+ 'union all '+ 'select count(loc) from '+LogTable+ - ' where loc like '+#39+copy(loc, 1, 4)+ '%'+#39+ + ' where loc like '+#39+L4+ '%'+#39+ ' and band='+#39+band+#39+daylimit+ 'union all '+ 'select count(loc) from '+LogTable+ - ' where loc like '+#39+copy(loc, 1, 4)+ '%'+#39+daylimit+ + ' where loc like '+#39+L4+ '%'+#39+daylimit+ 'union all '+ 'select count(loc) from '+LogTable+ - ' where loc like '+#39+copy(loc, 1, 2)+ '%'+#39+ + ' where loc like '+#39+L2+ '%'+#39+ ' and band='+#39+band+#39+' and mode='+#39+mode+#39+daylimit+ 'union all '+ 'select count(loc) from '+LogTable+ - ' where loc like '+#39+copy(loc, 1, 2)+ '%'+#39+ + ' where loc like '+#39+L2+ '%'+#39+ ' and band='+#39+band+#39+daylimit+ 'union all '+ 'select count(loc) from '+LogTable+ - ' where loc like '+#39+copy(loc, 1, 2)+ '%'+#39+daylimit ; + ' where loc like '+#39+L2+ '%'+#39+daylimit ; if LocalDbg then Write('loc query: '); dmData.W.Open; @@ -295,6 +354,55 @@ begin end; if LocalDbg then Writeln('WkdCall is:', WkdCall); end; +function TfrmWorkedGrids.WkdState(state, band, mode: string): integer; +//returns 0=not wkd +// 1= this band and mode +// 2=this band but NOT this mode +// 3=any other band or mode + +var + i : integer; + daylimit : String; + +begin + if LocalDbg then Writeln('Start WkdState'); + if cqrini.ReadBool('wsjt','wb4CCall', False) then + daylimit := ' and qsodate >= '+#39+cqrini.ReadString('wsjt', 'wb4Calldate','1900-01-01')+#39 //default date check all qsos + else + daylimit :=''; + + WkdState := 0; + dmData.W.Close; + if dmData.trW.Active then dmData.trW.Rollback; + try + dmData.W.SQL.Text := 'select count(state) as '+#39+'sum'+#39+' from '+LogTable+ + ' where state='+#39+state+#39+ + ' and band='+#39+band+#39+' and mode='+#39+mode+#39+daylimit+ + 'union all '+ + 'select count(state) from '+LogTable+ + ' where state='+#39+state+#39+ + ' and band='+#39+band+#39+daylimit+ + 'union all '+ + 'select count(state) from '+LogTable+ + ' where state='+#39+state+#39+daylimit; + + if LocalDbg then Write('state query: '); + dmData.W.Open; + i := 1; + while not dmData.W.Eof do + begin + if LocalDbg then writeln(dmData.W.FieldByName('sum').AsInteger); + if (dmData.W.FieldByName('sum').AsInteger > 0 ) and (WkdState = 0) then WkdState := i; + inc(i); + dmData.W.Next; + end; + dmData.W.Close; + finally + dmData.trW.Rollback; + end; + if LocalDbg then Writeln('WkdState is:', WkdState); +end; + //mark grid worked with confirmed status (red/green) procedure TfrmWorkedGrids.MarkGrid(LocGrid: string; Cfmd: boolean; MCanvas: TCanvas; SubBase: boolean); diff --git a/src/feQSLDownload.lfm b/src/feQSLDownload.lfm index 0c34063..d1904b5 100644 --- a/src/feQSLDownload.lfm +++ b/src/feQSLDownload.lfm @@ -1,36 +1,47 @@ object frmeQSLDownload: TfrmeQSLDownload - Left = 518 + Left = 539 Height = 606 - Top = 83 - Width = 481 + Top = 120 + Width = 572 Caption = 'Download data from eQSL.cc' ClientHeight = 606 - ClientWidth = 481 + ClientWidth = 572 OnClose = FormClose OnShow = FormShow - LCLVersion = '2.0.4.0' + LCLVersion = '2.2.6.0' object GroupBox1: TGroupBox AnchorSideLeft.Control = Owner AnchorSideTop.Control = Panel1 AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom - Left = 0 - Height = 408 - Top = 152 - Width = 481 + Left = 1 + Height = 397 + Top = 162 + Width = 570 Align = alClient Anchors = [akTop, akLeft, akRight] + BorderSpacing.Left = 1 + BorderSpacing.Top = 1 + BorderSpacing.Right = 1 Caption = 'Progress' - ClientHeight = 390 - ClientWidth = 479 + ClientHeight = 379 + ClientWidth = 568 TabOrder = 0 object mStat: TMemo - Left = 0 - Height = 390 - Top = 0 - Width = 479 + AnchorSideLeft.Control = GroupBox1 + AnchorSideTop.Control = GroupBox1 + AnchorSideRight.Control = GroupBox1 + AnchorSideBottom.Control = GroupBox1 + Left = 1 + Height = 377 + Top = 1 + Width = 566 Align = alClient + BorderSpacing.Left = 1 + BorderSpacing.Top = 1 + BorderSpacing.Right = 1 + BorderSpacing.Bottom = 1 OnChange = mStatChange ScrollBars = ssAutoBoth TabOrder = 0 @@ -41,50 +52,46 @@ object frmeQSLDownload: TfrmeQSLDownload AnchorSideTop.Control = Owner AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner - Left = 0 - Height = 152 - Top = 0 - Width = 481 + Left = 1 + Height = 160 + Top = 1 + Width = 570 Align = alTop + BorderSpacing.Left = 1 + BorderSpacing.Top = 1 + BorderSpacing.Right = 1 BevelOuter = bvNone - ClientHeight = 152 - ClientWidth = 481 + ClientHeight = 160 + ClientWidth = 570 TabOrder = 1 - object btnDownload: TButton - AnchorSideLeft.Control = GroupBox5 - AnchorSideLeft.Side = asrCenter - AnchorSideTop.Control = GroupBox5 - AnchorSideTop.Side = asrBottom - Left = 72 - Height = 25 - Top = 126 - Width = 337 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 6 - Caption = 'Download data from eQSL website' - OnClick = btnDownloadClick - TabOrder = 0 - end - object GroupBox5: TGroupBox + object gbSettings: TGroupBox AnchorSideLeft.Control = Panel1 AnchorSideTop.Control = Panel1 - Left = 0 - Height = 120 - Top = 0 - Width = 480 - Anchors = [akTop, akLeft, akRight] - Caption = ' ' - ClientHeight = 102 - ClientWidth = 478 - TabOrder = 1 + AnchorSideRight.Control = Panel1 + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = Panel1 + AnchorSideBottom.Side = asrCenter + Left = 1 + Height = 158 + Top = 1 + Width = 568 + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Left = 1 + BorderSpacing.Top = 1 + BorderSpacing.Right = 1 + BorderSpacing.Bottom = 1 + Caption = 'Settings' + ClientHeight = 140 + ClientWidth = 566 + TabOrder = 0 object Label3: TLabel - AnchorSideLeft.Control = GroupBox5 + AnchorSideLeft.Control = gbSettings AnchorSideTop.Control = edtDateFrom AnchorSideTop.Side = asrCenter Left = 12 Height = 17 Top = 9 - Width = 259 + Width = 260 BorderSpacing.Left = 12 Caption = 'Return QSL records received on or after ' ParentColor = False @@ -92,34 +99,36 @@ object frmeQSLDownload: TfrmeQSLDownload object edtDateFrom: TEdit AnchorSideLeft.Control = Label3 AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = GroupBox5 - Left = 277 + AnchorSideTop.Control = gbSettings + Left = 275 Height = 34 Top = 0 - Width = 85 - BorderSpacing.Left = 6 + Width = 190 + BorderSpacing.Left = 3 TabOrder = 0 end object chkShowNew: TCheckBox - AnchorSideLeft.Control = Label4 - AnchorSideTop.Control = edtQTH + AnchorSideLeft.Control = chkChangeDate + AnchorSideTop.Control = chkChangeDate AnchorSideTop.Side = asrBottom Left = 12 Height = 23 - Top = 74 - Width = 382 + Top = 103 + Width = 383 BorderSpacing.Top = 3 Caption = 'Show new comfirmed QSOs after download and import' TabOrder = 1 end object Label4: TLabel - AnchorSideLeft.Control = Label3 AnchorSideTop.Control = edtQTH AnchorSideTop.Side = asrCenter - Left = 12 + AnchorSideRight.Control = edtQTH + Left = 174 Height = 17 Top = 46 Width = 98 + Anchors = [akTop, akRight] + BorderSpacing.Right = 3 Caption = 'QTH Nickname' ParentColor = False end @@ -127,13 +136,26 @@ object frmeQSLDownload: TfrmeQSLDownload AnchorSideLeft.Control = edtDateFrom AnchorSideTop.Control = edtDateFrom AnchorSideTop.Side = asrBottom - Left = 277 + Left = 275 Height = 34 Top = 37 - Width = 184 + Width = 190 BorderSpacing.Top = 3 TabOrder = 2 end + object chkChangeDate: TCheckBox + AnchorSideLeft.Control = Label3 + AnchorSideTop.Control = edtQTH + AnchorSideTop.Side = asrBottom + Left = 12 + Height = 23 + Top = 77 + Width = 424 + BorderSpacing.Top = 6 + Caption = 'Set Rcvd date to be current date -1 after succesfull download' + OnChange = chkChangeDateChange + TabOrder = 3 + end end end object Panel2: TPanel @@ -142,21 +164,24 @@ object frmeQSLDownload: TfrmeQSLDownload AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom - Left = 0 + Left = 1 Height = 46 - Top = 560 - Width = 481 + Top = 559 + Width = 570 Align = alBottom + BorderSpacing.Left = 1 + BorderSpacing.Right = 1 + BorderSpacing.Bottom = 1 BevelOuter = bvNone ClientHeight = 46 - ClientWidth = 481 + ClientWidth = 570 TabOrder = 2 object btnClose: TButton AnchorSideTop.Control = Panel2 AnchorSideTop.Side = asrCenter AnchorSideRight.Control = Panel2 AnchorSideRight.Side = asrBottom - Left = 397 + Left = 486 Height = 25 Top = 11 Width = 72 @@ -180,5 +205,19 @@ object frmeQSLDownload: TfrmeQSLDownload OnClick = btnPreferencesClick TabOrder = 1 end + object btnDownload: TButton + AnchorSideLeft.Control = Panel2 + AnchorSideLeft.Side = asrCenter + AnchorSideTop.Control = Panel2 + AnchorSideTop.Side = asrCenter + Left = 135 + Height = 25 + Top = 11 + Width = 300 + BorderSpacing.Top = 6 + Caption = 'Download data from eQSL website' + OnClick = btnDownloadClick + TabOrder = 2 + end end end diff --git a/src/feQSLDownload.pas b/src/feQSLDownload.pas index 53476b8..66624d0 100644 --- a/src/feQSLDownload.pas +++ b/src/feQSLDownload.pas @@ -6,7 +6,7 @@ interface uses Classes,SysUtils,FileUtil,LResources,Forms,Controls,Graphics,Dialogs,StdCtrls, - ExtCtrls, blcksock, httpsend, synacode, LazFileUtils; + ExtCtrls, blcksock, httpsend, synacode, LazFileUtils, DateUtils; type @@ -14,13 +14,14 @@ type TfrmeQSLDownload = class(TForm) btnClose : TButton; - btnDownload : TButton; + btnDownload: TButton; btnPreferences : TButton; + chkChangeDate: TCheckBox; chkShowNew : TCheckBox; edtDateFrom : TEdit; edtQTH: TEdit; GroupBox1 : TGroupBox; - GroupBox5 : TGroupBox; + gbSettings : TGroupBox; Label3 : TLabel; Label4: TLabel; mStat : TMemo; @@ -28,6 +29,7 @@ type Panel2 : TPanel; procedure btnDownloadClick(Sender : TObject); procedure btnPreferencesClick(Sender : TObject); + procedure chkChangeDateChange(Sender: TObject); procedure FormClose(Sender : TObject; var CloseAction : TCloseAction); procedure FormShow(Sender : TObject); procedure mStatChange(Sender: TObject); @@ -54,7 +56,8 @@ begin dmUtils.LoadWindowPos(frmeQSLDownload); edtDateFrom.Text := cqrini.ReadString('eQSLImp','DateFrom',edtDateFrom.Text); edtQTH.Text := cqrini.ReadString('eQSL','QTH',''); - chkShowNew.Checked := cqrini.ReadBool('eQSLImp','ShowNewQSOs',True) + chkShowNew.Checked := cqrini.ReadBool('eQSLImp','ShowNewQSOs',True); + chkChangeDate.Checked:=cqrini.ReadBool('eQSLImp','ChangeDate',False); end; procedure TfrmeQSLDownload.mStatChange(Sender: TObject); @@ -212,6 +215,11 @@ begin Free end; mStat.Lines.Add('Import complete ...'); + if chkChangeDate.Checked then + Begin + edtDateFrom.Caption:= FormatDateTime('YYYY-MM-DD', IncDay(Today, -1)); + cqrini.WriteString('eQSLImp','DateFrom',FormatDateTime('YYYY-MM-DD', IncDay(Today, -1))); + end; Repaint; Application.ProcessMessages; if chkShowNew.Checked then @@ -270,5 +278,10 @@ begin end end; +procedure TfrmeQSLDownload.chkChangeDateChange(Sender: TObject); +begin + cqrini.WriteBool('eQSLImp','ChangeDate',chkChangeDate.Checked); +end; + end. diff --git a/src/frCWKeys.pas b/src/frCWKeys.pas index 4e662d4..beed07c 100644 --- a/src/frCWKeys.pas +++ b/src/frCWKeys.pas @@ -60,7 +60,7 @@ type implementation -uses dUtils, fNewQSO, uMyIni, dData, fCWType; +uses dUtils, fNewQSO, uMyIni, dData, fCWType, fContest; {$R *.lfm} @@ -105,6 +105,7 @@ procedure TfraCWKeys.btnF1MouseEnter(Sender: TObject); begin self.lblToShowMouseOverTextCwKeys.Caption:=dmUtils.GetCWMessage('F1',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''); end; @@ -112,6 +113,7 @@ procedure TfraCWKeys.btnF10MouseEnter(Sender: TObject); begin self.lblToShowMouseOverTextCwKeys.Caption:=dmUtils.GetCWMessage('F10',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''); end; @@ -129,6 +131,7 @@ procedure TfraCWKeys.btnF2MouseEnter(Sender: TObject); begin self.lblToShowMouseOverTextCwKeys.Caption:=dmUtils.GetCWMessage('F2',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''); end; @@ -141,6 +144,7 @@ procedure TfraCWKeys.btnF3MouseEnter(Sender: TObject); begin self.lblToShowMouseOverTextCwKeys.Caption:=dmUtils.GetCWMessage('F3',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''); end; @@ -153,6 +157,7 @@ procedure TfraCWKeys.btnF4MouseEnter(Sender: TObject); begin self.lblToShowMouseOverTextCwKeys.Caption:=dmUtils.GetCWMessage('F4',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''); end; @@ -165,6 +170,7 @@ procedure TfraCWKeys.btnF5MouseEnter(Sender: TObject); begin self.lblToShowMouseOverTextCwKeys.Caption:=dmUtils.GetCWMessage('F5',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''); end; @@ -177,6 +183,7 @@ procedure TfraCWKeys.btnF6MouseEnter(Sender: TObject); begin self.lblToShowMouseOverTextCwKeys.Caption:=dmUtils.GetCWMessage('F6',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''); end; @@ -189,6 +196,7 @@ procedure TfraCWKeys.btnF7MouseEnter(Sender: TObject); begin self.lblToShowMouseOverTextCwKeys.Caption:=dmUtils.GetCWMessage('F7',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''); end; @@ -201,6 +209,7 @@ procedure TfraCWKeys.btnF8MouseEnter(Sender: TObject); begin self.lblToShowMouseOverTextCwKeys.Caption:=dmUtils.GetCWMessage('F8',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''); end; @@ -213,6 +222,7 @@ procedure TfraCWKeys.btnF9MouseEnter(Sender: TObject); begin self.lblToShowMouseOverTextCwKeys.Caption:=dmUtils.GetCWMessage('F9',frmNewQSO.edtCall.Text, frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text, + frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text, frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''); end; @@ -273,17 +283,32 @@ begin end; procedure TfraCWKeys.UpdateFKeyLabels; +var n,f:integer; begin - btnF1.Caption := cqrini.ReadString('CW','CapF1','CQ'); - btnF2.Caption := cqrini.ReadString('CW','CapF2','F2'); - btnF3.Caption := cqrini.ReadString('CW','CapF3','F3'); - btnF4.Caption := cqrini.ReadString('CW','CapF4','F4'); - btnF5.Caption := cqrini.ReadString('CW','CapF5','F5'); - btnF6.Caption := cqrini.ReadString('CW','CapF6','F6'); - btnF7.Caption := cqrini.ReadString('CW','CapF7','F7'); - btnF8.Caption := cqrini.ReadString('CW','CapF8','F8'); - btnF9.Caption := cqrini.ReadString('CW','CapF9','F9'); - btnF10.Caption := cqrini.ReadString('CW','CapF10','F10') + if (frmContest.Showing) and ( not (cqrini.ReadBool('CW','S&P',True))) then //if contest and run mode keys are F11-F20 + n:=11 + else + n:=1; + + btnF1.Caption := cqrini.ReadString('CW','CapF'+IntToStr(n),'CQ'); + inc(n); + btnF2.Caption := cqrini.ReadString('CW','CapF'+IntToStr(n),'F2'); + inc(n); + btnF3.Caption := cqrini.ReadString('CW','CapF'+IntToStr(n),'F3'); + inc(n); + btnF4.Caption := cqrini.ReadString('CW','CapF'+IntToStr(n),'F4'); + inc(n); + btnF5.Caption := cqrini.ReadString('CW','CapF'+IntToStr(n),'F5'); + inc(n); + btnF6.Caption := cqrini.ReadString('CW','CapF'+IntToStr(n),'F6'); + inc(n); + btnF7.Caption := cqrini.ReadString('CW','CapF'+IntToStr(n),'F7'); + inc(n); + btnF8.Caption := cqrini.ReadString('CW','CapF'+IntToStr(n),'F8'); + inc(n); + btnF9.Caption := cqrini.ReadString('CW','CapF'+IntToStr(n),'F9'); + inc(n); + btnF10.Caption := cqrini.ReadString('CW','CapF'+IntToStr(n),'F10') end; end. diff --git a/src/gline2.pas b/src/gline2.pas index 51bff1e..826b467 100644 --- a/src/gline2.pas +++ b/src/gline2.pas @@ -54,8 +54,10 @@ var star_time_u:extended; type Tgrayline=object GC_LWidth : integer; //plot line wdth; + GB_LWidth : integer; GC_SP_Color : TColor; GC_LP_Color : TColor; + GC_BE_Color : TColor; const GC_Points_Max = 5000; constructor init(naz_sou:string); destructor done; @@ -71,7 +73,8 @@ type // procedure GC_line_width(LWidth:Integer); //set plot line width procedure GC_line_part(x1,y1,x2,y2:double); //add ShortPath point procedure GC_Lline_part(x1,y1,x2,y2:double); //add LongPath point - procedure GC_line_clear(what:integer=-1); //clear S&LPath points + procedure GC_Bline_part(x1,y1,x2,y2:double); //add Beam point + procedure GC_line_clear(what:integer=-1); //clear S&L and Beam Path points private nrd:boolean; //needs to redraw (a new calculation has been made) @@ -100,7 +103,10 @@ type GCpointer:longint; GC_Lpoint:array[0..GC_points_Max] of TGC_point; //LongPath array GCLpointer:longint; - LP : boolean; //set LongPath color; + GC_Bpoint:array[0..GC_points_Max] of TGC_point; //LongPath array + GCBpointer:longint; + + LP : integer; function calc_horizontalx(var coord:t_coord; date:TDateTime; z:longint;latitude: extended):longint; end; @@ -436,10 +442,6 @@ begin end; - - - - constructor Tgrayline.init(naz_sou:string); var e,z:longint; a:extended; @@ -717,11 +719,16 @@ var can.pen.Width:=5; can.moveto(x1,y1); can.lineto(x2,y2); } - If LP then - can.pen.color:=GC_LP_Color - else - can.pen.color:=GC_SP_Color; can.pen.Width:=GC_LWidth; + Case LP of + 0: can.pen.color:=GC_SP_Color; + 1: can.pen.color:=GC_LP_Color; + 2: Begin + can.pen.color:=GC_BE_Color; + can.pen.Width:=GB_LWidth;; + end; + end; + can.moveto(x1,y1); can.lineto(x2,y2); end; @@ -888,22 +895,31 @@ begin if caraen then //caraen = do begin + LP:=0; cmarni(carax1,caray1,carax2,caray2,true); // can.Font.Color:=clBlack; // can.TextOut(10,10,' '+inttostr(round(carax1))+':'+inttostr(round(caray1))+' '); // can.TextOut(10,30,' '+inttostr(round(carax2))+':'+inttostr(round(caray2))+' '); end; - - if GCpointer+GCLpointer > 0 then //same as OR + if GCLpointer > 0 then begin - LP:=True; //LongPath color plotting - for z:=0 to GCLpointer-1 do + LP:=1; //LongPath color plotting + for z:=0 to GCLpointer-1 do cmarni(GC_Lpoint[z].La1, GC_Lpoint[z].Lo1, GC_Lpoint[z].La2, GC_Lpoint[z].Lo2, false); - LP:=False; //ShortPath color plotting - for z:=0 to GCpointer-1 do + end; + if GCpointer > 0 then + begin + LP:=0; //ShortPath color plotting + for z:=0 to GCpointer-1 do cmarni(GC_point[z].La1, GC_point[z].Lo1, GC_point[z].La2, GC_point[z].Lo2, false); - end; + end; + if GCBpointer > 0 then + Begin + LP:=2; //Beam color plotting + for z:=0 to GCBpointer-1 do + cmarni(GC_Bpoint[z].La1, GC_Bpoint[z].Lo1, GC_Bpoint[z].La2, GC_Bpoint[z].Lo2, false); + end; for z:=0 to body_poc-1 do begin @@ -1000,17 +1016,36 @@ Begin inc(GCLpointer); end; end; +procedure Tgrayline.GC_Bline_part(x1,y1,x2,y2:double); + +Begin + if chcipni then exit; //chcipni = "die" + if GCBpointer < GC_Points_max then + begin + GC_Bpoint[GCBpointer].La1:=x1; + GC_Bpoint[GCBpointer].Lo1:=y1; + GC_Bpoint[GCBpointer].La2:=x2; + GC_Bpoint[GCBpointer].Lo2:=y2; + inc(GCBpointer); + end; +end; procedure Tgrayline.GC_line_clear(what:integer=-1); begin case what of - -1: Begin + -1: Begin //all + GCpointer:=0; + GCLpointer:=0; + GCBpointer:=0; + end; + 0: GCpointer:=0; //short path + 1: GCLpointer:=0; //long path + 2: GCBpointer:=0; //beam path + 3: Begin //short and long path GCpointer:=0; GCLpointer:=0; end; - 0: GCpointer:=0; - 1: GCLpointer:=0; end; end; { diff --git a/src/uCWKeying.pas b/src/uCWKeying.pas index 55919c4..c0680cd 100644 --- a/src/uCWKeying.pas +++ b/src/uCWKeying.pas @@ -5,7 +5,7 @@ unit uCWKeying; interface uses - Classes, SysUtils, synaser, synautil, lNet, lNetComponents, Forms; + Classes, SysUtils, synaser, synautil, lNet, lNetComponents, Forms, Dialogs, StrUtils; type TKeyType = (ktCWdaemon, ktWinKeyer); type TKeyStatus = (ksReady, ksBusy); @@ -18,6 +18,8 @@ type fLastErrSt : String; fDevice : String; fDebugMode : Boolean; + fHamlibBuffer : Boolean; + fIsNewHamlib : Boolean; //Hamlib version date higer than 2023-06-01 fMinSpeed : Word; fMaxSpeed : Word; fPortSpeed : dWord; @@ -30,6 +32,8 @@ type property MinSpeed : Word read fMinSpeed; property MaxSpeed : Word read fMaxSpeed; property PortSpeed : dWord read fPortSpeed write fPortSpeed; + property HamlibBuffer : Boolean read fHamlibBuffer write fHamlibBuffer; + property IsNewHamlib : Boolean read fIsNewHamlib; //used internally, but can give info out constructor Create; virtual; abstract; @@ -40,6 +44,7 @@ type procedure Close; virtual; abstract; procedure SetSpeed(speed : Word); virtual; abstract; procedure SendText(text : String); virtual; abstract; + procedure SendHex(text:String); virtual; abstract; procedure StopSending; virtual; abstract; procedure DelLastChar; virtual; abstract; procedure SetMixManSpeed(min,max : Word); virtual; abstract; @@ -64,6 +69,7 @@ type procedure Close; override; procedure SetSpeed(speed : Word); override; procedure SendText(text : String); override; + procedure SendHex(text:String); override; procedure StopSending; override; procedure DelLastChar; override; procedure SetMixManSpeed(min,max : Word); override; @@ -87,6 +93,7 @@ type procedure Close; override; procedure SetSpeed(speed : Word); override; procedure SendText(text : String); override; + procedure SendHex(text:String); override; procedure StopSending; override; procedure DelLastChar; override; procedure SetMixManSpeed(min,max : Word); override; @@ -110,6 +117,7 @@ type procedure Close; override; procedure SetSpeed(speed : Word); override; procedure SendText(text : String); override; + procedure SendHex(text:String); override; procedure StopSending; override; procedure DelLastChar; override; procedure SetMixManSpeed(min,max : Word); override; @@ -121,6 +129,7 @@ type private ParamChkVfo: boolean; WaitChkVfo: integer; + WaitHamlib: boolean; VfoStr : String; AllowCW : Boolean; fActive : Boolean; @@ -142,6 +151,7 @@ type procedure WaitMorse; procedure SetSpeed(speed : Word); override; procedure SendText(text : String); override; + procedure SendHex(text:String); override; procedure StopSending; override; procedure DelLastChar; override; procedure SetMixManSpeed(min,max : Word); override; @@ -152,7 +162,7 @@ type implementation -uses fTRXControl; +uses fTRXControl, uMyIni; constructor TCWWinKeyerUSB.Create; begin @@ -161,7 +171,8 @@ begin ser := TBlockserial.Create; ser.LinuxLock := False; fMinSpeed := 5; - fMaxSpeed := 60 + fMaxSpeed := 60; + fIsNewHamlib :=false; end; procedure TCWWinKeyerUSB.Open; @@ -226,6 +237,7 @@ end; procedure TCWWinKeyerUSB.SetSpeed(speed : Word); begin if fDebugMode then Writeln('Speed: ',speed); + if cqrini.ReadBool('CW'+IntToStr(frmTRXControl.cmbRig.ItemIndex),'PotSpeed',False) then exit; fSpeed := speed; ser.Flush; ser.SendByte(2); @@ -363,7 +375,7 @@ begin ser.SendString('A'); ser.SendString('C'); end; -{ 'ß' : begin + { 'ß' : begin ser.SendByte($1B); ser.SendString('S'); ser.SendString('Z'); @@ -394,6 +406,61 @@ begin ser.SendString(text) end; +procedure TCWWinKeyerUSB.SendHex(text : String); +var + H : String; + p : integer; + index :integer; + paramList :TStringList; + +function send(ok:boolean):boolean; +Begin + Result:=true; + try + index:=0; + paramList := TStringList.Create; + paramList.Delimiter := ','; + paramList.DelimitedText := text; + while index < paramList.Count do + begin + try + if Pos('X', paramList[index])>0 then + H:=copy(paramList[index],Pos('X', paramList[index])+1,2) + else + H:= paramList[index]; + p:=Hex2Dec(H); + except + on E: Exception do + Begin + ShowMessage( ' Hex error: '+paramList[index]+' '+ E.ClassName + #13#10 + E.Message ); + Result:=false; + exit; + end; + end; + if p>255 then + Begin + ShowMessage( ' Hex error: '+paramList[index]+' Value too big' ); + Result:=false; + exit; + end; + if fDebugMode and ok then Writeln('Sending value: ',paramList[index],'=',p); + if ok then ser.SendByte(p); + inc(index); + end; + + paramList.Free; + finally + //Done all + end; +end; + +begin + //test hex conversion + if not send(false) then exit; + //if passed do real send + send(true); +end; + procedure TCWWinKeyerUSB.Close; begin ser.SendByte(0); @@ -518,6 +585,10 @@ begin else udp.SendMessage(text) end; +procedure TCWDaemon.SendHex(text : String); +Begin + //not implemented +end; procedure TCWDaemon.Close; begin @@ -667,6 +738,60 @@ begin else ser.SendString(text) end; +procedure TCWK3NG.SendHex(text : String); + var + H : String; + p : integer; + index :integer; + paramList :TStringList; + + function send(ok:boolean):boolean; + Begin + Result:=true; + try + index:=0; + paramList := TStringList.Create; + paramList.Delimiter := ','; + paramList.DelimitedText := text; + while index < paramList.Count do + begin + try + if Pos('X', paramList[index])>0 then + H:=copy(paramList[index],Pos('X', paramList[index])+1,2) + else + H:= paramList[index]; + p:=Hex2Dec(H); + except + on E: Exception do + Begin + ShowMessage( ' Hex error: '+paramList[index]+' '+ E.ClassName + #13#10 + E.Message ); + Result:=false; + exit; + end; + end; + if p>255 then + Begin + ShowMessage( ' Hex error: '+paramList[index]+' Value too big' ); + Result:=false; + exit; + end; + if fDebugMode and ok then Writeln('Sending value: ',paramList[index],'=',p); + if ok then ser.SendByte(p); + inc(index); + end; + + paramList.Free; + finally + //Done all + end; + end; + + begin + //test hex conversion + if not send(false) then exit; + //if passed do real send + send(true); + end; procedure TCWK3NG.Close; begin @@ -693,7 +818,8 @@ begin tcp.OnConnect := @OnHamLibConnect; tcp.OnError := @onHamLibError; fMinSpeed := 5; - fMaxSpeed := 60 + fMaxSpeed := 60; + fHamlibBuffer := false; end; procedure TCWHamLib.OnHamLibConnect(aSocket: TLSocket); @@ -702,12 +828,15 @@ begin if DebugMode then Writeln('CWint connected to hamlib'); + fIsNewHamlib := false; + WaitHamlib := True; VfoStr := ''; ParamChkVfo :=false; WaitChkVfo:=5; // wait max 5 rcvd blocks tcp.SendMessage('+\chk_vfo'+LineEnding); if DebugMode then Writeln('CW send +\chk_vfo'); + end; procedure TCWHamLib.OnReceived(aSocket: TLSocket); @@ -715,6 +844,7 @@ begin if aSocket.GetMessage(Rmsg) > 0 then begin Rmsg := StringReplace(Rmsg,LineEnding,' ',[rfReplaceAll]); + if (( not ParamChkVfo ) and (WaitChkVfo>0))then Begin dec(WaitChkVfo); @@ -725,10 +855,28 @@ begin if DebugMode then Writeln('CW commands need parameter: ',VfoStr); WaitChkVfo:=0; - SetSpeed(fSpeed); + tcp.SendMessage('+\dump_caps'+LineEnding); + if DebugMode then + Writeln('CW send +\dump_caps'); end; ParamChkVfo:= WaitChkVfo < 1; end; + + if (pos('HAMLIB VERSION:',Uppercase(Rmsg))>0) and WaitHamlib then + Begin + fIsNewHamlib:=true; + WaitHamlib:=False; + if DebugMode then + Writeln('Hamlib is new'); + end; + if (pos('OVERALL BACKEND WARNINGS:',Uppercase(Rmsg))>0) then //+\dump_caps end + Begin + WaitHamlib:=False; + if DebugMode then + Writeln('End of +\dump_caps'); + SetSpeed(fSpeed); + end; + if DebugMode then Writeln('HLresp MSG:',Rmsg,':'); end; @@ -756,9 +904,9 @@ begin tcp.Connect(fDevice,StrToInt(fPort)); end; -procedure TCWHamLib.WaitMorse; +procedure TCWHamLib.WaitMorse; //not used and not confirmed to exist via initialize rig/dump_caps begin - tcp.SendMessage('\wait_morse'+VfoStr+LineEnding); + tcp.SendMessage('\wait_morse'+LineEnding); if DebugMode then Writeln('CW: \wait_morse'); end; @@ -811,17 +959,22 @@ end; procedure TCWHamLib.StopSending; begin AllowCW := false; - //not implemented in hamlib command set + if fIsNewHamlib then + tcp.SendMessage('+\stop_morse'+LineEnding) + //implemented in hamlib command set from 2023 (at least) + else + Begin //sending 0xFF as text works with Icom - tcp.SendMessage('b'+#$0FF+LineEnding); + tcp.SendMessage('b'+#$0FF+LineEnding); //All chrs are spaces stops cw for kenwood. Empty chrs (max24) in buffer are filled with spaces. // (info by ts480 manual, not tested) - tcp.SendMessage('b '+LineEnding); + tcp.SendMessage('b '+LineEnding); + end; end; procedure TCWHamLib.SendText(text : String); const - _REPEATS = 500; //times + _REPEATS = 300; //times _TIMEOUT = 20; //x10-milliseconds var c, i, @@ -829,35 +982,50 @@ var rpt : integer; Wcw : char; dSpd: integer; + + //----------------------------------------------------------------------------------- Procedure SendToHamlib(t:string); Begin - tout :=_TIMEOUT; //used away in sleep(10) bloks + tout :=_TIMEOUT; //used away in sleep(10) blocks rpt := _REPEATS; while ((rpt > 0) and AllowCW) do Begin - if fDebugMode then - Writeln('HLsend MSG:','b'+t+':'); + if fIsNewHamlib then + t:=' '+t; + if fDebugMode then + Writeln('HLsend MSG: |','b'+t+'|'); Rmsg:=''; tcp.SendMessage('b'+t+LineEnding); dec(rpt); repeat begin sleep(10); + if fDebugMode then + Writeln('Waiting RPRT'); Application.ProcessMessages; dec(tout); end; until ((pos('RPRT',Rmsg)>0) or (tout < 1 )); - if fDebugMode then Writeln(' Ack timeout left: ',tout,'(/',_TIMEOUT,')'); - if fDebugMode then Writeln(' Repeats left: ',rpt,'(/',_REPEATS,')'); + tout :=_TIMEOUT; + if fDebugMode then + Begin + Writeln('rcvd:',Rmsg); + Writeln(' Ack timeout left: ',tout,'(/',_TIMEOUT,')x10 msec'); + Writeln(' Repeats left: ',rpt,'(/',_REPEATS,') times'); + end; if pos('-9',Rmsg)>0 then Begin - dec(rpt); - sleep(300); + if fDebugMode then + Writeln('Waiting before repeat because of RPRT-9'); + dec(rpt); + sleep(50); end else rpt :=0; + if fDebugMode then + Writeln('Ready for next'); end; end; @@ -885,7 +1053,8 @@ begin AllowCW := true; //different rigs support different length of b-command. 10chr should be safe for all c:= length(text); - if (c>10) or (pos('+',text)>0) or (pos('-',text)>0) then + if ((c>10) or (pos('+',text)>0) or (pos('-',text)>0)) + and (not fHamlibBuffer) then Begin i := 1; if fDebugMode then Writeln('Ltr send: '); @@ -895,21 +1064,27 @@ begin '+','-' : ModSpeed(text[i]); else Begin - if fDebugMode then Writeln('send letter ',i,' ',text[i]); + if fDebugMode then Writeln('send letter #',i,': ',text[i]); SendToHamlib(text[i]); Wcw:=#0; end; end; inc(i); end; - until (i > c); + until (i > c) or (not AllowCW); end else + Begin + if fDebugMode then Writeln('Word send: '); SendToHamlib(text); + end; end else if fDebugMode then Writeln('Empty message!'); end; - +procedure TCWHamLib.SendHex(text : String); +Begin + //not implemented +end; procedure TCWHamLib.Close; begin if tcp.Connected then diff --git a/src/uColorMemo.pas b/src/uColorMemo.pas index 1a32fdb..1ca64f9 100644 --- a/src/uColorMemo.pas +++ b/src/uColorMemo.pas @@ -676,7 +676,8 @@ var z,x,c:longint; procedure TcolorMemo.GetInfoFromSpot(x:longint); var z,c,v,a:longint; - ua,uz:string; + ua,uz, + call,freq,info:string; p,l :integer; begin bl1:=x;bl2:=x; //select line under cursor @@ -685,11 +686,10 @@ var z,c,v,a:longint; if vetp < 0 then exit; //otherwise double click on empty memo crashes program (band map, dx cluster) for v:=x to c do ua:=ua+vety[v]^.te+#13#10; //writeln('Spot line: ',ua); - - ua:= dmDXCluster.GetfreeTextFromSpot(ua); + dmDXCluster.GetSplitSpot(ua,call,freq,info); Clipboard.Clear; - Clipboard.astext:= ua; //info is now in clipboard - //writeln ('DX de info: ',ua); + Clipboard.astext:= info; //info is now in clipboard + //writeln ('DX de info: ',info); end; diff --git a/src/uMyIni.pas b/src/uMyIni.pas index b6aae67..fa4b1c7 100644 --- a/src/uMyIni.pas +++ b/src/uMyIni.pas @@ -26,6 +26,7 @@ type function ReadBool(const Section, Ident: string; Default: Boolean;ToLocal : Boolean=FALSE): Boolean; function ReadFloat(const Section, Ident: string; Default: Double): Double; function SectionExists(Section : String) : Boolean; + function SectionErase(Section : String) : Boolean; function LocalOnly(Section : String) : Boolean; procedure WriteString(const Section, Ident, Value: String;ToLocal : Boolean=FALSE); @@ -37,6 +38,7 @@ type procedure ReadSection(const Section: string; Strings: TStrings;ToLocal : Boolean=FALSE); procedure ReadSectionRaw(const Section: string; Strings: TStrings); procedure LoadLocalSectionsList; + procedure SetCache(c:boolean=false); end; var @@ -54,6 +56,12 @@ begin lini.CacheUpdates :=false; end; +procedure TMyIni.SetCache(c:boolean=false); +Begin + ini.CacheUpdates :=c; + lini.CacheUpdates :=c; +end; + function TMyIni.ReadString(const Section, Ident, Default: string): string; begin EnterCriticalsection(crit); @@ -222,6 +230,30 @@ begin LeaveCriticalsection(crit) end end; +function TMyIni.SectionErase(Section : String) : Boolean; +begin + EnterCriticalsection(crit); + try + if SectionExists(Section) then + begin + if LocalOnly(Section) then + Begin + Result := true; + lini.EraseSection(Section) + end + else + begin + Result := true; + ini.EraseSection(Section) + end; + end + else + Result:=false; + finally + LeaveCriticalsection(crit) + end + +end; function TMyIni.LocalOnly(Section : String) : Boolean; begin diff --git a/src/uRigControl.pas b/src/uRigControl.pas index 6ccc479..3c46ec7 100644 --- a/src/uRigControl.pas +++ b/src/uRigControl.pas @@ -5,7 +5,7 @@ unit uRigControl; interface uses - Classes, SysUtils, Process, ExtCtrls, lNetComponents, lnet,Forms; + Classes, SysUtils, Process, ExtCtrls, lNetComponents, lnet, Forms, strutils; type TRigMode = record mode : String[10]; @@ -44,9 +44,16 @@ type TRigControl = class fTXOffset : Double; fMorse : boolean; fPower : boolean; + fPowerON : boolean; fGetVfo : boolean; + fCompoundPoll: Boolean; + fVoice : Boolean; + fIsNewHamlib : Boolean; - AllowCommand : integer; //things to do before start polling + AllowCommand : integer; //for command priority + ErrorRigctldConnect : Boolean; + ConnectionDone : Boolean; + PowerOffIssued : Boolean; function RigConnected : Boolean; function StartRigctld : Boolean; @@ -55,6 +62,7 @@ type TRigControl = class procedure OnReceivedRigctldConnect(aSocket: TLSocket); procedure OnConnectRigctldConnect(aSocket: TLSocket); + procedure OnErrorRigctldConnect(const msg: string; aSocket: TLSocket); procedure OnRigPollTimer(Sender: TObject); public @@ -92,8 +100,15 @@ public //test if rigctld "--vfo" start parameter is used property Morse : Boolean read fMorse; //can rig send CW + property Voice : Boolean read fVoice; + //can rig launch voice memories + property IsNewHamlib: Boolean read fIsNewHamlib; + //Is Hamlib version date higer than 2023-06-01 + //not used internally, but can give info out property Power : Boolean read fPower; //can rig switch power + property PowerON : Boolean write fPowerON; + //may rig switch power on at start property CanGetVfo : Boolean read fGetVfo; //can rig show vfo (many Icoms can not) property LastError : String read fLastError; @@ -104,6 +119,8 @@ public //TX offset for transvertor in MHz property TXOffset : Double read fTXOffset write fTXOffset; + //Char to use between compound commands. Default is space, can be also LineEnding that breaks compound + property CompoundPoll : Boolean read fCompoundPoll write fCompoundPoll; function GetCurrVFO : TVFO; function GetModePass : TRigMode; @@ -133,6 +150,8 @@ public procedure PwrStBy; procedure PttOn; procedure PttOff; + procedure SendVoice(VMem:String); + procedure StopVoice; procedure UsrCmd(cmd:String); end; @@ -141,6 +160,7 @@ implementation constructor TRigControl.Create; begin RigCommand := TStringList.Create; + RigCommand.Sorted:=False; fDebugMode := False; if DebugMode then Writeln('In create'); fRigCtldHost := 'localhost'; @@ -152,10 +172,18 @@ begin tmrRigPoll := TTimer.Create(nil); tmrRigPoll.Enabled := False; VfoStr := ''; //defaults to non-"--vfo" (legacy) mode + fPowerON := true; //we do this via rigctld startup parameter autopower_on + fGetVfo := true; //defaut these true + fMorse := true; + fVoice := false; + fIsNewHamlib := false; + PowerOffIssued := false; + fCompoundPoll:=True; if DebugMode then Writeln('All objects created'); - tmrRigPoll.OnTimer := @OnRigPollTimer; + tmrRigPoll.OnTimer := @OnRigPollTimer; RigctldConnect.OnReceive := @OnReceivedRigctldConnect; RigctldConnect.OnConnect := @OnConnectRigctldConnect; + RigctldConnect.OnError := @OnErrorRigctldConnect; end; function TRigControl.StartRigctld : Boolean; @@ -170,6 +198,17 @@ begin index:=0; paramList := TStringList.Create; paramList.Delimiter := ' '; + if pos('AUTO_POWER',UpperCase(RigCtldArgs))=0 then + if (RigId>10) then //only true rigs can do auto_power_on + begin + if fPowerON then RigCtldArgs:= RigCtldArgs+' -C auto_power_on=1'; + //2023-08-02 auto_power on is not any more default "1" and it should stay so (by W9MDB) + //so we need just set it "1" if user wants, otherwise no parameter added. This should help old Hamlibs + //that claim auto_power is wrong parameter and refuse to start. + //If there are Hamlibs that defaut to "1" user must set "Extra command line parameters" as + //-C auto_power_on=0 + //else RigCtldArgs:= RigCtldArgs+' -C auto_power_on=0'; + end; paramList.DelimitedText := RigCtldArgs; rigProcess.Parameters.Clear; while index < paramList.Count do @@ -204,6 +243,8 @@ end; function TRigControl.RigConnected : Boolean; const ERR_MSG = 'Could not connect to rigctld'; +var + RetryCount : integer; begin if fDebugMode then @@ -250,33 +291,52 @@ begin RigctldConnect.Host := fRigCtldHost; RigctldConnect.Port := fRigCtldPort; + RetryCount := 1; + ErrorRigctldConnect := False; + ConnectionDone := False; - if RigctldConnect.Connect(fRigCtldHost,fRigCtldPort) then //this does not work as connection indicator, is always true!! - //even when it can not connect rigctld. - begin - if fDebugMode then Writeln('Waiting for rigctld @ ',fRigCtldHost,':',fRigCtldPort); - result := True; - AllowCommand:=-1; - ParmHasVfo:=0; //default: "--vfo" is not used as start parameter - tmrRigPoll.Interval := fRigPoll; - tmrRigPoll.Enabled := True; - RigCommand.Clear; + if RigctldConnect.Connect(fRigCtldHost,fRigCtldPort) then//this does not work as connection indicator, is always true!! + Begin + repeat + begin + //if fDebugMode then + Writeln('Waiting for rigctld ',RetryCount,' @ ',fRigCtldHost,':',fRigCtldPort); + if ErrorRigctldConnect then + Begin + ErrorRigctldConnect := False; + RigctldConnect.Connect(fRigCtldHost,fRigCtldPort); + end; + inc(RetryCount); + sleep(1000); + Application.ProcessMessages; + end; + until (ConnectionDone or (Retrycount > 10)) ; + + if ConnectionDone then + result := True + else + begin + if fDebugMode then Writeln('RETRY ERROR: *NOT* connected to rigctld @ ',fRigCtldHost,':',fRigCtldPort); + fLastError := ERR_MSG; + Result := False + end end - else begin - if fDebugMode then Writeln('ERROR: *NOT* connected to rigctld @ ',fRigCtldHost,':',fRigCtldPort); + else + begin + if fDebugMode then Writeln('SETTINGS ERROR: *NOT* connected to rigctld @ ',fRigCtldHost,':',fRigCtldPort); fLastError := ERR_MSG; Result := False - end + end end; procedure TRigControl.SetCurrVFO(vfo : TVFO); begin case vfo of VFOA : Begin - RigCommand.Add('V VFOA');//sendCommand.SendMessage('V VFOA'+LineEnding); + RigCommand.Add('+\set_vfo VFOA');//sendCommand.SendMessage('V VFOA'+LineEnding); end; VFOB : Begin - RigCommand.Add('V VFOB');//sendCommand.SendMessage('V VFOB'+LineEnding); + RigCommand.Add('+\set_vfo VFOB');//sendCommand.SendMessage('V VFOB'+LineEnding); end; end; //case AllowCommand:=1; //call queue @@ -286,49 +346,59 @@ procedure TRigControl.SetModePass(mode : TRigMode); begin if (mode.mode='CW') and fRigSendCWR then mode.mode := 'CWR'; - RigCommand.Add('+M'+VfoStr+' '+mode.mode+' '+IntToStr(mode.pass)); + RigCommand.Add('+\set_mode'+VfoStr+' '+mode.mode+' '+IntToStr(mode.pass)); AllowCommand:=1; //call queue end; procedure TRigControl.SetFreqKHz(freq : Double); begin - RigCommand.Add('+F'+VfoStr+' '+FloatToStr(freq*1000-TXOffset*1000000)); + RigCommand.Add('+\set_freq'+VfoStr+' '+FloatToStr(freq*1000-TXOffset*1000000)); AllowCommand:=1; //call queue end; procedure TRigControl.ClearRit; begin - RigCommand.Add('+J'+VfoStr+' 0'); + RigCommand.Add('+\set_rig'+VfoStr+' 0'); AllowCommand:=1; //call queue end; procedure TRigControl.DisableRit; Begin - RigCommand.Add('+U'+VfoStr+' RIT 0'); + RigCommand.Add('+\set_func'+VfoStr+' RIT 0'); AllowCommand:=1; //call queue end; procedure TRigControl.SetSplit(up:integer); Begin - RigCommand.Add('+Z'+VfoStr+' '+IntToStr(up)); - RigCommand.Add('+U'+VfoStr+' XIT 1'); + RigCommand.Add('+\set_xit'+VfoStr+' '+IntToStr(up)); + RigCommand.Add('+\set_func'+VfoStr+' XIT 1'); AllowCommand:=1; //call queue end; procedure TRigControl.ClearXit; begin - RigCommand.Add('+Z'+VfoStr+' 0'); + RigCommand.Add('+\set_xit'+VfoStr+' 0'); AllowCommand:=1; //call queue end; procedure TRigControl.DisableSplit; Begin - RigCommand.Add('+U'+VfoStr+' XIT 0'); + RigCommand.Add('+\set_func'+VfoStr+' XIT 0'); AllowCommand:=1; //call queue end; procedure TRigControl.PttOn; begin - RigCommand.Add('+T'+VfoStr+' 1'); + RigCommand.Add('+\set_ptt'+VfoStr+' 1'); AllowCommand:=1; //call queue end; procedure TRigControl.PttOff; begin - RigCommand.Add('+T'+VfoStr+' 0'); + RigCommand.Add('+\set_ptt'+VfoStr+' 0'); + AllowCommand:=1; //call queue +end; +procedure TRigControl.SendVoice(Vmem:String); +begin + RigCommand.Add('+\send_voice_mem '+Vmem); + AllowCommand:=1; //call queue +end; +procedure TRigControl.StopVoice; +begin + RigCommand.Add('+\stop_voice_mem'); AllowCommand:=1; //call queue end; procedure TRigControl.PwrOn; @@ -339,11 +409,13 @@ procedure TRigControl.PwrOff; begin RigCommand.Add('+\set_powerstat 0'); AllowCommand:=1; //call queue + PowerOffIssued:=true; end; procedure TRigControl.PwrStBy; begin RigCommand.Add('+\set_powerstat 2'); AllowCommand:=1; //call queue + PowerOffIssued:=true; end; procedure TRigControl.UsrCmd(cmd:String); begin @@ -465,24 +537,27 @@ var a,b : TExplodeArray; i : Integer; f : Double; + Hit : boolean; begin - if aSocket.GetMessage(msg) > 0 then + msg:=''; + while ( aSocket.GetMessage(msg) > 0 ) do begin msg := StringReplace(upcase(trim(msg)),#$09,' ',[rfReplaceAll]); //note the char case upper for now on! Remove TABs if DebugMode then - Writeln('Msg from rig:|',msg,'|'+LineEnding); + Writeln('Msg from rig:',StringReplace(msg,LineEnding,'|',[rfReplaceAll])); a := Explode(LineEnding,msg); for i:=0 to Length(a)-1 do //this handles received message line by line begin + Hit:=false; //Writeln('a[i]:',a[i]); if a[i]='' then Continue; //we send all commands with '+' prefix that makes receiving sort lot easier b:= Explode(' ', a[i]); - if b[0]='FREQUENCY:' then + if (b[0]='FREQUENCY:')then Begin if TryStrToFloat(b[1],f) then Begin @@ -490,10 +565,17 @@ begin end else fFReq := 0; + Hit:=true; AllowCommand:=1; //check pending commands end; - if b[0]='MODE:' then + if ( (b[0]='TX') and (b[1]='MODE:') ) then //WFview false rigctld emulating says "TX MODE:" + Begin + b[0]:=b[1]; + b[1]:=b[2]; + end; + + if (b[0]='MODE:') then Begin fMode.raw := b[1]; fMode.mode := fMode.raw; @@ -501,13 +583,14 @@ begin fMode.mode := 'SSB'; if fMode.mode = 'CWR' then fMode.mode := 'CW'; + Hit:=true; AllowCommand:=1; end; //FT-920 returned VFO as MEM //Some rigs report VFO as Main,MainA,MainB or Sub,SubA,SubB //Hamlib dummy has also "None" could it be in some real rigs too? - if b[0]='VFO:' then + if (b[0]='VFO:') then Begin b:= Explode(' ', a[i]); case b[1] of @@ -523,6 +606,7 @@ begin else fVFO := VFOA; end; + Hit:=true; AllowCommand:=1; end; @@ -534,6 +618,7 @@ begin ParmHasVfo := 1; if DebugMode then Writeln('"--vfo" checked:',ParmHasVfo); if ParmHasVfo > 0 then VfoStr:=' currVFO'; //note set leading one space to string! + Hit:=true; AllowCommand:=9; //next dump caps end; @@ -544,55 +629,178 @@ begin ParmHasVfo := 2; if DebugMode then Writeln('"--vfo" checked:',ParmHasVfo); if ParmHasVfo > 0 then VfoStr:=' currVFO'; //note set leading one space to string! + Hit:=true; AllowCommand:=9; //next dump caps end; - if pos('CAN SET POWER STAT:',a[i])>0 then + //these come from\dump_caps + if pos('HAMLIB VERSION:',a[i])>0 then + Begin //Old hamlib does not have this line, new has. + fIsNewHamlib:= true; //this is enough now to now it exist. Later version number and date can be used if needed + end; + + if pos('CAN SET POWER STAT:',a[i])>0 then Begin fPower:= b[4]='Y'; - if DebugMode then Writeln('Switch power: ',fPower); end; if pos('CAN GET VFO:',a[i])>0 then Begin fGetVfo:= b[3]='Y'; - if DebugMode then Writeln(LineEnding+'Get VFO: ',fGetVfo); end; if pos('CAN SEND MORSE:',a[i])>0 then Begin fMorse:= b[3]='Y'; - if DebugMode then Writeln('Send Morse: ',fMorse,LineEnding); - if fPower then - AllowCommand:=8 //issue power on - else - AllowCommand:=1 //check pending commands end; + if pos('CAN SEND VOICE:',a[i])>0 then + Begin + fVoice:= b[3]='Y'; + RigCommand.Clear; + Hit:=true; + if ((fRigId<10) and fPowerON and fPower) then + AllowCommand:=8 // if rigctld is remote it can not make auto_power_on as startup paramater + // then we should send set_powerstat 1 if power up is asked and rig can do it + else + AllowCommand:=1; //check pending commands (should not be any) + if DebugMode then + Begin + Writeln(LineEnding,'This is New Hamlib: ',fIsNewHamlib); + Writeln('Cqrlog can switch power: ',fPower); + Writeln('Cqrlog can get VFO: ',fGetVfo); + Writeln('Cqrlog can send Morse: ',fMorse); + Writeln('Cqrlog can launch voice memories: ',fVoice,LineEnding); + end; + Break; //break searching from \dump_caps reply + end; + //\dump_caps end + if pos('SET_POWERSTAT:',a[i])>0 then Begin - if pos('1',a[i])>0 then //line may have 'STAT: 1' or 'STAT: CURRVFO 1' + Hit:=true; + if pos('1',a[i])>0 then //line may have 'STAT: 1' or 'STAT: CURRVFO 1' Begin if DebugMode then Writeln('Power on, start polling'); - AllowCommand:=93; //check pending commands via delay + AllowCommand:=92; //check pending commands via delay Assume rig needs time to start + PowerOffIssued:=false; end else Begin - if DebugMode then Writeln('Power off, stop polling'); + if DebugMode then Writeln('Power off, stop polling (0)'); AllowCommand:=-1; end; end; - end; - end; + if (b[0]='RPRT') then + Begin + //if none of above hits what to expect we accept just report received to be the one + if not Hit then AllowCommand:=1; + if DebugMode then + case b[1] of + '-1': Writeln('Invalid parameter'); + '-2': Writeln('Invalid configuration (serial,..)'); + '-3': Writeln('Memory shortage'); + '-4': Writeln('Function not implemented, but will be'); + '-5': Writeln('Communication timed out'); + '-6': Writeln('IO error, including open failed'); + '-7': Writeln('Internal Hamlib error, huh!'); + '-8': Writeln('Protocol error'); + '-9': Writeln('Command rejected by the rig'); + '-10': Writeln('Command performed, but arg truncated'); + '-11': Writeln('Function not available'); + '-12': Writeln('VFO not targetable'); + '-13': Writeln('Error talking on the bus'); + '-14': Writeln('Collision on the bus'); + '-15': Writeln('NULL RIG handle or any invalid pointer parameter in get arg'); + '-16': Writeln('Invalid VFO'); + '-17': Writeln('Argument out of domain of func'); + '-18':Writeln('Function deprecated'); + '-19':Writeln('Security error password not provided or crypto failure'); + '-20':Writeln('Rig is not powered on'); + + end; + end; + + end; //line by line loop + end; //while msg + end; procedure TRigControl.OnRigPollTimer(Sender: TObject); var - cmd : String; - i : Integer; + cmd : String; + i : Integer; +//----------------------------------------------------------- +procedure DoRigPoll; +var + f:integer; + s:array[1..3] of string=('','',''); + begin + if PowerOffIssued then exit; + if ParmHasVfo=2 then + begin + if fGetVfo then + begin + s[1]:='+f'+VfoStr; + s[2]:='+m'+VfoStr; + s[3]:='+v'+VfoStr; + //cmd := '+f'+VfoStr+' +m'+VfoStr+' +v'+VfoStr+LineEnding //chk this with rigctld v3.1 + end + else + begin + s[1]:='+f'+VfoStr; + s[2]:='+m'+VfoStr; + //cmd := '+f'+VfoStr+' +m'+VfoStr+LineEnding //do not ask vfo if rig can't + end + + end + else + begin + if fGetVfo then + begin + s[1]:='+f'+VfoStr; + s[2]:='+m'+VfoStr; + s[3]:='+v'; + //cmd := '+f'+VfoStr+' +m'+VfoStr+' +v'+LineEnding + end + else + begin + s[1]:='+f'+VfoStr; + s[2]:='+m'+VfoStr; + //cmd := '+f'+VfoStr+' +m'+VfoStr+LineEnding //do not ask vfo if rig can't + end + end; + + + if fCompoundPoll then + Begin + if DebugMode then + Write(LineEnding+'Poll Sending:'+s[1]+' '+s[2]+' '+s[3]+LineEnding); + RigctldConnect.SendMessage(s[1]+' '+s[2]+' '+s[3]+LineEnding); + end + else + Begin + for f:=1 to 3 do + Begin + if DebugMode and (s[f]<>'') then + Write(LineEnding+'Poll Sending:'+s[f]+LineEnding); + if s[f]<>'' then + RigctldConnect.SendMessage(s[f]+LineEnding); + sleep(2); + end; + end; + AllowCommand:=-1; //waiting for reply +end; + +//----------------------------------------------------------- +begin + if DebugMode then + Writeln('Polling - allowcommand:',AllowCommand); case AllowCommand of + -1: Exit; //no sending allowed + //delay up to 10 timer rounds with this selecting one of numbers 99: AllowCommand:=98; 98: AllowCommand:=97; @@ -608,21 +816,21 @@ begin 10: Begin cmd:='+\chk_vfo'+LineEnding; if DebugMode then - Writeln('Sending: '+cmd); + Write(LineEnding+'Sending: '+cmd); RigctldConnect.SendMessage(cmd); AllowCommand:=-1; //waiting for reply end; 9: Begin cmd:='+\dump_caps'+LineEnding; if DebugMode then - Writeln('Sending: '+cmd); + Write(LineEnding+'Sending: '+cmd); RigctldConnect.SendMessage(cmd); AllowCommand:=-1; //waiting for reply end; 8: Begin cmd:= '+\set_powerstat 1'+LineEnding; if DebugMode then - Writeln('Sending: '+cmd); + Write(LineEnding+'Sending: '+cmd); RigctldConnect.SendMessage(cmd); AllowCommand:=-1; //waiting for reply end; @@ -631,38 +839,40 @@ begin 1: Begin if (RigCommand.Text<>'') then begin - for i:=0 to RigCommand.Count-1 do - Begin - cmd := RigCommand.Strings[i]+LineEnding; - RigctldConnect.SendMessage(cmd); - if DebugMode then - Writeln('Queue Sending: [',i,'] '+cmd); - end - end; - RigCommand.Clear; - AllowCommand:=0; //polling + if DebugMode then + write('Queue in:'+LineEnding,RigCommand.Text); + cmd := Trim(RigCommand.Strings[0])+LineEnding; + if DebugMode then + Write(LineEnding+'Queue Sending[0]:',cmd); + for i:=0 to RigCommand.Count-2 do + RigCommand.Exchange(i,i+1); + RigCommand.Delete(RigCommand.Count-1); + if DebugMode then + write('Queue out:'+LineEnding,RigCommand.Text); + RigctldConnect.SendMessage(cmd); + AllowCommand:=-1; //wait answer + end + else + DoRigPOll; end; + //polling has lowest prority, do if there is nothing else to do - 0: begin - if ParmHasVfo=2 then - cmd := '+f'+VfoStr+' +m'+VfoStr+' +v'+VfoStr+LineEnding //chk this with rigctld v3.1 - else - cmd := '+f'+VfoStr+' +m'+VfoStr+' +v'+LineEnding; - - if DebugMode then - Writeln('Poll Sending: '+cmd); - RigctldConnect.SendMessage(cmd); - AllowCommand:=-1; //waiting for reply - end; - - end;//case - + 0: DoRigPoll; + end;//case end; procedure TRigControl.OnConnectRigctldConnect(aSocket: TLSocket); Begin - if DebugMode then + if DebugMode then Writeln('Connected to rigctld'); + ConnectionDone:=true; + ParmHasVfo:=0; //default: "--vfo" is not used as start parameter + AllowCommand:=10; //start with chk_vfo + RigCommand.Clear; + tmrRigPoll.Interval := fRigPoll; + tmrRigPoll.Enabled := True; + + if RigChkVfo then Begin AllowCommand:=10; //start with chkvfo @@ -673,7 +883,14 @@ Begin AllowCommand:=9; //otherwise start with dump caps ParmVfoChkd:=false; end; - RigCommand.Clear; + +end; +procedure TRigControl.OnErrorRigctldConnect(const msg: string; aSocket: TLSocket); + +begin + ErrorRigctldConnect:= True; + if DebugMode then + writeln(msg); end; procedure TRigControl.Restart; diff --git a/src/uVersion.pas b/src/uVersion.pas index 76b8930..b72ad23 100644 --- a/src/uVersion.pas +++ b/src/uVersion.pas @@ -4,16 +4,16 @@ unit uVersion; interface const - cVersionBase = '2.6.0 (001)'; + cVersionBase = '2.6.0_(119)_'; {$IFDEF LCLGtk2} - cVERSION = cVersionBase+' Gtk2'; + cVERSION = cVersionBase+'Gtk2'; {$ENDIF} {$IFDEF LCLGtk3} - cVERSION = cVersionBase+' Gtk3'; + cVERSION = cVersionBase+'Gtk3'; {$ENDIF} {$IFDEF LCLQt5} - cVERSION = cVersionBase+' QT5'; + cVERSION = cVersionBase+'QT5'; {$ENDIF} cMAJOR = 2; @@ -21,7 +21,7 @@ const cRELEAS = 0; cBUILD = 1; - cBUILD_DATE = '2022-07-05'; + cBUILD_DATE = '2023-10-03'; implementation